You can subscribe to this list here.
| 2003 |
Jan
|
Feb
(4) |
Mar
(5) |
Apr
|
May
(5) |
Jun
(30) |
Jul
(2) |
Aug
(18) |
Sep
(14) |
Oct
(7) |
Nov
(21) |
Dec
(44) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2004 |
Jan
(63) |
Feb
(94) |
Mar
(54) |
Apr
(39) |
May
(34) |
Jun
(25) |
Jul
(10) |
Aug
(33) |
Sep
(16) |
Oct
(62) |
Nov
(12) |
Dec
(2) |
| 2005 |
Jan
(71) |
Feb
(8) |
Mar
(50) |
Apr
|
May
(2) |
Jun
(12) |
Jul
(19) |
Aug
(8) |
Sep
(3) |
Oct
(2) |
Nov
|
Dec
(8) |
| 2006 |
Jan
(10) |
Feb
(1) |
Mar
(301) |
Apr
(232) |
May
(26) |
Jun
(20) |
Jul
(26) |
Aug
(79) |
Sep
(92) |
Oct
(174) |
Nov
(17) |
Dec
(93) |
| 2007 |
Jan
(27) |
Feb
(179) |
Mar
(37) |
Apr
(81) |
May
(20) |
Jun
(5) |
Jul
|
Aug
(40) |
Sep
(68) |
Oct
(8) |
Nov
(47) |
Dec
(34) |
| 2008 |
Jan
(154) |
Feb
(15) |
Mar
(5) |
Apr
(21) |
May
(4) |
Jun
(1) |
Jul
(4) |
Aug
(6) |
Sep
(8) |
Oct
(9) |
Nov
(35) |
Dec
(50) |
| 2009 |
Jan
(8) |
Feb
(10) |
Mar
(6) |
Apr
(9) |
May
(7) |
Jun
(40) |
Jul
(7) |
Aug
(5) |
Sep
(2) |
Oct
(16) |
Nov
(42) |
Dec
(5) |
| 2010 |
Jan
(3) |
Feb
(15) |
Mar
(32) |
Apr
(18) |
May
(6) |
Jun
(9) |
Jul
|
Aug
(11) |
Sep
(16) |
Oct
|
Nov
(4) |
Dec
(35) |
| 2011 |
Jan
(24) |
Feb
(6) |
Mar
(27) |
Apr
(119) |
May
(72) |
Jun
(20) |
Jul
(31) |
Aug
(88) |
Sep
(86) |
Oct
(14) |
Nov
(11) |
Dec
(30) |
| 2012 |
Jan
(4) |
Feb
(3) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2017 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <gi...@gp...> - 2011-06-19 21:13:30
|
The branch, master has been updated
via 8dc7e84aeb03a98232d55b3bc85752732001b192 (commit)
from 6f9fa46f0fbd0127a15f94a69649bafcff039690 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/move.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
=================
Commit Messages
=================
commit 8dc7e84aeb03a98232d55b3bc85752732001b192
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Fix typo (Polygon++ ==> PolygonN++) in src/move.c
Closes-bug: lp-796059
:100644 100644 3f902b8... 49177e9... M src/move.c
=========
Changes
=========
commit 8dc7e84aeb03a98232d55b3bc85752732001b192
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Fix typo (Polygon++ ==> PolygonN++) in src/move.c
Closes-bug: lp-796059
diff --git a/src/move.c b/src/move.c
index 3f902b8..49177e9 100644
--- a/src/move.c
+++ b/src/move.c
@@ -701,7 +701,7 @@ MovePolygonToLayerLowLevel (LayerType *Source, PolygonType *polygon,
Source->Polygon = g_list_remove (Source->Polygon, polygon);
Source->PolygonN --;
Destination->Polygon = g_list_append (Destination->Polygon, polygon);
- Destination->Polygon ++;
+ Destination->PolygonN ++;
if (!Destination->polygon_tree)
Destination->polygon_tree = r_create_tree (NULL, 0, 0);
|
|
From: <gi...@gp...> - 2011-06-19 20:45:34
|
The branch, master has been updated
via 6f9fa46f0fbd0127a15f94a69649bafcff039690 (commit)
from 7416c85d9f3c575d01298446960569840e7deef5 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/hid/gerber/gerber.c | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)
=================
Commit Messages
=================
commit 6f9fa46f0fbd0127a15f94a69649bafcff039690
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Set file pointer to NULL after closing in gerber.c
Closes-bug: lp-795734
When cleaning up the gerber HID, I had changed the
file pointer used in maybe_close_f from a global to
a (local) argument -- which made the line ``f = NULL''
effectively a no-op.
However, the global variable f does need to be set
to NULL for the code to recognize that the file is
closed; otherwise it tries to keep using the (now
invalid) file handle, causing crashes whenever the
gerber HID is used more than once.
This is now done after every call to maybe_close_f(),
rather than depending on the function itself to have
side effects.
:100644 100644 f949d42... 5a4d84c... M src/hid/gerber/gerber.c
=========
Changes
=========
commit 6f9fa46f0fbd0127a15f94a69649bafcff039690
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Set file pointer to NULL after closing in gerber.c
Closes-bug: lp-795734
When cleaning up the gerber HID, I had changed the
file pointer used in maybe_close_f from a global to
a (local) argument -- which made the line ``f = NULL''
effectively a no-op.
However, the global variable f does need to be set
to NULL for the code to recognize that the file is
closed; otherwise it tries to keep using the (now
invalid) file handle, causing crashes whenever the
gerber HID is used more than once.
This is now done after every call to maybe_close_f(),
rather than depending on the function itself to have
side effects.
diff --git a/src/hid/gerber/gerber.c b/src/hid/gerber/gerber.c
index f949d42..5a4d84c 100644
--- a/src/hid/gerber/gerber.c
+++ b/src/hid/gerber/gerber.c
@@ -162,9 +162,9 @@ deinitApertureList (ApertureList *list)
Aperture *next;
while (search)
{
+ next = search->next;
free(search);
search = next;
- next = search->next;
}
initApertureList (list);
}
@@ -176,6 +176,7 @@ static void resetApertures()
deinitApertureList (&layer_aptr_list[i]);
free (layer_aptr_list);
layer_aptr_list = NULL;
+ curr_aptr_list = NULL;
layer_list_max = 0;
layer_list_idx = 0;
}
@@ -396,7 +397,6 @@ maybe_close_f (FILE *f)
fprintf (f, "M02*\r\n");
fclose (f);
}
- f = NULL;
}
static BoxType region;
@@ -585,6 +585,7 @@ gerber_do_export (HID_Attr_Val * options)
memcpy (LayerStack, saved_layer_stack, sizeof (LayerStack));
maybe_close_f (f);
+ f = NULL;
hid_restore_layer_ons (save_ons);
PCB->Flags = save_thindraw;
}
@@ -689,6 +690,7 @@ gerber_set_layer (const char *name, int group, int empty)
return 0;
maybe_close_f (f);
+ f = NULL;
pagecount++;
assign_file_suffix (filesuff, idx);
|
|
From: <gi...@gp...> - 2011-06-17 21:25:07
|
The branch, master has been updated
via 7416c85d9f3c575d01298446960569840e7deef5 (commit)
from 8da23b1d43a9cd39b0921785b1146f269213a6d8 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/hid/png/png.c | 21 +++++++++++++++++++--
1 files changed, 19 insertions(+), 2 deletions(-)
=================
Commit Messages
=================
commit 7416c85d9f3c575d01298446960569840e7deef5
Author: DJ Delorie <dj...@de...>
Commit: DJ Delorie <dj...@de...>
Check for empty layers in photo mode
Now that the default stackup is for six layer boards, the PNG
photo mode output needs to check to see if the user has used the inner
layers, and automatically adapt - so that a two layer board *looks* like
a two-layer board.
:100644 100644 fe7046e... 86631a7... M src/hid/png/png.c
=========
Changes
=========
commit 7416c85d9f3c575d01298446960569840e7deef5
Author: DJ Delorie <dj...@de...>
Commit: DJ Delorie <dj...@de...>
Check for empty layers in photo mode
Now that the default stackup is for six layer boards, the PNG
photo mode output needs to check to see if the user has used the inner
layers, and automatically adapt - so that a two layer board *looks* like
a two-layer board.
diff --git a/src/hid/png/png.c b/src/hid/png/png.c
index fe7046e..86631a7 100644
--- a/src/hid/png/png.c
+++ b/src/hid/png/png.c
@@ -129,6 +129,7 @@ static gdImagePtr photo_copper[MAX_LAYER+2];
static gdImagePtr photo_silk, photo_mask, photo_drill, *photo_im;
static gdImagePtr photo_outline;
static int photo_groups[MAX_LAYER+2], photo_ngroups;
+static int photo_has_inners;
static int doing_outline, have_outline;
@@ -397,12 +398,28 @@ png_hid_export_to_file (FILE * the_file, HID_Attr_Val * options)
{
int i, n=0;
SET_FLAG (SHOWMASKFLAG, PCB);
+ photo_has_inners = 0;
if (comp_layer < solder_layer)
for (i = comp_layer; i <= solder_layer; i++)
- photo_groups[n++] = i;
+ {
+ photo_groups[n++] = i;
+ if (i != comp_layer && i != solder_layer
+ && ! IsLayerGroupEmpty (i))
+ photo_has_inners = 1;
+ }
else
for (i = comp_layer; i >= solder_layer; i--)
- photo_groups[n++] = i;
+ {
+ photo_groups[n++] = i;
+ if (i != comp_layer && i != solder_layer
+ && ! IsLayerGroupEmpty (i))
+ photo_has_inners = 1;
+ }
+ if (!photo_has_inners)
+ {
+ photo_groups[1] = photo_groups[n - 1];
+ n = 2;
+ }
photo_ngroups = n;
if (photo_flip)
|
|
From: <gi...@gp...> - 2011-06-17 19:08:55
|
The branch, master has been updated
via 8da23b1d43a9cd39b0921785b1146f269213a6d8 (commit)
from c65e32d8fa34201e80c3112a14ff5de479d8ac10 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/hid/gerber/gerber.c | 2 +-
tests/golden/hid_gerber3/arcs.plated-drill.cnc | 20 ++++++++++----------
2 files changed, 11 insertions(+), 11 deletions(-)
=================
Commit Messages
=================
commit 8da23b1d43a9cd39b0921785b1146f269213a6d8
Author: Gabriel Paubert <pa...@ir...>
Commit: Andrew Poelstra <as...@sf...>
Fix printf specifier for gerber drill output
:100644 100644 5e0b7b6... f949d42... M src/hid/gerber/gerber.c
:100644 100644 f298de1... e6f7163... M tests/golden/hid_gerber3/arcs.plated-drill.cnc
=========
Changes
=========
commit 8da23b1d43a9cd39b0921785b1146f269213a6d8
Author: Gabriel Paubert <pa...@ir...>
Commit: Andrew Poelstra <as...@sf...>
Fix printf specifier for gerber drill output
diff --git a/src/hid/gerber/gerber.c b/src/hid/gerber/gerber.c
index 5e0b7b6..f949d42 100644
--- a/src/hid/gerber/gerber.c
+++ b/src/hid/gerber/gerber.c
@@ -646,7 +646,7 @@ gerber_set_layer (const char *name, int group, int empty)
Aperture *ap = findAperture (curr_aptr_list, pending_drills[i].diam, ROUND);
fprintf (f, "T%02d\r\n", ap->dCode);
}
- pcb_fprintf (f, "X%06.0mmY%06.0mm\r\n",
+ pcb_fprintf (f, "X%06.0mlY%06.0ml\r\n",
gerberDrX (PCB, pending_drills[i].x),
gerberDrY (PCB, pending_drills[i].y));
}
diff --git a/tests/golden/hid_gerber3/arcs.plated-drill.cnc b/tests/golden/hid_gerber3/arcs.plated-drill.cnc
index f298de1..e6f7163 100644
--- a/tests/golden/hid_gerber3/arcs.plated-drill.cnc
+++ b/tests/golden/hid_gerber3/arcs.plated-drill.cnc
@@ -1,14 +1,14 @@
M48
INCH
-T34C0.250
-T33C0.500
+T37C0.250
+T36C0.500
%
-T34
-X001524Y000737
-X001143Y000737
-T33
-X001524Y001143
-X001143Y001524
-X001524Y001524
-X001143Y001143
+T37
+X060000Y029000
+X045000Y029000
+T36
+X060000Y045000
+X045000Y060000
+X060000Y060000
+X045000Y045000
M30
|
|
From: <gi...@gp...> - 2011-06-17 03:38:50
|
The branch, master has been updated
via c65e32d8fa34201e80c3112a14ff5de479d8ac10 (commit)
from e2001e8a7c4b17d3780b467426890350cb37a174 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
configure.ac | 1 +
tests/golden/Makefile.am | 1 +
tests/golden/hid_gerber3/Makefile.am | 9 +
tests/golden/hid_gerber3/arcs.bottom.gbr | 23 +
tests/golden/hid_gerber3/arcs.fab.gbr | 2025 ++++++++++++++++++++
tests/golden/hid_gerber3/arcs.group1.gbr | 28 +
tests/golden/hid_gerber3/arcs.group4.gbr | 48 +
tests/golden/hid_gerber3/arcs.plated-drill.cnc | 14 +
tests/golden/hid_gerber3/arcs.top.gbr | 28 +
tests/inputs/Makefile.am | 3 +-
.../inputs/gerber_arcs.pcb | 64 +-
tests/tests.list | 1 +
12 files changed, 2214 insertions(+), 31 deletions(-)
create mode 100644 tests/golden/hid_gerber3/Makefile.am
create mode 100644 tests/golden/hid_gerber3/arcs.bottom.gbr
create mode 100644 tests/golden/hid_gerber3/arcs.fab.gbr
create mode 100644 tests/golden/hid_gerber3/arcs.group1.gbr
create mode 100644 tests/golden/hid_gerber3/arcs.group4.gbr
create mode 100644 tests/golden/hid_gerber3/arcs.plated-drill.cnc
create mode 100644 tests/golden/hid_gerber3/arcs.top.gbr
copy doc/gs/term-thickness-1.pcb => tests/inputs/gerber_arcs.pcb (91%)
=================
Commit Messages
=================
commit c65e32d8fa34201e80c3112a14ff5de479d8ac10
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Add hid_gerber3 test to check arc rendering
:100644 100644 6736466... fd14c98... M configure.ac
:100644 100644 515419e... 424b4df... M tests/golden/Makefile.am
:000000 100644 0000000... aaf2df1... A tests/golden/hid_gerber3/Makefile.am
:000000 100644 0000000... f35703b... A tests/golden/hid_gerber3/arcs.bottom.gbr
:000000 100644 0000000... d5b02d3... A tests/golden/hid_gerber3/arcs.fab.gbr
:000000 100644 0000000... a47422e... A tests/golden/hid_gerber3/arcs.group1.gbr
:000000 100644 0000000... b25d74b... A tests/golden/hid_gerber3/arcs.group4.gbr
:000000 100644 0000000... f298de1... A tests/golden/hid_gerber3/arcs.plated-drill.cnc
:000000 100644 0000000... a15e824... A tests/golden/hid_gerber3/arcs.top.gbr
:100644 100644 ee76973... 5ead192... M tests/inputs/Makefile.am
:000000 100644 0000000... 8e73a8e... A tests/inputs/gerber_arcs.pcb
:100644 100644 1f63488... 3433452... M tests/tests.list
=========
Changes
=========
commit c65e32d8fa34201e80c3112a14ff5de479d8ac10
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Add hid_gerber3 test to check arc rendering
diff --git a/configure.ac b/configure.ac
index 6736466..fd14c98 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1263,6 +1263,7 @@ AC_CONFIG_FILES(tests/golden/hid_gcode10/Makefile)
AC_CONFIG_FILES(tests/golden/hid_gcode11/Makefile)
AC_CONFIG_FILES(tests/golden/hid_gerber1/Makefile)
AC_CONFIG_FILES(tests/golden/hid_gerber2/Makefile)
+AC_CONFIG_FILES(tests/golden/hid_gerber3/Makefile)
AC_CONFIG_FILES(tests/golden/hid_png1/Makefile)
AC_CONFIG_FILES(tests/golden/hid_png2/Makefile)
AC_CONFIG_FILES(tests/golden/hid_png3/Makefile)
diff --git a/tests/golden/Makefile.am b/tests/golden/Makefile.am
index 515419e..424b4df 100644
--- a/tests/golden/Makefile.am
+++ b/tests/golden/Makefile.am
@@ -18,6 +18,7 @@ SUBDIRS= \
hid_gcode11 \
hid_gerber1 \
hid_gerber2 \
+ hid_gerber3 \
hid_png1 \
hid_png2 \
hid_png3
diff --git a/tests/golden/hid_gerber3/Makefile.am b/tests/golden/hid_gerber3/Makefile.am
new file mode 100644
index 0000000..aaf2df1
--- /dev/null
+++ b/tests/golden/hid_gerber3/Makefile.am
@@ -0,0 +1,9 @@
+## -*- makefile -*-
+
+EXTRA_DIST= \
+ arcs.bottom.gbr \
+ arcs.fab.gbr \
+ arcs.top.gbr \
+ arcs.group1.gbr \
+ arcs.group4.gbr \
+ arcs.plated-drill.cnc
diff --git a/tests/golden/hid_gerber3/arcs.bottom.gbr b/tests/golden/hid_gerber3/arcs.bottom.gbr
new file mode 100644
index 0000000..f35703b
--- /dev/null
+++ b/tests/golden/hid_gerber3/arcs.bottom.gbr
@@ -0,0 +1,23 @@
+G04 start of page 5 for group 5 idx 5 *
+G04 Title: (unknown), bottom *
+G04 Creator: pcb 1.99z *
+G04 CreationDate: Fri Jun 17 03:18:51 2011 UTC *
+G04 For: apoelstra *
+G04 Format: Gerber/RS-274X *
+G04 PCB-Dimensions: 3000000 2000000 *
+G04 PCB-Coordinate-Origin: lower left *
+%MOIN*%
+%FSLAX25Y25*%
+%LNBOTTOM*%
+%ADD32C,0.2500*%
+%ADD31C,0.5000*%
+%ADD30C,1.0000*%
+%ADD29C,0.6500*%
+%ADD28C,0.7500*%
+G54D28*X600000Y450000D03*
+G54D29*Y290000D03*
+G54D30*X450000Y600000D03*
+X600000D03*
+G54D29*X450000Y290000D03*
+G54D28*Y450000D03*
+G54D31*G54D32*G54D31*G54D32*G54D31*M02*
diff --git a/tests/golden/hid_gerber3/arcs.fab.gbr b/tests/golden/hid_gerber3/arcs.fab.gbr
new file mode 100644
index 0000000..d5b02d3
--- /dev/null
+++ b/tests/golden/hid_gerber3/arcs.fab.gbr
@@ -0,0 +1,2025 @@
+G04 start of page 7 for group -3984 idx -3984 *
+G04 Title: (unknown), fab *
+G04 Creator: pcb 1.99z *
+G04 CreationDate: Fri Jun 17 03:18:51 2011 UTC *
+G04 For: apoelstra *
+G04 Format: Gerber/RS-274X *
+G04 PCB-Dimensions: 3000000 2000000 *
+G04 PCB-Coordinate-Origin: lower left *
+%MOIN*%
+%FSLAX25Y25*%
+%LNFAB*%
+%ADD37C,0.0100*%
+%ADD36C,0.0060*%
+%ADD35C,0.0080*%
+G54D35*X600000Y451600D02*Y448400D01*
+X598400Y450000D02*X601600D01*
+X450000Y601600D02*Y598400D01*
+X448400Y600000D02*X451600D01*
+X600000Y601600D02*Y598400D01*
+X598400Y600000D02*X601600D01*
+X450000Y451600D02*Y448400D01*
+X448400Y450000D02*X451600D01*
+X15000Y2042850D02*Y2039650D01*
+X13400Y2041250D02*X16600D01*
+G54D36*X135000Y2043500D02*Y2042750D01*
+X136500Y2041250D01*
+X138000Y2042750D01*
+Y2043500D02*Y2042750D01*
+X136500Y2041250D02*Y2037500D01*
+X139801Y2040500D02*X142051D01*
+X139801Y2037500D02*X142801D01*
+X139801Y2043500D02*Y2037500D01*
+Y2043500D02*X142801D01*
+X147603D02*X148353Y2042750D01*
+X145353Y2043500D02*X147603D01*
+X144603Y2042750D02*X145353Y2043500D01*
+X144603Y2042750D02*Y2041250D01*
+X145353Y2040500D01*
+X147603D01*
+X148353Y2039750D01*
+Y2038250D01*
+X147603Y2037500D02*X148353Y2038250D01*
+X145353Y2037500D02*X147603D01*
+X144603Y2038250D02*X145353Y2037500D01*
+X135000Y2034249D02*X150154D01*
+X98000Y2040500D02*X101000Y2043500D01*
+X98000Y2040500D02*X101750D01*
+X101000Y2043500D02*Y2037500D01*
+X98000Y2034249D02*X103551D01*
+X45000Y2038250D02*X45750Y2037500D01*
+X45000Y2042750D02*Y2038250D01*
+Y2042750D02*X45750Y2043500D01*
+X47250D01*
+X48000Y2042750D01*
+Y2038250D01*
+X47250Y2037500D02*X48000Y2038250D01*
+X45750Y2037500D02*X47250D01*
+X45000Y2039000D02*X48000Y2042000D01*
+X49801Y2037500D02*X50551D01*
+X52353Y2043500D02*X55353D01*
+X52353D02*Y2040500D01*
+X53103Y2041250D01*
+X54603D01*
+X55353Y2040500D01*
+Y2038250D01*
+X54603Y2037500D02*X55353Y2038250D01*
+X53103Y2037500D02*X54603D01*
+X52353Y2038250D02*X53103Y2037500D01*
+X57154Y2038250D02*X57904Y2037500D01*
+X57154Y2042750D02*Y2038250D01*
+Y2042750D02*X57904Y2043500D01*
+X59404D01*
+X60154Y2042750D01*
+Y2038250D01*
+X59404Y2037500D02*X60154Y2038250D01*
+X57904Y2037500D02*X59404D01*
+X57154Y2039000D02*X60154Y2042000D01*
+X61956Y2038250D02*X62706Y2037500D01*
+X61956Y2042750D02*Y2038250D01*
+Y2042750D02*X62706Y2043500D01*
+X64206D01*
+X64956Y2042750D01*
+Y2038250D01*
+X64206Y2037500D02*X64956Y2038250D01*
+X62706Y2037500D02*X64206D01*
+X61956Y2039000D02*X64956Y2042000D01*
+X45000Y2034249D02*X66757D01*
+X600000Y290000D02*Y288400D01*
+Y290000D02*X601386Y290800D01*
+X600000Y290000D02*X598614Y290800D01*
+X450000Y290000D02*Y288400D01*
+Y290000D02*X451386Y290800D01*
+X450000Y290000D02*X448614Y290800D01*
+X15000Y2056250D02*Y2054650D01*
+Y2056250D02*X16386Y2057050D01*
+X15000Y2056250D02*X13614Y2057050D01*
+X135000Y2058500D02*Y2057750D01*
+X136500Y2056250D01*
+X138000Y2057750D01*
+Y2058500D02*Y2057750D01*
+X136500Y2056250D02*Y2052500D01*
+X139801Y2055500D02*X142051D01*
+X139801Y2052500D02*X142801D01*
+X139801Y2058500D02*Y2052500D01*
+Y2058500D02*X142801D01*
+X147603D02*X148353Y2057750D01*
+X145353Y2058500D02*X147603D01*
+X144603Y2057750D02*X145353Y2058500D01*
+X144603Y2057750D02*Y2056250D01*
+X145353Y2055500D01*
+X147603D01*
+X148353Y2054750D01*
+Y2053250D01*
+X147603Y2052500D02*X148353Y2053250D01*
+X145353Y2052500D02*X147603D01*
+X144603Y2053250D02*X145353Y2052500D01*
+X135000Y2049249D02*X150154D01*
+X98000Y2057750D02*X98750Y2058500D01*
+X101000D01*
+X101750Y2057750D01*
+Y2056250D01*
+X98000Y2052500D02*X101750Y2056250D01*
+X98000Y2052500D02*X101750D01*
+X98000Y2049249D02*X103551D01*
+X45000Y2053250D02*X45750Y2052500D01*
+X45000Y2057750D02*Y2053250D01*
+Y2057750D02*X45750Y2058500D01*
+X47250D01*
+X48000Y2057750D01*
+Y2053250D01*
+X47250Y2052500D02*X48000Y2053250D01*
+X45750Y2052500D02*X47250D01*
+X45000Y2054000D02*X48000Y2057000D01*
+X49801Y2052500D02*X50551D01*
+X52353Y2057750D02*X53103Y2058500D01*
+X55353D01*
+X56103Y2057750D01*
+Y2056250D01*
+X52353Y2052500D02*X56103Y2056250D01*
+X52353Y2052500D02*X56103D01*
+X57904Y2058500D02*X60904D01*
+X57904D02*Y2055500D01*
+X58654Y2056250D01*
+X60154D01*
+X60904Y2055500D01*
+Y2053250D01*
+X60154Y2052500D02*X60904Y2053250D01*
+X58654Y2052500D02*X60154D01*
+X57904Y2053250D02*X58654Y2052500D01*
+X62706Y2053250D02*X63456Y2052500D01*
+X62706Y2057750D02*Y2053250D01*
+Y2057750D02*X63456Y2058500D01*
+X64956D01*
+X65706Y2057750D01*
+Y2053250D01*
+X64956Y2052500D02*X65706Y2053250D01*
+X63456Y2052500D02*X64956D01*
+X62706Y2054000D02*X65706Y2057000D01*
+X45000Y2049249D02*X67507D01*
+X3000Y2073500D02*X3750Y2072750D01*
+X750Y2073500D02*X3000D01*
+X0Y2072750D02*X750Y2073500D01*
+X0Y2072750D02*Y2071250D01*
+X750Y2070500D01*
+X3000D01*
+X3750Y2069750D01*
+Y2068250D01*
+X3000Y2067500D02*X3750Y2068250D01*
+X750Y2067500D02*X3000D01*
+X0Y2068250D02*X750Y2067500D01*
+X5551Y2070500D02*Y2068250D01*
+X6301Y2067500D01*
+X8551Y2070500D02*Y2066000D01*
+X7801Y2065250D02*X8551Y2066000D01*
+X6301Y2065250D02*X7801D01*
+X5551Y2066000D02*X6301Y2065250D01*
+Y2067500D02*X7801D01*
+X8551Y2068250D01*
+X11103Y2069750D02*Y2067500D01*
+Y2069750D02*X11853Y2070500D01*
+X12603D01*
+X13353Y2069750D01*
+Y2067500D01*
+Y2069750D02*X14103Y2070500D01*
+X14853D01*
+X15603Y2069750D01*
+Y2067500D01*
+X10353Y2070500D02*X11103Y2069750D01*
+X17404Y2073500D02*Y2067500D01*
+Y2068250D02*X18154Y2067500D01*
+X19654D01*
+X20404Y2068250D01*
+Y2069750D02*Y2068250D01*
+X19654Y2070500D02*X20404Y2069750D01*
+X18154Y2070500D02*X19654D01*
+X17404Y2069750D02*X18154Y2070500D01*
+X22206Y2069750D02*Y2068250D01*
+Y2069750D02*X22956Y2070500D01*
+X24456D01*
+X25206Y2069750D01*
+Y2068250D01*
+X24456Y2067500D02*X25206Y2068250D01*
+X22956Y2067500D02*X24456D01*
+X22206Y2068250D02*X22956Y2067500D01*
+X27007Y2073500D02*Y2068250D01*
+X27757Y2067500D01*
+X41750Y2073500D02*Y2067500D01*
+X44000Y2073500D02*X44750Y2072750D01*
+Y2068250D01*
+X44000Y2067500D02*X44750Y2068250D01*
+X41000Y2067500D02*X44000D01*
+X41000Y2073500D02*X44000D01*
+X46551Y2072000D02*Y2071250D01*
+Y2069750D02*Y2067500D01*
+X50303Y2070500D02*X51053Y2069750D01*
+X48803Y2070500D02*X50303D01*
+X48053Y2069750D02*X48803Y2070500D01*
+X48053Y2069750D02*Y2068250D01*
+X48803Y2067500D01*
+X51053Y2070500D02*Y2068250D01*
+X51803Y2067500D01*
+X48803D02*X50303D01*
+X51053Y2068250D01*
+X54354Y2069750D02*Y2067500D01*
+Y2069750D02*X55104Y2070500D01*
+X55854D01*
+X56604Y2069750D01*
+Y2067500D01*
+Y2069750D02*X57354Y2070500D01*
+X58104D01*
+X58854Y2069750D01*
+Y2067500D01*
+X53604Y2070500D02*X54354Y2069750D01*
+X60656Y2067500D02*X61406D01*
+X65907Y2068250D02*X66657Y2067500D01*
+X65907Y2072750D02*X66657Y2073500D01*
+X65907Y2072750D02*Y2068250D01*
+X68459Y2073500D02*X69959D01*
+X69209D02*Y2067500D01*
+X68459D02*X69959D01*
+X72510Y2069750D02*Y2067500D01*
+Y2069750D02*X73260Y2070500D01*
+X74010D01*
+X74760Y2069750D01*
+Y2067500D01*
+X71760Y2070500D02*X72510Y2069750D01*
+X77312Y2070500D02*X79562D01*
+X76562Y2069750D02*X77312Y2070500D01*
+X76562Y2069750D02*Y2068250D01*
+X77312Y2067500D01*
+X79562D01*
+X81363Y2073500D02*Y2067500D01*
+Y2069750D02*X82113Y2070500D01*
+X83613D01*
+X84363Y2069750D01*
+Y2067500D01*
+X86165Y2073500D02*X86915Y2072750D01*
+Y2068250D01*
+X86165Y2067500D02*X86915Y2068250D01*
+X95750Y2067500D02*X98000D01*
+X95000Y2068250D02*X95750Y2067500D01*
+X95000Y2072750D02*Y2068250D01*
+Y2072750D02*X95750Y2073500D01*
+X98000D01*
+X99801Y2069750D02*Y2068250D01*
+Y2069750D02*X100551Y2070500D01*
+X102051D01*
+X102801Y2069750D01*
+Y2068250D01*
+X102051Y2067500D02*X102801Y2068250D01*
+X100551Y2067500D02*X102051D01*
+X99801Y2068250D02*X100551Y2067500D01*
+X104603Y2070500D02*Y2068250D01*
+X105353Y2067500D01*
+X106853D01*
+X107603Y2068250D01*
+Y2070500D02*Y2068250D01*
+X110154Y2069750D02*Y2067500D01*
+Y2069750D02*X110904Y2070500D01*
+X111654D01*
+X112404Y2069750D01*
+Y2067500D01*
+X109404Y2070500D02*X110154Y2069750D01*
+X114956Y2073500D02*Y2068250D01*
+X115706Y2067500D01*
+X114206Y2071250D02*X115706D01*
+X130750Y2073500D02*Y2067500D01*
+X130000Y2073500D02*X133000D01*
+X133750Y2072750D01*
+Y2071250D01*
+X133000Y2070500D02*X133750Y2071250D01*
+X130750Y2070500D02*X133000D01*
+X135551Y2073500D02*Y2068250D01*
+X136301Y2067500D01*
+X140053Y2070500D02*X140803Y2069750D01*
+X138553Y2070500D02*X140053D01*
+X137803Y2069750D02*X138553Y2070500D01*
+X137803Y2069750D02*Y2068250D01*
+X138553Y2067500D01*
+X140803Y2070500D02*Y2068250D01*
+X141553Y2067500D01*
+X138553D02*X140053D01*
+X140803Y2068250D01*
+X144104Y2073500D02*Y2068250D01*
+X144854Y2067500D01*
+X143354Y2071250D02*X144854D01*
+X147106Y2067500D02*X149356D01*
+X146356Y2068250D02*X147106Y2067500D01*
+X146356Y2069750D02*Y2068250D01*
+Y2069750D02*X147106Y2070500D01*
+X148606D01*
+X149356Y2069750D01*
+X146356Y2069000D02*X149356D01*
+Y2069750D02*Y2069000D01*
+X154157Y2073500D02*Y2067500D01*
+X153407D02*X154157Y2068250D01*
+X151907Y2067500D02*X153407D01*
+X151157Y2068250D02*X151907Y2067500D01*
+X151157Y2069750D02*Y2068250D01*
+Y2069750D02*X151907Y2070500D01*
+X153407D01*
+X154157Y2069750D01*
+X157459Y2070500D02*Y2069750D01*
+Y2068250D02*Y2067500D01*
+X155959Y2072750D02*Y2072000D01*
+Y2072750D02*X156709Y2073500D01*
+X158209D01*
+X158959Y2072750D01*
+Y2072000D01*
+X157459Y2070500D02*X158959Y2072000D01*
+X0Y2088500D02*X3000D01*
+X1500D02*Y2082500D01*
+X4801Y2088500D02*Y2082500D01*
+Y2084750D02*X5551Y2085500D01*
+X7051D01*
+X7801Y2084750D01*
+Y2082500D01*
+X10353D02*X12603D01*
+X9603Y2083250D02*X10353Y2082500D01*
+X9603Y2084750D02*Y2083250D01*
+Y2084750D02*X10353Y2085500D01*
+X11853D01*
+X12603Y2084750D01*
+X9603Y2084000D02*X12603D01*
+Y2084750D02*Y2084000D01*
+X15154Y2084750D02*Y2082500D01*
+Y2084750D02*X15904Y2085500D01*
+X17404D01*
+X14404D02*X15154Y2084750D01*
+X19956Y2082500D02*X22206D01*
+X19206Y2083250D02*X19956Y2082500D01*
+X19206Y2084750D02*Y2083250D01*
+Y2084750D02*X19956Y2085500D01*
+X21456D01*
+X22206Y2084750D01*
+X19206Y2084000D02*X22206D01*
+Y2084750D02*Y2084000D01*
+X28957Y2085500D02*X29707Y2084750D01*
+X27457Y2085500D02*X28957D01*
+X26707Y2084750D02*X27457Y2085500D01*
+X26707Y2084750D02*Y2083250D01*
+X27457Y2082500D01*
+X29707Y2085500D02*Y2083250D01*
+X30457Y2082500D01*
+X27457D02*X28957D01*
+X29707Y2083250D01*
+X33009Y2084750D02*Y2082500D01*
+Y2084750D02*X33759Y2085500D01*
+X35259D01*
+X32259D02*X33009Y2084750D01*
+X37810Y2082500D02*X40060D01*
+X37060Y2083250D02*X37810Y2082500D01*
+X37060Y2084750D02*Y2083250D01*
+Y2084750D02*X37810Y2085500D01*
+X39310D01*
+X40060Y2084750D01*
+X37060Y2084000D02*X40060D01*
+Y2084750D02*Y2084000D01*
+X44562Y2087750D02*X45312Y2088500D01*
+X47562D01*
+X48312Y2087750D01*
+Y2086250D01*
+X44562Y2082500D02*X48312Y2086250D01*
+X44562Y2082500D02*X48312D01*
+X55813Y2088500D02*Y2082500D01*
+X55063D02*X55813Y2083250D01*
+X53563Y2082500D02*X55063D01*
+X52813Y2083250D02*X53563Y2082500D01*
+X52813Y2084750D02*Y2083250D01*
+Y2084750D02*X53563Y2085500D01*
+X55063D01*
+X55813Y2084750D01*
+X57615Y2087000D02*Y2086250D01*
+Y2084750D02*Y2082500D01*
+X59866Y2087750D02*Y2082500D01*
+Y2087750D02*X60616Y2088500D01*
+X61366D01*
+X59116Y2085500D02*X60616D01*
+X63618Y2087750D02*Y2082500D01*
+Y2087750D02*X64368Y2088500D01*
+X65118D01*
+X62868Y2085500D02*X64368D01*
+X67369Y2082500D02*X69619D01*
+X66619Y2083250D02*X67369Y2082500D01*
+X66619Y2084750D02*Y2083250D01*
+Y2084750D02*X67369Y2085500D01*
+X68869D01*
+X69619Y2084750D01*
+X66619Y2084000D02*X69619D01*
+Y2084750D02*Y2084000D01*
+X72171Y2084750D02*Y2082500D01*
+Y2084750D02*X72921Y2085500D01*
+X74421D01*
+X71421D02*X72171Y2084750D01*
+X76972Y2082500D02*X79222D01*
+X76222Y2083250D02*X76972Y2082500D01*
+X76222Y2084750D02*Y2083250D01*
+Y2084750D02*X76972Y2085500D01*
+X78472D01*
+X79222Y2084750D01*
+X76222Y2084000D02*X79222D01*
+Y2084750D02*Y2084000D01*
+X81774Y2084750D02*Y2082500D01*
+Y2084750D02*X82524Y2085500D01*
+X83274D01*
+X84024Y2084750D01*
+Y2082500D01*
+X81024Y2085500D02*X81774Y2084750D01*
+X86575Y2088500D02*Y2083250D01*
+X87325Y2082500D01*
+X85825Y2086250D02*X87325D01*
+X94527Y2088500D02*Y2082500D01*
+X93777D02*X94527Y2083250D01*
+X92277Y2082500D02*X93777D01*
+X91527Y2083250D02*X92277Y2082500D01*
+X91527Y2084750D02*Y2083250D01*
+Y2084750D02*X92277Y2085500D01*
+X93777D01*
+X94527Y2084750D01*
+X97078D02*Y2082500D01*
+Y2084750D02*X97828Y2085500D01*
+X99328D01*
+X96328D02*X97078Y2084750D01*
+X101130Y2087000D02*Y2086250D01*
+Y2084750D02*Y2082500D01*
+X102631Y2088500D02*Y2083250D01*
+X103381Y2082500D01*
+X104883Y2088500D02*Y2083250D01*
+X105633Y2082500D01*
+X110584D02*X112834D01*
+X113584Y2083250D01*
+X112834Y2084000D02*X113584Y2083250D01*
+X110584Y2084000D02*X112834D01*
+X109834Y2084750D02*X110584Y2084000D01*
+X109834Y2084750D02*X110584Y2085500D01*
+X112834D01*
+X113584Y2084750D01*
+X109834Y2083250D02*X110584Y2082500D01*
+X115386Y2087000D02*Y2086250D01*
+Y2084750D02*Y2082500D01*
+X116887Y2085500D02*X119887D01*
+X116887Y2082500D02*X119887Y2085500D01*
+X116887Y2082500D02*X119887D01*
+X122439D02*X124689D01*
+X121689Y2083250D02*X122439Y2082500D01*
+X121689Y2084750D02*Y2083250D01*
+Y2084750D02*X122439Y2085500D01*
+X123939D01*
+X124689Y2084750D01*
+X121689Y2084000D02*X124689D01*
+Y2084750D02*Y2084000D01*
+X127240Y2082500D02*X129490D01*
+X130240Y2083250D01*
+X129490Y2084000D02*X130240Y2083250D01*
+X127240Y2084000D02*X129490D01*
+X126490Y2084750D02*X127240Y2084000D01*
+X126490Y2084750D02*X127240Y2085500D01*
+X129490D01*
+X130240Y2084750D01*
+X126490Y2083250D02*X127240Y2082500D01*
+X134742Y2085500D02*Y2083250D01*
+X135492Y2082500D01*
+X136992D01*
+X137742Y2083250D01*
+Y2085500D02*Y2083250D01*
+X140293Y2082500D02*X142543D01*
+X143293Y2083250D01*
+X142543Y2084000D02*X143293Y2083250D01*
+X140293Y2084000D02*X142543D01*
+X139543Y2084750D02*X140293Y2084000D01*
+X139543Y2084750D02*X140293Y2085500D01*
+X142543D01*
+X143293Y2084750D01*
+X139543Y2083250D02*X140293Y2082500D01*
+X145845D02*X148095D01*
+X145095Y2083250D02*X145845Y2082500D01*
+X145095Y2084750D02*Y2083250D01*
+Y2084750D02*X145845Y2085500D01*
+X147345D01*
+X148095Y2084750D01*
+X145095Y2084000D02*X148095D01*
+Y2084750D02*Y2084000D01*
+X152896Y2088500D02*Y2082500D01*
+X152146D02*X152896Y2083250D01*
+X150646Y2082500D02*X152146D01*
+X149896Y2083250D02*X150646Y2082500D01*
+X149896Y2084750D02*Y2083250D01*
+Y2084750D02*X150646Y2085500D01*
+X152146D01*
+X152896Y2084750D01*
+X157398Y2087000D02*Y2086250D01*
+Y2084750D02*Y2082500D01*
+X159649Y2084750D02*Y2082500D01*
+Y2084750D02*X160399Y2085500D01*
+X161149D01*
+X161899Y2084750D01*
+Y2082500D01*
+X158899Y2085500D02*X159649Y2084750D01*
+X167151Y2088500D02*Y2083250D01*
+X167901Y2082500D01*
+X166401Y2086250D02*X167901D01*
+X169402Y2088500D02*Y2082500D01*
+Y2084750D02*X170152Y2085500D01*
+X171652D01*
+X172402Y2084750D01*
+Y2082500D01*
+X174204Y2087000D02*Y2086250D01*
+Y2084750D02*Y2082500D01*
+X176455D02*X178705D01*
+X179455Y2083250D01*
+X178705Y2084000D02*X179455Y2083250D01*
+X176455Y2084000D02*X178705D01*
+X175705Y2084750D02*X176455Y2084000D01*
+X175705Y2084750D02*X176455Y2085500D01*
+X178705D01*
+X179455Y2084750D01*
+X175705Y2083250D02*X176455Y2082500D01*
+X183957Y2088500D02*Y2083250D01*
+X184707Y2082500D01*
+X188458Y2085500D02*X189208Y2084750D01*
+X186958Y2085500D02*X188458D01*
+X186208Y2084750D02*X186958Y2085500D01*
+X186208Y2084750D02*Y2083250D01*
+X186958Y2082500D01*
+X189208Y2085500D02*Y2083250D01*
+X189958Y2082500D01*
+X186958D02*X188458D01*
+X189208Y2083250D01*
+X191760Y2085500D02*Y2083250D01*
+X192510Y2082500D01*
+X194760Y2085500D02*Y2081000D01*
+X194010Y2080250D02*X194760Y2081000D01*
+X192510Y2080250D02*X194010D01*
+X191760Y2081000D02*X192510Y2080250D01*
+Y2082500D02*X194010D01*
+X194760Y2083250D01*
+X196561Y2084750D02*Y2083250D01*
+Y2084750D02*X197311Y2085500D01*
+X198811D01*
+X199561Y2084750D01*
+Y2083250D01*
+X198811Y2082500D02*X199561Y2083250D01*
+X197311Y2082500D02*X198811D01*
+X196561Y2083250D02*X197311Y2082500D01*
+X201363Y2085500D02*Y2083250D01*
+X202113Y2082500D01*
+X203613D01*
+X204363Y2083250D01*
+Y2085500D02*Y2083250D01*
+X206914Y2088500D02*Y2083250D01*
+X207664Y2082500D01*
+X206164Y2086250D02*X207664D01*
+X209166Y2081000D02*X210666Y2082500D01*
+X217417Y2088500D02*X218167Y2087750D01*
+X215917Y2088500D02*X217417D01*
+X215167Y2087750D02*X215917Y2088500D01*
+X215167Y2087750D02*Y2083250D01*
+X215917Y2082500D01*
+X217417Y2085500D02*X218167Y2084750D01*
+X215167Y2085500D02*X217417D01*
+X215917Y2082500D02*X217417D01*
+X218167Y2083250D01*
+Y2084750D02*Y2083250D01*
+X222669Y2088500D02*Y2082500D01*
+Y2084750D02*X223419Y2085500D01*
+X224919D01*
+X225669Y2084750D01*
+Y2082500D01*
+X227470Y2084750D02*Y2083250D01*
+Y2084750D02*X228220Y2085500D01*
+X229720D01*
+X230470Y2084750D01*
+Y2083250D01*
+X229720Y2082500D02*X230470Y2083250D01*
+X228220Y2082500D02*X229720D01*
+X227470Y2083250D02*X228220Y2082500D01*
+X232272Y2088500D02*Y2083250D01*
+X233022Y2082500D01*
+X235273D02*X237523D01*
+X234523Y2083250D02*X235273Y2082500D01*
+X234523Y2084750D02*Y2083250D01*
+Y2084750D02*X235273Y2085500D01*
+X236773D01*
+X237523Y2084750D01*
+X234523Y2084000D02*X237523D01*
+Y2084750D02*Y2084000D01*
+X240075Y2082500D02*X242325D01*
+X243075Y2083250D01*
+X242325Y2084000D02*X243075Y2083250D01*
+X240075Y2084000D02*X242325D01*
+X239325Y2084750D02*X240075Y2084000D01*
+X239325Y2084750D02*X240075Y2085500D01*
+X242325D01*
+X243075Y2084750D01*
+X239325Y2083250D02*X240075Y2082500D01*
+X248326Y2088500D02*Y2083250D01*
+X249076Y2082500D01*
+X247576Y2086250D02*X249076D01*
+X250578Y2084750D02*Y2083250D01*
+Y2084750D02*X251328Y2085500D01*
+X252828D01*
+X253578Y2084750D01*
+Y2083250D01*
+X252828Y2082500D02*X253578Y2083250D01*
+X251328Y2082500D02*X252828D01*
+X250578Y2083250D02*X251328Y2082500D01*
+X256129Y2088500D02*Y2083250D01*
+X256879Y2082500D01*
+X255379Y2086250D02*X256879D01*
+X260631Y2085500D02*X261381Y2084750D01*
+X259131Y2085500D02*X260631D01*
+X258381Y2084750D02*X259131Y2085500D01*
+X258381Y2084750D02*Y2083250D01*
+X259131Y2082500D01*
+X261381Y2085500D02*Y2083250D01*
+X262131Y2082500D01*
+X259131D02*X260631D01*
+X261381Y2083250D01*
+X263932Y2088500D02*Y2083250D01*
+X264682Y2082500D01*
+G54D37*X0Y2000000D02*X3000000D01*
+X0D02*Y0D01*
+X3000000Y2000000D02*Y0D01*
+X0D02*X3000000D01*
+G54D36*X200000Y2013500D02*Y2007500D01*
+Y2013500D02*X202250Y2011250D01*
+X204500Y2013500D01*
+Y2007500D01*
+X208551Y2010500D02*X209301Y2009750D01*
+X207051Y2010500D02*X208551D01*
+X206301Y2009750D02*X207051Y2010500D01*
+X206301Y2009750D02*Y2008250D01*
+X207051Y2007500D01*
+X209301Y2010500D02*Y2008250D01*
+X210051Y2007500D01*
+X207051D02*X208551D01*
+X209301Y2008250D01*
+X211853Y2010500D02*X214853Y2007500D01*
+X211853D02*X214853Y2010500D01*
+X216654Y2012000D02*Y2011250D01*
+Y2009750D02*Y2007500D01*
+X218906Y2009750D02*Y2007500D01*
+Y2009750D02*X219656Y2010500D01*
+X220406D01*
+X221156Y2009750D01*
+Y2007500D01*
+Y2009750D02*X221906Y2010500D01*
+X222656D01*
+X223406Y2009750D01*
+Y2007500D01*
+X218156Y2010500D02*X218906Y2009750D01*
+X225207Y2010500D02*Y2008250D01*
+X225957Y2007500D01*
+X227457D01*
+X228207Y2008250D01*
+Y2010500D02*Y2008250D01*
+X230759Y2009750D02*Y2007500D01*
+Y2009750D02*X231509Y2010500D01*
+X232259D01*
+X233009Y2009750D01*
+Y2007500D01*
+Y2009750D02*X233759Y2010500D01*
+X234509D01*
+X235259Y2009750D01*
+Y2007500D01*
+X230009Y2010500D02*X230759Y2009750D01*
+X240510Y2013500D02*Y2007500D01*
+X242760Y2013500D02*X243510Y2012750D01*
+Y2008250D01*
+X242760Y2007500D02*X243510Y2008250D01*
+X239760Y2007500D02*X242760D01*
+X239760Y2013500D02*X242760D01*
+X245312Y2012000D02*Y2011250D01*
+Y2009750D02*Y2007500D01*
+X247563Y2009750D02*Y2007500D01*
+Y2009750D02*X248313Y2010500D01*
+X249063D01*
+X249813Y2009750D01*
+Y2007500D01*
+Y2009750D02*X250563Y2010500D01*
+X251313D01*
+X252063Y2009750D01*
+Y2007500D01*
+X246813Y2010500D02*X247563Y2009750D01*
+X254615Y2007500D02*X256865D01*
+X253865Y2008250D02*X254615Y2007500D01*
+X253865Y2009750D02*Y2008250D01*
+Y2009750D02*X254615Y2010500D01*
+X256115D01*
+X256865Y2009750D01*
+X253865Y2009000D02*X256865D01*
+Y2009750D02*Y2009000D01*
+X259416Y2009750D02*Y2007500D01*
+Y2009750D02*X260166Y2010500D01*
+X260916D01*
+X261666Y2009750D01*
+Y2007500D01*
+X258666Y2010500D02*X259416Y2009750D01*
+X264218Y2007500D02*X266468D01*
+X267218Y2008250D01*
+X266468Y2009000D02*X267218Y2008250D01*
+X264218Y2009000D02*X266468D01*
+X263468Y2009750D02*X264218Y2009000D01*
+X263468Y2009750D02*X264218Y2010500D01*
+X266468D01*
+X267218Y2009750D01*
+X263468Y2008250D02*X264218Y2007500D01*
+X269019Y2012000D02*Y2011250D01*
+Y2009750D02*Y2007500D01*
+X270521Y2009750D02*Y2008250D01*
+Y2009750D02*X271271Y2010500D01*
+X272771D01*
+X273521Y2009750D01*
+Y2008250D01*
+X272771Y2007500D02*X273521Y2008250D01*
+X271271Y2007500D02*X272771D01*
+X270521Y2008250D02*X271271Y2007500D01*
+X276072Y2009750D02*Y2007500D01*
+Y2009750D02*X276822Y2010500D01*
+X277572D01*
+X278322Y2009750D01*
+Y2007500D01*
+X275322Y2010500D02*X276072Y2009750D01*
+X280874Y2007500D02*X283124D01*
+X283874Y2008250D01*
+X283124Y2009000D02*X283874Y2008250D01*
+X280874Y2009000D02*X283124D01*
+X280124Y2009750D02*X280874Y2009000D01*
+X280124Y2009750D02*X280874Y2010500D01*
+X283124D01*
+X283874Y2009750D01*
+X280124Y2008250D02*X280874Y2007500D01*
+X285675Y2011250D02*X286425D01*
+X285675Y2009750D02*X286425D01*
+X290927Y2012750D02*X291677Y2013500D01*
+X293177D01*
+X293927Y2012750D01*
+Y2008250D01*
+X293177Y2007500D02*X293927Y2008250D01*
+X291677Y2007500D02*X293177D01*
+X290927Y2008250D02*X291677Y2007500D01*
+Y2010500D02*X293927D01*
+X295728Y2008250D02*X296478Y2007500D01*
+X295728Y2012750D02*Y2008250D01*
+Y2012750D02*X296478Y2013500D01*
+X297978D01*
+X298728Y2012750D01*
+Y2008250D01*
+X297978Y2007500D02*X298728Y2008250D01*
+X296478Y2007500D02*X297978D01*
+X295728Y2009000D02*X298728Y2012000D01*
+X300530Y2008250D02*X301280Y2007500D01*
+X300530Y2012750D02*Y2008250D01*
+Y2012750D02*X301280Y2013500D01*
+X302780D01*
+X303530Y2012750D01*
+Y2008250D01*
+X302780Y2007500D02*X303530Y2008250D01*
+X301280Y2007500D02*X302780D01*
+X300530Y2009000D02*X303530Y2012000D01*
+X305331Y2008250D02*X306081Y2007500D01*
+X305331Y2012750D02*Y2008250D01*
+Y2012750D02*X306081Y2013500D01*
+X307581D01*
+X308331Y2012750D01*
+Y2008250D01*
+X307581Y2007500D02*X308331Y2008250D01*
+X306081Y2007500D02*X307581D01*
+X305331Y2009000D02*X308331Y2012000D01*
+X310133Y2008250D02*X310883Y2007500D01*
+X310133Y2012750D02*Y2008250D01*
+Y2012750D02*X310883Y2013500D01*
+X312383D01*
+X313133Y2012750D01*
+Y2008250D01*
+X312383Y2007500D02*X313133Y2008250D01*
+X310883Y2007500D02*X312383D01*
+X310133Y2009000D02*X313133Y2012000D01*
+X314934Y2007500D02*X315684D01*
+X317486Y2008250D02*X318236Y2007500D01*
+X317486Y2012750D02*Y2008250D01*
+Y2012750D02*X318236Y2013500D01*
+X319736D01*
+X320486Y2012750D01*
+Y2008250D01*
+X319736Y2007500D02*X320486Y2008250D01*
+X318236Y2007500D02*X319736D01*
+X317486Y2009000D02*X320486Y2012000D01*
+X322287Y2008250D02*X323037Y2007500D01*
+X322287Y2012750D02*Y2008250D01*
+Y2012750D02*X323037Y2013500D01*
+X324537D01*
+X325287Y2012750D01*
+Y2008250D01*
+X324537Y2007500D02*X325287Y2008250D01*
+X323037Y2007500D02*X324537D01*
+X322287Y2009000D02*X325287Y2012000D01*
+X327089Y2008250D02*X327839Y2007500D01*
+X327089Y2012750D02*Y2008250D01*
+Y2012750D02*X327839Y2013500D01*
+X329339D01*
+X330089Y2012750D01*
+Y2008250D01*
+X329339Y2007500D02*X330089Y2008250D01*
+X327839Y2007500D02*X329339D01*
+X327089Y2009000D02*X330089Y2012000D01*
+X331890Y2008250D02*X332640Y2007500D01*
+X331890Y2012750D02*Y2008250D01*
+Y2012750D02*X332640Y2013500D01*
+X334140D01*
+X334890Y2012750D01*
+Y2008250D01*
+X334140Y2007500D02*X334890Y2008250D01*
+X332640Y2007500D02*X334140D01*
+X331890Y2009000D02*X334890Y2012000D01*
+X336692Y2008250D02*X337442Y2007500D01*
+X336692Y2012750D02*Y2008250D01*
+Y2012750D02*X337442Y2013500D01*
+X338942D01*
+X339692Y2012750D01*
+Y2008250D01*
+X338942Y2007500D02*X339692Y2008250D01*
+X337442Y2007500D02*X338942D01*
+X336692Y2009000D02*X339692Y2012000D01*
+X341493Y2008250D02*X342243Y2007500D01*
+X341493Y2012750D02*Y2008250D01*
+Y2012750D02*X342243Y2013500D01*
+X343743D01*
+X344493Y2012750D01*
+Y2008250D01*
+X343743Y2007500D02*X344493Y2008250D01*
+X342243Y2007500D02*X343743D01*
+X341493Y2009000D02*X344493Y2012000D01*
+X349745Y2009750D02*Y2007500D01*
+Y2009750D02*X350495Y2010500D01*
+X351245D01*
+X351995Y2009750D01*
+Y2007500D01*
+Y2009750D02*X352745Y2010500D01*
+X353495D01*
+X354245Y2009750D01*
+Y2007500D01*
+X348995Y2010500D02*X349745Y2009750D01*
+X356046Y2012000D02*Y2011250D01*
+Y2009750D02*Y2007500D01*
+X357548Y2013500D02*Y2008250D01*
+X358298Y2007500D01*
+X360549D02*X362799D01*
+X363549Y2008250D01*
+X362799Y2009000D02*X363549Y2008250D01*
+X360549Y2009000D02*X362799D01*
+X359799Y2009750D02*X360549Y2009000D01*
+X359799Y2009750D02*X360549Y2010500D01*
+X362799D01*
+X363549Y2009750D01*
+X359799Y2008250D02*X360549Y2007500D01*
+X368051Y2010500D02*Y2008250D01*
+X368801Y2007500D01*
+X369551D01*
+X370301Y2008250D01*
+Y2010500D02*Y2008250D01*
+X371051Y2007500D01*
+X371801D01*
+X372551Y2008250D01*
+Y2010500D02*Y2008250D01*
+X374352Y2012000D02*Y2011250D01*
+Y2009750D02*Y2007500D01*
+X378854Y2013500D02*Y2007500D01*
+X378104D02*X378854Y2008250D01*
+X376604Y2007500D02*X378104D01*
+X375854Y2008250D02*X376604Y2007500D01*
+X375854Y2009750D02*Y2008250D01*
+Y2009750D02*X376604Y2010500D01*
+X378104D01*
+X378854Y2009750D01*
+X381405Y2007500D02*X383655D01*
+X380655Y2008250D02*X381405Y2007500D01*
+X380655Y2009750D02*Y2008250D01*
+Y2009750D02*X381405Y2010500D01*
+X382905D01*
+X383655Y2009750D01*
+X380655Y2009000D02*X383655D01*
+Y2009750D02*Y2009000D01*
+X385457Y2006000D02*X386957Y2007500D01*
+X391458Y2012750D02*X392208Y2013500D01*
+X394458D01*
+X395208Y2012750D01*
+Y2011250D01*
+X391458Y2007500D02*X395208Y2011250D01*
+X391458Y2007500D02*X395208D01*
+X397010Y2008250D02*X397760Y2007500D01*
+X397010Y2012750D02*Y2008250D01*
+Y2012750D02*X397760Y2013500D01*
+X399260D01*
+X400010Y2012750D01*
+Y2008250D01*
+X399260Y2007500D02*X400010Y2008250D01*
+X397760Y2007500D02*X399260D01*
+X397010Y2009000D02*X400010Y2012000D01*
+X401811Y2008250D02*X402561Y2007500D01*
+X401811Y2012750D02*Y2008250D01*
+Y2012750D02*X402561Y2013500D01*
+X404061D01*
+X404811Y2012750D01*
+Y2008250D01*
+X404061Y2007500D02*X404811Y2008250D01*
+X402561Y2007500D02*X404061D01*
+X401811Y2009000D02*X404811Y2012000D01*
+X406613Y2008250D02*X407363Y2007500D01*
+X406613Y2012750D02*Y2008250D01*
+Y2012750D02*X407363Y2013500D01*
+X408863D01*
+X409613Y2012750D01*
+Y2008250D01*
+X408863Y2007500D02*X409613Y2008250D01*
+X407363Y2007500D02*X408863D01*
+X406613Y2009000D02*X409613Y2012000D01*
+X411414Y2008250D02*X412164Y2007500D01*
+X411414Y2012750D02*Y2008250D01*
+Y2012750D02*X412164Y2013500D01*
+X413664D01*
+X414414Y2012750D01*
+Y2008250D01*
+X413664Y2007500D02*X414414Y2008250D01*
+X412164Y2007500D02*X413664D01*
+X411414Y2009000D02*X414414Y2012000D01*
+X416216Y2007500D02*X416966D01*
+X418767Y2008250D02*X419517Y2007500D01*
+X418767Y2012750D02*Y2008250D01*
+Y2012750D02*X419517Y2013500D01*
+X421017D01*
+X421767Y2012750D01*
+Y2008250D01*
+X421017Y2007500D02*X421767Y2008250D01*
+X419517Y2007500D02*X421017D01*
+X418767Y2009000D02*X421767Y2012000D01*
+X423569Y2008250D02*X424319Y2007500D01*
+X423569Y2012750D02*Y2008250D01*
+Y2012750D02*X424319Y2013500D01*
+X425819D01*
+X426569Y2012750D01*
+Y2008250D01*
+X425819Y2007500D02*X426569Y2008250D01*
+X424319Y2007500D02*X425819D01*
+X423569Y2009000D02*X426569Y2012000D01*
+X428370Y2008250D02*X429120Y2007500D01*
+X428370Y2012750D02*Y2008250D01*
+Y2012750D02*X429120Y2013500D01*
+X430620D01*
+X431370Y2012750D01*
+Y2008250D01*
+X430620Y2007500D02*X431370Y2008250D01*
+X429120Y2007500D02*X430620D01*
+X428370Y2009000D02*X431370Y2012000D01*
+X433172Y2008250D02*X433922Y2007500D01*
+X433172Y2012750D02*Y2008250D01*
+Y2012750D02*X433922Y2013500D01*
+X435422D01*
+X436172Y2012750D01*
+Y2008250D01*
+X435422Y2007500D02*X436172Y2008250D01*
+X433922Y2007500D02*X435422D01*
+X433172Y2009000D02*X436172Y2012000D01*
+X437973Y2008250D02*X438723Y2007500D01*
+X437973Y2012750D02*Y2008250D01*
+Y2012750D02*X438723Y2013500D01*
+X440223D01*
+X440973Y2012750D01*
+Y2008250D01*
+X440223Y2007500D02*X440973Y2008250D01*
+X438723Y2007500D02*X440223D01*
+X437973Y2009000D02*X440973Y2012000D01*
+X442775Y2008250D02*X443525Y2007500D01*
+X442775Y2012750D02*Y2008250D01*
+Y2012750D02*X443525Y2013500D01*
+X445025D01*
+X445775Y2012750D01*
+Y2008250D01*
+X445025Y2007500D02*X445775Y2008250D01*
+X443525Y2007500D02*X445025D01*
+X442775Y2009000D02*X445775Y2012000D01*
+X451026Y2009750D02*Y2007500D01*
+Y2009750D02*X451776Y2010500D01*
+X452526D01*
+X453276Y2009750D01*
+Y2007500D01*
+Y2009750D02*X454026Y2010500D01*
+X454776D01*
+X455526Y2009750D01*
+Y2007500D01*
+X450276Y2010500D02*X451026Y2009750D01*
+X457328Y2012000D02*Y2011250D01*
+Y2009750D02*Y2007500D01*
+X458829Y2013500D02*Y2008250D01*
+X459579Y2007500D01*
+X461831D02*X464081D01*
+X464831Y2008250D01*
+X464081Y2009000D02*X464831Y2008250D01*
+X461831Y2009000D02*X464081D01*
+X461081Y2009750D02*X461831Y2009000D01*
+X461081Y2009750D02*X461831Y2010500D01*
+X464081D01*
+X464831Y2009750D01*
+X461081Y2008250D02*X461831Y2007500D01*
+X469332Y2013500D02*Y2007500D01*
+Y2009750D02*X470082Y2010500D01*
+X471582D01*
+X472332Y2009750D01*
+Y2007500D01*
+X474134Y2012000D02*Y2011250D01*
+Y2009750D02*Y2007500D01*
+X477885Y2010500D02*X478635Y2009750D01*
+X476385Y2010500D02*X477885D01*
+X475635Y2009750D02*X476385Y2010500D01*
+X475635Y2009750D02*Y2008250D01*
+X476385Y2007500D01*
+X477885D01*
+X478635Y2008250D01*
+X475635Y2006000D02*X476385Y2005250D01*
+X477885D01*
+X478635Y2006000D01*
+Y2010500D02*Y2006000D01*
+X480437Y2013500D02*Y2007500D01*
+Y2009750D02*X481187Y2010500D01*
+X482687D01*
+X483437Y2009750D01*
+Y2007500D01*
+X1292034Y-9500D02*X1295034D01*
+X1295784Y-8750D01*
+Y-7250D02*Y-8750D01*
+X1295034Y-6500D02*X1295784Y-7250D01*
+X1292784Y-6500D02*X1295034D01*
+X1292784Y-3500D02*Y-9500D01*
+X1292034Y-3500D02*X1295034D01*
+X1295784Y-4250D01*
+Y-5750D01*
+X1295034Y-6500D02*X1295784Y-5750D01*
+X1297585Y-7250D02*Y-8750D01*
+Y-7250D02*X1298335Y-6500D01*
+X1299835D01*
+X1300585Y-7250D01*
+Y-8750D01*
+X1299835Y-9500D02*X1300585Y-8750D01*
+X1298335Y-9500D02*X1299835D01*
+X1297585Y-8750D02*X1298335Y-9500D01*
+X1304637Y-6500D02*X1305387Y-7250D01*
+X1303137Y-6500D02*X1304637D01*
+X1302387Y-7250D02*X1303137Y-6500D01*
+X1302387Y-7250D02*Y-8750D01*
+X1303137Y-9500D01*
+X1305387Y-6500D02*Y-8750D01*
+X1306137Y-9500D01*
+X1303137D02*X1304637D01*
+X1305387Y-8750D01*
+X1308688Y-7250D02*Y-9500D01*
+Y-7250D02*X1309438Y-6500D01*
+X1310938D01*
+X1307938D02*X1308688Y-7250D01*
+X1315740Y-3500D02*Y-9500D01*
+X1314990D02*X1315740Y-8750D01*
+X1313490Y-9500D02*X1314990D01*
+X1312740Y-8750D02*X1313490Y-9500D01*
+X1312740Y-7250D02*Y-8750D01*
+Y-7250D02*X1313490Y-6500D01*
+X1314990D01*
+X1315740Y-7250D01*
+X1320241D02*Y-8750D01*
+Y-7250D02*X1320991Y-6500D01*
+X1322491D01*
+X1323241Y-7250D01*
+Y-8750D01*
+X1322491Y-9500D02*X1323241Y-8750D01*
+X1320991Y-9500D02*X1322491D01*
+X1320241Y-8750D02*X1320991Y-9500D01*
+X1325043Y-6500D02*Y-8750D01*
+X1325793Y-9500D01*
+X1327293D01*
+X1328043Y-8750D01*
+Y-6500D02*Y-8750D01*
+X1330594Y-3500D02*Y-8750D01*
+X1331344Y-9500D01*
+X1329844Y-5750D02*X1331344D01*
+X1332846Y-3500D02*Y-8750D01*
+X1333596Y-9500D01*
+X1335097Y-5000D02*Y-5750D01*
+Y-7250D02*Y-9500D01*
+X1337349Y-7250D02*Y-9500D01*
+Y-7250D02*X1338099Y-6500D01*
+X1338849D01*
+X1339599Y-7250D01*
+Y-9500D01*
+X1336599Y-6500D02*X1337349Y-7250D01*
+X1342150Y-9500D02*X1344400D01*
+X1341400Y-8750D02*X1342150Y-9500D01*
+X1341400Y-7250D02*Y-8750D01*
+Y-7250D02*X1342150Y-6500D01*
+X1343650D01*
+X1344400Y-7250D01*
+X1341400Y-8000D02*X1344400D01*
+Y-7250D02*Y-8000D01*
+X1348902Y-5000D02*Y-5750D01*
+Y-7250D02*Y-9500D01*
+X1351153D02*X1353403D01*
+X1354153Y-8750D01*
+X1353403Y-8000D02*X1354153Y-8750D01*
+X1351153Y-8000D02*X1353403D01*
+X1350403Y-7250D02*X1351153Y-8000D01*
+X1350403Y-7250D02*X1351153Y-6500D01*
+X1353403D01*
+X1354153Y-7250D01*
+X1350403Y-8750D02*X1351153Y-9500D01*
+X1359405Y-3500D02*Y-8750D01*
+X1360155Y-9500D01*
+X1358655Y-5750D02*X1360155D01*
+X1361656Y-3500D02*Y-9500D01*
+Y-7250D02*X1362406Y-6500D01*
+X1363906D01*
+X1364656Y-7250D01*
+Y-9500D01*
+X1367208D02*X1369458D01*
+X1366458Y-8750D02*X1367208Y-9500D01*
+X1366458Y-7250D02*Y-8750D01*
+Y-7250D02*X1367208Y-6500D01*
+X1368708D01*
+X1369458Y-7250D01*
+X1366458Y-8000D02*X1369458D01*
+Y-7250D02*Y-8000D01*
+X1374709Y-6500D02*X1376959D01*
+X1373959Y-7250D02*X1374709Y-6500D01*
+X1373959Y-7250D02*Y-8750D01*
+X1374709Y-9500D01*
+X1376959D01*
+X1379511D02*X1381761D01*
+X1378761Y-8750D02*X1379511Y-9500D01*
+X1378761Y-7250D02*Y-8750D01*
+Y-7250D02*X1379511Y-6500D01*
+X1381011D01*
+X1381761Y-7250D01*
+X1378761Y-8000D02*X1381761D01*
+Y-7250D02*Y-8000D01*
+X1384312Y-7250D02*Y-9500D01*
+Y-7250D02*X1385062Y-6500D01*
+X1385812D01*
+X1386562Y-7250D01*
+Y-9500D01*
+X1383562Y-6500D02*X1384312Y-7250D01*
+X1389114Y-3500D02*Y-8750D01*
+X1389864Y-9500D01*
+X1388364Y-5750D02*X1389864D01*
+X1392115Y-9500D02*X1394365D01*
+X1391365Y-8750D02*X1392115Y-9500D01*
+X1391365Y-7250D02*Y-8750D01*
+Y-7250D02*X1392115Y-6500D01*
+X1393615D01*
+X1394365Y-7250D01*
+X1391365Y-8000D02*X1394365D01*
+Y-7250D02*Y-8000D01*
+X1396917Y-7250D02*Y-9500D01*
+Y-7250D02*X1397667Y-6500D01*
+X1399167D01*
+X1396167D02*X1396917Y-7250D01*
+X1400968Y-3500D02*Y-8750D01*
+X1401718Y-9500D01*
+X1403220Y-5000D02*Y-5750D01*
+Y-7250D02*Y-9500D01*
+X1405471Y-7250D02*Y-9500D01*
+Y-7250D02*X1406221Y-6500D01*
+X1406971D01*
+X1407721Y-7250D01*
+Y-9500D01*
+X1404721Y-6500D02*X1405471Y-7250D01*
+X1410273Y-9500D02*X1412523D01*
+X1409523Y-8750D02*X1410273Y-9500D01*
+X1409523Y-7250D02*Y-8750D01*
+Y-7250D02*X1410273Y-6500D01*
+X1411773D01*
+X1412523Y-7250D01*
+X1409523Y-8000D02*X1412523D01*
+Y-7250D02*Y-8000D01*
+X1417024Y-7250D02*Y-8750D01*
+Y-7250D02*X1417774Y-6500D01*
+X1419274D01*
+X1420024Y-7250D01*
+Y-8750D01*
+X1419274Y-9500D02*X1420024Y-8750D01*
+X1417774Y-9500D02*X1419274D01*
+X1417024Y-8750D02*X1417774Y-9500D01*
+X1422576Y-4250D02*Y-9500D01*
+Y-4250D02*X1423326Y-3500D01*
+X1424076D01*
+X1421826Y-6500D02*X1423326D01*
+X1429027Y-3500D02*Y-8750D01*
+X1429777Y-9500D01*
+X1428277Y-5750D02*X1429777D01*
+X1431279Y-3500D02*Y-9500D01*
+Y-7250D02*X1432029Y-6500D01*
+X1433529D01*
+X1434279Y-7250D01*
+Y-9500D01*
+X1436080Y-5000D02*Y-5750D01*
+Y-7250D02*Y-9500D01*
+X1438332D02*X1440582D01*
+X1441332Y-8750D01*
+X1440582Y-8000D02*X1441332Y-8750D01*
+X1438332Y-8000D02*X1440582D01*
+X1437582Y-7250D02*X1438332Y-8000D01*
+X1437582Y-7250D02*X1438332Y-6500D01*
+X1440582D01*
+X1441332Y-7250D01*
+X1437582Y-8750D02*X1438332Y-9500D01*
+X1445833Y-8750D02*X1446583Y-9500D01*
+X1445833Y-7250D02*Y-8750D01*
+Y-7250D02*X1446583Y-6500D01*
+X1448083D01*
+X1448833Y-7250D01*
+Y-8750D01*
+X1448083Y-9500D02*X1448833Y-8750D01*
+X1446583Y-9500D02*X1448083D01*
+X1445833Y-5750D02*X1446583Y-6500D01*
+X1445833Y-4250D02*Y-5750D01*
+Y-4250D02*X1446583Y-3500D01*
+X1448083D01*
+X1448833Y-4250D01*
+Y-5750D01*
+X1448083Y-6500D02*X1448833Y-5750D01*
+X1450635Y-9500D02*X1451385D01*
+X1453186Y-8750D02*X1453936Y-9500D01*
+X1453186Y-4250D02*Y-8750D01*
+Y-4250D02*X1453936Y-3500D01*
+X1455436D01*
+X1456186Y-4250D01*
+Y-8750D01*
+X1455436Y-9500D02*X1456186Y-8750D01*
+X1453936Y-9500D02*X1455436D01*
+X1453186Y-8000D02*X1456186Y-5000D01*
+X1457988Y-8750D02*X1458738Y-9500D01*
+X1457988Y-4250D02*Y-8750D01*
+Y-4250D02*X1458738Y-3500D01*
+X1460238D01*
+X1460988Y-4250D01*
+Y-8750D01*
+X1460238Y-9500D02*X1460988Y-8750D01*
+X1458738Y-9500D02*X1460238D01*
+X1457988Y-8000D02*X1460988Y-5000D01*
+X1462789Y-8750D02*X1463539Y-9500D01*
+X1462789Y-4250D02*Y-8750D01*
+Y-4250D02*X1463539Y-3500D01*
+X1465039D01*
+X1465789Y-4250D01*
+Y-8750D01*
+X1465039Y-9500D02*X1465789Y-8750D01*
+X1463539Y-9500D02*X1465039D01*
+X1462789Y-8000D02*X1465789Y-5000D01*
+X1467591Y-8750D02*X1468341Y-9500D01*
+X1467591Y-4250D02*Y-8750D01*
+Y-4250D02*X1468341Y-3500D01*
+X1469841D01*
+X1470591Y-4250D01*
+Y-8750D01*
+X1469841Y-9500D02*X1470591Y-8750D01*
+X1468341Y-9500D02*X1469841D01*
+X1467591Y-8000D02*X1470591Y-5000D01*
+X1472392Y-8750D02*X1473142Y-9500D01*
+X1472392Y-4250D02*Y-8750D01*
+Y-4250D02*X1473142Y-3500D01*
+X1474642D01*
+X1475392Y-4250D01*
+Y-8750D01*
+X1474642Y-9500D02*X1475392Y-8750D01*
+X1473142Y-9500D02*X1474642D01*
+X1472392Y-8000D02*X1475392Y-5000D01*
+X1477194Y-8750D02*X1477944Y-9500D01*
+X1477194Y-4250D02*Y-8750D01*
+Y-4250D02*X1477944Y-3500D01*
+X1479444D01*
+X1480194Y-4250D01*
+Y-8750D01*
+X1479444Y-9500D02*X1480194Y-8750D01*
+X1477944Y-9500D02*X1479444D01*
+X1477194Y-8000D02*X1480194Y-5000D01*
+X1485445Y-7250D02*Y-9500D01*
+Y-7250D02*X1486195Y-6500D01*
+X1486945D01*
+X1487695Y-7250D01*
+Y-9500D01*
+Y-7250D02*X1488445Y-6500D01*
+X1489195D01*
+X1489945Y-7250D01*
+Y-9500D01*
+X1484695Y-6500D02*X1485445Y-7250D01*
+X1491747Y-5000D02*Y-5750D01*
+Y-7250D02*Y-9500D01*
+X1493248Y-3500D02*Y-8750D01*
+X1493998Y-9500D01*
+X1498950Y-7250D02*Y-9500D01*
+Y-7250D02*X1499700Y-6500D01*
+X1501200D01*
+X1498200D02*X1498950Y-7250D01*
+X1503751Y-9500D02*X1506001D01*
+X1503001Y-8750D02*X1503751Y-9500D01*
+X1503001Y-7250D02*Y-8750D01*
+Y-7250D02*X1503751Y-6500D01*
+X1505251D01*
+X1506001Y-7250D01*
+X1503001Y-8000D02*X1506001D01*
+Y-7250D02*Y-8000D01*
+X1508553Y-6500D02*X1510803D01*
+X1507803Y-7250D02*X1508553Y-6500D01*
+X1507803Y-7250D02*Y-8750D01*
+X1508553Y-9500D01*
+X1510803D01*
+X1513354Y-3500D02*Y-8750D01*
+X1514104Y-9500D01*
+X1512604Y-5750D02*X1514104D01*
+X1517856Y-6500D02*X1518606Y-7250D01*
+X1516356Y-6500D02*X1517856D01*
+X1515606Y-7250D02*X1516356Y-6500D01*
+X1515606Y-7250D02*Y-8750D01*
+X1516356Y-9500D01*
+X1518606Y-6500D02*Y-8750D01*
+X1519356Y-9500D01*
+X1516356D02*X1517856D01*
+X1518606Y-8750D01*
+X1521907Y-7250D02*Y-9500D01*
+Y-7250D02*X1522657Y-6500D01*
+X1523407D01*
+X1524157Y-7250D01*
+Y-9500D01*
+X1521157Y-6500D02*X1521907Y-7250D01*
+X1528209Y-6500D02*X1528959Y-7250D01*
+X1526709Y-6500D02*X1528209D01*
+X1525959Y-7250D02*X1526709Y-6500D01*
+X1525959Y-7250D02*Y-8750D01*
+X1526709Y-9500D01*
+X1528209D01*
+X1528959Y-8750D01*
+X1525959Y-11000D02*X1526709Y-11750D01*
+X1528209D01*
+X1528959Y-11000D01*
+Y-6500D02*Y-11000D01*
+X1530760Y-3500D02*Y-8750D01*
+X1531510Y-9500D01*
+X1533762D02*X1536012D01*
+X1533012Y-8750D02*X1533762Y-9500D01*
+X1533012Y-7250D02*Y-8750D01*
+Y-7250D02*X1533762Y-6500D01*
+X1535262D01*
+X1536012Y-7250D01*
+X1533012Y-8000D02*X1536012D01*
+Y-7250D02*Y-8000D01*
+X1540513Y-6500D02*X1543513D01*
+X1548015Y-8750D02*X1548765Y-9500D01*
+X1548015Y-4250D02*Y-8750D01*
+Y-4250D02*X1548765Y-3500D01*
+X1550265D01*
+X1551015Y-4250D01*
+Y-8750D01*
+X1550265Y-9500D02*X1551015Y-8750D01*
+X1548765Y-9500D02*X1550265D01*
+X1548015Y-8000D02*X1551015Y-5000D01*
+X1552816Y-11000D02*X1554316Y-9500D01*
+X1556118Y-8750D02*X1556868Y-9500D01*
+X1556118Y-4250D02*Y-8750D01*
+Y-4250D02*X1556868Y-3500D01*
+X1558368D01*
+X1559118Y-4250D01*
+Y-8750D01*
+X1558368Y-9500D02*X1559118Y-8750D01*
+X1556868Y-9500D02*X1558368D01*
+X1556118Y-8000D02*X1559118Y-5000D01*
+X1564369Y-3500D02*Y-8750D01*
+X1565119Y-9500D01*
+X1563619Y-5750D02*X1565119D01*
+X1566621Y-7250D02*Y-8750D01*
+Y-7250D02*X1567371Y-6500D01*
+X1568871D01*
+X1569621Y-7250D01*
+Y-8750D01*
+X1568871Y-9500D02*X1569621Y-8750D01*
+X1567371Y-9500D02*X1568871D01*
+X1566621Y-8750D02*X1567371Y-9500D01*
+X1574122Y-4250D02*X1574872Y-3500D01*
+X1576372D01*
+X1577122Y-4250D01*
+Y-8750D01*
+X1576372Y-9500D02*X1577122Y-8750D01*
+X1574872Y-9500D02*X1576372D01*
+X1574122Y-8750D02*X1574872Y-9500D01*
+Y-6500D02*X1577122D01*
+X1578924Y-8750D02*X1579674Y-9500D01*
+X1578924Y-4250D02*Y-8750D01*
+Y-4250D02*X1579674Y-3500D01*
+X1581174D01*
+X1581924Y-4250D01*
+Y-8750D01*
+X1581174Y-9500D02*X1581924Y-8750D01*
+X1579674Y-9500D02*X1581174D01*
+X1578924Y-8000D02*X1581924Y-5000D01*
+X1583725Y-8750D02*X1584475Y-9500D01*
+X1583725Y-4250D02*Y-8750D01*
+Y-4250D02*X1584475Y-3500D01*
+X1585975D01*
+X1586725Y-4250D01*
+Y-8750D01*
+X1585975Y-9500D02*X1586725Y-8750D01*
+X1584475Y-9500D02*X1585975D01*
+X1583725Y-8000D02*X1586725Y-5000D01*
+X1588527Y-8750D02*X1589277Y-9500D01*
+X1588527Y-4250D02*Y-8750D01*
+Y-4250D02*X1589277Y-3500D01*
+X1590777D01*
+X1591527Y-4250D01*
+Y-8750D01*
+X1590777Y-9500D02*X1591527Y-8750D01*
+X1589277Y-9500D02*X1590777D01*
+X1588527Y-8000D02*X1591527Y-5000D01*
+X1593328Y-8750D02*X1594078Y-9500D01*
+X1593328Y-4250D02*Y-8750D01*
+Y-4250D02*X1594078Y-3500D01*
+X1595578D01*
+X1596328Y-4250D01*
+Y-8750D01*
+X1595578Y-9500D02*X1596328Y-8750D01*
+X1594078Y-9500D02*X1595578D01*
+X1593328Y-8000D02*X1596328Y-5000D01*
+X1598130Y-9500D02*X1598880D01*
+X1600681Y-8750D02*X1601431Y-9500D01*
+X1600681Y-4250D02*Y-8750D01*
+Y-4250D02*X1601431Y-3500D01*
+X1602931D01*
+X1603681Y-4250D01*
+Y-8750D01*
+X1602931Y-9500D02*X1603681Y-8750D01*
+X1601431Y-9500D02*X1602931D01*
+X1600681Y-8000D02*X1603681Y-5000D01*
+X1605483Y-8750D02*X1606233Y-9500D01*
+X1605483Y-4250D02*Y-8750D01*
+Y-4250D02*X1606233Y-3500D01*
+X1607733D01*
+X1608483Y-4250D01*
+Y-8750D01*
+X1607733Y-9500D02*X1608483Y-8750D01*
+X1606233Y-9500D02*X1607733D01*
+X1605483Y-8000D02*X1608483Y-5000D01*
+X1610284Y-8750D02*X1611034Y-9500D01*
+X1610284Y-4250D02*Y-8750D01*
+Y-4250D02*X1611034Y-3500D01*
+X1612534D01*
+X1613284Y-4250D01*
+Y-8750D01*
+X1612534Y-9500D02*X1613284Y-8750D01*
+X1611034Y-9500D02*X1612534D01*
+X1610284Y-8000D02*X1613284Y-5000D01*
+X1615086Y-8750D02*X1615836Y-9500D01*
+X1615086Y-4250D02*Y-8750D01*
+Y-4250D02*X1615836Y-3500D01*
+X1617336D01*
+X1618086Y-4250D01*
+Y-8750D01*
+X1617336Y-9500D02*X1618086Y-8750D01*
+X1615836Y-9500D02*X1617336D01*
+X1615086Y-8000D02*X1618086Y-5000D01*
+X1619887Y-8750D02*X1620637Y-9500D01*
+X1619887Y-4250D02*Y-8750D01*
+Y-4250D02*X1620637Y-3500D01*
+X1622137D01*
+X1622887Y-4250D01*
+Y-8750D01*
+X1622137Y-9500D02*X1622887Y-8750D01*
+X1620637Y-9500D02*X1622137D01*
+X1619887Y-8000D02*X1622887Y-5000D01*
+X1624689Y-8750D02*X1625439Y-9500D01*
+X1624689Y-4250D02*Y-8750D01*
+Y-4250D02*X1625439Y-3500D01*
+X1626939D01*
+X1627689Y-4250D01*
+Y-8750D01*
+X1626939Y-9500D02*X1627689Y-8750D01*
+X1625439Y-9500D02*X1626939D01*
+X1624689Y-8000D02*X1627689Y-5000D01*
+X1629490Y-11000D02*X1630990Y-9500D01*
+X1632792Y-4250D02*X1633542Y-3500D01*
+X1635792D01*
+X1636542Y-4250D01*
+Y-5750D01*
+X1632792Y-9500D02*X1636542Y-5750D01*
+X1632792Y-9500D02*X1636542D01*
+X1638343Y-8750D02*X1639093Y-9500D01*
+X1638343Y-4250D02*Y-8750D01*
+Y-4250D02*X1639093Y-3500D01*
+X1640593D01*
+X1641343Y-4250D01*
+Y-8750D01*
+X1640593Y-9500D02*X1641343Y-8750D01*
+X1639093Y-9500D02*X1640593D01*
+X1638343Y-8000D02*X1641343Y-5000D01*
+X1643145Y-8750D02*X1643895Y-9500D01*
+X1643145Y-4250D02*Y-8750D01*
+Y-4250D02*X1643895Y-3500D01*
+X1645395D01*
+X1646145Y-4250D01*
+Y-8750D01*
+X1645395Y-9500D02*X1646145Y-8750D01*
+X1643895Y-9500D02*X1645395D01*
+X1643145Y-8000D02*X1646145Y-5000D01*
+X1647946Y-8750D02*X1648696Y-9500D01*
+X1647946Y-4250D02*Y-8750D01*
+Y-4250D02*X1648696Y-3500D01*
+X1650196D01*
+X1650946Y-4250D01*
+Y-8750D01*
+X1650196Y-9500D02*X1650946Y-8750D01*
+X1648696Y-9500D02*X1650196D01*
+X1647946Y-8000D02*X1650946Y-5000D01*
+X1652748Y-8750D02*X1653498Y-9500D01*
+X1652748Y-4250D02*Y-8750D01*
+Y-4250D02*X1653498Y-3500D01*
+X1654998D01*
+X1655748Y-4250D01*
+Y-8750D01*
+X1654998Y-9500D02*X1655748Y-8750D01*
+X1653498Y-9500D02*X1654998D01*
+X1652748Y-8000D02*X1655748Y-5000D01*
+X1657549Y-9500D02*X1658299D01*
+X1660101Y-8750D02*X1660851Y-9500D01*
+X1660101Y-4250D02*Y-8750D01*
+Y-4250D02*X1660851Y-3500D01*
+X1662351D01*
+X1663101Y-4250D01*
+Y-8750D01*
+X1662351Y-9500D02*X1663101Y-8750D01*
+X1660851Y-9500D02*X1662351D01*
+X1660101Y-8000D02*X1663101Y-5000D01*
+X1664902Y-8750D02*X1665652Y-9500D01*
+X1664902Y-4250D02*Y-8750D01*
+Y-4250D02*X1665652Y-3500D01*
+X1667152D01*
+X1667902Y-4250D01*
+Y-8750D01*
+X1667152Y-9500D02*X1667902Y-8750D01*
+X1665652Y-9500D02*X1667152D01*
+X1664902Y-8000D02*X1667902Y-5000D01*
+X1669704Y-8750D02*X1670454Y-9500D01*
+X1669704Y-4250D02*Y-8750D01*
+Y-4250D02*X1670454Y-3500D01*
+X1671954D01*
+X1672704Y-4250D01*
+Y-8750D01*
+X1671954Y-9500D02*X1672704Y-8750D01*
+X1670454Y-9500D02*X1671954D01*
+X1669704Y-8000D02*X1672704Y-5000D01*
+X1674505Y-8750D02*X1675255Y-9500D01*
+X1674505Y-4250D02*Y-8750D01*
+Y-4250D02*X1675255Y-3500D01*
+X1676755D01*
+X1677505Y-4250D01*
+Y-8750D01*
+X1676755Y-9500D02*X1677505Y-8750D01*
+X1675255Y-9500D02*X1676755D01*
+X1674505Y-8000D02*X1677505Y-5000D01*
+X1679307Y-8750D02*X1680057Y-9500D01*
+X1679307Y-4250D02*Y-8750D01*
+Y-4250D02*X1680057Y-3500D01*
+X1681557D01*
+X1682307Y-4250D01*
+Y-8750D01*
+X1681557Y-9500D02*X1682307Y-8750D01*
+X1680057Y-9500D02*X1681557D01*
+X1679307Y-8000D02*X1682307Y-5000D01*
+X1684108Y-8750D02*X1684858Y-9500D01*
+X1684108Y-4250D02*Y-8750D01*
+Y-4250D02*X1684858Y-3500D01*
+X1686358D01*
+X1687108Y-4250D01*
+Y-8750D01*
+X1686358Y-9500D02*X1687108Y-8750D01*
+X1684858Y-9500D02*X1686358D01*
+X1684108Y-8000D02*X1687108Y-5000D01*
+X1692360Y-7250D02*Y-9500D01*
+Y-7250D02*X1693110Y-6500D01*
+X1693860D01*
+X1694610Y-7250D01*
+Y-9500D01*
+Y-7250D02*X1695360Y-6500D01*
+X1696110D01*
+X1696860Y-7250D01*
+Y-9500D01*
+X1691610Y-6500D02*X1692360Y-7250D01*
+X1698661Y-5000D02*Y-5750D01*
+Y-7250D02*Y-9500D01*
+X1700163Y-3500D02*Y-8750D01*
+X1700913Y-9500D01*
+X1703164D02*X1705414D01*
+X1706164Y-8750D01*
+X1705414Y-8000D02*X1706164Y-8750D01*
+X1703164Y-8000D02*X1705414D01*
+X1702414Y-7250D02*X1703164Y-8000D01*
+X1702414Y-7250D02*X1703164Y-6500D01*
+X1705414D01*
+X1706164Y-7250D01*
+X1702414Y-8750D02*X1703164Y-9500D01*
+X200750Y2028500D02*Y2022500D01*
+X203000Y2028500D02*X203750Y2027750D01*
+Y2023250D01*
+X203000Y2022500D02*X203750Y2023250D01*
+X200000Y2022500D02*X203000D01*
+X200000Y2028500D02*X203000D01*
+X207801Y2025500D02*X208551Y2024750D01*
+X206301Y2025500D02*X207801D01*
+X205551Y2024750D02*X206301Y2025500D01*
+X205551Y2024750D02*Y2023250D01*
+X206301Y2022500D01*
+X208551Y2025500D02*Y2023250D01*
+X209301Y2022500D01*
+X206301D02*X207801D01*
+X208551Y2023250D01*
+X211853Y2028500D02*Y2023250D01*
+X212603Y2022500D01*
+X211103Y2026250D02*X212603D01*
+X214854Y2022500D02*X217104D01*
+X214104Y2023250D02*X214854Y2022500D01*
+X214104Y2024750D02*Y2023250D01*
+Y2024750D02*X214854Y2025500D01*
+X216354D01*
+X217104Y2024750D01*
+X214104Y2024000D02*X217104D01*
+Y2024750D02*Y2024000D01*
+X218906Y2026250D02*X219656D01*
+X218906Y2024750D02*X219656D01*
+X224157Y2028500D02*Y2022500D01*
+Y2028500D02*X227157D01*
+X224157Y2025500D02*X226407D01*
+X229709Y2024750D02*Y2022500D01*
+Y2024750D02*X230459Y2025500D01*
+X231959D01*
+X228959D02*X229709Y2024750D01*
+X233760Y2027000D02*Y2026250D01*
+Y2024750D02*Y2022500D01*
+X237962Y2028500D02*X240212D01*
+Y2023250D01*
+X239462Y2022500D02*X240212Y2023250D01*
+X238712Y2022500D02*X239462D01*
+X237962Y2023250D02*X238712Y2022500D01*
+X242013Y2025500D02*Y2023250D01*
+X242763Y2022500D01*
+X244263D01*
+X245013Y2023250D01*
+Y2025500D02*Y2023250D01*
+X247565Y2024750D02*Y2022500D01*
+Y2024750D02*X248315Y2025500D01*
+X249065D01*
+X249815Y2024750D01*
+Y2022500D01*
+X246815Y2025500D02*X247565Y2024750D01*
+X255066Y2022500D02*X256566D01*
+X255816Y2028500D02*Y2022500D01*
+X254316Y2027000D02*X255816Y2028500D01*
+X258368Y2022500D02*X262118Y2026250D01*
+Y2028500D02*Y2026250D01*
+X258368Y2028500D02*X262118D01*
+X266619Y2023250D02*X267369Y2022500D01*
+X266619Y2027750D02*Y2023250D01*
+Y2027750D02*X267369Y2028500D01*
+X268869D01*
+X269619Y2027750D01*
+Y2023250D01*
+X268869Y2022500D02*X269619Y2023250D01*
+X267369Y2022500D02*X268869D01*
+X266619Y2024000D02*X269619Y2027000D01*
+X271421Y2027750D02*X272171Y2028500D01*
+X273671D01*
+X274421Y2027750D01*
+Y2023250D01*
+X273671Y2022500D02*X274421Y2023250D01*
+X272171Y2022500D02*X273671D01*
+X271421Y2023250D02*X272171Y2022500D01*
+Y2025500D02*X274421D01*
+X276222Y2026250D02*X276972D01*
+X276222Y2024750D02*X276972D01*
+X279524Y2022500D02*X281024D01*
+X280274Y2028500D02*Y2022500D01*
+X278774Y2027000D02*X280274Y2028500D01*
+X282825Y2023250D02*X283575Y2022500D01*
+X282825Y2024750D02*Y2023250D01*
+Y2024750D02*X283575Y2025500D01*
+X285075D01*
+X285825Y2024750D01*
+Y2023250D01*
+X285075Y2022500D02*X285825Y2023250D01*
+X283575Y2022500D02*X285075D01*
+X282825Y2026250D02*X283575Y2025500D01*
+X282825Y2027750D02*Y2026250D01*
+Y2027750D02*X283575Y2028500D01*
+X285075D01*
+X285825Y2027750D01*
+Y2026250D01*
+X285075Y2025500D02*X285825Y2026250D01*
+X287627D02*X288377D01*
+X287627Y2024750D02*X288377D01*
+X290178Y2028500D02*X293178D01*
+X290178D02*Y2025500D01*
+X290928Y2026250D01*
+X292428D01*
+X293178Y2025500D01*
+Y2023250D01*
+X292428Y2022500D02*X293178Y2023250D01*
+X290928Y2022500D02*X292428D01*
+X290178Y2023250D02*X290928Y2022500D01*
+X295730D02*X297230D01*
+X296480Y2028500D02*Y2022500D01*
+X294980Y2027000D02*X296480Y2028500D01*
+X301731Y2027750D02*X302481Y2028500D01*
+X304731D01*
+X305481Y2027750D01*
+Y2026250D01*
+X301731Y2022500D02*X305481Y2026250D01*
+X301731Y2022500D02*X305481D01*
+X307283Y2023250D02*X308033Y2022500D01*
+X307283Y2027750D02*Y2023250D01*
+Y2027750D02*X308033Y2028500D01*
+X309533D01*
+X310283Y2027750D01*
+Y2023250D01*
+X309533Y2022500D02*X310283Y2023250D01*
+X308033Y2022500D02*X309533D01*
+X307283Y2024000D02*X310283Y2027000D01*
+X312834Y2022500D02*X314334D01*
+X313584Y2028500D02*Y2022500D01*
+X312084Y2027000D02*X313584Y2028500D01*
+X316886Y2022500D02*X318386D01*
+X317636Y2028500D02*Y2022500D01*
+X316136Y2027000D02*X317636Y2028500D01*
+X322887D02*Y2023250D01*
+X323637Y2022500D01*
+X325137D01*
+X325887Y2023250D01*
+Y2028500D02*Y2023250D01*
+X327689Y2028500D02*X330689D01*
+X329189D02*Y2022500D01*
+X333240D02*X335490D01*
+X332490Y2023250D02*X333240Y2022500D01*
+X332490Y2027750D02*Y2023250D01*
+Y2027750D02*X333240Y2028500D01*
+X335490D01*
+X200000Y2042750D02*Y2037500D01*
+Y2042750D02*X200750Y2043500D01*
+X203000D01*
+X203750Y2042750D01*
+Y2037500D01*
+X200000Y2040500D02*X203750D01*
+X205551D02*Y2038250D01*
+X206301Y2037500D01*
+X207801D01*
+X208551Y2038250D01*
+Y2040500D02*Y2038250D01*
+X211103Y2043500D02*Y2038250D01*
+X211853Y2037500D01*
+X210353Y2041250D02*X211853D01*
+X213354Y2043500D02*Y2037500D01*
+Y2039750D02*X214104Y2040500D01*
+X215604D01*
+X216354Y2039750D01*
+Y2037500D01*
+X218156Y2039750D02*Y2038250D01*
+Y2039750D02*X218906Y2040500D01*
+X220406D01*
+X221156Y2039750D01*
+Y2038250D01*
+X220406Y2037500D02*X221156Y2038250D01*
+X218906Y2037500D02*X220406D01*
+X218156Y2038250D02*X218906Y2037500D01*
+X223707Y2039750D02*Y2037500D01*
+Y2039750D02*X224457Y2040500D01*
+X225957D01*
+X222957D02*X223707Y2039750D01*
+X227759Y2041250D02*X228509D01*
+X227759Y2039750D02*X228509D01*
+X233010Y2043500D02*Y2037500D01*
+Y2043500D02*X236010D01*
+X233010Y2040500D02*X235260D01*
+X240062D02*X240812Y2039750D01*
+X238562Y2040500D02*X240062D01*
+X237812Y2039750D02*X238562Y2040500D01*
+X237812Y2039750D02*Y2038250D01*
+X238562Y2037500D01*
+X240812Y2040500D02*Y2038250D01*
+X241562Y2037500D01*
+X238562D02*X240062D01*
+X240812Y2038250D01*
+X243363Y2043500D02*Y2037500D01*
+Y2038250D02*X244113Y2037500D01*
+X245613D01*
+X246363Y2038250D01*
+Y2039750D02*Y2038250D01*
+X245613Y2040500D02*X246363Y2039750D01*
+X244113Y2040500D02*X245613D01*
+X243363Y2039750D02*X244113Y2040500D01*
+X248165Y2037500D02*X251165D01*
+X252966Y2042750D02*Y2037500D01*
+Y2042750D02*X253716Y2043500D01*
+X255966D01*
+X256716Y2042750D01*
+Y2037500D01*
+X252966Y2040500D02*X256716D01*
+X258518D02*Y2038250D01*
+X259268Y2037500D01*
+X260768D01*
+X261518Y2038250D01*
+Y2040500D02*Y2038250D01*
+X264069Y2043500D02*Y2038250D01*
+X264819Y2037500D01*
+X263319Y2041250D02*X264819D01*
+X266321Y2043500D02*Y2037500D01*
+Y2039750D02*X267071Y2040500D01*
+X268571D01*
+X269321Y2039750D01*
+Y2037500D01*
+X271122Y2039750D02*Y2038250D01*
+Y2039750D02*X271872Y2040500D01*
+X273372D01*
+X274122Y2039750D01*
+Y2038250D01*
+X273372Y2037500D02*X274122Y2038250D01*
+X271872Y2037500D02*X273372D01*
+X271122Y2038250D02*X271872Y2037500D01*
+X276674Y2039750D02*Y2037500D01*
+Y2039750D02*X277424Y2040500D01*
+X278924D01*
+X275924D02*X276674Y2039750D01*
+X200000Y2058500D02*X203000D01*
+X201500D02*Y2052500D01*
+X204801Y2057000D02*Y2056250D01*
+Y2054750D02*Y2052500D01*
+X207053Y2058500D02*Y2053250D01*
+X207803Y2052500D01*
+X206303Y2056250D02*X207803D01*
+X209304Y2058500D02*Y2053250D01*
+X210054Y2052500D01*
+X212306D02*X214556D01*
+X211556Y2053250D02*X212306Y2052500D01*
+X211556Y2054750D02*Y2053250D01*
+Y2054750D02*X212306Y2055500D01*
+X213806D01*
+X214556Y2054750D01*
+X211556Y2054000D02*X214556D01*
+Y2054750D02*Y2054000D01*
+X216357Y2056250D02*X217107D01*
+X216357Y2054750D02*X217107D01*
+X221609Y2053250D02*X222359Y2052500D01*
+X221609Y2057750D02*X222359Y2058500D01*
+X221609Y2057750D02*Y2053250D01*
+X224160Y2055500D02*Y2053250D01*
+X224910Y2052500D01*
+X226410D01*
+X227160Y2053250D01*
+Y2055500D02*Y2053250D01*
+X229712Y2054750D02*Y2052500D01*
+Y2054750D02*X230462Y2055500D01*
+X231212D01*
+X231962Y2054750D01*
+Y2052500D01*
+X228962Y2055500D02*X229712Y2054750D01*
+X233763Y2058500D02*Y2052500D01*
+Y2054750D02*X236013Y2052500D01*
+X233763Y2054750D02*X235263Y2056250D01*
+X238565Y2054750D02*Y2052500D01*
+Y2054750D02*X239315Y2055500D01*
+X240065D01*
+X240815Y2054750D01*
+Y2052500D01*
+X237815Y2055500D02*X238565Y2054750D01*
+X242616D02*Y2053250D01*
+Y2054750D02*X243366Y2055500D01*
+X244866D01*
+X245616Y2054750D01*
+Y2053250D01*
+X244866Y2052500D02*X245616Y2053250D01*
+X243366Y2052500D02*X244866D01*
+X242616Y2053250D02*X243366Y2052500D01*
+X247418Y2055500D02*Y2053250D01*
+X248168Y2052500D01*
+X248918D01*
+X249668Y2053250D01*
+Y2055500D02*Y2053250D01*
+X250418Y2052500D01*
+X251168D01*
+X251918Y2053250D01*
+Y2055500D02*Y2053250D01*
+X254469Y2054750D02*Y2052500D01*
+Y2054750D02*X255219Y2055500D01*
+X255969D01*
+X256719Y2054750D01*
+Y2052500D01*
+X253719Y2055500D02*X254469Y2054750D01*
+X258521Y2058500D02*X259271Y2057750D01*
+Y2053250D01*
+X258521Y2052500D02*X259271Y2053250D01*
+X263772Y2055500D02*X266772D01*
+X271274Y2058500D02*Y2052500D01*
+Y2058500D02*X274274D01*
+X271274Y2055500D02*X273524D01*
+X278325D02*X279075Y2054750D01*
+X276825Y2055500D02*X278325D01*
+X276075Y2054750D02*X276825Y2055500D01*
+X276075Y2054750D02*Y2053250D01*
+X276825Y2052500D01*
+X279075Y2055500D02*Y2053250D01*
+X279825Y2052500D01*
+X276825D02*X278325D01*
+X279075Y2053250D01*
+X281627Y2058500D02*Y2052500D01*
+Y2053250D02*X282377Y2052500D01*
+X283877D01*
+X284627Y2053250D01*
+Y2054750D02*Y2053250D01*
+X283877Y2055500D02*X284627Y2054750D01*
+X282377Y2055500D02*X283877D01*
+X281627Y2054750D02*X282377Y2055500D01*
+X287178Y2054750D02*Y2052500D01*
+Y2054750D02*X287928Y2055500D01*
+X289428D01*
+X286428D02*X287178Y2054750D01*
+X291230Y2057000D02*Y2056250D01*
+Y2054750D02*Y2052500D01*
+X293481Y2055500D02*X295731D01*
+X292731Y2054750D02*X293481Y2055500D01*
+X292731Y2054750D02*Y2053250D01*
+X293481Y2052500D01*
+X295731D01*
+X299783Y2055500D02*X300533Y2054750D01*
+X298283Y2055500D02*X299783D01*
+X297533Y2054750D02*X298283Y2055500D01*
+X297533Y2054750D02*Y2053250D01*
+X298283Y2052500D01*
+X300533Y2055500D02*Y2053250D01*
+X301283Y2052500D01*
+X298283D02*X299783D01*
+X300533Y2053250D01*
+X303834Y2058500D02*Y2053250D01*
+X304584Y2052500D01*
+X303084Y2056250D02*X304584D01*
+X306086Y2057000D02*Y2056250D01*
+Y2054750D02*Y2052500D01*
+X307587Y2054750D02*Y2053250D01*
+Y2054750D02*X308337Y2055500D01*
+X309837D01*
+X310587Y2054750D01*
+Y2053250D01*
+X309837Y2052500D02*X310587Y2053250D01*
+X308337Y2052500D02*X309837D01*
+X307587Y2053250D02*X308337Y2052500D01*
+X313139Y2054750D02*Y2052500D01*
+Y2054750D02*X313889Y2055500D01*
+X314639D01*
+X315389Y2054750D01*
+Y2052500D01*
+X312389Y2055500D02*X313139Y2054750D01*
+X320640Y2058500D02*Y2052500D01*
+X322890Y2058500D02*X323640Y2057750D01*
+Y2053250D01*
+X322890Y2052500D02*X323640Y2053250D01*
+X319890Y2052500D02*X322890D01*
+X319890Y2058500D02*X322890D01*
+X326192Y2054750D02*Y2052500D01*
+Y2054750D02*X326942Y2055500D01*
+X328442D01*
+X325442D02*X326192Y2054750D01*
+X332493Y2055500D02*X333243Y2054750D01*
+X330993Y2055500D02*X332493D01*
+X330243Y2054750D02*X330993Y2055500D01*
+X330243Y2054750D02*Y2053250D01*
+X330993Y2052500D01*
+X333243Y2055500D02*Y2053250D01*
+X333993Y2052500D01*
+X330993D02*X332493D01*
+X333243Y2053250D01*
+X335795Y2055500D02*Y2053250D01*
+X336545Y2052500D01*
+X337295D01*
+X338045Y2053250D01*
+Y2055500D02*Y2053250D01*
+X338795Y2052500D01*
+X339545D01*
+X340295Y2053250D01*
+Y2055500D02*Y2053250D01*
+X342096Y...
[truncated message content] |
|
From: <gi...@gp...> - 2011-06-16 23:21:38
|
The branch, master has been updated
via e2001e8a7c4b17d3780b467426890350cb37a174 (commit)
from 6808e757496cca0347d92d72851d0c34ae31b532 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/hid/gerber/gerber.c | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
=================
Commit Messages
=================
commit e2001e8a7c4b17d3780b467426890350cb37a174
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Re-insert casts to unit conversion macros in gerber.c
:100644 100644 b41556e... 5e0b7b6... M src/hid/gerber/gerber.c
=========
Changes
=========
commit e2001e8a7c4b17d3780b467426890350cb37a174
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Re-insert casts to unit conversion macros in gerber.c
diff --git a/src/hid/gerber/gerber.c b/src/hid/gerber/gerber.c
index b41556e..5e0b7b6 100644
--- a/src/hid/gerber/gerber.c
+++ b/src/hid/gerber/gerber.c
@@ -71,14 +71,14 @@ static void gerber_fill_polygon (hidGC gc, int n_coords, int *x, int *y);
/*----------------------------------------------------------------------------*/
/* These are for films */
-#define gerberX(pcb, x) (x)
-#define gerberY(pcb, y) ((pcb)->MaxHeight - (y))
-#define gerberXOffset(pcb, x) (x)
-#define gerberYOffset(pcb, y) (-(y))
+#define gerberX(pcb, x) ((BDimension) (x))
+#define gerberY(pcb, y) ((BDimension) ((pcb)->MaxHeight - (y)))
+#define gerberXOffset(pcb, x) ((BDimension) (x))
+#define gerberYOffset(pcb, y) ((BDimension) (-(y)))
/* These are for drills (printed as mils but are really 1/10th mil) */
-#define gerberDrX(pcb, x) ((x) * 10)
-#define gerberDrY(pcb, y) (((pcb)->MaxHeight - (y)) * 10)
+#define gerberDrX(pcb, x) ((BDimension) (x) * 10)
+#define gerberDrY(pcb, y) ((BDimension) ((pcb)->MaxHeight - (y)) * 10)
/*----------------------------------------------------------------------------*/
/* Private data structures */
|
|
From: <gi...@gp...> - 2011-06-12 22:16:37
|
The branch, master has been updated
via 6808e757496cca0347d92d72851d0c34ae31b532 (commit)
via 896f228d8bb46f000b641bf6da4d9fa339495599 (commit)
via 9969eb13fe767fcfc32393e57b12eac27ec6fe62 (commit)
via 042524f3e450d1c77cbb53eb2e7280983afd9abf (commit)
via 9b57aa315bc8da5621029f80c6b912696ebf780b (commit)
from 6fb3667dc3f76b905572c0964f8349d70a600079 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/hid/batch/batch.c | 9 +++---
src/hid/bom/bom.c | 22 ++++-----------
src/hid/gcode/gcode.c | 45 ++++++++++----------------------
src/hid/gerber/gerber.c | 65 ++++++++++++++++++++++------------------------
src/pcb-printf.c | 12 +++-----
src/pcb-printf.h | 1 -
6 files changed, 60 insertions(+), 94 deletions(-)
=================
Commit Messages
=================
commit 6808e757496cca0347d92d72851d0c34ae31b532
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Convert gerber hid to use pcb-printf
:100644 100644 b9f6f7b... b41556e... M src/hid/gerber/gerber.c
commit 896f228d8bb46f000b641bf6da4d9fa339495599
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Convert gcode hid to use pcb-printf
:100644 100644 8c545ea... bae327d... M src/hid/gcode/gcode.c
commit 9969eb13fe767fcfc32393e57b12eac27ec6fe62
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Convert BOM hid to use pcb-printf
:100644 100644 3319491... 0870bb5... M src/hid/bom/bom.c
commit 042524f3e450d1c77cbb53eb2e7280983afd9abf
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Correct handling of %.*f in pcb-printf, remove from known issues
:100644 100644 9110a10... 31a1e32... M src/pcb-printf.c
:100644 100644 2c11b8f... 03aa978... M src/pcb-printf.h
commit 9b57aa315bc8da5621029f80c6b912696ebf780b
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Convert batch HID to use pcb-printf
:100644 100644 0208a1e... 962c594... M src/hid/batch/batch.c
=========
Changes
=========
commit 6808e757496cca0347d92d72851d0c34ae31b532
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Convert gerber hid to use pcb-printf
diff --git a/src/hid/gerber/gerber.c b/src/hid/gerber/gerber.c
index b9f6f7b..b41556e 100644
--- a/src/hid/gerber/gerber.c
+++ b/src/hid/gerber/gerber.c
@@ -26,6 +26,7 @@
#include "misc.h"
#include "error.h"
#include "draw.h"
+#include "pcb-printf.h"
#include "hid.h"
#include "../hidint.h"
@@ -70,16 +71,14 @@ static void gerber_fill_polygon (hidGC gc, int n_coords, int *x, int *y);
/*----------------------------------------------------------------------------*/
/* These are for films */
-#define gerberX(pcb, x) ((long) ((x)))
-#define gerberY(pcb, y) ((long) (((pcb)->MaxHeight - (y))))
-#define gerberXOffset(pcb, x) ((long) ((x)))
-#define gerberYOffset(pcb, y) ((long) (-(y)))
+#define gerberX(pcb, x) (x)
+#define gerberY(pcb, y) ((pcb)->MaxHeight - (y))
+#define gerberXOffset(pcb, x) (x)
+#define gerberYOffset(pcb, y) (-(y))
-/* These are for drills */
-#define gerberDrX(pcb, x) ((long) ((x)/10))
-#define gerberDrY(pcb, y) ((long) (((pcb)->MaxHeight - (y)))/10)
-#define gerberDrXOffset(pcb, x) ((long) ((x)/10))
-#define gerberDrYOffset(pcb, y) ((long) (-(y))/10)
+/* These are for drills (printed as mils but are really 1/10th mil) */
+#define gerberDrX(pcb, x) ((x) * 10)
+#define gerberDrY(pcb, y) (((pcb)->MaxHeight - (y)) * 10)
/*----------------------------------------------------------------------------*/
/* Private data structures */
@@ -229,17 +228,15 @@ fprintAperture (FILE *f, Aperture *aptr)
switch (aptr->shape)
{
case ROUND:
- fprintf (f, "%%ADD%dC,%.4f*%%\r\n", aptr->dCode,
- COORD_TO_INCH(aptr->width));
+ pcb_fprintf (f, "%%ADD%dC,%.4mi*%%\r\n", aptr->dCode, aptr->width);
break;
case SQUARE:
- fprintf (f, "%%ADD%dR,%.4fX%.4f*%%\r\n", aptr->dCode,
- COORD_TO_INCH(aptr->width), COORD_TO_INCH(aptr->width));
+ pcb_fprintf (f, "%%ADD%dR,%.4miX%.4mi*%%\r\n", aptr->dCode, aptr->width, aptr->width);
break;
case OCTAGON:
- fprintf (f, "%%AMOCT%d*5,0,8,0,0,%.4f,22.5*%%\r\n"
+ pcb_fprintf (f, "%%AMOCT%d*5,0,8,0,0,%.4mi,22.5*%%\r\n"
"%%ADD%dOCT%d*%%\r\n", aptr->dCode,
- COORD_TO_INCH(aptr->width) / COS_22_5_DEGREE, aptr->dCode,
+ (BDimension) ((double) aptr->width / COS_22_5_DEGREE), aptr->dCode,
aptr->dCode);
break;
#if 0
@@ -649,7 +646,7 @@ gerber_set_layer (const char *name, int group, int empty)
Aperture *ap = findAperture (curr_aptr_list, pending_drills[i].diam, ROUND);
fprintf (f, "T%02d\r\n", ap->dCode);
}
- fprintf (f, "X%06ldY%06ld\r\n",
+ pcb_fprintf (f, "X%06.0mmY%06.0mm\r\n",
gerberDrX (PCB, pending_drills[i].x),
gerberDrY (PCB, pending_drills[i].y));
}
@@ -717,7 +714,7 @@ gerber_set_layer (const char *name, int group, int empty)
always six-digit 0.1 mil resolution (i.e. 001100 = 0.11")*/
fprintf (f, "M48\r\n" "INCH\r\n");
for (search = aptr_list->data; search; search = search->next)
- fprintf (f, "T%02dC%.3f\r\n", search->dCode, COORD_TO_INCH(search->width));
+ pcb_fprintf (f, "T%02dC%.3mi\r\n", search->dCode, search->width);
fprintf (f, "%%\r\n");
/* FIXME */
return 1;
@@ -746,7 +743,7 @@ gerber_set_layer (const char *name, int group, int empty)
#endif
fprintf (f, "G04 Format: Gerber/RS-274X *\r\n");
- fprintf (f, "G04 PCB-Dimensions: %d %d *\r\n",
+ pcb_fprintf (f, "G04 PCB-Dimensions: %.0mc %.0mc *\r\n",
PCB->MaxWidth, PCB->MaxHeight);
fprintf (f, "G04 PCB-Coordinate-Origin: lower left *\r\n");
@@ -899,7 +896,7 @@ use_gc (hidGC gc, int radius)
{
Aperture *aptr = findAperture (curr_aptr_list, radius, ROUND);
if (aptr == NULL)
- fprintf (stderr, "error: aperture for radius %d type ROUND is null\n", radius);
+ pcb_fprintf (stderr, "error: aperture for radius %$mS type ROUND is null\n", radius);
else if (f && !is_drill)
fprintf (f, "G54D%d*", aptr->dCode);
linewidth = radius;
@@ -926,7 +923,7 @@ use_gc (hidGC gc, int radius)
}
aptr = findAperture (curr_aptr_list, linewidth, shape);
if (aptr == NULL)
- fprintf (stderr, "error: aperture for width %d type %s is null\n",
+ pcb_fprintf (stderr, "error: aperture for width %$mS type %s is null\n",
linewidth, shape == ROUND ? "ROUND" : "SQUARE");
if (f)
fprintf (f, "G54D%d*", aptr->dCode);
@@ -1001,13 +998,13 @@ gerber_draw_line (hidGC gc, int x1, int y1, int x2, int y2)
{
m = true;
lastX = x1;
- fprintf (f, "X%ld", gerberX (PCB, lastX));
+ pcb_fprintf (f, "X%.0mc", gerberX (PCB, lastX));
}
if (y1 != lastY)
{
m = true;
lastY = y1;
- fprintf (f, "Y%ld", gerberY (PCB, lastY));
+ pcb_fprintf (f, "Y%.0mc", gerberY (PCB, lastY));
}
if ((x1 == x2) && (y1 == y2))
fprintf (f, "D03*\r\n");
@@ -1018,12 +1015,12 @@ gerber_draw_line (hidGC gc, int x1, int y1, int x2, int y2)
if (x2 != lastX)
{
lastX = x2;
- fprintf (f, "X%ld", gerberX (PCB, lastX));
+ pcb_fprintf (f, "X%.0mc", gerberX (PCB, lastX));
}
if (y2 != lastY)
{
lastY = y2;
- fprintf (f, "Y%ld", gerberY (PCB, lastY));
+ pcb_fprintf (f, "Y%.0mc", gerberY (PCB, lastY));
}
fprintf (f, "D01*\r\n");
@@ -1092,18 +1089,18 @@ gerber_draw_arc (hidGC gc, int cx, int cy, int width, int height,
{
m = true;
lastX = arcStartX;
- fprintf (f, "X%ld", gerberX (PCB, lastX));
+ pcb_fprintf (f, "X%.0mc", gerberX (PCB, lastX));
}
if (arcStartY != lastY)
{
m = true;
lastY = arcStartY;
- fprintf (f, "Y%ld", gerberY (PCB, lastY));
+ pcb_fprintf (f, "Y%.0mc", gerberY (PCB, lastY));
}
if (m)
fprintf (f, "D02*");
- fprintf (f,
- "G75*G0%1dX%ldY%ldI%ldJ%ldD01*G01*\r\n",
+ pcb_fprintf (f,
+ "G75*G0%1dX%.0mcY%.0mcI%.0mcJ%.0mcD01*G01*\r\n",
(delta_angle < 0) ? 2 : 3,
gerberX (PCB, arcStopX), gerberY (PCB, arcStopY),
gerberXOffset (PCB, cx - arcStartX),
@@ -1142,12 +1139,12 @@ gerber_fill_circle (hidGC gc, int cx, int cy, int radius)
if (cx != lastX)
{
lastX = cx;
- fprintf (f, "X%ld", gerberX (PCB, lastX));
+ pcb_fprintf (f, "X%.0mc", gerberX (PCB, lastX));
}
if (cy != lastY)
{
lastY = cy;
- fprintf (f, "Y%ld", gerberY (PCB, lastY));
+ pcb_fprintf (f, "Y%.0mc", gerberY (PCB, lastY));
}
fprintf (f, "D03*\r\n");
}
@@ -1173,13 +1170,13 @@ gerber_fill_polygon (hidGC gc, int n_coords, int *x, int *y)
{
m = true;
lastX = x[i];
- fprintf (f, "X%ld", gerberX (PCB, lastX));
+ pcb_fprintf (f, "X%.0mc", gerberX (PCB, lastX));
}
if (y[i] != lastY)
{
m = true;
lastY = y[i];
- fprintf (f, "Y%ld", gerberY (PCB, lastY));
+ pcb_fprintf (f, "Y%.0mc", gerberY (PCB, lastY));
}
if (firstTime)
{
@@ -1197,13 +1194,13 @@ gerber_fill_polygon (hidGC gc, int n_coords, int *x, int *y)
{
m = true;
lastX = startX;
- fprintf (f, "X%ld", gerberX (PCB, startX));
+ pcb_fprintf (f, "X%.0mc", gerberX (PCB, startX));
}
if (startY != lastY)
{
m = true;
lastY = startY;
- fprintf (f, "Y%ld", gerberY (PCB, lastY));
+ pcb_fprintf (f, "Y%.0mc", gerberY (PCB, lastY));
}
if (m)
fprintf (f, "D01*\r\n");
commit 896f228d8bb46f000b641bf6da4d9fa339495599
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Convert gcode hid to use pcb-printf
diff --git a/src/hid/gcode/gcode.c b/src/hid/gcode/gcode.c
index 8c545ea..bae327d 100644
--- a/src/hid/gcode/gcode.c
+++ b/src/hid/gcode/gcode.c
@@ -61,6 +61,7 @@
#include "potracelib.h"
#include "trace.h"
#include "decompose.h"
+#include "pcb-printf.h"
#include "hid/common/hidinit.h"
@@ -69,7 +70,6 @@
#endif
#define CRASH fprintf(stderr, "HID error: pcb called unimplemented GCODE function %s.\n", __FUNCTION__); abort()
-#define pcb_unit (INCH_TO_COORD(1)) /* pcb internal units per inch */
struct color_struct
{
/* the descriptor used by the gd library */
@@ -184,27 +184,15 @@ REGISTER_ATTRIBUTES (gcode_attribute_list)
/* *** Utility funcions **************************************************** */
/* convert from default PCB units to gcode units */
- static int pcb_to_gcode (int pcb)
+static int pcb_to_gcode (int pcb)
{
- int gcode;
-
- gcode = (pcb * gcode_dpi) / pcb_unit;
-
- return gcode;
+ return round(COORD_TO_INCH(pcb) * gcode_dpi);
}
static char *
gcode_get_png_name (const char *basename, const char *suffix)
{
- char *buf;
- int len;
-
- len = strlen (basename) + strlen (suffix) + 6;
- buf = (char *)malloc (sizeof (*buf) * len);
-
- sprintf (buf, "%s.%s.png", basename, suffix);
-
- return buf;
+ return g_strdup_printf ("%s.%s.png", basename, suffix);
}
/* Sorts drills in order of distance from the origin */
@@ -385,7 +373,7 @@ gcode_do_export (HID_Attr_Val * options)
int save_ons[MAX_LAYER + 2];
int i, idx;
time_t t;
- double scale = 0, d = 0, Bx, By;
+ double scale = 0, d = 0;
int r, c, v, p, metric;
char *filename;
path_t *plist = NULL;
@@ -404,8 +392,6 @@ gcode_do_export (HID_Attr_Val * options)
},
};
- Bx = PCB->MaxWidth / pcb_unit;
- By = PCB->MaxHeight / pcb_unit;
if (!options)
{
gcode_get_export_options (0);
@@ -447,9 +433,9 @@ gcode_do_export (HID_Attr_Val * options)
gcode_cutdepth = options[HA_cutdepth].real_value * scale;
gcode_drilldepth = options[HA_drilldepth].real_value * scale;
gcode_safeZ = options[HA_safeZ].real_value * scale;
- gcode_toolradius = options[HA_toolradius].real_value * scale * pcb_unit; /* in PCB units */
- if (metric)
- gcode_toolradius *= 1 / 25.4;
+ gcode_toolradius = metric
+ ? MM_TO_COORD(options[HA_toolradius].real_value * scale)
+ : INCH_TO_COORD(options[HA_toolradius].real_value * scale);
gcode_choose_groups ();
for (i = 0; i < MAX_LAYER; i++)
@@ -523,10 +509,9 @@ gcode_do_export (HID_Attr_Val * options)
fprintf (gcode_f2, "(%d dpi)\n", gcode_dpi);
fprintf (gcode_f2, "(Unit: %s)\n", metric ? "mm" : "inch");
if (metric)
- fprintf (gcode_f2, "(Board size: %.2fx%.2f mm)\n", Bx * 25.4,
- By * 25.4);
+ pcb_fprintf (gcode_f2, "(Board size: %.2mmx%.2mm mm)", PCB->MaxWidth, PCB->MaxHeight);
else
- fprintf (gcode_f2, "(Board size: %.2fx%.2f inches)\n", Bx, By);
+ pcb_fprintf (gcode_f2, "(Board size: %.2mix%.2mi inches)", PCB->MaxWidth, PCB->MaxHeight);
fprintf (gcode_f2, "#100=%f (safe Z)\n", gcode_safeZ);
fprintf (gcode_f2, "#101=%f (cutting depth)\n", gcode_cutdepth);
fprintf (gcode_f2, "(---------------------------------)\n");
@@ -577,11 +562,9 @@ gcode_do_export (HID_Attr_Val * options)
fprintf (gcode_f2, "( %s )\n", filename);
fprintf (gcode_f2, "(Unit: %s)\n", metric ? "mm" : "inch");
if (metric)
- fprintf (gcode_f2, "(Board size: %.2fx%.2f mm)\n", Bx * 25.4,
- By * 25.4);
+ pcb_fprintf (gcode_f2, "(Board size: %.2mmx%.2mm mm)", PCB->MaxWidth, PCB->MaxHeight);
else
- fprintf (gcode_f2, "(Board size: %.2fx%.2f inches)\n", Bx,
- By);
+ pcb_fprintf (gcode_f2, "(Board size: %.2mix%.2mi inches)", PCB->MaxWidth, PCB->MaxHeight);
fprintf (gcode_f2, "#100=%f (safe Z)\n", gcode_safeZ);
fprintf (gcode_f2, "#101=%f (drill depth)\n",
gcode_drilldepth);
@@ -978,8 +961,8 @@ gcode_fill_circle (hidGC gc, int cx, int cy, int radius)
sizeof (struct drill_struct));
nmax_drill += 100;
}
- drill[n_drill].x = (PCB->MaxWidth - cx) / pcb_unit; /* convert to inch, flip: will drill from bottom side */
- drill[n_drill].y = (PCB->MaxHeight - cy) / pcb_unit; /* PCB reverses y axis */
+ drill[n_drill].x = COORD_TO_INCH(PCB->MaxWidth - cx); /* convert to inch, flip: will drill from bottom side */
+ drill[n_drill].y = COORD_TO_INCH(PCB->MaxHeight - cy); /* PCB reverses y axis */
n_drill++;
/* printf("Circle %d %d\n",cx,cy); */
}
commit 9969eb13fe767fcfc32393e57b12eac27ec6fe62
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Convert BOM hid to use pcb-printf
diff --git a/src/hid/bom/bom.c b/src/hid/bom/bom.c
index 3319491..0870bb5 100644
--- a/src/hid/bom/bom.c
+++ b/src/hid/bom/bom.c
@@ -14,6 +14,7 @@
#include "data.h"
#include "error.h"
#include "misc.h"
+#include "pcb-printf.h"
#include "hid.h"
#include "hid/common/hidnogui.h"
@@ -274,7 +275,8 @@ static int
PrintBOM (void)
{
char utcTime[64];
- double x, y, theta = 0.0, user_x, user_y;
+ BDimension x, y;
+ double theta = 0.0;
double sumx, sumy;
double pin1x = 0.0, pin1y = 0.0, pin1angle = 0.0;
double pin2x = 0.0, pin2y = 0.0, pin2angle;
@@ -452,22 +454,10 @@ PrintBOM (void)
value = CleanBOMString ((char *)UNKNOWN (VALUE_NAME (element)));
y = PCB->MaxHeight - y;
- if (xy_dim_type) {
- /* dimensions in mm */
- user_x = 0.000254 * x;
- user_y = 0.000254 * y;
- } else {
- /* dimensions in mils */
- user_x = 0.01 * x;
- user_y = 0.01 * y;
- }
- fprintf (fp, "%s,\"%s\",\"%s\",%.2f,%.2f,%g,%s\n",
+ pcb_fprintf (fp, "%s,\"%s\",\"%s\",%.2m*,%.2m*,%g,%s\n",
name, descr, value,
-#if 0
- (double) element->MarkX, (double) element->MarkY,
-#else
- user_x, user_y,
-#endif
+ (xy_dim_type ? "mm" : "mil"), x,
+ (xy_dim_type ? "mm" : "mil"), y,
theta, FRONT (element) == 1 ? "top" : "bottom");
free (name);
free (descr);
commit 042524f3e450d1c77cbb53eb2e7280983afd9abf
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Correct handling of %.*f in pcb-printf, remove from known issues
diff --git a/src/pcb-printf.c b/src/pcb-printf.c
index 9110a10..31a1e32 100644
--- a/src/pcb-printf.c
+++ b/src/pcb-printf.c
@@ -229,7 +229,6 @@ static gchar *pcb_vprintf(const char *fmt, va_list args)
while(*fmt)
{
enum e_suffix suffix = NO_SUFFIX;
- int multiplier = 0;
if(*fmt == '%')
{
@@ -247,10 +246,6 @@ static gchar *pcb_vprintf(const char *fmt, va_list args)
|| *fmt == 'h' || *fmt == '-')
g_string_append_c (spec, *fmt++);
/* Get our sub-specifiers */
- if(*fmt == ':')
- {
- multiplier = strtol(fmt + 1, (char **)&fmt, 0);
- }
if(*fmt == '$')
{
suffix = SUFFIX;
@@ -279,9 +274,12 @@ static gchar *pcb_vprintf(const char *fmt, va_list args)
case 'e': case 'E': case 'f':
case 'g': case 'G':
if (strchr (spec->str, '*'))
- unit_str = g_strdup_printf (spec->str, va_arg(args, double));
+ {
+ int prec = va_arg(args, int);
+ unit_str = g_strdup_printf (spec->str, va_arg(args, double), prec);
+ }
else
- unit_str = g_strdup_printf (spec->str, va_arg(args, double), va_arg(args, int));
+ unit_str = g_strdup_printf (spec->str, va_arg(args, double));
break;
case 'c':
if(spec->str[1] == 'l' && sizeof(int) <= sizeof(wchar_t))
diff --git a/src/pcb-printf.h b/src/pcb-printf.h
index 2c11b8f..03aa978 100644
--- a/src/pcb-printf.h
+++ b/src/pcb-printf.h
@@ -56,7 +56,6 @@
*
* KNOWN ISSUES:
* No support for %zu size_t printf spec
- * No support for .* subspecifier for pcb specs
*/
#ifndef __PCB_PRINTF_INCLUDED__
commit 9b57aa315bc8da5621029f80c6b912696ebf780b
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Convert batch HID to use pcb-printf
diff --git a/src/hid/batch/batch.c b/src/hid/batch/batch.c
index 0208a1e..962c594 100644
--- a/src/hid/batch/batch.c
+++ b/src/hid/batch/batch.c
@@ -16,6 +16,7 @@
#include "misc.h"
#include "hid.h"
#include "../hidint.h"
+#include "pcb-printf.h"
#include "hid/common/draw_helpers.h"
#include "hid/common/hidnogui.h"
@@ -86,11 +87,9 @@ info (int argc, char **argv, int x, int y)
return 0;
}
printf("Filename: %s\n", PCB->Filename);
- printf("Size: %g x %g mils, %g x %g mm\n",
- COORD_TO_MIL(PCB->MaxWidth),
- COORD_TO_MIL(PCB->MaxHeight),
- COORD_TO_MM (PCB->MaxWidth),
- COORD_TO_MM (PCB->MaxHeight));
+ pcb_sprintf("Size: %ml x %ml mils, %mm x %mm mm\n",
+ PCB->MaxWidth, PCB->MaxHeight,
+ PCB->MaxWidth, PCB->MaxHeight);
cg = GetLayerGroupNumberByNumber (component_silk_layer);
sg = GetLayerGroupNumberByNumber (solder_silk_layer);
for (i=0; i<MAX_LAYER; i++)
|
|
From: <gi...@gp...> - 2011-06-11 17:35:33
|
The branch, master has been updated
via 6fb3667dc3f76b905572c0964f8349d70a600079 (commit)
from fce9e501a4bbfbed10c92b395296440169575955 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/Makefile.am | 2 +
src/pcb-printf.c | 414 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/pcb-printf.h | 93 ++++++++++++
3 files changed, 509 insertions(+), 0 deletions(-)
create mode 100644 src/pcb-printf.c
create mode 100644 src/pcb-printf.h
=================
Commit Messages
=================
commit 6fb3667dc3f76b905572c0964f8349d70a600079
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Add pcb-printf.c to allow custom specifiers for unit output
From the header:
/* This file defines a wrapper around sprintf, that
* defines new specifiers that take pcb BDimension
* objects as input.
*
* The new specifiers are:
* %mm output a measure in mm
* %mM output a measure in scaled (mm/um) metric
* %ml output a measure in mil
* %mL output a measure in scaled (mil/in) imperial
* %ms output a measure in most natural mm/mil units
* %mS output a measure in most natural scaled units
* %md output a pair of measures in most natural mm/mil units
* %mD output a pair of measures in most natural scaled units
* %m3 output 3 measures in most natural scaled units
* ...
* %m9 output 9 measures in most natural scaled units
* %m* output a measure with unit given as an additional
* const char* parameter
* %mr output a measure in a unit readable by parse_l.l
* (this will always append a unit suffix)
*
* These accept the usual printf modifiers for %f,
* as well as the additional modifier $ which is
* used to output a unit suffix after the measure.
*
* KNOWN ISSUES:
* No support for %zu size_t printf spec
* No support for .* subspecifier for pcb specs
*/
:100644 100644 18fe5c1... 7efb2d7... M src/Makefile.am
:000000 100644 0000000... 9110a10... A src/pcb-printf.c
:000000 100644 0000000... 2c11b8f... A src/pcb-printf.h
=========
Changes
=========
commit 6fb3667dc3f76b905572c0964f8349d70a600079
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Add pcb-printf.c to allow custom specifiers for unit output
From the header:
/* This file defines a wrapper around sprintf, that
* defines new specifiers that take pcb BDimension
* objects as input.
*
* The new specifiers are:
* %mm output a measure in mm
* %mM output a measure in scaled (mm/um) metric
* %ml output a measure in mil
* %mL output a measure in scaled (mil/in) imperial
* %ms output a measure in most natural mm/mil units
* %mS output a measure in most natural scaled units
* %md output a pair of measures in most natural mm/mil units
* %mD output a pair of measures in most natural scaled units
* %m3 output 3 measures in most natural scaled units
* ...
* %m9 output 9 measures in most natural scaled units
* %m* output a measure with unit given as an additional
* const char* parameter
* %mr output a measure in a unit readable by parse_l.l
* (this will always append a unit suffix)
*
* These accept the usual printf modifiers for %f,
* as well as the additional modifier $ which is
* used to output a unit suffix after the measure.
*
* KNOWN ISSUES:
* No support for %zu size_t printf spec
* No support for .* subspecifier for pcb specs
*/
diff --git a/src/Makefile.am b/src/Makefile.am
index 18fe5c1..7efb2d7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -106,6 +106,8 @@ PCB_SRCS = \
parse_l.l \
parse_y.h \
parse_y.y \
+ pcb-printf.c \
+ pcb-printf.h \
polygon.c \
polygon.h \
polygon1.c \
diff --git a/src/pcb-printf.c b/src/pcb-printf.c
new file mode 100644
index 0000000..9110a10
--- /dev/null
+++ b/src/pcb-printf.c
@@ -0,0 +1,414 @@
+/*
+ * COPYRIGHT
+ *
+ * PCB, interactive printed circuit board design
+ * Copyright (C) 2011 Andrew Poelstra
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact addresses for paper mail and Email:
+ * Andrew Poelstra, 16966 60A Ave, V3S 8X5 Surrey, BC, Canada
+ * as...@sf...
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "global.h"
+
+#include "pcb-printf.h"
+
+enum e_family { METRIC, IMPERIAL };
+enum e_suffix { NO_SUFFIX, SUFFIX, FILE_MODE };
+
+struct unit {
+ const char *suffix;
+ char printf_code;
+ double scale_factor;
+ enum e_family family;
+ enum e_allow allow;
+ int default_prec;
+};
+
+/* These should be kept in order of smallest scale_factor
+ * to largest -- the code uses this ordering when finding
+ * the best scale to use for a group of measures */
+static struct unit Units[] = {
+ { "km", 'k', 0.000001, METRIC, ALLOW_KM, 5 },
+ { "m", 'f', 0.001, METRIC, ALLOW_M, 5 },
+ { "cm", 'e', 0.1, METRIC, ALLOW_CM, 5 },
+ { "mm", 'm', 1, METRIC, ALLOW_MM, 4 },
+ { "um", 'u', 1000, METRIC, ALLOW_UM, 2 },
+ { "nm", 'n', 1000000, METRIC, ALLOW_NM, 0 },
+
+ { "in", 'i', 0.001, IMPERIAL, ALLOW_IN, 5 },
+ { "mil", 'l', 1, IMPERIAL, ALLOW_MIL, 2 },
+ { "cmil", 'c', 100, IMPERIAL, ALLOW_CMIL, 0 }
+};
+#define N_UNITS ((int) (sizeof Units / sizeof Units[0]))
+
+static int min_sig_figs(double d)
+{
+ char buf[50];
+ int rv;
+
+ if(d == 0) return 0;
+
+ /* Normalize to x.xxxx... form */
+ if(d < 0) d *= -1;
+ while(d >= 10) d /= 10;
+ while(d < 1) d *= 10;
+
+ rv = sprintf(buf, "%g", d);
+ return rv;
+}
+
+/* Converts a (group of) measurement(s) to a comma-deliminated
+ * string, with appropriate units. If more than one coord is
+ * given, the list is enclosed in parens to make the scope of
+ * the unit suffix clear. */
+static gchar *CoordsToString(BDimension coord[], int n_coords, const char *printf_spec, enum e_allow allow, enum e_suffix suffix_type)
+{
+ GString *buff;
+ gchar *printf_buff;
+ gchar filemode_buff[G_ASCII_DTOSTR_BUF_SIZE];
+ enum e_family family;
+ double *value;
+ const char *suffix;
+ int i, n;
+
+ value = malloc (n_coords * sizeof *value);
+ buff = g_string_new ("");
+
+ /* Sanity checks */
+ if (buff == NULL || value == NULL)
+ return NULL;
+ if (allow == 0)
+ allow = ALLOW_ALL;
+ if (printf_spec == NULL)
+ printf_spec = "";
+
+ /* Check our freedom in choosing units */
+ if ((allow & ALLOW_IMPERIAL) == 0)
+ family = METRIC;
+ else if ((allow & ALLOW_METRIC) == 0)
+ family = IMPERIAL;
+ else
+ {
+ int met_votes = 0,
+ imp_votes = 0;
+
+ for (i = 0; i < n_coords; ++i)
+ if(min_sig_figs(COORD_TO_MIL(coord[i])) < min_sig_figs(COORD_TO_MM(coord[i])))
+ ++imp_votes;
+ else
+ ++met_votes;
+
+ if (imp_votes > met_votes)
+ family = IMPERIAL;
+ else
+ family = METRIC;
+ }
+
+ /* Set base unit */
+ for (i = 0; i < n_coords; ++i)
+ {
+ switch (family)
+ {
+ case METRIC: value[i] = COORD_TO_MM (coord[i]); break;
+ case IMPERIAL: value[i] = COORD_TO_MIL (coord[i]); break;
+ }
+ }
+
+ /* Determine scale factor -- find smallest unit that brings
+ * the whole group above unity */
+ for (n = 0; n < N_UNITS; ++n)
+ {
+ if ((Units[n].allow & allow) != 0 && (Units[n].family == family))
+ {
+ int n_above_one = 0;
+
+ for (i = 0; i < n_coords; ++i)
+ if (fabs(value[i] * Units[n].scale_factor) > 1)
+ ++n_above_one;
+ if (n_above_one == n_coords)
+ break;
+ }
+ }
+ /* If nothing worked, wind back to the smallest allowable unit */
+ if (n == N_UNITS)
+ {
+ do {
+ --n;
+ } while ((Units[n].allow & allow) == 0 || Units[n].family != family);
+ }
+
+ /* Apply scale factor */
+ suffix = Units[n].suffix;
+ for (i = 0; i < n_coords; ++i)
+ value[i] = value[i] * Units[n].scale_factor;
+
+ /* Create sprintf specifier, using default_prec no preciscion is given */
+ i = 0;
+ while (printf_spec[i] == '%' || isdigit(printf_spec[i]) ||
+ printf_spec[i] == '-' || printf_spec[i] == '+' ||
+ printf_spec[i] == '#' || printf_spec[i] == '0')
+ ++i;
+ if (printf_spec[i] == '.')
+ printf_buff = g_strdup_printf (", %sf", printf_spec);
+ else
+ printf_buff = g_strdup_printf (", %s.%df", printf_spec, Units[n].default_prec);
+
+ /* Actually sprintf the values in place
+ * (+ 2 skips the ", " for first value) */
+ if (n_coords > 1)
+ g_string_append_c (buff, '(');
+ if (suffix_type == FILE_MODE)
+ {
+ g_ascii_formatd (filemode_buff, sizeof filemode_buff, printf_buff + 2, value[0]);
+ g_string_append_printf (buff, "%s", filemode_buff);
+ }
+ else
+ g_string_append_printf (buff, printf_buff + 2, value[0]);
+ for (i = 1; i < n_coords; ++i)
+ {
+ if (suffix_type == FILE_MODE)
+ {
+ g_ascii_formatd (filemode_buff, sizeof filemode_buff, printf_buff, value[i]);
+ g_string_append_printf (buff, "%s", filemode_buff);
+ }
+ else
+ g_string_append_printf (buff, printf_buff, value[i]);
+ }
+ if (n_coords > 1)
+ g_string_append_c (buff, ')');
+ /* Append suffix */
+ if (value[0] != 0 || n_coords > 1)
+ {
+ switch (suffix_type)
+ {
+ case NO_SUFFIX:
+ break;
+ case SUFFIX:
+ g_string_append_printf (buff, " %s", suffix);
+ break;
+ case FILE_MODE:
+ g_string_append_printf (buff, "%s", suffix);
+ break;
+ }
+ }
+
+ g_free (printf_buff);
+ free (value);
+ /* Return just the gchar* part of our string */
+ return g_string_free (buff, FALSE);
+}
+
+static gchar *pcb_vprintf(const char *fmt, va_list args)
+{
+ GString *string = g_string_new ("");
+ GString *spec = g_string_new ("");
+
+ if (string == NULL || spec == NULL)
+ return NULL;
+
+ while(*fmt)
+ {
+ enum e_suffix suffix = NO_SUFFIX;
+ int multiplier = 0;
+
+ if(*fmt == '%')
+ {
+ gchar *unit_str = NULL;
+ const char *ext_unit = "";
+ BDimension value[10];
+ int count, i;
+
+ g_string_assign (spec, "");
+
+ /* Get printf sub-specifiers */
+ g_string_append_c (spec, *fmt++);
+ while(isdigit(*fmt) || *fmt == '.' || *fmt == ' ' || *fmt == '*'
+ || *fmt == '#' || *fmt == 'l' || *fmt == 'L'
+ || *fmt == 'h' || *fmt == '-')
+ g_string_append_c (spec, *fmt++);
+ /* Get our sub-specifiers */
+ if(*fmt == ':')
+ {
+ multiplier = strtol(fmt + 1, (char **)&fmt, 0);
+ }
+ if(*fmt == '$')
+ {
+ suffix = SUFFIX;
+ fmt++;
+ }
+ /* Tack full specifier onto specifier */
+ if (*fmt != 'm')
+ g_string_append_c (spec, *fmt);
+ switch(*fmt)
+ {
+ /* Printf specs */
+ case 'o': case 'i': case 'd':
+ case 'u': case 'x': case 'X':
+ if(spec->str[1] == 'l')
+ {
+ if(spec->str[2] == 'l')
+ unit_str = g_strdup_printf (spec->str, va_arg(args, long long));
+ else
+ unit_str = g_strdup_printf (spec->str, va_arg(args, long));
+ }
+ else
+ {
+ unit_str = g_strdup_printf (spec->str, va_arg(args, int));
+ }
+ break;
+ case 'e': case 'E': case 'f':
+ case 'g': case 'G':
+ if (strchr (spec->str, '*'))
+ unit_str = g_strdup_printf (spec->str, va_arg(args, double));
+ else
+ unit_str = g_strdup_printf (spec->str, va_arg(args, double), va_arg(args, int));
+ break;
+ case 'c':
+ if(spec->str[1] == 'l' && sizeof(int) <= sizeof(wchar_t))
+ unit_str = g_strdup_printf (spec->str, va_arg(args, wchar_t));
+ else
+ unit_str = g_strdup_printf (spec->str, va_arg(args, int));
+ break;
+ case 's':
+ if(spec->str[0] == 'l')
+ unit_str = g_strdup_printf (spec->str, va_arg(args, wchar_t *));
+ else
+ unit_str = g_strdup_printf (spec->str, va_arg(args, char *));
+ break;
+ case 'n':
+ /* Depending on gcc settings, this will probably break with
+ * some silly "can't put %n in writeable data space" message */
+ unit_str = g_strdup_printf (spec->str, va_arg(args, int *));
+ break;
+ case 'p':
+ unit_str = g_strdup_printf (spec->str, va_arg(args, void *));
+ break;
+ case '%':
+ g_string_append_c (string, '%');
+ break;
+ /* Our specs */
+ case 'm':
+ ++fmt;
+ if (*fmt == '*')
+ ext_unit = va_arg(args, const char *);
+ value[0] = va_arg(args, BDimension);
+ count = 1;
+ switch(*fmt)
+ {
+ case 's': unit_str = CoordsToString(value, 1, spec->str, ALLOW_MM | ALLOW_MIL, suffix); break;
+ case 'S': unit_str = CoordsToString(value, 1, spec->str, ALLOW_ALL, suffix); break;
+ case 'M': unit_str = CoordsToString(value, 1, spec->str, ALLOW_METRIC, suffix); break;
+ case 'L': unit_str = CoordsToString(value, 1, spec->str, ALLOW_IMPERIAL, suffix); break;
+ case 'r': unit_str = CoordsToString(value, 1, spec->str, ALLOW_READABLE, FILE_MODE); break;
+ /* All these fallthroughs are deliberate */
+ case '9': value[count++] = va_arg(args, BDimension);
+ case '8': value[count++] = va_arg(args, BDimension);
+ case '7': value[count++] = va_arg(args, BDimension);
+ case '6': value[count++] = va_arg(args, BDimension);
+ case '5': value[count++] = va_arg(args, BDimension);
+ case '4': value[count++] = va_arg(args, BDimension);
+ case '3': value[count++] = va_arg(args, BDimension);
+ case '2':
+ case 'D':
+ value[count++] = va_arg(args, BDimension);
+ unit_str = CoordsToString(value, count, spec->str, ALLOW_ALL, suffix);
+ break;
+ case 'd':
+ value[1] = va_arg(args, BDimension);
+ unit_str = CoordsToString(value, 2, spec->str, ALLOW_MM | ALLOW_MIL, suffix);
+ break;
+ case '*':
+ for (i = 0; i < N_UNITS; ++i)
+ if (strcmp (ext_unit, Units[i].suffix) == 0)
+ unit_str = CoordsToString(value, 1, spec->str, Units[i].allow, suffix);
+ if (unit_str == NULL)
+ unit_str = CoordsToString(value, 1, spec->str, ALLOW_ALL, suffix);
+ break;
+ default:
+ for (i = 0; i < N_UNITS; ++i)
+ if (*fmt == Units[i].printf_code)
+ unit_str = CoordsToString(value, 1, spec->str, Units[i].allow, suffix);
+ if (unit_str == NULL)
+ unit_str = CoordsToString(value, 1, spec->str, ALLOW_ALL, suffix);
+ break;
+ }
+ break;
+ }
+ if (unit_str != NULL)
+ {
+ g_string_append (string, unit_str);
+ g_free (unit_str);
+ }
+ }
+ else
+ g_string_append_c (string, *fmt);
+ ++fmt;
+ }
+ g_string_free (spec, TRUE);
+ /* Return just the gchar* part of our string */
+ return g_string_free (string, FALSE);
+}
+
+
+int pcb_sprintf(char *string, const char *fmt, ...)
+{
+ gchar *tmp;
+
+ va_list args;
+ va_start(args, fmt);
+
+ tmp = pcb_vprintf (fmt, args);
+ strcpy (string, tmp);
+ g_free (tmp);
+
+ va_end(args);
+ return strlen (string);
+}
+
+int pcb_fprintf(FILE *fh, const char *fmt, ...)
+{
+ int rv;
+ gchar *tmp;
+
+ va_list args;
+ va_start(args, fmt);
+
+ tmp = pcb_vprintf (fmt, args);
+ rv = fprintf (fh, "%s", tmp);
+ g_free (tmp);
+
+ va_end(args);
+ return rv;
+}
+
+char *pcb_g_strdup_printf(const char *fmt, ...)
+{
+ gchar *tmp;
+
+ va_list args;
+ va_start(args, fmt);
+ tmp = pcb_vprintf (fmt, args);
+ va_end(args);
+ return tmp;
+}
+
diff --git a/src/pcb-printf.h b/src/pcb-printf.h
new file mode 100644
index 0000000..2c11b8f
--- /dev/null
+++ b/src/pcb-printf.h
@@ -0,0 +1,93 @@
+/*
+ * COPYRIGHT
+ *
+ * PCB, interactive printed circuit board design
+ * Copyright (C) 2011 Andrew Poelstra
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact addresses for paper mail and Email:
+ * Andrew Poelstra, 16966 60A Ave, V3S 8X5 Surrey, BC, Canada
+ * as...@sf...
+ *
+ */
+
+/* This file defines a wrapper around sprintf, that
+ * defines new specifiers that take pcb BDimension
+ * objects as input.
+ *
+ * There is a fair bit of nasty (repetitious) code in
+ * here, but I feel the gain in clarity for output
+ * code elsewhere in the project will make it worth
+ * it.
+ *
+ * The new specifiers are:
+ * %mm output a measure in mm
+ * %mM output a measure in scaled (mm/um) metric
+ * %ml output a measure in mil
+ * %mL output a measure in scaled (mil/in) imperial
+ * %ms output a measure in most natural mm/mil units
+ * %mS output a measure in most natural scaled units
+ * %md output a pair of measures in most natural mm/mil units
+ * %mD output a pair of measures in most natural scaled units
+ * %m3 output 3 measures in most natural scaled units
+ * ...
+ * %m9 output 9 measures in most natural scaled units
+ * %m* output a measure with unit given as an additional
+ * const char* parameter
+ * %mr output a measure in a unit readable by parse_l.l
+ * (this will always append a unit suffix)
+ *
+ * These accept the usual printf modifiers for %f,
+ * as well as the additional modifier $ which is
+ * used to output a unit suffix after the measure.
+ *
+ * KNOWN ISSUES:
+ * No support for %zu size_t printf spec
+ * No support for .* subspecifier for pcb specs
+ */
+
+#ifndef __PCB_PRINTF_INCLUDED__
+#define __PCB_PRINTF_INCLUDED__
+
+enum e_allow {
+ ALLOW_NM = 1,
+ ALLOW_UM = 2,
+ ALLOW_MM = 4,
+ ALLOW_CM = 8,
+ ALLOW_M = 16,
+ ALLOW_KM = 32,
+
+ ALLOW_CMIL = 1024,
+ ALLOW_MIL = 2048,
+ ALLOW_IN = 4096,
+
+ ALLOW_METRIC = ALLOW_NM | ALLOW_UM | ALLOW_MM |
+ ALLOW_CM | ALLOW_M | ALLOW_KM,
+ ALLOW_IMPERIAL = ALLOW_CMIL | ALLOW_MIL | ALLOW_IN,
+ /* This is all units allowed in parse_l.l */
+ ALLOW_READABLE = ALLOW_NM | ALLOW_UM | ALLOW_MM |
+ ALLOW_M | ALLOW_KM | ALLOW_CMIL |
+ ALLOW_MIL | ALLOW_IN,
+
+ ALLOW_ALL = ~0
+};
+
+int pcb_fprintf(FILE *f, const char *fmt, ...);
+int pcb_sprintf(char *string, const char *fmt, ...);
+char *pcb_g_strdup_printf(const char *fmt, ...);
+
+#endif
+
|
|
From: <gi...@gp...> - 2011-06-09 18:57:18
|
The branch, master has been updated
via fce9e501a4bbfbed10c92b395296440169575955 (commit)
from d30d31425fa318390e4632d5063e6bb655b01793 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
globalconst.h | 4 +-
src/buffer.c | 2 +-
src/global.h | 7 +
src/parse_y.y | 440 +++++++++++++++++++++++++++++++--------------------------
4 files changed, 252 insertions(+), 201 deletions(-)
=================
Commit Messages
=================
commit fce9e501a4bbfbed10c92b395296440169575955
Author: DJ Delorie <dj...@de...>
Commit: DJ Delorie <dj...@de...>
Fix shift/reduce conflicts
Closes-bug: lp-794743
I moved the interpretation of what "measurement" means even further up
the heirarchy, by storing the original integer part as well as the units
in a structure, and applying the new/old/unitless meanings where they're
used. This way, there's no conflicts between a number which is a
measurement, and a number which is a flag or mask, for the old formats
that differ only in the number of parameters.
I also cleaned up the parser rules for "zero or more" type lists,
to remove most of the remaining conflicts. There's still one at the
toplevel because we try to parse different types of files with the same
parser.
Lastly, the symbol rules were combined into a "symbol head" rule with a
common "symbol body" rule.
As a side effect, we can now reliably use units on old-style formats
again, since the *100 scale factor is only applied if the units are not
specified.
:100755 100755 428135d... 605d909... M globalconst.h
:100644 100644 2e63af5... 6ff6132... M src/buffer.c
:100644 100644 498e3f8... daa82a9... M src/global.h
:100644 100644 05f0a49... 8eaba94... M src/parse_y.y
=========
Changes
=========
commit fce9e501a4bbfbed10c92b395296440169575955
Author: DJ Delorie <dj...@de...>
Commit: DJ Delorie <dj...@de...>
Fix shift/reduce conflicts
Closes-bug: lp-794743
I moved the interpretation of what "measurement" means even further up
the heirarchy, by storing the original integer part as well as the units
in a structure, and applying the new/old/unitless meanings where they're
used. This way, there's no conflicts between a number which is a
measurement, and a number which is a flag or mask, for the old formats
that differ only in the number of parameters.
I also cleaned up the parser rules for "zero or more" type lists,
to remove most of the remaining conflicts. There's still one at the
toplevel because we try to parse different types of files with the same
parser.
Lastly, the symbol rules were combined into a "symbol head" rule with a
common "symbol body" rule.
As a side effect, we can now reliably use units on old-style formats
again, since the *100 scale factor is only applied if the units are not
specified.
diff --git a/globalconst.h b/globalconst.h
index 428135d..605d909 100755
--- a/globalconst.h
+++ b/globalconst.h
@@ -54,8 +54,8 @@
/* ---------------------------------------------------------------------------
* frame between the groundplane and the copper
*/
-#define GROUNDPLANEFRAME 15 /* unit == mil */
-#define MASKFRAME 3 /* unit == mil */
+#define GROUNDPLANEFRAME MIL_TO_COORD(15)
+#define MASKFRAME MIL_TO_COORD(3)
/* ---------------------------------------------------------------------------
* some limit specifications
diff --git a/src/buffer.c b/src/buffer.c
index 2e63af5..6ff6132 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -1004,7 +1004,7 @@ ConvertBufferToElement (BufferTypePtr Buffer)
{
char num[8];
if (via->Mask < via->Thickness)
- via->Mask = via->Thickness + 2 * MIL_TO_COORD(MASKFRAME); /* MASKFRAME is in mils */
+ via->Mask = via->Thickness + 2 * MASKFRAME;
if (via->Name)
CreateNewPin (Element, via->X, via->Y, via->Thickness,
via->Clearance, via->Mask, via->DrillingHole,
diff --git a/src/global.h b/src/global.h
index 498e3f8..daa82a9 100644
--- a/src/global.h
+++ b/src/global.h
@@ -86,6 +86,13 @@ typedef struct AttributeListType AttributeListType, *AttributeListTypePtr;
typedef int LocationType;
typedef int BDimension; /* big dimension */
+/* This is used by the lexer/parser */
+typedef struct {
+ int ival;
+ BDimension bval;
+ double dval;
+ char has_units;
+} PLMeasure;
#ifndef XtSpecificationRelease
typedef unsigned int Cardinal;
diff --git a/src/parse_y.y b/src/parse_y.y
index 05f0a49..8eaba94 100644
--- a/src/parse_y.y
+++ b/src/parse_y.y
@@ -86,14 +86,35 @@ int yyerror(const char *s);
int yylex();
static int check_file_version (int);
+static void do_measure (PLMeasure *m, int i, double d, int u);
+#define M(r,f,d) do_measure (&(r), f, d, 1)
+
+/* Macros for interpreting what "measure" means - integer value only,
+ old units (mil), or new units (cmil). */
+#define IV(m) integer_value (m)
+#define OU(m) old_units (m)
+#define NU(m) new_units (m)
+
+static int integer_value (PLMeasure m);
+static BDimension old_units (PLMeasure m);
+static BDimension new_units (PLMeasure m);
+
+#define YYDEBUG 1
+#define YYERROR_VERBOSE 1
+
+#include "parse_y.h"
+
%}
+%verbose
+
%union /* define YYSTACK type */
{
int integer;
double number;
char *string;
FlagType flagtype;
+ PLMeasure measure;
}
%token <number> FLOATING /* line thickness, coordinates ... */
@@ -109,8 +130,7 @@ static int check_file_version (int);
%type <string> opt_string
%type <flagtype> flags
%type <number> number
-%type <number> measure
-%type <number> oldmeasure
+%type <measure> measure
%%
@@ -310,17 +330,17 @@ pcbname
yyPCB->MaxWidth = MAX_COORD;
yyPCB->MaxHeight = MAX_COORD;
}
- | T_PCB '(' STRING oldmeasure oldmeasure ')'
+ | T_PCB '(' STRING measure measure ')'
{
yyPCB->Name = $3;
- yyPCB->MaxWidth = $4;
- yyPCB->MaxHeight = $5;
+ yyPCB->MaxWidth = OU ($4);
+ yyPCB->MaxHeight = OU ($5);
}
| T_PCB '[' STRING measure measure ']'
{
yyPCB->Name = $3;
- yyPCB->MaxWidth = $4;
- yyPCB->MaxHeight = $5;
+ yyPCB->MaxWidth = NU ($4);
+ yyPCB->MaxHeight = NU ($5);
}
;
@@ -350,19 +370,19 @@ pcbgrid
| pcbhigrid
;
pcbgridold
- : T_GRID '(' oldmeasure oldmeasure oldmeasure ')'
+ : T_GRID '(' measure measure measure ')'
{
- yyPCB->Grid = $3;
- yyPCB->GridOffsetX = $4;
- yyPCB->GridOffsetY = $5;
+ yyPCB->Grid = OU ($3);
+ yyPCB->GridOffsetX = OU ($4);
+ yyPCB->GridOffsetY = OU ($5);
}
;
pcbgridnew
- : T_GRID '(' oldmeasure oldmeasure oldmeasure INTEGER ')'
+ : T_GRID '(' measure measure measure INTEGER ')'
{
- yyPCB->Grid = $3;
- yyPCB->GridOffsetX = $4;
- yyPCB->GridOffsetY = $5;
+ yyPCB->Grid = OU ($3);
+ yyPCB->GridOffsetX = OU ($4);
+ yyPCB->GridOffsetY = OU ($5);
if ($6)
Settings.DrawGrid = true;
else
@@ -373,9 +393,9 @@ pcbgridnew
pcbhigrid
: T_GRID '[' measure measure measure INTEGER ']'
{
- yyPCB->Grid = $3;
- yyPCB->GridOffsetX = $4;
- yyPCB->GridOffsetY = $5;
+ yyPCB->Grid = NU ($3);
+ yyPCB->GridOffsetX = NU ($4);
+ yyPCB->GridOffsetY = NU ($5);
if ($6)
Settings.DrawGrid = true;
else
@@ -403,16 +423,16 @@ first variant accepts floating point numbers. The special value
%end-doc */
pcbcursor
- : T_CURSOR '(' oldmeasure oldmeasure number ')'
+ : T_CURSOR '(' measure measure number ')'
{
- yyPCB->CursorX = $3;
- yyPCB->CursorY = $4;
+ yyPCB->CursorX = OU ($3);
+ yyPCB->CursorY = OU ($4);
yyPCB->Zoom = $5*2;
}
| T_CURSOR '[' measure measure number ']'
{
- yyPCB->CursorX = $3;
- yyPCB->CursorY = $4;
+ yyPCB->CursorX = NU ($3);
+ yyPCB->CursorY = NU ($4);
yyPCB->Zoom = $5;
}
|
@@ -501,33 +521,33 @@ pcbdrc
pcbdrc1
: T_DRC '[' measure measure measure ']'
{
- yyPCB->Bloat = $3;
- yyPCB->Shrink = $4;
- yyPCB->minWid = $5;
- yyPCB->minRing = $5;
+ yyPCB->Bloat = NU ($3);
+ yyPCB->Shrink = NU ($4);
+ yyPCB->minWid = NU ($5);
+ yyPCB->minRing = NU ($5);
}
;
pcbdrc2
: T_DRC '[' measure measure measure measure ']'
{
- yyPCB->Bloat = $3;
- yyPCB->Shrink = $4;
- yyPCB->minWid = $5;
- yyPCB->minSlk = $6;
- yyPCB->minRing = $5;
+ yyPCB->Bloat = NU ($3);
+ yyPCB->Shrink = NU ($4);
+ yyPCB->minWid = NU ($5);
+ yyPCB->minSlk = NU ($6);
+ yyPCB->minRing = NU ($5);
}
;
pcbdrc3
: T_DRC '[' measure measure measure measure measure measure ']'
{
- yyPCB->Bloat = $3;
- yyPCB->Shrink = $4;
- yyPCB->minWid = $5;
- yyPCB->minSlk = $6;
- yyPCB->minDrill = $7;
- yyPCB->minRing = $8;
+ yyPCB->Bloat = NU ($3);
+ yyPCB->Shrink = NU ($4);
+ yyPCB->minWid = NU ($5);
+ yyPCB->minSlk = NU ($6);
+ yyPCB->minDrill = NU ($7);
+ yyPCB->minRing = NU ($8);
}
;
@@ -662,7 +682,7 @@ pcbdefinitions
pcbdefinition
: via
- | { attr_list = & yyPCB->Attributes; } attributes
+ | { attr_list = & yyPCB->Attributes; } attribute
| rats
| layer
|
@@ -719,16 +739,18 @@ via_hi_format
/* x, y, thickness, clearance, mask, drilling-hole, name, flags */
: T_VIA '[' measure measure measure measure measure measure STRING flags ']'
{
- CreateNewVia(yyData, $3, $4, $5, $6, $7, $8, $9, $10);
+ CreateNewVia(yyData, NU ($3), NU ($4), NU ($5), NU ($6), NU ($7),
+ NU ($8), $9, $10);
free ($9);
}
;
via_2.0_format
/* x, y, thickness, clearance, mask, drilling-hole, name, flags */
- : T_VIA '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
+ : T_VIA '(' measure measure measure measure measure measure STRING INTEGER ')'
{
- CreateNewVia(yyData, $3, $4, $5, $6, $7, $8, $9, OldFlags($10));
+ CreateNewVia(yyData, OU ($3), OU ($4), OU ($5), OU ($6), OU ($7), OU ($8), $9,
+ OldFlags($10));
free ($9);
}
;
@@ -736,37 +758,37 @@ via_2.0_format
via_1.7_format
/* x, y, thickness, clearance, drilling-hole, name, flags */
- : T_VIA '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
+ : T_VIA '(' measure measure measure measure measure STRING INTEGER ')'
{
- CreateNewVia(yyData, $3, $4, $5, $6,
- ($5 + $6), $7, $8, OldFlags($9));
+ CreateNewVia(yyData, OU ($3), OU ($4), OU ($5), OU ($6),
+ OU ($5) + OU($6), OU ($7), $8, OldFlags($9));
free ($8);
}
;
via_newformat
/* x, y, thickness, drilling-hole, name, flags */
- : T_VIA '(' oldmeasure oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
+ : T_VIA '(' measure measure measure measure STRING INTEGER ')'
{
- CreateNewVia(yyData, $3, $4, $5, 200*GROUNDPLANEFRAME,
- $5 + 200*MASKFRAME, $6, $7, OldFlags($8));
+ CreateNewVia(yyData, OU ($3), OU ($4), OU ($5), 2*GROUNDPLANEFRAME,
+ OU($5) + 2*MASKFRAME, OU ($6), $7, OldFlags($8));
free ($7);
}
;
via_oldformat
/* old format: x, y, thickness, name, flags */
- : T_VIA '(' oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
+ : T_VIA '(' measure measure measure STRING INTEGER ')'
{
- BDimension hole = ($5 *DEFAULT_DRILLINGHOLE);
+ BDimension hole = (OU($5) * DEFAULT_DRILLINGHOLE);
/* make sure that there's enough copper left */
- if ($5 -hole < MIN_PINORVIACOPPER &&
- $5 > MIN_PINORVIACOPPER)
- hole = $5 -MIN_PINORVIACOPPER;
+ if (OU($5) - hole < MIN_PINORVIACOPPER &&
+ OU($5) > MIN_PINORVIACOPPER)
+ hole = OU($5) - MIN_PINORVIACOPPER;
- CreateNewVia(yyData, $3, $4, $5, 200*GROUNDPLANEFRAME,
- $5 + 200*MASKFRAME, hole, $6, OldFlags($7));
+ CreateNewVia(yyData, OU ($3), OU ($4), OU ($5), 2*GROUNDPLANEFRAME,
+ OU($5) + 2*MASKFRAME, hole, $6, OldFlags($7));
free ($6);
}
;
@@ -794,12 +816,12 @@ Numeric flags.
rats
: T_RAT '[' measure measure INTEGER measure measure INTEGER flags ']'
{
- CreateNewRat(yyData, $3, $4, $6, $7, $5, $8,
+ CreateNewRat(yyData, NU ($3), NU ($4), NU ($6), NU ($7), $5, $8,
Settings.RatThickness, $9);
}
- | T_RAT '(' oldmeasure oldmeasure INTEGER oldmeasure oldmeasure INTEGER INTEGER ')'
+ | T_RAT '(' measure measure INTEGER measure measure INTEGER INTEGER ')'
{
- CreateNewRat(yyData, $3, $4, $6, $7, $5, $8,
+ CreateNewRat(yyData, OU ($3), OU ($4), OU ($6), OU ($7), $5, $8,
Settings.RatThickness, OldFlags($9));
}
;
@@ -869,15 +891,15 @@ layerdefinition
| arc_1.7_format
| arc_oldformat
/* x1, y1, x2, y2, flags */
- | T_RECTANGLE '(' oldmeasure oldmeasure oldmeasure oldmeasure INTEGER ')'
+ | T_RECTANGLE '(' measure measure measure measure INTEGER ')'
{
CreateNewPolygonFromRectangle(Layer,
- $3, $4, ($3+$5), ($4+$6), OldFlags($7));
+ OU ($3), OU ($4), OU ($3) + OU ($5), OU ($4) + OU ($6), OldFlags($7));
}
| text_hi_format
| text_newformat
| text_oldformat
- | { attr_list = & Layer->Attributes; } attributes
+ | { attr_list = & Layer->Attributes; } attribute
| polygon_format
/* %start-doc pcbfile Line
@@ -910,27 +932,28 @@ line_hi_format
/* x1, y1, x2, y2, thickness, clearance, flags */
: T_LINE '[' measure measure measure measure measure measure flags ']'
{
- CreateNewLineOnLayer(Layer, $3, $4, $5, $6, $7, $8, $9);
+ CreateNewLineOnLayer(Layer, NU ($3), NU ($4), NU ($5), NU ($6),
+ NU ($7), NU ($8), $9);
}
;
line_1.7_format
/* x1, y1, x2, y2, thickness, clearance, flags */
- : T_LINE '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure INTEGER ')'
+ : T_LINE '(' measure measure measure measure measure measure INTEGER ')'
{
- CreateNewLineOnLayer(Layer, $3, $4, $5, $6,
- $7, $8, OldFlags($9));
+ CreateNewLineOnLayer(Layer, OU ($3), OU ($4), OU ($5), OU ($6),
+ OU ($7), OU ($8), OldFlags($9));
}
;
line_oldformat
/* x1, y1, x2, y2, thickness, flags */
- : T_LINE '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure INTEGER ')'
+ : T_LINE '(' measure measure measure measure measure measure ')'
{
/* eliminate old-style rat-lines */
- if (($8 & RATFLAG) == 0)
- CreateNewLineOnLayer(Layer, $3, $4, $5, $6, $7,
- 200*GROUNDPLANEFRAME, OldFlags($8));
+ if ((IV ($8) & RATFLAG) == 0)
+ CreateNewLineOnLayer(Layer, OU ($3), OU ($4), OU ($5), OU ($6), OU ($7),
+ 200*GROUNDPLANEFRAME, OldFlags(IV ($8)));
}
;
@@ -975,25 +998,26 @@ arc_hi_format
/* x, y, width, height, thickness, clearance, startangle, delta, flags */
: T_ARC '[' measure measure measure measure measure measure number number flags ']'
{
- CreateNewArcOnLayer(Layer, $3, $4, $5, $6, $9, $10, $7, $8, $11);
+ CreateNewArcOnLayer(Layer, NU ($3), NU ($4), NU ($5), NU ($6), $9, $10,
+ NU ($7), NU ($8), $11);
}
;
arc_1.7_format
/* x, y, width, height, thickness, clearance, startangle, delta, flags */
- : T_ARC '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure number number INTEGER ')'
+ : T_ARC '(' measure measure measure measure measure measure number number INTEGER ')'
{
- CreateNewArcOnLayer(Layer, $3, $4, $5, $6, $9, $10,
- $7, $8, OldFlags($11));
+ CreateNewArcOnLayer(Layer, OU ($3), OU ($4), OU ($5), OU ($6), $9, $10,
+ OU ($7), OU ($8), OldFlags($11));
}
;
arc_oldformat
/* x, y, width, height, thickness, startangle, delta, flags */
- : T_ARC '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure number number INTEGER ')'
+ : T_ARC '(' measure measure measure measure measure measure number INTEGER ')'
{
- CreateNewArcOnLayer(Layer, $3, $4, $5, $5, $8, $9,
- $7, 200*GROUNDPLANEFRAME, OldFlags($10));
+ CreateNewArcOnLayer(Layer, OU ($3), OU ($4), OU ($5), OU ($5), IV ($8), $9,
+ OU ($7), 200*GROUNDPLANEFRAME, OldFlags($10));
}
;
@@ -1027,27 +1051,29 @@ Numeric flags.
text_oldformat
/* x, y, direction, text, flags */
- : T_TEXT '(' oldmeasure oldmeasure number STRING INTEGER ')'
+ : T_TEXT '(' measure measure number STRING INTEGER ')'
{
/* use a default scale of 100% */
- CreateNewText(Layer,yyFont,$3, $4, $5, 100, $6, OldFlags($7));
+ CreateNewText(Layer,yyFont,OU ($3), OU ($4), $5, 100, $6, OldFlags($7));
free ($6);
}
;
text_newformat
/* x, y, direction, scale, text, flags */
- : T_TEXT '(' oldmeasure oldmeasure number number STRING INTEGER ')'
+ : T_TEXT '(' measure measure number number STRING INTEGER ')'
{
if ($8 & ONSILKFLAG)
{
LayerTypePtr lay = &yyData->Layer[yyData->LayerN +
(($8 & ONSOLDERFLAG) ? SOLDER_LAYER : COMPONENT_LAYER)];
- CreateNewText(lay ,yyFont, $3, $4, $5, $6, $7, OldFlags($8));
+ CreateNewText(lay ,yyFont, OU ($3), OU ($4), $5, $6, $7,
+ OldFlags($8));
}
else
- CreateNewText(Layer, yyFont, $3, $4, $5, $6, $7, OldFlags($8));
+ CreateNewText(Layer, yyFont, OU ($3), OU ($4), $5, $6, $7,
+ OldFlags($8));
free ($7);
}
;
@@ -1067,10 +1093,10 @@ text_hi_format
LayerTypePtr lay = &yyData->Layer[yyData->LayerN +
(($8.f & ONSOLDERFLAG) ? SOLDER_LAYER : COMPONENT_LAYER)];
- CreateNewText(lay, yyFont, $3, $4, $5, $6, $7, $8);
+ CreateNewText(lay, yyFont, NU ($3), NU ($4), $5, $6, $7, $8);
}
else
- CreateNewText(Layer, yyFont, $3, $4, $5, $6, $7, $8);
+ CreateNewText(Layer, yyFont, NU ($3), NU ($4), $5, $6, $7, $8);
free ($7);
}
;
@@ -1143,7 +1169,6 @@ polygon_format
polygonholes
: /* empty */
- | polygonhole
| polygonholes polygonhole
;
@@ -1156,21 +1181,20 @@ polygonhole
;
polygonpoints
- : polygonpoint
- | polygonpoints polygonpoint
+ : /* empty */
+ | polygonpoint polygonpoints
;
polygonpoint
/* xcoord ycoord */
- : '(' oldmeasure oldmeasure ')'
+ : '(' measure measure ')'
{
- CreateNewPointInPolygon(Polygon, $2, $3);
+ CreateNewPointInPolygon(Polygon, OU ($2), OU ($3));
}
| '[' measure measure ']'
{
- CreateNewPointInPolygon(Polygon, $2, $3);
+ CreateNewPointInPolygon(Polygon, NU ($2), NU ($3));
}
- |
;
/* %start-doc pcbfile Element
@@ -1238,10 +1262,10 @@ element_oldformat
/* element_flags, description, pcb-name,
* text_x, text_y, text_direction, text_scale, text_flags
*/
- : T_ELEMENT '(' STRING STRING oldmeasure oldmeasure INTEGER ')' '('
+ : T_ELEMENT '(' STRING STRING measure measure INTEGER ')' '('
{
yyElement = CreateNewElement(yyData, yyElement, yyFont, NoFlags(),
- $3, $4, NULL, $5, $6, $7, 100, NoFlags(), false);
+ $3, $4, NULL, OU ($5), OU ($6), $7, 100, NoFlags(), false);
free ($3);
free ($4);
pin_num = 1;
@@ -1256,10 +1280,10 @@ element_1.3.4_format
/* element_flags, description, pcb-name,
* text_x, text_y, text_direction, text_scale, text_flags
*/
- : T_ELEMENT '(' INTEGER STRING STRING oldmeasure oldmeasure number number INTEGER ')' '('
+ : T_ELEMENT '(' INTEGER STRING STRING measure measure measure measure INTEGER ')' '('
{
yyElement = CreateNewElement(yyData, yyElement, yyFont, OldFlags($3),
- $4, $5, NULL, $6, $7, $8, $9, OldFlags($10), false);
+ $4, $5, NULL, OU ($6), OU ($7), IV ($8), IV ($9), OldFlags($10), false);
free ($4);
free ($5);
pin_num = 1;
@@ -1274,10 +1298,10 @@ element_newformat
/* element_flags, description, pcb-name, value,
* text_x, text_y, text_direction, text_scale, text_flags
*/
- : T_ELEMENT '(' INTEGER STRING STRING STRING oldmeasure oldmeasure number number INTEGER ')' '('
+ : T_ELEMENT '(' INTEGER STRING STRING STRING measure measure measure measure INTEGER ')' '('
{
yyElement = CreateNewElement(yyData, yyElement, yyFont, OldFlags($3),
- $4, $5, $6, $7, $8, $9, $10, OldFlags($11), false);
+ $4, $5, $6, OU ($7), OU ($8), IV ($9), IV ($10), OldFlags($11), false);
free ($4);
free ($5);
free ($6);
@@ -1293,13 +1317,14 @@ element_1.7_format
/* element_flags, description, pcb-name, value, mark_x, mark_y,
* text_x, text_y, text_direction, text_scale, text_flags
*/
- : T_ELEMENT '(' INTEGER STRING STRING STRING oldmeasure oldmeasure
- oldmeasure oldmeasure number number INTEGER ')' '('
+ : T_ELEMENT '(' INTEGER STRING STRING STRING measure measure
+ measure measure number number INTEGER ')' '('
{
yyElement = CreateNewElement(yyData, yyElement, yyFont, OldFlags($3),
- $4, $5, $6, ($7+$9), ($8+$10), $11, $12, OldFlags($13), false);
- yyElement->MarkX = $7;
- yyElement->MarkY = $8;
+ $4, $5, $6, OU ($7) + OU ($9), OU ($8) + OU ($10),
+ $11, $12, OldFlags($13), false);
+ yyElement->MarkX = OU ($7);
+ yyElement->MarkY = OU ($8);
free ($4);
free ($5);
free ($6);
@@ -1318,9 +1343,10 @@ element_hi_format
measure measure number number flags ']' '('
{
yyElement = CreateNewElement(yyData, yyElement, yyFont, $3,
- $4, $5, $6, ($7+$9), ($8+$10), $11, $12, $13, false);
- yyElement->MarkX = $7;
- yyElement->MarkY = $8;
+ $4, $5, $6, NU ($7) + NU ($9), NU ($8) + NU ($10),
+ $11, $12, $13, false);
+ yyElement->MarkX = NU ($7);
+ yyElement->MarkY = NU ($8);
free ($4);
free ($5);
free ($6);
@@ -1407,35 +1433,35 @@ elementdefinition
/* x1, y1, x2, y2, thickness */
| T_ELEMENTLINE '[' measure measure measure measure measure ']'
{
- CreateNewLineInElement(yyElement, $3, $4, $5, $6, $7);
+ CreateNewLineInElement(yyElement, NU ($3), NU ($4), NU ($5), NU ($6), NU ($7));
}
/* x1, y1, x2, y2, thickness */
- | T_ELEMENTLINE '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure ')'
+ | T_ELEMENTLINE '(' measure measure measure measure measure ')'
{
- CreateNewLineInElement(yyElement, $3, $4, $5, $6, $7);
+ CreateNewLineInElement(yyElement, OU ($3), OU ($4), OU ($5), OU ($6), OU ($7));
}
/* x, y, width, height, startangle, anglediff, thickness */
| T_ELEMENTARC '[' measure measure measure measure number number measure ']'
{
- CreateNewArcInElement(yyElement, $3, $4, $5, $6, $7, $8, $9);
+ CreateNewArcInElement(yyElement, NU ($3), NU ($4), NU ($5), NU ($6), $7, $8, NU ($9));
}
/* x, y, width, height, startangle, anglediff, thickness */
- | T_ELEMENTARC '(' oldmeasure oldmeasure oldmeasure oldmeasure number number oldmeasure ')'
+ | T_ELEMENTARC '(' measure measure measure measure number number measure ')'
{
- CreateNewArcInElement(yyElement, $3, $4, $5, $6, $7, $8, $9);
+ CreateNewArcInElement(yyElement, OU ($3), OU ($4), OU ($5), OU ($6), $7, $8, OU ($9));
}
/* x, y position */
| T_MARK '[' measure measure ']'
{
- yyElement->MarkX = $3;
- yyElement->MarkY = $4;
+ yyElement->MarkX = NU ($3);
+ yyElement->MarkY = NU ($4);
}
- | T_MARK '(' oldmeasure oldmeasure ')'
+ | T_MARK '(' measure measure ')'
{
- yyElement->MarkX = $3;
- yyElement->MarkY = $4;
+ yyElement->MarkX = OU ($3);
+ yyElement->MarkY = OU ($4);
}
- | { attr_list = & yyElement->Attributes; } attributes
+ | { attr_list = & yyElement->Attributes; } attribute
;
relementdefs
@@ -1451,28 +1477,28 @@ relementdef
/* x1, y1, x2, y2, thickness */
| T_ELEMENTLINE '[' measure measure measure measure measure ']'
{
- CreateNewLineInElement(yyElement, $3 + yyElement->MarkX,
- $4 + yyElement->MarkY, $5 + yyElement->MarkX,
- $6 + yyElement->MarkY, $7);
+ CreateNewLineInElement(yyElement, NU ($3) + yyElement->MarkX,
+ NU ($4) + yyElement->MarkY, NU ($5) + yyElement->MarkX,
+ NU ($6) + yyElement->MarkY, NU ($7));
}
- | T_ELEMENTLINE '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure ')'
+ | T_ELEMENTLINE '(' measure measure measure measure measure ')'
{
- CreateNewLineInElement(yyElement, $3 + yyElement->MarkX,
- $4 + yyElement->MarkY, $5 + yyElement->MarkX,
- $6 + yyElement->MarkY, $7);
+ CreateNewLineInElement(yyElement, OU ($3) + yyElement->MarkX,
+ OU ($4) + yyElement->MarkY, OU ($5) + yyElement->MarkX,
+ OU ($6) + yyElement->MarkY, OU ($7));
}
/* x, y, width, height, startangle, anglediff, thickness */
| T_ELEMENTARC '[' measure measure measure measure number number measure ']'
{
- CreateNewArcInElement(yyElement, $3 + yyElement->MarkX,
- $4 + yyElement->MarkY, $5, $6, $7, $8, $9);
+ CreateNewArcInElement(yyElement, NU ($3) + yyElement->MarkX,
+ NU ($4) + yyElement->MarkY, NU ($5), NU ($6), $7, $8, NU ($9));
}
- | T_ELEMENTARC '(' oldmeasure oldmeasure oldmeasure oldmeasure number number oldmeasure ')'
+ | T_ELEMENTARC '(' measure measure measure measure number number measure ')'
{
- CreateNewArcInElement(yyElement, $3 + yyElement->MarkX,
- $4 + yyElement->MarkY, $5, $6, $7, $8, $9);
+ CreateNewArcInElement(yyElement, OU ($3) + yyElement->MarkX,
+ OU ($4) + yyElement->MarkY, OU ($5), OU ($6), $7, $8, OU ($9));
}
- | { attr_list = & yyElement->Attributes; } attributes
+ | { attr_list = & yyElement->Attributes; } attribute
;
/* %start-doc pcbfile Pin
@@ -1515,8 +1541,8 @@ pin_hi_format
number, flags */
: T_PIN '[' measure measure measure measure measure measure STRING STRING flags ']'
{
- CreateNewPin(yyElement, $3 + yyElement->MarkX,
- $4 + yyElement->MarkY, $5, $6, $7, $8, $9,
+ CreateNewPin(yyElement, NU ($3) + yyElement->MarkX,
+ NU ($4) + yyElement->MarkY, NU ($5), NU ($6), NU ($7), NU ($8), $9,
$10, $11);
free ($9);
free ($10);
@@ -1525,10 +1551,10 @@ pin_hi_format
pin_1.7_format
/* x, y, thickness, clearance, mask, drilling hole, name,
number, flags */
- : T_PIN '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure STRING STRING INTEGER ')'
+ : T_PIN '(' measure measure measure measure measure measure STRING STRING INTEGER ')'
{
- CreateNewPin(yyElement, $3 + yyElement->MarkX,
- $4 + yyElement->MarkY, $5, $6, $7, $8, $9,
+ CreateNewPin(yyElement, OU ($3) + yyElement->MarkX,
+ OU ($4) + yyElement->MarkY, OU ($5), OU ($6), OU ($7), OU ($8), $9,
$10, OldFlags($11));
free ($9);
free ($10);
@@ -1537,10 +1563,10 @@ pin_1.7_format
pin_1.6.3_format
/* x, y, thickness, drilling hole, name, number, flags */
- : T_PIN '(' oldmeasure oldmeasure oldmeasure oldmeasure STRING STRING INTEGER ')'
+ : T_PIN '(' measure measure measure measure STRING STRING INTEGER ')'
{
- CreateNewPin(yyElement, $3, $4, $5, 200*GROUNDPLANEFRAME,
- $5 + 200*MASKFRAME, $6, $7, $8, OldFlags($9));
+ CreateNewPin(yyElement, OU ($3), OU ($4), OU ($5), 2*GROUNDPLANEFRAME,
+ OU ($5) + 2*MASKFRAME, OU ($6), $7, $8, OldFlags($9));
free ($7);
free ($8);
}
@@ -1548,13 +1574,13 @@ pin_1.6.3_format
pin_newformat
/* x, y, thickness, drilling hole, name, flags */
- : T_PIN '(' oldmeasure oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
+ : T_PIN '(' measure measure measure measure STRING INTEGER ')'
{
char p_number[8];
sprintf(p_number, "%d", pin_num++);
- CreateNewPin(yyElement, $3, $4, $5, 200*GROUNDPLANEFRAME,
- $5 + 200*MASKFRAME, $6, $7, p_number, OldFlags($8));
+ CreateNewPin(yyElement, OU ($3), OU ($4), OU ($5), 2*GROUNDPLANEFRAME,
+ OU ($5) + 2*MASKFRAME, OU ($6), $7, p_number, OldFlags($8));
free ($7);
}
@@ -1564,19 +1590,19 @@ pin_oldformat
/* old format: x, y, thickness, name, flags
* drilling hole is 40% of the diameter
*/
- : T_PIN '(' oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
+ : T_PIN '(' measure measure measure STRING INTEGER ')'
{
- BDimension hole = ($5 *DEFAULT_DRILLINGHOLE);
+ BDimension hole = OU ($5) * DEFAULT_DRILLINGHOLE;
char p_number[8];
/* make sure that there's enough copper left */
- if ($5 -hole < MIN_PINORVIACOPPER &&
- $5 > MIN_PINORVIACOPPER)
- hole = $5 -MIN_PINORVIACOPPER;
+ if (OU ($5) - hole < MIN_PINORVIACOPPER &&
+ OU ($5) > MIN_PINORVIACOPPER)
+ hole = OU ($5) - MIN_PINORVIACOPPER;
sprintf(p_number, "%d", pin_num++);
- CreateNewPin(yyElement, $3, $4, $5, 200*GROUNDPLANEFRAME,
- $5 + 200*MASKFRAME, hole, $6, p_number, OldFlags($7));
+ CreateNewPin(yyElement, OU ($3), OU ($4), OU ($5), 2*GROUNDPLANEFRAME,
+ OU ($5) + 2*MASKFRAME, hole, $6, p_number, OldFlags($7));
free ($6);
}
;
@@ -1620,10 +1646,10 @@ pad_hi_format
/* x1, y1, x2, y2, thickness, clearance, mask, name , pad number, flags */
: T_PAD '[' measure measure measure measure measure measure measure STRING STRING flags ']'
{
- CreateNewPad(yyElement, $3 + yyElement->MarkX,
- $4 + yyElement->MarkY,
- $5 + yyElement->MarkX,
- $6 + yyElement->MarkY, $7, $8, $9,
+ CreateNewPad(yyElement, NU ($3) + yyElement->MarkX,
+ NU ($4) + yyElement->MarkY,
+ NU ($5) + yyElement->MarkX,
+ NU ($6) + yyElement->MarkY, NU ($7), NU ($8), NU ($9),
$10, $11, $12);
free ($10);
free ($11);
@@ -1632,11 +1658,11 @@ pad_hi_format
pad_1.7_format
/* x1, y1, x2, y2, thickness, clearance, mask, name , pad number, flags */
- : T_PAD '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure STRING STRING INTEGER ')'
+ : T_PAD '(' measure measure measure measure measure measure measure STRING STRING INTEGER ')'
{
- CreateNewPad(yyElement,$3 + yyElement->MarkX,
- $4 + yyElement->MarkY, $5 + yyElement->MarkX,
- $6 + yyElement->MarkY, $7, $8, $9,
+ CreateNewPad(yyElement,OU ($3) + yyElement->MarkX,
+ OU ($4) + yyElement->MarkY, OU ($5) + yyElement->MarkX,
+ OU ($6) + yyElement->MarkY, OU ($7), OU ($8), OU ($9),
$10, $11, OldFlags($12));
free ($10);
free ($11);
@@ -1645,10 +1671,10 @@ pad_1.7_format
pad_newformat
/* x1, y1, x2, y2, thickness, name , pad number, flags */
- : T_PAD '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure STRING STRING INTEGER ')'
+ : T_PAD '(' measure measure measure measure measure STRING STRING INTEGER ')'
{
- CreateNewPad(yyElement,$3,$4,$5,$6,$7, 200*GROUNDPLANEFRAME,
- $7 + 200*MASKFRAME, $8,$9, OldFlags($10));
+ CreateNewPad(yyElement,OU ($3),OU ($4),OU ($5),OU ($6),OU ($7), 2*GROUNDPLANEFRAME,
+ OU ($7) + 2*MASKFRAME, $8, $9, OldFlags($10));
free ($8);
free ($9);
}
@@ -1656,13 +1682,13 @@ pad_newformat
pad
/* x1, y1, x2, y2, thickness, name and flags */
- : T_PAD '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
+ : T_PAD '(' measure measure measure measure measure STRING INTEGER ')'
{
char p_number[8];
sprintf(p_number, "%d", pin_num++);
- CreateNewPad(yyElement,$3,$4,$5,$6,$7, 200*GROUNDPLANEFRAME,
- $7 + 200*MASKFRAME, $8,p_number, OldFlags($9));
+ CreateNewPad(yyElement,OU ($3),OU ($4),OU ($5),OU ($6),OU ($7), 2*GROUNDPLANEFRAME,
+ OU ($7) + 2*MASKFRAME, $8,p_number, OldFlags($9));
free ($8);
}
;
@@ -1695,8 +1721,9 @@ Additional space to allow after this character.
%end-doc */
-symbol
- : T_SYMBOL '[' symbolid measure ']' '('
+symbol : symbolhead symboldata ')'
+
+symbolhead : T_SYMBOL '[' symbolid measure ']' '('
{
if ($3 <= 0 || $3 > MAX_FONTPOSITION)
{
@@ -1710,10 +1737,9 @@ symbol
YYABORT;
}
Symbol->Valid = true;
- Symbol->Delta = $4;
+ Symbol->Delta = NU ($4);
}
- symboldata ')'
- | T_SYMBOL '(' symbolid oldmeasure ')' '('
+ | T_SYMBOL '(' symbolid measure ')' '('
{
if ($3 <= 0 || $3 > MAX_FONTPOSITION)
{
@@ -1727,9 +1753,8 @@ symbol
YYABORT;
}
Symbol->Valid = true;
- Symbol->Delta = $4;
+ Symbol->Delta = OU ($4);
}
- symboldata ')'
;
symbolid
@@ -1738,14 +1763,9 @@ symbolid
;
symboldata
- : symboldefinitions
- | symboldata symboldefinitions
- ;
-
-symboldefinitions
- : symboldefinition
- | hiressymbol
- |
+ : /* empty */
+ | symboldata symboldefinition
+ | symboldata hiressymbol
;
/* %start-doc pcbfile SymbolLine
@@ -1766,16 +1786,16 @@ The width of this line.
symboldefinition
/* x1, y1, x2, y2, thickness */
- : T_SYMBOLLINE '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure ')'
+ : T_SYMBOLLINE '(' measure measure measure measure measure ')'
{
- CreateNewLineInSymbol(Symbol, $3, $4, $5, $6, $7);
+ CreateNewLineInSymbol(Symbol, OU ($3), OU ($4), OU ($5), OU ($6), OU ($7));
}
;
hiressymbol
/* x1, y1, x2, y2, thickness */
: T_SYMBOLLINE '[' measure measure measure measure measure ']'
{
- CreateNewLineInSymbol(Symbol, $3, $4, $5, $6, $7);
+ CreateNewLineInSymbol(Symbol, NU ($3), NU ($4), NU ($5), NU ($6), NU ($7));
}
;
@@ -1891,9 +1911,6 @@ if the value is interpreted as, for example, a number.
%end-doc */
-attributes : attribute
- | attributes attribute
- ;
attribute
: T_ATTRIBUTE '(' STRING STRING ')'
{
@@ -1914,21 +1931,17 @@ number
measure
/* Default unit (no suffix) is cmil */
- : number { $$ = round (MIL_TO_COORD ($1) / 100.0); }
- | number T_UMIL { $$ = round (MIL_TO_COORD ($1) / 100000.0); }
- | number T_CMIL { $$ = round (MIL_TO_COORD ($1) / 100.0); }
- | number T_MIL { $$ = round (MIL_TO_COORD ($1)); }
- | number T_IN { $$ = round (INCH_TO_COORD ($1)); }
- | number T_NM { $$ = round (MM_TO_COORD ($1) / 1000000.0); }
- | number T_UM { $$ = round (MM_TO_COORD ($1) / 1000.0); }
- | number T_MM { $$ = round (MM_TO_COORD ($1)); }
- | number T_M { $$ = round (MM_TO_COORD ($1) * 1000.0); }
- | number T_KM { $$ = round (MM_TO_COORD ($1) * 1000000.0); }
- ;
-
-oldmeasure
- /* ``Obsolete'' default unit is mil */
- : number { $$ = round (MIL_TO_COORD ($1)); }
+ : number { do_measure(&$$, $1, MIL_TO_COORD ($1) / 100.0, 0); }
+ | number T_UMIL { M ($$, $1, MIL_TO_COORD ($1) / 100000.0); }
+ | number T_CMIL { M ($$, $1, MIL_TO_COORD ($1) / 100.0); }
+ | number T_MIL { M ($$, $1, MIL_TO_COORD ($1)); }
+ | number T_IN { M ($$, $1, INCH_TO_COORD ($1)); }
+ | number T_NM { M ($$, $1, MM_TO_COORD ($1) / 1000000.0); }
+ | number T_UM { M ($$, $1, MM_TO_COORD ($1) / 1000.0); }
+ | number T_MM { M ($$, $1, MM_TO_COORD ($1)); }
+ | number T_M { M ($$, $1, MM_TO_COORD ($1) * 1000.0); }
+ | number T_KM { M ($$, $1, MM_TO_COORD ($1) * 1000000.0); }
+ ;
%%
@@ -1949,7 +1962,6 @@ int yywrap()
return 1;
}
-
static int
check_file_version (int ver)
{
@@ -1966,3 +1978,35 @@ check_file_version (int ver)
return 0;
}
+static void
+do_measure (PLMeasure *m, BDimension i, double d, int u)
+{
+ m->ival = i;
+ m->bval = round (d);
+ m->dval = d;
+ m->has_units = u;
+}
+
+static int
+integer_value (PLMeasure m)
+{
+ if (m.has_units)
+ yyerror("units ignored here");
+ return m.ival;
+}
+
+static BDimension
+old_units (PLMeasure m)
+{
+ if (m.has_units)
+ return m.bval;
+ return round (MIL_TO_COORD (m.ival));
+}
+
+static BDimension
+new_units (PLMeasure m)
+{
+ if (m.has_units)
+ return m.bval;
+ return round (MIL_TO_COORD (m.ival) / 100.0);
+}
|
|
From: <gi...@gp...> - 2011-06-06 21:19:26
|
The branch, master has been updated
via d30d31425fa318390e4632d5063e6bb655b01793 (commit)
from 3afdb7efdaf6cc8094cc6143269e7df519183197 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/autoroute.c | 1 -
src/macro.h | 130 ++++++++++++++++++++++++-------------------------------
2 files changed, 57 insertions(+), 74 deletions(-)
=================
Commit Messages
=================
commit d30d31425fa318390e4632d5063e6bb655b01793
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Remove memory allocation from src/macro.h
When we started using GLists for various objects, we
also changed the looping macros to allocate copies of
the list in order to avoid problems with list integrity
in case items were removed during the iteration.
However, this caused memory leaks whenever there was an
early return from the middle of the list. Bug lp-792139
shows pcb using over 2Gb of memory and crashing when
optimizing rats on a large board.
This patch saves the next pointer before the loop body,
rather than allocating a whole new list, to handle element
deletions.
Closes-bug: lp-792139
:100644 100644 c766c14... 9005259... M src/autoroute.c
:100644 100644 b61f673... 7fa0927... M src/macro.h
=========
Changes
=========
commit d30d31425fa318390e4632d5063e6bb655b01793
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Remove memory allocation from src/macro.h
When we started using GLists for various objects, we
also changed the looping macros to allocate copies of
the list in order to avoid problems with list integrity
in case items were removed during the iteration.
However, this caused memory leaks whenever there was an
early return from the middle of the list. Bug lp-792139
shows pcb using over 2Gb of memory and crashing when
optimizing rats on a large board.
This patch saves the next pointer before the loop body,
rather than allocating a whole new list, to handle element
deletions.
Closes-bug: lp-792139
diff --git a/src/autoroute.c b/src/autoroute.c
index c766c14..9005259 100644
--- a/src/autoroute.c
+++ b/src/autoroute.c
@@ -169,7 +169,6 @@ static hidGC ar_gc = 0;
#define LIST_LOOP(init, which, x) do {\
routebox_t *__next_one__ = (init);\
- GList *__copy = NULL; /* DUMMY */\
x = NULL;\
if (!__next_one__)\
assert(__next_one__);\
diff --git a/src/macro.h b/src/macro.h
index b61f673..7fa0927 100644
--- a/src/macro.h
+++ b/src/macro.h
@@ -163,7 +163,6 @@ extern int mem_any_set (unsigned char *, int);
/* ---------------------------------------------------------------------------
* some loop shortcuts
- * all object loops run backwards to prevent from errors when deleting objects
*
* a pointer is created from index addressing because the base pointer
* may change when new memory is allocated;
@@ -171,12 +170,9 @@ extern int mem_any_set (unsigned char *, int);
* all data is relativ to an objects name 'top' which can be either
* PCB or PasteBuffer
*/
-#define END_LOOP } \
- g_list_free (__copy); \
- } while (0)
+#define END_LOOP }} while (0)
#define STYLE_LOOP(top) do { \
- GList *__copy = NULL; /* DUMMY */ \
Cardinal n; \
RouteStyleTypePtr style; \
for (n = 0; n < NUM_STYLES; n++) \
@@ -184,16 +180,15 @@ extern int mem_any_set (unsigned char *, int);
style = &(top)->RouteStyle[n]
#define VIA_LOOP(top) do { \
- GList *__iter; \
- GList *__copy = g_list_copy ((top)->Via); \
- Cardinal n; \
- for (__iter = __copy, n = 0; __iter != NULL; \
- __iter = g_list_next (__iter), n++) { \
+ GList *__iter, *__next; \
+ Cardinal n = 0; \
+ for (__iter = (top)->Via, __next = g_list_next (__iter); \
+ __iter != NULL; \
+ __iter = __next, __next = g_list_next (__iter), n++) { \
PinType *via = __iter->data;
#define DRILL_LOOP(top) do { \
Cardinal n; \
- GList *__copy = NULL; /* DUMMY */ \
DrillTypePtr drill; \
for (n = 0; (top)->DrillN > 0 && n < (top)->DrillN; n++) \
{ \
@@ -201,7 +196,6 @@ extern int mem_any_set (unsigned char *, int);
#define NETLIST_LOOP(top) do { \
Cardinal n; \
- GList *__copy = NULL; /* DUMMY */ \
NetListTypePtr netlist; \
for (n = (top)->NetListN-1; n != -1; n--) \
{ \
@@ -209,7 +203,6 @@ extern int mem_any_set (unsigned char *, int);
#define NET_LOOP(top) do { \
Cardinal n; \
- GList *__copy = NULL; /* DUMMY */ \
NetTypePtr net; \
for (n = (top)->NetN-1; n != -1; n--) \
{ \
@@ -217,31 +210,29 @@ extern int mem_any_set (unsigned char *, int);
#define CONNECTION_LOOP(net) do { \
Cardinal n; \
- GList *__copy = NULL; /* DUMMY */ \
ConnectionTypePtr connection; \
for (n = (net)->ConnectionN-1; n != -1; n--) \
{ \
connection = & (net)->Connection[n]
#define ELEMENT_LOOP(top) do { \
- GList *__iter; \
- GList *__copy = g_list_reverse (g_list_copy ((top)->Element)); \
- Cardinal n; \
- for (__iter = __copy, n = (top)->ElementN - 1; __iter != NULL; \
- __iter = g_list_next (__iter), n--) { \
+ GList *__iter, *__next; \
+ Cardinal n = 0; \
+ for (__iter = (top)->Element, __next = g_list_next (__iter); \
+ __iter != NULL; \
+ __iter = __next, __next = g_list_next (__iter), n++) { \
ElementType *element = __iter->data;
#define RAT_LOOP(top) do { \
- GList *__iter; \
- GList *__copy = g_list_reverse (g_list_copy ((top)->Rat)); \
- Cardinal n; \
- for (__iter = __copy, n = (top)->RatN - 1; __iter != NULL; \
- __iter = g_list_next (__iter), n--) { \
+ GList *__iter, *__next; \
+ Cardinal n = 0; \
+ for (__iter = (top)->Rat, __next = g_list_next (__iter); \
+ __iter != NULL; \
+ __iter = __next, __next = g_list_next (__iter), n++) { \
RatType *line = __iter->data;
#define ELEMENTTEXT_LOOP(element) do { \
Cardinal n; \
- GList *__copy = NULL; /* DUMMY */ \
TextTypePtr text; \
for (n = MAX_ELEMENTNAMES-1; n != -1; n--) \
{ \
@@ -249,7 +240,6 @@ extern int mem_any_set (unsigned char *, int);
#define ELEMENTNAME_LOOP(element) do { \
- GList *__copy = NULL; /* DUMMY */ \
Cardinal n; \
char *textstring; \
for (n = MAX_ELEMENTNAMES-1; n != -1; n--) \
@@ -257,78 +247,77 @@ extern int mem_any_set (unsigned char *, int);
textstring = (element)->Name[n].TextString
#define PIN_LOOP(element) do { \
- GList *__iter; \
- GList *__copy = g_list_copy ((element)->Pin); \
- Cardinal n; \
- for (__iter = __copy, n = 0; __iter != NULL; \
- __iter = g_list_next (__iter), n++) { \
+ GList *__iter, *__next; \
+ Cardinal n = 0; \
+ for (__iter = (element)->Pin, __next = g_list_next (__iter); \
+ __iter != NULL; \
+ __iter = __next, __next = g_list_next (__iter), n++) { \
PinType *pin = __iter->data;
#define PAD_LOOP(element) do { \
- GList *__iter; \
- GList *__copy = g_list_copy ((element)->Pad); \
- Cardinal n; \
- for (__iter = __copy, n = 0; __iter != NULL; \
- __iter = g_list_next (__iter), n++) { \
+ GList *__iter, *__next; \
+ Cardinal n = 0; \
+ for (__iter = (element)->Pad, __next = g_list_next (__iter); \
+ __iter != NULL; \
+ __iter = __next, __next = g_list_next (__iter), n++) { \
PadType *pad = __iter->data;
#define ARC_LOOP(element) do { \
- GList *__iter; \
- GList *__copy = g_list_reverse (g_list_copy ((element)->Arc)); \
- Cardinal n; \
- for (__iter = __copy, n = (element)->ArcN - 1; __iter != NULL; \
- __iter = g_list_next (__iter), n--) { \
+ GList *__iter, *__next; \
+ Cardinal n = 0; \
+ for (__iter = (element)->Arc, __next = g_list_next (__iter); \
+ __iter != NULL; \
+ __iter = __next, __next = g_list_next (__iter), n++) { \
ArcType *arc = __iter->data;
#define ELEMENTLINE_LOOP(element) do { \
- GList *__iter; \
- GList *__copy = g_list_reverse (g_list_copy ((element)->Line)); \
- Cardinal n; \
- for (__iter = __copy, n = (element)->LineN - 1; __iter != NULL; \
- __iter = g_list_next (__iter), n--) { \
+ GList *__iter, *__next; \
+ Cardinal n = 0; \
+ for (__iter = (element)->Line, __next = g_list_next (__iter); \
+ __iter != NULL; \
+ __iter = __next, __next = g_list_next (__iter), n++) { \
LineType *line = __iter->data;
#define ELEMENTARC_LOOP(element) do { \
- GList *__iter; \
- GList *__copy = g_list_reverse (g_list_copy ((element)->Arc)); \
- Cardinal n; \
- for (__iter = __copy, n = (element)->ArcN - 1; __iter != NULL; \
- __iter = g_list_next (__iter), n--) { \
+ GList *__iter, *__next; \
+ Cardinal n = 0; \
+ for (__iter = (element)->Arc, __next = g_list_next (__iter); \
+ __iter != NULL; \
+ __iter = __next, __next = g_list_next (__iter), n++) { \
ArcType *arc = __iter->data;
#define LINE_LOOP(layer) do { \
- GList *__iter; \
- GList *__copy = g_list_reverse (g_list_copy ((layer)->Line)); \
- Cardinal n; \
- for (__iter = __copy, n = (layer)->LineN - 1; __iter != NULL; \
- __iter = g_list_next (__iter), n--) { \
+ GList *__iter, *__next; \
+ Cardinal n = 0; \
+ for (__iter = (layer)->Line, __next = g_list_next (__iter); \
+ __iter != NULL; \
+ __iter = __next, __next = g_list_next (__iter), n++) { \
LineType *line = __iter->data;
#define TEXT_LOOP(layer) do { \
- GList *__iter; \
- GList *__copy = g_list_reverse (g_list_copy ((layer)->Text)); \
- Cardinal n; \
- for (__iter = __copy, n = (layer)->LineN - 1; __iter != NULL; \
- __iter = g_list_next (__iter), n--) { \
+ GList *__iter, *__next; \
+ Cardinal n = 0; \
+ for (__iter = (layer)->Text, __next = g_list_next (__iter); \
+ __iter != NULL; \
+ __iter = __next, __next = g_list_next (__iter), n++) { \
TextType *text = __iter->data;
#define POLYGON_LOOP(layer) do { \
- GList *__iter; \
- GList *__copy = g_list_reverse (g_list_copy ((layer)->Polygon)); \
- Cardinal n; \
- for (__iter = __copy, n = (layer)->PolygonN - 1; __iter != NULL; \
- __iter = g_list_next (__iter), n--) { \
+ GList *__iter, *__next; \
+ Cardinal n = 0; \
+ for (__iter = (layer)->Polygon, __next = g_list_next (__iter); \
+ __iter != NULL; \
+ __iter = __next, __next = g_list_next (__iter), n++) { \
PolygonType *polygon = __iter->data;
#define POLYGONPOINT_LOOP(polygon) do { \
Cardinal n; \
- GList *__copy = NULL; /* DUMMY */ \
PointTypePtr point; \
for (n = (polygon)->PointN-1; n != -1; n--) \
{ \
point = &(polygon)->Points[n]
-#define ENDALL_LOOP }} while (0); }} while (0)
+#define ENDALL_LOOP }} while (0); }} while(0)
#define ALLPIN_LOOP(top) \
ELEMENT_LOOP(top); \
@@ -445,7 +434,6 @@ extern int mem_any_set (unsigned char *, int);
#define POINTER_LOOP(top) do { \
Cardinal n; \
- GList *__copy = NULL; /* DUMMY */ \
void **ptr; \
for (n = (top)->PtrN-1; n != -1; n--) \
{ \
@@ -453,7 +441,6 @@ extern int mem_any_set (unsigned char *, int);
#define MENU_LOOP(top) do { \
Cardinal l; \
- GList *__copy = NULL; /* DUMMY */ \
LibraryMenuTypePtr menu; \
for (l = (top)->MenuN-1; l != -1; l--) \
{ \
@@ -461,7 +448,6 @@ extern int mem_any_set (unsigned char *, int);
#define ENTRY_LOOP(top) do { \
Cardinal n; \
- GList *__copy = NULL; /* DUMMY */ \
LibraryEntryTypePtr entry; \
for (n = (top)->EntryN-1; n != -1; n--) \
{ \
@@ -469,7 +455,6 @@ extern int mem_any_set (unsigned char *, int);
#define GROUP_LOOP(data, group) do { \
Cardinal entry; \
- GList *__copy = NULL; /* DUMMY */ \
for (entry = 0; entry < ((PCBTypePtr)(data->pcb))->LayerGroups.Number[(group)]; entry++) \
{ \
LayerTypePtr layer; \
@@ -481,7 +466,6 @@ extern int mem_any_set (unsigned char *, int);
#define LAYER_LOOP(data, ml) do { \
Cardinal n; \
- GList *__copy = NULL; /* DUMMY */ \
for (n = 0; n < ml; n++) \
{ \
LayerTypePtr layer = (&data->Layer[(n)]);
|
|
From: <gi...@gp...> - 2011-06-05 22:25:30
|
The branch, master has been updated
via 3afdb7efdaf6cc8094cc6143269e7df519183197 (commit)
via bcad6aca51462aa9217d3c215fbe8f20e3d9a204 (commit)
from 750a1c57d85dbb82d704f9443055a783b5dca8eb (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
configure.ac | 10 +---------
doc/Makefile.am | 48 +++---------------------------------------------
doc/gs/Makefile.inc | 32 ++++----------------------------
3 files changed, 8 insertions(+), 82 deletions(-)
=================
Commit Messages
=================
commit 3afdb7efdaf6cc8094cc6143269e7df519183197
Author: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
doc: use pdflatex instead of latex
:100644 100644 94c6779... 6736466... M configure.ac
:100755 100755 d4955b2... 95d1ad3... M doc/Makefile.am
:100644 100644 5b5a013... 96e42bd... M doc/gs/Makefile.inc
commit bcad6aca51462aa9217d3c215fbe8f20e3d9a204
Author: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
doc: skip generation of GIF images
:100755 100755 0432a5b... d4955b2... M doc/Makefile.am
:100644 100644 8817a7c... 5b5a013... M doc/gs/Makefile.inc
=========
Changes
=========
commit 3afdb7efdaf6cc8094cc6143269e7df519183197
Author: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
doc: use pdflatex instead of latex
diff --git a/configure.ac b/configure.ac
index 94c6779..6736466 100644
--- a/configure.ac
+++ b/configure.ac
@@ -589,15 +589,9 @@ GNUM4=$M4
AC_SUBST(GNUM4)
AC_DEFINE_UNQUOTED(GNUM4,"$M4",[m4 program used by pcb])
-AC_PATH_PROG(LATEX, latex, notfound)
-AM_CONDITIONAL(MISSING_LATEX, test x$LATEX = xnotfound)
-
AC_PATH_PROG(PDFLATEX, pdflatex, notfound)
AM_CONDITIONAL(MISSING_PDFLATEX, test x$PDFLATEX = xnotfound)
-AC_PATH_PROG(DVIPS, dvips, notfound)
-AM_CONDITIONAL(MISSING_DVIPS, test x$DVIPS = xnotfound)
-
AC_PATH_PROG(TEXI2DVI, texi2dvi, notfound)
AM_CONDITIONAL(MISSING_TEXI2DVI, test x$TEXI2DVI = xnotfound)
@@ -609,13 +603,11 @@ AC_PATH_PROG(GSCHEM, gschem, notfound)
AM_CONDITIONAL(MISSING_GSCHEM, test x$GSCHEM = xnotfound)
if test "X$docs_yesno" = "Xyes" -a "X$pcb_git_version" = "Xyes" ; then
- if test "$LATEX" = "notfound" -o "$PDFLATEX" = "notfound" -o "$DVIPS" = "notfound" -o "$TEXI2DVI" = "notfound" -o "$PS2PDF" = "notfound" ; then
+ if test "$PDFLATEX" = "notfound" -o "$TEXI2DVI" = "notfound" -o "$PS2PDF" = "notfound" ; then
AC_MSG_ERROR([It appears that you are building from a source tree obtained
via git but you do not have the required tools installed to build the documentation. Here
is a list of tools and the detected values:
-LATEX: $LATEX
PDFLATEX: $PDFLATEX
-DVIPS: $DVIPS
TEXI2DVI: $TEXI2DVI
PS2PDF: $PS2PDF
GSCHEM: $GSCHEM
diff --git a/doc/Makefile.am b/doc/Makefile.am
index d4955b2..95d1ad3 100755
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -42,25 +42,13 @@ pcb_TEXINFOS=
endif
dist_html_DATA= ${html_docs} ${pcb_output_inst} ${images_output_inst}
-dist_ps_DATA= ${ps_docs}
dist_pdf_DATA= ${pdf_docs}
dist_man_MANS= pcb.1
html_docs= ${info_TEXINFOS:.texi=.html}
-ps_docs= ${info_TEXINFOS:.texi=.ps} refcard.ps
pdf_docs= ${info_TEXINFOS:.texi=.pdf} refcard.pdf
-# these dependencies prevent a parallel make job
-# from trying to invoke latex and pdflatex at the same
-# time on the same input file. That causes clashes in
-# the .aux files which are used by both latex and
-# pdflatex.
-if GIT_OR_CVS_VERSION
-refcard.pdf: refcard.ps
-pcb.pdf: pcb.ps
-endif
-
# put the html manual into 1 file instead of multiple files?
AM_MAKEINFOHTMLFLAGS= --css-include=$(srcdir)/pcb.css --no-split
@@ -88,8 +76,8 @@ EXTRA_DIST= \
if GIT_OR_CVS_VERSION
BUILT_SOURCES= ${tab_texi} ${pcb_output} ${inline_texi}
CLEANFILES= \
- refcard.aux refcard.dvi refcard.log refcard.pdf refcard.ps \
- ${pcb_output} ${tab_texi} ${inline_texi} pcb.dvi pcb.html pcb.pdf pcb.ps \
+ refcard.aux refcard.dvi refcard.log refcard.pdf \
+ ${pcb_output} ${tab_texi} ${inline_texi} pcb.dvi pcb.html pcb.pdf \
${images_output}
else
BUILT_SOURCES=
@@ -117,7 +105,6 @@ pcb_files= \
gcode.pcb
pcb_output_noinst= \
- ${pcb_files:.pcb=.eps} \
${pcb_files:.pcb=.pdf}
pcb_output_inst= \
@@ -150,7 +137,7 @@ else
@echo "Skipping documentation extraction since you are not building from GIT sources"
endif
-SUFFIXES = .dvi .eps .pcb .pdf .png .ps .tab .tex
+SUFFIXES = .dvi .eps .pcb .pdf .png .tab .tex
.pcb.eps :
${PCB} -x eps --only-visible --font-path $(top_srcdir)/src --eps-file $@ $<
@@ -171,28 +158,6 @@ endif
.tab.texi:
${ASCII2TEXI} $< > $@
-.tex.dvi:
-if MISSING_LATEX
- @echo "****************************************************"
- @echo "WARNING: LaTeX is missing on your system but"
- @echo "$@ is out of date and needs to rebuilt."
- @echo "Changes to $< will be ignored"
-else
- ${LATEX} $<
- ${LATEX} $<
- ${LATEX} $<
-endif
-
-.dvi.ps:
-if MISSING_DVIPS
- @echo "****************************************************"
- @echo "WARNING: dvips is missing on your system but"
- @echo "$@ is out of date and needs to rebuilt."
- @echo "Changes to $< will be ignored"
-else
- ${DVIPS} -Ppdf -j0 -D 300 -o $@ $<
-endif
-
.tex.pdf:
if MISSING_PDFLATEX
@echo "****************************************************"
diff --git a/doc/gs/Makefile.inc b/doc/gs/Makefile.inc
index 5b5a013..96e42bd 100644
--- a/doc/gs/Makefile.inc
+++ b/doc/gs/Makefile.inc
@@ -38,10 +38,9 @@ info_TEXINFOS= ${BASE}.texi
# which can have all sorts of issues.
-dist_pkgdata_DATA= ${html_docs} ${ps_docs} ${pdf_docs} ${pcb_output}
+dist_pkgdata_DATA= ${html_docs} ${pdf_docs} ${pcb_output}
html_docs= ${info_TEXINFOS:.texi=.html}
-ps_docs= ${info_TEXINFOS:.texi=.ps}
pdf_docs= ${info_TEXINFOS:.texi=.pdf}
dvi_docs= ${info_TEXINFOS:.texi=.dvi}
@@ -93,7 +92,6 @@ EXTRA_DIST= \
CLEANFILES = \
${html_docs} \
- ${ps_docs} \
${pdf_docs} \
${eps_files} \
${png_files} \
@@ -103,8 +101,8 @@ CLEANFILES = \
if GIT_VERSION
BUILT_SOURCES= ${tab_texi} ${pcb_output} ${inline_texi}
CLEANFILES+= \
- refcard.aux refcard.dvi refcard.log refcard.pdf refcard.ps \
- ${pcb_output} ${tab_texi} ${inline_texi} pcb.dvi pcb.html pcb.pdf pcb.ps
+ refcard.aux refcard.dvi refcard.log refcard.pdf \
+ ${pcb_output} ${tab_texi} ${inline_texi} pcb.dvi pcb.html pcb.pdf
else
BUILT_SOURCES=
@@ -117,7 +115,7 @@ pcb_output= \
${pcb_files:.pcb=.pdf} \
${pcb_files:.pcb=.png}
-SUFFIXES = .dvi .eps .pcb .pdf .png .ps .tab .tex
+SUFFIXES = .dvi .eps .pcb .pdf .png .tab .tex
%.png %.eps : %.pcb
$(PCB) -x eps --font-path $(top_srcdir)/src --eps-file $*.eps $<
@@ -162,28 +160,6 @@ endif
.tab.texi:
${ASCII2TEXI} $< > $@
-.tex.dvi:
-if MISSING_LATEX
- @echo "****************************************************"
- @echo "WARNING: LaTeX is missing on your system but"
- @echo "$@ is out of date and needs to rebuilt."
- @echo "Changes to $< will be ignored"
-else
- ${LATEX} $<
- ${LATEX} $<
- ${LATEX} $<
-endif
-
-.dvi.ps:
-if MISSING_DVIPS
- @echo "****************************************************"
- @echo "WARNING: dvips is missing on your system but"
- @echo "$@ is out of date and needs to rebuilt."
- @echo "Changes to $< will be ignored"
-else
- ${DVIPS} -Ppdf -j0 -D 300 -o $@ $<
-endif
-
.tex.pdf:
if MISSING_PDFLATEX
@echo "****************************************************"
commit bcad6aca51462aa9217d3c215fbe8f20e3d9a204
Author: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
doc: skip generation of GIF images
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 0432a5b..d4955b2 100755
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -121,7 +121,6 @@ pcb_output_noinst= \
${pcb_files:.pcb=.pdf}
pcb_output_inst= \
- ${pcb_files:.pcb=.gif} \
${pcb_files:.pcb=.png}
pcb_output= ${pcb_output_inst} ${pcb_output_noinst}
@@ -151,14 +150,11 @@ else
@echo "Skipping documentation extraction since you are not building from GIT sources"
endif
-SUFFIXES = .dvi .eps .gif .pcb .pdf .png .ps .tab .tex
+SUFFIXES = .dvi .eps .pcb .pdf .png .ps .tab .tex
.pcb.eps :
${PCB} -x eps --only-visible --font-path $(top_srcdir)/src --eps-file $@ $<
-.pcb.gif :
- ${PCB} -x png --only-visible --format GIF --font-path $(top_srcdir)/src --outfile $@ $<
-
.pcb.png :
${PCB} -x png --only-visible --font-path $(top_srcdir)/src --outfile $@ $<
@@ -211,6 +207,3 @@ endif
.eps.png:
${PERL} eps2png --png $< > $@
-
-.eps.gif:
- ${PERL} eps2png --gif $< > $@
diff --git a/doc/gs/Makefile.inc b/doc/gs/Makefile.inc
index 8817a7c..5b5a013 100644
--- a/doc/gs/Makefile.inc
+++ b/doc/gs/Makefile.inc
@@ -117,7 +117,7 @@ pcb_output= \
${pcb_files:.pcb=.pdf} \
${pcb_files:.pcb=.png}
-SUFFIXES = .dvi .eps .gif .pcb .pdf .png .ps .tab .tex
+SUFFIXES = .dvi .eps .pcb .pdf .png .ps .tab .tex
%.png %.eps : %.pcb
$(PCB) -x eps --font-path $(top_srcdir)/src --eps-file $*.eps $<
|
|
From: <gi...@gp...> - 2011-06-03 21:45:01
|
The branch, master has been updated
via 750a1c57d85dbb82d704f9443055a783b5dca8eb (commit)
from 074f68e08ef5a70b6c99d5a08080727326197bc0 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/file.h | 2 +-
src/parse_l.l | 58 +++++------
src/parse_y.y | 318 +++++++++++++++++++++++++++++----------------------------
3 files changed, 188 insertions(+), 190 deletions(-)
=================
Commit Messages
=================
commit 750a1c57d85dbb82d704f9443055a783b5dca8eb
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Add support for reading unit suffixes in parser
Bumped PCB_FILE_VERSION up to 20110703.
Removed old unit-reading code from parse_l.l since
it was missing several units that we plan to support,
and the scaling was backward for non-base units.
Also, we now read all numbers as doubles, except those
that need integers (array indices and flags, mainly).
All measurements are round()ed to ints, after scaling,
since that's what BDimension is and we don't want
anomalies.
The old NUMBER and FLOAT terminals in parse_y have been
replaced by:
1. INTEGER - an integer, unscaled
2. number - floating or integer, unscaled
3. measure - a (possibly suffixed) measurement, with
non-suffixed measurements read in cmils
4. oldmeasue - non-suffixed measurement, read in mils
One exception is the PolyArea[] field. This is still
read in cmil^2 until we figure out what to do with it.
This way the parser works independently of PCB's internal
base units, and supports umil, cmil, mil, in, nm, um, mm,
m and km unit suffixes. The parsing code should also be
clearer now since not everything is NUMBER, with scale
factors handled after-the-fact with /100's or in the lexer.
Additionally, we now allow floating-point values for all
measurements (even old-style mil fields), and pcb will
allow spaces between measurements and their suffixes.
Actually using these ``features'' will probably break
tools that read .pcb files, though.
:100644 100644 d36fdfa... a2f7859... M src/file.h
:100644 100644 0898abf... 9ebb8e2... M src/parse_l.l
:100644 100644 5290b53... 05f0a49... M src/parse_y.y
=========
Changes
=========
commit 750a1c57d85dbb82d704f9443055a783b5dca8eb
Author: Andrew Poelstra <as...@sf...>
Commit: Andrew Poelstra <as...@sf...>
Add support for reading unit suffixes in parser
Bumped PCB_FILE_VERSION up to 20110703.
Removed old unit-reading code from parse_l.l since
it was missing several units that we plan to support,
and the scaling was backward for non-base units.
Also, we now read all numbers as doubles, except those
that need integers (array indices and flags, mainly).
All measurements are round()ed to ints, after scaling,
since that's what BDimension is and we don't want
anomalies.
The old NUMBER and FLOAT terminals in parse_y have been
replaced by:
1. INTEGER - an integer, unscaled
2. number - floating or integer, unscaled
3. measure - a (possibly suffixed) measurement, with
non-suffixed measurements read in cmils
4. oldmeasue - non-suffixed measurement, read in mils
One exception is the PolyArea[] field. This is still
read in cmil^2 until we figure out what to do with it.
This way the parser works independently of PCB's internal
base units, and supports umil, cmil, mil, in, nm, um, mm,
m and km unit suffixes. The parsing code should also be
clearer now since not everything is NUMBER, with scale
factors handled after-the-fact with /100's or in the lexer.
Additionally, we now allow floating-point values for all
measurements (even old-style mil fields), and pcb will
allow spaces between measurements and their suffixes.
Actually using these ``features'' will probably break
tools that read .pcb files, though.
diff --git a/src/file.h b/src/file.h
index d36fdfa..a2f7859 100644
--- a/src/file.h
+++ b/src/file.h
@@ -61,7 +61,7 @@ void sort_netlist (void);
int PCBFileVersionNeeded (void);
/* This is the version we support. */
-#define PCB_FILE_VERSION 20100606
+#define PCB_FILE_VERSION 20110603
#ifndef HAS_ATEXIT
diff --git a/src/parse_l.l b/src/parse_l.l
index 0898abf..9ebb8e2 100644
--- a/src/parse_l.l
+++ b/src/parse_l.l
@@ -79,7 +79,7 @@ DataTypePtr yyData;
ElementTypePtr yyElement;
FontTypePtr yyFont;
-static int parse_number (double);
+static int parse_number (void);
/* ---------------------------------------------------------------------------
* an external prototypes
@@ -94,13 +94,8 @@ static int Parse(char *, char *, char *, char *);
%}
HEX 0x[0-9a-fA-F]+
-DECIMAL -?[1-9][0-9]*|0
-FLOATING [+-]?[0-9]*("."[0-9]*)?
-FLOATINGMM {FLOATING}mm
-FLOATINGUM {FLOATING}um
-FLOATINGIN {FLOATING}in
-FLOATINGMIL {FLOATING}mil
-CARDINAL [1-9][0-9]*|0
+INTEGER [+-]?([1-9][0-9]*|0)
+FLOATING {INTEGER}"."[0-9]*
STRINGCHAR ([^"\n\r\\]|\\.)
%option yylineno
@@ -139,23 +134,27 @@ Net { return(T_NET); }
Connect { return(T_CONN); }
Attribute { return(T_ATTRIBUTE); }
+nm { return T_NM; }
+um { return T_UM; }
+mm { return T_MM; }
+m { return T_M; }
+km { return T_KM; }
+umil { return T_UMIL; }
+cmil { return T_CMIL; }
+mil { return T_MIL; }
+in { return T_IN; }
+
\'.\' {
- yylval.number = (unsigned) *(yytext+1);
+ yylval.integer = (unsigned) *(yytext+1);
return(CHAR_CONST);
}
-{FLOATINGMM} { return parse_number(MM_TO_COORD(1)); }
-{FLOATINGUM} { return parse_number(MM_TO_COORD(1) * 1000); }
-{FLOATINGIN} { return parse_number(INCH_TO_COORD(1)); }
-{FLOATINGMIL} { return parse_number(MIL_TO_COORD(1)); }
-{DECIMAL} { return parse_number(1.0); }
-
-{HEX} {
- sscanf((char *) yytext, "%x", &yylval.number);
- return(NUMBER);
- }
-{FLOATING} {
- yylval.floating = c_strtod (yytext);
- return(FLOAT);
+{FLOATING} { return parse_number(); }
+{INTEGER} { yylval.integer = round (g_ascii_strtod (yytext, NULL)); return INTEGER; }
+
+{HEX} { unsigned n;
+ sscanf((char *) yytext, "%x", &n);
+ yylval.integer = n;
+ return INTEGER;
}
\"{STRINGCHAR}*\" {
char *p1, *p2;
@@ -368,16 +367,9 @@ int ParseFont(FontTypePtr Ptr, char *Filename)
}
static int
-parse_number (double scale)
+parse_number ()
{
- double val;
- sscanf ((char *) yytext, "%lf", &val);
- val *= scale;
- /* Round towards nearest means we have to check the sign first. */
- if (val < 0)
- val -= 0.49;
- else
- val += 0.49;
- yylval.number = (int)(val);
- return NUMBER;
+ yylval.number = g_ascii_strtod ((gchar *) yytext, NULL);
+ return FLOATING;
}
+
diff --git a/src/parse_y.y b/src/parse_y.y
index 5290b53..05f0a49 100644
--- a/src/parse_y.y
+++ b/src/parse_y.y
@@ -90,23 +90,27 @@ static int check_file_version (int);
%union /* define YYSTACK type */
{
- int number;
- float floating;
+ int integer;
+ double number;
char *string;
FlagType flagtype;
}
-%token <number> NUMBER CHAR_CONST /* line thickness, coordinates ... */
-%token <floating> FLOAT
-%token <string> STRING /* element names ... */
+%token <number> FLOATING /* line thickness, coordinates ... */
+%token <integer> INTEGER CHAR_CONST /* flags ... */
+%token <string> STRING /* element names ... */
%token T_FILEVERSION T_PCB T_LAYER T_VIA T_RAT T_LINE T_ARC T_RECTANGLE T_TEXT T_ELEMENTLINE
%token T_ELEMENT T_PIN T_PAD T_GRID T_FLAGS T_SYMBOL T_SYMBOLLINE T_CURSOR
%token T_ELEMENTARC T_MARK T_GROUPS T_STYLES T_POLYGON T_POLYGON_HOLE T_NETLIST T_NET T_CONN
%token T_AREA T_THERMAL T_DRC T_ATTRIBUTE
-%type <number> symbolid
+%token T_UMIL T_CMIL T_MIL T_IN T_NM T_UM T_MM T_M T_KM
+%type <integer> symbolid
%type <string> opt_string
%type <flagtype> flags
+%type <number> number
+%type <number> measure
+%type <number> oldmeasure
%%
@@ -270,7 +274,7 @@ in the input file then file format compatibility is not checked.
pcbfileversion
: |
-T_FILEVERSION '[' NUMBER ']'
+T_FILEVERSION '[' INTEGER ']'
{
if (check_file_version ($3) != 0)
{
@@ -306,13 +310,13 @@ pcbname
yyPCB->MaxWidth = MAX_COORD;
yyPCB->MaxHeight = MAX_COORD;
}
- | T_PCB '(' STRING NUMBER NUMBER ')'
+ | T_PCB '(' STRING oldmeasure oldmeasure ')'
{
yyPCB->Name = $3;
- yyPCB->MaxWidth = $4*100;
- yyPCB->MaxHeight = $5*100;
+ yyPCB->MaxWidth = $4;
+ yyPCB->MaxHeight = $5;
}
- | T_PCB '[' STRING NUMBER NUMBER ']'
+ | T_PCB '[' STRING measure measure ']'
{
yyPCB->Name = $3;
yyPCB->MaxWidth = $4;
@@ -343,23 +347,22 @@ If non-zero, the grid will be visible on the screen.
pcbgrid
: pcbgridold
| pcbgridnew
- | pcb2grid
| pcbhigrid
;
pcbgridold
- : T_GRID '(' NUMBER NUMBER NUMBER ')'
+ : T_GRID '(' oldmeasure oldmeasure oldmeasure ')'
{
- yyPCB->Grid = $3*100;
- yyPCB->GridOffsetX = $4*100;
- yyPCB->GridOffsetY = $5*100;
+ yyPCB->Grid = $3;
+ yyPCB->GridOffsetX = $4;
+ yyPCB->GridOffsetY = $5;
}
;
pcbgridnew
- : T_GRID '(' NUMBER NUMBER NUMBER NUMBER ')'
+ : T_GRID '(' oldmeasure oldmeasure oldmeasure INTEGER ')'
{
- yyPCB->Grid = $3*100;
- yyPCB->GridOffsetX = $4*100;
- yyPCB->GridOffsetY = $5*100;
+ yyPCB->Grid = $3;
+ yyPCB->GridOffsetX = $4;
+ yyPCB->GridOffsetY = $5;
if ($6)
Settings.DrawGrid = true;
else
@@ -367,20 +370,8 @@ pcbgridnew
}
;
-pcb2grid
- : T_GRID '(' FLOAT NUMBER NUMBER NUMBER ')'
- {
- yyPCB->Grid = $3*100;
- yyPCB->GridOffsetX = $4*100;
- yyPCB->GridOffsetY = $5*100;
- if ($6)
- Settings.DrawGrid = true;
- else
- Settings.DrawGrid = false;
- }
- ;
pcbhigrid
- : T_GRID '[' FLOAT NUMBER NUMBER NUMBER ']'
+ : T_GRID '[' measure measure measure INTEGER ']'
{
yyPCB->Grid = $3;
yyPCB->GridOffsetX = $4;
@@ -412,19 +403,13 @@ first variant accepts floating point numbers. The special value
%end-doc */
pcbcursor
- : T_CURSOR '(' NUMBER NUMBER NUMBER ')'
- {
- yyPCB->CursorX = $3*100;
- yyPCB->CursorY = $4*100;
- yyPCB->Zoom = $5*2;
- }
- | T_CURSOR '[' NUMBER NUMBER NUMBER ']'
+ : T_CURSOR '(' oldmeasure oldmeasure number ')'
{
yyPCB->CursorX = $3;
yyPCB->CursorY = $4;
- yyPCB->Zoom = $5;
+ yyPCB->Zoom = $5*2;
}
- | T_CURSOR '[' NUMBER NUMBER FLOAT ']'
+ | T_CURSOR '[' measure measure number ']'
{
yyPCB->CursorX = $3;
yyPCB->CursorY = $4;
@@ -448,9 +433,10 @@ Minimum area of polygon island to retain. If a polygon has clearances that cause
polyarea
:
- | T_AREA '[' FLOAT ']'
+ | T_AREA '[' number ']'
{
- yyPCB->IsleArea = $3;
+ /* Read in cmil^2 for now; in future this should be a noop. */
+ yyPCB->IsleArea = MIL_TO_COORD (MIL_TO_COORD ($3) / 100.0) / 100.0;
}
;
@@ -474,7 +460,7 @@ the same as the clearance gap width.
pcbthermal
:
- | T_THERMAL '[' FLOAT ']'
+ | T_THERMAL '[' number ']'
{
yyPCB->ThermScale = $3;
}
@@ -513,7 +499,7 @@ pcbdrc
;
pcbdrc1
- : T_DRC '[' NUMBER NUMBER NUMBER ']'
+ : T_DRC '[' measure measure measure ']'
{
yyPCB->Bloat = $3;
yyPCB->Shrink = $4;
@@ -523,7 +509,7 @@ pcbdrc1
;
pcbdrc2
- : T_DRC '[' NUMBER NUMBER NUMBER NUMBER ']'
+ : T_DRC '[' measure measure measure measure ']'
{
yyPCB->Bloat = $3;
yyPCB->Shrink = $4;
@@ -534,7 +520,7 @@ pcbdrc2
;
pcbdrc3
- : T_DRC '[' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER ']'
+ : T_DRC '[' measure measure measure measure measure measure ']'
{
yyPCB->Bloat = $3;
yyPCB->Shrink = $4;
@@ -561,7 +547,7 @@ represent pcb-wide flags as defined in @ref{PCBFlags}.
%end-doc */
pcbflags
- : T_FLAGS '(' NUMBER ')'
+ : T_FLAGS '(' INTEGER ')'
{
yyPCB->Flags = MakeFlags ($3 & PCB_FLAGS);
}
@@ -731,7 +717,7 @@ numerical flags only
via_hi_format
/* x, y, thickness, clearance, mask, drilling-hole, name, flags */
- : T_VIA '[' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER STRING flags ']'
+ : T_VIA '[' measure measure measure measure measure measure STRING flags ']'
{
CreateNewVia(yyData, $3, $4, $5, $6, $7, $8, $9, $10);
free ($9);
@@ -740,10 +726,9 @@ via_hi_format
via_2.0_format
/* x, y, thickness, clearance, mask, drilling-hole, name, flags */
- : T_VIA '(' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER STRING NUMBER ')'
+ : T_VIA '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
{
- CreateNewVia(yyData, $3*100, $4*100, $5*100, $6*100, $7*100, $8*100, $9,
- OldFlags($10));
+ CreateNewVia(yyData, $3, $4, $5, $6, $7, $8, $9, OldFlags($10));
free ($9);
}
;
@@ -751,27 +736,27 @@ via_2.0_format
via_1.7_format
/* x, y, thickness, clearance, drilling-hole, name, flags */
- : T_VIA '(' NUMBER NUMBER NUMBER NUMBER NUMBER STRING NUMBER ')'
+ : T_VIA '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
{
- CreateNewVia(yyData, $3*100, $4*100, $5*100, $6*100,
- ($5 + $6)*100, $7*100, $8, OldFlags($9));
+ CreateNewVia(yyData, $3, $4, $5, $6,
+ ($5 + $6), $7, $8, OldFlags($9));
free ($8);
}
;
via_newformat
/* x, y, thickness, drilling-hole, name, flags */
- : T_VIA '(' NUMBER NUMBER NUMBER NUMBER STRING NUMBER ')'
+ : T_VIA '(' oldmeasure oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
{
- CreateNewVia(yyData, $3*100, $4*100, $5*100, 200*GROUNDPLANEFRAME,
- ($5 + 2*MASKFRAME)*100, $6*100, $7, OldFlags($8));
+ CreateNewVia(yyData, $3, $4, $5, 200*GROUNDPLANEFRAME,
+ $5 + 200*MASKFRAME, $6, $7, OldFlags($8));
free ($7);
}
;
via_oldformat
/* old format: x, y, thickness, name, flags */
- : T_VIA '(' NUMBER NUMBER NUMBER STRING NUMBER ')'
+ : T_VIA '(' oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
{
BDimension hole = ($5 *DEFAULT_DRILLINGHOLE);
@@ -780,8 +765,8 @@ via_oldformat
$5 > MIN_PINORVIACOPPER)
hole = $5 -MIN_PINORVIACOPPER;
- CreateNewVia(yyData, $3*100, $4*100, $5*100, 200*GROUNDPLANEFRAME,
- ($5 + 2*MASKFRAME)*100, hole, $6, OldFlags($7));
+ CreateNewVia(yyData, $3, $4, $5, 200*GROUNDPLANEFRAME,
+ $5 + 200*MASKFRAME, hole, $6, OldFlags($7));
free ($6);
}
;
@@ -807,14 +792,14 @@ Numeric flags.
%end-doc */
rats
- : T_RAT '[' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER flags ']'
+ : T_RAT '[' measure measure INTEGER measure measure INTEGER flags ']'
{
CreateNewRat(yyData, $3, $4, $6, $7, $5, $8,
Settings.RatThickness, $9);
}
- | T_RAT '(' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER ')'
+ | T_RAT '(' oldmeasure oldmeasure INTEGER oldmeasure oldmeasure INTEGER INTEGER ')'
{
- CreateNewRat(yyData, $3*100, $4*100, $6*100, $7*100, $5, $8,
+ CreateNewRat(yyData, $3, $4, $6, $7, $5, $8,
Settings.RatThickness, OldFlags($9));
}
;
@@ -843,7 +828,7 @@ text, and polygons.
layer
/* name */
- : T_LAYER '(' NUMBER STRING opt_string ')' '('
+ : T_LAYER '(' INTEGER STRING opt_string ')' '('
{
if ($3 <= 0 || $3 > MAX_LAYER + 2)
{
@@ -884,10 +869,10 @@ layerdefinition
| arc_1.7_format
| arc_oldformat
/* x1, y1, x2, y2, flags */
- | T_RECTANGLE '(' NUMBER NUMBER NUMBER NUMBER NUMBER ')'
+ | T_RECTANGLE '(' oldmeasure oldmeasure oldmeasure oldmeasure INTEGER ')'
{
CreateNewPolygonFromRectangle(Layer,
- $3*100, $4*100, ($3+$5)*100, ($4+$6)*100, OldFlags($7));
+ $3, $4, ($3+$5), ($4+$6), OldFlags($7));
}
| text_hi_format
| text_newformat
@@ -923,7 +908,7 @@ Numeric flags.
line_hi_format
/* x1, y1, x2, y2, thickness, clearance, flags */
- : T_LINE '[' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER flags ']'
+ : T_LINE '[' measure measure measure measure measure measure flags ']'
{
CreateNewLineOnLayer(Layer, $3, $4, $5, $6, $7, $8, $9);
}
@@ -931,20 +916,20 @@ line_hi_format
line_1.7_format
/* x1, y1, x2, y2, thickness, clearance, flags */
- : T_LINE '(' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER ')'
+ : T_LINE '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure INTEGER ')'
{
- CreateNewLineOnLayer(Layer, $3*100, $4*100, $5*100, $6*100,
- $7*100, $8*100, OldFlags($9));
+ CreateNewLineOnLayer(Layer, $3, $4, $5, $6,
+ $7, $8, OldFlags($9));
}
;
line_oldformat
/* x1, y1, x2, y2, thickness, flags */
- : T_LINE '(' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER ')'
+ : T_LINE '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure INTEGER ')'
{
/* eliminate old-style rat-lines */
if (($8 & RATFLAG) == 0)
- CreateNewLineOnLayer(Layer, $3*100, $4*100, $5*100, $6*100, $7*100,
+ CreateNewLineOnLayer(Layer, $3, $4, $5, $6, $7,
200*GROUNDPLANEFRAME, OldFlags($8));
}
;
@@ -988,7 +973,7 @@ Numeric flags.
arc_hi_format
/* x, y, width, height, thickness, clearance, startangle, delta, flags */
- : T_ARC '[' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER flags ']'
+ : T_ARC '[' measure measure measure measure measure measure number number flags ']'
{
CreateNewArcOnLayer(Layer, $3, $4, $5, $6, $9, $10, $7, $8, $11);
}
@@ -996,19 +981,19 @@ arc_hi_format
arc_1.7_format
/* x, y, width, height, thickness, clearance, startangle, delta, flags */
- : T_ARC '(' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER ')'
+ : T_ARC '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure number number INTEGER ')'
{
- CreateNewArcOnLayer(Layer, $3*100, $4*100, $5*100, $6*100, $9, $10,
- $7*100, $8*100, OldFlags($11));
+ CreateNewArcOnLayer(Layer, $3, $4, $5, $6, $9, $10,
+ $7, $8, OldFlags($11));
}
;
arc_oldformat
/* x, y, width, height, thickness, startangle, delta, flags */
- : T_ARC '(' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER ')'
+ : T_ARC '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure number number INTEGER ')'
{
- CreateNewArcOnLayer(Layer, $3*100, $4*100, $5*100, $5*100, $8, $9,
- $7*100, 200*GROUNDPLANEFRAME, OldFlags($10));
+ CreateNewArcOnLayer(Layer, $3, $4, $5, $5, $8, $9,
+ $7, 200*GROUNDPLANEFRAME, OldFlags($10));
}
;
@@ -1042,35 +1027,33 @@ Numeric flags.
text_oldformat
/* x, y, direction, text, flags */
- : T_TEXT '(' NUMBER NUMBER NUMBER STRING NUMBER ')'
+ : T_TEXT '(' oldmeasure oldmeasure number STRING INTEGER ')'
{
/* use a default scale of 100% */
- CreateNewText(Layer,yyFont,$3*100, $4*100, $5, 100, $6, OldFlags($7));
+ CreateNewText(Layer,yyFont,$3, $4, $5, 100, $6, OldFlags($7));
free ($6);
}
;
text_newformat
/* x, y, direction, scale, text, flags */
- : T_TEXT '(' NUMBER NUMBER NUMBER NUMBER STRING NUMBER ')'
+ : T_TEXT '(' oldmeasure oldmeasure number number STRING INTEGER ')'
{
if ($8 & ONSILKFLAG)
{
LayerTypePtr lay = &yyData->Layer[yyData->LayerN +
(($8 & ONSOLDERFLAG) ? SOLDER_LAYER : COMPONENT_LAYER)];
- CreateNewText(lay ,yyFont, $3*100, $4*100, $5, $6, $7,
- OldFlags($8));
+ CreateNewText(lay ,yyFont, $3, $4, $5, $6, $7, OldFlags($8));
}
else
- CreateNewText(Layer, yyFont, $3*100, $4*100, $5, $6, $7,
- OldFlags($8));
+ CreateNewText(Layer, yyFont, $3, $4, $5, $6, $7, OldFlags($8));
free ($7);
}
;
text_hi_format
/* x, y, direction, scale, text, flags */
- : T_TEXT '[' NUMBER NUMBER NUMBER NUMBER STRING flags ']'
+ : T_TEXT '[' measure measure number number STRING flags ']'
{
/* FIXME: shouldn't know about .f */
/* I don't think this matters because anything with hi_format
@@ -1179,11 +1162,11 @@ polygonpoints
polygonpoint
/* xcoord ycoord */
- : '(' NUMBER NUMBER ')'
+ : '(' oldmeasure oldmeasure ')'
{
- CreateNewPointInPolygon(Polygon, $2*100, $3*100);
+ CreateNewPointInPolygon(Polygon, $2, $3);
}
- | '[' NUMBER NUMBER ']'
+ | '[' measure measure ']'
{
CreateNewPointInPolygon(Polygon, $2, $3);
}
@@ -1255,10 +1238,10 @@ element_oldformat
/* element_flags, description, pcb-name,
* text_x, text_y, text_direction, text_scale, text_flags
*/
- : T_ELEMENT '(' STRING STRING NUMBER NUMBER NUMBER ')' '('
+ : T_ELEMENT '(' STRING STRING oldmeasure oldmeasure INTEGER ')' '('
{
yyElement = CreateNewElement(yyData, yyElement, yyFont, NoFlags(),
- $3, $4, NULL, $5*100, $6*100, $7, 100, NoFlags(), false);
+ $3, $4, NULL, $5, $6, $7, 100, NoFlags(), false);
free ($3);
free ($4);
pin_num = 1;
@@ -1273,10 +1256,10 @@ element_1.3.4_format
/* element_flags, description, pcb-name,
* text_x, text_y, text_direction, text_scale, text_flags
*/
- : T_ELEMENT '(' NUMBER STRING STRING NUMBER NUMBER NUMBER NUMBER NUMBER ')' '('
+ : T_ELEMENT '(' INTEGER STRING STRING oldmeasure oldmeasure number number INTEGER ')' '('
{
yyElement = CreateNewElement(yyData, yyElement, yyFont, OldFlags($3),
- $4, $5, NULL, $6*100, $7*100, $8, $9, OldFlags($10), false);
+ $4, $5, NULL, $6, $7, $8, $9, OldFlags($10), false);
free ($4);
free ($5);
pin_num = 1;
@@ -1291,10 +1274,10 @@ element_newformat
/* element_flags, description, pcb-name, value,
* text_x, text_y, text_direction, text_scale, text_flags
*/
- : T_ELEMENT '(' NUMBER STRING STRING STRING NUMBER NUMBER NUMBER NUMBER NUMBER ')' '('
+ : T_ELEMENT '(' INTEGER STRING STRING STRING oldmeasure oldmeasure number number INTEGER ')' '('
{
yyElement = CreateNewElement(yyData, yyElement, yyFont, OldFlags($3),
- $4, $5, $6, $7*100, $8*100, $9, $10, OldFlags($11), false);
+ $4, $5, $6, $7, $8, $9, $10, OldFlags($11), false);
free ($4);
free ($5);
free ($6);
@@ -1310,13 +1293,13 @@ element_1.7_format
/* element_flags, description, pcb-name, value, mark_x, mark_y,
* text_x, text_y, text_direction, text_scale, text_flags
*/
- : T_ELEMENT '(' NUMBER STRING STRING STRING NUMBER NUMBER
- NUMBER NUMBER NUMBER NUMBER NUMBER ')' '('
+ : T_ELEMENT '(' INTEGER STRING STRING STRING oldmeasure oldmeasure
+ oldmeasure oldmeasure number number INTEGER ')' '('
{
yyElement = CreateNewElement(yyData, yyElement, yyFont, OldFlags($3),
- $4, $5, $6, ($7+$9)*100, ($8+$10)*100, $11, $12, OldFlags($13), false);
- yyElement->MarkX = $7*100;
- yyElement->MarkY = $8*100;
+ $4, $5, $6, ($7+$9), ($8+$10), $11, $12, OldFlags($13), false);
+ yyElement->MarkX = $7;
+ yyElement->MarkY = $8;
free ($4);
free ($5);
free ($6);
@@ -1331,8 +1314,8 @@ element_hi_format
/* element_flags, description, pcb-name, value, mark_x, mark_y,
* text_x, text_y, text_direction, text_scale, text_flags
*/
- : T_ELEMENT '[' flags STRING STRING STRING NUMBER NUMBER
- NUMBER NUMBER NUMBER NUMBER flags ']' '('
+ : T_ELEMENT '[' flags STRING STRING STRING measure measure
+ measure measure number number flags ']' '('
{
yyElement = CreateNewElement(yyData, yyElement, yyFont, $3,
$4, $5, $6, ($7+$9), ($8+$10), $11, $12, $13, false);
@@ -1422,35 +1405,35 @@ elementdefinition
| pad_newformat
| pad
/* x1, y1, x2, y2, thickness */
- | T_ELEMENTLINE '[' NUMBER NUMBER NUMBER NUMBER NUMBER ']'
+ | T_ELEMENTLINE '[' measure measure measure measure measure ']'
{
CreateNewLineInElement(yyElement, $3, $4, $5, $6, $7);
}
/* x1, y1, x2, y2, thickness */
- | T_ELEMENTLINE '(' NUMBER NUMBER NUMBER NUMBER NUMBER ')'
+ | T_ELEMENTLINE '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure ')'
{
- CreateNewLineInElement(yyElement, $3*100, $4*100, $5*100, $6*100, $7*100);
+ CreateNewLineInElement(yyElement, $3, $4, $5, $6, $7);
}
/* x, y, width, height, startangle, anglediff, thickness */
- | T_ELEMENTARC '[' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER ']'
+ | T_ELEMENTARC '[' measure measure measure measure number number measure ']'
{
CreateNewArcInElement(yyElement, $3, $4, $5, $6, $7, $8, $9);
}
/* x, y, width, height, startangle, anglediff, thickness */
- | T_ELEMENTARC '(' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER ')'
+ | T_ELEMENTARC '(' oldmeasure oldmeasure oldmeasure oldmeasure number number oldmeasure ')'
{
- CreateNewArcInElement(yyElement, $3*100, $4*100, $5*100, $6*100, $7, $8, $9*100);
+ CreateNewArcInElement(yyElement, $3, $4, $5, $6, $7, $8, $9);
}
/* x, y position */
- | T_MARK '[' NUMBER NUMBER ']'
+ | T_MARK '[' measure measure ']'
{
yyElement->MarkX = $3;
yyElement->MarkY = $4;
}
- | T_MARK '(' NUMBER NUMBER ')'
+ | T_MARK '(' oldmeasure oldmeasure ')'
{
- yyElement->MarkX = $3*100;
- yyElement->MarkY = $4*100;
+ yyElement->MarkX = $3;
+ yyElement->MarkY = $4;
}
| { attr_list = & yyElement->Attributes; } attributes
;
@@ -1466,28 +1449,28 @@ relementdef
| pad_1.7_format
| pad_hi_format
/* x1, y1, x2, y2, thickness */
- | T_ELEMENTLINE '[' NUMBER NUMBER NUMBER NUMBER NUMBER ']'
+ | T_ELEMENTLINE '[' measure measure measure measure measure ']'
{
CreateNewLineInElement(yyElement, $3 + yyElement->MarkX,
$4 + yyElement->MarkY, $5 + yyElement->MarkX,
$6 + yyElement->MarkY, $7);
}
- | T_ELEMENTLINE '(' NUMBER NUMBER NUMBER NUMBER NUMBER ')'
+ | T_ELEMENTLINE '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure ')'
{
- CreateNewLineInElement(yyElement, $3*100 + yyElement->MarkX,
- $4*100 + yyElement->MarkY, $5*100 + yyElement->MarkX,
- $6*100 + yyElement->MarkY, $7*100);
+ CreateNewLineInElement(yyElement, $3 + yyElement->MarkX,
+ $4 + yyElement->MarkY, $5 + yyElement->MarkX,
+ $6 + yyElement->MarkY, $7);
}
/* x, y, width, height, startangle, anglediff, thickness */
- | T_ELEMENTARC '[' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER ']'
+ | T_ELEMENTARC '[' measure measure measure measure number number measure ']'
{
CreateNewArcInElement(yyElement, $3 + yyElement->MarkX,
$4 + yyElement->MarkY, $5, $6, $7, $8, $9);
}
- | T_ELEMENTARC '(' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER ')'
+ | T_ELEMENTARC '(' oldmeasure oldmeasure oldmeasure oldmeasure number number oldmeasure ')'
{
- CreateNewArcInElement(yyElement, $3*100 + yyElement->MarkX,
- $4*100 + yyElement->MarkY, $5*100, $6*100, $7, $8, $9*100);
+ CreateNewArcInElement(yyElement, $3 + yyElement->MarkX,
+ $4 + yyElement->MarkY, $5, $6, $7, $8, $9);
}
| { attr_list = & yyElement->Attributes; } attributes
;
@@ -1530,7 +1513,7 @@ numerical flags only
pin_hi_format
/* x, y, thickness, clearance, mask, drilling hole, name,
number, flags */
- : T_PIN '[' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER STRING STRING flags ']'
+ : T_PIN '[' measure measure measure measure measure measure STRING STRING flags ']'
{
CreateNewPin(yyElement, $3 + yyElement->MarkX,
$4 + yyElement->MarkY, $5, $6, $7, $8, $9,
@@ -1542,10 +1525,10 @@ pin_hi_format
pin_1.7_format
/* x, y, thickness, clearance, mask, drilling hole, name,
number, flags */
- : T_PIN '(' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER STRING STRING NUMBER ')'
+ : T_PIN '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure STRING STRING INTEGER ')'
{
- CreateNewPin(yyElement, $3*100 + yyElement->MarkX,
- $4*100 + yyElement->MarkY, $5*100, $6*100, $7*100, $8*100, $9,
+ CreateNewPin(yyElement, $3 + yyElement->MarkX,
+ $4 + yyElement->MarkY, $5, $6, $7, $8, $9,
$10, OldFlags($11));
free ($9);
free ($10);
@@ -1554,10 +1537,10 @@ pin_1.7_format
pin_1.6.3_format
/* x, y, thickness, drilling hole, name, number, flags */
- : T_PIN '(' NUMBER NUMBER NUMBER NUMBER STRING STRING NUMBER ')'
+ : T_PIN '(' oldmeasure oldmeasure oldmeasure oldmeasure STRING STRING INTEGER ')'
{
- CreateNewPin(yyElement, $3*100, $4*100, $5*100, 200*GROUNDPLANEFRAME,
- ($5 + 2*MASKFRAME)*100, $6*100, $7, $8, OldFlags($9));
+ CreateNewPin(yyElement, $3, $4, $5, 200*GROUNDPLANEFRAME,
+ $5 + 200*MASKFRAME, $6, $7, $8, OldFlags($9));
free ($7);
free ($8);
}
@@ -1565,13 +1548,13 @@ pin_1.6.3_format
pin_newformat
/* x, y, thickness, drilling hole, name, flags */
- : T_PIN '(' NUMBER NUMBER NUMBER NUMBER STRING NUMBER ')'
+ : T_PIN '(' oldmeasure oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
{
char p_number[8];
sprintf(p_number, "%d", pin_num++);
- CreateNewPin(yyElement, $3*100, $4*100, $5*100, 200*GROUNDPLANEFRAME,
- ($5 + 2*MASKFRAME)*100, $6*100, $7, p_number, OldFlags($8));
+ CreateNewPin(yyElement, $3, $4, $5, 200*GROUNDPLANEFRAME,
+ $5 + 200*MASKFRAME, $6, $7, p_number, OldFlags($8));
free ($7);
}
@@ -1581,7 +1564,7 @@ pin_oldformat
/* old format: x, y, thickness, name, flags
* drilling hole is 40% of the diameter
*/
- : T_PIN '(' NUMBER NUMBER NUMBER STRING NUMBER ')'
+ : T_PIN '(' oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
{
BDimension hole = ($5 *DEFAULT_DRILLINGHOLE);
char p_number[8];
@@ -1592,8 +1575,8 @@ pin_oldformat
hole = $5 -MIN_PINORVIACOPPER;
sprintf(p_number, "%d", pin_num++);
- CreateNewPin(yyElement, $3*100, $4*100, $5*100, 200*GROUNDPLANEFRAME,
- ($5 + 2*MASKFRAME)*100, hole, $6, p_number, OldFlags($7));
+ CreateNewPin(yyElement, $3, $4, $5, 200*GROUNDPLANEFRAME,
+ $5 + 200*MASKFRAME, hole, $6, p_number, OldFlags($7));
free ($6);
}
;
@@ -1635,7 +1618,7 @@ numerical flags only
pad_hi_format
/* x1, y1, x2, y2, thickness, clearance, mask, name , pad number, flags */
- : T_PAD '[' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER STRING STRING flags ']'
+ : T_PAD '[' measure measure measure measure measure measure measure STRING STRING flags ']'
{
CreateNewPad(yyElement, $3 + yyElement->MarkX,
$4 + yyElement->MarkY,
@@ -1649,11 +1632,11 @@ pad_hi_format
pad_1.7_format
/* x1, y1, x2, y2, thickness, clearance, mask, name , pad number, flags */
- : T_PAD '(' NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER STRING STRING NUMBER ')'
+ : T_PAD '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure STRING STRING INTEGER ')'
{
- CreateNewPad(yyElement,$3*100 + yyElement->MarkX,
- $4*100 + yyElement->MarkY, $5*100 + yyElement->MarkX,
- $6*100 + yyElement->MarkY, $7*100, $8*100, $9*100,
+ CreateNewPad(yyElement,$3 + yyElement->MarkX,
+ $4 + yyElement->MarkY, $5 + yyElement->MarkX,
+ $6 + yyElement->MarkY, $7, $8, $9,
$10, $11, OldFlags($12));
free ($10);
free ($11);
@@ -1662,10 +1645,10 @@ pad_1.7_format
pad_newformat
/* x1, y1, x2, y2, thickness, name , pad number, flags */
- : T_PAD '(' NUMBER NUMBER NUMBER NUMBER NUMBER STRING STRING NUMBER ')'
+ : T_PAD '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure STRING STRING INTEGER ')'
{
- CreateNewPad(yyElement,$3*100,$4*100,$5*100,$6*100,$7*100, 200*GROUNDPLANEFRAME,
- ($7 + 2*MASKFRAME)*100, $8,$9, OldFlags($10));
+ CreateNewPad(yyElement,$3,$4,$5,$6,$7, 200*GROUNDPLANEFRAME,
+ $7 + 200*MASKFRAME, $8,$9, OldFlags($10));
free ($8);
free ($9);
}
@@ -1673,18 +1656,18 @@ pad_newformat
pad
/* x1, y1, x2, y2, thickness, name and flags */
- : T_PAD '(' NUMBER NUMBER NUMBER NUMBER NUMBER STRING NUMBER ')'
+ : T_PAD '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure STRING INTEGER ')'
{
char p_number[8];
sprintf(p_number, "%d", pin_num++);
- CreateNewPad(yyElement,$3*100,$4*100,$5*100,$6*100,$7*100, 200*GROUNDPLANEFRAME,
- ($7 + 2*MASKFRAME)*100, $8,p_number, OldFlags($9));
+ CreateNewPad(yyElement,$3,$4,$5,$6,$7, 200*GROUNDPLANEFRAME,
+ $7 + 200*MASKFRAME, $8,p_number, OldFlags($9));
free ($8);
}
;
-flags : NUMBER { $$ = OldFlags($1); }
+flags : INTEGER { $$ = OldFlags($1); }
| STRING { $$ = string_to_flags ($1, yyerror); }
;
@@ -1713,7 +1696,7 @@ Additional space to allow after this character.
%end-doc */
symbol
- : T_SYMBOL '[' symbolid NUMBER ']' '('
+ : T_SYMBOL '[' symbolid measure ']' '('
{
if ($3 <= 0 || $3 > MAX_FONTPOSITION)
{
@@ -1730,7 +1713,7 @@ symbol
Symbol->Delta = $4;
}
symboldata ')'
- | T_SYMBOL '(' symbolid NUMBER ')' '('
+ | T_SYMBOL '(' symbolid oldmeasure ')' '('
{
if ($3 <= 0 || $3 > MAX_FONTPOSITION)
{
@@ -1744,13 +1727,13 @@ symbol
YYABORT;
}
Symbol->Valid = true;
- Symbol->Delta = $4*100;
+ Symbol->Delta = $4;
}
symboldata ')'
;
symbolid
- : NUMBER
+ : INTEGER
| CHAR_CONST
;
@@ -1783,14 +1766,14 @@ The width of this line.
symboldefinition
/* x1, y1, x2, y2, thickness */
- : T_SYMBOLLINE '(' NUMBER NUMBER NUMBER NUMBER NUMBER ')'
+ : T_SYMBOLLINE '(' oldmeasure oldmeasure oldmeasure oldmeasure oldmeasure ')'
{
- CreateNewLineInSymbol(Symbol, $3*100, $4*100, $5*100, $6*100, $7*100);
+ CreateNewLineInSymbol(Symbol, $3, $4, $5, $6, $7);
}
;
hiressymbol
/* x1, y1, x2, y2, thickness */
- : T_SYMBOLLINE '[' NUMBER NUMBER NUMBER NUMBER NUMBER ']'
+ : T_SYMBOLLINE '[' measure measure measure measure measure ']'
{
CreateNewLineInSymbol(Symbol, $3, $4, $5, $6, $7);
}
@@ -1924,6 +1907,29 @@ opt_string : STRING { $$ = $1; }
| /* empty */ { $$ = 0; }
;
+number
+ : FLOATING { $$ = $1; }
+ | INTEGER { $$ = $1; }
+ ;
+
+measure
+ /* Default unit (no suffix) is cmil */
+ : number { $$ = round (MIL_TO_COORD ($1) / 100.0); }
+ | number T_UMIL { $$ = round (MIL_TO_COORD ($1) / 100000.0); }
+ | number T_CMIL { $$ = round (MIL_TO_COORD ($1) / 100.0); }
+ | number T_MIL { $$ = round (MIL_TO_COORD ($1)); }
+ | number T_IN { $$ = round (INCH_TO_COORD ($1)); }
+ | number T_NM { $$ = round (MM_TO_COORD ($1) / 1000000.0); }
+ | number T_UM { $$ = round (MM_TO_COORD ($1) / 1000.0); }
+ | number T_MM { $$ = round (MM_TO_COORD ($1)); }
+ | number T_M { $$ = round (MM_TO_COORD ($1) * 1000.0); }
+ | number T_KM { $$ = round (MM_TO_COORD ($1) * 1000000.0); }
+ ;
+
+oldmeasure
+ /* ``Obsolete'' default unit is mil */
+ : number { $$ = round (MIL_TO_COORD ($1)); }
+
%%
/* ---------------------------------------------------------------------------
|
|
From: <gi...@gp...> - 2011-05-31 19:59:16
|
The branch, master has been updated
via 074f68e08ef5a70b6c99d5a08080727326197bc0 (commit)
via b303a9666be5ae8db48b35c803e30c14e799a483 (commit)
from ba5597ded34252f5c5047a754023d48a860e0bfd (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
doc/pcb.texi | 9 ++++++---
src/hid/gtk/gtkhid-main.c | 2 +-
2 files changed, 7 insertions(+), 4 deletions(-)
=================
Commit Messages
=================
commit 074f68e08ef5a70b6c99d5a08080727326197bc0
Author: Felix Ruoff <Fe...@po...>
Commit: Felix Ruoff <Fe...@po...>
Replace @extend with @noindent in docu-source
If the @extend keyword is used to remove an intentation, the text will have a
linebreak, where the source has one. If @noindent is used instead, the lines
will be breaked as in normal paragraphs.
:100644 100644 35b597f... 5bdb5fb... M doc/pcb.texi
commit b303a9666be5ae8db48b35c803e30c14e799a483
Author: Felix Ruoff <Fe...@po...>
Commit: Felix Ruoff <Fe...@po...>
hid/gtk: Fix docu for 'ImportGUI()'
:100644 100644 b89974d... b5e36d5... M src/hid/gtk/gtkhid-main.c
=========
Changes
=========
commit 074f68e08ef5a70b6c99d5a08080727326197bc0
Author: Felix Ruoff <Fe...@po...>
Commit: Felix Ruoff <Fe...@po...>
Replace @extend with @noindent in docu-source
If the @extend keyword is used to remove an intentation, the text will have a
linebreak, where the source has one. If @noindent is used instead, the lines
will be breaked as in normal paragraphs.
diff --git a/doc/pcb.texi b/doc/pcb.texi
index 35b597f..5bdb5fb 100644
--- a/doc/pcb.texi
+++ b/doc/pcb.texi
@@ -199,7 +199,8 @@ Boerge Strand (borges@@ifi.uio.no)
Andre M. Hedrick (hedrick@@Astro.Dyer.Vanderbilt.Edu)
@end display
-@exdent who provided all sorts of help including porting @pcb{} to
+@noindent
+who provided all sorts of help including porting @pcb{} to
several operating systems and platforms, bug fixes, library enhancement,
user interface suggestions and more. In addition to these people,
many others donated time for bug-fixing and
@@ -706,7 +707,8 @@ If you get the error message:
@display
can't find default font-symbol-file 'default_font'
@end display
-@exdent then the font searchpath or filename in the application resource
+@noindent
+then the font searchpath or filename in the application resource
file is wrong. Be sure that your @code{m4} program supports search paths.
If not, get @code{GNU m4}.
For other messages, see @ref{problems}.
@@ -4654,7 +4656,8 @@ Netlists read by @pcb{} must have this simple text form:
netname [style] NAME-PINNUM NAME2-PINNUM2 NAME3-PINNUM3 ... [\]
@end example
-@exdent for each net on the layout.
+@noindent
+for each net on the layout.
where "netname" is the name of the net which must be unique for each
net, [style] is an optional route-style name,
NAME is the layout-name name given to an element,
commit b303a9666be5ae8db48b35c803e30c14e799a483
Author: Felix Ruoff <Fe...@po...>
Commit: Felix Ruoff <Fe...@po...>
hid/gtk: Fix docu for 'ImportGUI()'
diff --git a/src/hid/gtk/gtkhid-main.c b/src/hid/gtk/gtkhid-main.c
index b89974d..b5e36d5 100644
--- a/src/hid/gtk/gtkhid-main.c
+++ b/src/hid/gtk/gtkhid-main.c
@@ -2115,7 +2115,7 @@ Popup (int argc, char **argv, int x, int y)
}
/* ------------------------------------------------------------ */
static const char importgui_syntax[] =
-"Popup(MenuName, [Button])";
+"ImportGUI()";
static const char importgui_help[] =
N_("Asks user which schematics to import into PCB.\n");
|
|
From: <gi...@gp...> - 2011-05-31 19:28:07
|
The branch, master has been updated
via ba5597ded34252f5c5047a754023d48a860e0bfd (commit)
from 68374a94d87d35c5016f24332d11f10fa43cde54 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
doc/pcb.texi | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
=================
Commit Messages
=================
commit ba5597ded34252f5c5047a754023d48a860e0bfd
Author: Felix Ruoff <Fe...@po...>
Commit: Felix Ruoff <Fe...@po...>
Docu: Remove incomplete irritating sentence
:100644 100644 771ae5d... 35b597f... M doc/pcb.texi
=========
Changes
=========
commit ba5597ded34252f5c5047a754023d48a860e0bfd
Author: Felix Ruoff <Fe...@po...>
Commit: Felix Ruoff <Fe...@po...>
Docu: Remove incomplete irritating sentence
diff --git a/doc/pcb.texi b/doc/pcb.texi
index 771ae5d..35b597f 100644
--- a/doc/pcb.texi
+++ b/doc/pcb.texi
@@ -4501,7 +4501,7 @@ The following sections provide the necessary information about the syntax of
the files.
Netlist files are not created by @pcb{}, but it does use them. For information
on the format of a netlist file see the @emph{:rn},
-@ref{User Commands}. Rat lines are added on the current layer using the current
+@ref{User Commands}.
The commands described allow you to add almost any additional
functionality you may need. Examples are compressed read and write access as
well as archives. The commands themselves are defined by the resources
|
|
From: <gi...@gp...> - 2011-05-31 19:08:47
|
The branch, master has been updated
via 68374a94d87d35c5016f24332d11f10fa43cde54 (commit)
from 137aee28910904362500b22afe47028c41fadd95 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
doc/pcb.texi | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
=================
Commit Messages
=================
commit 68374a94d87d35c5016f24332d11f10fa43cde54
Author: Felix Ruoff <Fe...@po...>
Commit: Felix Ruoff <Fe...@po...>
Remove repeated word in documentation
:100644 100644 5ac666b... 771ae5d... M doc/pcb.texi
=========
Changes
=========
commit 68374a94d87d35c5016f24332d11f10fa43cde54
Author: Felix Ruoff <Fe...@po...>
Commit: Felix Ruoff <Fe...@po...>
Remove repeated word in documentation
diff --git a/doc/pcb.texi b/doc/pcb.texi
index 5ac666b..771ae5d 100644
--- a/doc/pcb.texi
+++ b/doc/pcb.texi
@@ -5915,7 +5915,7 @@ Matches 0 or 1 instances of preceding character.
Matches any single character other than the newline character.
@item |
-The vertical vertical bar is the alternation operator. It combines two
+The vertical bar is the alternation operator. It combines two
regular expressions. The result matches if either of them matches.
@item \
|
|
From: <gi...@gp...> - 2011-05-30 21:59:49
|
The branch, master has been updated
via 137aee28910904362500b22afe47028c41fadd95 (commit)
from 43dcc15273d2d54d5aa14724a103bbcab71b5576 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
doc/Makefile.am | 32 ++-
doc/{gs/term-element-1.pcb => gcode.pcb} | 245 +++++++----
doc/gcode_control_img.eps | 711 ++++++++++++++++++++++++++++++
doc/gcode_tool_path.eps | 415 +++++++++++++++++
doc/pcb.texi | 146 ++++++
5 files changed, 1466 insertions(+), 83 deletions(-)
copy doc/{gs/term-element-1.pcb => gcode.pcb} (67%)
create mode 100644 doc/gcode_control_img.eps
create mode 100644 doc/gcode_tool_path.eps
=================
Commit Messages
=================
commit 137aee28910904362500b22afe47028c41fadd95
Author: Alberto Maccioni <alb...@gm...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
Add documentation for G-Code export GUI
This patch contains the documentation changes from lp:699476.
It adds a new manual section on exporters and documents the gcode exporter.
Sample pcb file is added with control image and the resulting toolpath.
Reviewed-by: Felix Ruoff <Fe...@po...>
Reviewed-by: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
Closes-bug: lp-699476
:100755 100755 1228b33... 0432a5b... M doc/Makefile.am
:000000 100644 0000000... 8f621d1... A doc/gcode.pcb
:000000 100644 0000000... 1df808f... A doc/gcode_control_img.eps
:000000 100644 0000000... a8e14cd... A doc/gcode_tool_path.eps
:100644 100644 9dff289... 5ac666b... M doc/pcb.texi
=========
Changes
=========
commit 137aee28910904362500b22afe47028c41fadd95
Author: Alberto Maccioni <alb...@gm...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
Add documentation for G-Code export GUI
This patch contains the documentation changes from lp:699476.
It adds a new manual section on exporters and documents the gcode exporter.
Sample pcb file is added with control image and the resulting toolpath.
Reviewed-by: Felix Ruoff <Fe...@po...>
Reviewed-by: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
Closes-bug: lp-699476
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 1228b33..0432a5b 100755
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -36,12 +36,12 @@ info_TEXINFOS= pcb.texi
# via GIT are considered to be doing "development" and incur a slightly
# higher list of required tools.
if GIT_OR_CVS_VERSION
-pcb_TEXINFOS= ${inline_texi} ${pcb_output} ${tab_texi}
+pcb_TEXINFOS= ${inline_texi} ${pcb_output} ${tab_texi} ${images_output}
else
pcb_TEXINFOS=
endif
-dist_html_DATA= ${html_docs} ${pcb_output_inst}
+dist_html_DATA= ${html_docs} ${pcb_output_inst} ${images_output_inst}
dist_ps_DATA= ${ps_docs}
dist_pdf_DATA= ${pdf_docs}
@@ -82,13 +82,15 @@ EXTRA_DIST= \
${pcb_files} \
${pcb_output_noinst} \
${tab_files} \
- ${tab_texi}
+ ${tab_texi} \
+ ${images}
if GIT_OR_CVS_VERSION
BUILT_SOURCES= ${tab_texi} ${pcb_output} ${inline_texi}
CLEANFILES= \
refcard.aux refcard.dvi refcard.log refcard.pdf refcard.ps \
- ${pcb_output} ${tab_texi} ${inline_texi} pcb.dvi pcb.html pcb.pdf pcb.ps
+ ${pcb_output} ${tab_texi} ${inline_texi} pcb.dvi pcb.html pcb.pdf pcb.ps \
+ ${images_output}
else
BUILT_SOURCES=
endif
@@ -111,7 +113,8 @@ tab_texi= ${tab_files:.tab=.texi}
pcb_files= \
pad.pcb \
puller.pcb \
- thermal.pcb
+ thermal.pcb \
+ gcode.pcb
pcb_output_noinst= \
${pcb_files:.pcb=.eps} \
@@ -123,6 +126,19 @@ pcb_output_inst= \
pcb_output= ${pcb_output_inst} ${pcb_output_noinst}
+# Additional images
+images= \
+ gcode_control_img.eps \
+ gcode_tool_path.eps
+
+images_output_noinst= \
+ ${images:.eps=.pdf}
+
+images_output_inst= \
+ ${images:.eps=.png}
+
+images_output= ${images_output_noinst} ${images_output_inst}
+
${inline_texi} : extracted-docs
# no need to build these when building via a tarball. They're not used then
@@ -192,3 +208,9 @@ else
${PDFLATEX} $<
${PDFLATEX} $<
endif
+
+.eps.png:
+ ${PERL} eps2png --png $< > $@
+
+.eps.gif:
+ ${PERL} eps2png --gif $< > $@
diff --git a/doc/gcode.pcb b/doc/gcode.pcb
new file mode 100644
index 0000000..8f621d1
--- /dev/null
+++ b/doc/gcode.pcb
@@ -0,0 +1,1000 @@
+# release: pcb 20091103
+# date: Tue Feb 9 17:50:10 2010
+# user: amc (amc,/home/alberto,S-1-5-21-3544562028-792812758-4257637587-9314)
+# host: ni28979b.office.amsiag.com
+
+# To read pcb files, the pcb version (or the cvs source date) must be >= the file version
+FileVersion[20070407]
+
+PCB["" 280000 160000]
+
+Grid[1000.000000 0 0 0]
+Cursor[0 0 0.000000]
+PolyArea[200000000.000000]
+Thermal[0.500000]
+DRC[1000 1000 1000 1000 1500 1000]
+Flags("showdrc,nameonpcb,swapstartdir,clearnew,snappin")
+Groups("1,c:2,s:3:4:5:6:7:8")
+Styles["Signal,4000,8000,3000,2000:Power,2500,6000,3500,1000:Fat,4000,6000,3500,1000:Skinny,600,2402,1181,600"]
+
+Symbol(' ' 18)
+(
+)
+Symbol('!' 12)
+(
+ SymbolLine(0 45 0 50 8)
+ SymbolLine(0 10 0 35 8)
+)
+Symbol('"' 12)
+(
+ SymbolLine(0 10 0 20 8)
+ SymbolLine(10 10 10 20 8)
+)
+Symbol('#' 12)
+(
+ SymbolLine(0 35 20 35 8)
+ SymbolLine(0 25 20 25 8)
+ SymbolLine(15 20 15 40 8)
+ SymbolLine(5 20 5 40 8)
+)
+Symbol('$' 12)
+(
+ SymbolLine(15 15 20 20 8)
+ SymbolLine(5 15 15 15 8)
+ SymbolLine(0 20 5 15 8)
+ SymbolLine(0 20 0 25 8)
+ SymbolLine(0 25 5 30 8)
+ SymbolLine(5 30 15 30 8)
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(20 35 20 40 8)
+ SymbolLine(15 45 20 40 8)
+ SymbolLine(5 45 15 45 8)
+ SymbolLine(0 40 5 45 8)
+ SymbolLine(10 10 10 50 8)
+)
+Symbol('%' 12)
+(
+ SymbolLine(0 15 0 20 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(5 10 10 10 8)
+ SymbolLine(10 10 15 15 8)
+ SymbolLine(15 15 15 20 8)
+ SymbolLine(10 25 15 20 8)
+ SymbolLine(5 25 10 25 8)
+ SymbolLine(0 20 5 25 8)
+ SymbolLine(0 50 40 10 8)
+ SymbolLine(35 50 40 45 8)
+ SymbolLine(40 40 40 45 8)
+ SymbolLine(35 35 40 40 8)
+ SymbolLine(30 35 35 35 8)
+ SymbolLine(25 40 30 35 8)
+ SymbolLine(25 40 25 45 8)
+ SymbolLine(25 45 30 50 8)
+ SymbolLine(30 50 35 50 8)
+)
+Symbol('&' 12)
+(
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(0 15 0 25 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(0 35 15 20 8)
+ SymbolLine(5 50 10 50 8)
+ SymbolLine(10 50 20 40 8)
+ SymbolLine(0 25 25 50 8)
+ SymbolLine(5 10 10 10 8)
+ SymbolLine(10 10 15 15 8)
+ SymbolLine(15 15 15 20 8)
+ SymbolLine(0 35 0 45 8)
+)
+Symbol(''' 12)
+(
+ SymbolLine(0 20 10 10 8)
+)
+Symbol('(' 12)
+(
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(0 15 0 45 8)
+)
+Symbol(')' 12)
+(
+ SymbolLine(0 10 5 15 8)
+ SymbolLine(5 15 5 45 8)
+ SymbolLine(0 50 5 45 8)
+)
+Symbol('*' 12)
+(
+ SymbolLine(0 20 20 40 8)
+ SymbolLine(0 40 20 20 8)
+ SymbolLine(0 30 20 30 8)
+ SymbolLine(10 20 10 40 8)
+)
+Symbol('+' 12)
+(
+ SymbolLine(0 30 20 30 8)
+ SymbolLine(10 20 10 40 8)
+)
+Symbol(',' 12)
+(
+ SymbolLine(0 60 10 50 8)
+)
+Symbol('-' 12)
+(
+ SymbolLine(0 30 20 30 8)
+)
+Symbol('.' 12)
+(
+ SymbolLine(0 50 5 50 8)
+)
+Symbol('/' 12)
+(
+ SymbolLine(0 45 30 15 8)
+)
+Symbol('0' 12)
+(
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(0 15 0 45 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(5 10 15 10 8)
+ SymbolLine(15 10 20 15 8)
+ SymbolLine(20 15 20 45 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(0 40 20 20 8)
+)
+Symbol('1' 12)
+(
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(10 10 10 50 8)
+ SymbolLine(0 20 10 10 8)
+)
+Symbol('2' 12)
+(
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(5 10 20 10 8)
+ SymbolLine(20 10 25 15 8)
+ SymbolLine(25 15 25 25 8)
+ SymbolLine(0 50 25 25 8)
+ SymbolLine(0 50 25 50 8)
+)
+Symbol('3' 12)
+(
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(5 10 15 10 8)
+ SymbolLine(15 10 20 15 8)
+ SymbolLine(20 15 20 45 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(5 30 20 30 8)
+)
+Symbol('4' 12)
+(
+ SymbolLine(0 30 20 10 8)
+ SymbolLine(0 30 25 30 8)
+ SymbolLine(20 10 20 50 8)
+)
+Symbol('5' 12)
+(
+ SymbolLine(0 10 20 10 8)
+ SymbolLine(0 10 0 30 8)
+ SymbolLine(0 30 5 25 8)
+ SymbolLine(5 25 15 25 8)
+ SymbolLine(15 25 20 30 8)
+ SymbolLine(20 30 20 45 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(0 45 5 50 8)
+)
+Symbol('6' 12)
+(
+ SymbolLine(15 10 20 15 8)
+ SymbolLine(5 10 15 10 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(0 15 0 45 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(0 30 15 30 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(20 35 20 45 8)
+)
+Symbol('7' 12)
+(
+ SymbolLine(0 50 25 25 8)
+ SymbolLine(25 10 25 25 8)
+ SymbolLine(0 10 25 10 8)
+)
+Symbol('8' 12)
+(
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(0 35 0 45 8)
+ SymbolLine(0 35 5 30 8)
+ SymbolLine(5 30 15 30 8)
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(20 35 20 45 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(0 25 5 30 8)
+ SymbolLine(0 15 0 25 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(5 10 15 10 8)
+ SymbolLine(15 10 20 15 8)
+ SymbolLine(20 15 20 25 8)
+ SymbolLine(15 30 20 25 8)
+)
+Symbol('9' 12)
+(
+ SymbolLine(0 50 20 30 8)
+ SymbolLine(20 15 20 30 8)
+ SymbolLine(15 10 20 15 8)
+ SymbolLine(5 10 15 10 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(0 15 0 25 8)
+ SymbolLine(0 25 5 30 8)
+ SymbolLine(5 30 20 30 8)
+)
+Symbol(':' 12)
+(
+ SymbolLine(0 25 5 25 8)
+ SymbolLine(0 35 5 35 8)
+)
+Symbol(';' 12)
+(
+ SymbolLine(0 50 10 40 8)
+ SymbolLine(10 25 10 30 8)
+)
+Symbol('<' 12)
+(
+ SymbolLine(0 30 10 20 8)
+ SymbolLine(0 30 10 40 8)
+)
+Symbol('=' 12)
+(
+ SymbolLine(0 25 20 25 8)
+ SymbolLine(0 35 20 35 8)
+)
+Symbol('>' 12)
+(
+ SymbolLine(0 20 10 30 8)
+ SymbolLine(0 40 10 30 8)
+)
+Symbol('?' 12)
+(
+ SymbolLine(10 30 10 35 8)
+ SymbolLine(10 45 10 50 8)
+ SymbolLine(0 15 0 20 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(5 10 15 10 8)
+ SymbolLine(15 10 20 15 8)
+ SymbolLine(20 15 20 20 8)
+ SymbolLine(10 30 20 20 8)
+)
+Symbol('@' 12)
+(
+ SymbolLine(0 10 0 40 8)
+ SymbolLine(0 40 10 50 8)
+ SymbolLine(10 50 40 50 8)
+ SymbolLine(50 35 50 10 8)
+ SymbolLine(50 10 40 0 8)
+ SymbolLine(40 0 10 0 8)
+ SymbolLine(10 0 0 10 8)
+ SymbolLine(15 20 15 30 8)
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(20 35 30 35 8)
+ SymbolLine(30 35 35 30 8)
+ SymbolLine(35 30 40 35 8)
+ SymbolLine(35 30 35 15 8)
+ SymbolLine(35 20 30 15 8)
+ SymbolLine(20 15 30 15 8)
+ SymbolLine(20 15 15 20 8)
+ SymbolLine(40 35 50 35 8)
+)
+Symbol('A' 12)
+(
+ SymbolLine(0 15 0 50 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(5 10 20 10 8)
+ SymbolLine(20 10 25 15 8)
+ SymbolLine(25 15 25 50 8)
+ SymbolLine(0 30 25 30 8)
+)
+Symbol('B' 12)
+(
+ SymbolLine(0 50 20 50 8)
+ SymbolLine(20 50 25 45 8)
+ SymbolLine(25 35 25 45 8)
+ SymbolLine(20 30 25 35 8)
+ SymbolLine(5 30 20 30 8)
+ SymbolLine(5 10 5 50 8)
+ SymbolLine(0 10 20 10 8)
+ SymbolLine(20 10 25 15 8)
+ SymbolLine(25 15 25 25 8)
+ SymbolLine(20 30 25 25 8)
+)
+Symbol('C' 12)
+(
+ SymbolLine(5 50 20 50 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(0 15 0 45 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(5 10 20 10 8)
+)
+Symbol('D' 12)
+(
+ SymbolLine(5 10 5 50 8)
+ SymbolLine(20 10 25 15 8)
+ SymbolLine(25 15 25 45 8)
+ SymbolLine(20 50 25 45 8)
+ SymbolLine(0 50 20 50 8)
+ SymbolLine(0 10 20 10 8)
+)
+Symbol('E' 12)
+(
+ SymbolLine(0 30 15 30 8)
+ SymbolLine(0 50 20 50 8)
+ SymbolLine(0 10 0 50 8)
+ SymbolLine(0 10 20 10 8)
+)
+Symbol('F' 12)
+(
+ SymbolLine(0 10 0 50 8)
+ SymbolLine(0 10 20 10 8)
+ SymbolLine(0 30 15 30 8)
+)
+Symbol('G' 12)
+(
+ SymbolLine(20 10 25 15 8)
+ SymbolLine(5 10 20 10 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(0 15 0 45 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(5 50 20 50 8)
+ SymbolLine(20 50 25 45 8)
+ SymbolLine(25 35 25 45 8)
+ SymbolLine(20 30 25 35 8)
+ SymbolLine(10 30 20 30 8)
+)
+Symbol('H' 12)
+(
+ SymbolLine(0 10 0 50 8)
+ SymbolLine(25 10 25 50 8)
+ SymbolLine(0 30 25 30 8)
+)
+Symbol('I' 12)
+(
+ SymbolLine(0 10 10 10 8)
+ SymbolLine(5 10 5 50 8)
+ SymbolLine(0 50 10 50 8)
+)
+Symbol('J' 12)
+(
+ SymbolLine(0 10 15 10 8)
+ SymbolLine(15 10 15 45 8)
+ SymbolLine(10 50 15 45 8)
+ SymbolLine(5 50 10 50 8)
+ SymbolLine(0 45 5 50 8)
+)
+Symbol('K' 12)
+(
+ SymbolLine(0 10 0 50 8)
+ SymbolLine(0 30 20 10 8)
+ SymbolLine(0 30 20 50 8)
+)
+Symbol('L' 12)
+(
+ SymbolLine(0 10 0 50 8)
+ SymbolLine(0 50 20 50 8)
+)
+Symbol('M' 12)
+(
+ SymbolLine(0 10 0 50 8)
+ SymbolLine(0 10 15 25 8)
+ SymbolLine(15 25 30 10 8)
+ SymbolLine(30 10 30 50 8)
+)
+Symbol('N' 12)
+(
+ SymbolLine(0 10 0 50 8)
+ SymbolLine(0 10 0 15 8)
+ SymbolLine(0 15 25 40 8)
+ SymbolLine(25 10 25 50 8)
+)
+Symbol('O' 12)
+(
+ SymbolLine(0 15 0 45 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(5 10 15 10 8)
+ SymbolLine(15 10 20 15 8)
+ SymbolLine(20 15 20 45 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(0 45 5 50 8)
+)
+Symbol('P' 12)
+(
+ SymbolLine(5 10 5 50 8)
+ SymbolLine(0 10 20 10 8)
+ SymbolLine(20 10 25 15 8)
+ SymbolLine(25 15 25 25 8)
+ SymbolLine(20 30 25 25 8)
+ SymbolLine(5 30 20 30 8)
+)
+Symbol('Q' 12)
+(
+ SymbolLine(0 15 0 45 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(5 10 15 10 8)
+ SymbolLine(15 10 20 15 8)
+ SymbolLine(20 15 20 45 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(10 40 20 50 8)
+)
+Symbol('R' 12)
+(
+ SymbolLine(0 10 20 10 8)
+ SymbolLine(20 10 25 15 8)
+ SymbolLine(25 15 25 25 8)
+ SymbolLine(20 30 25 25 8)
+ SymbolLine(5 30 20 30 8)
+ SymbolLine(5 10 5 50 8)
+ SymbolLine(5 30 25 50 8)
+)
+Symbol('S' 12)
+(
+ SymbolLine(20 10 25 15 8)
+ SymbolLine(5 10 20 10 8)
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(0 15 0 25 8)
+ SymbolLine(0 25 5 30 8)
+ SymbolLine(5 30 20 30 8)
+ SymbolLine(20 30 25 35 8)
+ SymbolLine(25 35 25 45 8)
+ SymbolLine(20 50 25 45 8)
+ SymbolLine(5 50 20 50 8)
+ SymbolLine(0 45 5 50 8)
+)
+Symbol('T' 12)
+(
+ SymbolLine(0 10 20 10 8)
+ SymbolLine(10 10 10 50 8)
+)
+Symbol('U' 12)
+(
+ SymbolLine(0 10 0 45 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(20 10 20 45 8)
+)
+Symbol('V' 12)
+(
+ SymbolLine(0 10 0 40 8)
+ SymbolLine(0 40 10 50 8)
+ SymbolLine(10 50 20 40 8)
+ SymbolLine(20 10 20 40 8)
+)
+Symbol('W' 12)
+(
+ SymbolLine(0 10 0 50 8)
+ SymbolLine(0 50 15 35 8)
+ SymbolLine(15 35 30 50 8)
+ SymbolLine(30 10 30 50 8)
+)
+Symbol('X' 12)
+(
+ SymbolLine(0 10 0 15 8)
+ SymbolLine(0 15 25 40 8)
+ SymbolLine(25 40 25 50 8)
+ SymbolLine(0 40 0 50 8)
+ SymbolLine(0 40 25 15 8)
+ SymbolLine(25 10 25 15 8)
+)
+Symbol('Y' 12)
+(
+ SymbolLine(0 10 0 15 8)
+ SymbolLine(0 15 10 25 8)
+ SymbolLine(10 25 20 15 8)
+ SymbolLine(20 10 20 15 8)
+ SymbolLine(10 25 10 50 8)
+)
+Symbol('Z' 12)
+(
+ SymbolLine(0 10 25 10 8)
+ SymbolLine(25 10 25 15 8)
+ SymbolLine(0 40 25 15 8)
+ SymbolLine(0 40 0 50 8)
+ SymbolLine(0 50 25 50 8)
+)
+Symbol('[' 12)
+(
+ SymbolLine(0 10 5 10 8)
+ SymbolLine(0 10 0 50 8)
+ SymbolLine(0 50 5 50 8)
+)
+Symbol('\' 12)
+(
+ SymbolLine(0 15 30 45 8)
+)
+Symbol(']' 12)
+(
+ SymbolLine(0 10 5 10 8)
+ SymbolLine(5 10 5 50 8)
+ SymbolLine(0 50 5 50 8)
+)
+Symbol('^' 12)
+(
+ SymbolLine(0 15 5 10 8)
+ SymbolLine(5 10 10 15 8)
+)
+Symbol('_' 12)
+(
+ SymbolLine(0 50 20 50 8)
+)
+Symbol('a' 12)
+(
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(5 30 15 30 8)
+ SymbolLine(0 35 5 30 8)
+ SymbolLine(0 35 0 45 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(20 30 20 45 8)
+ SymbolLine(20 45 25 50 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(15 50 20 45 8)
+)
+Symbol('b' 12)
+(
+ SymbolLine(0 10 0 50 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(20 35 20 45 8)
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(5 30 15 30 8)
+ SymbolLine(0 35 5 30 8)
+)
+Symbol('c' 12)
+(
+ SymbolLine(5 30 20 30 8)
+ SymbolLine(0 35 5 30 8)
+ SymbolLine(0 35 0 45 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(5 50 20 50 8)
+)
+Symbol('d' 12)
+(
+ SymbolLine(20 10 20 50 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(0 35 0 45 8)
+ SymbolLine(0 35 5 30 8)
+ SymbolLine(5 30 15 30 8)
+ SymbolLine(15 30 20 35 8)
+)
+Symbol('e' 12)
+(
+ SymbolLine(5 50 20 50 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(0 35 0 45 8)
+ SymbolLine(0 35 5 30 8)
+ SymbolLine(5 30 15 30 8)
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(0 40 20 40 8)
+ SymbolLine(20 40 20 35 8)
+)
+Symbol('f' 10)
+(
+ SymbolLine(5 15 5 50 8)
+ SymbolLine(5 15 10 10 8)
+ SymbolLine(10 10 15 10 8)
+ SymbolLine(0 30 10 30 8)
+)
+Symbol('g' 12)
+(
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(5 30 15 30 8)
+ SymbolLine(0 35 5 30 8)
+ SymbolLine(0 35 0 45 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(0 60 5 65 8)
+ SymbolLine(5 65 15 65 8)
+ SymbolLine(15 65 20 60 8)
+ SymbolLine(20 30 20 60 8)
+)
+Symbol('h' 12)
+(
+ SymbolLine(0 10 0 50 8)
+ SymbolLine(0 35 5 30 8)
+ SymbolLine(5 30 15 30 8)
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(20 35 20 50 8)
+)
+Symbol('i' 10)
+(
+ SymbolLine(0 20 0 25 8)
+ SymbolLine(0 35 0 50 8)
+)
+Symbol('j' 10)
+(
+ SymbolLine(5 20 5 25 8)
+ SymbolLine(5 35 5 60 8)
+ SymbolLine(0 65 5 60 8)
+)
+Symbol('k' 12)
+(
+ SymbolLine(0 10 0 50 8)
+ SymbolLine(0 35 15 50 8)
+ SymbolLine(0 35 10 25 8)
+)
+Symbol('l' 10)
+(
+ SymbolLine(0 10 0 45 8)
+ SymbolLine(0 45 5 50 8)
+)
+Symbol('m' 12)
+(
+ SymbolLine(5 35 5 50 8)
+ SymbolLine(5 35 10 30 8)
+ SymbolLine(10 30 15 30 8)
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(20 35 20 50 8)
+ SymbolLine(20 35 25 30 8)
+ SymbolLine(25 30 30 30 8)
+ SymbolLine(30 30 35 35 8)
+ SymbolLine(35 35 35 50 8)
+ SymbolLine(0 30 5 35 8)
+)
+Symbol('n' 12)
+(
+ SymbolLine(5 35 5 50 8)
+ SymbolLine(5 35 10 30 8)
+ SymbolLine(10 30 15 30 8)
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(20 35 20 50 8)
+ SymbolLine(0 30 5 35 8)
+)
+Symbol('o' 12)
+(
+ SymbolLine(0 35 0 45 8)
+ SymbolLine(0 35 5 30 8)
+ SymbolLine(5 30 15 30 8)
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(20 35 20 45 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(0 45 5 50 8)
+)
+Symbol('p' 12)
+(
+ SymbolLine(5 35 5 65 8)
+ SymbolLine(0 30 5 35 8)
+ SymbolLine(5 35 10 30 8)
+ SymbolLine(10 30 20 30 8)
+ SymbolLine(20 30 25 35 8)
+ SymbolLine(25 35 25 45 8)
+ SymbolLine(20 50 25 45 8)
+ SymbolLine(10 50 20 50 8)
+ SymbolLine(5 45 10 50 8)
+)
+Symbol('q' 12)
+(
+ SymbolLine(20 35 20 65 8)
+ SymbolLine(15 30 20 35 8)
+ SymbolLine(5 30 15 30 8)
+ SymbolLine(0 35 5 30 8)
+ SymbolLine(0 35 0 45 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(15 50 20 45 8)
+)
+Symbol('r' 12)
+(
+ SymbolLine(5 35 5 50 8)
+ SymbolLine(5 35 10 30 8)
+ SymbolLine(10 30 20 30 8)
+ SymbolLine(0 30 5 35 8)
+)
+Symbol('s' 12)
+(
+ SymbolLine(5 50 20 50 8)
+ SymbolLine(20 50 25 45 8)
+ SymbolLine(20 40 25 45 8)
+ SymbolLine(5 40 20 40 8)
+ SymbolLine(0 35 5 40 8)
+ SymbolLine(0 35 5 30 8)
+ SymbolLine(5 30 20 30 8)
+ SymbolLine(20 30 25 35 8)
+ SymbolLine(0 45 5 50 8)
+)
+Symbol('t' 10)
+(
+ SymbolLine(5 10 5 45 8)
+ SymbolLine(5 45 10 50 8)
+ SymbolLine(0 25 10 25 8)
+)
+Symbol('u' 12)
+(
+ SymbolLine(0 30 0 45 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(15 50 20 45 8)
+ SymbolLine(20 30 20 45 8)
+)
+Symbol('v' 12)
+(
+ SymbolLine(0 30 0 40 8)
+ SymbolLine(0 40 10 50 8)
+ SymbolLine(10 50 20 40 8)
+ SymbolLine(20 30 20 40 8)
+)
+Symbol('w' 12)
+(
+ SymbolLine(0 30 0 45 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(5 50 10 50 8)
+ SymbolLine(10 50 15 45 8)
+ SymbolLine(15 30 15 45 8)
+ SymbolLine(15 45 20 50 8)
+ SymbolLine(20 50 25 50 8)
+ SymbolLine(25 50 30 45 8)
+ SymbolLine(30 30 30 45 8)
+)
+Symbol('x' 12)
+(
+ SymbolLine(0 30 20 50 8)
+ SymbolLine(0 50 20 30 8)
+)
+Symbol('y' 12)
+(
+ SymbolLine(0 30 0 45 8)
+ SymbolLine(0 45 5 50 8)
+ SymbolLine(20 30 20 60 8)
+ SymbolLine(15 65 20 60 8)
+ SymbolLine(5 65 15 65 8)
+ SymbolLine(0 60 5 65 8)
+ SymbolLine(5 50 15 50 8)
+ SymbolLine(15 50 20 45 8)
+)
+Symbol('z' 12)
+(
+ SymbolLine(0 30 20 30 8)
+ SymbolLine(0 50 20 30 8)
+ SymbolLine(0 50 20 50 8)
+)
+Symbol('{' 12)
+(
+ SymbolLine(5 15 10 10 8)
+ SymbolLine(5 15 5 25 8)
+ SymbolLine(0 30 5 25 8)
+ SymbolLine(0 30 5 35 8)
+ SymbolLine(5 35 5 45 8)
+ SymbolLine(5 45 10 50 8)
+)
+Symbol('|' 12)
+(
+ SymbolLine(0 10 0 50 8)
+)
+Symbol('}' 12)
+(
+ SymbolLine(0 10 5 15 8)
+ SymbolLine(5 15 5 25 8)
+ SymbolLine(5 25 10 30 8)
+ SymbolLine(5 35 10 30 8)
+ SymbolLine(5 35 5 45 8)
+ SymbolLine(0 50 5 45 8)
+)
+Symbol('~' 12)
+(
+ SymbolLine(0 35 5 30 8)
+ SymbolLine(5 30 10 30 8)
+ SymbolLine(10 30 15 35 8)
+ SymbolLine(15 35 20 35 8)
+ SymbolLine(20 35 25 30 8)
+)
+Via[48000 28000 8000 4000 0 3000 "" ""]
+Via[63000 86000 8000 4000 0 3000 "" ""]
+
+Element["" "DIP18" "U5" "16F84" 116500 28500 17000 5000 3 100 ""]
+(
+ Pin[0 0 8000 3000 5600 2800 "1" "1" "square"]
+ Pin[0 10000 8000 3000 5600 2800 "2" "2" ""]
+ Pin[0 20000 8000 3000 5600 2800 "3" "3" ""]
+ Pin[0 30000 8000 3000 5600 2800 "4" "4" ""]
+ Pin[0 40000 8000 3000 5600 2800 "5" "5" ""]
+ Pin[0 50000 8000 3000 5600 2800 "6" "6" ""]
+ Pin[0 60000 8000 3000 5600 2800 "7" "7" ""]
+ Pin[0 70000 8000 3000 5600 2800 "8" "8" ""]
+ Pin[0 80000 8000 3000 5600 2800 "9" "9" ""]
+ Pin[30000 80000 8000 3000 5600 2800 "10" "10" ""]
+ Pin[30000 70000 8000 3000 5600 2800 "11" "11" ""]
+ Pin[30000 60000 8000 3000 5600 2800 "12" "12" ""]
+ Pin[30000 50000 8000 3000 5600 2800 "13" "13" ""]
+ Pin[30000 40000 8000 3000 5600 2800 "14" "14" ""]
+ Pin[30000 30000 8000 3000 5600 2800 "15" "15" ""]
+ Pin[30000 20000 8000 3000 5600 2800 "16" "16" ""]
+ Pin[30000 10000 8000 3000 5600 2800 "17" "17" ""]
+ Pin[30000 0 8000 3000 5600 2800 "18" "18" ""]
+ ElementLine [20000 -5000 35000 -5000 1000]
+ ElementLine [-5000 -5000 10000 -5000 1000]
+ ElementLine [35000 85000 35000 -5000 1000]
+ ElementLine [-5000 85000 35000 85000 1000]
+ ElementLine [-5000 -5000 -5000 85000 1000]
+ ElementArc [15000 -5000 5000 5000 0 180 1000]
+
+ )
+
+Element["" "TO220" "U6" "unknown" 179500 45000 23000 -15000 0 100 ""]
+(
+ Pin[0 -10000 8000 3000 8600 5000 "1" "1" "square,edge2"]
+ Pin[0 0 8000 3000 8600 5000 "2" "2" "edge2"]
+ Pin[0 10000 8000 3000 8600 5000 "3" "3" "edge2"]
+ Pin[67000 0 17500 3000 15100 13000 "4" "4" "edge2"]
+ ElementLine [0 -10000 18000 -10000 3000]
+ ElementLine [0 0 18000 0 3000]
+ ElementLine [0 10000 18000 10000 3000]
+ ElementLine [18000 -20000 18000 20000 2000]
+ ElementLine [18000 20000 55500 20000 2000]
+ ElementLine [55500 -20000 55500 20000 2000]
+ ElementLine [18000 -20000 55500 -20000 2000]
+ ElementLine [55500 -20000 55500 20000 2000]
+ ElementLine [55500 20000 68000 20000 2000]
+ ElementLine [68000 18500 68000 20000 2000]
+ ElementLine [68000 18500 75000 18500 2000]
+ ElementLine [75000 18500 75000 20000 2000]
+ ElementLine [75000 20000 79000 20000 2000]
+ ElementLine [79000 -20000 79000 20000 2000]
+ ElementLine [75000 -20000 79000 -20000 2000]
+ ElementLine [75000 -20000 75000 -18500 2000]
+ ElementLine [68000 -18500 75000 -18500 2000]
+ ElementLine [68000 -20000 68000 -18500 2000]
+ ElementLine [55500 -20000 68000 -20000 2000]
+
+ )
+
+Element["" "RCY300" "C11" "unknown" 205500 94500 2500 10000 3 100 ""]
+(
+ Pin[0 0 8000 3000 5600 5000 "1" "1" ""]
+ Pin[0 30000 8000 3000 5600 5000 "2" "2" "square"]
+ ElementArc [0 15000 30000 30000 270 360 1000]
+
+ )
+
+Element["" "ALF400" "Z5" "unknown" 129000 142500 -33800 900 0 100 ""]
+(
+ Pin[0 0 8000 3000 4600 2000 "2" "2" "square,edge2"]
+ Pin[-40000 0 8000 3000 4600 2000 "1" "1" "edge2"]
+ ElementLine [-13300 0 0 0 1000]
+ ElementLine [-40000 0 -26700 0 1000]
+ ElementLine [-13300 0 -26700 6600 1000]
+ ElementLine [-26700 -6600 -26700 6600 1000]
+ ElementLine [-26700 -6600 -13300 0 1000]
+ ElementLine [-13300 -6600 -13300 6600 1000]
+
+ )
+
+Element["" "ACY400" "R21" "unknown" 82500 28000 -5300 32000 3 100 ""]
+(
+ Pin[0 0 8000 3000 5100 3000 "1" "1" "square"]
+ Pin[0 40000 8000 3000 5100 3000 "2" "2" ""]
+ ElementLine [0 0 0 10000 1000]
+ ElementLine [0 30000 0 40000 1000]
+ ElementLine [3300 10000 3300 30000 1000]
+ ElementLine [-3300 30000 3300 30000 1000]
+ ElementLine [-3300 10000 -3300 30000 1000]
+ ElementLine [-3300 10000 3300 10000 1000]
+
+ )
+
+Element["" "AXIAL_LAY-200" "C13" "100n" 87000 110000 -6000 -11400 0 100 ""]
+(
+ Pin[5000 0 8000 3000 8600 3000 "1" "1" "edge2"]
+ Pin[-15000 0 8000 3000 8600 3000 "2" "2" "edge2"]
+ ElementLine [0 -1600 0 1600 1000]
+ ElementLine [-10000 -1600 0 -1600 1000]
+ ElementLine [-10000 -1600 -10000 1600 1000]
+ ElementLine [-10000 1600 0 1600 1000]
+ ElementLine [-15000 0 -10000 0 1000]
+ ElementLine [0 0 5000 0 1000]
+
+ )
+Layer(1 "component")
+(
+)
+Layer(2 "solder")
+(
+ Line[48000 28000 48000 30000 4000 4000 "clearline"]
+ Line[48000 30000 69000 51000 4000 4000 "clearline"]
+ Line[69000 51000 96000 51000 4000 4000 "clearline"]
+ Line[96000 51000 98000 53000 4000 4000 "clearline"]
+ Line[98000 53000 98000 60000 4000 4000 "clearline"]
+ Line[98000 60000 106000 68000 4000 4000 "clearline"]
+ Line[106000 68000 116000 68000 4000 4000 "clearline"]
+ Line[116000 68000 116500 68500 4000 4000 "clearline"]
+ Line[82500 68000 82500 99500 4000 4000 "clearline"]
+ Line[82500 99500 72000 110000 4000 4000 "clearline"]
+ Line[92000 110000 93000 110000 4000 4000 "clearline"]
+ Line[93000 110000 101000 102000 4000 4000 "clearline"]
+ Line[101000 102000 101000 81000 4000 4000 "clearline"]
+ Line[101000 81000 103000 79000 4000 4000 "clearline"]
+ Line[103000 79000 116000 79000 4000 4000 "clearline"]
+ Line[116000 79000 116500 78500 4000 4000 "clearline"]
+ Line[116500 48500 129500 48500 4000 4000 "clearline"]
+ Line[129500 48500 133000 52000 4000 4000 "clearline"]
+ Line[133000 52000 133000 64000 4000 4000 "clearline"]
+ Line[133000 64000 137000 68000 4000 4000 "clearline"]
+ Line[137000 68000 146000 68000 4000 4000 "clearline"]
+ Line[146000 68000 146500 68500 4000 4000 "clearline"]
+ Line[146500 88500 137500 88500 4000 4000 "clearline"]
+ Line[137500 88500 129000 97000 4000 4000 "clearline"]
+ Line[129000 97000 118000 97000 4000 4000 "clearline"]
+ Line[118000 97000 116500 98500 4000 4000 "clearline"]
+ Line[129000 142500 131500 142500 4000 4000 "clearline"]
+ Line[131500 142500 161000 113000 4000 4000 "clearline"]
+ Line[161000 113000 161000 63000 4000 4000 "clearline"]
+ Line[161000 63000 158000 60000 4000 4000 "clearline"]
+ Line[158000 60000 148000 60000 4000 4000 "clearline"]
+ Line[148000 60000 146500 58500 4000 4000 "clearline"]
+ Line[205500 94500 205500 44500 4000 4000 "clearline"]
+ Line[205500 44500 197000 36000 4000 4000 "clearline"]
+ Line[197000 36000 180500 36000 4000 4000 "clearline"]
+ Line[180500 36000 179500 35000 4000 4000 "clearline"]
+ Line[82500 28000 96500 14000 4000 4000 "clearline"]
+ Line[96500 14000 128000 14000 4000 4000 "clearline"]
+ Line[128000 14000 133000 19000 4000 4000 "clearline"]
+ Line[133000 19000 133000 35000 4000 4000 "clearline"]
+ Line[133000 35000 136500 38500 4000 4000 "clearline"]
+ Line[136500 38500 146500 38500 4000 4000 "clearline"]
+ Line[146500 28500 148000 27000 4000 4000 "clearline"]
+ Line[148000 27000 166000 27000 4000 4000 "clearline"]
+ Line[166000 27000 166000 42000 4000 4000 "clearline"]
+ Line[166000 42000 169000 45000 4000 4000 "clearline"]
+ Line[169000 45000 179500 45000 4000 4000 "clearline"]
+ Line[179500 55000 179500 98500 4000 4000 "clearline"]
+ Line[179500 98500 205500 124500 4000 4000 "clearline"]
+ Line[89000 142500 107500 124000 4000 4000 "clearline"]
+ Line[107500 124000 127000 124000 4000 4000 "clearline"]
+ Line[127000 124000 127000 110000 4000 4000 "clearline"]
+ Line[127000 110000 138500 98500 4000 4000 "clearline"]
+ Line[138500 98500 146500 98500 4000 4000 "clearline"]
+ Line[146500 78500 132500 78500 4000 4000 "clearline"]
+ Line[132500 78500 132000 78000 4000 4000 "clearline"]
+ Line[132000 78000 121500 88500 4000 4000 "clearline"]
+ Line[121500 88500 116500 88500 4000 4000 "clearline"]
+ Line[63000 86000 63000 72000 4000 4000 "clearline"]
+ Line[63000 72000 67000 68000 4000 4000 "clearline"]
+ Line[67000 68000 82500 68000 4000 4000 "clearline"]
+ Polygon("clearpoly")
+ (
+ [257000 147000] [169000 147000] [169000 10000] [257000 10000]
+ )
+)
+Layer(3 "GND")
+(
+)
+Layer(4 "power")
+(
+)
+Layer(5 "signal1")
+(
+)
+Layer(6 "signal2")
+(
+)
+Layer(7 "signal3")
+(
+)
+Layer(8 "signal4")
+(
+)
+Layer(9 "silk")
+(
+)
+Layer(10 "silk")
+(
+)
diff --git a/doc/gcode_control_img.eps b/doc/gcode_control_img.eps
new file mode 100644
index 0000000..1df808f
--- /dev/null
+++ b/doc/gcode_control_img.eps
@@ -0,0 +1,711 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1,17 by Peter Kirchgessner
+%%Title: gcode_control_img.eps
+%%CreationDate: Mon May 30 02:37:26 2011
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 0 0 404 231
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+0 0 translate
+% Translate to begin of first scanline
+0 230.40000000000001 translate
+403.20000000000005 -230.40000000000001 scale
+% Image geometry
+1680 960 1
+% Transformation matrix
+[ 1680 0 0 960 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData: 51668 ASCII Bytes
+image
+JcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqR
+JcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqR
+JcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqR
+JcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqRJcDqR
+nG`K=^]4@!KE(H@!._ib!'c,9nG`K=^]4@!KE(H@!._ib!'c,9nG`K=^]4@!KE(H@!._ib!'c,9
+nG`K=^]4@!KE(H@!._ib!'c,9nG`K=^]4@!KE(H@!._ib!'c,9nG`K=^]4@!jSo5LklA9onG`K=
+^]4@!jSo4qkl:]J])V:"!._ib!'fQEkPtSn])V:"!._ib!'fTF!<20^!!g+8nG`K=^]4@!jo5>Y
+kPtSb])V:"!._ib!'fTF!;PaX!!0\2nG`K=^]4@!jo5>Mk5`*nnG`K=^]4@!jo5>=k5YL3]DqC#
+!._ib!'fTF!5Rat!'e*qnG`K=^]4@!jo5=2k5YK(]DqC#!._ib!'fTFjo>Al]DqC#!._ib!'fWG
+!<2*\!!g.9nG`K=^]4@!k5PGZjo>A`]DqC#!._ib!'fWG!;P[V!!0_3nG`K=^]4@!k5PGNjT)pm
+nG`K=^]4@!k5PG>jT#:1]`7L$!._ib!'fWG!5R[r!'e-rnG`K=^]4@!k5PF3jT#9&]`7L$!._ib
+!'fWGj8]/j]`7L$!._ib!'fZH!<2$Z!!g1:nG`K=^]4@!kPkP[j8]/^]`7L$!._ib!'fZH!;PUT
+!!0b4nG`K=^]4@!kPkPOirHalnG`K=^]4@!kPkP?irB(/^&RU%!._ib!'fZH!5RUp!'e0snG`K=
+^]4@!kPkO4irB'$^&RU%!._ib!'fZHiW&rh^&RU%!._ib!'f]I!<1sX!!g4;nG`K=^]4@!kl1Y\
+iW&r\^&RU%!._ib!'f]I!;QKm!"\Dqr;Zfu^&RU%!._ib!'f]I!:]pe!$CP,!.b"J^&RU%!._ib
+!'f]I!9!eU!'ffL!5SO5!.V`_nG`K=^]4@!kl1Xur;ZhIli-tCr;Zg^^Am^&!._ib!'f]I!.b"J
+lMgkRr;Zg>^Am^&!._ib!'f]Ir;ZfulMgkZr;Zg.^Am^&!._ib!'f`J!<2os!!DNd!;ucq!!g7<
+nG`K=^]4@!l2Lb]r;Zg&lMgk`r;Zg"^Am^&!._ib!'f`J!;QKm!"\>or;Zfu^Am^&!._ib!'f`J
+!;QKm!$CJ*!.b"J^Am^&!._ib!'f`J!:]pe!'f`J!5SO5!.Vc`nG`K=^]4@!l2LbQr;ZhIl2LbA
+r;Zg^^]3g'!._ib!'f`J!9!eUkl1YPr;Zg>^]3g'!._ib!'f`J!9!hV!!2<`!;QKm!"ZjEnG`K=
+^]4@!l2LbArVup#kl1Y\r;Zg&^]3g'!._ib!'f`J!9!hV!!h`f!<2os!!C"9nG`K=^]4@!l2LbA
+rVup/kPtJ\!!0k7nG`K=^]4@!l2LbArVup?kPkO4r;aV4nG`K=^]4@!l2LbArVup_kPkOtr;ZhI
+_#Np(!._ib!'f`J!9!hV!.X23!9!eU!'e:!nG`K=^]4@!l2LbArW)*\!:]pe!$B#VnG`K=^]4@!
+l2LbArW)*\!;QKm!"ZmFnG`K=^]4@!l2LbArW)*\!;ucq!!g=>nG`K=^]4@!l2LbArW)*\!<2os
+!!C%:nG`K=^]4@!l2LbArW)'[r;Zfu_#Np(!._ib!'f`J!9!hVjo5=2r;aY5nG`K=^]4@!l2LbA
+rW)'[!5SO5!.VibnG`K=^]4@!l2LbArW)'[!9!eU!'e="nG`K=^]4@!l2LbArW)'[!:]pe!$B&W
+nG`K=^]4@!l2LbArW)'[!;QKm!"ZpGnG`K=^]4@!l2LbArW)'[!;ucq!!g@?nG`K=^]4@!l2LbA
+rW)'[!<2os!!C(;nG`K=^]4@!l2LbArW)$Zr;Zfu_>j$)!._ib!'f`J!9!hVjSo41r;a\6nG`K=
+^]4@!l2LbArW)$Z!5SO5!.VlcnG`K=^]4@!l2LbArW)$Z!9!eU!'e@#nG`K=^]4@!l2LbArW)$Z
+!:]pe!$B)XnG`K=^]4@!l2LbArW)$Z!;QKm!"ZsHnG`K=^]4@!l2LbArW)$Z!;ucq!!gC@nG`K=
+^]4@!l2LbArW)$Z!<2os!!C+<nG`K=^]4@!l2LbArW)!Yr;Zfu_Z0-*!._ib!'f`J!9!hVj8T+0
+r;a_7nG`K=^]4@!l2LbArW)!Y!5SC1!"[-MnG`K=^]4@!l2LbArW)!Y!9!YQ!"\Gr!T4LFs7$$g
+JA;-b5O&1Ji;N`:rrDQa!!!PsrrW0"!8dbFrr@Sb!!#7JrrD!V!;c]q_#"-%rrDii!!!Psrr`#r
+!'fB@nG`K=^]4@!o)Aa[#Q"H#i;N`QrrBk3!:g'hr:p<m&+0B!huE`fhuE3G!._ib!'g&Srr<%K
+qu6ZSrW)fp!5SI3nc&Ugq#CC*mJd9=!!!,Ys7$$gJA;-bJ+N[Bqu?^=qu6ZSrW)fp!5SI3nGi:a
+!"\JsrVup!huE3G!._ibs8VTh!!iE$!9!hVqYpQ2qZ--c!.anG!"\Mt!<2oshuE3G!._ib!WW)f
+!!!&srrD!V!;c]q_#"-$rrBk2!!!PtrrDuq!!%N,s7$$gJAD3e!WVZY!;lcri;N`QrrBk3!:^!g
+i;*ER&+9Gtq#(0m5N)S2rr@Sc!!33$i:$^HJ,K<Hi;N`QrrBk3!:^!gnG3+b&+9GtnGN=e+5m1g
+rr@Sc!!33$_!h=(5Q(N]i;N`QrrBk3!:^!gq"asj&+9Gti;EWU&)dKWrr@Sc!!39&JFEO=+8l-=
+i;N`QrrBk3!:^!gr;$Bn&+9Gt_#465#N5XOrr@Sc!!*3%mf3=ur;QcTrW)fp!5SI3nG`Lfq>^L+
+mf*9;r;Zg"i;`<H!._lc!<`>i!!!9%rrD!V!;c]q_#"-#s7u]q&+9GtJGfHJ"5s4Krr@Sc!!*?(
+mf3=ir;QcTrW)fp!5SI3n,EB<qZ$U,mf31b!!2$XnG`K=_#OK@r9jUc!W;rti;N`QrrBk3!:Tpf
+_#"*3&+9Jq!!!&Xs7$$gJAD3d#Q4#j!!3#t!9!hVqYpQ2qZ-*b!9!_S!"\Pu!<2iqi;`<H!._lc
+!=/Df!;uisi;N`QrrBk3!:TpfnG<1c&+BMurqc]Rs7$$gJAD3d&,>Pmr;QcTrW)fp!5SI3n,EC_
+qZ$U,n,ECcqZ$VGiW&EI!._lc!>"tn!!%NIrrD!V!;c]q_#"-#rrDuo!!!PurrDuo!!%N-s7$$g
+JAD3d&,>Pm!.XtI!9!hVqYpQ2qZ-*b!;u]o!"\Pu!;u]o!.Wu-nG`K=_#OKHq!J+^5Q1T^i;N`Q
+rrBk3!:Tpfr;-Ho&+BMur;-HoJ)UFsrr@Sc!!*W*mJm5OrVllUrW)fp!5SI3n,ECcqZ$U,n,EC_
+qZ$U\iW&EI!._lc!>"tn!!#7^rrD!V!;c]q_#"-#rrDuo!!!PurrDik!!#7Bs7$$gJAD3d&,>Pm
+!'gG^!9!hVqYpQ2qZ-*b!;u]o!"\Pu!;QEk!'fHBnG`K=_#OKHq!J+^+8u3>i;N`QrrBk3!:Tpf
+r;-Ho&+BMuq"k$k5N2Y3rr@Sc!!*W*mJm5/rVllUrW)fp!5SI3n,ECcqZ$U,n,EC_qZ$U\iW&EI
+!._lc!>"tn!!",>rrD!V!;c]q_#"-#rrDuo!!!PurrDik!!#7Bs7$$gJAD3d&,>Pm!$D1>!9!hV
+qYpQ2qZ-*b!;u]o!"\Pu!;QEk!'fHBnG`K=_#OKHq!J+^+8u3>i;N`QrrBk3!:Tpfr;-Ho&+BMu
+q"k$k5N2Y3rr@Sc!!*W*mJm5/rVllUrW)fp!5SI3n,ECcqZ$U,n,EC_qZ$U\iW&EI!._lc!>"tn
+!!",>rrD!V!;c]q_#"-#rrDuo!!!PurrDuo!!%N-s7$$gJAD3d&,>Pm!$D1>!9!hVqYpQ2qZ-*b
+!;u]o!"\Pu!;u]o!.Wu-nG`K=_#OKHq!J+^+8u3>i;N`QrrBk3!:Tpfr;-Ho&+BMur;-HoJ)UFs
+rr@Sc!!*W*mJm5OrVllUrW)fp!5SI3n,ECcqZ$U,n,ECcqZ$VGiW&EI!.`8n!!2us!<2rt!>"u)
+!!#7ZrrE&q!!#7^rrD!V!;c]q_#"-#rrDuo!!!PurrE&q!9!nHrr@Sn!!!,ts8E!!&,?,(!'g;Z
+!<2iq!'gG^!9!hVqYpQ2qZ-*b!;u]o!"\Pu!<2iqi;`<H!.`8n!!iB#"FpIP&,?,(!'g;Z!<2iq
+!'gG^!9!hVqYpQ2qZ-*b!;u]o!"\Mtqu?]ti;`<H!.`8n!"\r+"Mb!;&,?,(!'g8YqZ$VGrVllU
+rW)fp!5SI3n,ECcqZ$U,mf31b!!2$XnG`K=bQ%VbqYp]V!!!Q)rVup_q#C3k!.XtI!9!hVqYpQ2
+qZ-*b!;u]o!"\Mt!.b"J!!D0ZnG`K=bQ%VbqYp]V!!!Q)rVup_q#:>EquHZp!9!hVqYpQ2qZ-*b
+!;u]o!"\Mt!.b"J!!D0ZnG`K=bQ%VbqZ$d%huE`fq#16n5PY6YJG]EFrrD!V!;c]q_#"-#rrDuo
+!!!Ptrr@TJ!!!8^s7$$gJBRun+8Z$A"5j.Z&,?,(!'g8Y!5SO5!!3#t!9!hVqYpQ2qZ-*b!;u]o
+!"\Mtqu?^-i;`<H!.`8n!$D(<"U!Z_!"\l(!!#7YrrBk5!!!&trrD!V!;c]q_#"-#rrDuo!!!Pu
+rrE&r!!",!s7$$gJBRun+8Z$A"5j.Z&,?,(!'g8Y!9!eU!!E0!!9!hVqYpQ2qZ-*b!;u]o!"\Pu
+!;u`p!'fEAnG`K=bQ%VbqZ$d%huE`fq#16n5PY6YnGN=e#Q4T%i;N`QrrBk3!:Tpfr;-Ho&+BMu
+q"t*lJ)L@rrr@Sn!!",<!!NJ_!!!Q)rVup_q#:?hr;Zg.r;QcTrW)fp!5SI3n,ECcqZ$U,n,ECW
+quGXSnG`K=bQ%VbqZ$d%huE`fq#16n5PY6Yr;?Tq+8l-=i;N`QrrBk3!:Tpfr;-Ho&+BMui;EWU
+!T3qHrr@Sn!!",<!!NJ_!!!Q)rVup_q#:?nr;Zg^r;QcTrW)fp!5SI3n,ECcqZ$U,n,EC'r;Zg"
+huE3G!.`8n!$D(<"U!Z_!"\l(!!#7Xs8;otJ,K<Hi;N`QrrBk3!:Tpfr;-Ho&+BMuJGfHJ&)[EV
+rr@T#!!!&os8)d""5j.Z&,?,(!'g5X!.b%Kqu6ZSrW)fp!5SI3n,ECcqZ$U,n,N:c!'fB@nG`K=
+ec5[lp](*j"U!Z_!"\l(!!#7Xrr^%:!!2us!9!hVqYpQ2qZ-*b!;u]o!"\T!!<2lrhZ**F!.`W#
+pAb!i"U!Z_!"\l(!!#7Xrr_`j!!iE$!9!hVqYpQ2qZ-*b!;u]o!"\T!!;ucq!!hB\nG`K=f)PdQ
+pAb!i"U!Z_!"\l(!!#7Xrr`0!!$D+<!9!hVqYpQ2qZ,4I!;QKm!"[rdnG`K=f)Pd]pAb!i"U!Z_
+!"\l(!!#7Ws8N'!J,B6Gi;N`QrrBk3!7q/MnGN=e+5[%err@T$!!#7Ws8)d""5j.Z&,?,(!'g2W
+!Up?jrrD!V!;c]q_#",_rrD!U!!#7?s7$$gJCac$J+ip>!!NJ_!!!Q)rVup_mJd1ErW(%>!5SO5
+!.Wl*nG`K=f)Pf#pAb!i"U!Z_!"\l(!!#7NrrD!V!6G0?JGfK(s7$$gJCaeos8)d""5j.Z&,?,(
+!'flN!9!hVaT)2=!!1pUnG`K=fDkmPp&Fmh"U!Z_!"\l(!!#7NrrD!V!6P6@rqufs"5X"Hrr@T%
+!!39&r:'aj"5j.Z&,?,(!'flN!9!hVao;A=r;Zg&h>d!E!.`]%!XJbpnGi^phuE`fq#16n5OJIN
+i;N_urrDim!!!Pcs7$$gJCji'&-'H8!!NJ_!!!Q)rVup_mJd1ErW((?!:]pe!$C%snG`K=fDksp
+s+'V>"U!Z_!"\l(!!#7WrrMToqYpQRrW)]m!<@W"rrD!U!!#7>s7$$gJCji&5QC3Q"U!Z_!"\l(
+!!#7Ws8N'!J,B6G_#=?/rrVZi#M&hS_#465J)1.orr@T%!!.TKn,NUohuE`fq#16n5PP0[qu?^=
+qu6YHrW)`n!l+d:ec,W"r;bXQnG`K=fDksPr9s[i"5j.Z&,?,(!'g5X"7Q9j#Q+Q"!;QTn!!%N"
+s8;ot!Sm_Err@TH!<<'!^u>=q!WVra!!NJ_!!!Q)rVup_p\t?2!!!&trrE&s!;ZWpr;HZr+4pMm
+rqufs"5NqGrr@TI!!=>Cs8M!X!X&Jln,NUohuE`fq#16n5PP0XJGoQHrrDuq!;ZWpq#16n&(gg]
+r;?Tq#Mf@Krr@TJ!!!-"rrDQK!!3E*i:$^M"5j.Z&,?,(!'g5Xr;ZhIrVllmr;cZn!:]sf!!h-U
+!;QKm!"[lbnG`K=r;Zg.rVllqirB,ks1n+("U!Z_!"\l(!!#7YrrE&s!!#7^rrDQe!;ZWpi;N]V
+"5!PQnGN=e+5Hncrr@TJ!!%NHs5O(\+9-l\!!NJ_!!!Q)rVup_q#:?lr;Zg>rVllUr;cZn!5SR6
+!!1^O!9!eU!'f9=nG`K=rVup!qu6ZSj8]3Fs6fpk"5j.Z&,?,(!'g8Y!;QKm!"]&.!5SR6!!2oq
+!.b"JfDbidr;ZhIh#HmD!.b%K!!iE$!;PUT!It+;!!NJ_!!!Q)rVup_q#:?`r;Zg&rVlkJrVup!
+q>^?m!.WZ$!.b"Jg]-dC!.b%K#9X!G^]FK8ro=%[s8;<c"U!Z_!"\l(!!#7YrrD!U!!!-"s8;ot
+"8`#trql`r5M6#7!!!&Ss7$$gJGoNR5QC3Q!!iQ(jT#>_s7l$_"U!Z_!"\l(!!#7YrrBk,!!!,t
+rrDup!!"+orrE&s!!!,Us7$$gJGoQKrr@TK!<<'!^ubUu"97lZ!!NJ_!!!Q)rVup_q#:?0oDejr
+qYpQnqu?^=g&D'Mr;Zg&g]-dC"b6RQ!WW)r!!48Bi8t"@#QN`N!!NJ_!!!Q)rVup_q#:>EoDek%
+qYpQjqu?^-g&D'Ir;Zg.g]-dC"b6RQ#QN`\!!39&puVPX&-'H6!!NJ_!!!Q)rVup_q#:>EoDek5
+qYpQjqu?^-g&D'Ar;Zg>g]-dC"b6RQ&-%1X!!3,tjo>H)s+'P<"U!Z_!"\l(!!#7Ys763j5PkB[
+nGE7d#MK+Wi;EWU5MQ5-rrdiP!$D4;!!,=`jo>EHs6]jj"5j.Z&,?,(!'g8Yo)Jc?qYpQbqu?^%
+g&D&fr;ZhIg]-dC"FpIPJ,K0D!?_@(!!.TKmJmCmhuE`fq#16n5Pb<Zrpp-crrD!T!!!,Srr@TJ
+!8@JBrrdiP!<;Qc!!3E*^uk[us8;9b"U!Z_!"\l(!!#7ZrrE&j!!!&qrrD!T!!!,Ss8;ot!S[SC
+rrdiP!WTt4!!33$i91.B!WVr_!!NJ_!!!Q)rVup_q>UHooDejnq>UHQqu?^!gA_0Pr;Zg"gAg[B
+"FpISs+'qG!WVZQ!!39&nEp8["5j.Z&,?,(!'g;Z!<2Tj!!i?"!9!bT!!CsT!;ucq!!h6XnG`T@
+!!iQ"!!.TEkPtYhs5<;F"U!Z_!"\l(!!#7ZrrDuh!!!Q*rrBk4!!!&RrrDim!!!P`s7$$jJ,g,X
+q#CF;r9++^&-'H5!!NJ_!!!Q)rVup_q>UHmoDek5q>UH1qu?]tgA_0Br;Zg>gAg[B"+U@nq"Xmj
+&,tbm![%GmmJmCmhuE`fq#16n5Pb<Zr:Bsh5Pb<Z_#+04!S[PRi;EWU5MH/,rr[cO+7T(+!=/Vf
+!!,=am/R:lhuE`fq#16n5Pb<Zr:BshJ,0*E_#+04!S[PR_#465J(jqlrr[cO5N)>;!<`Ac!!.TK
+r;Zg"q#C3k"U!Z_!"\l(!!#7ZrrDuh!;QQo_#+04!S[PRJGfK$s7$$jJ,k)7q#CHss+'>6!WW)r
+!!!9!s8)d""5j.Z&,?,(!'g;Z!;uKi!!2lp!5SL4!!1gRr;Zfug&LRA"+UCOJG9*Fs1mn"!Wi>r
+r;Zg.q#C3k"U!Z_!"\l(!!#7ZrrDui!!!,rrrBk4!!!&SrrE&s!!!,Ss7$$iJ-#]E!!.T-l2Ukf
+s7#se!$D"9qZ$d%huE`fq#16n5Pb<Zr:L$i#Pe<!_#+04!SdVSr;?Tq#MK.HrrR]Orq?Bn5N(f,
+!XJb`r;Zg^q#C3k"U!Z_!"\l(!!#7ZrrDui!!!Q)rrBk4!!!&SrrDim!!!P_s7$$iJ-5`D!!+22
+l2Ukrs1nR5!.XeDqZ$d%huE`fq#16n5Pb<Zrq-6k+8Gj9i;<QT"5EhUnGN=e+5-\`rrR]Ur:^0l
++7SOq![%Gmr;c?e"Q07[&,?,(!'g;Z!<2Wk!'g8Y!9!bT!!D!U!9!eU!'f0:nG`Q?#Pe#n!>"tj
+!!,=ar;ZfunG`XL!!!Q)rVup_q>UHoo`+uAq#:?Pqu?^!g]%8hr;ZhIg&LRA!e:gNpAb4!r9=7_
+J,]BH!!D`j"Mb!;&,?,(!'g;Z!<2Wkp\t6Oqu?^!g]%8(r;bLMnG`Q?&)d0^!<`8b!!3,tr;Zm(
+s5<_R!!iB#"FpIP&,?,(!'g8Yp&G'np\t6_qu?^%g].3P!!1aPnG`Q?+5lkn!<`>e!!33$q#(0o
+&-'HA!!!,ts8E!!&,?,(!'g8Yp&G'pp\t6_qu?^%h#@BRr;Zg"f`1I@!e;B.pAb3prp'Oc"97lh
+!!48BJG9*EJ,]HKrUBdd!>"u)!!#7Yrr@TD!!!8urrDil!!!PbrrDuq!!!8Vs7$$iJ3UjD!!*-#
+lMptks5<hU!C-VY!<)otr;?Tr+8Gg8!'g8Y!.aeD!"\i(!;QHl!"[lb!;QKm!"[`^nG`Q?5CiG-
+!<;?b!Y>=Hr;ZkJrqHHs!WW&us8Mrs!C-AY!!#7YrrBk/!!#7XrrDup!!"+rrrDQe!!"+ns7$$h
+J:I4l!IoXd!!48BJGfHKs8;Wl"UG(C!$D7>!!,=ZrVup_q#:?0pAjpe!;u`p!$C"r!9!eU!'f-9
+nG`N>J+WdBIt6kc!C-V_!!33$q"Ogl&,uV0#Q+N$q#16n5PY6Yi;EWU"7cBkrql`r5MZ8=_#465
+J(XejrrIZLo`,"W_!D%%J,]BH!X&Jlp](F=qu?]tqu6ZkrVup_q#:?`r;Zg&nGiCd!.Wf(!.b"J
+fDk@?!J(1B!!,="li7(dr;?Ts#QN`W!!,=RrVuqJr;QcdrVup_q#:?hr;Zg.nG`K=r;bUPr;Zfu
+fDk@?!J11A!!+2"m/R1is7lNm!Y>=Hp](=Zi;N]V5Q(N]i;N]V5PY6Yr;?Tq+7T:1_#=<6!Sm\T
+rqufs"5!SBrrI]Ko`,"7i9^LG#QO;l!!48BJG9*FJ&)$`!$D.=!5SR6!'g8Y!<2os!'fuQ!9!hV
+!!D$V!;ucq!!h-UnG`N?r:L$j+5lMd!XJb`r;Zj_s7ZKos+((K!"]#-!.b%K!'g5Xr;ZhInG`LX
+rVup'h#@BLr;Zg.fDk@?!J1%=!!*Vgm/R1us1nR5!It+D!!*-#r;Zg&r;Z]q!'g5X!.b%Kn,EC_
+rVup/h#@BDr;Zg>fDk@?!JC1?!!*W"m/R20s+(%J!WW)m!!*-"r;Zg"rVllsr;Zg^p\t?2!!!&g
+rrDur!!"+rrrD!U!!#78s7$$hKD>*>!>"\e!!+2Ar;Zm"s7l?h!<`8u!!!&urrDuq!!#7Xrr_`j
+!!hrlrVuqJh#@Air;ZhIfDk@?!JBn7!!*>om/R/Orqufu"97lc!!*2squH]q!;QKm!'g5X"8i-!
++7B.1^]4Dirr@TJ!7q2>rrIcAo`,!tnEg2V5Q(H[!XJb`p](="nFHV[J+ipB!!%N:rrVZi#M]:W
+!!!&Ns7$$hKCJO6!=/,]!!,=Zr;Zm0s1nC0!=/,c!!%NBrrMTom/I(dJ)(&(rqufs"4mMArrIo5
+o`,!pq!A%^J+3C:!?_@9!!*Vgo)Q9"!;ucq!!h*TnG`NEi:R'N"8M6`!Is&+!!,=`pAb4)i:?rX
+rrDim!!!P\s7$$hLZ%h*!<`,a!!.Sbr;ZkJr:^0l&&@f;!!0S/!:]pe!$BelnG`NEi:R'N"8M6`
+!WTt6!!3,ppAb4)_"7U,"1S:1i;EWU5M#l(rrIo5o`,!pq!A%^s+((K!Wi>jpAb49JFigA#Ij^5
+_#465J(FYhrrIo5o`,!pq!A%^s+((K!X&J\pAb49JFigA&%DQ=JGfJus7$$hLVWQ_!<Mu_!!*&t
+!!3E*_"Rg0++Wt`!$A]Mr;Zfuec5.=!KY%h!!*,qmJm7gs8;p!&-%1S!!+0loDekUp&>'^#OMHk
+!.Wi)!<2os!!CdOnG`NM_"@[.!W;?c!<N6!!!+2Ap&G(7o)Jc?p&G$l!.XG:!q60ph>[KQr;Zg&
+ec5.=!KY%h!!*,umJm7gs8;ou5Q:?V!'g&Tp&>-l!!",/rrTt9!T!bUq#(0m&(U^LrrJ1ro`,!n
+r9aOc!WW)u!It%@!!#7U!!!&mrr_`j!!hrlrVuqJhZ!TFr;Zg>ec5.=!KY%h!!*,umJm7gs8;ou
+s7l9f!'g)U!!Doo"2Fm:!Up$gr;HZr+5["ti;EWU5Lof'rrJ1ro`,!nr9aOc!WW-!!Wi>jp&G(W
+oDejrp&>#BrW)Ee!;QNn!"[rd!5SO5!.WQ!nG`NM_"@[.!W;?c!<N6"!!39&i:[-N5P+pU&,#u$
+!!%N<rrDQf!!!8\rr@TJ!7_&<rrJ1ro`,!nr9aOc!WW-!!XJb@p&G(WoDek5pAY-lr;Zg^nG`LH
+rVup#hZ*NS!!1ULnG`NM_"@[.!W;?c!<N6"!!3E*JG&sC+7oO55PG*Wr;?Tq+7T:1_#=<6!T3nW
+rqufs"4[A?rrJ1ro`,!nr9aOc!WW-!!=/Yt!!",5!!%NBrrDim!!!Q!rr@TJ!8meVr;?Tq#LreC
+rrInjo`,!nq!J+_!WW-!!=/Vs!!+0lo`4[b!:]pe!!i#nqu?_Hi;WfPr;Zg.eGo%<!JeJ`!!*,q
+mJm7gs8E!!#Q45p!?Zjc!!!&mrrD!U!!!,krrE&r!!#7ArrDQe!!"+js7$$hLZ%h*!<`,b!!*-#
+rVus(r:L$j++X%b!!Doo!5SO5!!2lp!9!MM!$C/!!9!eU!'f!5nG`NEi:R'N"8M9a!<N6"!!*?&
+o`,"'JG&sC#PJ)s_#465!VlZpJFrmB+5m/!_#465J(4MfrrIo5o`,!pq!J+_!WW-!!=/Pq!!*VG
+p&G('p&>#BquHQm!<2Tj!"\#f!.b"Je,Sq;!JfV+!!*2smJm7gs8E!!#Q45p!>!!>!!",6rr@TI
+!;ZWpr:Bsh&)dKd!!!&Ks7$$hLZ%h*!<`,b!!*-#rVus(r:L$j&)d-]!'g/VqZ$VGqYpQjoDejr
+iVroWr;Zg"e,Sq;!JB>'!!*2kmJm7gs8E!!#Q45p!=.QV!!%NAs8)crJ,90FnFQ\\#N>[_r;?Tq
+#Li_BrrIcAo`,!tnEp8W!WW-!!=/Pq!!*>opAb0op&>$kqZ$U\qYpQRoDejniVroQr;Zg.e,Sq;
+!JBn7!!*>omJm7gs8E!!#Q45p!<_ic!!!8srrE&q!!#7[rrBk,!!!,[rrDQe!!"+is7$$hKCJO6
+!=/,^!!*-#rVus(r:L$j"8Mcon,ECeqZ$U\qYpPGoDejniVro9r;Zg^e,Sq;!JC1?!!*W"mJm7g
+s8E!!#Q45p!<N,s!!!&grrE&q!!#7[s763j"6'7[_#465J(+GerrI]Go`,"'i9gRG!WW-!!=/Pq
+!!*-"r;Zg"n,ECcqZ$U<qu6Zqo)JakiVrn.r;b:GnG`N?q"4Uf&)cjU!<N6"!!*?&oDemkr;Zg&
+n,ECcqZ$U<qu6Zoo)JakiW&iV!!1OJnG`N?r:L$j+5lPe!<N6"!!*?&oDeoAJGoNK&+BMur;-Ho
++8c'<q""Ic!TO+Zrqufs"4I5=rrI]Ko`,"7i9gRG!WW-!!=/Pp!!,="rVup?n,ECcqZ$U<qu6Zc
+o)Jakir9#Vr;Zg&df8h:!J(+@!!+1WmJm7gs8E!!#Q42o!C,NA!!#7PrrDuo!!",<rrD!K!!!&Z
+rrDim!!!PXs7$$hJH#3A!C+Bf!!*-#rVus(r:Bsi+7T70!.XJ;!;u]o!$D+<!5S1+!!2fn!:]4Q
+!$BYhnG`N>Ie<[A5Ci/%!<N6"!!*?&oDf")qu?]tmf*:bqZ$U<qu6YHo)JakpAY-.kl:]Jdf8h:
+!J#[m!!.S"mJm7gs8E!!#Q42o"pb/.!!iOSr;Zg^p&>$iqZ$U<qu?3e!!2fnkPtU4df8h:!J!E-
+!!%N9!!*-#rVus(r:Bsm!WTq8+9)0<!'g/V!;u]o!$D.=!<2Nh!!2io!<20^dJr_9!e<Lcp&G*m
+m/R.fs8E!!#Q4/n"TSB#s8;cp!'g/V!<2iq!'gD]!;uBf!!Duq!;u']!!1LInG`Q?+2IUN!<N2e
+!!*-#rVus(r:9mgJ,]HJq"t*l5P>$VrqcZq5Q(N]q!nCb"8DfqpuqbY"4@/<rrR]m_"Rg0!WMHd
+!<N6"!!*?&o)Jb4rr2uVqu?^]p&>$kqZ$U\r;Qcdnc/Xlp\t6_kl:\gdJr_9!e:g>pAb3rr9XIb
+!WW-!!=/Po!!!Q/rrBk4!!#7VrrE&q!!#7]rrD!J!!!,qrrD!A!!!PWs7$$iJ.LT4!!*3"m/R.f
+s8E!!#Q4/n!"])/!5SL4!'g,UqZ$VGr;Qc4nc/Xpp\t6/kl:]*dJr_9!e:OFpAb4!q!A%^!WW-!
+!=/Po!!",?rrD!T!!#7Us8)crJ,K<HJFW[?#P\5uJE[%65LKN#rrR]Uq"Fah&+Jrd!<N6"!!*?&
+o)Jc?rr2unqu?^]o`"oAquHWonGiP"p]'FW!.WDrnG`Q?"8qln!?^gu!!*-#rVus(r:9perrDup
+!!#7Urr@TI!;uisrp]sg&,?/)roa@/s7$$iJ-#TB!!+2"m/R.fs8E!!#Q42o"TeZ$!WW/s!!#7U
+rrBk5!!!&trrDue!!",9rrDu]!!!&Hs7$$iJ-#ZD!!,=Bm/R.fs8E!!#Q42o"pb1D!$D5kr;Zg^
+o`"p,r;Zfur;QclnGiP2q#:?hkl:\cd/WV8!e::NpAb5D_!M+&!WW-!!=/Pp!!Wu6!!!9(_#465
+5P4sUi;EWU"8r0!q#(0m+8l-=rql`r5PY6YnEBoQ#LNM?rr[cOIt7:o!WR];!!*-#rVus(r:Bsn
++8c*=!WV*V!!#7UrrDQe!!!9%rrDQe!!#7\s82isJ,'$Di9:4A&((@Grr[cO5J['p!<N5e!!*-#
+rVus(r:Bsi5OeXP!Is&+!!#7UrrDim!!!Q-rrDQe!!%NGrr@TJ!;HKn_!(h!+41&Wrr[cO+5lqp
+!<`>f!!*-#rVus(r:Bsi5N)M@!C-)P!!#7UrrDuq!!",=rrD!U!;c]q_#=<6!VcToJE[%65LBH"
+rr[cO+7T(+!=/Vj!!*-#rVus(r:BsiJ&)$`!?_+8!!#7UrrE&s!!#7]rrD!V!!!&rrrD!V!!!,q
+s6'F_J'e5brr[cO&,>r#!>#+p!!*-#rVus(r:Bsis+((K!>#,,!!#7Ts8;otJ,K<Hi;N]V"8`#t
+nGWCf#Pe<!roa@.s7$$jJ,fiPq#CF;q!7t]!WW-!!=/Pq!!*-#r;Zj'r;?Tq5P+mTJGoQGrrD!V
+!!!9#rrDin!!!Q)rrE&_!!!&Gs7$$jJ,f]Oq#CGFnE^,U!WW-!!=/Pq!!*-"r;Zj#rqufs5P+mW
+^]4?8qu6ZSrVup/qYpQnrVup?q#:?lkl:\cci<M7"FpIQs+'qG!WV*E!!*-#rVus(r:L$j"8r)t
+!<N6!!!#7Trr_`j!!iE$!9!hV!$D%:rVuqJq#:?lkl:\gci<M7"FpIPs1nL3!Wi>:li7%es8E!!
+#Q45p!<`,p!!*&t!!#7Trr`0!!$D+<!9!hV!'g;Z!l+d:p\t6gkl:\oci<M7"FpIPJ+3=8!=/Yj
+!!*-#rVus(r:L$j#OqWk!IoY!!!#7Ss8N'!J,B6Gi;N]VJ,0*Gn,N^frrDiY!!"+es7$$kJ,fQk
+r;-Hp+9(R+!<N6"!!*?&o`,!tnGE7eIt7Lu!'g&S!Up?jrrD!V!;HKo!.XbC!;PdY!'eg0nG`WA
+!!!Q/qZ$X]r9F=`!WW-!!=/Pq!!*Vgqu?a^_#=<65O&1Ji;N`BrrDiY!!%Mps7$$lJ,fQSs+("I
+!WVr\!!*-#rVus(r:L$j&)d?c!C+C!!!#7JrrD!V!:0Xbq!%hZ!RC`7rrmoQ!!3,Xr;Zm$s5<2C
+!<N6"!!*?&o`,"'_#+05+2IjU!'f`J!9!hVli-t[l2UehcN!D6!.b%K!WW)r!!48B_!:t$!WW-!
+!=/Pq!!*VGqu?a>_#=<65O&1Ji;N`BrrDin!!!P@s7$$gJGoNM5Q?95!<<)a!!*-#rVus(r:L$j
+++X7h!>",f!!#7JrrD!V!:0Xbq#16n+1hLArr@TK!!aVGn,NFns8M9`!<N6"!!*?&o`,"7JG]BJ
+&)dEe!'f`J!9!hVli-t[rVup_])V:"!.b%K#7(;/^]FK8q!%h[!WW-!!=/Pq!!+0lqu?a.i;N]V
+5O&1Ji;N`BrrDin!!#6ps7$$gJGoNK!W2lsi9C:C!WW-!!=/Pq!!+0lqu?a.i;N]V5P"gTn-Agi
+!9!hVp\t6oJ+rsCq#16n5J$marr@TJ!!%NHs60La!WW-!!=/Pq!!",<!!*>_rVup_o)J^i!.XnG
+!9!hVq#:Eb!!i8u!;QNn!'e'pnG`K=r;Zg.rVllqkl:_bs8E!!#Q45p!'g>\!=.Q^!!#7Trr`0!
+!$D+<!9!hVq#:E2!!2io!;QNn!'e'pnG`K=r;Zg"rVllekl:_bs8E!!#Q45p!'g>\!=/,n!!#7T
+rr_`j!!iE$!9!hVq#C<n!.XeD!;QNn!'e'pnG`K=qu?g@s8W)^!!*-#rVus(r:L$i5PkE]#Oq]m
+!'g)T"2Fm:!W2lsi;N`PrrDur!!",9rrDin!!#6ps7$$gJGT?HrrBju!!*-#rVus(r:L$i5PkE]
+#Oq]m!'g)T!.b%Kqu6ZSrW)co!;QNn!"\l)!;QNn!'e'pnG`K=hZ*ZXs8E!!#Q45p!'g>\!=/,n
+!!#7Ts8;otJ,K<Hi;N`PrrDQf!!!9!rrDin!!#6ps7$$gJDU>-!WW-!!=/Pq!!#7\!!*>orVup_
+o`"pjr;Zg^r;QcTrW)co!9!hV!!E#r!;QNn!'e'pnG`K=hZ*ZXs8E!!#Q45p!$D(<!=.Q^!!#7U
+rrDuq!!",=rrD!V!;ZWp_#=<6!VlZpq#16n5J$marr@T,!!*-#rVus(r:L$i+8Z$=#N5R]!'g,U
+!;QKm!"]#-!9!hVq>UGFr;cWm!;QNn!'e'pnG`K=hZ*ZXs8E!!#Q45p!?Zji!!*VgrVup_o`"p\
+r;Zg&r;QcTrW)coqu?_Hq>UHirVup_])V:"!.`r,!<N6"!!*?&o`,"7JG]BJ&)dEe!'g,U!9!eU
+!!E0!!9!hVqYpQpqu?^]q>UHirVup_])V:"!.`r,!<N6"!!*?&o`,"7JG]BJ&)dEe!'g,U!5SO5
+!!3#t!9!hVqYpQnqu?^=q>UHirVup_])V:"!.`r,!<N6"!!*?&o`,"'JG]BJ&&A/E!'g,U!5SO5
+!!3#t!9!hVqYpQnqu?^=q>UHirVup_])V:"!.`r,!<N6"!!*?&o`,"'_#+05+2IjU!'g,U!.atI
+r;QcTrW)fp!;QHl!"\o*!;QNn!'e'pnG`K=hZ*ZXs8E!!#Q45p!>!!D!!+1WrVup_o`"oAquHZp
+!9!hVqYpQjqu?^-q>UHirVup_])V:"!.`r,!<N6"!!*?&o`,"'i;<QU5J[6u!'g,UqZ$VGrVllU
+rW)fp!:]md!!i?"!;QNn!'e'pnG`K=hZ*ZXs8E!!#Q45p!=.Q\!!,<7rVup_o`+dg!.XtI!9!hV
+qYpQbqu?^%q>UHirVup_])V:"!.`r,!<N6"!!*?&o`,!tnGE7eIt7Lu!'g/V!<2iq!'gG^!9!hV
+qYpQRqu?^!q>UHirVup_])V:"!.`r,!<N6"!!*?&o`,!pnGE7dJ,K?I5P>$VrqcZq5Q1T^i;N`Q
+rrD!T!!!,srrDin!!#6ps7$$gJDU>-!WW-!!=/Pq!!*2squ?`sr;Zg^p&>$kqZ$U\rVllUrW)fp
+!9!bT!!E&s!;QNn!'e'pnG`K=hZ*ZXs8E!!#Q45p!<N,s!!*-"r;Zg^qZ$3g!'gG^!9!hVqYpQR
+qu?^!q>UHirVup_])V:"!.`r,!<N6"!!*?&o`,!nrquft"8r)t!'gA\!;uKi!$D1>!9!hVqYpQ2
+qu?]tq>UHirVup_])V:"!.`r,!<N6"!!*?&oDemkr;Zj'r;?Tq5PtH\nFZb]+8u3>i;N`QrrBk4
+!!!&qrrDin!!#6ps7$$gJDU>-!WW-!!=/Pp!!.S"rVus0q#(0m5PtH\i:R'M+8u3>i;N`QrrBk4
+!!!&qrrDin!!#6ps7$$gJDU>-!WW-!!=/Pp!!,="rVus@nGN=e5PtH\_"@[-+8u3>i;N`QrrBk4
+!!!&qrrDin!!#6ps7$$gJDU>-!WW-!!=/Pp!!,=BrVus`i;EWU5PtH\JFrmB+8u3>i;N`QrrBk4
+!!!&qrrDin!!#6ps7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655PtKQ!!",>rrD!V!;c]q_#+04
+!Vu`qq#16n5J$marr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7]rrE&j!!",>rrD!V!;c]q_#+04
+!Vu`qq#16n5J$marr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7]rrDuh!!",>rrD!V!;c]q_#+04
+!Vu`qq#16n5J$marr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7]rrDid!!",>rrD!V!;c]q_#+04
+!Vu`qq#16n5J$marr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7]rrDQ\!!#7^rrD!V!;c]qi;<QT
+"8VrsnGWCf5J$marr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7]rrD!L!!#7^rrD!V!;c]qi;<QT
+"8Vrsi;N]V5J$marr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7]rrBk,!!#7^rrD!V!;c]qi;<QT
+"8Vrs_#=<65J$marr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7]rr@TA!!#7^rrD!V!;c]qi;<QT
+"8VrsJGoNK5J$marr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7]s763jJ,TBIi;N`QrrDQd!!!9"
+s8;ot5J$marr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7^rrE&i!!%NIrrD!V!;c]qnGE7d#Q"H#
+rqufs5J$marr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7^rrDug!;uisi;N`QrrDil!!!Q+rrDuq
+!!#6ps7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q1T^q""L`rrD!V!;c]qq"t*l&,Q;+q#(0m
+5J$marr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7^rrDQ\!!!&trrD!V!;c]qr;6Np+8Z!;nGN=e
+J%G[Lrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7^rrD!L!!!&trrD!V!;c]qr;6Np+8Z!;i;EWU
+J%G[Lrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7^rrBk,!!!-!rrD!V!;c]qrql`r5PkB[_#48D
+s7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q1T^JFigA#Q4T%i;N`Ps82isJ,90FJGfJYs7$$g
+JDU>-!WW-!!=/Pp!!+22rVutK_#4655Q1WR!!!Q-rrD!V!;ZWpJGfKDs8;ot!P/7"rr@T,!!*-#
+rVus(r:Bsi+7T70!Iqo`!!#7_rrE&i!!",=rrD!V!;ZWp_#=<6!W)frrqufs"1eI$rr@T,!!*-#
+rVus(r:Bsi+7T70!Iqo`!!#7_rrDug!!#7]rrD!V!;ZWpi;N]V"8`#tr;?Tq#J'm(rr@T,!!*-#
+rVus(r:Bsi+7T70!Iqo`!!#7_rrDic!!%NHrrD!V!;ZWpnGWCf#Q"H#q#(0m&%V`0rr@T,!!*-#
+rVus(r:Bsi+7T70!Iqo`!!#7_rrDic!;lcri;N`PrrDin!!!Q+rrDQe!!"+Os7$$gJDU>-!WW-!
+!=/Pp!!+22rVutK_#4655Q:Z_nFQ\\!W2lsi;N`PrrDur!!",;rrD!U!!#6os7$$gJDU>-!WW-!
+!=/Pp!!+22rVutK_#4655Q:Z_nFQ\\#Q+N$i;N`Os8DuuJ,90F_#465J%>UKrr@T,!!*-#rVus(
+r:Bsi+7T70!Iqo`!!#7_rrD!U!;lcuqu?^=qu6ZSrW)`n!l+d:q>UGFr;aA-nG`K=hZ*ZXs8E!!
+#Q42o!?^h1!!.Sbr;Zg^rr2uVrVup!qZ$Qq!.XnG!9!hVq#:Eb!!i?"r;Zfu\Gu'u!.`r,!<N6"
+!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hV!!E)t!Up?jrrD!V!;HKo!.XkF!<2os!!Bb2nG`K=hZ*ZX
+s8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrVup'nc&UIrW)Bd!;ucq!!g%6nG`K=hZ*ZXs8E!!#Q42o
+!?^h1!!.Sbr;Zg^rr2uVrVup/nc&UIrW)Bd!;QKm!"ZU>nG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sb
+r;Zg^rr2uVrVup?nc&U)rW)Bd!:]pe!$A`NnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uV
+rVup_nc&T>rW)Bd!9!eU!'e!nnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrVuqJnc/Of
+mf*:&r;ZhIp\t9`#K6Z3rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!:g'hrquibrr@TJ
+!;?Hm!!%Mfs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`HrrDuq!:Kmc!!!&orr`0!
+!$B2[nG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)co!Up?krrDim!;HKo!.XnG!<2os
+!!Duq"7Q9j#K?`4rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;ZZp!!%NHrrDQe!;QQq
+n,N^jrrDuq!!!8urr^%:!!1(=nG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)fp"8i-!
++8l-=i;EZNrrTt9!W2lsq#(0m&,6)(JGoPfs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_
+i;N`Qrr_`j!!iH%!5SR6!!2lprVuqJr;Qcdr;Zg>p](0l!.W#gnG`K=hZ*ZXs8E!!#Q42o!?^h1
+!!.Sbr;Zg^rr2uVrW)fp"2Fm:!W;rtJGoNK!Vu`qr;HZr+8l-=i;EWU5PY6Yrqufs5K<`mrr@T,
+!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;c]qJGoQHs8;ot"8Vrsq#16n&,cG-_#465J,'$D
+r;?Tq+3+?Mrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;c`o!!%NJrrE&s!!!,srrDQf
+!!!9%rr@TJ!;HKnq#(0m&'"Y=rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;lcrrqufs
+5Q:Z_r;?Tq#PnB"i;N]V"8r2t!!!&orrDQe!!!8Ds7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#465
+5Q:Z_i;N`RrrDuq!!",?rrDim!!!Q*rrBk6!!!&urrE&s!!!,qrrD!U!!!,@s7$$gJDU>-!WW-!
+!=/Pp!!+22rVutK_#4655Q:Z_i;N`RrrDid!!",:rr@TA!!!8urrBk+!!%Mqs7$$gJDU>-!WW-!
+!=/Pp!!+22rVutK_#4655Q:Z_i;N`RrrDQ\!!#7Zs763j&,6)(_".O++41&Wrr@T,!!*-#rVus(
+r:Bsi+7T70!Iqo`!!#7_rrD!V!;lcri:I!LJ,90Frpp*i+8>d8JF`a@#LNM?rr@T,!!*-#rVus(
+r:Bsi+7T70!Iqo`!!#7_rrD!V!;lcr_"7X&rrDug!!#7Xrr@T@!!!,Js7$$gJDU>-!WW-!!=/Pp
+!!+22rVutK_#4655Q:Z_i;N`RrrBk-!!!&qrrDug!!%NCs7--i!RUl9rr@T,!!*-#rVus(r:Bsi
++7T70!Iqo`!!#7_rrD!V!;lcrJFrmB"8Vrsq""LZs7$*9s7$$gJDU>-!WW-!!=/Pp!!+22rVutK
+_#4655Q:Z_i;N`Rrr@TB!!!9"rrDid!!!&orrE&g!!%Mrs7$$gJDU>-!WW-!!=/Pp!!+22rVutK
+_#4655Q:Z_i;N`Rs7?9k&,H5*nFQ\\"8Dfqrp]sg5LKN#rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`
+!!#7_rrD!V!;lfg!!",:rrDQ\!!!8urrE&g!!"+gs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#465
+5Q:Z_i;N`SrrE&j!!#7ZrrD!L!!!Q(rrE&g!!!PWs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#465
+5Q:Z_i;N`SrrE&j!!%NErrD!L!!",8rrDue!!!8Os7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#465
+5Q:Z_i;N`SrrE&j!;QQoi:I!L5PP0Xr:'ae"4@/<rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_
+rrD!V!;uisrq-6k!VlZpi:I!LJ+rsCr:'ae!R^r:rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_
+rrD!V!;uisr:L$i"8Mlr_"7X#rrDud!7Ci9rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V
+!;uisr:L$i#Pe<!_"@[-!VZNnr9s[dJ("Adrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V
+!;uisr:L$i&,?/)_"@[-"8;`pr9s[d5LTT$rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V
+!;uisr:L$i+8Gj9_"@[-#PS/tr9s[d+4C2Yrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V
+!;uisr:L$i5PY6Y_"@[-&,-#'r9s[d&(:LIrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V
+!;uisr:L$iJ,'$D_"@[-+85^7r9s[d#L`YArr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V
+!;uisr:L'arrBk-!!#7WrrE&f!!!,Ls7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`S
+rrDuj!!!&orrBk-!!%NBrrE&f!!!&Js7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`S
+rrDuj!!!,qrrBk-!;6?lrpKj8s7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`SrrE&l
+!!!8urrD!N!!!&mrrE&e!!%Mts7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`SrrE&l
+!!!Q(rrD!N!!!,ns6fpf5L]Z%rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;uisrq6<l
++8>d8i:[-N#PA&b!!"+is7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`SrrE&l!!#7X
+rrD!N!!!Q%rr@T=!!!PYs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`Rs7QEmJ+rsC
+nFch^+8#R5JFEO=#Li_Brr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;lfj!!!&nrrDQ^
+!!%N@rrBk(!!!,Ms7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`Rrr@TE!!!8trrDig
+!!!&krrBk(!!!&Ks7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`Rrr@TI!:g'hq"t*l
+&+9Gti;EWU"8VrsJGfJss7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`RrrBk5!!!&i
+rrDup!!",/rrDQe!!!9"rrBk5!!%Mus7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`R
+rrBk5!!!&irrDup!!",/rrDim!!!Q*rrD!U!!#75s7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#465
+5Q:Z_i;N`RrrD!U!!!,krrE&r!!#7OrrDuq!!",:rrDQe!!#75s7$$gJDU>-!WW-!!=/Pp!!+22
+rVutK_#4655Q:Z_i;N`RrrDQe!!!8ns82isJ+!=:rqufs5Pb<Zq#(0m+4U>[rr@T,!!*-#rVus(
+r:Bsi+7T70!Iqo`!!#7_rrD!V!;lcrq#(0m&+KT!JGfK7s8;otJ,0*Er;?Tq+4U>[rr@T,!!*-#
+rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;lcrr;?Tq+7T:1_#=<6!UTgdJGoQDrrE&s!!!PZs7$$g
+JDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`RrrE&s!!#7QrrD!V!!!,frr^%:!!2ior;Zg.
+eGo%<!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hVqZ$Ko!.XM<!:]sf!!hlj"2Fm:!VcTo
+JGoNK&(LXKrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;c]qJGoQ;rrDin!!!Prrr^%:
+!!2io!5SR6!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)fp"2Fm:!Up$gr;HZr
++70"0^]4?8p\t6OrVup/eGo%<!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hVqYpZe!!!8l
+s8DuuJ*d1;^]4?8p\t6_rVup/eGo%<!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hVqYpZq
+!!",/rrTt9!UKaf^]4?8p\t6grVup/eGo%<!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hV
+q>^Hp!.XG:!q60pli.(&!!!&orrDur!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_
+i;N`PrrMTom/I(dJ*[+:^]4?8p\t6mrVup/eGo%<!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_
+!9!hVb5VRZ!!!&orrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`!rr^%:
+!!2io!<2rt!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW(+@"2Fm:!VcTorr)lt
+&(LXKrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!6Y<D^]4?8p\t6mrVup/eGo%<!.`r,
+!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hVb5VRZ!!!&orrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp
+!!+22rVutK_#4655Q:Z_i;N`!rr^%:!!2io!<2rt!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sb
+r;Zg^rr2uVrW(+@"2Fm:!VcTorr)lt&(LXKrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V
+!;ZWqn-A=[!<@W8rr^%:!!2io!<2rt!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uV
+rW)corr<%Kmf*@X!!hii"2Fm:!VcTorr)lt&(LXKrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_
+rrD!V!;c]tqu?^=mf*@(!!2Ec"2Fm:!VcTorr)lt&(LXKrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`
+!!#7_rrD!V!;c]tn,NFnmf37d!.XA8"2Fm:!VcTorr)lt&(LXKrr@T,!!*-#rVus(r:Bsi+7T70
+!Iqo`!!#7_rrD!V!;c]t^]4?8n,ECcrVup?m/I1'!!!&orrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp
+!!+22rVutK_#4655Q:Z_i;N`Qrr@TK!:Tpfq#16n&+';u^]4?8p\t6mrVup/eGo%<!.`r,!<N6"
+!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hVqZ$Ko!.XM<!:]sf!!hlj"2Fm:!VcTorr)lt&(LXKrr@T,
+!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;lcrrqufs5Oe[Qi;N]V"76$i^]4?8p\t6mrVup/
+eGo%<!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hVqu6Zor;Zg>nG`L(rVup!m/I1'!!!&o
+rrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`RrrDim!!!Q+rrMU2q>UGF
+r;c3a"2Fm:!VcTorr)lt&(LXKrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;lcrnGN=e
+#Q"H$^^']8qu?_HmJd:(!!!&orrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_
+i;N`RrrD!U!!!,trrE*#qYpQpqu?^]mJd:(!!!&orrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22
+rVutK_#4655Q:Z_i;N`RrrBk+!;c]qr;6Np+79(1^]4?8p\t6mrVup/eGo%<!.`r,!<N6"!!*?&
+oDen6nGWCgJ&)!_!'gJ_!9!hVqu6Z3o)Jc?qu6Zoqu?^=mJd:(!!!&orrE&t!!!PZs7$$gJDU>-
+!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`Rrr@T@!!#7\rrDil!!!Psrr^%:!!2io!<2rt!"[TZ
+nG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)iq!.aY@!$D+<!;Q0d!.X\A"2Fm:!VcTo
+rr)lt&(LXKrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;lfe!!!Q,rrDQ\!!",6rr^%:
+!!2io!<2rt!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)iqnc/Xpqu6ZcoDejr
+p&>-0!!!&orrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`SrrE&h!!!,u
+rrD!L!!!,orr^%:!!2io!<2rt!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)lr
+!<2Nh!!2us!9!JL!!2cm"2Fm:!VcTorr)lt&(LXKrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_
+rrD!V!;uisrp^!crrD!K!;6?o^]4?8p\t6mrVup/eGo%<!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_
+!'gJ_!9!hVr;QcrnGiQ=r;QcTo)Jc?pAY61!!!&orrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22
+rVutK_#4655Q:Z_i;N`SrrDue!!#7]rrBk+!!#7Wrr^%:!!2io!<2rt!"[TZnG`K=hZ*ZXs8E!!
+#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)lr!;u?e!$D.=!5S1+!$Cq7"2Fm:!VcTorr)lt&(LXKrr@T,
+!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;uisr:'ae&,cG-_".O+&,-#*^]4?8p\t6mrVup/
+eGo%<!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hVr;QcpnGiOor;Qc4o)JaqpAY61!!!&o
+rrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`SrrDue!!!-!rrBk+!!!,p
+rr^%:!!2io!<2rt!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)lr!;u?e!!3#t
+!5S1+!!2fn"2Fm:!VcTorr)lt&(LXKrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;uis
+r9s^arrBk*!;?Ep^]4?8p\t6mrVup/eGo%<!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hV
+r;Qcpn,NH<rVll5nc/Z>p\t?2!!!&orrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#465
+5Q:Z_i;N`SrrDud!!#7^rrBk*!!#7Xrr^%:!!2io!<2rt!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1
+!!.Sbr;Zg^rr2uVrW)lr!<2Hf!$D1>!9!DJ!$Ct8"2Fm:!VcTorr)lt&(LXKrr@T,!!*-#rVus(
+r:Bsi+7T70!Iqo`!!#7_rrD!V!;uisrpTmf&,lM.i:6jJ&,6)+^]4?8p\t6mrVup/eGo%<!.`r,
+!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hVr;Qcrn,NFnrVllUnc/Xpp\t?2!!!&orrE&t!!!PZ
+s7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`SrrE&f!!!-"rrD!J!!!,qrr^%:!!2io
+!<2rt!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)iqn,NFhrVllenc/Xlp\t?2
+!!!&orrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`Rs6fsdrrDQZ!!!&o
+rr^%:!!2io!<2rt!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)iq!.aP=!.Y"J
+!;Q*b!!2io"2Fm:!VcTorr)lt&(LXKrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;lcr
+JFEO=5Q:Z_q!e@Yrr^%:!!2io!<2rt!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uV
+rW)iq!5S((!$D4?!;u?ep\t?2!!!&orrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#465
+5Q:Z_i;N`RrrBk(!!!Q/rrDue!;HKq^]4?8p\t6mrVup/eGo%<!.`r,!<N6"!!*?&oDen6nGWCg
+J&)!_!'gJ_!9!hVqu6ZSr;Zg"qYpQnr;Zg&rr2utnGr=`"2Fm:!VcTorr)lt&(LXKrr@T,!!*-#
+rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;lcrnGN=e#Q"H#rqufs"9&8i!;HKq^]4?8p\t6mrVup/
+eGo%<!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hVqu6Zkr;Zg.q>^Bn!!3&u!.aV?p\t?2
+!!!&orrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`RrrDuq!!",:rr@TJ
+!<)ot_#=<6!W)frJGoQCrr^%:!!2io!<2rt!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^
+rr2uVrW)iq!<2os!'g;Z!5SO5!.Y"J!9!hV!!E)t!5SR6p\t?2!!!&orrE&t!!!PZs7$$gJDU>-
+!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`Qs8;otJ,0*Ei;EWU5Q:Z_nGWCf#Q"H#i;N`Nrr^%:
+!!2io!<2rt!"[TZnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)fp!.b%Kq#:?`r;Zg>
+rr2unrVup/qYpQRrW)]m"2Fm:!VcTorr)lt&(LXKrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_
+rrD!V!;c]t^]4?8q#:?hr;Zg.rr2urrVup?qYpQRrW)]m"2Fm:!VcTorr)lt&(LXKrr@T,!!*-#
+rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;c]tn,NFnq#:?lr;Zg&rVuis!.XkF!9!hVp\t?2!!!&o
+rrE&t!!!PZs7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`Qrr`0!!$D"9!<2os!!E3"
+!l+d:q>UHQrW)]m"2Fm:!VcTor;HZr#LreCrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V
+!;ZZp!!%NCs8;ot!WE$"n,N^hrrD!V!;HKq^]4?8p\t6grVup#eGo%<!.`r,!<N6"!!*?&oDen6
+nGWCgJ&)!_!'gJ_!9!hVq>UKb#PS/tJGfKGrrE+Lq>UHQrW)]m"2Fm:!VcTonGWCf!S%/=rr@T,
+!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!:9^c_#465J+N[?i;N`Nrr^%:!!2io!9!eUeGo%<
+!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hVm/I(Dr;Zg^oD\gKrW)]m"2Fm:!VcTo_#465
+J(=Sgrr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!:9^cnGN=e+7oL4i;N`Nrr^%:!!2io
+!.b"J!'f$6nG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)<b!;QKm!"\]$!9!hVp\t?2
+!!!&os82is+4^D\rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!:9^cr;?Tq#P7rqi;N`N
+rr^%:!!2lp!<2lr!"[W[nG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)<b!<2os!!Dim
+!9!hVp\t?2!!!&prrE&r!!!P[s7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`Bs8;ot
+!V?<ki;N`Nrr^%:!!2lp!;u`p!!h'SnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)co
+!Up?err@TJ!<)ou!.XhE!9!hVp\t?2!!!&prrDup!!!8Ss7$$gJDU>-!WW-!!=/Pp!!+22rVutK
+_#4655Q:Z_i;N`Ps8N'!J+imB_#46:J,fQ<!!i?"!9!hVp\t?2!!!&prrDil!!!,Os7$$gJDU>-
+!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`Qrr`0!!$Cq7!9!eU"[E%e^]4E2rrD!V!;HKq^]4?8
+q#:?hqu?^!ec5.=!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hVqYpZe!!!8trrDQe!!48B
+s8DuuJ,90Fi;N`Nrr^%:!!2lp!:]md!!1XMnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uV
+rW)fp"2Fm:!VZNnq#(0o&-)S,!!",;rrD!V!;HKq^]4?8q#:?`qu?]tec5.=!.`r,!<N6"!!*?&
+oDen6nGWCgJ&)!_!'gJ_!9!hVqYpPGrW)Zl!;ucq!XJc#rVup/qYpQRrW)]m"2Fm:!VlZpnGE7d
+!S.5>rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;c`o!!%NCrrE&s!!39&nGWCf#Q"H#
+i;N`Nrr^%:!!2lp!:]md!!1XMnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)iq!<2os
+!'g2Wr;Zm"s5<kV!!E)t!9!hVp\t?2!!!&prrD!S!7h,=rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`
+!!#7_rrD!V!;lcrr;?Tq+85^7JGfHKs1nU6!!2rr!9!hVp\t?2!!!&prrD!S!7h,=rr@T,!!*-#
+rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;lcrq#(0m&,-#'_#466It7ItqYpQRrW)]m"2Fm:!VlZp
+i;3N)s7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`RrrDQe!!!8trrD!U!!#7]!!%NG
+rrD!V!;HKq^]4?8q#:?PqZ,1HnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)iq!9!eU
+!!Drp!:]pe!$;%<!'gA\!9!hVp\t?2!!!&prrD!S!7h,=rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`
+!!#7_rrD!V!;lcr_"[m05PtH\q"Fag+8c'<i;N`Nrr^%:!!2lp!9!_Sec5.=!.`r,!<N6"!!*?&
+oDen6nGWCgJ&)!_!'gJ_!9!hVqu6Z3p](:)qu6ZopAb18qu6ZSrW)]m"2Fm:!VlZpi;3N)s7$$g
+JDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`Rrr@TE!!!,urrE&m!!!Q,rrD!V!;HKq^]4?8
+q#:?PqZ,1HnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)iq!.ahE!!2rrpAb1(qu6ZS
+rW)]m"2Fm:!VlZpi;3N)s7$$gJDU>-!WW-!!=/Pp!!+22rVutK_#4655Q:Z_i;N`Rs7QHhrr@TE
+!!!9$rrD!V!;HKq^]4?8q#:?`qu?]tec5.=!.`r,!<N6"!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hV
+qu??i!.XnG!5S@0!!iE$!9!hVp\t?2!!!&prrDQd!!!&Ms7$$gJDU>-!WW-!!=/Pp!!+22rVutK
+_#4655Q:Z_i;N`SrrE&l!!#7\rrD!P!!!,urrD!V!;HKq^]4?8q#:?`qu?]tec5.=!.`r,!<N6"
+!!*?&oDen6nGWCgJ&)!_!'gJ_!9!hVr;Qcrp&G(7qu6Zcp](9rqu6ZSrW)]m"2Fm:!VlZpnGE7d
+!S.5>rr@T,!!*-#rVus(r:Bsi+7T70!Iqo`!!#7_rrD!V!;uisrq6<l&,ZA,q"Ogh"8i)ui;N`N
+rr^%:!!2lp!;QHl!!CdOnG`K=hZ*ZXs8E!!#Q42o!?^h1!!.Sbr;Zg^rr2uVrW)lr!<2Zl!!iE$
+!;uTl!!E,u...
[truncated message content] |
|
From: <gi...@gp...> - 2011-05-26 05:03:35
|
The branch, master has been updated
via 43dcc15273d2d54d5aa14724a103bbcab71b5576 (commit)
via b677450457b9845de78196f679f7f9c55e283c3c (commit)
via 36c63521293a914b493fe18f23c99c2ed5c322d4 (commit)
via 678ce25e91de2e1fa856b38a77fcd0327b5030b3 (commit)
via e023b537cd1c12d881e40a4c8668d6ae81e275cb (commit)
via be6d8eb784f74ee9b496ef4b8dbb4af20feb5405 (commit)
from 813d9acc4f2ea3882fede5550bbf03b2fef8582a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
globalconst.h | 1 -
src/hid/gerber/gerber.c | 297 +++++++++++++++++++++++------------------------
2 files changed, 145 insertions(+), 153 deletions(-)
=================
Commit Messages
=================
commit 43dcc15273d2d54d5aa14724a103bbcab71b5576
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: gerber-cleanup-0006-Change-a-couple-more-0-s-to-NULL-s.patch
:100644 100644 23d87b4... b9f6f7b... M src/hid/gerber/gerber.c
commit b677450457b9845de78196f679f7f9c55e283c3c
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: gerber-cleanup-0005-Remove-old-now-unused-aperture-structures-functions.patch
:100755 100755 71bc61a... 428135d... M globalconst.h
:100644 100644 8daebf0... 23d87b4... M src/hid/gerber/gerber.c
commit 36c63521293a914b493fe18f23c99c2ed5c322d4
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: gerber-cleanup-0004-Use-new-aperture-functions-output-100-equal-to-origi.patch
:100644 100644 feecf6f... 8daebf0... M src/hid/gerber/gerber.c
commit 678ce25e91de2e1fa856b38a77fcd0327b5030b3
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: gerber-cleanup-0003-Add-new-aperture-functions-but-don-t-use-them.patch
:100644 100644 a3d6f84... feecf6f... M src/hid/gerber/gerber.c
commit e023b537cd1c12d881e40a4c8668d6ae81e275cb
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: gerber-cleanup-0002-Remove-global-variable-dependence-from-maybe_close-a.patch
:100644 100644 62295df... a3d6f84... M src/hid/gerber/gerber.c
commit be6d8eb784f74ee9b496ef4b8dbb4af20feb5405
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: gerber-cleanup-0001-Remove-unused-Aperture-structure.patch
:100644 100644 c8afa14... 62295df... M src/hid/gerber/gerber.c
=========
Changes
=========
commit 43dcc15273d2d54d5aa14724a103bbcab71b5576
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: gerber-cleanup-0006-Change-a-couple-more-0-s-to-NULL-s.patch
diff --git a/src/hid/gerber/gerber.c b/src/hid/gerber/gerber.c
index 23d87b4..b9f6f7b 100644
--- a/src/hid/gerber/gerber.c
+++ b/src/hid/gerber/gerber.c
@@ -320,7 +320,7 @@ static const char *copy_outline_names[] = {
"silk",
#define COPY_OUTLINE_ALL 3
"all",
- 0
+ NULL
};
static const char *name_style_names[] = {
@@ -332,7 +332,7 @@ static const char *name_style_names[] = {
"first",
#define NAME_STYLE_EAGLE 3
"eagle",
- 0
+ NULL
};
static HID_Attribute gerber_options[] = {
@@ -503,7 +503,7 @@ gerber_do_export (HID_Attr_Val * options)
if (!options)
{
- gerber_get_export_options (0);
+ gerber_get_export_options (NULL);
for (i = 0; i < NUM_OPTIONS; i++)
gerber_values[i] = gerber_options[i].default_val;
options = gerber_values;
@@ -620,7 +620,7 @@ gerber_set_layer (const char *name, int group, int empty)
&& group <
max_group) ? PCB->LayerGroups.Entries[group][0] : group;
- if (name == 0)
+ if (name == NULL)
name = PCB->Data->Layer[idx].Name;
if (idx >= 0 && idx < max_copper_layer && !print_layer[idx])
commit b677450457b9845de78196f679f7f9c55e283c3c
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: gerber-cleanup-0005-Remove-old-now-unused-aperture-structures-functions.patch
diff --git a/globalconst.h b/globalconst.h
index 71bc61a..428135d 100755
--- a/globalconst.h
+++ b/globalconst.h
@@ -126,5 +126,4 @@
/* to enable grid drawing */
/* size of diamond element mark */
#define EMARK_SIZE 1000
-#define GBX_MAXAPERTURECOUNT 2560
#endif
diff --git a/src/hid/gerber/gerber.c b/src/hid/gerber/gerber.c
index 8daebf0..23d87b4 100644
--- a/src/hid/gerber/gerber.c
+++ b/src/hid/gerber/gerber.c
@@ -125,26 +125,11 @@ typedef struct
int count;
} ApertureList;
-typedef struct
-{
- int some_apertures;
- int aperture_used[GBX_MAXAPERTURECOUNT];
-} Apertures;
-
static ApertureList *layer_aptr_list;
static ApertureList *curr_aptr_list;
static int layer_list_max;
static int layer_list_idx;
-static int global_aperture_count;
-static int global_aperture_sizes[GBX_MAXAPERTURECOUNT];
-static ApertureShape global_aperture_shapes[GBX_MAXAPERTURECOUNT];
-
-static Apertures *layerapps = NULL;
-static Apertures *curapp;
-static int n_layerapps = 0;
-static int c_layerapps = 0;
-
typedef struct
{
int diam;
@@ -299,135 +284,6 @@ setLayerApertureList (int layer_idx)
/* --------------------------------------------------------------------------- */
-/*----------------------------------------------------------------------------*/
-/* Aperture Routines */
-/*----------------------------------------------------------------------------*/
-
-
-
-static int
-findApertureCode (int width, ApertureShape shape)
-{
- int i;
-
- /* we never draw zero-width lines */
- if (width == 0)
- return (0);
-
- /* Search for an appropriate aperture. */
-
- for (i = 0; i < global_aperture_count; i++)
- {
- if (global_aperture_sizes[i] == width
- && global_aperture_shapes[i] == shape)
- {
- curapp->aperture_used[i] = 1;
- curapp->some_apertures = 1;
- return i + DCODE_BASE;
- }
- }
-
- /* Not found, create a new aperture and add it to the list */
- if (global_aperture_count < GBX_MAXAPERTURECOUNT)
- {
- i = global_aperture_count ++;
- global_aperture_sizes[i] = width;
- global_aperture_shapes[i] = shape;
- curapp->aperture_used[i] = 1;
- curapp->some_apertures = 1;
- return i + DCODE_BASE;
- }
- else
- {
- Message (_("Error, too many apertures needed for Gerber file.\n"));
- return (10);
- }
-}
-
-static void
-printAperture(FILE *f, int i)
-{
- int dCode = i + DCODE_BASE;
- int width = global_aperture_sizes[i];
-
- switch (global_aperture_shapes[i])
- {
- case ROUND:
- fprintf (f, "%%ADD%dC,%.4f*%%\r\n", dCode,
- COORD_TO_INCH(width));
- break;
- case SQUARE:
- fprintf (f, "%%ADD%dR,%.4fX%.4f*%%\r\n",
- dCode, COORD_TO_INCH(width), COORD_TO_INCH(width));
- break;
- case OCTAGON:
- fprintf (f, "%%AMOCT%d*5,0,8,0,0,%.4f,22.5*%%\r\n"
- "%%ADD%dOCT%d*%%\r\n", dCode,
- COORD_TO_INCH(width) / COS_22_5_DEGREE, dCode,
- dCode);
- break;
-#if 0
- case THERMAL:
- fprintf (f, "%%AMTHERM%d*7,0,0,%.4f,%.4f,%.4f,45*%%\r\n"
- "%%ADD%dTHERM%d*%%\r\n", dCode, gap / 100000.0,
- width / 100000.0, finger / 100000.0, dCode, dCode);
- break;
- case ROUNDCLEAR:
- fprintf (f, "%%ADD%dC,%.4fX%.4f*%%\r\n",
- dCode, gap / 100000.0, width / 100000.0);
- break;
- case SQUARECLEAR:
- fprintf (f, "%%ADD%dR,%.4fX%.4fX%.4fX%.4f*%%\r\n",
- dCode, gap / 100000.0, gap / 100000.0,
- width / 100000.0, width / 100000.0);
- break;
-#else
- default:
- break;
-#endif
- }
-}
-
-static int
-countApertures (const Apertures *ap)
-{
- int i, rv=0;
- for (i=0; i<GBX_MAXAPERTURECOUNT; i++)
- if (ap->aperture_used[i])
- rv ++;
- return rv;
-}
-
-static void
-initApertures ()
-{
- layerapps = NULL;
- n_layerapps = 0;
-}
-
-static void
-SetAppLayer (int l)
-{
- if (l >= n_layerapps)
- {
- int prev = n_layerapps;
- n_layerapps = l + 1;
- layerapps = (Apertures *)realloc (layerapps, n_layerapps * sizeof (*layerapps));
- curapp = layerapps + prev;
- while (curapp < layerapps + n_layerapps)
- {
- int i;
- curapp->some_apertures = 0;
- for (i=0; i<GBX_MAXAPERTURECOUNT; i++)
- curapp->aperture_used[i] = 0;
- curapp++;
- }
- }
- curapp = layerapps + l;
-}
-
-/* --------------------------------------------------------------------------- */
-
static HID gerber_hid;
typedef struct hid_gc_struct
commit 36c63521293a914b493fe18f23c99c2ed5c322d4
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: gerber-cleanup-0004-Use-new-aperture-functions-output-100-equal-to-origi.patch
diff --git a/src/hid/gerber/gerber.c b/src/hid/gerber/gerber.c
index feecf6f..8daebf0 100644
--- a/src/hid/gerber/gerber.c
+++ b/src/hid/gerber/gerber.c
@@ -718,15 +718,14 @@ gerber_do_export (HID_Attr_Val * options)
region.Y2 = PCB->MaxHeight;
pagecount = 1;
- initApertures ();
+ resetApertures ();
- f = NULL;
lastgroup = -1;
- c_layerapps = 0;
+ layer_list_idx = 0;
finding_apertures = 1;
hid_expose_callback (&gerber_hid, ®ion, 0);
- c_layerapps = 0;
+ layer_list_idx = 0;
finding_apertures = 0;
hid_expose_callback (&gerber_hid, ®ion, 0);
@@ -791,8 +790,8 @@ gerber_set_layer (const char *name, int group, int empty)
{
if (i == 0 || pending_drills[i].diam != pending_drills[i - 1].diam)
{
- int ap = findApertureCode (pending_drills[i].diam, ROUND);
- fprintf (f, "T%02d\r\n", ap);
+ Aperture *ap = findAperture (curr_aptr_list, pending_drills[i].diam, ROUND);
+ fprintf (f, "T%02d\r\n", ap->dCode);
}
fprintf (f, "X%06ldY%06ld\r\n",
gerberDrX (PCB, pending_drills[i].x),
@@ -818,8 +817,8 @@ gerber_set_layer (const char *name, int group, int empty)
#ifdef HAVE_GETPWUID
struct passwd *pwentry;
#endif
- int i;
- int some_apertures = 0;
+ ApertureList *aptr_list;
+ Aperture *search;
lastgroup = group;
lastX = -1;
@@ -828,13 +827,12 @@ gerber_set_layer (const char *name, int group, int empty)
linewidth = -1;
lastcap = -1;
- SetAppLayer (c_layerapps);
- c_layerapps++;
+ aptr_list = setLayerApertureList (layer_list_idx++);
if (finding_apertures)
goto emit_outline;
- if (!curapp->some_apertures && !all_layers)
+ if (aptr_list->count == 0 && !all_layers)
return 0;
maybe_close_f (f);
@@ -852,7 +850,7 @@ gerber_set_layer (const char *name, int group, int empty)
if (verbose)
{
- int c = countApertures (curapp);
+ int c = aptr_list->count;
printf ("Gerber: %d aperture%s in %s\n", c,
c == 1 ? "" : "s", filename);
}
@@ -862,11 +860,8 @@ gerber_set_layer (const char *name, int group, int empty)
/* We omit the ,TZ here because we are not omitting trailing zeros. Our format is
always six-digit 0.1 mil resolution (i.e. 001100 = 0.11")*/
fprintf (f, "M48\r\n" "INCH\r\n");
- for (i = 0; i < GBX_MAXAPERTURECOUNT; i++)
- if (curapp->aperture_used[i])
- fprintf (f, "T%02dC%.3f\r\n",
- i + DCODE_BASE,
- COORD_TO_INCH(global_aperture_sizes[i]));
+ for (search = aptr_list->data; search; search = search->next)
+ fprintf (f, "T%02dC%.3f\r\n", search->dCode, COORD_TO_INCH(search->width));
fprintf (f, "%%\r\n");
/* FIXME */
return 1;
@@ -922,13 +917,9 @@ gerber_set_layer (const char *name, int group, int empty)
fprintf (f, "%%LN%s*%%\r\n", layername);
lncount = 1;
- for (i=0; i<GBX_MAXAPERTURECOUNT; i++)
- if (curapp->aperture_used[i])
- {
- some_apertures ++;
- printAperture(f, i);
- }
- if (!some_apertures)
+ for (search = aptr_list->data; search; search = search->next)
+ fprintAperture(f, search);
+ if (aptr_list->count == 0)
/* We need to put *something* in the file to make it be parsed
as RS-274X instead of RS-274D. */
fprintf (f, "%%ADD11C,0.0100*%%\r\n");
@@ -1045,49 +1036,44 @@ gerber_set_draw_xor (hidGC gc, int xor_)
static void
use_gc (hidGC gc, int radius)
{
- int c;
if (radius)
{
radius *= 2;
if (radius != linewidth || lastcap != Round_Cap)
{
- c = findApertureCode (radius, ROUND);
- if (c <= 0)
- {
- fprintf (stderr,
- "error: aperture for radius %d type ROUND is %d\n",
- radius, c);
- }
- if (f && !is_drill)
- fprintf (f, "G54D%d*", c);
+ Aperture *aptr = findAperture (curr_aptr_list, radius, ROUND);
+ if (aptr == NULL)
+ fprintf (stderr, "error: aperture for radius %d type ROUND is null\n", radius);
+ else if (f && !is_drill)
+ fprintf (f, "G54D%d*", aptr->dCode);
linewidth = radius;
lastcap = Round_Cap;
}
}
else if (linewidth != gc->width || lastcap != gc->cap)
{
- int ap;
+ Aperture *aptr;
+ ApertureShape shape;
+
linewidth = gc->width;
lastcap = gc->cap;
switch (gc->cap)
{
case Round_Cap:
case Trace_Cap:
- c = ROUND;
+ shape = ROUND;
break;
default:
case Square_Cap:
- c = SQUARE;
+ shape = SQUARE;
break;
}
- ap = findApertureCode (linewidth, (ApertureShape)c);
- if (ap <= 0)
- {
- fprintf (stderr, "error: aperture for width %d type %s is %d\n",
- linewidth, c == ROUND ? "ROUND" : "SQUARE", ap);
- }
+ aptr = findAperture (curr_aptr_list, linewidth, shape);
+ if (aptr == NULL)
+ fprintf (stderr, "error: aperture for width %d type %s is null\n",
+ linewidth, shape == ROUND ? "ROUND" : "SQUARE");
if (f)
- fprintf (f, "G54D%d*", ap);
+ fprintf (f, "G54D%d*", aptr->dCode);
}
#if 0
if (lastcolor != gc->color)
commit 678ce25e91de2e1fa856b38a77fcd0327b5030b3
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: gerber-cleanup-0003-Add-new-aperture-functions-but-don-t-use-them.patch
diff --git a/src/hid/gerber/gerber.c b/src/hid/gerber/gerber.c
index a3d6f84..feecf6f 100644
--- a/src/hid/gerber/gerber.c
+++ b/src/hid/gerber/gerber.c
@@ -110,12 +110,32 @@ typedef enum ApertureShape ApertureShape;
dcode and macro numbers. */
#define DCODE_BASE 11
+typedef struct aperture
+{
+ int dCode; /* The RS-274X D code */
+ BDimension width; /* Size in pcb units */
+ ApertureShape shape; /* ROUND/SQUARE etc */
+ struct aperture *next;
+}
+Aperture;
+
+typedef struct
+{
+ Aperture *data;
+ int count;
+} ApertureList;
+
typedef struct
{
int some_apertures;
int aperture_used[GBX_MAXAPERTURECOUNT];
} Apertures;
+static ApertureList *layer_aptr_list;
+static ApertureList *curr_aptr_list;
+static int layer_list_max;
+static int layer_list_idx;
+
static int global_aperture_count;
static int global_aperture_sizes[GBX_MAXAPERTURECOUNT];
static ApertureShape global_aperture_shapes[GBX_MAXAPERTURECOUNT];
@@ -139,6 +159,145 @@ int n_pending_drills = 0, max_pending_drills = 0;
/*----------------------------------------------------------------------------*/
#define AUTO_OUTLINE_WIDTH MIL_TO_COORD(8) /* Auto-geneated outline width of 8 mils */
+/*----------------------------------------------------------------------------*/
+/* Aperture Routines */
+/*----------------------------------------------------------------------------*/
+
+/* Initialize aperture list */
+static void
+initApertureList (ApertureList *list)
+{
+ list->data = NULL;
+ list->count = 0;
+}
+
+static void
+deinitApertureList (ApertureList *list)
+{
+ Aperture *search = list->data;
+ Aperture *next;
+ while (search)
+ {
+ free(search);
+ search = next;
+ next = search->next;
+ }
+ initApertureList (list);
+}
+
+static void resetApertures()
+{
+ int i;
+ for (i = 0; i < layer_list_max; ++i)
+ deinitApertureList (&layer_aptr_list[i]);
+ free (layer_aptr_list);
+ layer_aptr_list = NULL;
+ layer_list_max = 0;
+ layer_list_idx = 0;
+}
+
+/* Create and add a new aperture to the list */
+static Aperture *
+addAperture (ApertureList *list, BDimension width, ApertureShape shape)
+{
+ static int aperture_count;
+
+ Aperture *app = (Aperture *) malloc (sizeof *app);
+ if (app == NULL)
+ return NULL;
+
+ app->width = width;
+ app->shape = shape;
+ app->dCode = DCODE_BASE + aperture_count++;
+ app->next = list->data;
+
+ list->data = app;
+ ++list->count;
+
+ return app;
+}
+
+/* Fetch an aperture from the list with the specified
+ * width/shape, creating a new one if none exists */
+static Aperture *
+findAperture (ApertureList *list, BDimension width, ApertureShape shape)
+{
+ Aperture *search;
+
+ /* we never draw zero-width lines */
+ if (width == 0)
+ return NULL;
+
+ /* Search for an appropriate aperture. */
+ for (search = list->data; search; search = search->next)
+ if (search->width == width && search->shape == shape)
+ return search;
+
+ /* Failing that, create a new one */
+ return addAperture (list, width, shape);
+}
+
+/* Output aperture data to the file */
+static void
+fprintAperture (FILE *f, Aperture *aptr)
+{
+ switch (aptr->shape)
+ {
+ case ROUND:
+ fprintf (f, "%%ADD%dC,%.4f*%%\r\n", aptr->dCode,
+ COORD_TO_INCH(aptr->width));
+ break;
+ case SQUARE:
+ fprintf (f, "%%ADD%dR,%.4fX%.4f*%%\r\n", aptr->dCode,
+ COORD_TO_INCH(aptr->width), COORD_TO_INCH(aptr->width));
+ break;
+ case OCTAGON:
+ fprintf (f, "%%AMOCT%d*5,0,8,0,0,%.4f,22.5*%%\r\n"
+ "%%ADD%dOCT%d*%%\r\n", aptr->dCode,
+ COORD_TO_INCH(aptr->width) / COS_22_5_DEGREE, aptr->dCode,
+ aptr->dCode);
+ break;
+#if 0
+ case THERMAL:
+ fprintf (f, "%%AMTHERM%d*7,0,0,%.4f,%.4f,%.4f,45*%%\r\n"
+ "%%ADD%dTHERM%d*%%\r\n", dCode, gap / 100000.0,
+ width / 100000.0, finger / 100000.0, dCode, dCode);
+ break;
+ case ROUNDCLEAR:
+ fprintf (f, "%%ADD%dC,%.4fX%.4f*%%\r\n",
+ dCode, gap / 100000.0, width / 100000.0);
+ break;
+ case SQUARECLEAR:
+ fprintf (f, "%%ADD%dR,%.4fX%.4fX%.4fX%.4f*%%\r\n",
+ dCode, gap / 100000.0, gap / 100000.0,
+ width / 100000.0, width / 100000.0);
+ break;
+#else
+ default:
+ break;
+#endif
+ }
+}
+
+/* Set the aperture list for the current layer,
+ * expanding the list buffer if needed */
+static ApertureList *
+setLayerApertureList (int layer_idx)
+{
+ if (layer_idx >= layer_list_max)
+ {
+ int i = layer_list_max;
+ layer_list_max = 2 * (layer_idx + 1);
+ layer_aptr_list = (ApertureList *)
+ realloc (layer_aptr_list, layer_list_max * sizeof (*layer_aptr_list));
+ for (; i < layer_list_max; ++i)
+ initApertureList (&layer_aptr_list[i]);
+ }
+ curr_aptr_list = &layer_aptr_list[layer_idx];
+ return curr_aptr_list;
+}
+
+/* --------------------------------------------------------------------------- */
/*----------------------------------------------------------------------------*/
/* Aperture Routines */
commit e023b537cd1c12d881e40a4c8668d6ae81e275cb
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: gerber-cleanup-0002-Remove-global-variable-dependence-from-maybe_close-a.patch
diff --git a/src/hid/gerber/gerber.c b/src/hid/gerber/gerber.c
index 62295df..a3d6f84 100644
--- a/src/hid/gerber/gerber.c
+++ b/src/hid/gerber/gerber.c
@@ -374,7 +374,7 @@ layer_sort (const void *va, const void *vb)
}
static void
-maybe_close_f ()
+maybe_close_f (FILE *f)
{
if (f)
{
@@ -392,7 +392,7 @@ static BoxType region;
/* Very similar to layer_type_to_file_name() but appends only a
three-character suffix compatible with Eagle's defaults. */
static void
-assign_eagle_file_suffix (int idx)
+assign_eagle_file_suffix (char *dest, int idx)
{
int group;
int nlayers;
@@ -439,11 +439,11 @@ assign_eagle_file_suffix (int idx)
break;
}
- strcpy (filesuff, suff);
+ strcpy (dest, suff);
}
static void
-assign_file_suffix (int idx)
+assign_file_suffix (char *dest, int idx)
{
int fns_style;
const char *sext = ".gbr";
@@ -455,7 +455,7 @@ assign_file_suffix (int idx)
case NAME_STYLE_SINGLE: fns_style = FNS_single; break;
case NAME_STYLE_FIRST: fns_style = FNS_first; break;
case NAME_STYLE_EAGLE:
- assign_eagle_file_suffix (idx);
+ assign_eagle_file_suffix (dest, idx);
return;
}
@@ -469,8 +469,8 @@ assign_file_suffix (int idx)
break;
}
- strcpy (filesuff, layer_type_to_file_name (idx, fns_style));
- strcat (filesuff, sext);
+ strcpy (dest, layer_type_to_file_name (idx, fns_style));
+ strcat (dest, sext);
}
static void
@@ -573,7 +573,7 @@ gerber_do_export (HID_Attr_Val * options)
memcpy (LayerStack, saved_layer_stack, sizeof (LayerStack));
- maybe_close_f ();
+ maybe_close_f (f);
hid_restore_layer_ons (save_ons);
PCB->Flags = save_thindraw;
}
@@ -678,10 +678,10 @@ gerber_set_layer (const char *name, int group, int empty)
if (!curapp->some_apertures && !all_layers)
return 0;
- maybe_close_f ();
+ maybe_close_f (f);
pagecount++;
- assign_file_suffix (idx);
+ assign_file_suffix (filesuff, idx);
f = fopen (filename, "wb"); /* Binary needed to force CR-LF */
if (f == NULL)
{
commit be6d8eb784f74ee9b496ef4b8dbb4af20feb5405
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: gerber-cleanup-0001-Remove-unused-Aperture-structure.patch
diff --git a/src/hid/gerber/gerber.c b/src/hid/gerber/gerber.c
index c8afa14..62295df 100644
--- a/src/hid/gerber/gerber.c
+++ b/src/hid/gerber/gerber.c
@@ -106,14 +106,6 @@ enum ApertureShape
};
typedef enum ApertureShape ApertureShape;
-typedef struct Aperture
-{
- int dCode; /* The RS-274X D code */
- int apertureSize; /* Size in mils */
- ApertureShape apertureShape; /* ROUND/SQUARE etc */
-}
-Aperture;
-
/* This is added to the global aperture array indexes to get gerber
dcode and macro numbers. */
#define DCODE_BASE 11
|
|
From: <gi...@gp...> - 2011-05-25 21:08:05
|
The branch, master has been updated
via 813d9acc4f2ea3882fede5550bbf03b2fef8582a (commit)
from 9a93ddad5a5411edafdc256ced39c2530c8e5cec (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/hid/gtk/gui-output-events.c | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
=================
Commit Messages
=================
commit 813d9acc4f2ea3882fede5550bbf03b2fef8582a
Author: Felix Ruoff <Fe...@po...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
hid/gtk: Fix tooltips
Closes-bug: lp-786733
:100644 100644 c275d7b... 1f9a31a... M src/hid/gtk/gui-output-events.c
=========
Changes
=========
commit 813d9acc4f2ea3882fede5550bbf03b2fef8582a
Author: Felix Ruoff <Fe...@po...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
hid/gtk: Fix tooltips
Closes-bug: lp-786733
diff --git a/src/hid/gtk/gui-output-events.c b/src/hid/gtk/gui-output-events.c
index c275d7b..1f9a31a 100644
--- a/src/hid/gtk/gui-output-events.c
+++ b/src/hid/gtk/gui-output-events.c
@@ -654,9 +654,7 @@ ghid_port_window_motion_cb (GtkWidget * widget,
x_prev = y_prev = -1;
ghid_note_event_location ((GdkEventButton *)ev);
-#if ENABLE_TOOLTIPS
queue_tooltip_update (out);
-#endif
return FALSE;
}
|
|
From: <gi...@gp...> - 2011-05-25 17:21:48
|
The branch, master has been updated
via 9a93ddad5a5411edafdc256ced39c2530c8e5cec (commit)
from 5475f2962456a0199d94658ab8a39f9d10920cba (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
doc/pcb.texi | 7 -------
src/global.h | 1 -
2 files changed, 0 insertions(+), 8 deletions(-)
=================
Commit Messages
=================
commit 9a93ddad5a5411edafdc256ced39c2530c8e5cec
Author: Felix Ruoff <Fe...@po...>
Commit: DJ Delorie <dj...@de...>
gEDA-user: PCB: option dumpmenu missing
A patch to remove this from documentation (and one variable from the
source) is appended.
Kind regards,
Felix
Am 25.05.2011 19:11, schrieb DJ Delorie:
> I think that option is a leftover from my initial HID conversion.
>
> It would have been lesstif-specific anyway, the gtk hid has its own
> menu file (gpcb-menu.res, same locations)
>
>
> _______________________________________________
> geda-user mailing list
> ged...@mo...
> http://www.seul.org/cgi-bin/mailman/listinfo/geda-user
>
>From 94458c63ae97135964c41f4966b9cdf65ee4ec27 Mon Sep 17 00:00:00 2001
From: Felix Ruoff <Fe...@po...>
Date: Wed, 25 May 2011 14:36:34 +0200
Subject: [PATCH 50/50] Remove commandline-option 'dumpmenu' from docu and source
:100644 100644 1b881af... 9dff289... M doc/pcb.texi
:100644 100644 9ad5331... 498e3f8... M src/global.h
=========
Changes
=========
commit 9a93ddad5a5411edafdc256ced39c2530c8e5cec
Author: Felix Ruoff <Fe...@po...>
Commit: DJ Delorie <dj...@de...>
gEDA-user: PCB: option dumpmenu missing
A patch to remove this from documentation (and one variable from the
source) is appended.
Kind regards,
Felix
Am 25.05.2011 19:11, schrieb DJ Delorie:
> I think that option is a leftover from my initial HID conversion.
>
> It would have been lesstif-specific anyway, the gtk hid has its own
> menu file (gpcb-menu.res, same locations)
>
>
> _______________________________________________
> geda-user mailing list
> ged...@mo...
> http://www.seul.org/cgi-bin/mailman/listinfo/geda-user
>
>From 94458c63ae97135964c41f4966b9cdf65ee4ec27 Mon Sep 17 00:00:00 2001
From: Felix Ruoff <Fe...@po...>
Date: Wed, 25 May 2011 14:36:34 +0200
Subject: [PATCH 50/50] Remove commandline-option 'dumpmenu' from docu and source
diff --git a/doc/pcb.texi b/doc/pcb.texi
index 1b881af..9dff289 100644
--- a/doc/pcb.texi
+++ b/doc/pcb.texi
@@ -5732,13 +5732,6 @@ application itself. The master file for all this is the file
used to create the internal menu definition as well as being installed
in @file{$pcblibdir}.
-You can view the internal menu definition (the default) by running
-@file{pcb} with the @code{-dumpmenu} option, like this:
-
-@example
-pcb -dumpmenu
-@end example
-
@c --------------------------- Appendix C -------------------------------
@node Regular Expressions
@appendix Element Search/Regular Expressions
diff --git a/src/global.h b/src/global.h
index 9ad5331..498e3f8 100644
--- a/src/global.h
+++ b/src/global.h
@@ -651,7 +651,6 @@ typedef struct /* some resources... */
*GnetlistProgram, /* gnetlist program name */
*MakeProgram, /* make program name */
*InitialLayerStack; /* If set, the initial layer stack is set to this */
- bool DumpMenuFile; /* dump internal menu definitions */
LocationType PinoutOffsetX, /* offset of origin */
PinoutOffsetY;
int PinoutTextOffsetX, /* offset of text from pin center */
|
|
From: <gi...@gp...> - 2011-05-23 20:33:59
|
The branch, master has been updated
via 5475f2962456a0199d94658ab8a39f9d10920cba (commit)
from 5f3ed7cc41b8033c85f9ac6e2f664f1d0749e13e (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/hid/gerber/gerber.c | 130 +++++++++++++++++++++++------------------------
1 files changed, 63 insertions(+), 67 deletions(-)
=================
Commit Messages
=================
commit 5475f2962456a0199d94658ab8a39f9d10920cba
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: Gerber hid code cleanup
New patch is as follows (sizeof and casts fixed):
:100644 100644 1e5b7f5... c8afa14... M src/hid/gerber/gerber.c
=========
Changes
=========
commit 5475f2962456a0199d94658ab8a39f9d10920cba
Author: Andrew Poelstra <as...@sf...>
Commit: DJ Delorie <dj...@de...>
gEDA-dev: Gerber hid code cleanup
New patch is as follows (sizeof and casts fixed):
diff --git a/src/hid/gerber/gerber.c b/src/hid/gerber/gerber.c
index 1e5b7f5..c8afa14 100644
--- a/src/hid/gerber/gerber.c
+++ b/src/hid/gerber/gerber.c
@@ -128,7 +128,7 @@ static int global_aperture_count;
static int global_aperture_sizes[GBX_MAXAPERTURECOUNT];
static ApertureShape global_aperture_shapes[GBX_MAXAPERTURECOUNT];
-static Apertures *layerapps = 0;
+static Apertures *layerapps = NULL;
static Apertures *curapp;
static int n_layerapps = 0;
static int c_layerapps = 0;
@@ -139,7 +139,7 @@ typedef struct
int x;
int y;
} PendingDrills;
-PendingDrills *pending_drills = 0;
+PendingDrills *pending_drills = NULL;
int n_pending_drills = 0, max_pending_drills = 0;
/*----------------------------------------------------------------------------*/
@@ -202,31 +202,31 @@ printAperture(FILE *f, int i)
switch (global_aperture_shapes[i])
{
case ROUND:
- fprintf (f, "%%ADD%dC,%.4f*%%\015\012", dCode,
+ fprintf (f, "%%ADD%dC,%.4f*%%\r\n", dCode,
COORD_TO_INCH(width));
break;
case SQUARE:
- fprintf (f, "%%ADD%dR,%.4fX%.4f*%%\015\012",
+ fprintf (f, "%%ADD%dR,%.4fX%.4f*%%\r\n",
dCode, COORD_TO_INCH(width), COORD_TO_INCH(width));
break;
case OCTAGON:
- fprintf (f, "%%AMOCT%d*5,0,8,0,0,%.4f,22.5*%%\015\012"
- "%%ADD%dOCT%d*%%\015\012", dCode,
+ fprintf (f, "%%AMOCT%d*5,0,8,0,0,%.4f,22.5*%%\r\n"
+ "%%ADD%dOCT%d*%%\r\n", dCode,
COORD_TO_INCH(width) / COS_22_5_DEGREE, dCode,
dCode);
break;
#if 0
case THERMAL:
- fprintf (f, "%%AMTHERM%d*7,0,0,%.4f,%.4f,%.4f,45*%%\015\012"
- "%%ADD%dTHERM%d*%%\015\012", dCode, gap / 100000.0,
+ fprintf (f, "%%AMTHERM%d*7,0,0,%.4f,%.4f,%.4f,45*%%\r\n"
+ "%%ADD%dTHERM%d*%%\r\n", dCode, gap / 100000.0,
width / 100000.0, finger / 100000.0, dCode, dCode);
break;
case ROUNDCLEAR:
- fprintf (f, "%%ADD%dC,%.4fX%.4f*%%\015\012",
+ fprintf (f, "%%ADD%dC,%.4fX%.4f*%%\r\n",
dCode, gap / 100000.0, width / 100000.0);
break;
case SQUARECLEAR:
- fprintf (f, "%%ADD%dR,%.4fX%.4fX%.4fX%.4f*%%\015\012",
+ fprintf (f, "%%ADD%dR,%.4fX%.4fX%.4fX%.4f*%%\r\n",
dCode, gap / 100000.0, gap / 100000.0,
width / 100000.0, width / 100000.0);
break;
@@ -238,7 +238,7 @@ printAperture(FILE *f, int i)
}
static int
-countApertures (Apertures *ap)
+countApertures (const Apertures *ap)
{
int i, rv=0;
for (i=0; i<GBX_MAXAPERTURECOUNT; i++)
@@ -250,7 +250,7 @@ countApertures (Apertures *ap)
static void
initApertures ()
{
- layerapps = 0;
+ layerapps = NULL;
n_layerapps = 0;
}
@@ -261,7 +261,7 @@ SetAppLayer (int l)
{
int prev = n_layerapps;
n_layerapps = l + 1;
- layerapps = (Apertures *)realloc (layerapps, n_layerapps * sizeof (Apertures));
+ layerapps = (Apertures *)realloc (layerapps, n_layerapps * sizeof (*layerapps));
curapp = layerapps + prev;
while (curapp < layerapps + n_layerapps)
{
@@ -288,10 +288,10 @@ typedef struct hid_gc_struct
int drill;
} hid_gc_struct;
-static FILE *f = 0;
-static char *filename = 0;
-static char *filesuff;
-static char *layername = 0;
+static FILE *f = NULL;
+static char *filename = NULL;
+static char *filesuff = NULL;
+static char *layername = NULL;
static int lncount = 0;
static int finding_apertures = 0;
@@ -353,7 +353,7 @@ static HID_Attr_Val gerber_values[NUM_OPTIONS];
static HID_Attribute *
gerber_get_export_options (int *n)
{
- static char *last_made_filename = 0;
+ static char *last_made_filename = NULL;
if (PCB) derive_default_filename(PCB->Filename, &gerber_options[HA_gerberfile], "", &last_made_filename);
if (n)
@@ -387,12 +387,12 @@ maybe_close_f ()
if (f)
{
if (was_drill)
- fprintf (f, "M30\015\012");
+ fprintf (f, "M30\r\n");
else
- fprintf (f, "M02*\015\012");
+ fprintf (f, "M02*\r\n");
fclose (f);
}
- f = 0;
+ f = NULL;
}
static BoxType region;
@@ -569,7 +569,7 @@ gerber_do_export (HID_Attr_Val * options)
pagecount = 1;
initApertures ();
- f = 0;
+ f = NULL;
lastgroup = -1;
c_layerapps = 0;
finding_apertures = 1;
@@ -589,9 +589,7 @@ gerber_do_export (HID_Attr_Val * options)
static void
gerber_parse_arguments (int *argc, char ***argv)
{
- hid_register_attributes (gerber_options,
- sizeof (gerber_options) /
- sizeof (gerber_options[0]));
+ hid_register_attributes (gerber_options, NUM_OPTIONS);
hid_parse_command_line (argc, argv);
}
@@ -636,22 +634,22 @@ gerber_set_layer (const char *name, int group, int empty)
{
int i;
/* dump pending drills in sequence */
- qsort (pending_drills, n_pending_drills, sizeof (PendingDrills),
+ qsort (pending_drills, n_pending_drills, sizeof (pending_drills[0]),
drill_sort);
for (i = 0; i < n_pending_drills; i++)
{
if (i == 0 || pending_drills[i].diam != pending_drills[i - 1].diam)
{
int ap = findApertureCode (pending_drills[i].diam, ROUND);
- fprintf (f, "T%02d\015\012", ap);
+ fprintf (f, "T%02d\r\n", ap);
}
- fprintf (f, "X%06ldY%06ld\015\012",
+ fprintf (f, "X%06ldY%06ld\r\n",
gerberDrX (PCB, pending_drills[i].x),
gerberDrY (PCB, pending_drills[i].y));
}
free (pending_drills);
n_pending_drills = max_pending_drills = 0;
- pending_drills = 0;
+ pending_drills = NULL;
}
is_drill = (SL_TYPE (idx) == SL_PDRILL || SL_TYPE (idx) == SL_UDRILL);
@@ -692,7 +690,7 @@ gerber_set_layer (const char *name, int group, int empty)
pagecount++;
assign_file_suffix (idx);
- f = fopen (filename, "w");
+ f = fopen (filename, "wb"); /* Binary needed to force CR-LF */
if (f == NULL)
{
Message ( "Error: Could not open %s for writing.\n", filename);
@@ -712,18 +710,18 @@ gerber_set_layer (const char *name, int group, int empty)
{
/* We omit the ,TZ here because we are not omitting trailing zeros. Our format is
always six-digit 0.1 mil resolution (i.e. 001100 = 0.11")*/
- fprintf (f, "M48\015\012" "INCH\015\012");
+ fprintf (f, "M48\r\n" "INCH\r\n");
for (i = 0; i < GBX_MAXAPERTURECOUNT; i++)
if (curapp->aperture_used[i])
- fprintf (f, "T%02dC%.3f\015\012",
+ fprintf (f, "T%02dC%.3f\r\n",
i + DCODE_BASE,
COORD_TO_INCH(global_aperture_sizes[i]));
- fprintf (f, "%%\015\012");
+ fprintf (f, "%%\r\n");
/* FIXME */
return 1;
}
- fprintf (f, "G04 start of page %d for group %d idx %d *\015\012",
+ fprintf (f, "G04 start of page %d for group %d idx %d *\r\n",
pagecount, group, idx);
/* Create a portable timestamp. */
@@ -734,27 +732,27 @@ gerber_set_layer (const char *name, int group, int empty)
strftime (utcTime, sizeof utcTime, fmt, gmtime (¤ttime));
}
/* Print a cute file header at the beginning of each file. */
- fprintf (f, "G04 Title: %s, %s *\015\012", UNKNOWN (PCB->Name),
+ fprintf (f, "G04 Title: %s, %s *\r\n", UNKNOWN (PCB->Name),
UNKNOWN (name));
- fprintf (f, "G04 Creator: %s " VERSION " *\015\012", Progname);
- fprintf (f, "G04 CreationDate: %s *\015\012", utcTime);
+ fprintf (f, "G04 Creator: %s " VERSION " *\r\n", Progname);
+ fprintf (f, "G04 CreationDate: %s *\r\n", utcTime);
#ifdef HAVE_GETPWUID
/* ID the user. */
pwentry = getpwuid (getuid ());
- fprintf (f, "G04 For: %s *\015\012", pwentry->pw_name);
+ fprintf (f, "G04 For: %s *\r\n", pwentry->pw_name);
#endif
- fprintf (f, "G04 Format: Gerber/RS-274X *\015\012");
- fprintf (f, "G04 PCB-Dimensions: %d %d *\015\012",
+ fprintf (f, "G04 Format: Gerber/RS-274X *\r\n");
+ fprintf (f, "G04 PCB-Dimensions: %d %d *\r\n",
PCB->MaxWidth, PCB->MaxHeight);
- fprintf (f, "G04 PCB-Coordinate-Origin: lower left *\015\012");
+ fprintf (f, "G04 PCB-Coordinate-Origin: lower left *\r\n");
/* Signal data in inches. */
- fprintf (f, "%%MOIN*%%\015\012");
+ fprintf (f, "%%MOIN*%%\r\n");
/* Signal Leading zero suppression, Absolute Data, 2.5 format */
- fprintf (f, "%%FSLAX25Y25*%%\015\012");
+ fprintf (f, "%%FSLAX25Y25*%%\r\n");
/* build a legal identifier. */
if (layername)
@@ -770,7 +768,7 @@ gerber_set_layer (const char *name, int group, int empty)
else
*cp = '_';
}
- fprintf (f, "%%LN%s*%%\015\012", layername);
+ fprintf (f, "%%LN%s*%%\r\n", layername);
lncount = 1;
for (i=0; i<GBX_MAXAPERTURECOUNT; i++)
@@ -835,7 +833,7 @@ gerber_set_layer (const char *name, int group, int empty)
static hidGC
gerber_make_gc (void)
{
- hidGC rv = (hidGC) calloc (1, sizeof (hid_gc_struct));
+ hidGC rv = (hidGC) calloc (1, sizeof (*rv));
rv->cap = Trace_Cap;
return rv;
}
@@ -953,13 +951,13 @@ use_gc (hidGC gc, int radius)
{
if (c)
{
- fprintf (f, "%%LN%s_C%d*%%\015\012", layername, lncount++);
- fprintf (f, "%%LPC*%%\015\012");
+ fprintf (f, "%%LN%s_C%d*%%\r\n", layername, lncount++);
+ fprintf (f, "%%LPC*%%\r\n");
}
else
{
- fprintf (f, "%%LN%s_D%d*%%\015\012", layername, lncount++);
- fprintf (f, "%%LPD*%%\015\012");
+ fprintf (f, "%%LN%s_D%d*%%\r\n", layername, lncount++);
+ fprintf (f, "%%LPD*%%\r\n");
}
}
}
@@ -983,7 +981,7 @@ gerber_draw_line (hidGC gc, int x1, int y1, int x2, int y2)
if (x1 != x2 && y1 != y2 && gc->cap == Square_Cap)
{
int x[5], y[5];
- float tx, ty, theta;
+ double tx, ty, theta;
theta = atan2 (y2-y1, x2-x1);
@@ -1019,7 +1017,7 @@ gerber_draw_line (hidGC gc, int x1, int y1, int x2, int y2)
fprintf (f, "Y%ld", gerberY (PCB, lastY));
}
if ((x1 == x2) && (y1 == y2))
- fprintf (f, "D03*\015\012");
+ fprintf (f, "D03*\r\n");
else
{
if (m)
@@ -1035,7 +1033,7 @@ gerber_draw_line (hidGC gc, int x1, int y1, int x2, int y2)
fprintf (f, "Y%ld", gerberY (PCB, lastY));
}
- fprintf (f, "D01*\015\012");
+ fprintf (f, "D01*\r\n");
}
}
@@ -1045,7 +1043,7 @@ gerber_draw_arc (hidGC gc, int cx, int cy, int width, int height,
int start_angle, int delta_angle)
{
bool m = false;
- float arcStartX, arcStopX, arcStartY, arcStopY;
+ double arcStartX, arcStopX, arcStartY, arcStopY;
/* we never draw zero-width lines */
if (gc->width == 0)
@@ -1112,7 +1110,7 @@ gerber_draw_arc (hidGC gc, int cx, int cy, int width, int height,
if (m)
fprintf (f, "D02*");
fprintf (f,
- "G75*G0%1dX%ldY%ldI%ldJ%ldD01*G01*\015\012",
+ "G75*G0%1dX%ldY%ldI%ldJ%ldD01*G01*\r\n",
(delta_angle < 0) ? 2 : 3,
gerberX (PCB, arcStopX), gerberY (PCB, arcStopY),
gerberXOffset (PCB, cx - arcStartX),
@@ -1121,15 +1119,13 @@ gerber_draw_arc (hidGC gc, int cx, int cy, int width, int height,
lastY = arcStopY;
}
-#define ROUND(x) ((int)(((x)+50)/100)*100)
-
static void
gerber_fill_circle (hidGC gc, int cx, int cy, int radius)
{
if (radius <= 0)
return;
if (is_drill)
- radius = ROUND(radius*2)/2;
+ radius = 50 * round (radius / 50.0);
use_gc (gc, radius);
if (!f)
return;
@@ -1138,9 +1134,9 @@ gerber_fill_circle (hidGC gc, int cx, int cy, int radius)
if (n_pending_drills >= max_pending_drills)
{
max_pending_drills += 100;
- pending_drills = (PendingDrills *) realloc (pending_drills,
- max_pending_drills *
- sizeof (PendingDrills));
+ pending_drills = (PendingDrills *) realloc(pending_drills,
+ max_pending_drills *
+ sizeof (pending_drills[0]));
}
pending_drills[n_pending_drills].x = cx;
pending_drills[n_pending_drills].y = cy;
@@ -1160,7 +1156,7 @@ gerber_fill_circle (hidGC gc, int cx, int cy, int radius)
lastY = cy;
fprintf (f, "Y%ld", gerberY (PCB, lastY));
}
- fprintf (f, "D03*\015\012");
+ fprintf (f, "D03*\r\n");
}
static void
@@ -1177,7 +1173,7 @@ gerber_fill_polygon (hidGC gc, int n_coords, int *x, int *y)
use_gc (gc, 10 * 100);
if (!f)
return;
- fprintf (f, "G36*\015\012");
+ fprintf (f, "G36*\r\n");
for (i = 0; i < n_coords; i++)
{
if (x[i] != lastX)
@@ -1201,7 +1197,7 @@ gerber_fill_polygon (hidGC gc, int n_coords, int *x, int *y)
fprintf (f, "D02*");
}
else if (m)
- fprintf (f, "D01*\015\012");
+ fprintf (f, "D01*\r\n");
m = false;
}
if (startX != lastX)
@@ -1217,8 +1213,8 @@ gerber_fill_polygon (hidGC gc, int n_coords, int *x, int *y)
fprintf (f, "Y%ld", gerberY (PCB, lastY));
}
if (m)
- fprintf (f, "D01*\015\012");
- fprintf (f, "G37*\015\012");
+ fprintf (f, "D01*\r\n");
+ fprintf (f, "G37*\r\n");
}
static void
@@ -1251,12 +1247,12 @@ gerber_set_crosshair (int x, int y, int action)
void
hid_gerber_init ()
{
- memset (&gerber_hid, 0, sizeof (HID));
+ memset (&gerber_hid, 0, sizeof (gerber_hid));
common_nogui_init (&gerber_hid);
common_draw_helpers_init (&gerber_hid);
- gerber_hid.struct_size = sizeof (HID);
+ gerber_hid.struct_size = sizeof (gerber_hid);
gerber_hid.name = "gerber";
gerber_hid.description = "RS-274X (Gerber) export.";
gerber_hid.exporter = 1;
|
|
From: <gi...@gp...> - 2011-05-23 00:08:29
|
The branch, master has been updated
via 5f3ed7cc41b8033c85f9ac6e2f664f1d0749e13e (commit)
from 23ce99f3dc445e611fd501074c7c9514aad800d7 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/hid/png/png.c | 15 +++++++++++++++
1 files changed, 15 insertions(+), 0 deletions(-)
=================
Commit Messages
=================
commit 5f3ed7cc41b8033c85f9ac6e2f664f1d0749e13e
Author: Newell Jensen <pil...@gm...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
hid/png: draw zero-length arcs properly on export
Closes-bug: lp-699314
Reviewed-by: Patrick Bernaud <pat...@ch...>
Reviewed-by: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
:100644 100644 06d4296... fe7046e... M src/hid/png/png.c
=========
Changes
=========
commit 5f3ed7cc41b8033c85f9ac6e2f664f1d0749e13e
Author: Newell Jensen <pil...@gm...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
hid/png: draw zero-length arcs properly on export
Closes-bug: lp-699314
Reviewed-by: Patrick Bernaud <pat...@ch...>
Reviewed-by: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
diff --git a/src/hid/png/png.c b/src/hid/png/png.c
index 06d4296..fe7046e 100644
--- a/src/hid/png/png.c
+++ b/src/hid/png/png.c
@@ -33,6 +33,7 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
+#include <math.h>
#include "global.h"
#include "data.h"
@@ -1405,6 +1406,20 @@ png_draw_arc (hidGC gc, int cx, int cy, int width, int height,
{
int sa, ea;
+ /*
+ * zero angle arcs need special handling as gd will output either
+ * nothing at all or a full circle when passed delta angle of 0 or 360.
+ */
+ if (delta_angle == 0) {
+ double r = width;
+ int x = (int) (r * cos (start_angle * M_PI / 180));
+ int y = (int) (r * sin (start_angle * M_PI / 180));
+ x = cx - x;
+ y = cy + y;
+ png_fill_circle (gc, x, y, gc->width / 2);
+ return;
+ }
+
/*
* in gdImageArc, 0 degrees is to the right and +90 degrees is down
* in pcb, 0 degrees is to the left and +90 degrees is down
|
|
From: <gi...@gp...> - 2011-05-22 23:19:14
|
The branch, master has been updated
via 23ce99f3dc445e611fd501074c7c9514aad800d7 (commit)
from 73de75e137a6c847259ecf4cabf4f70a86074584 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
lib/geda.inc | 15 ++++++++-
lib/misc.inc | 94 ++++++++++++++++++++++++++++++++++++++++++++++-----------
2 files changed, 90 insertions(+), 19 deletions(-)
=================
Commit Messages
=================
commit 23ce99f3dc445e611fd501074c7c9514aad800d7
Author: Wojciech Kazubski <wk...@o2...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
add more crystal footprints to m4 library
Currently m4 symbols contain one footprint for crystal holder (HC49),
wich is not accurate, pin spacing is a bit too big and the outline is
too small.
This patch adds several m4 crystal holder footprints of different size,
2 or 3 pin, both standing and laying.
Closes-bug: lp-699440
Reviewed-by: Bert Timmerman <ber...@xs...>
Reviewed-by: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
:100644 100644 b2a2310... a56b6ea... M lib/geda.inc
:100755 100755 45def93... 380d511... M lib/misc.inc
=========
Changes
=========
commit 23ce99f3dc445e611fd501074c7c9514aad800d7
Author: Wojciech Kazubski <wk...@o2...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
add more crystal footprints to m4 library
Currently m4 symbols contain one footprint for crystal holder (HC49),
wich is not accurate, pin spacing is a bit too big and the outline is
too small.
This patch adds several m4 crystal holder footprints of different size,
2 or 3 pin, both standing and laying.
Closes-bug: lp-699440
Reviewed-by: Bert Timmerman <ber...@xs...>
Reviewed-by: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
diff --git a/lib/geda.inc b/lib/geda.inc
index b2a2310..a56b6ea 100644
--- a/lib/geda.inc
+++ b/lib/geda.inc
@@ -608,7 +608,20 @@ define(`PKG_RCY1100P', `PKG_RADIAL_CAN(`$1', `$2', `$3', 2200, 1)');
define(`PKG_RCY1200P', `PKG_RADIAL_CAN(`$1', `$2', `$3', 2400, 1)');
#
-## Crystal
+## Crystals
+#
+#
+define(`PKG_HC49U', `PKG_CRYSTAL_V(`$1', `$2', `$3', 192, 435, 183, 60, 32, 2)');
+define(`PKG_HC49UH', `PKG_CRYSTAL_H(`$1', `$2', `$3', 192, 435, 515, 60, 32, 2)');
+define(`PKG_HC49U_3', `PKG_CRYSTAL_V(`$1', `$2', `$3', 96, 435, 183, 60, 32, 3)');
+define(`PKG_HC49U_3H',`PKG_CRYSTAL_H(`$1', `$2', `$3', 96, 435, 515, 60, 32, 3)');
+define(`PKG_HC51U', `PKG_CRYSTAL_V(`$1', `$2', `$3', 485, 757, 352, 80, 40, 2)');
+define(`PKG_HC51UH', `PKG_CRYSTAL_H(`$1', `$2', `$3', 485, 757, 775, 80, 40, 2)');
+define(`PKG_UM1', `PKG_CRYSTAL_V(`$1', `$2', `$3', 148, 311, 126, 60, 32, 2)');
+define(`PKG_UM1H', `PKG_CRYSTAL_H(`$1', `$2', `$3', 148, 311, 322, 60, 32, 2)');
+define(`PKG_UM1_3', `PKG_CRYSTAL_V(`$1', `$2', `$3', 74, 311, 126, 60, 32, 3)');
+define(`PKG_UM1_3H', `PKG_CRYSTAL_H(`$1', `$2', `$3', 74, 311, 322, 60, 32, 3)');
+#
# HC49
#
define(`PKG_HC49', `PKG_CRYSTAL(`$1', `$2', `$3', 300)');
diff --git a/lib/misc.inc b/lib/misc.inc
index 45def93..380d511 100755
--- a/lib/misc.inc
+++ b/lib/misc.inc
@@ -348,30 +348,88 @@ Element(0x00 "$1" "`$2'" "$3" eval(X2+20) eval(Y2+20) 0 100 0x00)
)')
# -------------------------------------------------------------------
-# an crystal package
-# Pin 1 is K, 2 is A
-#
+#
+# general purpose crystal standing, 2 or 3 pins
# $1: canonical name
# $2: name on PCB
# $3: value
-# $4: package width in MIL
+# $4: pin spacing in mil
+# $5: length of component in mil
+# $6: width of component in mil
+# $7: diametr of pad in mil
+# $8: diametr of drill in mil
+# $9: number of pins
#
-define(`PKG_CRYSTAL',
- `define(`X1', `100')
- define(`X2', `$4')
- define(`Y', `100')
- define(`Y1', `eval(Y -50)')
- define(`Y2', `eval(Y +50)')
-Element(0x00 "$1" "`$2'" "$3" X1 eval(Y2+20) 0 100 0x00)
+define(`PKG_CRYSTAL_V',
+ `define(`spacing', `$4')
+ define(`sizX', `$5')
+ define(`sizY', `$6')
+ define(`pad', `$7')
+ define(`drill', `$8')
+ define(`centerY', `eval(sizY / 2)')
+ define(`pinX', `eval((sizX - spacing * (`$9'-1)) /2)')
+
+Element(0x00 "$1" "$2" "$3" 0 eval(0 - 60) 0 100 0x00)
(
- PIN(X1, Y, 60, 28, 1)
- PIN(X2, Y, 60, 28, 2)
- ElementLine(X1 Y1 X2 Y1 10)
- ElementLine(X1 Y2 X2 Y2 10)
- ElementArc(X1 Y 50 50 270 180 10)
- ElementArc(X2 Y 50 50 90 180 10)
- Mark (X1 Y)
+ PIN(pinX, centerY, pad, drill, 1)
+ PIN(eval(pinX + spacing), centerY, pad, drill, 2)
+ ifelse(eval(`$9' == 3), 1,
+ PIN(eval(pinX + 2 * spacing), centerY, pad, drill, 3))
+
+ ElementLine(centerY 0 eval(sizX-centerY) 0 20)
+ ElementArc(eval(sizX-centerY) centerY centerY centerY 90 180 20)
+ ElementLine(eval(sizX-centerY) sizY centerY sizY 20)
+ ElementArc(centerY centerY centerY centerY 270 180 20)
+
+ Mark(pinX centerY)
)')
+#
+#
+# general purpose crystal laying, 2 or 3 pins
+# $1: canonical name
+# $2: name on PCB
+# $3: value
+# $4: pin spacing in mil
+# $5: length of component in mil
+# $6: height of component in mil
+# $7: diametr of pad in mil
+# $8: diametr of drill in mil
+# $9: number of pins
+#
+define(`PKG_CRYSTAL_H',
+ `define(`base', `$4')
+ define(`sizX', `$5')
+ define(`sizY', `$6')
+ define(`pad', `$7')
+ define(`drill', `$8')
+ define(`pinX', `eval((sizX - base * (`$9'-1)) /2)')
+ define(`pinY', `ifelse(eval(sizX > 500),1,eval(sizY+200),eval(sizY+100))')
+ define(`maxY', `eval(sizY + offset)')
+
+Element(0x00 "$1" "$2" "$3" 0 eval(0 - 60) 0 100 0x00)
+(
+ PIN(pinX, pinY, pad, drill, 1)
+ PIN(eval(pinX + base), pinY, pad, drill, 2)
+ ifelse(eval(`$9' == 3), 1,
+ PIN(eval(pinX + 2 * base), pinY, pad, drill, 3))
+
+ ElementLine(0 0 sizX 0 20)
+ ElementLine(sizX 0 sizX sizY 20)
+ ElementLine(sizX sizY 0 sizY 20)
+ ElementLine(0 sizY 0 0 20)
+
+ Mark(pinX pinY)
+)')
+
+# a crystal package for backward compatibility
+#
+# $1: canonical name
+# $2: name on PCB
+# $3: value
+# $4: package width in MIL
+#
+define(`PKG_CRYSTAL',`PKG_CRYSTAL_V(`$1',`$2',`$3',`eval($4-100)',`$4',`100',`60',`28',`2')')
+
# -------------------------------------------------------------------
# a can oscillator package
|
|
From: <gi...@gp...> - 2011-05-22 23:04:50
|
The branch, master has been updated
via 73de75e137a6c847259ecf4cabf4f70a86074584 (commit)
from 436c3c9f59d8eafc668a611bd8daef55710c99eb (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
src/hid/gtk/gtkhid-main.c | 17 -----------------
src/hid/gtk/gui-dialog.c | 2 ++
2 files changed, 2 insertions(+), 17 deletions(-)
=================
Commit Messages
=================
commit 73de75e137a6c847259ecf4cabf4f70a86074584
Author: Felix Ruoff <Fe...@po...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
hid/gtk: use GTK dialog for confirming file-overwrite
Since GTK 2.8 GTK provides an dialog for confirming file-overwriting.
This dialog will be introduced by this patch. Needless code which was
used for this will be removed.
Closes-bug: lp-699508
Reviewed-by: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
:100644 100644 688527a... b89974d... M src/hid/gtk/gtkhid-main.c
:100644 100644 b622439... c079464... M src/hid/gtk/gui-dialog.c
=========
Changes
=========
commit 73de75e137a6c847259ecf4cabf4f70a86074584
Author: Felix Ruoff <Fe...@po...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
hid/gtk: use GTK dialog for confirming file-overwrite
Since GTK 2.8 GTK provides an dialog for confirming file-overwriting.
This dialog will be introduced by this patch. Needless code which was
used for this will be removed.
Closes-bug: lp-699508
Reviewed-by: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
diff --git a/src/hid/gtk/gtkhid-main.c b/src/hid/gtk/gtkhid-main.c
index 688527a..b89974d 100644
--- a/src/hid/gtk/gtkhid-main.c
+++ b/src/hid/gtk/gtkhid-main.c
@@ -1382,23 +1382,6 @@ Save (int argc, char **argv, int x, int y)
if (name)
{
- FILE *exist;
- exist = fopen (name, "r");
- if (exist)
- {
- fclose (exist);
- if (ghid_dialog_confirm (_("File exists! Ok to overwrite?"), NULL, NULL))
- {
- if (Settings.verbose)
- fprintf (stderr, _("Overwriting %s\n"), name);
- }
- else
- {
- g_free (name);
- return 1;
- }
- }
-
if (Settings.verbose)
fprintf (stderr, "%s: Calling SaveTo(%s, %s)\n",
__FUNCTION__, function, name);
diff --git a/src/hid/gtk/gui-dialog.c b/src/hid/gtk/gui-dialog.c
index b622439..c079464 100644
--- a/src/hid/gtk/gui-dialog.c
+++ b/src/hid/gtk/gui-dialog.c
@@ -375,6 +375,8 @@ ghid_dialog_file_select_save (gchar * title, gchar ** path, gchar * file,
GTK_STOCK_OK, GTK_RESPONSE_OK,
NULL);
+ gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog),
+ TRUE);
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
if (path && *path && **path)
|
|
From: <gi...@gp...> - 2011-05-22 22:19:59
|
The branch, master has been updated
via 436c3c9f59d8eafc668a611bd8daef55710c99eb (commit)
from af25426a72ca8d0a9b5c81b456f32b4351d7ec0a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
doc/refcard.tex | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
=================
Commit Messages
=================
commit 436c3c9f59d8eafc668a611bd8daef55710c99eb
Author: Felix Ruoff <Fe...@po...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
Fix refcard (missing footnote and add rotate buffer)
The shortcut 'shift-F7' for rotating paste buffer by 90 degree
is added as suggested in bug LP-699391 (formerly sf-1112590).
Fix footnote used in the tabular environment.
Closes-bug: lp-699391
Reviewed-by: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
:100644 100644 9ec2e2f... 8072351... M doc/refcard.tex
=========
Changes
=========
commit 436c3c9f59d8eafc668a611bd8daef55710c99eb
Author: Felix Ruoff <Fe...@po...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
Fix refcard (missing footnote and add rotate buffer)
The shortcut 'shift-F7' for rotating paste buffer by 90 degree
is added as suggested in bug LP-699391 (formerly sf-1112590).
Fix footnote used in the tabular environment.
Closes-bug: lp-699391
Reviewed-by: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
diff --git a/doc/refcard.tex b/doc/refcard.tex
index 9ec2e2f..8072351 100644
--- a/doc/refcard.tex
+++ b/doc/refcard.tex
@@ -167,19 +167,21 @@ m & move to current layer \\
\Shift \Ctrl x & cut selected objects to buffer \\
& and enter pastebuffer mode \\
\Btn1 & in pastebuffer mode copy to layout \\
+\Shift \Fun7 & rotate 90 degree cc \\
\Ctrl 1$\cdots$5 & select buffer \# 1$\cdots$5 \\
\end{tabular}
\section{Sizing}
\begin{tabular}{@{}ll@{}}
-s & increase size of TLAPV \footnote{TLAPV: text, line, arc, pin or via}\\
+s & increase size of TLAPV\footnotemark\\
\Shift s & decrease size of TLAPV\\
\Mod s & increase drill size of PV \\
\Shift\Mod s & decrease drill size of PV \\
k & increase clearance of LAPV\\
\Shift\ k & decrease clearance of LAPV\\
\end{tabular}
+\footnotetext{TLAPV: text, line, arc, pin or via}
\section{Element}
|
|
From: <gi...@gp...> - 2011-05-22 22:06:44
|
The branch, master has been updated
via af25426a72ca8d0a9b5c81b456f32b4351d7ec0a (commit)
from 1305b9c187237a3726cdb525445ba2debd8ddbd4 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
=========
Summary
=========
doc/pcb.texi | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
=================
Commit Messages
=================
commit af25426a72ca8d0a9b5c81b456f32b4351d7ec0a
Author: Felix Ruoff <Fe...@po...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
Fix doku for invisibleObjectsColor (color)
Closes-bug: lp-699306
:100644 100644 78c99d2... 1b881af... M doc/pcb.texi
=========
Changes
=========
commit af25426a72ca8d0a9b5c81b456f32b4351d7ec0a
Author: Felix Ruoff <Fe...@po...>
Commit: Krzysztof KoÅciuszkiewicz <k.k...@gm...>
Fix doku for invisibleObjectsColor (color)
Closes-bug: lp-699306
diff --git a/doc/pcb.texi b/doc/pcb.texi
index 78c99d2..1b881af 100644
--- a/doc/pcb.texi
+++ b/doc/pcb.texi
@@ -3063,7 +3063,7 @@ create its own colormap. The default setting is @emph{XtDefaultForeground}.
@vindex invisibleObjectsColor
@cindex colors
@cindex element, color
-@item elementColor (color)
+@item invisibleObjectsColor (color)
Elements located on the opposite side of the board are drawn in this color.
The default is @emph{XtDefaultForeground}.
|