From d49ecb7c57a26d7098dadc1d2c85c6a416963ae6 Mon Sep 17 00:00:00 2001
From: Scott Daniels
Date: Sun, 31 Mar 2013 02:24:39 -0500
Subject: [PATCH] Initial fork of version 1.8 from Rugged Circuits
---
.gitignore | 0
COPYING | 674 +++++++
PKG-INFO | 23 +
doc/autosearch.html | 147 ++
doc/cfgfile.html | 441 +++++
doc/ex1.png | Bin 0 -> 3668 bytes
doc/ex1a.png | Bin 0 -> 4427 bytes
doc/ex1b.png | Bin 0 -> 10908 bytes
doc/ex1c.png | Bin 0 -> 10967 bytes
doc/ex1d.png | Bin 0 -> 12825 bytes
doc/ex1e.png | Bin 0 -> 11134 bytes
doc/ex1f.png | Bin 0 -> 10441 bytes
doc/ex1g.png | Bin 0 -> 12272 bytes
doc/gpl.html | 696 +++++++
doc/index.html | 392 ++++
doc/layout1.cfg | 272 +++
doc/layout1.def | 19 +
doc/layout2.cfg | 282 +++
doc/layout2.def | 57 +
doc/layoutfile.html | 216 +++
doc/sample.jpg | Bin 0 -> 287137 bytes
doc/sample2.jpg | Bin 0 -> 320945 bytes
gerbmerge/__init__.py | 1 +
gerbmerge/amacro.py | 348 ++++
gerbmerge/aptable.py | 335 ++++
gerbmerge/config.py | 399 ++++
gerbmerge/drillcluster.py | 208 ++
gerbmerge/fabdrawing.py | 210 ++
gerbmerge/geometry.py | 346 ++++
gerbmerge/gerbmerge.py | 753 ++++++++
gerbmerge/jobs.py | 1288 +++++++++++++
gerbmerge/makestroke.py | 167 ++
gerbmerge/parselayout.py | 338 ++++
gerbmerge/placement.py | 108 ++
gerbmerge/schwartz.py | 38 +
gerbmerge/scoring.py | 301 +++
gerbmerge/specs.py | 177 ++
gerbmerge/strokes.py | 38 +
gerbmerge/tilesearch1.py | 243 +++
gerbmerge/tilesearch2.py | 147 ++
gerbmerge/tiling.py | 377 ++++
gerbmerge/util.py | 20 +
misc/gerbmerge.bat | 3 +
setup.cfg | 5 +
setup.py | 125 ++
testdata/Makefile | 23 +
testdata/README | 30 +
testdata/fabdwg.txt | 7 +
testdata/hexapod.bor | 157 ++
testdata/hexapod.brd | Bin 0 -> 60224 bytes
testdata/hexapod.cam | 96 +
testdata/hexapod.cmp | 1096 +++++++++++
testdata/hexapod.plc | 3823 +++++++++++++++++++++++++++++++++++++
testdata/hexapod.sch | Bin 0 -> 75958 bytes
testdata/hexapod.sol | 1413 ++++++++++++++
testdata/hexapod.xln | 400 ++++
testdata/layout1.cfg | 272 +++
testdata/layout1.def | 19 +
testdata/layout2.cfg | 282 +++
testdata/layout2.def | 57 +
testdata/proj1.bor | 52 +
testdata/proj1.brd | Bin 0 -> 6152 bytes
testdata/proj1.cam | 153 ++
testdata/proj1.cmp | 765 ++++++++
testdata/proj1.drl | 17 +
testdata/proj1.plc | 160 ++
testdata/proj1.pls | 43 +
testdata/proj1.sch | Bin 0 -> 42086 bytes
testdata/proj1.sol | 652 +++++++
testdata/proj1.stc | 33 +
testdata/proj1.sts | 42 +
testdata/proj1.xln | 20 +
72 files changed, 18806 insertions(+)
create mode 100644 .gitignore
create mode 100644 COPYING
create mode 100644 PKG-INFO
create mode 100644 doc/autosearch.html
create mode 100644 doc/cfgfile.html
create mode 100644 doc/ex1.png
create mode 100644 doc/ex1a.png
create mode 100644 doc/ex1b.png
create mode 100644 doc/ex1c.png
create mode 100644 doc/ex1d.png
create mode 100644 doc/ex1e.png
create mode 100644 doc/ex1f.png
create mode 100644 doc/ex1g.png
create mode 100644 doc/gpl.html
create mode 100644 doc/index.html
create mode 100644 doc/layout1.cfg
create mode 100644 doc/layout1.def
create mode 100644 doc/layout2.cfg
create mode 100644 doc/layout2.def
create mode 100644 doc/layoutfile.html
create mode 100644 doc/sample.jpg
create mode 100644 doc/sample2.jpg
create mode 100644 gerbmerge/__init__.py
create mode 100644 gerbmerge/amacro.py
create mode 100644 gerbmerge/aptable.py
create mode 100644 gerbmerge/config.py
create mode 100644 gerbmerge/drillcluster.py
create mode 100644 gerbmerge/fabdrawing.py
create mode 100644 gerbmerge/geometry.py
create mode 100644 gerbmerge/gerbmerge.py
create mode 100644 gerbmerge/jobs.py
create mode 100644 gerbmerge/makestroke.py
create mode 100644 gerbmerge/parselayout.py
create mode 100644 gerbmerge/placement.py
create mode 100644 gerbmerge/schwartz.py
create mode 100644 gerbmerge/scoring.py
create mode 100644 gerbmerge/specs.py
create mode 100644 gerbmerge/strokes.py
create mode 100644 gerbmerge/tilesearch1.py
create mode 100644 gerbmerge/tilesearch2.py
create mode 100644 gerbmerge/tiling.py
create mode 100644 gerbmerge/util.py
create mode 100644 misc/gerbmerge.bat
create mode 100644 setup.cfg
create mode 100644 setup.py
create mode 100644 testdata/Makefile
create mode 100644 testdata/README
create mode 100644 testdata/fabdwg.txt
create mode 100644 testdata/hexapod.bor
create mode 100644 testdata/hexapod.brd
create mode 100644 testdata/hexapod.cam
create mode 100644 testdata/hexapod.cmp
create mode 100644 testdata/hexapod.plc
create mode 100644 testdata/hexapod.sch
create mode 100644 testdata/hexapod.sol
create mode 100644 testdata/hexapod.xln
create mode 100644 testdata/layout1.cfg
create mode 100644 testdata/layout1.def
create mode 100644 testdata/layout2.cfg
create mode 100644 testdata/layout2.def
create mode 100644 testdata/proj1.bor
create mode 100644 testdata/proj1.brd
create mode 100644 testdata/proj1.cam
create mode 100644 testdata/proj1.cmp
create mode 100644 testdata/proj1.drl
create mode 100644 testdata/proj1.plc
create mode 100644 testdata/proj1.pls
create mode 100644 testdata/proj1.sch
create mode 100644 testdata/proj1.sol
create mode 100644 testdata/proj1.stc
create mode 100644 testdata/proj1.sts
create mode 100644 testdata/proj1.xln
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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 3 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, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..951c6e7
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,23 @@
+Metadata-Version: 1.0
+Name: gerbmerge
+Version: 1.8
+Summary: Merge multiple Gerber/Excellon files
+Home-page: http://ruggedcircuits.com/gerbmerge
+Author: Rugged Circuits LLC
+Author-email: support@ruggedcircuits.com
+License: GPL
+Description: GerbMerge is a program that combines several Gerber
+ (i.e., RS274-X) and Excellon files into a single set
+ of files. This program is useful for combining multiple
+ printed circuit board layout files into a single job.
+
+ To run the program, invoke the Python interpreter on the
+ gerbmerge.py file. On Windows, if you installed GerbMerge in
+ C:/Python24, for example, open a command window (DOS box)
+ and type:
+ C:/Python24/gerbmerge.bat
+
+ For more details on installation or running GerbMerge, see the
+ URL below.
+
+Platform: all
diff --git a/doc/autosearch.html b/doc/autosearch.html
new file mode 100644
index 0000000..821c1f3
--- /dev/null
+++ b/doc/autosearch.html
@@ -0,0 +1,147 @@
+
+
+
+ GerbMerge -- A Gerber-file merging program -- Automatic Placement
+
+
+
+
+
+GerbMerge -- Automatic Placement
+
+
+ Rugged Circuits LLC
+
+
+
+
+Introduction
+
+As an alternative to manual placement, either using the layout file
+approach or using the --place-file command-line option, GerbMerge can automatically
+try to find the best arrangement of jobs on a panel that minimizes the total panel area.
+Using automatic placement can save you time since you don't have to construct and experiment
+with a layout file. The tradeoff, however, is that automatic placement may take a long time
+to execute, and for panels with many, small jobs, the run time may be prohibitive. On the
+other hand, experience suggests that good results can be obtained in just a few minutes,
+even when GerbMerge is not allowed to search all possibilities.
+
+Randomized Search
+
+The Basics
+The randomized search approach has GerbMerge repeatedly place jobs randomly on a panel, possibly
+rotated. After each placement, GerbMerge evaluates the total area of the panel, and if
+it's less than the smallest area encountered so far, the placement is memorized as the
+best so far.
+This may not sound like a very efficient approach but experience shows that it can
+lead to nearly-optimal results fairly quickly. The reason is that although there can
+be a huge number of possible placements for a given set of jobs, many of them are
+equivalent with respect to total panel area.
+
The randomized search approach is the default automatic placement method. It is
+invoked simply by not specifying any layout file:
+
gerbmerge file.cfg
+The configuration file must still be specified, of course.
+After GerbMerge starts, you may press Ctrl-C at any
+time to stop the process. In fact, you must press Ctrl-C at some point as GerbMerge
+will try random placements forever.
+
The best layout found when Ctrl-C is pressed will be used for panelization.
+Note that the layout is also saved in the file specified by the
+Placement assignment in the [MergeOutputFiles] section of the
+configuration file. Thus, if you want to experiment,
+you can run different trials, save the best placements from each, then use the
+best one by using the saved placement file as the input to
+GerbMerge with the --place-file option.
+
+
Random+Exhaustive
+The default operation of GerbMerge is to actually perform a hybrid search,
+using both random search and exhaustive search. By default, GerbMerge will take
+a list of N jobs and randomly place N-2 of them (randomly chosen). Then,
+GerbMerge will exhaustively try to place the remaining 2 jobs on the panel to
+minimize the area. This approach has been found to improve panel usage at minimal
+cost since an exhaustive search of only 2 jobs is very quick.
+You can change the number of jobs to exhaustively search for a given random
+placement with the --rs-fsjobs command-line option. For example,
+
gerbmerge --rs-fsjobs=2 file.cfg
+The above example is the default behavior, i.e., exhaustively place 2 jobs and
+randomly place N-2 jobs. By using a number higher than 2, there is less randomness
+but fewer starting placements are tested per second.
+
+Exhaustive Search
+
+The exhaustive search approach has GerbMerge try all possible placements for a given
+set of jobs, one by one. This sounds like it may be an exponentially long approach,
+and it is. For anything other than a few boards (less than 5 or so), exhaustive search
+is prohibitive.
+The exhaustive search mode is invoked as follows:
+
gerbmerge --full-search file.cfg
+You can stop the search at any time by pressing Ctrl-C. The best placement found so far
+will be used for panelization and saved in the placement file specified by the Placement value in the
+[MergeOutputFiles] section of the configuration file.
+
+Multiple Instances
+There is no need to repeat sections of a job in the configuration file if you want
+a job to appear multiple times on a panel. You can use the Repeat=N configuration
+option to indicate that a particular job is to have N copies on a panel. For example:
+ [irtx]
+ Prefix=%(projdir)s/IRTransmitter/irtx
+ *TopLayer=%(prefix)s.cmp
+ *BottomLayer=%(prefix)s.sol
+ Drills=%(prefix)s.xln
+ BoardOutline=%(prefix)s.bor
+ *SolderMaskTop=%(prefix)s.stc
+ *SolderMaskBottom=%(prefix)s.sts
+ Repeat=5
+
+This job specifies all the layers as usual, then the last line indicates that 5
+such jobs are to appear on the final panel. They may appear in various positions
+and states of rotation, however.
+
+Usage Notes
+
+Area Estimates
+GerbMerge will estimate and display the maximum possible panel usage as a percentage.
+This estimate is frequently too high, as GerbMerge simply takes the area of each
+job, adds in the area required by inter-job spacing, then adds all of these areas
+together. The amount of that area that is used by actual jobs (and not inter-job
+spacing) represents the best possible area usage. This usage will clearly not be
+achieved unless all jobs magically fit together perfectly.
+In summary, it is pointless to wait for a random search for hours to hit
+an estimated area utilization of 91% because, unless the dimensions of all
+boards line up just so, that utilization is not achievable.
+
Panel Width and Height
+Note that the PanelWidth and PanelHeight options in the
+configuration file constrain the search process. GerbMerge will not allow
+any placement, either by random search or exhaustive search, to exceed the
+panel dimensions. You can, therefore, guide the search process by choosing a
+panel size that is not too large, thus preventing highly-unlikely placements
+(think all jobs in one row) from being considered.
+Similarly, by choosing panels that are slightly wider than taller, or vice
+versa, different placements can be considered and may lead to different
+results. Consider these two configuration file options as a source of
+experimentation.
+
Time vs. Money
+How long should you wait for the best possible area utilization? It depends...
+how much is your time worth?
+If you've achieved 85% utilization for a 30 sq. in. board, what will you
+save by waiting and hoping for 90% (i.e., 28.3 sq. in.)? Assuming 64 cents/sq. in.
+(BareBonesPCB.com cost), you will save $1.09.
+
+
+© 2003-2011, Copyright by Rugged Circuits LLC; All Rights Reserved. mailto: support@ruggedcircuits.com
+
+
+
diff --git a/doc/cfgfile.html b/doc/cfgfile.html
new file mode 100644
index 0000000..deddad6
--- /dev/null
+++ b/doc/cfgfile.html
@@ -0,0 +1,441 @@
+
+
+
+ GerbMerge -- A Gerber-file merging program -- The Configuration File
+
+
+
+
+
+GerbMerge -- The Configuration File
+
+
+ Rugged Circuits LLC
+
+
+
+
+Introduction
+
+ The configuration file tells GerbMerge things like:
+
+ How much space to leave between jobs in the final panel
+ Whether or not to draw cut lines or crop marks, and on which layers
+ Whether or not to generate a fabrication drawing
+ The job names and files to be panelized
+ The output file names
+
+
+ Note that the configuration file does not specify layout of jobs on the
+ panel. This layout is described by the layout file.
+ The layout of jobs on the panel may also be constructed automatically using
+ the automatic placement mode of operation.
+
+
Help!
+The rest of this document has a lot of information and it's easy to get overwhelmed. Users of GerbMerge
+complain that the configuration file is the biggest hurdle to overcome in using the program.
+
Don't panic. Start with a sample configuration file and
+modify it for your own jobs. The comments in the sample file will guide you through the
+process.
+
+
+
Syntax Notes
+
+The configuration file is a plain text file that can be created with any
+text editor. It is parsed using Python's
+ConfigParser module.
+See the documentation for this module for a full description of supported syntax.
+
+
Note that comments in this file begin with a '#' character.
+Comments must occupy an entire line and must not have any characters before the
+'#' character, including blanks. Comments cannot be placed at the end of a
+line. For example:
+
+ # This is correct...a comment occupies the entire line
+ # Incorrect...comment preceded by blanks
+ PanelWidth = 10.5 # This is INCORRECT...a comment cannot be placed at the end of a line
+
+The configuration file has a standard "INI-style" syntax comprising:
+
+- Sections delimited by section names in square brackets (e.g., [Options])
+
- Assignments of the form 'Name = Value'
+
+The configuration file parser supports variable substitution. You can specify a common
+pathname prefix, for example, and substitute it in subsequent assignments, like this:
+
+ [CPUBoard]
+ Prefix = /home/user/eagle/cpuboard
+
+ # Note the syntax '%(prefix)s' is a variable string substitution.
+ # Even though we said 'Prefix = ...' we use LOWERCASE 'prefix' in the actual substitution!
+ BoardOutline = %(prefix)s/cpu.bor
+ Drills = %(prefix)s/cpu.xln
+
+
+
+NOTE: the parser converts all names you assign to into lowercase letters only.
+
+In general, assignments are local to the section in which they reside, i.e.,
+the names assigned to are not visible in the other sections. However, any
+assignments in the section named [DEFAULT] are visible in all
+sections. For example:
+
+ [DEFAULT]
+ EagleDir = /home/user/eagle
+
+ [CPUBoard]
+ Prefix = %(eagledir)s/cpuboard
+ BoardOutline = %(prefix)s/cpu.bor
+ Drills = %(prefix)s/cpu.xln
+
+ [IOBoard]
+ Prefix = %(eagledir)s/ioboard
+ BoardOutline = %(prefix)s/io.bor
+ Drills = %(prefix)s/io.xln
+
+
+ Have a look at the sample configuration files layout1.cfg
+ and layout2.cfg for a quick overview of this file's syntax.
+
+
+
Operating Parameters
+
+The first section of the configuration file is called [Options].
+This section specifies operating parameters for the job.
+
The following optional parameters are supported:
+
+ - Tool List
+ - ToolList = /home/user/eagle/toollist.drl
+
NOTE:If you're using a recent version of Eagle or other modern PCB program, you can probably
+ ignore this option. Try commenting it out and see what happens!
+
This parameter sets the default tool list (or "drill rack") in effect for jobs that (a) do not have
+ embedded tool sizes in the Excellon file, and (b) do not have a tool list specified
+ as part of the job description (see below).
+
As of Eagle version 4.11r2, tool sizes are embedded in the Excellon file, like this:
+
+ ...
+ T01C0.032
+ T02C0.045
+ T03C0.115
+ ...
+
+ For Excellon files with embedded tool sizes, no tool list file need be specified. Otherwise,
+ a tool list file must be specified that contains something like:
+
+ T01 0.032in
+ T02 0.045in
+ T03 0.115in
+
+ Suffixes of 'mm' and 'mil' may be used instead of 'in' to indicate millimetres and mils.
+
Note that Eagle's CAM Processor uses two different forms of Excellon output
+ devices, EXCELLON in which tool sizes are embedded in the drill file,
+ and EXCELLON_RACK which requires an external tool list file, or drill rack. The
+ latter may be desirable when you want to send your boards to a manufacturer
+ with a limited set of drill sizes, or that charges by the number of different
+ drill sizes used. In this case, do specify the ToolList option and
+ set it to the drill rack you specified for the EXCELLON_RACK device.
+
+
+ - Excellon Decimals
+ - ExcellonDecimals = 4
+
This optional setting specifies the number of digits after the decimal point in the input
+ Excellon drill files. These files contain (X,Y) drill locations specified as integers, but
+ represent actual positions in the format M.N where there are M digits
+ before the decimal point and N digits after. The default number of decimal digits
+ is 4, hence a 2.4 integer format, so that the drill instruction X12300Y9400 means to drill at (1.23", 0.94").
+ In 2.3 format (with ExcellonDecimals=3) the above would appear as
+ X1230Y940. Note that it is assumed that leading 0's are omitted, or else no zeroes are omitted.
+ Omitted trailing 0's are not yet supported.
+
As of this writing, older Eagle versions use a 2.3 format (prior to version 4.11r12), more recent Eagle versions use a 2.4 format, while Orcad and PCB use 2.4.
+ Note that each job may have its own ExcellonDecimals setting (see below) to override this global
+ setting.
+
Finally, note that the ExcellonDecimals option applies to the expected format for
+ the input Excellon files, i.e., the drill files that GerbMerge reads in. The
+ ExcellonLeadingZeros option below applies to the output Excellon file generated by GerbMerge.
+
+ - Cut Line Layers
+
- CutLineLayers = *toplayer,*bottomlayer
+
This parameter indicates which, if any, layers are to have cut lines drawn on them. Cut lines
+ define the rectangular extents of each individual job on the panel. They are intended to help you
+ in cutting out the individual jobs from the panel.
+
The value of this parameter is a list of layer names, which are defined for each job (see below).
+ Layer names may be separated with commas or semicolons.
+
Note that layer names must be written in lowercase letters, even if they are defined with
+ uppercase letters. Also note that all layer names except the board outline layer will begin
+ with an asterisk '*'.
+ This parameter may be omitted, or be set to None to indicate that no cut lines should
+ be drawn.
+
+ - Crop Mark Layers
+
- CropMarkLayers = *toplayer,*bottomlayer
+
This parameter indicates which, if any, layers are to have crop marks drawn on them. Crop marks
+ are small L-shaped marks at the four corners of the final panel. Some board manufacturers require
+ crop marks to ensure registration and to unambiguously define the extents of the job.
+
The value of this parameter is a list of layer names, which are defined for each job (see below).
+ Layer names may be separated with commas or semicolons.
+
Note that layer names must be written in lowercase letters, even if they are defined with
+ uppercase letters. Also note that all layer names except the board outline layer will begin
+ with an asterisk '*'.
+
This parameter may be omitted, or be set to None to indicate that no crop marks should
+ be drawn.
+
+ - Fabrication Drawing File
+ - FabricationDrawingFile = fabdwg.ger
+
This optional parameter may be set to a filename, to 'none', or omitted
+ entirely. When a valid filename is specified, GerbMerge will generate a Gerber
+ RS274X file containing a fabrication drawing for the entire project. The
+ drawing contains a box for the outline of the entire panel, dimension arrows
+ for the panel, drill symbols for each drill hit, a drill tool legend, and
+ optional user text. Some board manufacturers require a fabrication drawing.
+
The Fabrication Drawing Text option below allows you add user-defined text
+ to this drawing.
+
Note that for generating a fabrication drawing, no more
+ than 26 drill tools can appear in the merged output.
+
+ - Fabrication Drawing Text
+ - FabricationDrawingText = project/fabdwg.txt
+
This optional parameter may specify the name of a file containing plain text. Each line
+ in the file is added to the fabrication drawing, if one is enabled.
+
+ - ExcellonLeadingZeros
+ - ExcellonLeadingZeros = 0
+
This optional setting creates a merged Excellon output file with leading
+ zeros. The default is to use leading-zero suppression. For example, with leading-zero
+ suppression, a drill hit at location (1.23",4.56") would be written in the output Excellon file as:
+
X12300Y45600
+
Without leading-zero suppression (i.e., with ExcellonLeadingZeros=1) it would appear as:
+ X012300Y045600
+
Not using leading-zero suppression may make it easier for some
+ Gerber viewers to properly interpret the Excellon file. Try setting
+ ExcellonLeadingZeros=1 if your drills appear in completely the
+ wrong locations when viewing your merged output files in a Gerber
+ viewer.
+ Finally, note that the ExcellonLeadingZeros option applies to the format for
+ the output Excellon file as generated by GerbMerge. The
+ ExcellonDecimals option described above applies to the input Excellon files read
+ in by GerbMerge.
+
+ - Outline Layer File
+
- OutlineLayerFile = project.oln
+
This optional parameter indicates that an additional output file (Gerber layer) is to
+ be generated containing a rectangle that is drawn around the edges of the final panelized
+ job. The value of this parameter is the name of the file. If 'none' is specified or this option
+ is omitted, no outline file is generated.
+
This outline layer is useful in circuit board milling
+ for defining the path extents of a contour router bit so that the entire panel may be cut out by
+ the mill.
+
+ - Scoring File
+ - ScoringFile = project.sco
+
This optional parameter indicates that an additional output file (Gerber layer) is to
+ be generated containing scoring lines. These scoring lines describe the path for a scoring
+ tool to make V-grooves in the board in between jobs, so that the jobs may be easily snapped
+ apart. The value of this parameter is the name of the file. If 'none' is specified or this option
+ is omitted, no scoring file is generated.
+
+ - Panel Width/Height
+ - PanelWidth = 12.6
+ PanelHeight = 7.8
+ These parameters (in inches) set the dimensions of the board manufacturer's panels. An error message
+ will be displayed if the panelized job exceeds these dimensions. You can change these settings
+ to match the panel size of your board manufacturer, if you know it.
+
For automatic placement, the panel size defined by these settings
+ constraint the random placements such that only placements that would fit on the panel are considered.
+
+ - Margins
+ - LeftMargin = 0.1
+ RightMargin = 0.1
+ TopMargin = 0.1
+ BottomMargin = 0.1
+ These four parameters set the amount of extra space to leave around the
+ edges of the panel to simplify tooling and handling. These margins are
+ specified in inches, and default to 0" if not specified. These spacings will
+ only be visible to the board manufacturer if you enable crop marks (see
+ CropMarkLayers above) or use an outline layer.
+
+ - Job Spacing
+
- XSpacing = 0.125
+ YSpacing = 0.125
+ These parameters set the job-to-job spacing in horizontal (X) and vertical (Y) directions.
+ The default spacing is 0.125 inches if these parameters are not specified. Normally, both
+ parameters will have the same value, but different values can be used to "tweak"
+ a panel to exactly fit some dimensions.
+
+ - Cut Line Width
+ - CutLineWidth = 0.01
+
This optional parameter (in inches) indicates the width of the line used to draw cut lines. If not
+ specified, the default is 0.01".
+
+ - Crop Mark Width
+ - CropMarkWidth = 0.01
+
This optional parameter (in inches) indicates the width of the line used to draw crop marks. If not
+ specified, the default is 0.01".
+
+ - Allow Missing Layers
+ - AllowMissingLayers = 0
+
This parameter may be set to either 0 or 1. When set to 0, all jobs must have the same
+ layer names. This is the most common case. This parameter guards against misspelling of
+ layer names and having them mistakenly placed on a different layer.
+
Some jobs, however, will have fewer or more layers. For example, mixing jobs that do
+ and do not have surface-mount components may mean that some jobs will have solder mask layers
+ and some will not. Setting AllowMissingLayers to 1 allows you to panelize such
+ job mixtures. Take care, however, to inspect the output carefully
+ in this case to catch layer-name surprises.
+
+ - DrillClusterTolerance
+ - DrillClusterTolerance = 0
+
This option is intended to reduce the number of drills in the output by
+eliminating drill sizes that are too close to make a difference. For example,
+it probably does not make sense to have two separate 0.031" and 0.0315" drills.
+The DrillClusterTolerance value specifies how much tolerance is allowed in
+drill sizes, in units of inches. Multiple drill tools that span twice this
+tolerance will be clustered into a single drill tool. For example, a set of
+0.031", 0.0315", 0.032", and 0.034" drills will all be replaced by a single
+drill tool of diameter (0.031"+0.034")/2 = 0.0325". It is guaranteed that all
+original drill sizes will be no farther than DrillClusterTolerance from the
+drill tool size generated by clustering.
+
Setting DrillClusterTolerance to 0 (the default) disables clustering.
+
+ - MinimumFeatureSize
+ - MinimumFeatureSize = None
+
Use this option to automatically thicken features on particular layers. This is
+intended for thickening silkscreen to some minimum width. The value of this
+option must be a comma-separated list of layer names followed by minimum
+feature sizes (in inches) for that layer. Comment this out to disable
+thickening. Example usage is:
+
MinimumFeatureSize = *topsilkscreen,0.008,*bottomsilkscreen,0.008
+
+ - FiducialPoints
+ - FiducialPoints = None
+
Use this option to automatically add fiducials (little round markers used to aid
+in automatic component placement) to your final panel. This makes the most sense when
+you leave some margins around your panel and place the fiducials on the margins.
+
The parameter to this option is a list of X,Y points at which to draw fiducials, relative to the
+edges of the final panel. Positive values are relative to the lower-left, while negative values are
+relative to the upper-right. For example:
+
FiducialPoints = 0.125,0.125,-0.1,-0.1
+would place one fiducial at (0.125,0.125) relative to the lower-left, and another fiducial
+a distance of (0.1,0.1) from the top-right of the final panel. To place a fiducial at the top-left
+of the final panel:
+ FiducialPoints = 0.125,-0.125
+The FiducialCopperDiameter and FiducialMaskDiameter options control the appearance of the fiducials.
+
+ - FiducialCopperDiameter
+
- FiducialCopperDiameter = 0.08
+
This option sets the diameter of fiducials in inches. See the FiducialPoints configuration option for more information.
+
+ - FiducialMaskDiameter
+ - FiducialMaskDiameter = 0.32
+
This option sets the diameter of the soldermask opening around fiducials in inches. See the FiducialPoints configuration option for more information.
+
+
+
+
+
Job Descriptions
+
+Each input job is described in its own section. The job is described by providing file names for
+each layer. Layer names are up to you, but note the following:
+
+Layer names may be specified with lowercase and uppercase letters, but are converted to
+all-lowercase by GerbMerge. Note that this applies to layer names, not filenames.
+
Each job must have at least a 'boardoutline' and 'drills' layer, specifying the Gerber
+board outline and Excellon drills layer, respectively.
+
Each job may have an optional 'toollist' file specifying the tool list (or "drill rack")
+in effect for this job only. This setting overrides the global ToolList option, described above.
+If the Excellon file for the job has embedded tool sizes, this option is ignored.
+
All layer names other than 'boardoutline' and 'drills' must begin with an asterisk '*'
+character.
+
+
+Consider the following example:
+
+ [CPUBoard]
+ BoardOutline = /home/user/eagle/cpuboard/cpu.bor
+ Drills = /home/user/eagle/cpuboard/cpu.xln
+ ToolList = /home/user/eagle/cpuboard/tools.drl
+ *TopLayer = /home/user/eagle/cpuboard/cpu.cmp
+ *BottomLayer = /home/user/eagle/cpuboard/cpu.sol
+ *Silkscreen = /home/user/eagle/cpuboard/cpu.plc
+
+Job names (in square brackets) are fairly arbitrary and need not correspond to any file names. They must,
+however, comprise only letters, digits, and the underscore character. Furthermore, job names must begin with
+a letter. Job names, unlike layer names, are case sensitive.
+
Each assignment statement assigns a file name to a layer name. As mentioned above,
+the layer names 'boardoutline' and 'drills' are reserved and required. The optional 'toollist' layer
+is not an actual layer but an assignment that indicates the tool list in effect for this job. All other layer
+names are up to you and must begin with an asterisk '*'.
+
Make good use of variable substitutions (see the sample layout1.cfg
+and layout2.cfg files) to avoid
+typing the same pathname over and over.
+
In addition to specifying board layers, each job description can also have job-specific
+parameter assignments:
+
+ - Repeat
+ - Repeat = 3
+
This option is only used for automatic placement and indicates the number
+ of times this job is to appear in the final panel. For manual placement, this option is ignored. This option
+ may be left unspecified in which case a repeat count of 1 is assumed.
+
+ - ExcellonDecimals
+
- ExcellonDecimals = 3
+
This option overrides the global ExcellonDecimals setting in the
+ [Options] section for this job only. This allows jobs with different
+ Excellon decimal formats to be panelized. This option may be left unspecified
+ in which case the global ExcellonDecimals setting is applied.
+
+
+
+
Merge Output Files
+
+GerbMerge combines data from multiple jobs grouped by layer. All of the "bottom copper"
+layers from all jobs, for example, will be combined into a single "bottom copper" file.
+The names of these combined output files can be set in the [MergeOutputFiles] section of the
+configuration file.
+
This section contains assignments of file names to layer names. The layer names must be the
+same as the ones specified in the [Jobs] section of the configuration file.
+All layer names must begin with an asterisk '*' except for the following four reserved layer names:
+
- BoardOutline
+- Drills
+- Placement
+- ToolList
+
+The first two reserved layer names are actual layers, while
+Placement refers to the placement file generated by GerbMerge
+containing positions of jobs on the final panel, and ToolList refers
+to the combined tool list file generated by GerbMerge.
+
Any assignment made in this section that does not begin with an asterisk or is not an assignment
+to one of the above four reserved names is considered a general variable assignment for future
+string substitution.
+
Here is an example:
+
+ [MergeOutputFiles]
+ Prefix = job1
+ BoardOutline = %(prefix)s.bor
+ Drills = %(prefix)s.xln
+ *topcopper = %(prefix)s.cmp
+ *bottomcopper = %(prefix)s.sol
+
+If an assignment to a layer name is missing, GerbMerge will create the file merged.layername.ger where
+'layername' is the layer name. Default values for the four reserved names are merged.boardoutline.ger
+for the BoardOutline layer, merged.drills.xln for the Drills layer, merged.placement.txt for the Placement file, and merged.toollist.drl for the ToolList combined tool list file.
+
+
+
+© 2003-2011, Copyright by Rugged Circuits LLC; All Rights Reserved. mailto: support@ruggedcircuits.com
+
+
+
diff --git a/doc/ex1.png b/doc/ex1.png
new file mode 100644
index 0000000000000000000000000000000000000000..67adfccc9b85e8e022c30f48e32432689f77310b
GIT binary patch
literal 3668
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
literal 0
HcmV?d00001
diff --git a/doc/ex1b.png b/doc/ex1b.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e487182b9117596a6aacb3ce37a8d263f68133e
GIT binary patch
literal 10908
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