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

+
+ +


+ + + + + + + + + +
Top-Level | The Configuration File | The Layout File | Automatic Placement
 
+ Introduction | Randomized Search | + Exhaustive Search | Multiple Instances | Usage Notes

+ +

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

+
+ +


+ + + + + + + + + +
Top-Level | The Configuration File | The Layout File | Automatic Placement
 
+ Operating Parameters | Job Descriptions | + Syntax Notes

+ +

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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 literal 0 HcmV?d00001 diff --git a/doc/ex1f.png b/doc/ex1f.png new file mode 100644 index 0000000000000000000000000000000000000000..5e425edf19722ad0ef3dc36e3c789809caf746d5 GIT binary patch literal 10441 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 P86qjmYsl5fSVjCVD5zZW literal 0 HcmV?d00001 diff --git a/doc/ex1g.png b/doc/ex1g.png new file mode 100644 index 0000000000000000000000000000000000000000..061ad3c096ccf3b8a4fa7a6408a5ed6280429116 GIT binary patch literal 12272 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 + + + + GerbMerge -- License + + + + + +

GerbMerge -- A Gerber-file merging program

+
+

Rugged Circuits LLC

+
+


+
+                    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
+.
+
+
+

© 2003-2011, Copyright by Rugged Circuits LLC; All Rights Reserved. mailto: support@ruggedcircuits.com
+ + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..24cf1c3 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,392 @@ + + + + + GerbMerge -- A Gerber-file merging program + + + + + +

GerbMerge -- A Gerber-file merging program

+ +
+

Rugged Circuits LLC

+
+ +


+ + + + + + + + + + + + +
Top-Level | The Configuration File | The Layout File | Automatic PlacementVersion 1.8
June 8, 2011
+ Requirements | Installation | + Running GerbMerge | Verifying the Output | Limitations | Program Options | Copyright | To + Do | Credits | History

+ +

What's New

+

In release 1.8: +

    +
  • Released under more recent GPL v3 license
  • +
  • Summary statistics prints out smallest drill tool diameter
  • +
  • Added FiducialPoints, FiducialCopperDiameter, and FiducialMaskDiameter configuration options
  • +
  • Added option to write fiducials to final panel
  • +
  • Scoring lines now go all the way across a panel
  • +
+ +

In release 1.7: +

    +
  • Added a new command-line option --search-timeout to time-limit the automatic placement process.
  • +
  • Added preliminary support for a GUI controller interface.
  • +
+ +

+

Introduction

+ +

GerbMerge is a program for combining (panelizing) the CAM data from multiple printed + circuit board designs into a single set of CAM files. The purpose of + doing so is to submit a single job to a board manufacturer, thereby saving on manufacturing costs. +

GerbMerge currently works with: +

    +
  • CAM data generated by the Eagle circuit board + design program, with "best effort" support for Orcad, Protel, and PCB
  • +
  • Artwork in Gerber RS274-X format
  • +
  • Drill files in Excellon format
  • +
+ Here is one sample and another sample of the program's output. These samples + demonstrate panelizing multiple, different jobs, and also demonstrate board rotation. + +

+

Download

+

Version 1.8

+ + +

+

Requirements

+

GerbMerge is written in pure Python. It + depends upon the following packages for operation: +

+

All of the above packages come with easy installation programs for both Windows, Mac OS X, + and Linux. + +

+

Installation

+ +

First, install all of the packages listed above in the Requirements section. + +

Windows

+

Run the gerbmerge1.8.exe installation program. I will assume +you choose all of the default installation options. The installer +will create and populate the following directories:

+
    +
    +c:\Python24\lib\site-packages\gerbmerge
    +c:\Python24\gerbmerge
    +
    +
+

The above assumes you have Python installed in C:\Python24. The +first directory is where the actual program resides. The second directory +contains the documentation, example files, etc. In the C:\Python24 +directory is a sample batch file GERBMERGE.BAT which shows you how to +run the GerbMerge program. + +

Unix / Mac OS X

+

Extract the gerbmerge1.8.tar.gz file then install as follows:

+
    +python setup.py install   (You may need to be root to install to system directories) +
+

The installer will create and populate the following directories/files:

+
    +
    +/usr/local/lib/python2.4/site-packages/gerbmerge
    +/usr/local/lib/python2.4/gerbmerge
    +/usr/local/bin/gerbmerge
    +
    +
+

The above assumes your Python library directory is as indicated (it may be +elsewhere but the installer should be able to find it, so don't worry about +it). The first directory is where the actual program resides. The second +directory contains the documentation, example files, etc. A sample program for +invoking GerbMerge is installed as /usr/local/bin/gerbmerge...feel free to move +it somewhere else. +

Not all Linux distributions are the same, however. If you have trouble, there is a useful set of instructions from Chetan Bhargava for installing GerbMerge on Ubuntu distributions. + +

+

Running GerbMerge

+ +

Windows

+

Open a DOS box and invoke the Python interpreter on the gerbmerge.py file. +Have a look at GERBMERGE.BAT (and put this on your Path somewhere) for an example. +

c:\python24\python c:\python24\lib\site-packages\gerbmerge\gerbmerge.py
+

Unix / Mac OS X

+

You run GerbMerge by invoking the Python interpreter on the gerbmerge.py +file of the gerbmerge package. For example:

+
python /usr/local/lib/python2.4/site-packages/gerbmerge/gerbmerge.py
+

The gerbmerge shell script that comes with this software contains an +example for running GerbMerge, modelled on the above. By default, this shell +script is installed in /usr/local/bin so you should just be able +to type gerbmerge from a shell prompt. +

Operation

+There are three ways to run GerbMerge: +
  1. By manually specifying the relative placement of jobs
  2. +
  3. By manually specifying the absolute placement of jobs
  4. +
  5. By letting GerbMerge automatically search for a placement that minimizes total panel area
  6. +
+

Manual Relative Placement

+For the manual relative placement approach, GerbMerge needs two input text files: +
    +
  • The configuration file specifies global options and defines the jobs +to be panelized

  • +
  • The layout file specifies how the jobs are to be laid out.

  • +
+

The names of these files are the two required parameters to GerbMerge: +

gerbmerge file.cfg file.def
+

The following links describe the contents of the configuration +file and layout file. +

Manual Absolute Placement

+

For the manual absolute placement approach, GerbMerge also needs the configuration file +as well as another text file that specifies where each job is located on the panel and +whether or not it is rotated: +

gerbmerge --place-file=place.txt file.cfg
+

The place.txt file looks something like: +

job1 0.100 0.100
+cpu 0.756 0.100
+cpu*rotated 1.35 1.50
+
+

This method of placement is not meant for normal use. It can be used to recreate +a previous invocation of GerbMerge, since GerbMerge saves its results in a text file +(whose name is set in the [MergeOutputFiles] +section of the configuration file) after every run. Thus, you can experiment with +different parameters, save a placement you like, do some more experimentation, then return +to the saved placement if necessary. +

Alternatively, this method of placement can be used with third-party back ends that +implement intelligent auto-placement algorithms, using GerbMerge only for doing the +actual panelization. +

Automatic Placement

+

For the automatic placement approach, GerbMerge only needs the configuration file: +

gerbmerge file.cfg
+Command-line options can be used to modify the search algorithm. See the +Automatic Placement page for more information. +

Input File Requirements

+GerbMerge requires the following input CAM files: +
    +
  • Each job must have a Gerber file describing the board outline, which is assumed +rectangular. In Eagle, a board outline is usually generated from the Dimension layer. +This board outline is a width-0 line describing the physical extents of the board. If you're +not using Eagle, you don't have to generate a width-0 rectangle, but GerbMerge does need +to use some Gerber layer to determine the extents of the board. GerbMerge will take the maximum +extents of all drawn objects in this layer as the extents of the board.

  • +
  • Each job must have an Excellon drill file.

  • +
  • Each job can have any number of optional Gerber files describing copper +layers, silkscreen, solder masks, etc.

  • +
  • All files must have the same offset and must be shown looking from the +top of the board, i.e., not mirrored.

  • +
  • Each job may have an optional tool list file indicating the tool names +used in the Excellon file and the diameter of each tool. This file is not necessary +if tool sizes are embedded in the Excellon file. A typical tool list file looks like: +

    +          T01 0.025in
    +          T02 0.032in
    +          T03 0.045in
    +
    +
+ +

+

Verifying the Output

+ +

Before sending your job to be manufactured, it is imperative that you verify +the correctness of the output. Remember that GerbMerge comes with NO WARRANTY. +Manufacturing circuit boards costs real money and a single mistake can render +an entire lot of boards unusable. +

I recommend the following programs for viewing the final output data. Take +the time to become very familiar with at least one of these tools and to use +it before every job you send out for manufacture. +

+
gerbv
+
For Linux, the best option (currently) for viewing Gerber and Excellon files +is the gerbv program. Simply +type in the names of all files generated by GerbMerge as parameters to gerbv: +
gerbv merged.*.ger merged.*.xln
+
GC-Prevue
+

For Windows, GC-Prevue is a good program +that I have used often. It is a free program. GraphiCode makes lots of other, more +powerful Gerber manipulation and viewing programs but they are quite pricey ($495 and up).

+
ViewMate
+

Another free Windows program, ViewMate is similar +to GC-Prevue. I have not used ViewMate much, but that is mostly due to familiarity with +GC-Prevue. The two programs are comparable, although I'm sure that someone who is much +more familiar with both could point out some differences.

+
+ +

+

Limitations

+ +
    +
  • This program has mainly been tested with output from the Eagle CAD program. +Limited testing has been performed with Orcad, Protel, and PCB. +Other CAD programs will NOT WORK with a very high probability, as the input +parser is quite primitive. +

    If you have the need/motivation to adapt GerbMerge to other CAD programs, +have a look at the gerber2pdf program. It is written in Python and +implements a much more complete RS274-X input file parser. Combining GerbMerge +with gerber2pdf should be a fairly simple exercise. Also, feel free to +send us samples of Gerber/Excellon output of your CAD tool and we'll see if we can +add support for it. +

  • This program handles apertures that are rectangles, ovals, circles, macros +without parameters or operators, and Eagle octagons (which are defined using a macro with a single parameter, hence currently handled as a special case). +

  • The panelizing capabilities of this program do not allow for arbitrary +placement of jobs, although there is a fair amount of flexibility. +

  • All jobs are assumed to be rectangular in shape. Non-rectangular jobs +can be handled but will lead to wasted space in the final panel. +

  • A maximum of 26 different drill sizes is supported for generating a +fabrication drawing.

  • +
+ +

+

Program Options

+ +
+
--octagons=normal
+
--octagons=rotate
+
The --octagons option affects how the octagon aperture is defined in the output files. The parameter + to this option must either be rotate or normal. Normally, + octagons begin at an angle of 22.5 degrees, but some Gerber viewers have a problem + with that (notably CircuitMaker from LPKF). These programs expect octagons to begin + at 0.0 degrees. +

The --octagons=normal option is the default (22.5 degrees) and need not + be specified. A rotation of 0.0 degrees can be achieved by specifying --octagons=rotate.

+ +

--random-search
+
This option is the default when only a configuration file is specified (see the documentation on Automatic Placement for more information). It indicates that a randomized search of possible job tilings is + to be performed. This option does not make sense when a layout file is specified.
+ +

--full-search
+
This option may be specified to indicate that all possible job tilings are to be searched (see the documentation on Automatic Placement for more information). This option does not make sense when a layout file + is specified.
+ +

--rs-fsjobs=N
+
This option is used with randomized search to indicate how many jobs are to undergo full search for each tiling. See the documentation on Automatic Placement for more information.
+ +

--place-file=filename
+
This option performs a panel layout based upon absolute job positions in + the given text file, rather than by random/full search or by a layout file. + The placement file created by GerbMerge can be used as an input file to + this option in order to recreate a previous layout.
+ +

--no-trim-gerber
+
This option prevents GerbMerge from trying to trim all Gerber data to lie within the + extents of a given job's board outline. Normally, GerbMerge will try to do so to prevent + one job's Gerber data (most notably, silkscreen lines for connectors that protrude from + the board) from interfering with a neighboring job on the final panel. Specify this + command-line option if you do not want this trimming to occur.
+ +

--no-trim-excellon
+
This option prevents GerbMerge from trying to trim all Excellon data to lie within the + extents of a given job's board outline. Normally, GerbMerge will try to do so to prevent + one job's drill holes from landing in the middle of a neighboring job on the final panel. Specify + this command-line option if you do not want this trimming to occur.
+ +

--search-timeout=seconds
+
When random placements are used, this option can be used to automatically terminate the + search process after the specified number of seconds. If the number of seconds is 0 or this + option is not specified, then random placements are tried forever, until Ctrl-C is pressed + to stop the process and keep the best placement so far.
+ +

-h, --help
+
The '-h' or '--help' option prints a brief summary of available options. + +

-v, --version
+
The '-v' or '--version' option prints the current program version and author contact information.
+
+ +

+

Copyright & License

+ +

Copyright © 2011 Rugged Circuits LLC. All Rights Reserved. + mailto: support@ruggedcircuits.com +

GerbMerge comes with ABSOLUTELY NO WARRANTY. This + is free software licensed under the terms of the GNU General + Public License Version 3. You are welcome to redistribute this software + under certain conditions. For more details, see the previous link or + visit The Free Software Foundation. + +

+

To Do

+ +
    +
  1. Accept outputs from more CAD programs
  2. +
  3. A graphical interface for interactive placement
  4. +
  5. Better reporting of parse errors in the layout and configuration files
  6. +
  7. Implement simple primitive for panelizing a single job in an array
  8. +
  9. More intelligent placement algorithms, possibly based on the fabric cutting problem.
  10. +
  11. Accept aperture macro parameters and operators +
+ +

+ +

Credits

+

Thanks to Jace Browning for major contributions to this code. This help file is based on a template for the help file for mxTools + by M.A. Lemburg. + This software was created with VIM; + thanks to the authors of this program and special thanks for + the Python syntax support. Thanks to M.A. Lemburg for his + mxBase + package, Mike Fletcher for his + SimpleParse package, and + the authors of gerbv, a great + Gerber file viewer for Linux/Mac OS X, and, of course, to the + Python developers and + support community.

+

Thanks to Joe Pighetti for making me start writing this program, and to + the Grand Valley State University Firefighting Robot Team for making me finish it.

+

Thanks to Matt Kavalauskas for identifying Eagle's annulus and thermal macros and supporting + the development of the aperture macro code.

+

Thanks to Bohdan Zograf for the Belorussian translation of this documentation.

+ +
+ +

© 2003-2011, Copyright by Rugged Circuits LLC; All Rights Reserved. mailto: support@ruggedcircuits.com
+ + + diff --git a/doc/layout1.cfg b/doc/layout1.cfg new file mode 100644 index 0000000..d38bb0d --- /dev/null +++ b/doc/layout1.cfg @@ -0,0 +1,272 @@ +# This configuration file demonstrates panelizing a single job. + +############################################################################## +# In the [DEFAULT] section you can create global names to save typing the same +# directory name, for example, over and over. +############################################################################## +[DEFAULT] + +# Change projdir to wherever your project files are, for example: +# +# projdir = /home/stuff/projects/test +# +# or relative pathname from where you are running GerbMerge +# +# projdir = testdata +# +# or if all files are in the current directory (as in this example): +# +# projdir = . +projdir = . + +# For convenience, this is the base name of the merged output files. +MergeOut = merge1 + +############################################################################# +# The [Options] section defines settings that control how the input files are +# read and how the output files are generated. +############################################################################# +[Options] + +################################################################ +# +# Settings that are very important +# +################################################################ + +# Option indicating name of file that maps Excellon tool codes to drill sizes. +# This is not necessary if the Excellon files have embedded tool sizes, or if a +# tool list is specified as part of the job description. The ToolList option +# here is the "last resort" for mapping tool codes to tool sizes. Most recent +# PCB programs embed drill size information right in the Excellon file, so this +# option should not be necessary and can be commented out. +#ToolList=proj1.drl + +# Optional indication of the number of decimal places in input Excellon drill +# files. The default is 4 which works for recent versions of Eagle (since +# version 4.11r12), as well as Orcad and PCB. Older versions of Eagle use 3 +# decimal places. +#ExcellonDecimals = 4 + +################################################################ +# +# Settings that are somewhat important +# +################################################################ + +# Which layers to draw cut lines on. Omit this option or set to 'None' for no +# cut lines. Cut lines are borders around each job that serve as guides for +# cutting the panel into individual jobs. Option 'CutLineWidth' sets the +# thickness of these cut lines. +# +# NOTE: Layer names are ALL LOWERCASE, even if you define them with uppercase +# letters below. +CutLineLayers = *topsilkscreen,*bottomsilkscreen + +# Which layers to draw crop marks on. Omit this option or set to 'None' for no +# crop marks. Crop marks are small L-shaped marks at the 4 corners of the final +# panel. These practically define the extents of the panel and are required by +# some board manufacturers. Crop marks are also required if you want to leave +# extra space around the final panel for tooling or handling. Option +# 'CropMarkWidth' sets the thickness of these crop marks. +# +# NOTE: Layer names are ALL LOWERCASE, even if you define them with uppercase +# letters below. +CropMarkLayers = *topsilkscreen,*bottomsilkscreen + +# Set this option to the name of a file in which to write a Gerber fabrication +# drawing. Some board manufacturers require a fabrication drawing with panel +# dimensions and drill hit marks and drill legend. There's no harm in creating +# this file...you can ignore it if you don't need it. +FabricationDrawingFile = %(mergeout)s.fab + +# If FabricationDrawingFile is specified, you can provide an optional file name +# of a file containing arbitrary text to add to the fabrication drawing. This +# text can indicate manufacturing information, contact information, etc. +#FabricationDrawingText = %(projdir)s/fabdwg.txt + +# Option to generate leading zeros in the output Excellon drill file, i.e., to +# NOT use leading-zero suppression. Some Gerber viewers cannot properly guess +# the Excellon file format when there are no leading zeros. Set this option to +# 1 if your Gerber viewer is putting the drill holes in far off places that do +# not line up with component pads. +ExcellonLeadingZeros = 0 + +# Optional additional Gerber layer on which to draw a rectangle defining the +# extents of the entire panelized job. This will create a Gerber file (with +# name specified by this option) that simply contains a rectangle defining the +# outline of the final panel. This outline file is useful for circuit board +# milling to indicate a path for the router tool. There's no harm in creating +# this file...you can ignore it if you don't need it. +OutlineLayerFile = %(mergeout)s.oln + +# Optional additional Gerber layer on which to draw horizontal and vertical +# lines describing where to score (i.e., V-groove) the panel so that jobs +# can easily snap apart. These scoring lines will be drawn half-way between +# job borders. +ScoringFile = %(mergeout)s.sco + +# Set the maximum dimensions of the final panel, if known. You can set the +# dimensions of the maximum panel size supported by your board manufacturer, +# and GerbMerge will print an error message if your layout exceeds these +# dimensions. Alternatively, when using automatic placement, the panel sizes +# listed here constrain the random placements such that only placements that +# fit within the given panel dimensions will be considered. The dimensions are +# specified in inches. +PanelWidth = 12.6 +PanelHeight = 7.8 + +# 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. +LeftMargin = 0.1 +RightMargin = 0.1 +TopMargin = 0.1 +BottomMargin = 0.1 + +################################################################ +# +# Settings that are probably not important +# +################################################################ + +# Set the inter-job spacing (inches) in both the X-dimension (width) and +# Y-dimension (height). Normally these would be the same unless you're trying +# really hard to make your jobs fit into a panel of exact size and you need to +# tweak these spacings to make it work. 0.125" is probably generous, about half +# that is practical for using a band saw, but you probably want to leave it at +# 0.125" if you have copper features close to the board edges and/or are using +# less precise tools, like a hacksaw, for separating the boards. +XSpacing = 0.125 +YSpacing = 0.125 + +# Width of cut lines, in inches. The default value is 0.01". These are drawn on +# the layers specified by CutLineLayers. +CutLineWidth = 0.01 + +# Width of crop marks, in inches. The default value is 0.01". These are drawn on +# the layers specified by CropMarkLayers. +CropMarkWidth = 0.01 + +# This option is intended to reduce the probability of forgetting to include a +# layer in a job description when panelizing two or more different jobs. +# Unless this option is set to 1, an error will be raised if some jobs do not +# have the same layer names as the others, i.e., are missing layers. For +# example, if one job has a top-side soldermask layer and another doesn't, that +# could be a mistake. Setting this option to 1 prevents this situation from +# raising an error. +AllowMissingLayers = 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 disables clustering. +DrillClusterTolerance = 0.002 + +# 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. +MinimumFeatureSize = *topsilkscreen,0.008,*bottomsilkscreen,0.008 + +############################################################################## +# This section sets the name of merged output files. Each assignment below +# specifies a layer name and the file name that is to be written for that +# merged layer. Except for the BoardOutline and Drills layer names, all other +# layer names must begin with an asterisk '*'. The special layer name Placement +# is used to specify the placement file that can be used with the +# '--place-file' command-line option in a future invocation of GerbMerge. The +# special layer name ToolList is used to specify the file name that represents +# the tool list for the panelized job. +# +# By default, if this section is omitted or no layername=filename assignment is +# made, the following files are generated: +# +# BoardOutline = merged.boardoutline.ger +# Drills = merged.drills.xln +# Placement = merged.placement.txt +# ToolList = merged.toollist.drl +# *layername = merged.layername.ger +# (for example: 'merged.toplayer.ger', 'merged.silkscreen.ger') +# +# Any assignment that does not begin with '*' or is not one of the reserved +# names BoardOutline, Drills, ToolList, or Placement is a generic string +# assignment that can be used for string substitutions, to save typing. +############################################################################## +[MergeOutputFiles] +Prefix = %(mergeout)s + +*TopLayer=%(prefix)s.cmp +*BottomLayer=%(prefix)s.sol +*TopSilkscreen=%(prefix)s.plc +*BottomSilkscreen=%(prefix)s.pls +*TopSoldermask=%(prefix)s.stc +*BottomSoldermask=%(prefix)s.sts +Drills=%(prefix)s.xln +BoardOutline=%(prefix)s.bor +ToolList = toollist.%(prefix)s.drl +Placement = placement.%(prefix)s.txt + +############################################################################## +# The remainder of the file specifies the jobs to be panelized. Each job is +# specified in its own section. To each job you can assign a job name, which +# will be the name of the section in square brackets (e.g., [Proj1]). This job +# name is used in the layout file (if used) to refer to the job. +# +# Job names are case-sensitive, but do not create job names that are the same +# except for the case of the characters, as this may cause problems during +# layout. Job names may only contain the following characters: +# +# a-z A-Z 0-9 _ +# +# In addition, job names must begin with a letter (a-z or A-Z). +############################################################################## +[Proj1] + +# You can set any options you like to make generating filenames easier, like +# Prefix. This is just a helper option, not a reserved name. Note, however, +# that you must write %(prefix)s below, in ALL LOWERCASE. +# +# Note how we are making use of the 'projdir' string defined way up at the top +# in the [DEFAULT] section to save some typing. By setting 'projdir=somedir' +# the expression '%(projdir)s/proj1' expands to 'somedir/proj1'. +Prefix=%(projdir)s/proj1 + +# List all the layers that participate in this job. Required layers are Drills +# and BoardOutline and have no '*' at the beginning. Optional layers have +# names chosen by you and begin with '*'. You should choose consistent layer +# names across all jobs. +*TopLayer=%(prefix)s.cmp +*BottomLayer=%(prefix)s.sol +*TopSilkscreen=%(prefix)s.plc +*BottomSilkscreen=%(prefix)s.pls +*TopSoldermask=%(prefix)s.stc +*BottomSoldermask=%(prefix)s.sts +Drills=%(prefix)s.xln +BoardOutline=%(prefix)s.bor + +# If this job does not have drill tool sizes embedded in the Excellon file, it +# needs to have a separate tool list file that maps tool names (e.g., 'T01') to +# tool diameter. This may be the global tool list specified in the [Options] +# section with the ToolList parameter. If this job doesn't have embedded tool +# sizes, and uses a different tool list than the global one, you can specify it +# here. +#ToolList=proj1.drl + +# If this job has a different ExcellonDecimals setting than the global setting +# in the [Options] section above, it can be overridden here. +#ExcellonDecimals = 3 + +# You can set a 'Repeat' parameter for this job when using automatic placement +# (i.e., no *.def file) to indicate how many times this job should appear in +# the final panel. When using manual placement, this option is ignored. +#Repeat = 5 diff --git a/doc/layout1.def b/doc/layout1.def new file mode 100644 index 0000000..7e9dd5d --- /dev/null +++ b/doc/layout1.def @@ -0,0 +1,19 @@ +# This example simply takes the small Proj1 board and panelizes +# it in a 2x4 array. To demonstrate rotation, the second column +# consists of rotated jobs. You wouldn't really do it this way, +# of course, as it wastes space. +Row { + Col { + Proj1 + Proj1 + Proj1 + Proj1 + } + Col { + Proj1 Rotate + Proj1 Rotate + Proj1 Rotate + Proj1 Rotate + } +} + diff --git a/doc/layout2.cfg b/doc/layout2.cfg new file mode 100644 index 0000000..2eb980e --- /dev/null +++ b/doc/layout2.cfg @@ -0,0 +1,282 @@ +# This configuration file demonstrates panelizing multiple, different jobs. +# We panelize the HEXAPOD job and several copies of the Proj1 job. + +############################################################################## +# In the [DEFAULT] section you can create global names to save typing the same +# directory name, for example, over and over. +############################################################################## +[DEFAULT] + +# Change projdir to wherever your project files are, for example: +# +# projdir = /home/stuff/projects/test +# +# or relative pathname from where you are running GerbMerge +# +# projdir = testdata +# +# or if all files are in the current directory (as in this example): +# +# projdir = . +projdir = . + +# For convenience, this is the base name of the merged output files. +MergeOut = merge2 + +############################################################################# +# The [Options] section defines settings that control how the input files are +# read and how the output files are generated. +############################################################################# +[Options] + +################################################################ +# +# Settings that are very important +# +################################################################ + +# Option indicating name of file that maps Excellon tool codes to drill sizes. +# This is not necessary if the Excellon files have embedded tool sizes, or if a +# tool list is specified as part of the job description. The ToolList option +# here is the "last resort" for mapping tool codes to tool sizes. Most recent +# PCB programs embed drill size information right in the Excellon file, so this +# option should not be necessary and can be commented out. +#ToolList=proj1.drl + +# Optional indication of the number of decimal places in input Excellon drill +# files. The default is 4 which works for recent versions of Eagle (since +# version 4.11r12), as well as Orcad and PCB. Older versions of Eagle use 3 +# decimal places. +#ExcellonDecimals = 4 + +################################################################ +# +# Settings that are somewhat important +# +################################################################ + +# Which layers to draw cut lines on. Omit this option or set to 'None' for no +# cut lines. Cut lines are borders around each job that serve as guides for +# cutting the panel into individual jobs. Option 'CutLineWidth' sets the +# thickness of these cut lines. +# +# NOTE: Layer names are ALL LOWERCASE, even if you define them with uppercase +# letters below. +CutLineLayers = *topsilkscreen,*bottomsilkscreen + +# Which layers to draw crop marks on. Omit this option or set to 'None' for no +# crop marks. Crop marks are small L-shaped marks at the 4 corners of the final +# panel. These practically define the extents of the panel and are required by +# some board manufacturers. Crop marks are also required if you want to leave +# extra space around the final panel for tooling or handling. Option +# 'CropMarkWidth' sets the thickness of these crop marks. +# +# NOTE: Layer names are ALL LOWERCASE, even if you define them with uppercase +# letters below. +CropMarkLayers = *topsilkscreen,*bottomsilkscreen + +# Set this option to the name of a file in which to write a Gerber fabrication +# drawing. Some board manufacturers require a fabrication drawing with panel +# dimensions and drill hit marks and drill legend. There's no harm in creating +# this file...you can ignore it if you don't need it. +FabricationDrawingFile = %(mergeout)s.fab + +# If FabricationDrawingFile is specified, you can provide an optional file name +# of a file containing arbitrary text to add to the fabrication drawing. This +# text can indicate manufacturing information, contact information, etc. +FabricationDrawingText = %(projdir)s/fabdwg.txt + +# Option to generate leading zeros in the output Excellon drill file, i.e., to +# NOT use leading-zero suppression. Some Gerber viewers cannot properly guess +# the Excellon file format when there are no leading zeros. Set this option to +# 1 if your Gerber viewer is putting the drill holes in far off places that do +# not line up with component pads. +ExcellonLeadingZeros = 0 + +# Optional additional Gerber layer on which to draw a rectangle defining the +# extents of the entire panelized job. This will create a Gerber file (with +# name specified by this option) that simply contains a rectangle defining the +# outline of the final panel. This outline file is useful for circuit board +# milling to indicate a path for the router tool. There's no harm in creating +# this file...you can ignore it if you don't need it. +OutlineLayerFile = %(mergeout)s.oln + +# Optional additional Gerber layer on which to draw horizontal and vertical +# lines describing where to score (i.e., V-groove) the panel so that jobs +# can easily snap apart. These scoring lines will be drawn half-way between +# job borders. +ScoringFile = %(mergeout)s.sco + +# Set the maximum dimensions of the final panel, if known. You can set the +# dimensions of the maximum panel size supported by your board manufacturer, +# and GerbMerge will print an error message if your layout exceeds these +# dimensions. Alternatively, when using automatic placement, the panel sizes +# listed here constrain the random placements such that only placements that +# fit within the given panel dimensions will be considered. The dimensions are +# specified in inches. +PanelWidth = 12.6 +PanelHeight = 7.8 + +# 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 OutlineLayer. +LeftMargin = 0.1 +RightMargin = 0.1 +TopMargin = 0.1 +BottomMargin = 0.1 + +################################################################ +# +# Settings that are probably not important +# +################################################################ + +# Set the inter-job spacing (inches) in both the X-dimension (width) and +# Y-dimension (height). Normally these would be the same unless you're trying +# really hard to make your jobs fit into a panel of exact size and you need to +# tweak these spacings to make it work. 0.125" is probably generous, about half +# that is practical for using a band saw, but you probably want to leave it at +# 0.125" if you have copper features close to the board edges and/or are using +# less precise tools, like a hacksaw, for separating the boards. +XSpacing = 0.125 +YSpacing = 0.125 + +# Width of cut lines, in inches. The default value is 0.01". These are drawn on +# the layers specified by CutLineLayers. +CutLineWidth = 0.01 + +# Width of crop marks, in inches. The default value is 0.01". These are drawn on +# the layers specified by CropMarkLayers. +CropMarkWidth = 0.01 + +# This option is intended to reduce the probability of forgetting to include a +# layer in a job description when panelizing two or more different jobs. +# Unless this option is set to 1, an error will be raised if some jobs do not +# have the same layer names as the others, i.e., are missing layers. For +# example, if one job has a top-side soldermask layer and another doesn't, that +# could be a mistake. Setting this option to 1 prevents this situation from +# raising an error. +AllowMissingLayers = 1 + +# 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 disables clustering. +DrillClusterTolerance = 0.002 + +# 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. +MinimumFeatureSize = *topsilkscreen,0.008,*bottomsilkscreen,0.008 + +############################################################################## +# This section sets the name of merged output files. Each assignment below +# specifies a layer name and the file name that is to be written for that +# merged layer. Except for the BoardOutline and Drills layer names, all other +# layer names must begin with an asterisk '*'. The special layer name Placement +# is used to specify the placement file that can be used with the +# '--place-file' command-line option in a future invocation of GerbMerge. The +# special layer name ToolList is used to specify the file name that represents +# the tool list for the panelized job. +# +# By default, if this section is omitted or no layername=filename assignment is +# made, the following files are generated: +# +# BoardOutline = merged.boardoutline.ger +# Drills = merged.drills.xln +# Placement = merged.placement.txt +# ToolList = merged.toollist.drl +# *layername = merged.layername.ger +# (for example: 'merged.toplayer.ger', 'merged.silkscreen.ger') +# +# Any assignment that does not begin with '*' or is not one of the reserved +# names BoardOutline, Drills, ToolList, or Placement is a generic string +# assignment that can be used for string substitutions, to save typing. +############################################################################## +[MergeOutputFiles] +Prefix = %(mergeout)s + +*TopLayer=%(prefix)s.cmp +*BottomLayer=%(prefix)s.sol +*TopSilkscreen=%(prefix)s.plc +*BottomSilkscreen=%(prefix)s.pls +*TopSoldermask=%(prefix)s.stc +*BottomSoldermask=%(prefix)s.sts +Drills=%(prefix)s.xln +BoardOutline=%(prefix)s.bor +ToolList = toollist.%(prefix)s.drl +Placement = placement.%(prefix)s.txt + +############################################################################## +# The remainder of the file specifies the jobs to be panelized. Each job is +# specified in its own section. To each job you can assign a job name, which +# will be the name of the section in square brackets (e.g., [Proj1]). This job +# name is used in the layout file (if used) to refer to the job. +# +# Job names are case-sensitive, but do not create job names that are the same +# except for the case of the characters, as this may cause problems during +# layout. Job names may only contain the following characters: +# +# a-z A-Z 0-9 _ +# +# In addition, job names must begin with a letter (a-z or A-Z). +############################################################################## +[Proj1] + +# You can set any options you like to make generating filenames easier, like +# Prefix. This is just a helper option, not a reserved name. Note, however, +# that you must write %(prefix)s below, in ALL LOWERCASE. +# +# Note how we are making use of the 'projdir' string defined way up at the top +# in the [DEFAULT] section to save some typing. By setting 'projdir=somedir' +# the expression '%(projdir)s/proj1' expands to 'somedir/proj1'. +Prefix=%(projdir)s/proj1 + +# List all the layers that participate in this job. Required layers are Drills +# and BoardOutline and have no '*' at the beginning. Optional layers have +# names chosen by you and begin with '*'. You should choose consistent layer +# names across all jobs. +*TopLayer=%(prefix)s.cmp +*BottomLayer=%(prefix)s.sol +*TopSilkscreen=%(prefix)s.plc +*BottomSilkscreen=%(prefix)s.pls +*TopSoldermask=%(prefix)s.stc +*BottomSoldermask=%(prefix)s.sts +Drills=%(prefix)s.xln +BoardOutline=%(prefix)s.bor + +# If this job does not have drill tool sizes embedded in the Excellon file, it +# needs to have a separate tool list file that maps tool names (e.g., 'T01') to +# tool diameter. This may be the global tool list specified in the [Options] +# section with the ToolList parameter. If this job doesn't have embedded tool +# sizes, and uses a different tool list than the global one, you can specify it +# here. +#ToolList=proj1.drl + +# If this job has a different ExcellonDecimals setting than the global setting +# in the [Options] section above, it can be overridden here. +#ExcellonDecimals = 3 + +# You can set a 'Repeat' parameter for this job when using automatic placement +# (i.e., no *.def file) to indicate how many times this job should appear in +# the final panel. When using manual placement, this option is ignored. +Repeat = 11 + +[Hexapod] +Prefix=%(projdir)s/hexapod +*TopLayer=%(prefix)s.cmp +*BottomLayer=%(prefix)s.sol +*TopSilkscreen=%(prefix)s.plc +Drills=%(prefix)s.xln +BoardOutline=%(prefix)s.bor diff --git a/doc/layout2.def b/doc/layout2.def new file mode 100644 index 0000000..251cba5 --- /dev/null +++ b/doc/layout2.def @@ -0,0 +1,57 @@ +# This layout merges a Hexapod and Proj1 boards into a single +# panel. The layout demonstrates nested rows and columns. The +# final arrangement looks like this (make sure you are looking +# at this document with a fixed-width font like Courier): +# +# +-----------------------------------------------------+ +# | Proj1 | Proj1 | Proj1 | Proj1 | Proj1 | | +# | | | | | | | +# | | | | | | | +# +---------+---------+---------+---------+--------+ | +# | | +# | +-------+-------+ +# | | P | P | +# +--------------------------------+ | r | r | +# | | | o | o | +# | | | j | j | +# | | | 1 | 1 | +# | | +-------+-------+ +# | | | P | P | +# | | | r | r | +# | | | o | o | +# | Hexapod | | j | j | +# | | | 1 | 1 | +# | | +-------+-------+ +# | | | P | P | +# | | | r | r | +# | | | o | o | +# | | | j | j | +# | | | 1 | 1 | +# +--------------------------------+----+-------+-------+ + +Row { // First row has the hexapod and 2x3 panel of + // rotated Proj1 jobs. + Hexapod + Col { // Could also write this as two separate 1x3 columns + Row { // First 1x2 row + Proj1 Rotate + Proj1 Rotate + } + Row { // Second 1x2 row above first one + Proj1 Rotate + Proj1 Rotate + } + Row { // Third 1x2 row above second row + Proj1 Rotate + Proj1 Rotate + } + } // end of column +} // end of first row + +Row { // Second row has 5x1 panel of Proj1 + Proj1 + Proj1 + Proj1 + Proj1 + Proj1 +} diff --git a/doc/layoutfile.html b/doc/layoutfile.html new file mode 100644 index 0000000..761905e --- /dev/null +++ b/doc/layoutfile.html @@ -0,0 +1,216 @@ + + + + GerbMerge -- A Gerber-file merging program -- The Layout File + + + + + +

GerbMerge -- The Layout File

+ +
+

Rugged Circuits LLC

+
+ +


+ + + +
Top-Level | The Configuration File | The Layout File | Automatic Placement

+ +

Introduction

+ +

The layout file tells GerbMerge how to replicate and/or arrange the jobs that + you specified in the configuration file. The layout + file must be specified when using manual relative placement. See the Automatic + Placement page for an alternative to using the layout file approach. + +

The layout file is a plain text file that can be created with any + text editor. + +

Have a look at the sample layout files layout1.def + and layout2.def for a quick overview of this file. + +

+

Rows and Columns

+ +

The panel layout is specified in terms of cells. Each cell is part of either a +row or column of cells. Each row or column can itself be a part of a column or row, +respectively. In this way, a large variety of layouts can be specified. Unfortunately, +this scheme is fairly easy to implement in code, but it does not allow for arbitrary +placement of jobs. + +

At the top level, you specify the layout of the final panel by specifying the +contents of each row, from left to right. Let's begin with an example. The input job, named example is as follows: +

+We will place three copies of this job, all in a row, using the following layout: +
+  Row {
+    example        # Jobs are listed in a row from left to right
+    example
+    example
+  }
+
+The above layout file leads to the following panel: +
+

The Row { .... } construct indicates a single row of the layout. While you +can add spaces and comments as you please, the word Row and its associated +open-bracket must appear on one line, each job name on a separate line, and the closing +bracket on its own line. Thus, the following is illegal: +

+   Row { example example example }    # Illegal!
+
+ +

The word Rotate following a job indicates that the given instance of the job +is to be rotated by 90 degrees at its current position. For example: +

+  Row {
+    example
+    example Rotate
+    example
+  }
+
+The above layout file leads to the following panel: +
+ +

Rows stack vertically beginning at the bottom of the panel and moving up. For example: +

+  Row {
+    example
+    example
+    example
+  }
+  Row {
+    example
+    example
+    example
+  }
+
+The above layout file leads to the following panel: +
+ +

Suppose now that we want the two jobs on the right to be rotated so the final panel has +a smaller width, but larger height. We can try the following: +

+  Row {
+    example
+    example
+    example Rotate
+  }
+  Row {
+    example
+    example
+    example Rotate
+  }
+
+The above layout file leads to the following panel: +
+ +

This layout is quite wasteful and not quite what we intended. The problem is that +GerbMerge stacks rows on top of each other based upon the highest job within a row. The +height of the first (bottom-most) row, then, is the height of the rotated job. +

What we really want is to +think of our layout in terms of columns (in this case). The first column should be two +jobs stacked on top of each other. The second column should be the same. While the third +column should be two jobs side by side. We can accomplish this effect by placing columns +within a single row. Within a column, jobs are listed in stacking order from bottom to top. +For example: +

+  Row {
+    Col {
+      example
+      example
+    }
+    Col {
+      example
+      example
+    }
+    example Rotate
+    example Rotate
+  }
+
+The above layout file leads to the following panel: +
+ +

Study that layout file carefully. The panel has only a single row with 4 elements. +The first element is a column with two jobs. The second element (immediately to the +right of the first element) is also a column with two jobs. The third element is +a rotated job. The fourth and right-most element is a rotated job. + +

In summary, a row is a list of cells that are laid out from left to right. A cell may +be a simple job, or it may be a column of jobs. The column is treated as a single row cell. + +

Now, let's get fancy and embed a row within a column, like this: +

+  Row {
+    Col {
+      example
+      Row {              # This row sits above a job, in a column.
+        example Rotate   # These are laid out left to right in the
+        example Rotate   # middle of a column.
+      }
+    }
+    example Rotate       # These continue left to right in the main row
+    example Rotate
+  }
+
+The above layout file leads to the following panel: +
+ +

In words, the job consists of a single row. The first cell in the row is a column. +The first cell in the column is a job. Above this cell is another row, which has two +cells (rotated jobs) laid out left-to-right. + +

Keep re-reading the above until it makes sense! + +

Here's a quiz: how can you modify the layout file so that a non-rotated job is +added in the blank space at the top-right of the above panel? Think before proceeding. + +

To add a job on top of the two rotated jobs at the right of the panel, we must +convert those two jobs into a column, like this: +

+  Row {
+    Col {
+      example
+      Row {              # This row sits above a job, in a column.
+        example Rotate   # These are laid out left to right in the
+        example Rotate   # middle of a column.
+      }
+    }
+    Col {
+      Row {
+        example Rotate
+        example Rotate
+      }
+      example            # This job sits on top of the two rotated jobs
+    }
+  }
+
+The above layout file leads to the following panel: +
+ +

Once you get the hang of thinking in terms of recursive rows and columns, the +process is not all that difficult. There is one important rule to remember, however: +

Columns can only be defined within a row, and rows can only be defined within +a column.
+ +

Make sure you have a look at the sample layout files layout1.def +and layout2.def for more examples. + +

Rotation Angles

+

For rotating jobs, most users will simply want to rotate jobs by 90 degrees (counterclockwise). This is achieved using the Rotate keyword as described above. It is also possible to rotate jobs by 180 and 270 degrees for special applications, for example, when panelized jobs are not completely separate but need to interact with each other. +

The full list of rotation keywords recognized in the layout file is as follows: +

    +
  • Rotate, Rotate90: rotate by 90 degrees counterclockwise
  • +
  • Rotate180: rotate by 180 degrees
  • +
  • Rotate270: rotate by 270 degrees counterclockwise
  • +
+ +
+

© 2003-2011, Copyright by Rugged Circuits LLC; All Rights Reserved. mailto: support@ruggedcircuits.com
+ + + diff --git a/doc/sample.jpg b/doc/sample.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf883a3a13012c80b51881478a07bad54d82799e GIT binary patch literal 287137 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�HU*5cfY*BkqtTQjyCoT;7k*Cr8g$%neqy7;(fl1Xq9aT-vkA-+ z%ZdA_TCX)VVFEBNV|Ska%qd(~BI>LPwMjv1;~gv2d|b}7a13$v!oTH$wkh=}Stc<0n?k3kIOEYuZ4|t^F<1xg$?{!!pT=47mj-%#9Q}i;S!{2914y#nqEKJ%Z zs|zMX2P?N1^OE#=ETV#alDMd&g*4^T3@rvA{roE2@KlPLCR31lGB)AgONBvV+AdVT zAVV%7)KgoR=hiSmnF76~36*k$4sFqJ!Qgzm&#ck=)4qJm8BjPv$&T%+>NS)!4@pyN zyj=O%uM(;Oo=6aomM(F_BTilA(|n$Gf~dImi_u7gdIP0B^$)@We7vEdp-E5ESw97K zvWi7)o%9-8(>aKaBAT+2A}bYm_&hG+Txy4ves~%cCtio;; z((pDMR`Sjd93E%)n;MplLR8q`LzSgxN@{_p0@>5}Cvrk@4JT?`%wIUNp^sFg5XZCso;qC#beKuZ%dA_YcS>qVG^Gs5mq)4FrTHZ)g(GVCzxP5 zv#O_yZq%^4CcjwMG(rcl%R=y0QR(oLBc3uImcJXW(TvZ8nxTs+L|>n{%(h~PMb9i} zrfIW|pv8}U28WklU7)KQMjA>aLD(wNub%Ubdm8o+;59Q$;@7I}k1BD^3bkR0<+}cK zL}Yb(IgZ?OvkcOyV+L4{NA&I1+-{1|egR181wv<~QJ z?Ov;>*NugA^-$|2y!v2CHMimMp42OL4`%#G0sb9u9vq!8Y#gt>yHg2l+Y&hN8d!#M zxREomLDASXLHOdSB%g7=xIR?69BxIjmuP0#x904X9ex3&L|}E%vMWQ}Wo48Gl)y~A ztg|1qSdhyu>M7tYb#ZPzveH*j!?f*ALBFlCsmCV&vJy7>VpJW6tT&qtq625NA4yvRq`Hw6trK@i zT~Jr_5x)L$bh8N3E8`F{^jW>sgbOAX;eNnG$SJrLDzWdrNL&|p|0JSBZllJ9_~Z02 zov;u5)p!8lVDN4d9Z)Eh5V1kNF+ncR8tNmaW|=o1hM~&%n(Q(?ZmD=Z8vNoV`7GHf zjhswin&C3PrR+B^t4bubV zqeRj|<;Au=3qq+e#m;s&gEMX=vv)Pr%B@CM5qzcd0QYvet|2$MjxO$Ogcs|FlpViB zt4vmp_KpI{9Sz^|OW|$o2j@|O44}!vIhTu(kDT7bR*=|1v8tE$%o4=bm{}RkAbS;m zN`?(Zs{_bGip4h_ryP@-^~s#BgghYj&eW>y$91tluCHG}Tt#w5a~%g$senP>vnA|Y z&iUq7PIQiD8pjr?KhwTcAIV4fL#aLiiZmfytLHMpEL&mRIKqd4ZC4F#C*oCC&+2l)h5-ZU z^0L(0CNC~euj@9L)erS5$j<8A}i)6i2 zd3>m7Nwv^o^Kgy?VK3_r1E%taj}h+2RfW!Lp}nq9x_;D}?7uf>t0@m)`Z7!0o70Ig z^iwd@0PQ;o*y4yVf>-MCiPlbt^#iC>AS;S{zeSObY9=!wHxsQ@k-?qQ>3d|i@b-FV z0KM&gNPb5HYAUf`UFVU~%-MgU^J~Y_yEnNZFE@=8lEyrXR58~tSd0wI;zn54y!#H%GJ#e5EuOxH7X2mQKX z@RBkiNkhV^v3a`7-#8NQSHo6AA1d?sV{W6`sA{L+v^o|X4t`k}!R)WK*sTl^Jc%hj z6d}-m_2N`{rlW1iW_X6V;fohpS-B!B4Z1Wd4Qe^QM|^!Qe1O;EpcAI?DUtXZ%7r+; z`~tF=;bOIgkBuD7<-(+R;paC0Nu83O@+JD!{%_yG z!h*YYHg_KF4|QaFnM?T@>9(eFnCTgeXu$XoXv#10&WoP7$5D?7J$PBgi4Z?E-dmL3 zrfv!1j*h#F0)Yr!7YL2Ze*Lyn*H(1cW4BQW! zo8l^BMf&N3Juk)M&PC6QS1$eY7U?Mc-_P99*iRTkY^8;-Li+_Y?SJR6kHi{VAj)K8 zG?gz2Wr@2M{ugm)71c%@t@}`l7Pmt20>#~3iUlXQ7NWr&|;X8GK{n)ylv&u@AnZ z^d6N-o->b8tNy3O9tamggci@3Qmr;FCSV_%NZ(R|-B|*dBbcR1!;@+ig-66U@y{zY z4jIpsh)pucl=(J$YL#MM>FF;kc?5HLlkX)ZvW#tTTtDR380I)BRfqh(0HmA?9{!Z- zDL|es6L_!MC#_!6@U)4dNuM7d(Yp_=gnIokLYn>ahmzuV*oW;5;@a_sHLZ8nF;IaP z(|LoyX83o|jz%ez9uJC?Ypey`7AyQDJg3 zQ)=G(Oj5djAIfqEZ6;`EWEJ02$6A#H;_Vwo%s{IwqzeKF>F=or_}7Z?EqqumVQER- zLILORDS^vD$GEl1v#niiu7GZw6>Ig<>d0 zZ>7|W$X$0|O*_>y>Nsb^W8~ji!&20tfysW?MXXv83ru(~PyvWoC`{~h@iqHq++9uA z3h_Ae{RQa3IBI%p$6lzph6i`<~=q-bhsDyGr3p;*|Mqcs-p^o5>4gB06O4T8by!eiNpj>S)===O{r4`N)^q2T;+-*-EkJ$Y$-j14x?3HNdq{D>lV=e`9?VN?? zSdkc%!DcT=>T0IIzbLI5gtR`iIQxps@7)LwSwC!iv~yrR6)26j2DodS$GvH%xlxLf zRI^qsT7fITW_1-6LEk_ay^LfM_zu?3A=VxFaU0@ts&93rK6C$~km%6-}QmYF1^e#L_~zHe!R(+UU~MXl~UjG#(2(_UQukgQyERwuLo zV@nO&$aNoZl$)7rvH!IlTFtVzFTA41z_8|d#moo4d&Tey#X&3LKho@CE}&@q0kddh zlxOx0&K7J;4JdH>PD8n)T(_G=Hw~*CgFe3S3c2HLc}T1Jni7!u(B$x*qPP(DGnH#0 z?en6t)TOujyCHzTbC#P6$FuBnpMtb-IattAa+vYRyg7CIf#E)uL^+ zFu5iiPAkaFV~PMv2O5yM{zNEq(;bdHQ6iPDHJk7WaHXA2P?U$#X+Y>pH6wf8RPN#D z+T95S;@Oq2-|mXDS}<#mZ>f6xTU~0Fys2>u@_8UO$*Otj-Y8SL#!sl3_0D<1jE~&z zMuB3C`)wNe6q6j;^c&@ps)l9zW%)UF88Wj{VAfd~f^Mdt-x-)tL@k)?Rh@DmdeNSv zHuGy*AZ8_kVqO?qTdp0#|Wd%Bw!qNLA-E-BEiTqBIrr27DZhX{;(3FPT_iF(hb_0(&_hrfazZbG$N)@{g6+vWtZ@ z-)J+;V0M*p)2I%EjY6g)K!>S^0ZZ~!nZ#;nhVEYT<;gc{9TZwRs2>6$)fLc|H-;We z5ijd#_GrmZLx|eiGS~>W4+;7lwof^WK4`-VZSso(Z6x{1>>l4(2QoB@@Bv{;0}65MDKAj!e)@BdiStU_iO-A) zdwp&W%}L$4q`DhUQiGlnh>RVx6^W*NG4!z2d8?qE;>AjS`aNQgiSc9miGNf{-D~GB z_zP#1HJ`I=11igT`Y-1~2DuI}iJ;8rhHj;|!SuN(Ox^=7NnP@lVC3i~k!LR@9r)O! zuE||M8Z$Osh0GfyW=+j?CIY4Qu-(?F_2S7{IRhs>z#Atyg6%n{0(L~zPc z684IN`VyEjp%cU_WGz~Kuu_PDjnmUpABN${CLk=3TM5s9F^3vxECw@AS%zU8-^_A7NGef59Q2sTqf-%5RkjT#azAvbqnQD4;=|F6vCnrRK~6MHc+*| z$Xwa4rYwOMI5Xg7;!_W-g+KvGrU^8uV}Hl^&AYsY7j36VS1e)zRfpA#Gnxmr3KJmfUZut zhSG-6)NjUN{LdMJYVA4wk(i%Z-8~MijngvhmKOfSBxM$vq5mrVR6D!3O<81A{<^Fe zwNNw!WW6ug2jQe$Q71KlZ zxKx>5B5ixRqTfW(gamaxg0rUi_Y7@n)0kpL%V8;qcvR(0&k9FTS9W#A4r#t%Zm@k$ zZ!JF#X=>ijctQQ`bp@l=M6NBeB+lCb>)yG9HV|=10F^@Sdna;%a_6$W_pEHh451e%W|Wg z@iD6;fjL*cD8Esp9%%otHaV;&a2Qq-#BLs4GdS?*yaKOH6^mIaBUjS?k?|1^Qk0wv zWeh-InYQxX-hSI=RAjpjxt71wT+T?ZfBG7q<1&U!YMFtN@i<0A!9h(YfhKd{ zn0U;69U^q|W~i^A+m7n1LdvjcDZ3ZNZ@u6a669RHo2)5E-iPWhi74sW)G)S}hUl}5 zED?GE=2Ul`F6;ZzqERm#oIj+AmchA|OUumdGn~|JY6W4{sxtRq-`PCJAF*pCzq8bD z;B6G@7?Gk?S_>}q-C>3M`z`r$STkU7)0$R(i-RA0-#8yeENyQd;(IYjEI5$w@*U-W zIDnESzJBb7;hb_5Z0M0yH4!@Kib{PlDw9Ys8hRax_V^Np^%v0BCh2Kx_T^(haVjlr zoM)A2jYt!!>E?)Bz&k1i0UiS-eoa43-FMr3s&vPi;|iQps-18|8Rfpm0gwQYz5&Fq zn3vrWkA_x+_M?xswljwoYh$rn$Zp;IN4pBCs*W9WYlIfg2*77ilB89SB-Q0bi`QBU ziukCHjd*}A#F=*MNIU&KVh+CXACc1MpM;G5G2qS|xrkJVmwh@}rgoXT((6|AUHUAs zRen(Cm-2vgwNd`(Iqo{{a`&ogeeArg^`Ib?V1xjb$Aa-t_v;jjuaM-GZMR~olIr-h zGOr-hm->uV*ZJFGsT(H$Ab zUbSdQc&?|+D*gpHSPH_D5JWYF@2x*cYiQBsODu-}C)3mazI}Lu9FKczm)u!e&sMWf zG~`V(?nlCD?iK{v7RIQ7IjSBVXDg#*Id|V(#A7TAlXhjB=*#NtDI?NQ7AcQO=1DB4 z^hk-}M*;AnSDS?4lL_juRd%1x4kSwHuc~8?XeL#1FNcc0&k~wd+u?2=jTxHZq*Dtd zIG?A|ZlDJ7M=IJmJIo{#xrPE5$!Kyz!crWQ51L;!?o6Pd8Ws^(#sgAE+chY z#%3y7T1G&KLATjvH;pYcS9HO5;T4YkN~|DIwi~d+=bLdFkGK6TQ)$)ASRV_TGtpMVe;pv`hm@W#|L(83aN)@trx1Cf*(cu4{tl-uT_f50jiv7gxI4rLr`X-#yURJRu~ zXSgN+rQB)KLS41Jdq>EJr*y~5xakxcDu-7v-Z2~;Ovz*~9-GKRy>wE7ufoXsrWE%R zVLJB3D~id*!Q}yodfhe&J2$Ipu^+&i=KkdChWr+A`eN<2*lY+KEuUiktEVU&_Rd;WW=?``LwTdq((NnGH~%z2>X(Y3|uv z*JbHxgcbA!Z?3(z*YN z#X@1mVMfv4;~~HpTG>Nmnv6F?A23YQSzCO9k{v=$AR{7a!7`r2&}80rK(4Lht`J2D z2Wr1liIpe~m@TU`nfv3ae&PwFhSN3Ft!5_44`-(|bZPHKLSmsfKR=2-w8<&YZVyE@ ztU4(90MNfktwd*LhW>%}+dpenXXXj;76k!d!kxnGC!*oEQgm~_6N0?FdiVBLpp7EM z-x$Zq-`&w$%8~${NsvKaW99_*C+rpIj@h~Gc|D9V`a9lhimqbn`CbBlZKgm)H!rzb z(=K}Z?E=dsX0S_7&*qTK-66Om*^ih-@2fo9=5n^3r*_XwBH%RPPnE z4AlMtl;HV-XJ3QiGzp9HF9T=C6hGI$yi~oI=3L+`=u?o>qMoy}gh*W1vt48nmw<5B z&w9yoLeT(5coj1Eb<1P_ptk?X8E(_6Sk~^Ma72()5Z1RJ<<-W9QgR8Wzeh)5_6eYH zQsD;jA{rwYdotr5g(e8{E;YqpDHW31;c?R?1h}M3P)X12>?tB@;a*SPjq75yr@N*tc_b ziXt_TMv`VlkXvcuzyFpM@94Hz^s`yx08Tb5wGxYS{4jT_NS_LaSsI3rs;O~Lcd#cY zYO-2Dx=XK}N^wqCg0htb<1AV6EOlSpX(&jkUMO21o090ixXb8?M&ABRVT^x*|5NBz z8Mw}@vQGuml`~keR-7l-PnT^Ndw;Cy_%e@vJ8@KK!#`P&EXkS$je2=fFaMJ&^y%8N zAgy|Iyi*gdP0Gt#Sw70nW(~%P%tt|aweMHt8uno zAw#1-C`+Ttg^6-4V>+q*Ago{>^L$wvQHqZkU64`wC1%}jOK;6^`rt8QH7(GrYEI7y zpGr=yHPrUB!k*&tqNh;D)uemhbLIhK$Px)?+7ee{a>8ZYW(4@D0Da1B=4-w7-~E8h zPIWU;;LzHmg9qTiUQAIhe0_3os*~^L9w{Yo#d!kh)LDEAg{HSL^zq`o zt7P6UHKzJ%Ys3|I6%O#{uzOY2E?3t&i?AY;n+W}=#38&7w*v%615kg zZ%t1f3$0?M^W_syjV21I4H=scIf)E|M|O64){MfvqpJ+L#C6)0Y49=Q$7f5v*)dYh z4Lc{l&X;$kA4z|WPz1l=w*}87h)Fh7<-Tb;6D(yCq-#`}hno&5ceJi&+VPx~XeA(Q zx)o(K!z=LQmqiEq!&{(AD=-x`9jyg%O?K7_x~5tDDil*pk?v_PRPPbuGg;_`LRO1o z)sGxXlD_*5GJN{rP^_{-W;qSTx3?sgiKlOy363dx)@S|qQ}lBZ>9l?ye<_< z1bXNQd;Nt(@hKAS&JgyU(?nij6eZUm|YBkQ-4f&(q-xje=opNaCE;O z1}V~~ZV@v&uu~WW65aG>GaZ}Tow|wEcMSHvOfwK5`5uQOO+oI^K+D#i;6dj5qD9GI zG5;2=Ta*J20`Q9Kel;Q}hUZIBfHa-!S}XPBlPEnhFRUQG!zg^F1*~lFy*yIE-7PiOcJ3vS~#mZOaj%tg&Xy}X7`hMGihuV7R+Dsv&lWh(V| zOJW7#Hv;VZj=qp?D|~c_LdsVh8Pt?aCIJfepF-4t9}=$NZ;2D1{$C&l9*hWct*Omn zI!TtF%D<`M0%^U9TPtWdX!k8Ubi@1%g4+2~l8bw0pGv(rw~m9rj8QEpYy7-^Dzr_o ztl+sJ{SLTwwIJ*}0cJ1r`vfRG0e`S726u(XUx4wFmoJ=G<&nLNm{8uBg?u?3KZ!#% zSj;#;On=?)y_(i>G;JZAz12JrZg!?YfUo=l$>F(*oVg)&wr=MJZrXvurBNzYGOGM+ z#!-YK($OvPGyV{`zfC;rqy7mRAuLDHI}L64bTxG3QL1*1q6FcE6nK*k4 z4*?8DnONg7X^pwGP$~R_s>z*&=ltna@c^u>6i^_giQE`o=vZ$L9YnZ0iNjt3#P(&_sg=tk4FbN(a7NU z03Tl?i7uBqWw+I9E=I&La-FQ4T<>fPK91eQu&71$c`(?2lYz$DQGV>BuX^*q zaiW#k&V;};J1i#YSqi_?TqVg+*_B`iO5B-5DlTq2*)#(BYq|!X^H5ovUKS`H;A?5h zF8VBt39Vn$+mh>7P|8HT)^V!l5Fz|kGsnn?Z}c9^-gsYd)bJDuKC^h*zP3^B9?~No z@9&f)9P1qD@Vh(?o$hN zhQx)tpIxnJ=AsI2(K#>1;^XTV2b5?I?yYu8*wPr1z zbD?ElW_EV7LI~0rNP(|lkaTX4{FU%+Z^)mJEnU`45!*GDWHjXEJp_)?*h_KhH^qI> zyg9#a@OXpRK{;p0da1KEf$nWXzGI>9BR9$Tqu;!zNBz{dey`WtAGZDix`qbsr$7JM zD%qpDF+Y^(e+)`W_FqVFUkv104CJP|UnqXG`8_n1q9%`f^1j`iBR9&XftRnb}dFEFbmNf z(*f`7_Wb{l{x)1&({>{awOU^5Kek)tN?Qx6;~eN146@LZld#uhYdF_Wg-Z#b&*BuF z=}dSB;O~yGR58&`zAa7i>%vKNRGUAi>jck1HQk3Leh&`9OAXImSr`Q@bza4}zIx+} z9q|`{ez6n}v}*=puE%+@7;WF%UK*K3Fp9XPHUx|Hoh2qN9T6j9eoIU7Sb{xrk=mw_GFo@p)q=-IG!j|8vngH`8eXvnC z4lk|D^4+YbQyTF=D$P^aU`+laGzmIbskApiH zhShJ)kgm;cRxQ+$oB9>7E{@NY5nYcx3^2+l<C$5uc^Z1hnu&!0~}Nv3nv|ZaAjDO^#=Bl>x4j_96OBB zqR=-9{oYWF3f?WbxZ#$s%rr%0q&x~LkgOTQm=#l(*xuoIDsP%JC~tZuXvRAWm5)|& zGdU}yG2&XE91Nzop|I4y+8|Sf^QW7uD>Llzs!Z-^R1__Dw!a;V7Pe5Q6sAYE)vZ&u zSm(Zv`1q z-g4ts8fbaLRyWkTm5d{JfZ=@U>Bl5L`!HFC&1GqM*IER52FZ_{nsuRd*d(KhfV5T!w{g*WWcd#&yUXI$sxxu)Pl?!YLv%Hiin1m02 z{kc#_*Zh{Xi2%sRbw^k&Z)}9v57SBRB`k`B2Ss3~>{AH(QD<8`<>=h{dUsP5!$j72##){+z zlUN8hkH7D%c>Q+WIZ6bcUy8zsB@|vt7y@Ocu{saQ&Gp0bWucI5WY#*@Iwmfged-AI zWVTxfuDwVrO=t||tsfDM9$5N#^MKNUu#BkWfsiCsslso+73IaeNy9K0I_||FMebBJ z6H@=g%ECv#t>9*}aWJal}x5PhII*}8Q3lh!jBTeq%~bM_Z-$~hY6KQ)Z| z=RXR0$yfFLe*vvW_f?yv+7kc!z+YF&pPoyoMQxX&X3$I#?9ETtus>|#1EXKg|I9vR zeyO;5P#t7yKNj0cjUfJzutGe4Li6 zrwt@{U;{0|la(P9*LxT72|PW(DwSzPt%HZ9qv6Ud1>L3_2l{wxDdY}fgyfw{f*|D> z=0bOR`)coW^2eYx3--Os6t-yYtz~p1COvwkdS@{Y;pN(cO4gjptkp8jC0aS#^eGLg z(-gZaej^J9`^?TWrDFB>%(rFZ;`Ze8;V8(fn!W2GThnRoRTEdS-9}hn3!cnM?JJ0D zKMl5UM&5}gN8X(WgZ3Q6L!`e0hsI=-l?8(-!hkqY_t(1?thr zHO1ee@2SunfjtWm#^0in9`pwkoLzE1lAVL-)}^;6CZ`C&Ggf&PWd|wTOpnnI#nQ7x zL_{DW0J(i1>0Y5bve>&G>7O&GYoDANPX-TR{&I^%_W{1D?5Kw@*@XGQch@Y1*u8=% z!EFNd6iNPi&3`h+=R^zmA+F|C-r3B=^CeZn5+toUj1HXDrTQU#0*85t)XzQYlcqPc zhn7))0smPWt_YY#Z}+i!2(HYlhguj^t|^ZFYfqVepQWj65JzdT3Nu`1mtazPaQ;G7*lzuA(F zTX?KyBs@=C>YqAs7l4m@e=v_|t)Pnfe)qoX%kUqgo{fgP)|&0s53E~+e*scOcP^iN zr`tsX&5!-qTLX-@%IKqFZ*e|#j*duLbRWwr<@v7Z_zI66dn(sjDt*?=!&HUD z(UR$Rln+h&Xb!&Q+PZv02zpBKrq{wK4_t{|N~L2}WPuJ2CRG$-WKpCTiB)th{zFk= zx1V&{5*P#)-1daJt?9JKj7^G;u6XIFGMM-~oH_uJF*L{kmTr=IpVtXHvw8SFQ_=U-N06J%~*{Uc?ed}z_vHyB7Q@M#`VutBI{ z6%-Yo*3s}G%U^^XON6(aMHEishW3S7>#Nb@m*|wgfXT*_fsCkJ@y?HWjtNR|C9H8i z3LG{SzG8lX(y(xZ>%F(Ug4Ri%lO9A@S|{T)VaIiHLy--p_-=1m-`&0UYKT$RnoQfU zfWzmY6Jv+Q*;MVOHJyF*|5qwk99%fr`0+*?3hwuvaC^~dR0La9t?LZGFn#ho8WNc1 zFE0<8-bu*m-yEDA{-93pKDW4g<2jHQTO;9IBC4A4NqZu)fXPKBN^cQcaXp?QWL>>X zf;jg1-A0=1jfKnTieW#kA4z@nUI@Z71^IUgwPL9@1IKt`@goY)+@^~4qHbzkl_Sg_ zIVIG;_gY>s=Jwfew>2xdMCtzhS38_E&uDqP7a_u$$XV2hWV%i{@2iw z*GT|X+i2kRFC4hy3Z#bx|I$w1CbdPG1#dwL(~8t-HC)nhL_TNnFQ2n7W!M0V+Y=ao zeStz~%!oLWgqG+3GU@D6!u}49pU7+=$S`hf;g+O&8JUx&tn|Tjm8-Cs000WvQ`n6@ zMGITv+gEKlncbA8Pk}FK98+i_pMVI|9cI1A^KMahX1h!519@T0n6sQE^0Ac%g7uwT zMtHs47LG6CQhQ$ywK;S%pq4HzTsKV^dPBQt(+tPLQ^DIh$nLy&L@$81YdYk!E2T=n zX>EJybbD;i*%P)l&ysxCGzbn!zRw|5Eajj=+p_T_f$Id%>Q~)E?IuP|vLWqcjA1Te zE8EQIgh^}F4Nn#w3N6ZVO*?eMS0}#B?DJj(c&jpL@}s1nE;V`iC)2df&gGU<6N{}&UlVvUDS~d0+UF4l+j$E2VjNtBy z5=RWb43(!}jZ->`aTi#~+S~r|bs&YMjVkR|KamwJ4b=}m+knvCxCpT=vW(vamORHR zCV`)um|#j+ZS~3E1_%WGIxPA=pG_b6lkHs36Jn|f#3ISJbc8vHWhwSllVmDH!O)ZT zsV&UqeodlFnQt+$x~auD%ZbEr;Kjtm%-Gb~uzM%Bvq2JL;gR`iWwV?PPR&FCZ%v+d za%E)%F+QG?tP~n%T<_Jfx+$lU=eS%o@R3e64|g0k!=_6P3aTt7AdH}=9Gm;XeY8CM zc}khi)a03YprJc)T$eA==+MyDZR*geD4oC2uz0nyOxx-K9tLtYqZfh(0yzYf8X)q0 zm}|mo={xjQDOs91UnSM@&99vWW!@Wz-QHm?pMgKG+r-QZe{s^u*PhqzYmtY>aV(Np zAUvm4hgph;^8+su%4fNxNivHSvyW+{u!mKl)Xam_gVi`R+7}~{UVi~H(VNZ*h|20V z<16NtoE9T~4|b+(*{_WFEHb*YsL=3+;s#80C)r%0atMe{?RP}~T1U6{^a8U-^3TR@ zeJ2E!{ZQEs&6`ty+CM`%lLM=7R<$c3tb<>U;4wQigKc#-1N|Si;!Th)ZlYi1K z^ZmP7SQwK99-dBH59$+D6zK+bhIL1j?qM2#uwv0D3u!2N-sy3&LO$JP>d%P_LuXB9 zQ@99|lhrPY+&3IaGJsd#PGoRhBv>{}*5deU6oM$rlluQ*YQ+ zD|+Sh5#hm>TneW*3&k10-=HS*1sX7WjE#;r^)u7Mum$i^Qd5Hk$RR;O*H!BUp%V7{ z7X!8jnURut*}eh^8xL{IrfU?dx7~Gm5ILdj2-m9wP}Pz%AixC3;jV-hjHJ4=i^@gqeN+}~4-k*WLk0h0E%MnWZZ z1teQ-K3=2v!|NaP)Fe+*Nqg)C$~hf85_%5U{purYTwA_X^E|AUy;ZXQ_TobZi=s?0 zDeY$&?v`C-VbM@`Laf~^yx%3Cj<2WGjqoG=^v4RW@O<(6FiWX?Xx4o#uPRv{+Kl`Z zd!HB|fkRbG6?18rU6XJ86+UptXlv8}HE4(`s9&Iqem`$R`?$g?doW)@{fCnC8W>9# z$N2h2y%&~L=*;P_un8ljZl2we%`EGDSDM5z-(Eu@xI!KNA=Nr9#Qnf2My(`mT3Vge z(^-9AGye18h1~1m4}l=bu$1dsxgWw$nsOIQTiQwA|CN(CPE$`1juB+k=K|avAC9A+ zNS?!pOKH*PRrG)VPjlt}ef!O4a;@lbtN4&#(QABl4M;Y=u5#p7~$gBqk<7rCZdtGWPQ()~TF@RhDLa%Na!hc0tfr7XKPJy*dQ6J1pcm^wsizcuV1$3qjpGtB!7C~@fNH&!XP zR91dsF;^p8egr-5Uih%S4X+HyA%CG>dTlEX)nVLRXnWW^@2(^e@^DcA# zU<9=+SNjZUtuZ{-UwM2wEtAY<{h7g4QbMeuJMfciA)+{CewB|>N3o4=%@qu-jWnPV zrZq!<={AO29T0PC$@N^XoMk@h3)MEZ>szRK1)qSkB0Se$Wzr=6h*@z1U2>3N$X|1F zdQLUWx~bu1=>f<@^MVh_RvDHw@~XR~YSwCJ4+a`+HN@bA7+QYU6lo!0xn?d~
> z7UIcSe*tC0xPMlbcMb2IbUcYwUj%zAmY!Oh>9sK^y5QB*EU#5a_-H-I$nm-7{3>-r zKm7D|-NH{EM@n*-!r2XD!kd)bg5sX^XKI7Es4qe0B$k@#Y12K0lP%*<`T>!oen-=R2$``Zf{2X8 zy@Y|eRp8-%B$OmBQ^c&4>QyAk70IwaS2I}G7IaVl9Uw>_EEt_O7ob?fuJgv~spgG= zBC4tCEvQwS-`yvzN+uS#Oc+m3k(-I&Pjt>b7gPlFg?0@+YH-|Mawt%^BH7UA1KzEx z@GYjyiyX*DvBn&nWu&^vBsvzRn!EcmwbJLfslCfje3I`3JIM*&sH3$f4bK;IklP&O zx`B0@XTz0s_h;a&YLjXLyf?b{Sl=nizbPWW#Pp7{eUyOT<#P8t5XpU7jSQ5AHzf#I zr;ktxLWA(U`1`12eUrvG(1mWSR!mHlb0+1C$bfiw(j+vIq!C~75}XHy|JztQbY~Do z04a)U`3q3lQU5N2S#QWm^=^$_H^1rs z9(()aZbttvps4PdrTFW^_Afbq5C0$4pS~^qfojq%Nlwr`nf<8^c;BFYi1thUR7Jha zT0hSYbcKB)J>;I28J^mzy+{iN*;HO{Xs2Y9V_UK z<$cL1v%B$+Oe6^2-DzMWHe3Vr( zDT@1gDM0(N&+E(A!^R%X;Dq|mzmbcc^@N6X**n-#j?*RuG*!CAW#Js=4!*-g+bG2t zESkb&iO=_&j0jK@c6(;R#v|I*ZEX2dIMBVlcMCrz1Gsm;4)s;F!ZdF)tMXi3dMN^> zsd@p#!af5Ewh#HUE|9fkr&G+aWtO(E0FlC&Nm#~uBS9#!DGvVJORRKiUKEiCvt@(C zwFla*FP2a=>w98KW1YDydn#7a$D`6TT9QVVdQ4J%{ba=!9?xgE?M<4yhScY|Vg7-< z0sOC4sCRl+D6u&?!BT?5T;Xp=2i?PI(ajUl>7VfX0FN~#nKoiq?

t+$yZ!4&b39 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 {3V%e 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

;*=Rn^ZHX2ZK`Cx8LWWr_ET>D( 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
I8kjDbbj7RtIVc#1V(_x-lhQHA%8xiVu`9;>;iC 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 O{J}T=I=z6uP5l?q@e(Qk literal 0 HcmV?d00001 diff --git a/gerbmerge/__init__.py b/gerbmerge/__init__.py new file mode 100644 index 0000000..9097b9a --- /dev/null +++ b/gerbmerge/__init__.py @@ -0,0 +1 @@ +# Placeholder for GerbMerge package diff --git a/gerbmerge/amacro.py b/gerbmerge/amacro.py new file mode 100644 index 0000000..79f228d --- /dev/null +++ b/gerbmerge/amacro.py @@ -0,0 +1,348 @@ +#!/usr/bin/env python +""" +Define and manage aperture macros (%AM command). Currently, +only macros without replaceable parameters (e.g., $1, $2, etc.) +are supported. + +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import sys +import re +import string +import copy + +import config + +_macro_pat = re.compile(r'^%AM([^*]+)\*$') + +# This list stores the expected types of parameters for each primitive type +# (e.g., outline, line, circle, polygon, etc.). None is used for undefined +# primitives. Each entry corresponds to the defined primitive code, and +# comprises a tuple of conversion functions (i.e., built-in int() and float() +# functions) that apply to all parameters AFTER the primitive code. For example, +# code 1 (circle) may be instantiated as: +# 1,1,0.025,0.0,0.0 +# (the parameters are code, exposure type, diameter, X center, Y center). +# After the integer code, we expect an int for exposure type, then floats +# for the remaining three parameters. Thus, the entry for code 1 is +# (int, float, float, float). +PrimitiveParmTypes = ( + None, # Code 0 -- undefined + (int, float, float, float), # Code 1 -- circle + (int, float, float, float, float, float, float), # Code 2 -- line (vector) + None, # Code 3 -- end-of-file for .DES files + (int, int, float, float, float, float, float), # Code 4 -- outline...takes any number of additional floats + (int, int, float, float, float, float), # Code 5 -- regular polygon + (float, float, float, float, float, int, float, float, float), # Code 6 -- moire + (float, float, float, float, float, float), # Code 7 -- thermal + None, # Code 8 -- undefined + None, # Code 9 -- undefined + None, # Code 10 -- undefined + None, # Code 11 -- undefined + None, # Code 12 -- undefined + None, # Code 13 -- undefined + None, # Code 14 -- undefined + None, # Code 15 -- undefined + None, # Code 16 -- undefined + None, # Code 17 -- undefined + None, # Code 18 -- undefined + None, # Code 19 -- undefined + (int, float, float, float, float, float), # Code 20 -- line (vector)...alias for code 2 + (int, float, float, float, float, float), # Code 21 -- line (center) + (int, float, float, float, float, float) # Code 22 -- line (lower-left) +) + +def rotatexy(x,y): + # Rotate point (x,y) counterclockwise 90 degrees about the origin + return (-y,x) + +def rotatexypair(L, ix): + # Rotate list items L[ix],L[ix+1] by 90 degrees + L[ix],L[ix+1] = rotatexy(L[ix],L[ix+1]) + +def swapxypair(L, ix): + # Swap two list elements + L[ix],L[ix+1] = L[ix+1],L[ix] + +def rotatetheta(th): + # Increase angle th in degrees by +90 degrees (counterclockwise). + # Handle modulo 360 issues + th += 90 + if th >= 360: + th -= 360 + return th + +def rotatethelem(L, ix): + # Increase angle th by +90 degrees for a list element + L[ix] = rotatetheta(L[ix]) + +class ApertureMacroPrimitive: + def __init__(self, code=-1, fields=None): + self.code = code + self.parms = [] + if fields is not None: + self.setFromFields(code, fields) + + def setFromFields(self, code, fields): + # code is an integer describing the primitive type, and fields is + # a list of STRINGS for each parameter + self.code = code + + # valids will be one of the PrimitiveParmTypes tuples above. Some are + # None to indicate illegal codes. We also set valids to None to indicate + # the macro primitive code is outside the range of known types. + try: + valids = PrimitiveParmTypes[code] + except: + valids = None + + if valids is None: + raise RuntimeError, 'Undefined aperture macro primitive code %d' % code + + # We expect exactly the number of fields required, except for macro + # type 4 which is an outline and has a variable number of points. + # For outlines, the second parameter indicates the number of points, + # each of which has an (X,Y) co-ordinate. Thus, we expect an Outline + # specification to have 1+1+2*N+1=3+2N fields: + # - first field is exposure + # - second field is number of points + # - 2*N fields for X,Y points + # - last field is rotation + if self.code==4: + if len(fields) < 2: + raise RuntimeError, 'Outline macro primitive has way too few fields' + + try: + N = int(fields[1]) + except: + raise RuntimeError, 'Outline macro primitive has non-integer number of points' + + if len(fields) != (3+2*N): + raise RuntimeError, 'Outline macro primitive has %d fields...expecting %d fields' % (len(fields), 3+2*N) + else: + if len(fields) != len(valids): + raise RuntimeError, 'Macro primitive has %d fields...expecting %d fields' % (len(fields), len(valids)) + + # Convert each parameter on the input line to an entry in the self.parms + # list, using either int() or float() conversion. + for parmix in range(len(fields)): + try: + converter = valids[parmix] + except: + converter = float # To handle variable number of points in Outline type + + try: + self.parms.append(converter(fields[parmix])) + except: + raise RuntimeError, 'Aperture macro primitive parameter %d has incorrect type' % (parmix+1) + + def setFromLine(self, line): + # Account for DOS line endings and get rid of line ending and '*' at the end + line = line.replace('\x0D', '') + line = line.rstrip() + line = line.rstrip('*') + + fields = line.split(',') + + try: + try: + code = int(fields[0]) + except: + raise RuntimeError, 'Illegal aperture macro primitive code "%s"' % fields[0] + self.setFromFields(code, fields[1:]) + except: + print '='*20 + print "==> ", line + print '='*20 + raise + + def rotate(self): + if self.code == 1: # Circle: nothing to do + pass + elif self.code in (2,20): # Line (vector): fields (2,3) and (4,5) must be rotated, no need to + # rotate field 6 + rotatexypair(self.parms, 2) + rotatexypair(self.parms, 4) + elif self.code == 21: # Line (center): fields (3,4) must be rotated, and field 5 incremented by +90 + rotatexypair(self.parms, 3) + rotatethelem(self.parms, 5) + elif self.code == 22: # Line (lower-left): fields (3,4) must be rotated, and field 5 incremented by +90 + rotatexypair(self.parms, 3) + rotatethelem(self.parms, 5) + elif self.code == 4: # Outline: fields (2,3), (4,5), etc. must be rotated, the last field need not be incremented + ix = 2 + for pts in range(self.parms[1]): # parms[1] is the number of points + rotatexypair(self.parms, ix) + ix += 2 + #rotatethelem(self.parms, ix) + elif self.code == 5: # Polygon: fields (2,3) must be rotated, and field 5 incremented by +90 + rotatexypair(self.parms, 2) + rotatethelem(self.parms, 5) + elif self.code == 6: # Moire: fields (0,1) must be rotated, and field 8 incremented by +90 + rotatexypair(self.parms, 0) + rotatethelem(self.parms, 8) + elif self.code == 7: # Thermal: fields (0,1) must be rotated, and field 5 incremented by +90 + rotatexypair(self.parms, 0) + rotatethelem(self.parms, 5) + + def __str__(self): + # Construct a string with ints as ints and floats as floats + s = '%d' % self.code + for parmix in range(len(self.parms)): + valids = PrimitiveParmTypes[self.code] + + format = ',%f' + try: + if valids[parmix] is int: + format = ',%d' + except: + pass # '%f' is OK for Outline extra points + + s += format % self.parms[parmix] + + return s + + def writeDef(self, fid): + fid.write('%s*\n' % str(self)) + +class ApertureMacro: + def __init__(self, name): + self.name = name + self.prim = [] + + def add(self, prim): + self.prim.append(prim) + + def rotate(self): + for prim in self.prim: + prim.rotate() + + def rotated(self): + # Return copy of ourselves, rotated. Replace 'R' as the first letter of the + # macro name. We don't append because we like to be able to count the + # number of aperture macros by stripping off the leading character. + M = copy.deepcopy(self) + M.rotate() + M.name = 'R'+M.name[1:] + return M + + def dump(self, fid=sys.stdout): + fid.write(str(self)) + + def __str__(self): + s = '%s:\n' % self.name + s += self.hash() + return s + + def hash(self): + s = '' + for prim in self.prim: + s += ' '+str(prim)+'\n' + return s + + def writeDef(self, fid): + fid.write('%%AM%s*\n' % self.name) + for prim in self.prim: + prim.writeDef(fid) + fid.write('%\n') + +def parseApertureMacro(s, fid): + match = _macro_pat.match(s) + if match: + name = match.group(1) + + M = ApertureMacro(name) + + for line in fid: + if line[0]=='%': + return M + + P = ApertureMacroPrimitive() + P.setFromLine(line) + + M.add(P) + else: + raise RuntimeError, "Premature end-of-file while parsing aperture macro" + else: + return None + +# This function adds the new aperture macro AM to the global aperture macro +# table. The return value is the modified macro (name modified to be its global +# name). macro. +def addToApertureMacroTable(AM): + GAMT = config.GAMT + + # Must sort keys by integer value, not string since 99 comes before 100 + # as an integer but not a string. + keys = map(int, map(lambda K: K[1:], GAMT.keys())) + keys.sort() + + if len(keys): + lastCode = keys[-1] + else: + lastCode = 0 + + mcode = 'M%d' % (lastCode+1) + AM.name = mcode + GAMT[mcode] = AM + + return AM + +if __name__=="__main__": + # Create a funky aperture macro with all the fixins, and make sure + # it rotates properly. + M = ApertureMacro('TEST') + + # X and Y axes + M.add(ApertureMacroPrimitive(2, ('1', '0.0025', '0.0', '-0.1', '0.0', '0.1', '0.0'))) + M.add(ApertureMacroPrimitive(2, ('1', '0.0025', '0.0', '-0.1', '0.0', '0.1', '90.0'))) + + # A circle in the top-right quadrant, touching the axes + M.add(ApertureMacroPrimitive(1, ('1', '0.02', '0.01', '0.01'))) + # A line of slope -1 centered on the above circle, of thickness 5mil, length 0.05 + M.add(ApertureMacroPrimitive(2, ('1', '0.005', '0.0', '0.02', '0.02', '0.0', '0.0'))) + # A narrow vertical rectangle centered on the circle of width 2.5mil + M.add(ApertureMacroPrimitive(21, ('1', '0.0025', '0.03', '0.01', '0.01', '0.0'))) + # A 45-degree line in the third quadrant, not quite touching the origin + M.add(ApertureMacroPrimitive(22, ('1', '0.02', '0.01', '-0.03', '-0.03', '45'))) + # A right triangle in the second quadrant + M.add(ApertureMacroPrimitive(4, ('1', '4', '-0.03', '0.01', '-0.03', '0.03', '-0.01', '0.01', '-0.03', '0.01', '0.0'))) + # A pentagon in the fourth quadrant, rotated by 15 degrees + M.add(ApertureMacroPrimitive(5, ('1', '5', '0.03', '-0.03', '0.02', '15'))) + # A moire in the first quadrant, beyond the circle, with 2 annuli + M.add(ApertureMacroPrimitive(6, ('0.07', '0.07', '0.04', '0.005', '0.01', '2', '0.005', '0.04', '0.0'))) + # A thermal in the second quadrant, beyond the right triangle + M.add(ApertureMacroPrimitive(7, ('-0.07', '0.07', '0.03', '0.02', '0.005', '15'))) + + MR = M.rotated() + + # Generate the Gerber so we can view it + fid = file('amacro.ger', 'wt') + print >> fid, \ +"""G75* +G70* +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*%""" + M.writeDef(fid) + MR.writeDef(fid) + print >> fid, \ +"""%ADD10TEST*% +%ADD11TESTR*% +D10* +X010000Y010000D03* +D11* +X015000Y010000D03* +M02*""" + fid.close() + + print M + print MR diff --git a/gerbmerge/aptable.py b/gerbmerge/aptable.py new file mode 100644 index 0000000..daacd8c --- /dev/null +++ b/gerbmerge/aptable.py @@ -0,0 +1,335 @@ +#!/usr/bin/env python +""" +Manage apertures, read aperture table, etc. + +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import sys +import re +import string + +import config +import amacro +import util + +# Recognized apertures and re pattern that matches its definition Thermals and +# annuli are generated using macros (see the eagle.def file) but only on inner +# layers. Octagons are also generated as macros (%AMOC8) but we handle these +# specially as the Eagle macro uses a replaceable macro parameter ($1) and +# GerbMerge doesn't handle these yet...only fixed macros (no parameters) are +# currently supported. +Apertures = ( + ('Rectangle', re.compile(r'^%AD(D\d+)R,([^X]+)X([^*]+)\*%$'), '%%AD%sR,%.5fX%.5f*%%\n'), + ('Circle', re.compile(r'^%AD(D\d+)C,([^*]+)\*%$'), '%%AD%sC,%.5f*%%\n'), + ('Oval', re.compile(r'^%AD(D\d+)O,([^X]+)X([^*]+)\*%$'), '%%AD%sO,%.5fX%.5f*%%\n'), + ('Octagon', re.compile(r'^%AD(D\d+)OC8,([^*]+)\*%$'), '%%AD%sOC8,%.5f*%%\n'), # Specific to Eagle + ('Macro', re.compile(r'^%AD(D\d+)([^*]+)\*%$'), '%%AD%s%s*%%\n') + ) + +# This loop defines names in this module like 'Rectangle', +# which are element 0 of the Apertures list above. So code +# will be like: +# import aptable +# A = aptable.Aperture(aptable.Rectangle, ......) + +for ap in Apertures: + globals()[ap[0]] = ap + +class Aperture: + def __init__(self, aptype, code, dimx, dimy=None): + assert aptype in Apertures + self.apname, self.pat, self.format = aptype + self.code = code + self.dimx = dimx # Macro name for Macro apertures + self.dimy = dimy # None for Macro apertures + + if self.apname in ('Circle', 'Octagon', 'Macro'): + assert (dimy is None) + + def isRectangle(self): + return self.apname == 'Rectangle' + + def rectangleAsRect(self, X, Y): + """Return a 4-tuple (minx,miny,maxx,maxy) describing the area covered by + this Rectangle aperture when flashed at center co-ordinates (X,Y)""" + dx = util.in2gerb(self.dimx) + dy = util.in2gerb(self.dimy) + + if dx & 1: # Odd-sized: X extents are (dx+1)/2 on the left and (dx-1)/2 on the right + xm = (dx+1)/2 + xp = xm-1 + else: # Even-sized: X extents are X-dx/2 and X+dx/2 + xm = xp = dx/2 + + if dy & 1: # Odd-sized: Y extents are (dy+1)/2 below and (dy-1)/2 above + ym = (dy+1)/2 + yp = ym-1 + else: # Even-sized: Y extents are Y-dy/2 and Y+dy/2 + ym = yp = dy/2 + + return (X-xm, Y-ym, X+xp, Y+yp) + + def getAdjusted(self, minimum): + """ + Adjust aperture properties to conform to minimum feature dimensions + Return new aperture if required, else return False + """ + dimx = dimy = None + + # Check for X and Y dimensions less than minimum + if (self.dimx != None) and (self.dimx < minimum): + dimx = minimum + if (self.dimy != None) and (self.dimx < minimum): + dimy = minimum + + # Return new aperture if needed + if (dimx != None) or (dimy != None): + if dimx==None: dimx=self.dimx + if dimy==None: dimy=self.dimy + return Aperture( (self.apname, self.pat, self.format), self.code, dimx, dimy ) + else: + return False ## no new aperture needs to be created + + def rotate(self, RevGAMT): + if self.apname in ('Macro',): + # Construct a rotated macro, see if it's in the GAMT, and set self.dimx + # to its name if so. If not, add the rotated macro to the GAMT and set + # self.dimx to the new name. Recall that GAMT maps name to macro + # (e.g., GAMT['M9'] = ApertureMacro(...)) while RevGAMT maps hash to + # macro name (e.g., RevGAMT[hash] = 'M9') + AMR = config.GAMT[self.dimx].rotated() + hash = AMR.hash() + try: + self.dimx = RevGAMT[hash] + except KeyError: + AMR = amacro.addToApertureMacroTable(AMR) # adds to GAMT and modifies name to global name + self.dimx = RevGAMT[hash] = AMR.name + + elif self.dimy is not None: # Rectangles and Ovals have a dimy setting and need to be rotated + t = self.dimx + self.dimx = self.dimy + self.dimy = t + + def rotated(self, RevGAMT): + # deepcopy doesn't work on re patterns for some reason so we copy ourselves manually + APR = Aperture((self.apname, self.pat, self.format), self.code, self.dimx, self.dimy) + APR.rotate(RevGAMT) + return APR + + def dump(self, fid=sys.stdout): + fid.write(str(self)) + + def __str__(self): + return '%s: %s' % (self.code, self.hash()) + #if 0: + # if self.dimy: + # return ('%s: %s (%.4f x %.4f)' % (self.code, self.apname, self.dimx, self.dimy)) + # else: + # if self.apname in ('Macro'): + # return ('%s: %s (%s)' % (self.code, self.apname, self.dimx)) + # else: + # return ('%s: %s (%.4f)' % (self.code, self.apname, self.dimx)) + + def hash(self): + if self.dimy: + return ('%s (%.5f x %.5f)' % (self.apname, self.dimx, self.dimy)) + else: + if self.apname in ('Macro',): + return ('%s (%s)' % (self.apname, self.dimx)) + else: + return ('%s (%.5f)' % (self.apname, self.dimx)) + + def writeDef(self, fid): + if self.dimy: + fid.write(self.format % (self.code, self.dimx, self.dimy)) + else: + fid.write(self.format % (self.code, self.dimx)) + +# Parse the aperture definition in line 's'. macroNames is an aperture macro dictionary +# that translates macro names local to this file to global names in the GAMT. We make +# the translation right away so that the return value from this function is an aperture +# definition with a global macro name, e.g., 'ADD10M5' +def parseAperture(s, knownMacroNames): + for ap in Apertures: + match = ap[1].match(s) + if match: + dimy = None + if ap[0] in ('Circle', 'Octagon', 'Macro'): + code, dimx = match.groups() + else: + code, dimx, dimy = match.groups() + + if ap[0] in ('Macro',): + if knownMacroNames.has_key(dimx): + dimx = knownMacroNames[dimx] # dimx is now GLOBAL, permanent macro name (e.g., 'M2') + else: + raise RuntimeError, 'Aperture Macro name "%s" not defined' % dimx + else: + try: + dimx = float(dimx) + if dimy: + dimy = float(dimy) + except: + raise RuntimeError, "Illegal floating point aperture size" + + return Aperture(ap, code, dimx, dimy) + + return None + +# This function returns a dictionary where each key is an +# aperture code string (e.g., "D11") and the value is the +# Aperture object that represents it. For example: +# +# %ADD12R,0.0630X0.0630*% +# +# from a Gerber file would result in the dictionary entry: +# +# "D12": Aperture(ap, 'D10', 0.063, 0.063) +# +# The input fileList is a list of pathnames which will be read to construct the +# aperture table for a job. All the files in the given list will be so +# examined, and a global aperture table will be constructed as a dictionary. +# Same goes for the global aperture macro table. + +tool_pat = re.compile(r'^(?:G54)?D\d+\*$') + +def constructApertureTable(fileList): + # First we construct a dictionary where each key is the + # string representation of the aperture. Then we go back and assign + # numbers. For aperture macros, we construct their final version + # (i.e., 'M1', 'M2', etc.) right away, as they are parsed. Thus, + # we translate from 'THX10N' or whatever to 'M2' right away. + GAT = config.GAT # Global Aperture Table + GAT.clear() + GAMT = config.GAMT # Global Aperture Macro Table + GAMT.clear() + RevGAMT = {} # Dictionary keyed by aperture macro hash and returning macro name + + AT = {} # Aperture Table for this file + for fname in fileList: + #print 'Reading apertures from %s ...' % fname + + knownMacroNames = {} + + fid = file(fname,'rt') + for line in fid: + # Get rid of CR + line = line.replace('\x0D', '') + + if tool_pat.match(line): + break # When tools start, no more apertures are being defined + + # If this is an aperture macro definition, add its string + # representation to the dictionary. It might already exist. + # Ignore %AMOC8* from Eagle for now as it uses a macro parameter. + if line[:7]=='%AMOC8*': + continue + + # parseApertureMacro() sucks up all macro lines up to terminating '%' + AM = amacro.parseApertureMacro(line, fid) + if AM: + # Has this macro definition already been defined (perhaps by another name + # in another layer)? + try: + # If this macro has already been encountered anywhere in any job, + # RevGAMT will map the macro hash to the global macro name. Then, + # make the local association knownMacroNames[localMacroName] = globalMacroName. + knownMacroNames[AM.name] = RevGAMT[AM.hash()] + except KeyError: + # No, so define the global macro and do the translation. Note that + # addToApertureMacroTable() MODIFIES AM.name to the new M-name. + localMacroName = AM.name + AM = amacro.addToApertureMacroTable(AM) + knownMacroNames[localMacroName] = AM.name + RevGAMT[AM.hash()] = AM.name + else: + A = parseAperture(line, knownMacroNames) + + # If this is an aperture definition, add the string representation + # to the dictionary. It might already exist. + if A: + AT[A.hash()] = A + + fid.close() + + # Now, go through and assign sequential codes to all apertures + code = 10 + for val in AT.values(): + key = 'D%d' % code + GAT[key] = val + val.code = key + code += 1 + + if 0: + keylist = config.GAT.keys() + keylist.sort() + print 'Apertures' + print '=========' + for key in keylist: + print '%s' % config.GAT[key] + sys.exit(0) + +def findHighestApertureCode(keys): + "Find the highest integer value in a list of aperture codes: ['D10', 'D23', 'D35', ...]" + + # Must sort keys by integer value, not string since 99 comes before 100 + # as an integer but not a string. + keys = [int(K[1:]) for K in keys] + keys.sort() + + return keys[-1] + +def addToApertureTable(AP): + GAT = config.GAT + + lastCode = findHighestApertureCode(GAT.keys()) + code = 'D%d' % (lastCode+1) + GAT[code] = AP + AP.code = code + + return code + +def findInApertureTable(AP): + """Return 'D10', for example in response to query for an object + of type Aperture()""" + hash = AP.hash() + for key, val in config.GAT.items(): + if hash==val.hash(): + return key + + return None + +def findOrAddAperture(AP): + """If the aperture exists in the GAT, modify the AP.code field to reflect the global code + and return the code. Otherwise, create a new aperture in the GAT and return the new code + for it.""" + code = findInApertureTable(AP) + if code: + AP.code = code + return code + else: + return addToApertureTable(AP) + +if __name__=="__main__": + constructApertureTable(sys.argv[1:]) + + keylist = config.GAMT.keys() + keylist.sort() + print 'Aperture Macros' + print '===============' + for key in keylist: + print '%s' % config.GAMT[key] + + keylist = config.GAT.keys() + keylist.sort() + print 'Apertures' + print '=========' + for key in keylist: + print '%s' % config.GAT[key] diff --git a/gerbmerge/config.py b/gerbmerge/config.py new file mode 100644 index 0000000..0bf3eb5 --- /dev/null +++ b/gerbmerge/config.py @@ -0,0 +1,399 @@ +#!/usr/bin/env python +""" +Parse the GerbMerge configuration file. + +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import sys +import ConfigParser +import re +import string + +import jobs +import aptable + +# Configuration dictionary. Specify floats as strings. Ints can be specified +# as ints or strings. +Config = { + 'xspacing': '0.125', # Spacing in horizontal direction + 'yspacing': '0.125', # Spacing in vertical direction + 'panelwidth': '12.6', # X-Dimension maximum panel size (Olimex) + 'panelheight': '7.8', # Y-Dimension maximum panel size (Olimex) + 'cropmarklayers': None, # e.g., *toplayer,*bottomlayer + 'cropmarkwidth': '0.01', # Width (inches) of crop lines + 'cutlinelayers': None, # as for cropmarklayers + 'cutlinewidth': '0.01', # Width (inches) of cut lines + 'minimumfeaturesize': 0, # Minimum dimension for selected layers + 'toollist': None, # Name of file containing default tool list + 'drillclustertolerance': '.002', # Tolerance for clustering drill sizes + 'allowmissinglayers': 0, # Set to 1 to allow multiple jobs to have non-matching layers + 'fabricationdrawingfile': None, # Name of file to which to write fabrication drawing, or None + 'fabricationdrawingtext': None, # Name of file containing text to write to fab drawing + 'excellondecimals': 4, # Number of digits after the decimal point in input Excellon files + 'excellonleadingzeros': 0, # Generate leading zeros in merged Excellon output file + 'outlinelayerfile': None, # Name of file to which to write simple box outline, or None + 'scoringfile': None, # Name of file to which to write scoring data, or None + 'leftmargin': 0, # Inches of extra room to leave on left side of panel for tooling + 'topmargin': 0, # Inches of extra room to leave on top side of panel for tooling + 'rightmargin': 0, # Inches of extra room to leave on right side of panel for tooling + 'bottommargin': 0, # Inches of extra room to leave on bottom side of panel for tooling + 'fiducialpoints': None, # List of X,Y co-ordinates at which to draw fiducials + 'fiducialcopperdiameter': 0.08, # Diameter of copper part of fiducial + 'fiducialmaskdiameter': 0.32, # Diameter of fiducial soldermask opening + } + +# This dictionary is indexed by lowercase layer name and has as values a file +# name to use for the output. +MergeOutputFiles = { + 'boardoutline': 'merged.boardoutline.ger', + 'drills': 'merged.drills.xln', + 'placement': 'merged.placement.txt', + 'toollist': 'merged.toollist.drl' + } + +# The global aperture table, indexed by aperture code (e.g., 'D10') +GAT = {} + +# The global aperture macro table, indexed by macro name (e.g., 'M3', 'M4R' for rotated macros) +GAMT = {} + +# The list of all jobs loaded, indexed by job name (e.g., 'PowerBoard') +Jobs = {} + +# The set of all Gerber layer names encountered in all jobs. Doesn't +# include drills. +LayerList = {'boardoutline': 1} + +# The tool list as read in from the DefaultToolList file in the configuration +# file. This is a dictionary indexed by tool name (e.g., 'T03') and +# a floating point number as the value, the drill diameter in inches. +DefaultToolList = {} + +# The GlobalToolMap dictionary maps tool name to diameter in inches. It +# is initially empty and is constructed after all files are read in. It +# only contains actual tools used in jobs. +GlobalToolMap = {} + +# The GlobalToolRMap dictionary is a reverse dictionary of ToolMap, i.e., it maps +# diameter to tool name. +GlobalToolRMap = {} + +############################################################################## + +# This configuration option determines whether trimGerber() is called +TrimGerber = 1 + +# This configuration option determines whether trimExcellon() is called +TrimExcellon = 1 + +# This configuration option determines the minimum size of feature dimensions for +# each layer. It is a dictionary indexed by layer name (e.g. '*topsilkscreen') and +# has a floating point number as the value (in inches). +MinimumFeatureDimension = {} + +# This configuration option is a positive integer that determines the maximum +# amout of time to allow for random placements (seconds). A SearchTimeout of 0 +# indicates that no timeout should occur and random placements will occur +# forever until a KeyboardInterrupt is raised. +SearchTimeout = 0 + +# Construct the reverse-GAT/GAMT translation table, keyed by aperture/aperture macro +# hash string. The value is the aperture code (e.g., 'D10') or macro name (e.g., 'M5'). +def buildRevDict(D): + RevD = {} + for key,val in D.items(): + RevD[val.hash()] = key + return RevD + +def parseStringList(L): + """Parse something like '*toplayer, *bottomlayer' into a list of names + without quotes, spaces, etc.""" + + if 0: + if L[0]=="'": + if L[-1] != "'": + raise RuntimeError, "Illegal configuration string '%s'" % L + L = L[1:-1] + + elif L[0]=='"': + if L[-1] != '"': + raise RuntimeError, "Illegal configuration string '%s'" % L + L = L[1:-1] + + # This pattern matches quotes at the beginning and end...quotes must match + quotepat = re.compile(r'^([' "'" '"' r']?)([^\1]*)\1$') + delimitpat = re.compile(r'[ \t]*[,;][ \t]*') + + match = quotepat.match(L) + if match: + L = match.group(2) + + return delimitpat.split(L) + +# Parse an Excellon tool list file of the form +# +# T01 0.035in +# T02 0.042in +def parseToolList(fname): + TL = {} + + try: + fid = file(fname, 'rt') + except Exception, detail: + raise RuntimeError, "Unable to open tool list file '%s':\n %s" % (fname, str(detail)) + + pat_in = re.compile(r'\s*(T\d+)\s+([0-9.]+)\s*in\s*') + pat_mm = re.compile(r'\s*(T\d+)\s+([0-9.]+)\s*mm\s*') + pat_mil = re.compile(r'\s*(T\d+)\s+([0-9.]+)\s*(?:mil)?') + for line in fid.xreadlines(): + line = string.strip(line) + if (not line) or (line[0] in ('#', ';')): continue + + mm = 0 + mil = 0 + match = pat_in.match(line) + if not match: + mm = 1 + match = pat_mm.match(line) + if not match: + mil = 1 + match = pat_mil.match(line) + if not match: + continue + #raise RuntimeError, "Illegal tool list specification:\n %s" % line + + tool, size = match.groups() + + try: + size = float(size) + except: + raise RuntimeError, "Tool size in file '%s' is not a valid floating-point number:\n %s" % (fname,line) + + if mil: + size = size*0.001 # Convert mil to inches + elif mm: + size = size/25.4 # Convert mm to inches + + # Canonicalize tool so that T1 becomes T01 + tool = 'T%02d' % int(tool[1:]) + + if TL.has_key(tool): + raise RuntimeError, "Tool '%s' defined more than once in tool list file '%s'" % (tool,fname) + + TL[tool]=size + fid.close() + + return TL + +# This function parses the job configuration file and does +# everything needed to: +# +# * parse global options and store them in the Config dictionary +# as natural types (i.e., ints, floats, lists) +# +# * Read Gerber/Excellon data and populate the Jobs dictionary +# +# * Read Gerber/Excellon data and populate the global aperture +# table, GAT, and the global aperture macro table, GAMT +# +# * read the tool list file and populate the DefaultToolList dictionary +def parseConfigFile(fname, Config=Config, Jobs=Jobs): + global DefaultToolList + + CP = ConfigParser.ConfigParser() + CP.readfp(file(fname,'rt')) + + # First parse global options + if CP.has_section('Options'): + for opt in CP.options('Options'): + # Is it one we expect + if Config.has_key(opt): + # Yup...override it + Config[opt] = CP.get('Options', opt) + + elif CP.defaults().has_key(opt): + pass # Ignore DEFAULTS section keys + + elif opt in ('fabricationdrawing', 'outlinelayer'): + print '*'*73 + print '\nThe FabricationDrawing and OutlineLayer configuration options have been' + print 'renamed as of GerbMerge version 1.0. Please consult the documentation for' + print 'a description of the new options, then modify your configuration file.\n' + print '*'*73 + sys.exit(1) + else: + raise RuntimeError, "Unknown option '%s' in [Options] section of configuration file" % opt + else: + raise RuntimeError, "Missing [Options] section in configuration file" + + # Ensure we got a tool list + if not Config.has_key('toollist'): + raise RuntimeError, "INTERNAL ERROR: Missing tool list assignment in [Options] section" + + # Make integers integers, floats floats + for key,val in Config.items(): + try: + val = int(val) + Config[key]=val + except: + try: + val = float(val) + Config[key]=val + except: + pass + + # Process lists of strings + if Config['cutlinelayers']: + Config['cutlinelayers'] = parseStringList(Config['cutlinelayers']) + if Config['cropmarklayers']: + Config['cropmarklayers'] = parseStringList(Config['cropmarklayers']) + + # Process list of minimum feature dimensions + if Config['minimumfeaturesize']: + temp = Config['minimumfeaturesize'].split(",") + try: + for index in range(0, len(temp), 2): + MinimumFeatureDimension[ temp[index] ] = float( temp[index + 1] ) + except: + raise RuntimeError, "Illegal configuration string:" + Config['minimumfeaturesize'] + + # Process MergeOutputFiles section to set output file names + if CP.has_section('MergeOutputFiles'): + for opt in CP.options('MergeOutputFiles'): + # Each option is a layer name and the output file for this name + if opt[0]=='*' or opt in ('boardoutline', 'drills', 'placement', 'toollist'): + MergeOutputFiles[opt] = CP.get('MergeOutputFiles', opt) + + # Now, we go through all jobs and collect Gerber layers + # so we can construct the Global Aperture Table. + apfiles = [] + + for jobname in CP.sections(): + if jobname=='Options': continue + if jobname=='MergeOutputFiles': continue + if jobname=='GerbMergeGUI': continue + + # Ensure all jobs have a board outline + if not CP.has_option(jobname, 'boardoutline'): + raise RuntimeError, "Job '%s' does not have a board outline specified" % jobname + + if not CP.has_option(jobname, 'drills'): + raise RuntimeError, "Job '%s' does not have a drills layer specified" % jobname + + for layername in CP.options(jobname): + if layername[0]=='*' or layername=='boardoutline': + fname = CP.get(jobname, layername) + apfiles.append(fname) + + if layername[0]=='*': + LayerList[layername]=1 + + # Now construct global aperture tables, GAT and GAMT. This step actually + # reads in the jobs for aperture data but doesn't store Gerber + # data yet. + aptable.constructApertureTable(apfiles) + del apfiles + + if 0: + keylist = GAMT.keys() + keylist.sort() + for key in keylist: + print '%s' % GAMT[key] + sys.exit(0) + + # Parse the tool list + if Config['toollist']: + DefaultToolList = parseToolList(Config['toollist']) + + # Now get jobs. Each job implies layer names, and we + # expect consistency in layer names from one job to the + # next. Two reserved layer names, however, are + # BoardOutline and Drills. + + Jobs.clear() + + do_abort = 0 + errstr = 'ERROR' + if Config['allowmissinglayers']: + errstr = 'WARNING' + + for jobname in CP.sections(): + if jobname=='Options': continue + if jobname=='MergeOutputFiles': continue + if jobname=='GerbMergeGUI': continue + + print 'Reading data from', jobname, '...' + + J = jobs.Job(jobname) + + # Parse the job settings, like tool list, first, since we are not + # guaranteed to have ConfigParser return the layers in the same order that + # the user wrote them, and we may get Gerber files before we get a tool + # list! Same thing goes for ExcellonDecimals. We need to know what this is + # before parsing any Excellon files. + for layername in CP.options(jobname): + fname = CP.get(jobname, layername) + + if layername == 'toollist': + J.ToolList = parseToolList(fname) + elif layername=='excellondecimals': + try: + J.ExcellonDecimals = int(fname) + except: + raise RuntimeError, "Excellon decimals '%s' in config file is not a valid integer" % fname + elif layername=='repeat': + try: + J.Repeat = int(fname) + except: + raise RuntimeError, "Repeat count '%s' in config file is not a valid integer" % fname + + for layername in CP.options(jobname): + fname = CP.get(jobname, layername) + + if layername=='boardoutline': + J.parseGerber(fname, layername, updateExtents=1) + elif layername[0]=='*': + J.parseGerber(fname, layername, updateExtents=0) + elif layername=='drills': + J.parseExcellon(fname) + + # Emit warnings if some layers are missing + LL = LayerList.copy() + for layername in J.apxlat.keys(): + assert LL.has_key(layername) + del LL[layername] + + if LL: + if errstr=='ERROR': + do_abort=1 + + print '%s: Job %s is missing the following layers:' % (errstr, jobname) + for layername in LL.keys(): + print ' %s' % layername + + # Store the job in the global Jobs dictionary, keyed by job name + Jobs[jobname] = J + + if do_abort: + raise RuntimeError, 'Exiting since jobs are missing layers. Set AllowMissingLayers=1\nto override.' + +if __name__=="__main__": + CP = parseConfigFile(sys.argv[1]) + print Config + sys.exit(0) + + if 0: + for key, val in CP.defaults().items(): + print '%s: %s' % (key,val) + + for section in CP.sections(): + print '[%s]' % section + for opt in CP.options(section): + print ' %s=%s' % (opt, CP.get(section, opt)) diff --git a/gerbmerge/drillcluster.py b/gerbmerge/drillcluster.py new file mode 100644 index 0000000..cf9b15a --- /dev/null +++ b/gerbmerge/drillcluster.py @@ -0,0 +1,208 @@ +#!/usr/bin/env python + +""" +Drill clustering routines to reduce total number of drills and remap +drilling commands to the new reduced drill set. + +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +_STATUS = True ## indicates status messages should be shown +_DEBUG = False ## indicates debug and status messages should be shown + +def cluster(drills, tolerance, debug = _DEBUG): + """ + Take a dictionary of drill names and sizes and cluster them + A tolerance of 0 will effectively disable clustering + + Returns clustered drill dictionary + """ + + global _DEBUG + _DEBUG = debug + + clusters = [] + + debug_print("\n " + str( len(drills) ) + " Original drills:") + debug_print( drillsToString(drills) ) + debug_print("Clustering drill sizes ...", True) + + # Loop through all drill sizes + sizes = drills.keys() + sizes.sort() + for size in sizes: + + match = False + + # See if size fits into any current clusters, else make new cluster + for index in range( len(clusters) ): + c = clusters[index] + if not len(c): + break + mn = min(c) + mx = max(c) + + ##debug_print( "Validating " + str_d(size) + " in " + str_d(c) ) + ##debug_print( "Possible cluster range = " + str_d(mx - 2 * tolerance) + " to " + str_d(mn + 2 * tolerance) ) + + if (size >= mx - 2 * tolerance) and (size <= mn + 2 * tolerance): + + debug_print( str_d(size) + " belongs with " + str_d(c) ) + + clusters[index].append(size) + match = True + break + + if not match: + debug_print(str_d(size) + " belongs in a new cluster") + clusters.append( [size] ) + + debug_print("\n Creating new drill dictionary ...") + + new_drills = {} + tool_num = 0 + + # Create new dictionary of clustered drills + for c in clusters: + tool_num += 1 + new_drill = "T%02d" % tool_num + c.sort() + new_size = ( min(c) + max(c) ) / 2.0 + new_drills[new_size] = new_drill + + debug_print(str_d(c) + " will be represented by " + new_drill + " (" + str_d(new_size) + ")") + + debug_print("\n " + str( len(new_drills) ) + " Clustered Drills:") + debug_print( drillsToString(new_drills) ) + debug_print("Drill count reduced from " + str( len(drills) ) + " to " + str( len(new_drills) ), True) + + return new_drills + +def remap(jobs, globalToolMap, debug = _DEBUG): + """ + Remap tools and commands in all jobs to match new tool map + + Returns None + """ + + # Set global variables from parameters + global _DEBUG + _DEBUG = debug + + debug_print("Remapping tools and commands ...", True) + + for job in jobs: + job = job.job ##access job inside job layout + debug_print("\n Job name: " + job.name) + debug_print("\n Original job tools:") + debug_print( str(job.xdiam) ) + debug_print("\n Original commands:") + debug_print( str(job.xcommands) ) + new_tools = {} + new_commands = {} + for tool, diam in job.xdiam.items(): + + ##debug_print("\n Current tool: " + tool + " (" + str_d(diam) + ")") + + # Search for best matching tool + best_diam, best_tool = globalToolMap[0] + + for glob_diam, glob_tool in globalToolMap: + if abs(glob_diam - diam) < abs(best_diam - diam): + best_tool = glob_tool + best_diam = glob_diam + ##debug_print("Best match: " + best_tool + " (" + str_d(best_diam) + ")") + new_tools[best_tool] = best_diam + ##debug_print(best_tool + " will replace " + tool) + + # Append commands to existing commands if they exist + if best_tool in new_commands: + ##debug_print( "Current commands: " + str( new_commands[best_tool] ) ) + temp = new_commands[best_tool] + temp.extend( job.xcommands[tool] ) + new_commands[best_tool] = temp + ##debug_print( "All commands: " + str( new_commands[best_tool] ) ) + else: + new_commands[best_tool] = job.xcommands[tool] + + debug_print("\n New job tools:") + debug_print( str(new_tools) ) + debug_print("\n New commands:") + debug_print( str(new_commands) ) + job.xdiam = new_tools + job.xcommands = new_commands + +def debug_print(text, status = False, newLine = True): + """ + Print debugging statemetns + + Returs None, Printts text + """ + + if _DEBUG or (status and _STATUS): + if newLine: + print " ", text + else: + print " ", text, + +def str_d(drills): + """ + Format drill sizes for printing debug and status messages + + Returns drills as formatted string + """ + + string = "" + + try: + len(drills) + except: + string = "%.4f" % drills + else: + string = "[" + for drill in drills: + string += ( "%.4f" % drill + ", ") + string = string[:len(string) - 2] + "]" + + return string + +def drillsToString(drills): + """ + Format drill dictionary for printing debug and status messages + + Returns drills as formatted string + """ + string = "" + + drills = drills.items() + drills.sort() + for size, drill in drills: + string += drill + " = " + str_d(size) + "\n " + + return string + +""" + The following code runs test drill clusterings with random drill sets. +""" + +if __name__=="__main__": + import random + + print " Clustering random drills..." + + old = {} + tool_num = 0 + while len(old) < 99: + rand_size = round(random.uniform(.02, .04), 4) + if rand_size in old: + continue + tool_num += 1 + old[rand_size] = "T%02d" % tool_num + + new = cluster(old, .0003, True) diff --git a/gerbmerge/fabdrawing.py b/gerbmerge/fabdrawing.py new file mode 100644 index 0000000..ea2d2bb --- /dev/null +++ b/gerbmerge/fabdrawing.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python +"""This file handles the writing of the fabrication drawing Gerber file + +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import string + +import config +import makestroke +import util + +def writeDrillHits(fid, Place, Tools): + toolNumber = -1 + + for tool in Tools: + toolNumber += 1 + + try: + size = config.GlobalToolMap[tool] + except: + raise RuntimeError, "INTERNAL ERROR: Tool code %s not found in global tool list" % tool + + #for row in Layout: + # row.writeDrillHits(fid, size, toolNumber) + for job in Place.jobs: + job.writeDrillHits(fid, size, toolNumber) + +def writeBoundingBox(fid, OriginX, OriginY, MaxXExtent, MaxYExtent): + x = util.in2gerb(OriginX) + y = util.in2gerb(OriginY) + X = util.in2gerb(MaxXExtent) + Y = util.in2gerb(MaxYExtent) + + makestroke.drawPolyline(fid, [(x,y), (X,y), (X,Y), (x,Y), (x,y)], 0, 0) + +def writeDrillLegend(fid, Tools, OriginY, MaxXExtent): + # This is the spacing from the right edge of the board to where the + # drill legend is to be drawn, in inches. Remember we have to allow + # for dimension arrows, too. + dimspace = 0.5 # inches + + # This is the spacing from the drill hit glyph to the drill size + # in inches. + glyphspace = 0.1 # inches + + # Convert to Gerber 2.5 units + dimspace = util.in2gerb(dimspace) + glyphspace = util.in2gerb(glyphspace) + + # Construct a list of tuples (toolSize, toolNumber) where toolNumber + # is the position of the tool in Tools and toolSize is in inches. + L = [] + toolNumber = -1 + for tool in Tools: + toolNumber += 1 + L.append((config.GlobalToolMap[tool], toolNumber)) + + # Now sort the list from smallest to largest + L.sort() + + # And reverse to go from largest to smallest, so we can write the legend + # from the bottom up + L.reverse() + + # For each tool, draw a drill hit marker then the size of the tool + # in inches. + posY = util.in2gerb(OriginY) + posX = util.in2gerb(MaxXExtent) + dimspace + maxX = 0 + for size,toolNum in L: + # Determine string to write and midpoint of string + s = '%.3f"' % size + ll, ur = makestroke.boundingBox(s, posX+glyphspace, posY) # Returns lower-left point, upper-right point + midpoint = (ur[1]+ll[1])/2 + + # Keep track of maximum extent of legend + maxX = max(maxX, ur[0]) + + makestroke.drawDrillHit(fid, posX, midpoint, toolNum) + makestroke.writeString(fid, s, posX+glyphspace, posY, 0) + + posY += int(round((ur[1]-ll[1])*1.5)) + + # Return value is lower-left of user text area, without any padding. + return maxX, util.in2gerb(OriginY) + +def writeDimensionArrow(fid, OriginX, OriginY, MaxXExtent, MaxYExtent): + x = util.in2gerb(OriginX) + y = util.in2gerb(OriginY) + X = util.in2gerb(MaxXExtent) + Y = util.in2gerb(MaxYExtent) + + # This constant is how far away from the board the centerline of the dimension + # arrows should be, in inches. + dimspace = 0.2 + + # Convert it to Gerber (0.00001" or 2.5) units + dimspace = util.in2gerb(dimspace) + + # Draw an arrow above the board, on the left side and right side + makestroke.drawDimensionArrow(fid, x, Y+dimspace, makestroke.FacingLeft) + makestroke.drawDimensionArrow(fid, X, Y+dimspace, makestroke.FacingRight) + + # Draw arrows to the right of the board, at top and bottom + makestroke.drawDimensionArrow(fid, X+dimspace, Y, makestroke.FacingUp) + makestroke.drawDimensionArrow(fid, X+dimspace, y, makestroke.FacingDown) + + # Now draw the text. First, horizontal text above the board. + s = '%.3f"' % (MaxXExtent - OriginX) + ll, ur = makestroke.boundingBox(s, 0, 0) + s_width = ur[0]-ll[0] # Width in 2.5 units + s_height = ur[1]-ll[1] # Height in 2.5 units + + # Compute the position in 2.5 units where we should draw this. It should be + # centered horizontally and also vertically about the dimension arrow centerline. + posX = x + (x+X)/2 + posX -= s_width/2 + posY = Y + dimspace - s_height/2 + makestroke.writeString(fid, s, posX, posY, 0) + + # Finally, draw the extending lines from the text to the arrows. + posY = Y + dimspace + posX1 = posX - util.in2gerb(0.1) # 1000 + posX2 = posX + s_width + util.in2gerb(0.1) # 1000 + makestroke.drawLine(fid, x, posY, posX1, posY) + makestroke.drawLine(fid, posX2, posY, X, posY) + + # Now do the vertical text + s = '%.3f"' % (MaxYExtent - OriginY) + ll, ur = makestroke.boundingBox(s, 0, 0) + s_width = ur[0]-ll[0] + s_height = ur[1]-ll[1] + + # As above, figure out where to draw this. Rotation will be -90 degrees + # so new origin will be top-left of bounding box after rotation. + posX = X + dimspace - s_height/2 + posY = y + (y+Y)/2 + posY += s_width/2 + makestroke.writeString(fid, s, posX, posY, -90) + + # Draw extending lines + posX = X + dimspace + posY1 = posY + util.in2gerb(0.1) # 1000 + posY2 = posY - s_width - util.in2gerb(0.1) # 1000 + makestroke.drawLine(fid, posX, Y, posX, posY1) + makestroke.drawLine(fid, posX, posY2, posX, y) + +def writeUserText(fid, X, Y): + fname = config.Config['fabricationdrawingtext'] + if not fname: return + + try: + tfile = file(fname, 'rt') + except Exception, detail: + raise RuntimeError, "Could not open fabrication drawing text file '%s':\n %s" % (fname,str(detail)) + + lines = tfile.readlines() + tfile.close() + lines.reverse() # We're going to print from bottom up + + # Offset X position to give some clearance from drill legend + X += util.in2gerb(0.2) # 2000 + + for line in lines: + # Get rid of CR + line = string.replace(line, '\x0D', '') + + # Chop off \n + #if line[-1] in string.whitespace: + # line = line[:-1] + + # Strip off trailing whitespace + line = string.rstrip(line) + + # Blank lines still need height, so must have at least one character + if not line: + line = ' ' + + ll, ur = makestroke.boundingBox(line, X, Y) + makestroke.writeString(fid, line, X, Y, 0) + + Y += int(round((ur[1]-ll[1])*1.5)) + +# Main entry point. Gerber file has already been opened, header written +# out, 1mil tool selected. +def writeFabDrawing(fid, Place, Tools, OriginX, OriginY, MaxXExtent, MaxYExtent): + + # Write out all the drill hits + writeDrillHits(fid, Place, Tools) + + # Draw a bounding box for the project + writeBoundingBox(fid, OriginX, OriginY, MaxXExtent, MaxYExtent) + + # Write out the drill hit legend off to the side. This function returns + # (X,Y) lower-left origin where user text is to begin, in Gerber units + # and without any padding. + X,Y = writeDrillLegend(fid, Tools, OriginY, MaxXExtent) + + # Write out the dimensioning arrows + writeDimensionArrow(fid, OriginX, OriginY, MaxXExtent, MaxYExtent) + + # Finally, write out user text + writeUserText(fid, X, Y) diff --git a/gerbmerge/geometry.py b/gerbmerge/geometry.py new file mode 100644 index 0000000..4d20d50 --- /dev/null +++ b/gerbmerge/geometry.py @@ -0,0 +1,346 @@ +#!/usr/bin/env python +""" +General geometry support routines. + +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import math + +# Ensure all list elements are unique +def uniqueify(L): + return {}.fromkeys(L).keys() + +# This function rounds an (X,Y) point to integer co-ordinates +def roundPoint(pt): + return (int(round(pt[0])),int(round(pt[1]))) + +# Returns True if the segment defined by endpoints p1 and p2 is vertical +def isSegmentVertical(p1, p2): + return p1[0]==p2[0] + +# Returns True if the segment defined by endpoints p1 and p2 is horizontal +def isSegmentHorizontal(p1, p2): + return p1[1]==p2[1] + +# Returns slope of a non-vertical line segment +def segmentSlope(p1, p2): + return float(p2[1]-p1[1])/(p2[0]-p1[0]) + +# Determine if the (X,Y) 'point' is on the line segment defined by endpoints p1 +# and p2, both (X,Y) tuples. It's assumed that the point is on the line defined +# by the segment, but just may be beyond the endpoints. NOTE: No testing is +# performed to see if the point is actually on the line defined by the segment! +# This is assumed! +def isPointOnSegment(point, p1, p2): + if isSegmentVertical(p1,p2): + # Treat vertical lines by comparing Y-ordinates + return (point[1]-p2[1])*(point[1]-p1[1]) <= 0 + else: + # Treat other lines, including horizontal lines, by comparing X-ordinates + return (point[0]-p2[0])*(point[0]-p1[0]) <= 0 + +# Returns (X,Y) point where the line segment defined by (X,Y) endpoints p1 and +# p2 intersects the line segment defined by endpoints q1 and q2. Only a single +# intersection point is allowed, so no coincident lines. If there is no point +# of intersection, None is returned. +def segmentXsegment1pt(p1, p2, q1, q2): + A,B = p1 + C,D = p2 + P,Q = q1 + R,S = q2 + + # We have to consider special cases of one or other line segments being vertical + if isSegmentVertical(p1,p2): + if isSegmentVertical(q1,q2): return None + + x = A + y = segmentSlope(q1,q2)*(A-P) + Q + elif isSegmentVertical(q1,q2): + x = P + y = segmentSlope(p1,p2)*(P-A) + B + else: + m1 = segmentSlope(p1,p2) + m2 = segmentSlope(q1,q2) + + if m1==m2: return None + + x = (A*m1 - B - P*m2 + Q) / (m1-m2) + y = m1*(x-A) + B + + # Candidate point identified. Check to make sure it's on both line segments. + if isPointOnSegment((x,y), p1, p2) and isPointOnSegment((x,y), q1, q2): + return roundPoint((x,y)) + else: + return None + +# Returns True if the given (X,Y) 'point' is strictly within the rectangle +# defined by (LLX,LLY,URX,URY) co-ordinates (LL=lower left, UR=upper right). +def isPointStrictlyInRectangle(point, rect): + x,y = point + llx,lly,urx,ury = rect + return (llx < x < urx) and (lly < y < ury) + +# This function takes two points which define the extents of a rectangle. The +# return value is a 5-tuple (ll, ul, ur, lr, rect) which comprises 4 points +# (lower-left, upper-left, upper-right, lower-right) and a rect object (minx, +# miny, maxx, maxy). If called with a single argument, it is expected to be +# a 4-tuple (x1,y1,x2,y2). +def canonicalizeExtents(pt1, pt2=None): + # First canonicalize lower-left and upper-right points + if pt2 is None: + maxx = max(pt1[0], pt1[2]) + minx = min(pt1[0], pt1[2]) + maxy = max(pt1[1], pt1[3]) + miny = min(pt1[1], pt1[3]) + else: + maxx = max(pt1[0], pt2[0]) + minx = min(pt1[0], pt2[0]) + maxy = max(pt1[1], pt2[1]) + miny = min(pt1[1], pt2[1]) + + # Construct the four corners + llpt = (minx,miny) + urpt = (maxx,maxy) + ulpt = (minx,maxy) + lrpt = (maxx,miny) + + # Construct a rect object for use by various functions + rect = (minx, miny, maxx, maxy) + + return (llpt, ulpt, urpt, lrpt, rect) + +# This function returns a list of intersection points of the line segment +# pt1-->pt2 and the box defined by corners llpt and urpt. These corners are +# canonicalized internally so they need not necessarily be lower-left and +# upper-right points. +# +# The return value may be a list of 0, 1, or 2 points. If the list has 2 +# points, then the segment intersects the box in two points since both points +# are outside the box. If the list has 1 point, then the segment has one point +# inside the box and another point outside. If the list is empty, the segment +# has both points outside the box and there is no intersection, or has both +# points inside the box. +# +# Note that segments collinear with box edges produce no points of +# intersection. +def segmentXbox(pt1, pt2, llpt, urpt): + # First canonicalize lower-left and upper-right points + llpt, ulpt, urpt, lrpt, rect = canonicalizeExtents(llpt, urpt) + + # Determine whether one point is inside the rectangle and the other is not. + # Note the XOR operator '^' + oneInOneOut = isPointStrictlyInRectangle(pt1,rect) ^ isPointStrictlyInRectangle(pt2,rect) + + # Find all intersections of the segment with the 4 sides of the box, + # one side at a time. L will be the list of definitely-true intersections, + # while corners is a list of potential intersections. An intersection + # is potential if a) it is a corner, and b) there is another intersection + # of the line with the box somewhere else. This is how we handle + # corner intersections, which are sometimes legal (when one segment endpoint + # is inside the box and the other isn't, or when the segment intersects the + # box in two places) and sometimes not (when the segment is "tangent" to + # the box at the corner and the corner is the signle point of intersection). + L = [] + corners = [] + + # Do not allow intersection if segment is collinear with box sides. For + # example, a horizontal line collinear with the box top side should not + # return an intersection with the upper-left or upper-right corner. + # Similarly, a point of intersection that is a corner should only be + # allowed if one segment point is inside the box and the other is not, + # otherwise it means the segment is "tangent" to the box at that corner. + # There is a case, however, in which a corner is a point of intersection + # with both segment points outside the box, and that is if there are two + # points of intersection, i.e., the segment goes completely through the box. + + def checkIntersection(corner1, corner2): + # Check intersection with side of box + pt = segmentXsegment1pt(pt1, pt2, corner1, corner2) + if pt in (corner1,corner2): + # Only allow this corner intersection point if line is not + # horizontal/vertical and one point is inside rectangle while other is + # not, or the segment intersects the box in two places. Since oneInOneOut + # calls isPointStrictlyInRectangle(), which automatically excludes points + # on the box itself, horizontal/vertical lines collinear with box sides + # will always lead to oneInOneOut==False (since both will be "out of + # box"). + if oneInOneOut: + L.append(pt) + else: + corners.append(pt) # Potentially a point of intersection...we'll have to wait and + # see if there is one more point of intersection somewhere else. + else: + # Not a corner intersection, so it's valid + if pt is not None: L.append(pt) + + # Check intersection with left side of box + checkIntersection(llpt, ulpt) + + # Check intersection with top side of box + checkIntersection(ulpt, urpt) + + # Check intersection with right side of box + checkIntersection(urpt, lrpt) + + # Check intersection with bottom side of box + checkIntersection(llpt, lrpt) + + # Ensure all points are unique. We may get a double hit at the corners + # of the box. + L = uniqueify(L) + corners = uniqueify(corners) + + # If the total number of intersections len(L)+len(corners) is 2, the corner + # is valid. If there is only a single corner, it's a tangent and invalid. + # However, if both corners are on the same side of the box, it's not valid. + numPts = len(L)+len(corners) + assert numPts <= 2 + if numPts == 2: + if len(corners)==2 and (isSegmentHorizontal(corners[0], corners[1]) or isSegmentVertical(corners[0],corners[1])): + return [] + else: + L += corners + L.sort() # Just for stability in assertion checking + return L + else: + L.sort() + return L # Correct if numPts==1, since it will be empty or contain a single valid intersection + # Correct if numPts==0, since it will be empty + +# This function determines if two rectangles defined by 4-tuples +# (minx, miny, maxx, maxy) have any rectangle in common. If so, it is +# returned as a 4-tuple, else None is returned. This function assumes +# the rectangles are canonical so that minx maxX) or (maxU < minX) or (minV > maxY) or (maxV < minY): + return False + else: + return True + else: + if (minU >= maxX) or (maxU <= minX) or (minV >= maxY) or (maxV <= minY): + return False + else: + return True + +# Compute the intersection of two rectangles defined by 4-tuples E1 and E2, +# which are not necessarily canonicalized. +def intersectExtents(E1, E2): + ll1, ul1, ur1, lr1, rect1 = canonicalizeExtents(E1) + ll2, ul2, ur2, lr2, rect2 = canonicalizeExtents(E2) + + if not areExtentsOverlapping(rect1, rect2): + return None + + xll = max(rect1[0], rect2[0]) # Maximum of minx values + yll = max(rect1[1], rect2[1]) # Maximum of miny values + xur = min(rect1[2], rect2[2]) # Minimum of maxx values + yur = min(rect1[3], rect2[3]) # Minimum of maxy values + return (xll, yll, xur, yur) + +# This function returns True if rectangle E1 is wholly contained within +# rectangle E2. Both E1 and E2 are 4-tuples (minx,miny,maxx,maxy), not +# necessarily canonicalized. This function is like a slightly faster +# version of "intersectExtents(E1, E2)==E1". +def isRect1InRect2(E1, E2): + ll1, ul1, ur1, lr1, rect1 = canonicalizeExtents(E1) + ll2, ul2, ur2, lr2, rect2 = canonicalizeExtents(E2) + + return (ll1[0] >= ll2[0]) and (ll1[1] >= ll2[1]) \ + and (ur1[0] <= ur2[0]) and (ur1[1] <= ur2[1]) + +# Return width of rectangle, which may be 0 if bottom-left and upper-right X +# positions are the same. The rectangle is a 4-tuple (minx,miny,maxx,maxy). +def rectWidth(rect): + return abs(rect[2]-rect[0]) + +# Return height of rectangle, which may be 0 if bottom-left and upper-right Y +# positions are the same. The rectangle is a 4-tuple (minx,miny,maxx,maxy). +def rectHeight(rect): + return abs(rect[3]-rect[1]) + +# Return center (X,Y) co-ordinates of rectangle. +def rectCenter(rect): + dx = rectWidth(rect) + dy = rectHeight(rect) + + if dx & 1: # Odd width: center is (left+right)/2 + 1/2 + X = (rect[0] + rect[2] + 1)/2 + else: # Even width: center is (left+right)/2 + X = (rect[0] + rect[2])/2 + + if dy & 1: + Y = (rect[1] + rect[3] + 1)/2 + else: + Y = (rect[1] + rect[3])/2 + + return (X,Y) + +if __name__=="__main__": + llpt = (1000,1000) + urpt = (5000,5000) + + # A segment that cuts across the box and intersects in corners + assert segmentXbox((0,0), (6000,6000), llpt, urpt) == [(1000,1000), (5000,5000)] # Two valid corners + assert segmentXbox((0,6000), (6000,0), llpt, urpt) == [(1000,5000), (5000,1000)] # Two valid corners + assert segmentXbox((500,500), (2500, 2500), llpt, urpt) == [(1000,1000)] # One valid corner + assert segmentXbox((2500,2500), (5500, 5500), llpt, urpt) == [(5000,5000)] # One valid corner + + # Segments collinear with box sides + assert segmentXbox((1000,0), (1000,6000), llpt, urpt) == [] # Box side contained in segment + assert segmentXbox((1000,0), (1000,3000), llpt, urpt) == [] # Box side partially overlaps segment + assert segmentXbox((1000,2000), (1000,4000), llpt, urpt) == [] # Segment contained in box side + + # Segments fully contained within box + assert segmentXbox((1500,2000), (2000,2500), llpt, urpt) == [] + + # Segments with points on box sides + assert segmentXbox((2500,1000), (2700,1200), llpt, urpt) == [(2500,1000)] # One point on box side + assert segmentXbox((2500,1000), (2700,5000), llpt, urpt) == [(2500,1000), (2700,5000)] # Two points on box sides + + # Segment intersects box at one point + assert segmentXbox((3500,5500), (3000, 2500), llpt, urpt) == [(3417, 5000)] # First point outside + assert segmentXbox((3500,1500), (3000, 6500), llpt, urpt) == [(3150, 5000)] # Second point outside + + # Segment intersects box at two points, not corners + assert segmentXbox((500,3000), (1500,500), llpt, urpt) == [(1000,1750), (1300,1000)] + assert segmentXbox((2500,300), (5500,3500), llpt, urpt) == [(3156,1000), (5000,2967)] + assert segmentXbox((5200,1200), (2000,6000), llpt, urpt) == [(2667,5000), (5000, 1500)] + assert segmentXbox((3200,5200), (-10, 1200), llpt, urpt) == [(1000, 2459), (3040, 5000)] + + assert segmentXbox((500,2000), (5500, 2000), llpt, urpt) == [(1000,2000), (5000, 2000)] + assert segmentXbox((5200,1250), (-200, 4800), llpt, urpt) == [(1000, 4011), (5000, 1381)] + + assert segmentXbox((1300,200), (1300, 5200), llpt, urpt) == [(1300, 1000), (1300, 5000)] + assert segmentXbox((1200,200), (1300, 5200), llpt, urpt) == [(1216, 1000), (1296, 5000)] + + assert intersectExtents( (100,100,500,500), (500,500,900,900) ) == None + assert intersectExtents( (100,100,500,500), (400,400,900,900) ) == (400,400,500,500) + assert intersectExtents( (100,100,500,500), (200,0,600,300) ) == (200,100,500,300) + assert intersectExtents( (100,100,500,500), (200,0,300,600) ) == (200,100,300,500) + + assert intersectExtents( (100,100,500,500), (0,600,50,550) ) == None + assert intersectExtents( (100,100,500,500), (0,600,600,-10) ) == (100,100,500,500) + assert intersectExtents( (100,100,500,500), (0,600,600,200) ) == (100,200,500,500) + assert intersectExtents( (100,100,500,500), (0,600,300,300) ) == (100,300,300,500) + + assert isRect1InRect2( (100,100,500,500), (0,600,50,550) ) == False + assert isRect1InRect2( (100,100,500,500), (0,600,600,-10) ) == True + assert isRect1InRect2( (100,100,500,500), (0,600,600,200) ) == False + assert isRect1InRect2( (100,100,500,500), (0,600,300,300) ) == False + assert isRect1InRect2( (100,100,500,500), (0,0,500,500) ) == True + + print 'All tests pass' diff --git a/gerbmerge/gerbmerge.py b/gerbmerge/gerbmerge.py new file mode 100644 index 0000000..149baca --- /dev/null +++ b/gerbmerge/gerbmerge.py @@ -0,0 +1,753 @@ +#!/usr/bin/env python +""" +Merge several RS274X (Gerber) files generated by Eagle into a single +job. + +This program expects that each separate job has at least three files: + - a board outline (RS274X) + - data layers (copper, silkscreen, etc. in RS274X format) + - an Excellon drill file + +Furthermore, it is expected that each job was generated by Eagle +using the GERBER_RS274X plotter, except for the drill file which +was generated by the EXCELLON plotter. + +This program places all jobs into a single job. + +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import sys +import os +import getopt +import re + +import aptable +import jobs +import config +import parselayout +import fabdrawing +import strokes +import tiling +import tilesearch1 +import tilesearch2 +import placement +import schwartz +import util +import scoring +import drillcluster + +VERSION_MAJOR=1 +VERSION_MINOR=8 + +RANDOM_SEARCH = 1 +EXHAUSTIVE_SEARCH = 2 +FROM_FILE = 3 +config.AutoSearchType = RANDOM_SEARCH +config.RandomSearchExhaustiveJobs = 2 +config.PlacementFile = None + +# This is a handle to a GUI front end, if any, else None for command-line usage +GUI = None + +def usage(): + print \ +""" +Usage: gerbmerge [Options] configfile [layoutfile] + +Options: + -h, --help -- This help summary + -v, --version -- Program version and contact information + --random-search -- Automatic placement using random search (default) + --full-search -- Automatic placement using exhaustive search + --place-file=fn -- Read placement from file + --rs-fsjobs=N -- When using random search, exhaustively search N jobs + for each random placement (default: N=2) + --search-timeout=T -- When using random search, search for T seconds for best + random placement (default: T=0, search until stopped) + --no-trim-gerber -- Do not attempt to trim Gerber data to extents of board + --no-trim-excellon -- Do not attempt to trim Excellon data to extents of board + --octagons=fmt -- Generate octagons in two different styles depending on + the value of 'fmt': + + fmt is 'rotate' : 0.0 rotation + fmt is 'normal' : 22.5 rotation (default) + +If a layout file is not specified, automatic placement is performed. If the +placement is read from a file, then no automatic placement is performed and +the layout file (if any) is ignored. + +NOTE: The dimensions of each job are determined solely by the maximum extent of +the board outline layer for each job. +""" + sys.exit(1) + +def writeGerberHeader22degrees(fid): + fid.write( \ +"""G75* +G70* +%OFA0B0*% +%FSLAX25Y25*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +""") + +def writeGerberHeader0degrees(fid): + fid.write( \ +"""G75* +G70* +%OFA0B0*% +%FSLAX25Y25*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,0.0* +% +""") + +writeGerberHeader = writeGerberHeader22degrees + +def writeApertureMacros(fid, usedDict): + keys = config.GAMT.keys() + keys.sort() + for key in keys: + if key in usedDict: + config.GAMT[key].writeDef(fid) + +def writeApertures(fid, usedDict): + keys = config.GAT.keys() + keys.sort() + for key in keys: + if key in usedDict: + config.GAT[key].writeDef(fid) + +def writeGerberFooter(fid): + fid.write('M02*\n') + +def writeExcellonHeader(fid): + fid.write('%\n') + +def writeExcellonFooter(fid): + fid.write('M30\n') + +def writeExcellonTool(fid, tool, size): + fid.write('%sC%f\n' % (tool, size)) + +def writeFiducials(fid, drawcode, OriginX, OriginY, MaxXExtent, MaxYExtent): + """Place fiducials at arbitrary points. The FiducialPoints list in the config specifies + sets of X,Y co-ordinates. Positive values of X/Y represent offsets from the lower left + of the panel. Negative values of X/Y represent offsets from the top right. So: + FiducialPoints = 0.125,0.125,-0.125,-0.125 + means to put a fiducial 0.125,0.125 from the lower left and 0.125,0.125 from the top right""" + fid.write('%s*\n' % drawcode) # Choose drawing aperture + + fList = config.Config['fiducialpoints'].split(',') + for i in range(0, len(fList), 2): + x,y = float(fList[i]), float(fList[i+1]) + if x>=0: + x += OriginX + else: + x = MaxXExtent + x + if y>=0: + y += OriginX + else: + y = MaxYExtent + y + fid.write('X%07dY%07dD03*\n' % (util.in2gerb(x), util.in2gerb(y))) + +def writeCropMarks(fid, drawing_code, OriginX, OriginY, MaxXExtent, MaxYExtent): + """Add corner crop marks on the given layer""" + + # Draw 125mil lines at each corner, with line edge right up against + # panel border. This means the center of the line is D/2 offset + # from the panel border, where D is the drawing line diameter. + fid.write('%s*\n' % drawing_code) # Choose drawing aperture + + offset = config.GAT[drawing_code].dimx/2.0 + + # Lower-left + x = OriginX + offset + y = OriginY + offset + fid.write('X%07dY%07dD02*\n' % (util.in2gerb(x+0.125), util.in2gerb(y+0.000))) + fid.write('X%07dY%07dD01*\n' % (util.in2gerb(x+0.000), util.in2gerb(y+0.000))) + fid.write('X%07dY%07dD01*\n' % (util.in2gerb(x+0.000), util.in2gerb(y+0.125))) + + # Lower-right + x = MaxXExtent - offset + y = OriginY + offset + fid.write('X%07dY%07dD02*\n' % (util.in2gerb(x+0.000), util.in2gerb(y+0.125))) + fid.write('X%07dY%07dD01*\n' % (util.in2gerb(x+0.000), util.in2gerb(y+0.000))) + fid.write('X%07dY%07dD01*\n' % (util.in2gerb(x-0.125), util.in2gerb(y+0.000))) + + # Upper-right + x = MaxXExtent - offset + y = MaxYExtent - offset + fid.write('X%07dY%07dD02*\n' % (util.in2gerb(x-0.125), util.in2gerb(y+0.000))) + fid.write('X%07dY%07dD01*\n' % (util.in2gerb(x+0.000), util.in2gerb(y+0.000))) + fid.write('X%07dY%07dD01*\n' % (util.in2gerb(x+0.000), util.in2gerb(y-0.125))) + + # Upper-left + x = OriginX + offset + y = MaxYExtent - offset + fid.write('X%07dY%07dD02*\n' % (util.in2gerb(x+0.000), util.in2gerb(y-0.125))) + fid.write('X%07dY%07dD01*\n' % (util.in2gerb(x+0.000), util.in2gerb(y+0.000))) + fid.write('X%07dY%07dD01*\n' % (util.in2gerb(x+0.125), util.in2gerb(y+0.000))) + +def disclaimer(): + print """ +**************************************************** +* R E A D C A R E F U L L Y * +* * +* This program comes with no warranty. You use * +* this program at your own risk. Do not submit * +* board files for manufacture until you have * +* thoroughly inspected the output of this program * +* using a previewing program such as: * +* * +* Windows: * +* - GC-Prevue * +* - ViewMate * +* * +* Linux: * +* - gerbv * +* * +* By using this program you agree to take full * +* responsibility for the correctness of the data * +* that is generated by this program. * +**************************************************** + +To agree to the above terms, press 'y' then Enter. +Any other key will exit the program. + +""" + + s = raw_input() + if s == 'y': + print + return + + print "\nExiting..." + sys.exit(0) + +def tile_jobs(Jobs): + """Take a list of raw Job objects and find best tiling by calling tile_search""" + + # We must take the raw jobs and construct a list of 4-tuples (Xdim,Ydim,job,rjob). + # This means we must construct a rotated job for each entry. We first sort all + # jobs from largest to smallest. This should give us the best tilings first so + # we can interrupt the tiling process and get a decent layout. + L = [] + #sortJobs = schwartz.schwartz(Jobs, jobs.Job.jobarea) + sortJobs = schwartz.schwartz(Jobs, jobs.Job.maxdimension) + sortJobs.reverse() + + for job in sortJobs: + Xdim = job.width_in() + Ydim = job.height_in() + rjob = jobs.rotateJob(job, 90) ##NOTE: This will only try 90 degree rotations though 180 & 270 are available + + for count in range(job.Repeat): + L.append( (Xdim,Ydim,job,rjob) ) + + PX,PY = config.Config['panelwidth'],config.Config['panelheight'] + if config.AutoSearchType==RANDOM_SEARCH: + tile = tilesearch2.tile_search2(L, PX, PY) + else: + tile = tilesearch1.tile_search1(L, PX, PY) + + if not tile: + raise RuntimeError, 'Panel size %.2f"x%.2f" is too small to hold jobs' % (PX,PY) + + return tile + +def merge(opts, args, gui = None): + writeGerberHeader = writeGerberHeader22degrees + + global GUI + GUI = gui + + for opt, arg in opts: + if opt in ('--octagons',): + if arg=='rotate': + writeGerberHeader = writeGerberHeader0degrees + elif arg=='normal': + writeGerberHeader = writeGerberHeader22degrees + else: + raise RuntimeError, 'Unknown octagon format' + elif opt in ('--random-search',): + config.AutoSearchType = RANDOM_SEARCH + elif opt in ('--full-search',): + config.AutoSearchType = EXHAUSTIVE_SEARCH + elif opt in ('--rs-fsjobs',): + config.RandomSearchExhaustiveJobs = int(arg) + elif opt in ('--search-timeout',): + config.SearchTimeout = int(arg) + elif opt in ('--place-file',): + config.AutoSearchType = FROM_FILE + config.PlacementFile = arg + elif opt in ('--no-trim-gerber',): + config.TrimGerber = 0 + elif opt in ('--no-trim-excellon',): + config.TrimExcellon = 0 + else: + raise RuntimeError, "Unknown option: %s" % opt + + if len(args) > 2 or len(args) < 1: + raise RuntimeError, 'Invalid number of arguments' + + # Load up the Jobs global dictionary, also filling out GAT, the + # global aperture table and GAMT, the global aperture macro table. + updateGUI("Reading job files...") + config.parseConfigFile(args[0]) + + # Force all X and Y coordinates positive by adding absolute value of minimum X and Y + for name, job in config.Jobs.iteritems(): + min_x, min_y = job.mincoordinates() + shift_x = shift_y = 0 + if min_x < 0: shift_x = abs(min_x) + if min_y < 0: shift_y = abs(min_y) + if (shift_x > 0) or (shift_y > 0): + job.fixcoordinates( shift_x, shift_y ) + + # Display job properties + for job in config.Jobs.values(): + print 'Job %s:' % job.name, + if job.Repeat > 1: + print '(%d instances)' % job.Repeat + else: + print + print ' Extents: (%d,%d)-(%d,%d)' % (job.minx,job.miny,job.maxx,job.maxy) + print ' Size: %f" x %f"' % (job.width_in(), job.height_in()) + print + + # Trim drill locations and flash data to board extents + if config.TrimExcellon: + updateGUI("Trimming Excellon data...") + print 'Trimming Excellon data to board outlines ...' + for job in config.Jobs.values(): + job.trimExcellon() + + if config.TrimGerber: + updateGUI("Trimming Gerber data...") + print 'Trimming Gerber data to board outlines ...' + for job in config.Jobs.values(): + job.trimGerber() + + # We start origin at (0.1", 0.1") just so we don't get numbers close to 0 + # which could trip up Excellon leading-0 elimination. + OriginX = OriginY = 0.1 + + # Read the layout file and construct the nested list of jobs. If there + # is no layout file, do auto-layout. + updateGUI("Performing layout...") + print 'Performing layout ...' + if len(args) > 1: + Layout = parselayout.parseLayoutFile(args[1]) + + # Do the layout, updating offsets for each component job. + X = OriginX + config.Config['leftmargin'] + Y = OriginY + config.Config['bottommargin'] + + for row in Layout: + row.setPosition(X, Y) + Y += row.height_in() + config.Config['yspacing'] + + # Construct a canonical placement from the layout + Place = placement.Placement() + Place.addFromLayout(Layout) + + del Layout + + elif config.AutoSearchType == FROM_FILE: + Place = placement.Placement() + Place.addFromFile(config.PlacementFile, config.Jobs) + else: + # Do an automatic layout based on our tiling algorithm. + tile = tile_jobs(config.Jobs.values()) + + Place = placement.Placement() + Place.addFromTiling(tile, OriginX + config.Config['leftmargin'], OriginY + config.Config['bottommargin']) + + (MaxXExtent,MaxYExtent) = Place.extents() + MaxXExtent += config.Config['rightmargin'] + MaxYExtent += config.Config['topmargin'] + + # Start printing out the Gerbers. In preparation for drawing cut marks + # and crop marks, make sure we have an aperture to draw with. Use a 10mil line. + # If we're doing a fabrication drawing, we'll need a 1mil line. + OutputFiles = [] + + try: + fullname = config.MergeOutputFiles['placement'] + except KeyError: + fullname = 'merged.placement.txt' + Place.write(fullname) + OutputFiles.append(fullname) + + # For cut lines + AP = aptable.Aperture(aptable.Circle, 'D??', config.Config['cutlinewidth']) + drawing_code_cut = aptable.findInApertureTable(AP) + if drawing_code_cut is None: + drawing_code_cut = aptable.addToApertureTable(AP) + + # For crop marks + AP = aptable.Aperture(aptable.Circle, 'D??', config.Config['cropmarkwidth']) + drawing_code_crop = aptable.findInApertureTable(AP) + if drawing_code_crop is None: + drawing_code_crop = aptable.addToApertureTable(AP) + + # For fiducials + drawing_code_fiducial_copper = drawing_code_fiducial_soldermask = None + if config.Config['fiducialpoints']: + AP = aptable.Aperture(aptable.Circle, 'D??', config.Config['fiducialcopperdiameter']) + drawing_code_fiducial_copper = aptable.findInApertureTable(AP) + if drawing_code_fiducial_copper is None: + drawing_code_fiducial_copper = aptable.addToApertureTable(AP) + AP = aptable.Aperture(aptable.Circle, 'D??', config.Config['fiducialmaskdiameter']) + drawing_code_fiducial_soldermask = aptable.findInApertureTable(AP) + if drawing_code_fiducial_soldermask is None: + drawing_code_fiducial_soldermask = aptable.addToApertureTable(AP) + + # For fabrication drawing. + AP = aptable.Aperture(aptable.Circle, 'D??', 0.001) + drawing_code1 = aptable.findInApertureTable(AP) + if drawing_code1 is None: + drawing_code1 = aptable.addToApertureTable(AP) + + updateGUI("Writing merged files...") + print 'Writing merged output files ...' + + for layername in config.LayerList.keys(): + lname = layername + if lname[0]=='*': + lname = lname[1:] + + try: + fullname = config.MergeOutputFiles[layername] + except KeyError: + fullname = 'merged.%s.ger' % lname + OutputFiles.append(fullname) + #print 'Writing %s ...' % fullname + fid = file(fullname, 'wt') + writeGerberHeader(fid) + + # Determine which apertures and macros are truly needed + apUsedDict = {} + apmUsedDict = {} + for job in Place.jobs: + apd, apmd = job.aperturesAndMacros(layername) + apUsedDict.update(apd) + apmUsedDict.update(apmd) + + # Increase aperature sizes to match minimum feature dimension + if config.MinimumFeatureDimension.has_key(layername): + + print ' Thickening', lname, 'feature dimensions ...' + + # Fix each aperture used in this layer + for ap in apUsedDict.keys(): + new = config.GAT[ap].getAdjusted( config.MinimumFeatureDimension[layername] ) + if not new: ## current aperture size met minimum requirement + continue + else: ## new aperture was created + new_code = aptable.findOrAddAperture(new) ## get name of existing aperture or create new one if needed + del apUsedDict[ap] ## the old aperture is no longer used in this layer + apUsedDict[new_code] = None ## the new aperture will be used in this layer + + # Replace all references to the old aperture with the new one + for joblayout in Place.jobs: + job = joblayout.job ##access job inside job layout + temp = [] + if job.hasLayer(layername): + for x in job.commands[layername]: + if x == ap: + temp.append(new_code) ## replace old aperture with new one + else: + temp.append(x) ## keep old command + job.commands[layername] = temp + + if config.Config['cutlinelayers'] and (layername in config.Config['cutlinelayers']): + apUsedDict[drawing_code_cut]=None + + if config.Config['cropmarklayers'] and (layername in config.Config['cropmarklayers']): + apUsedDict[drawing_code_crop]=None + + if config.Config['fiducialpoints']: + if ((layername=='*toplayer') or (layername=='*bottomlayer')): + apUsedDict[drawing_code_fiducial_copper] = None + elif ((layername=='*topsoldermask') or (layername=='*bottomsoldermask')): + apUsedDict[drawing_code_fiducial_soldermask] = None + + # Write only necessary macro and aperture definitions to Gerber file + writeApertureMacros(fid, apmUsedDict) + writeApertures(fid, apUsedDict) + + #for row in Layout: + # row.writeGerber(fid, layername) + + # # Do cut lines + # if config.Config['cutlinelayers'] and (layername in config.Config['cutlinelayers']): + # fid.write('%s*\n' % drawing_code_cut) # Choose drawing aperture + # row.writeCutLines(fid, drawing_code_cut, OriginX, OriginY, MaxXExtent, MaxYExtent) + + # Finally, write actual flash data + for job in Place.jobs: + + updateGUI("Writing merged output files...") + job.writeGerber(fid, layername) + + if config.Config['cutlinelayers'] and (layername in config.Config['cutlinelayers']): + fid.write('%s*\n' % drawing_code_cut) # Choose drawing aperture + job.writeCutLines(fid, drawing_code_cut, OriginX, OriginY, MaxXExtent, MaxYExtent) + + if config.Config['cropmarklayers']: + if layername in config.Config['cropmarklayers']: + writeCropMarks(fid, drawing_code_crop, OriginX, OriginY, MaxXExtent, MaxYExtent) + + if config.Config['fiducialpoints']: + if ((layername=='*toplayer') or (layername=='*bottomlayer')): + writeFiducials(fid, drawing_code_fiducial_copper, OriginX, OriginY, MaxXExtent, MaxYExtent) + elif ((layername=='*topsoldermask') or (layername=='*bottomsoldermask')): + writeFiducials(fid, drawing_code_fiducial_soldermask, OriginX, OriginY, MaxXExtent, MaxYExtent) + + writeGerberFooter(fid) + fid.close() + + # Write board outline layer if selected + fullname = config.Config['outlinelayerfile'] + if fullname and fullname.lower() != "none": + OutputFiles.append(fullname) + #print 'Writing %s ...' % fullname + fid = file(fullname, 'wt') + writeGerberHeader(fid) + + # Write width-1 aperture to file + AP = aptable.Aperture(aptable.Circle, 'D10', 0.001) + AP.writeDef(fid) + + # Choose drawing aperture D10 + fid.write('D10*\n') + + # Draw the rectangle + fid.write('X%07dY%07dD02*\n' % (util.in2gerb(OriginX), util.in2gerb(OriginY))) # Bottom-left + fid.write('X%07dY%07dD01*\n' % (util.in2gerb(OriginX), util.in2gerb(MaxYExtent))) # Top-left + fid.write('X%07dY%07dD01*\n' % (util.in2gerb(MaxXExtent), util.in2gerb(MaxYExtent))) # Top-right + fid.write('X%07dY%07dD01*\n' % (util.in2gerb(MaxXExtent), util.in2gerb(OriginY))) # Bottom-right + fid.write('X%07dY%07dD01*\n' % (util.in2gerb(OriginX), util.in2gerb(OriginY))) # Bottom-left + + writeGerberFooter(fid) + fid.close() + + # Write scoring layer if selected + fullname = config.Config['scoringfile'] + if fullname and fullname.lower() != "none": + OutputFiles.append(fullname) + #print 'Writing %s ...' % fullname + fid = file(fullname, 'wt') + writeGerberHeader(fid) + + # Write width-1 aperture to file + AP = aptable.Aperture(aptable.Circle, 'D10', 0.001) + AP.writeDef(fid) + + # Choose drawing aperture D10 + fid.write('D10*\n') + + # Draw the scoring lines + scoring.writeScoring(fid, Place, OriginX, OriginY, MaxXExtent, MaxYExtent) + + writeGerberFooter(fid) + fid.close() + + # Get a list of all tools used by merging keys from each job's dictionary + # of tools. + if 0: + Tools = {} + for job in config.Jobs.values(): + for key in job.xcommands.keys(): + Tools[key] = 1 + + Tools = Tools.keys() + Tools.sort() + else: + toolNum = 0 + + # First construct global mapping of diameters to tool numbers + for job in config.Jobs.values(): + for tool,diam in job.xdiam.items(): + if config.GlobalToolRMap.has_key(diam): + continue + + toolNum += 1 + config.GlobalToolRMap[diam] = "T%02d" % toolNum + + # Cluster similar tool sizes to reduce number of drills + if config.Config['drillclustertolerance'] > 0: + config.GlobalToolRMap = drillcluster.cluster( config.GlobalToolRMap, config.Config['drillclustertolerance'] ) + drillcluster.remap( Place.jobs, config.GlobalToolRMap.items() ) + + # Now construct mapping of tool numbers to diameters + for diam,tool in config.GlobalToolRMap.items(): + config.GlobalToolMap[tool] = diam + + # Tools is just a list of tool names + Tools = config.GlobalToolMap.keys() + Tools.sort() + + fullname = config.Config['fabricationdrawingfile'] + if fullname and fullname.lower() != 'none': + if len(Tools) > strokes.MaxNumDrillTools: + raise RuntimeError, "Only %d different tool sizes supported for fabrication drawing." % strokes.MaxNumDrillTools + + OutputFiles.append(fullname) + #print 'Writing %s ...' % fullname + fid = file(fullname, 'wt') + writeGerberHeader(fid) + writeApertures(fid, {drawing_code1: None}) + fid.write('%s*\n' % drawing_code1) # Choose drawing aperture + + fabdrawing.writeFabDrawing(fid, Place, Tools, OriginX, OriginY, MaxXExtent, MaxYExtent) + + writeGerberFooter(fid) + fid.close() + + # Finally, print out the Excellon + try: + fullname = config.MergeOutputFiles['drills'] + except KeyError: + fullname = 'merged.drills.xln' + OutputFiles.append(fullname) + #print 'Writing %s ...' % fullname + fid = file(fullname, 'wt') + + writeExcellonHeader(fid) + + # Ensure each one of our tools is represented in the tool list specified + # by the user. + for tool in Tools: + try: + size = config.GlobalToolMap[tool] + except: + raise RuntimeError, "INTERNAL ERROR: Tool code %s not found in global tool map" % tool + + writeExcellonTool(fid, tool, size) + + #for row in Layout: + # row.writeExcellon(fid, size) + for job in Place.jobs: + job.writeExcellon(fid, size) + + writeExcellonFooter(fid) + fid.close() + + updateGUI("Closing files...") + + # Compute stats + jobarea = 0.0 + #for row in Layout: + # jobarea += row.jobarea() + for job in Place.jobs: + jobarea += job.jobarea() + + totalarea = ((MaxXExtent-OriginX)*(MaxYExtent-OriginY)) + + ToolStats = {} + drillhits = 0 + for tool in Tools: + ToolStats[tool]=0 + #for row in Layout: + # hits = row.drillhits(config.GlobalToolMap[tool]) + # ToolStats[tool] += hits + # drillhits += hits + for job in Place.jobs: + hits = job.drillhits(config.GlobalToolMap[tool]) + ToolStats[tool] += hits + drillhits += hits + + try: + fullname = config.MergeOutputFiles['toollist'] + except KeyError: + fullname = 'merged.toollist.drl' + OutputFiles.append(fullname) + #print 'Writing %s ...' % fullname + fid = file(fullname, 'wt') + + print '-'*50 + print ' Job Size : %f" x %f"' % (MaxXExtent-OriginX, MaxYExtent-OriginY) + print ' Job Area : %.2f sq. in.' % totalarea + print ' Area Usage : %.1f%%' % (jobarea/totalarea*100) + print ' Drill hits : %d' % drillhits + print 'Drill density : %.1f hits/sq.in.' % (drillhits/totalarea) + + print '\nTool List:' + smallestDrill = 999.9 + for tool in Tools: + if ToolStats[tool]: + fid.write('%s %.4fin\n' % (tool, config.GlobalToolMap[tool])) + print ' %s %.4f" %5d hits' % (tool, config.GlobalToolMap[tool], ToolStats[tool]) + smallestDrill = min(smallestDrill, config.GlobalToolMap[tool]) + + fid.close() + print "Smallest Tool: %.4fin" % smallestDrill + + print + print 'Output Files :' + for f in OutputFiles: + print ' ', f + + if (MaxXExtent-OriginX)>config.Config['panelwidth'] or (MaxYExtent-OriginY)>config.Config['panelheight']: + print '*'*75 + print '*' + print '* ERROR: Merged job exceeds panel dimensions of %.1f"x%.1f"' % (config.Config['panelwidth'],config.Config['panelheight']) + print '*' + print '*'*75 + sys.exit(1) + + # Done! + return 0 + +def updateGUI(text = None): + global GUI + if GUI != None: + GUI.updateProgress(text) + +if __name__=="__main__": + try: + opts, args = getopt.getopt(sys.argv[1:], 'hv', ['help', 'version', 'octagons=', 'random-search', 'full-search', 'rs-fsjobs=', 'search-timeout=', 'place-file=', 'no-trim-gerber', 'no-trim-excellon']) + except getopt.GetoptError: + usage() + + for opt, arg in opts: + if opt in ('-h', '--help'): + usage() + elif opt in ('-v', '--version'): + print """ +GerbMerge Version %d.%d -- Combine multiple Gerber/Excellon files + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of this license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" % (VERSION_MAJOR, VERSION_MINOR) + sys.exit(0) + elif opt in ('--octagons', '--random-search','--full-search','--rs-fsjobs','--place-file','--no-trim-gerber','--no-trim-excellon', '--search-timeout'): + pass ## arguments are valid + else: + raise RuntimeError, "Unknown option: %s" % opt + + if len(args) > 2 or len(args) < 1: + usage() + + disclaimer() + + sys.exit(merge(opts, args)) ## run germberge +# vim: expandtab ts=2 sw=2 ai syntax=python diff --git a/gerbmerge/jobs.py b/gerbmerge/jobs.py new file mode 100644 index 0000000..666afaf --- /dev/null +++ b/gerbmerge/jobs.py @@ -0,0 +1,1288 @@ +#!/usr/bin/env python +""" +This module reads all Gerber and Excellon files and stores the +data for each job. + +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import sys +import re +import string +import __builtin__ +import copy +import types + +import aptable +import config +import makestroke +import amacro +import geometry +import util + +# Parsing Gerber/Excellon files is currently very brittle. A more robust +# RS274X/Excellon parser would be a good idea and allow this program to work +# robustly with more than just Eagle CAM files. + +# Reminder to self: +# +# D01 -- move and draw line with exposure on +# D02 -- move with exposure off +# D03 -- flash aperture + +# Patterns for Gerber RS274X file interpretation +apdef_pat = re.compile(r'^%AD(D\d+)([^*$]+)\*%$') # Aperture definition +apmdef_pat = re.compile(r'^%AM([^*$]+)\*$') # Aperture macro definition +comment_pat = re.compile(r'G0?4[^*]*\*') # Comment (GerbTool comment omits the 0) +tool_pat = re.compile(r'(D\d+)\*') # Aperture selection +gcode_pat = re.compile(r'G(\d{1,2})\*?') # G-codes +drawXY_pat = re.compile(r'X([+-]?\d+)Y([+-]?\d+)D0?([123])\*') # Drawing command +drawX_pat = re.compile(r'X([+-]?\d+)D0?([123])\*') # Drawing command, Y is implied +drawY_pat = re.compile(r'Y([+-]?\d+)D0?([123])\*') # Drawing command, X is implied +format_pat = re.compile(r'%FS(L|T)?(A|I)(N\d+)?(X\d\d)(Y\d\d)\*%') # Format statement +layerpol_pat = re.compile(r'^%LP[CD]\*%') # Layer polarity (D=dark, C=clear) + +# Circular interpolation drawing commands (from Protel) +cdrawXY_pat = re.compile(r'X([+-]?\d+)Y([+-]?\d+)I([+-]?\d+)J([+-]?\d+)D0?([123])\*') +cdrawX_pat = re.compile(r'X([+-]?\d+)I([+-]?\d+)J([+-]?\d+)D0?([123])\*') # Y is implied +cdrawY_pat = re.compile(r'Y([+-]?\d+)I([+-]?\d+)J([+-]?\d+)D0?([123])\*') # X is implied + +IgnoreList = ( \ + # These are for Eagle, and RS274X files in general + re.compile(r'^%OFA0B0\*%$'), + re.compile(r'^%IPPOS\*%'), + re.compile(r'^%AMOC8\*$'), # Eagle's octagon defined by macro with a $1 parameter + re.compile(r'^5,1,8,0,0,1\.08239X\$1,22\.5\*$'), # Eagle's octagon, 22.5 degree rotation + re.compile(r'^5,1,8,0,0,1\.08239X\$1,0\.0\*$'), # Eagle's octagon, 0.0 degree rotation + re.compile(r'^\*?%$'), + re.compile(r'^M0?2\*$'), + + # These additional ones are for Orcad Layout, PCB, Protel, etc. + re.compile(r'\*'), # Empty statement + re.compile(r'^%IN.*\*%'), + re.compile(r'^%ICAS\*%'), # Not in RS274X spec. + re.compile(r'^%MOIN\*%'), + re.compile(r'^%ASAXBY\*%'), + re.compile(r'^%AD\*%'), # GerbTool empty aperture definition + re.compile(r'^%LN.*\*%') # Layer name + ) + +# Patterns for Excellon interpretation +xtool_pat = re.compile(r'^(T\d+)$') # Tool selection +xydraw_pat = re.compile(r'^X([+-]?\d+)Y([+-]?\d+)$') # Plunge command +xdraw_pat = re.compile(r'^X([+-]?\d+)$') # Plunge command, repeat last Y value +ydraw_pat = re.compile(r'^Y([+-]?\d+)$') # Plunge command, repeat last X value +xtdef_pat = re.compile(r'^(T\d+)(?:F\d+)?(?:S\d+)?C([0-9.]+)$') # Tool+diameter definition with optional + # feed/speed (for Protel) +xtdef2_pat = re.compile(r'^(T\d+)C([0-9.]+)(?:F\d+)?(?:S\d+)?$') # Tool+diameter definition with optional + # feed/speed at the end (for OrCAD) +xzsup_pat = re.compile(r'^INCH,([LT])Z$') # Leading/trailing zeros INCLUDED + +XIgnoreList = ( \ + re.compile(r'^%$'), + re.compile(r'^M30$'), # End of job + re.compile(r'^M48$'), # Program header to first % + re.compile(r'^M72$') # Inches + ) + +# A Job is a single input board. It is expected to have: +# - a board outline file in RS274X format +# - several (at least one) Gerber files in RS274X format +# - a drill file in Excellon format +# +# The board outline and Excellon filenames must be given separately. +# The board outline file determines the extents of the job. + +class Job: + def __init__(self, name): + self.name = name + + # Minimum and maximum (X,Y) absolute co-ordinates encountered + # in GERBER data only (not Excellon). Note that coordinates + # are stored in hundred-thousandsths of an inch so 9999999 is 99.99999 + # inches. + self.maxx = self.maxy = -9999999 # in the case all coordinates are < 0, this will prevent maxx and maxy from defaulting to 0 + self.minx = self.miny = 9999999 + + # Aperture translation table relative to GAT. This dictionary + # has as each key a layer name for the job. Each key's value + # is itself a dictionary where each key is an aperture in the file. + # The value is the key in the GAT. Example: + # apxlat['TopCopper']['D10'] = 'D12' + # apxlat['TopCopper']['D11'] = 'D15' + # apxlat['BottomCopper']['D10'] = 'D15' + self.apxlat = {} + + # Aperture macro translation table relative to GAMT. This dictionary + # has as each key a layer name for the job. Each key's value + # is itself a dictionary where each key is an aperture macro name in the file. + # The value is the key in the GAMT. Example: + # apxlat['TopCopper']['THD10X'] = 'M1' + # apxlat['BottomCopper']['AND10'] = 'M5' + self.apmxlat = {} + + # Commands are one of: + # A. strings for: + # - aperture changes like "D12" + # - G-code commands like "G36" + # - RS-274X commands like "%LPD*%" that begin with '%' + # B. (X,Y,D) triples comprising X,Y integers in the range 0 through 999999 + # and draw commands that are either D01, D02, or D03. The character + # D in the triple above is the integer 1, 2, or 3. + # C. (X,Y,I,J,D,s) 6-tuples comprising X,Y,I,J integers in the range 0 through 999999 + # and D as with (X,Y,D) triples. The 's' integer is non-zero to indicate that + # the (I,J) tuple is a SIGNED offset (for multi-quadrant circular interpolation) + # else the tuple is unsigned. + # + # This variable is, as for apxlat, a dictionary keyed by layer name. + self.commands = {} + + # This dictionary stores all GLOBAL apertures actually needed by this + # layer, i.e., apertures specified prior to draw commands. The dictionary + # is indexed by layer name, and each dictionary entry is a list of aperture + # code strings, like 'D12'. This dictionary helps us to figure out the + # minimum number of apertures that need to be written out in the Gerber + # header of the merged file. Once again, the list of apertures refers to + # GLOBAL aperture codes in the GAT, not ones local to this layer. + self.apertures = {} + + # Excellon commands are grouped by tool number in a dictionary. + # This is to help sorting all jobs and writing out all plunge + # commands for a single tool. + # + # The key to this dictionary is the full tool name, e.g., T03 + # as a string. Each command is an (X,Y) integer tuple. + self.xcommands = {} + + # This is a dictionary mapping LOCAL tool names (e.g., T03) to diameters + # in inches for THIS JOB. This dictionary will be initially empty + # for old-style Excellon files with no embedded tool sizes. The + # main program will construct this dictionary from the global tool + # table in this case, once all jobs have been read in. + self.xdiam = {} + + # This is a mapping from tool name to diameter for THIS JOB + self.ToolList = None + + # How many times to replicate this job if using auto-placement + self.Repeat = 1 + + # How many decimal digits of precision there are in the Excellon file. + # A value greater than 0 overrides the global ExcellonDecimals setting + # for this file, allowing jobs with different Excellon decimal settings + # to be combined. + self.ExcellonDecimals = 0 # 0 means global value prevails + + def width_in(self): + "Return width in INCHES" + return float(self.maxx-self.minx)*0.00001 + + def height_in(self): + "Return height in INCHES" + return float(self.maxy-self.miny)*0.00001 + + def jobarea(self): + return self.width_in()*self.height_in() + + def maxdimension(self): + return max(self.width_in(),self.height_in()) + + def mincoordinates(self): + "Return minimum X and Y coordinate" + + return self.minx, self.miny + + def fixcoordinates(self, x_shift, y_shift): + "Add x_shift and y_shift to all coordinates in the job" + + # Shift maximum and minimum coordinates + self.minx += x_shift + self.maxx += x_shift + self.miny += y_shift + self.maxy += y_shift + + # Shift all commands + for layer, command in self.commands.iteritems(): + + # Loop through each command in each layer + for index in range( len(command) ): + c = command[index] + + # Shift X and Y coordinate of command + if type(c) == types.TupleType: ## ensure that command is of type tuple + command_list = list(c) ## convert tuple to list + if (type( command_list[0] ) == types.IntType) \ + and (type( command_list[1] ) == types.IntType): ## ensure that first two elemenst are integers + command_list[0] += x_shift + command_list[1] += y_shift + command[index] = tuple(command_list) ## convert list back to tuple + + self.commands[layer] = command ## set modified command + + # Shift all excellon commands + for tool, command in self.xcommands.iteritems(): + + # Loop through each command in each layer + for index in range( len(command) ): + c = command[index] + + # Shift X and Y coordinate of command + command_list = list(c) ## convert tuple to list + if ( type( command_list[0] ) == types.IntType ) \ + and ( type( command_list[1] ) == types.IntType ): ## ensure that first two elemenst are integers + command_list[0] += x_shift / 10 + command_list[1] += y_shift / 10 + command[index] = tuple(command_list) ## convert list back to tuple + + self.xcommands[tool] = command ## set modified command + + def parseGerber(self, fullname, layername, updateExtents = 0): + """Do the dirty work. Read the Gerber file given the + global aperture table GAT and global aperture macro table GAMT""" + + GAT = config.GAT + GAMT = config.GAMT + # First construct reverse GAT/GAMT, mapping definition to code + RevGAT = config.buildRevDict(GAT) # RevGAT[hash] = aperturename + RevGAMT = config.buildRevDict(GAMT) # RevGAMT[hash] = aperturemacroname + + #print 'Reading data from %s ...' % fullname + + fid = file(fullname, 'rt') + currtool = None + + self.apxlat[layername] = {} + self.apmxlat[layername] = {} + self.commands[layername] = [] + self.apertures[layername] = [] + + # These divisors are used to scale (X,Y) co-ordinates. We store + # everything as integers in hundred-thousandths of an inch (i.e., M.5 + # format). If we get something in M.4 format, we must multiply by + # 10. If we get something in M.6 format we must divide by 10, etc. + x_div = 1.0 + y_div = 1.0 + + # Drawing commands can be repeated with X or Y omitted if they are + # the same as before. These variables store the last X/Y value as + # integers in hundred-thousandths of an inch. + last_x = last_y = 0 + + # Last modal G-code. Some G-codes introduce "modes", such as circular interpolation + # mode, and we want to remember what mode we're in. We're interested in: + # G01 -- linear interpolation, cancels all circular interpolation modes + # G36 -- Turn on polygon area fill + # G37 -- Turn off polygon area fill + last_gmode = 1 # G01 by default, linear interpolation + + # We want to know whether to do signed (G75) or unsigned (G74) I/J offsets. These + # modes are independent of G01/G02/G03, e.g., Protel will issue multiple G03/G01 + # codes all in G75 mode. + # G74 -- Single-quadrant circular interpolation (disables multi-quadrant interpolation) + # G02/G03 codes set clockwise/counterclockwise arcs in a single quadrant only + # using X/Y/I/J commands with UNSIGNED (I,J). + # G75 -- Multi-quadrant circular interpolation --> X/Y/I/J with signed (I,J) + # G02/G03 codes set clockwise/counterclockwise arcs in all 4 quadrants + # using X/Y/I/J commands with SIGNED (I,J). + circ_signed = True # Assume G75...make sure this matches canned header we write out + + # If the very first flash/draw is a shorthand command (i.e., without an Xxxxx or Yxxxx) + # component then we don't really "see" the first point X00000Y00000. To account for this + # we use the following Boolean flag as well as the isLastShorthand flag during parsing + # to manually insert the point X000000Y00000 into the command stream. + firstFlash = True + + for line in fid: + # Get rid of CR characters (0x0D) and leading/trailing blanks + line = string.replace(line, '\x0D', '').strip() + + # Old location of format_pat search. Now moved down into the sub-line parse loop below. + + # RS-274X statement? If so, echo it. Currently, only the "LP" statement is expected + # (from Protel, of course). These will be distinguished from D-code and G-code + # commands by the fact that the first character of the string is '%'. + match = layerpol_pat.match(line) + if match: + self.commands[layername].append(line) + continue + + # See if this is an aperture definition, and if so, map it. + match = apdef_pat.match(line) + if match: + if currtool: + raise RuntimeError, "File %s has an aperture definition that comes after drawing commands." % fullname + + A = aptable.parseAperture(line, self.apmxlat[layername]) + if not A: + raise RuntimeError, "Unknown aperture definition in file %s" % fullname + + hash = A.hash() + if not RevGAT.has_key(hash): + #print line + #print self.apmxlat + #print RevGAT + raise RuntimeError, 'File %s has aperture definition "%s" not in global aperture table.' % (fullname, hash) + + # This says that all draw commands with this aperture code will + # be replaced by aperture self.apxlat[layername][code]. + self.apxlat[layername][A.code] = RevGAT[hash] + continue + + # Ignore %AMOC8* from Eagle for now as it uses a macro parameter, which + # is not yet supported in GerbMerge. + if line[:7]=='%AMOC8*': + continue + + # See if this is an aperture macro definition, and if so, map it. + M = amacro.parseApertureMacro(line,fid) + if M: + if currtool: + raise RuntimeError, "File %s has an aperture macro definition that comes after drawing commands." % fullname + + hash = M.hash() + if not RevGAMT.has_key(hash): + raise RuntimeError, 'File %s has aperture macro definition not in global aperture macro table:\n%s' % (fullname, hash) + + # This says that all aperture definition commands that reference this macro name + # will be replaced by aperture macro name self.apmxlat[layername][macroname]. + self.apmxlat[layername][M.name] = RevGAMT[hash] + continue + + # From this point on we may have more than one match on this line, e.g.: + # G54D11*X22400Y22300D02*X22500Y22200D01* + sub_line = line + while sub_line: + # Handle "comment" G-codes first + match = comment_pat.match(sub_line) + if match: + sub_line = sub_line[match.end():] + continue + + # See if this is a format statement, and if so, map it. In version 1.3 this was moved down + # from the line-only parse checks above (see comment) to handle OrCAD lines like + # G74*%FSLAN2X34Y34*% + match = format_pat.match(sub_line) # Used to be format_pat.search + if match: + sub_line = sub_line[match.end():] + for item in match.groups(): + if item is None: continue # Optional group didn't match + + if item[0] in "LA": # omit leading zeroes and absolute co-ordinates + continue + + if item[0]=='T': # omit trailing zeroes + raise RuntimeError, "Trailing zeroes not supported in RS274X files" + if item[0]=='I': # incremental co-ordinates + raise RuntimeError, "Incremental co-ordinates not supported in RS274X files" + + if item[0]=='N': # Maximum digits for N* commands...ignore it + continue + + if item[0]=='X': # M.N specification for X-axis. + fracpart = int(item[2]) + x_div = 10.0**(5-fracpart) + if item[0]=='Y': # M.N specification for Y-axis. + fracpart = int(item[2]) + y_div = 10.0**(5-fracpart) + continue + + # Parse and interpret G-codes + match = gcode_pat.match(sub_line) + if match: + sub_line = sub_line[match.end():] + gcode = int(match.group(1)) + + # Determine if this is a G-Code that should be ignored because it has no effect + # (e.g., G70 specifies "inches" which is already in effect). + if gcode in [54, 70, 90]: + continue + + # Determine if this is a G-Code that we have to emit because it matters. + if gcode in [1, 2, 3, 36, 37, 74, 75]: + self.commands[layername].append("G%02d" % gcode) + + # Determine if this is a G-code that sets a new mode + if gcode in [1, 36, 37]: + last_gmode = gcode + + # Remember last G74/G75 code so we know whether to do signed or unsigned I/J + # offsets. + if gcode==74: + circ_signed = False + elif gcode==75: + circ_signed = True + + continue + + raise RuntimeError, "G-Code 'G%02d' is not supported" % gcode + + # See if this is a tool change (aperture change) command + match = tool_pat.match(sub_line) + if match: + currtool = match.group(1) + + # Protel likes to issue random D01, D02, and D03 commands instead of aperture + # codes. We can ignore D01 because it simply means to move to the current location + # while drawing. Well, that's drawing a point. We can ignore D02 because it means + # to move to the current location without drawing. Truly pointless. We do NOT want + # to ignore D03 because it implies a flash. Protel very inefficiently issues a D02 + # move to a location without drawing, then a single-line D03 to flash. However, a D02 + # terminates a polygon in G36 mode, so keep D02's in this case. + if currtool=='D01' or (currtool=='D02' and (last_gmode != 36)): + sub_line = sub_line[match.end():] + continue + + if (currtool == 'D03') or (currtool=='D02' and (last_gmode == 36)): + self.commands[layername].append(currtool) + sub_line = sub_line[match.end():] + continue + + # Map it using our translation table + if not self.apxlat[layername].has_key(currtool): + raise RuntimeError, 'File %s has tool change command "%s" with no corresponding translation' % (fullname, currtool) + + currtool = self.apxlat[layername][currtool] + + # Add it to the list of things to write out + self.commands[layername].append(currtool) + + # Add it to the list of all apertures needed by this layer + self.apertures[layername].append(currtool) + + # Move on to next match, if any + sub_line = sub_line[match.end():] + continue + + # Is it a simple draw command? + I = J = None # For circular interpolation drawing commands + match = drawXY_pat.match(sub_line) + isLastShorthand = False # By default assume we don't make use of last_x and last_y + if match: + x, y, d = map(__builtin__.int, match.groups()) + else: + match = drawX_pat.match(sub_line) + if match: + x, d = map(__builtin__.int, match.groups()) + y = last_y + isLastShorthand = True # Indicate we're making use of last_x/last_y + else: + match = drawY_pat.match(sub_line) + if match: + y, d = map(__builtin__.int, match.groups()) + x = last_x + isLastShorthand = True # Indicate we're making use of last_x/last_y + + # Maybe it's a circular interpolation draw command with IJ components + if match is None: + match = cdrawXY_pat.match(sub_line) + if match: + x, y, I, J, d = map(__builtin__.int, match.groups()) + else: + match = cdrawX_pat.match(sub_line) + if match: + x, I, J, d = map(__builtin__.int, match.groups()) + y = last_y + isLastShorthand = True # Indicate we're making use of last_x/last_y + else: + match = cdrawY_pat.match(sub_line) + if match: + y, I, J, d = map(__builtin__.int, match.groups()) + x = last_x + isLastShorthand = True # Indicate we're making use of last_x/last_y + + if match: + if currtool is None: + # It's OK if this is an exposure-off movement command (specified with D02). + # It's also OK if we're in the middle of a G36 polygon fill as we're only defining + # the polygon extents. + if (d != 2) and (last_gmode != 36): + raise RuntimeError, 'File %s has draw command %s with no aperture chosen' % (fullname, sub_line) + + # Save last_x/y BEFORE scaling to 2.5 format else subsequent single-ordinate + # flashes (e.g., Y with no X) will be scaled twice! + last_x = x + last_y = y + + # Corner case: if this is the first flash/draw and we are using shorthand (i.e., missing Xxxx + # or Yxxxxx) then prepend the point X0000Y0000 into the commands as it is actually the starting + # point of our layer. We prepend the command X0000Y0000D02, i.e., a move to (0,0) without drawing. + if (isLastShorthand and firstFlash): + self.commands[layername].append((0,0,2)) + if updateExtents: + self.minx = min(self.minx,0) + self.maxx = max(self.maxx,0) + self.miny = min(self.miny,0) + self.maxy = max(self.maxy,0) + + x = int(round(x*x_div)) + y = int(round(y*y_div)) + if I is not None: + I = int(round(I*x_div)) + J = int(round(J*y_div)) + self.commands[layername].append((x,y,I,J,d,circ_signed)) + else: + self.commands[layername].append((x,y,d)) + firstFlash = False + + # Update dimensions...this is complicated for circular interpolation commands + # that span more than one quadrant. For now, we ignore this problem since users + # should be using a border layer to indicate extents. + if updateExtents: + if x < self.minx: self.minx = x + if x > self.maxx: self.maxx = x + if y < self.miny: self.miny = y + if y > self.maxy: self.maxy = y + + # Move on to next match, if any + sub_line = sub_line[match.end():] + continue + + # If it's none of the above, it had better be on our ignore list. + for pat in IgnoreList: + match = pat.match(sub_line) + if match: + break + else: + raise RuntimeError, 'File %s has uninterpretable line:\n %s' % (fullname, line) + + sub_line = sub_line[match.end():] + # end while still things to match on this line + # end of for each line in file + + fid.close() + if 0: + print layername + print self.commands[layername] + + def parseExcellon(self, fullname): + #print 'Reading data from %s ...' % fullname + + fid = file(fullname, 'rt') + currtool = None + suppress_leading = True # Suppress leading zeros by default, equivalent to 'INCH,TZ' + + # We store Excellon X/Y data in ten-thousandths of an inch. If the Config + # option ExcellonDecimals is not 4, we must adjust the values read from the + # file by a divisor to convert to ten-thousandths. This is only used in + # leading-zero suppression mode. In trailing-zero suppression mode, we must + # trailing-zero-pad all input integers to M+N digits (e.g., 6 digits for 2.4 mode) + # specified by the 'zeropadto' variable. + if self.ExcellonDecimals > 0: + divisor = 10.0**(4 - self.ExcellonDecimals) + zeropadto = 2+self.ExcellonDecimals + else: + divisor = 10.0**(4 - config.Config['excellondecimals']) + zeropadto = 2+config.Config['excellondecimals'] + + # Protel takes advantage of optional X/Y components when the previous one is the same, + # so we have to remember them. + last_x = last_y = 0 + + # Helper function to convert X/Y strings into integers in units of ten-thousandth of an inch. + def xln2tenthou(L, divisor=divisor, zeropadto=zeropadto): + V = [] + for s in L: + if not suppress_leading: + s = s + '0'*(zeropadto-len(s)) + V.append(int(round(int(s)*divisor))) + return tuple(V) + + for line in fid.xreadlines(): + # Get rid of CR characters + line = string.replace(line, '\x0D', '') + + # Protel likes to embed comment lines beginning with ';' + if line[0]==';': + continue + + # Check for leading/trailing zeros included ("INCH,LZ" or "INCH,TZ") + match = xzsup_pat.match(line) + if match: + if match.group(1)=='L': + # LZ --> Leading zeros INCLUDED + suppress_leading = False + else: + # TZ --> Trailing zeros INCLUDED + suppress_leading = True + continue + + # See if a tool is being defined. First try to match with tool name+size + match = xtdef_pat.match(line) # xtdef_pat and xtdef2_pat expect tool name and diameter + if match is None: # but xtdef_pat expects optional feed/speed between T and C + match = xtdef2_pat.match(line) # and xtdef_2pat expects feed/speed at the end + if match: + currtool, diam = match.groups() + try: + diam = float(diam) + except: + raise RuntimeError, "File %s has illegal tool diameter '%s'" % (fullname, diam) + + # Canonicalize tool number because Protel (of course) sometimes specifies it + # as T01 and sometimes as T1. We canonicalize to T01. + currtool = 'T%02d' % int(currtool[1:]) + + if self.xdiam.has_key(currtool): + raise RuntimeError, "File %s defines tool %s more than once" % (fullname, currtool) + self.xdiam[currtool] = diam + continue + + # Didn't match TxxxCyyy. It could be a tool change command 'Tdd'. + match = xtool_pat.match(line) + if match: + currtool = match.group(1) + + # Canonicalize tool number because Protel (of course) sometimes specifies it + # as T01 and sometimes as T1. We canonicalize to T01. + currtool = 'T%02d' % int(currtool[1:]) + + # Diameter will be obtained from embedded tool definition, local tool list or if not found, the global tool list + try: + diam = self.xdiam[currtool] + except: + if self.ToolList: + try: + diam = self.ToolList[currtool] + except: + raise RuntimeError, "File %s uses tool code %s that is not defined in the job's tool list" % (fullname, currtool) + else: + try: + diam = config.DefaultToolList[currtool] + except: + #print config.DefaultToolList + raise RuntimeError, "File %s uses tool code %s that is not defined in default tool list" % (fullname, currtool) + + self.xdiam[currtool] = diam + continue + + # Plunge command? + match = xydraw_pat.match(line) + if match: + x, y = xln2tenthou(match.groups()) + else: + match = xdraw_pat.match(line) + if match: + x = xln2tenthou(match.groups())[0] + y = last_y + else: + match = ydraw_pat.match(line) + if match: + y = xln2tenthou(match.groups())[0] + x = last_x + + if match: + if currtool is None: + raise RuntimeError, 'File %s has plunge command without previous tool selection' % fullname + + try: + self.xcommands[currtool].append((x,y)) + except KeyError: + self.xcommands[currtool] = [(x,y)] + + last_x = x + last_y = y + continue + + # It had better be an ignorable + for pat in XIgnoreList: + if pat.match(line): + break + else: + raise RuntimeError, 'File %s has uninterpretable line:\n %s' % (fullname, line) + + def hasLayer(self, layername): + return self.commands.has_key(layername) + + def writeGerber(self, fid, layername, Xoff, Yoff): + "Write out the data such that the lower-left corner of this job is at the given (X,Y) position, in inches" + + # Maybe we don't have this layer + if not self.hasLayer(layername): return + + # First convert given inches to 2.5 co-ordinates + X = int(round(Xoff/0.00001)) + Y = int(round(Yoff/0.00001)) + + # Now calculate displacement for each position so that we end up at specified origin + DX = X - self.minx + DY = Y - self.miny + + # Rock and roll. First, write out a dummy flash using code D02 + # (exposure off). This prevents an unintentional draw from the end + # of one job to the beginning of the next when a layer is repeated + # due to panelizing. + fid.write('X%07dY%07dD02*\n' % (X, Y)) + for cmd in self.commands[layername]: + if type(cmd) is types.TupleType: + if len(cmd)==3: + x, y, d = cmd + fid.write('X%07dY%07dD%02d*\n' % (x+DX, y+DY, d)) + else: + x, y, I, J, d, s = cmd + fid.write('X%07dY%07dI%07dJ%07dD%02d*\n' % (x+DX, y+DY, I, J, d)) # I,J are relative + else: + # It's an aperture change, G-code, or RS274-X command that begins with '%'. If + # it's an aperture code, the aperture has already been translated + # to the global aperture table during the parse phase. + if cmd[0]=='%': + fid.write('%s\n' % cmd) # The command already has a * in it (e.g., "%LPD*%") + else: + fid.write('%s*\n' % cmd) + + def findTools(self, diameter): + "Find the tools, if any, with the given diameter in inches. There may be more than one!" + L = [] + for tool, diam in self.xdiam.items(): + if diam==diameter: + L.append(tool) + return L + + def writeExcellon(self, fid, diameter, Xoff, Yoff): + "Write out the data such that the lower-left corner of this job is at the given (X,Y) position, in inches" + + # First convert given inches to 2.4 co-ordinates. Note that Gerber is 2.5 (as of GerbMerge 1.2) + # and our internal Excellon representation is 2.4 as of GerbMerge + # version 0.91. We use X,Y to calculate DX,DY in 2.4 units (i.e., with a + # resolution of 0.0001". + X = int(round(Xoff/0.00001)) # First work in 2.5 format to match Gerber + Y = int(round(Yoff/0.00001)) + + # Now calculate displacement for each position so that we end up at specified origin + DX = X - self.minx + DY = Y - self.miny + + # Now round down to 2.4 format + DX = int(round(DX/10.0)) + DY = int(round(DY/10.0)) + + ltools = self.findTools(diameter) + + if config.Config['excellonleadingzeros']: + fmtstr = 'X%06dY%06d\n' + else: + fmtstr = 'X%dY%d\n' + + # Boogie + for ltool in ltools: + if self.xcommands.has_key(ltool): + for cmd in self.xcommands[ltool]: + x, y = cmd + fid.write(fmtstr % (x+DX, y+DY)) + + def writeDrillHits(self, fid, diameter, toolNum, Xoff, Yoff): + """Write a drill hit pattern. diameter is tool diameter in inches, while toolNum is + an integer index into strokes.DrillStrokeList""" + + # First convert given inches to 2.5 co-ordinates + X = int(round(Xoff/0.00001)) + Y = int(round(Yoff/0.00001)) + + # Now calculate displacement for each position so that we end up at specified origin + DX = X - self.minx + DY = Y - self.miny + + # Do NOT round down to 2.4 format. These drill hits are in Gerber 2.5 format, not + # Excellon plunge commands. + + ltools = self.findTools(diameter) + + for ltool in ltools: + if self.xcommands.has_key(ltool): + for cmd in self.xcommands[ltool]: + x, y = cmd + makestroke.drawDrillHit(fid, 10*x+DX, 10*y+DY, toolNum) + + def aperturesAndMacros(self, layername): + "Return dictionaries whose keys are all necessary aperture names and macro names for this layer" + + GAT=config.GAT + + if self.apertures.has_key(layername): + apdict = {}.fromkeys(self.apertures[layername]) + apmlist = [GAT[ap].dimx for ap in self.apertures[layername] if GAT[ap].apname=='Macro'] + apmdict = {}.fromkeys(apmlist) + + return apdict, apmdict + else: + return {}, {} + + def makeLocalApertureCode(self, layername, AP): + "Find or create a layer-specific aperture code to represent the global aperture given" + if AP.code not in self.apxlat[layername].values(): + lastCode = aptable.findHighestApertureCode(self.apxlat[layername].keys()) + localCode = 'D%d' % (lastCode+1) + self.apxlat[layername][localCode] = AP.code + + def inBorders(self, x, y): + return (x >= self.minx) and (x <= self.maxx) and (y >= self.miny) and (y <= self.maxy) + + def trimGerberLayer(self, layername): + "Modify drawing commands that are outside job dimensions" + + newcmds = [] + lastInBorders = True + lastx, lasty, lastd = self.minx, self.miny, 2 # (minx,miny,exposure off) + bordersRect = (self.minx, self.miny, self.maxx, self.maxy) + lastAperture = None + + for cmd in self.commands[layername]: + if type(cmd) == types.TupleType: + # It is a data command: tuple (X, Y, D), all integers, or (X, Y, I, J, D), all integers. + if len(cmd)==3: + x, y, d = cmd + # I=J=None # In case we support circular interpolation in the future + else: + # We don't do anything with circular interpolation for now, so just issue + # the command and be done with it. + # x, y, I, J, d, s = cmd + newcmds.append(cmd) + continue + + newInBorders = self.inBorders(x,y) + + # Flash commands are easy (for now). If they're outside borders, + # ignore them. There's no need to consider the previous command. + # What should we do if the flash is partially inside and partially + # outside the border? Ideally, define a macro that constructs the + # part of the flash that is inside the border. Practically, you've + # got to be kidding. + # + # Actually, it's not that tough for rectangle apertures. We identify + # the intersection rectangle of the aperture and the bounding box, + # determine the new rectangular aperture required along with the + # new flash point, add the aperture to the GAT if necessary, and + # make the change. Spiffy. + # + # For circular interpolation commands, it's definitely harder since + # we have to construct arcs that are a subset of the original arc. + # + # For polygon fills, we similarly have to break up the polygon into + # sub-polygons that are contained within the allowable extents. + # + # Both circular interpolation and polygon fills are a) uncommon, + # and b) hard to handle. The current version of GerbMerge does not + # handle these cases. + if d==3: + if lastAperture.isRectangle(): + apertureRect = lastAperture.rectangleAsRect(x,y) + if geometry.isRect1InRect2(apertureRect, bordersRect): + newcmds.append(cmd) + else: + newRect = geometry.intersectExtents(apertureRect, bordersRect) + + if newRect: + newRectWidth = geometry.rectWidth(newRect) + newRectHeight = geometry.rectHeight(newRect) + newX, newY = geometry.rectCenter(newRect) + + # We arbitrarily remove all flashes that lead to rectangles + # with a width or length less than 1 mil (10 Gerber units). + # Should we make this configurable? + if min(newRectWidth, newRectHeight) >= 10: + # Construct an Aperture that is a Rectangle of dimensions (newRectWidth,newRectHeight) + newAP = aptable.Aperture(aptable.Rectangle, 'D??', \ + util.gerb2in(newRectWidth), util.gerb2in(newRectHeight)) + global_code = aptable.findOrAddAperture(newAP) + + # We need an unused local aperture code to correspond to this newly-created global one. + self.makeLocalApertureCode(layername, newAP) + + # Make sure to indicate that the new aperture is one that is used by this layer + if global_code not in self.apertures[layername]: + self.apertures[layername].append(global_code) + + # Switch to new aperture code, flash new aperture, switch back to previous aperture code + newcmds.append(global_code) + newcmds.append((newX, newY, 3)) + newcmds.append(lastAperture.code) + else: + pass # Ignore this flash...area in common is too thin + else: + pass # Ignore this flash...no area in common + elif self.inBorders(x, y): + # Aperture is not a rectangle and its center is somewhere within our + # borders. Flash it and ignore part outside borders (for now). + newcmds.append(cmd) + else: + pass # Ignore this flash + + # If this is a exposure off command, then it doesn't matter what the + # previous command is. This command just updates the (X,Y) position + # and sets the start point for a line draw to a new location. + elif d==2: + if self.inBorders(x, y): + newcmds.append(cmd) + + else: + # This is an exposure on (draw line) command. Now things get interesting. + # Regardless of what the last command was (draw, exposure off, flash), we + # are planning on drawing a visible line using the current aperture from + # the (lastx,lasty) position to the new (x,y) position. The cases are: + # A: (lastx,lasty) is outside borders, (x,y) is outside borders. + # (lastx,lasty) have already been eliminated. Just update (lastx,lasty) + # with new (x,y) and remove the new command too. There is one case which + # may be of concern, and that is when the line defined by (lastx,lasty)-(x,y) + # actually crosses through the job. In this case, we have to draw the + # partial line (x1,y1)-(x2,y2) where (x1,y1) and (x2,y2) lie on the + # borders. We will add 3 commands: + # X(x1)Y(y1)D02 # exposure off + # X(x2)Y(y2)D01 # exposure on + # X(x)Y(y)D02 # exposure off + # + # B: (lastx,lasty) is outside borders, (x,y) is inside borders. + # We have to find the intersection of the line (lastx,lasty)-(x,y) + # with the borders and draw only the line segment (x1,y1)-(x,y): + # X(x1)Y(y1)D02 # exposure off + # X(x)Y(y)D01 # exposure on + # + # C: (lastx,lasty) is inside borders, (x,y) is outside borders. + # We have to find the intersection of the line (lastx,lasty)-(x,y) + # with the borders and draw only the line segment (lastx,lasty)-(x1,y1): + # then update to the new position: + # X(x1)Y(y1)D01 # exposure on + # X(x)Y(y)D02 # exposure off + # + # D: (lastx,lasty) is inside borders, (x,y) is inside borders. This is + # the most common and simplest case...just copy the command over: + # X(x)Y(y)D01 # exposure on + # + # All of the above are for linear interpolation. Circular interpolation + # is ignored for now. + if lastInBorders and newInBorders: # Case D + newcmds.append(cmd) + + else: + # segmentXbox() returns a list of 0, 1, or 2 points describing the intersection + # points of the segment (lastx,lasty)-(x,y) with the box defined + # by lower-left corner (minx,miny) and upper-right corner (maxx,maxy). + pointsL = geometry.segmentXbox((lastx,lasty), (x,y), (self.minx,self.miny), (self.maxx,self.maxy)) + + if len(pointsL)==0: # Case A, no intersection + # Both points are outside the box and there is no overlap with box. + d = 2 # Command is effectively removed since newcmds wasn't extended. + # Ensure "last command" is exposure off to reflect this. + + elif len(pointsL)==1: # Cases B and C + pt1 = pointsL[0] + if newInBorders: # Case B + newcmds.append((pt1[0], pt1[1], 2)) # Go to intersection point, exposure off + newcmds.append(cmd) # Go to destination point, exposure on + else: # Case C + newcmds.append((pt1[0], pt1[1], 1)) # Go to intersection point, exposure on + newcmds.append((x, y, 2)) # Go to destination point, exposure off + d = 2 # Make next 'lastd' represent exposure off + + else: # Case A, two points of intersection + pt1 = pointsL[0] + pt2 = pointsL[1] + + newcmds.append((pt1[0], pt1[1], 2)) # Go to first intersection point, exposure off + newcmds.append((pt2[0], pt2[1], 1)) # Draw to second intersection point, exposure on + newcmds.append((x, y, 2)) # Go to destination point, exposure off + d = 2 # Make next 'lastd' represent exposure off + + lastx, lasty, lastd = x, y, d + lastInBorders = newInBorders + else: + # It's a string indicating an aperture change, G-code, or RS-274X + # command (e.g., "D13", "G75", "%LPD*%") + newcmds.append(cmd) + if cmd[0]=='D' and int(cmd[1:])>=10: # Don't interpret D01, D02, D03 + lastAperture = config.GAT[cmd] + + self.commands[layername] = newcmds + + def trimGerber(self): + for layername in self.commands.keys(): + self.trimGerberLayer(layername) + + def trimExcellon(self): + "Remove plunge commands that are outside job dimensions" + keys = self.xcommands.keys() + for toolname in keys: + # Remember Excellon is 2.4 format while Gerber data is 2.5 format + validList = [(x,y) for x,y in self.xcommands[toolname] if self.inBorders(10*x,10*y)] + + if validList: + self.xcommands[toolname] = validList + else: + del self.xcommands[toolname] + del self.xdiam[toolname] + +# This class encapsulates a Job object, providing absolute +# positioning information. +class JobLayout: + def __init__(self, job): + self.job = job + self.x = None + self.y = None + + def canonicalize(self): # Must return a JobLayout object as a list + return [self] + + def writeGerber(self, fid, layername): + assert self.x is not None + self.job.writeGerber(fid, layername, self.x, self.y) + + def aperturesAndMacros(self, layername): + return self.job.aperturesAndMacros(layername) + + def writeExcellon(self, fid, diameter): + assert self.x is not None + self.job.writeExcellon(fid, diameter, self.x, self.y) + + def writeDrillHits(self, fid, diameter, toolNum): + assert self.x is not None + self.job.writeDrillHits(fid, diameter, toolNum, self.x, self.y) + + def writeCutLines(self, fid, drawing_code, X1, Y1, X2, Y2): + """Draw a board outline using the given aperture code""" + def notEdge(x, X): + return round(abs(1000*(x-X))) + + assert self.x and self.y + + radius = config.GAT[drawing_code].dimx/2.0 + + # Start at lower-left, proceed clockwise + x = self.x - radius + y = self.y - radius + + left = notEdge(self.x, X1) + right = notEdge(self.x+self.width_in(), X2) + bot = notEdge(self.y, Y1) + top = notEdge(self.y+self.height_in(), Y2) + + BL = ((x), (y)) + TL = ((x), (y+self.height_in()+2*radius)) + TR = ((x+self.width_in()+2*radius), (y+self.height_in()+2*radius)) + BR = ((x+self.width_in()+2*radius), (y)) + + if not left: + BL = (BL[0]+2*radius, BL[1]) + TL = (TL[0]+2*radius, TL[1]) + + if not top: + TL = (TL[0], TL[1]-2*radius) + TR = (TR[0], TR[1]-2*radius) + + if not right: + TR = (TR[0]-2*radius, TR[1]) + BR = (BR[0]-2*radius, BR[1]) + + if not bot: + BL = (BL[0], BL[1]+2*radius) + BR = (BR[0], BR[1]+2*radius) + + BL = (util.in2gerb(BL[0]), util.in2gerb(BL[1])) + TL = (util.in2gerb(TL[0]), util.in2gerb(TL[1])) + TR = (util.in2gerb(TR[0]), util.in2gerb(TR[1])) + BR = (util.in2gerb(BR[0]), util.in2gerb(BR[1])) + + # The "if 1 or ..." construct draws all four sides of the job. By + # removing the 1 from the expression, only the sides that do not + # correspond to panel edges are drawn. The former is probably better + # since panels tend to have a little slop from the cutting operation + # and it's easier to just cut it smaller when there's a cut line. + # The way it is now with "if 1 or....", much of this function is + # unnecessary. Heck, we could even just use the boardoutline layer + # directly. + if 1 or left: + fid.write('X%07dY%07dD02*\n' % BL) + fid.write('X%07dY%07dD01*\n' % TL) + + if 1 or top: + if not left: fid.write('X%07dY%07dD02*\n' % TL) + fid.write('X%07dY%07dD01*\n' % TR) + + if 1 or right: + if not top: fid.write('X%07dY%07dD02*\n' % TR) + fid.write('X%07dY%07dD01*\n' % BR) + + if 1 or bot: + if not right: fid.write('X%07dY%07dD02*\n' % BR) + fid.write('X%07dY%07dD01*\n' % BL) + + def setPosition(self, x, y): + self.x=x + self.y=y + + def width_in(self): + return self.job.width_in() + + def height_in(self): + return self.job.height_in() + + def drillhits(self, diameter): + tools = self.job.findTools(diameter) + total = 0 + for tool in tools: + try: + total += len(self.job.xcommands[tool]) + except: + pass + + return total + + def jobarea(self): + return self.job.jobarea() + +def rotateJob(job, degrees = 90, firstpass = True): + """Create a new job from an existing one, rotating by specified degrees in 90 degree passes""" + GAT = config.GAT + GAMT = config.GAMT + ##print "rotating job:", job.name, degrees, firstpass + if firstpass: + if degrees == 270: + J = Job(job.name+'*rotated270') + elif degrees == 180: + J = Job(job.name+'*rotated180') + else: + J = Job(job.name+'*rotated90') + else: + J = Job(job.name) + + # Keep the origin (lower-left) in the same place + J.maxx = job.minx + job.maxy-job.miny + J.maxy = job.miny + job.maxx-job.minx + J.minx = job.minx + J.miny = job.miny + + RevGAT = config.buildRevDict(GAT) # RevGAT[hash] = aperturename + RevGAMT = config.buildRevDict(GAMT) # RevGAMT[hash] = aperturemacroname + + # Keep list of tool diameters and default tool list + J.xdiam = job.xdiam + J.ToolList = job.ToolList + J.Repeat = job.Repeat + + # D-code translation table is the same, except we have to rotate + # those apertures which have an orientation: rectangles, ovals, and macros. + + ToolChangeReplace = {} + for layername in job.apxlat.keys(): + J.apxlat[layername] = {} + + for ap in job.apxlat[layername].keys(): + code = job.apxlat[layername][ap] + A = GAT[code] + + if A.apname in ('Circle', 'Octagon'): + # This aperture is fine. Copy it over. + J.apxlat[layername][ap] = code + continue + + # Must rotate the aperture + APR = A.rotated(RevGAMT) + + # Does it already exist in the GAT? + hash = APR.hash() + try: + # Yup...add it to apxlat + newcode = RevGAT[hash] + except KeyError: + # Must add new aperture to GAT + newcode = aptable.addToApertureTable(APR) + + # Rebuild RevGAT + #RevGAT = config.buildRevDict(GAT) + RevGAT[hash] = newcode + + J.apxlat[layername][ap] = newcode + + # Must also replace all tool change commands from + # old code to new command. + ToolChangeReplace[code] = newcode + + # Now we copy commands, rotating X,Y positions. + # Rotations will occur counterclockwise about the + # point (minx,miny). Then, we shift to the right + # by the height so that the lower-left point of + # the rotated job continues to be (minx,miny). + # + # We also have to take aperture change commands and + # replace them with the new aperture code if we have + # a rotation. + offset = job.maxy-job.miny + for layername in job.commands.keys(): + J.commands[layername] = [] + J.apertures[layername] = [] + + for cmd in job.commands[layername]: + # Is it a drawing command? + if type(cmd) is types.TupleType: + if len(cmd)==3: + x, y, d = map(__builtin__.int, cmd) + II=JJ=None + else: + x, y, II, JJ, d, signed = map(__builtin__.int, cmd) # J is already used as Job object + else: + # No, must be a string indicating aperture change, G-code, or RS274-X command. + if cmd[0] in ('G', '%'): + # G-codes and RS274-X commands are just copied verbatim and not affected by rotation + J.commands[layername].append(cmd) + continue + + # It's a D-code. See if we need to replace aperture changes with a rotated aperture. + # But only for D-codes >= 10. + if int(cmd[1:]) < 10: + J.commands[layername].append(cmd) + continue + + try: + newcmd = ToolChangeReplace[cmd] + J.commands[layername].append(newcmd) + J.apertures[layername].append(newcmd) + except KeyError: + J.commands[layername].append(cmd) + J.apertures[layername].append(cmd) + continue + + # (X,Y) --> (-Y,X) effects a 90-degree counterclockwise shift + # Adding 'offset' to -Y maintains the lower-left origin of (minx,miny). + newx = -(y - job.miny) + job.minx + offset + newy = (x-job.minx) + job.miny + + # For circular interpolation commands, (I,J) components are always relative + # so we do not worry about offsets, just reverse their sense, i.e., I becomes J + # and J becomes I. For 360-degree circular interpolation, I/J are signed and we + # must map (I,J) --> (-J,I). + if II is not None: + if signed: + J.commands[layername].append((newx, newy, -JJ, II, d, signed)) + else: + J.commands[layername].append((newx, newy, JJ, II, d, signed)) + else: + J.commands[layername].append((newx,newy,d)) + + if 0: + print job.minx, job.miny, offset + print layername + print J.commands[layername] + + # Finally, rotate drills. Offset is in hundred-thousandths (2.5) while Excellon + # data is in 2.4 format. + for tool in job.xcommands.keys(): + J.xcommands[tool] = [] + + for x,y in job.xcommands[tool]: + newx = -(10*y - job.miny) + job.minx + offset + newy = (10*x - job.minx) + job.miny + + newx = int(round(newx/10.0)) + newy = int(round(newy/10.0)) + + J.xcommands[tool].append((newx,newy)) + + # Rotate some more if required + degrees -= 90 + if degrees > 0: + return rotateJob(J, degrees, False) + else: + ##print "rotated:", J.name + return J diff --git a/gerbmerge/makestroke.py b/gerbmerge/makestroke.py new file mode 100644 index 0000000..551ef7f --- /dev/null +++ b/gerbmerge/makestroke.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python +"""Support for writing characters and graphics to Gerber files +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import math + +import strokes + +# Define percentage of cell height and width to determine +# intercharacter spacing +SpacingX = 1.20 +SpacingY = 1.20 + +# Arrow dimensions +BarLength = 1500 # Length of dimension line +ArrowWidth = 750 # How broad the arrow is +ArrowLength = 750 # How far back from dimension line it is +ArrowStemLength = 1250 # How long the arrow stem extends from center point + +################################################################# + +# Arrow directions +FacingLeft=0 # 0 degrees +FacingDown=1 # 90 degrees counterclockwise +FacingRight=2 # 180 degrees +FacingUp=3 # 270 degrees + +SpacingDX = 10*int(round(strokes.MaxWidth*SpacingX)) +SpacingDY = 10*int(round(strokes.MaxHeight*SpacingY)) + +RotatedGlyphs={} + +# Default arrow glyph is at 0 degrees rotation, facing left +ArrowGlyph = [ [(0,-BarLength/2), (0, BarLength/2)], + [(ArrowLength,ArrowWidth/2), (0,0), (ArrowLength,-ArrowWidth/2)], + [(0,0), (ArrowStemLength,0)] + ] + +def rotateGlyph(glyph, degrees, glyphName): + """Rotate a glyph counterclockwise by given number of degrees. The glyph + is a list of lists, where each sub-list is a connected path.""" + try: + return RotatedGlyphs["%.1f_%s" % (degrees, glyphName)] + except KeyError: + pass # Not cached yet + + rad = degrees/180.0*math.pi + cosx = math.cos(rad) + sinx = math.sin(rad) + + newglyph = [] + for path in glyph: + newpath = [] + for X,Y in path: + x = int(round(X*cosx - Y*sinx)) + y = int(round(X*sinx + Y*cosx)) + newpath.append((x,y)) + newglyph.append(newpath) + + RotatedGlyphs["%.1f_%s" % (degrees, glyphName)] = newglyph + return newglyph + +def writeFlash(fid, X, Y, D): + fid.write("X%07dY%07dD%02d*\n" % (X,Y,D)) + +def drawPolyline(fid, L, offX, offY, scale=1): + for ix in range(len(L)): + X,Y = L[ix] + X *= scale + Y *= scale + if ix==0: + writeFlash(fid, X+offX, Y+offY, 2) + else: + writeFlash(fid, X+offX, Y+offY, 1) + +def writeGlyph(fid, glyph, X, Y, degrees, glyphName=None): + if not glyphName: + glyphName = str(glyph) + + for path in rotateGlyph(glyph, degrees, glyphName): + drawPolyline(fid, path, X, Y, 10) + +def writeChar(fid, c, X, Y, degrees): + if c==' ': return + + try: + glyph = strokes.StrokeMap[c] + except: + raise RuntimeError, 'No glyph for character %s' % hex(ord(c)) + + writeGlyph(fid, glyph, X, Y, degrees, c) + +def writeString(fid, s, X, Y, degrees): + posX = X + posY = Y + rad = degrees/180.0*math.pi + dX = int(round(math.cos(rad)*SpacingDX)) + dY = int(round(math.sin(rad)*SpacingDX)) + + if 0: + if dX < 0: + # Always print text left to right + dX = -dX + s = list(s) + s.reverse() + s = string.join(s, '') + + for char in s: + writeChar(fid, char, posX, posY, degrees) + posX += dX + posY += dY + +def drawLine(fid, X1, Y1, X2, Y2): + drawPolyline(fid, [(X1,Y1), (X2,Y2)], 0, 0) + +def boundingBox(s, X1, Y1): + "Return (X1,Y1),(X2,Y2) for given string" + if not s: + return (X1, Y1), (X1, Y1) + + X2 = X1 + (len(s)-1)*SpacingDX + 10*strokes.MaxWidth + Y2 = Y1 + 10*strokes.MaxHeight # Not including descenders + return (X1, Y1), (X2, Y2) + +def drawDimensionArrow(fid, X, Y, facing): + writeGlyph(fid, ArrowGlyph, X, Y, facing*90, "Arrow") + +def drawDrillHit(fid, X, Y, toolNum): + writeGlyph(fid, strokes.DrillStrokeList[toolNum], X, Y, 0, "Drill%02d" % toolNum) + +if __name__=="__main__": + import string + s = string.digits+string.letters+string.punctuation + #s = "The quick brown fox jumped over the lazy dog!" + + fid = file('test.ger','wt') + fid.write("""G75* +G70* +%OFA0B0*% +%FSAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +*% +%ADD10C,0.0100*% +D10* +""") + + writeString(fid, s, 0, 0, 0) + drawDimensionArrow(fid, 0, 5000, FacingLeft) + drawDimensionArrow(fid, 5000, 5000, FacingRight) + drawDimensionArrow(fid, 0, 10000, FacingUp) + drawDimensionArrow(fid, 5000, 10000, FacingDown) + + for diam in range(0,strokes.MaxNumDrillTools): + writeGlyph(fid, strokes.DrillStrokeList[diam], diam*1250, 15000, 0, "%02d" % diam) + + fid.write("M02*\n") + fid.close() diff --git a/gerbmerge/parselayout.py b/gerbmerge/parselayout.py new file mode 100644 index 0000000..3e17326 --- /dev/null +++ b/gerbmerge/parselayout.py @@ -0,0 +1,338 @@ +#!/usr/bin/env python +""" +Parse the job layout specification file. + +Requires: + + - SimpleParse 2.1 or higher + http://simpleparse.sourceforge.net + + +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" +import sys +import string + +from simpleparse.parser import Parser + +import config +import jobs + +declaration = r''' +file := (commentline/nullline/rowspec)+ +rowspec := ts, 'Row', ws, '{'!, ts, comment?, '\n', rowjob+, ts, '}'!, ts, comment?, '\n' +rowjob := jobspec/colspec/commentline/nullline +colspec := ts, 'Col', ws, '{'!, ts, comment?, '\n', coljob+, ts, '}'!, ts, comment?, '\n' +coljob := jobspec/rowspec/commentline/nullline + +jobspec := ts, (paneljobspec/basicjobspec), ts, comment?, '\n' +basicjobspec := id, (rotation)? +paneljobspec := 'Not yet implemented' +#paneljobspec := int, [xX], int, ws, basicjobspec +comment := ([#;]/'//'), -'\n'* +commentline := ts, comment, '\n' +nullline := ts, '\n' +rotation := ws, 'Rotate', ('90'/'180'/'270')? +ws := [ \t]+ +ts := [ \t]* +id := [a-zA-Z0-9], [a-zA-Z0-9_-]* +int := [0-9]+ +''' + +class Panel: # Meant to be subclassed as either a Row() or Col() + def __init__(self): + self.x = None + self.y = None + self.jobs = [] # List (left-to-right or bottom-to-top) of JobLayout() or Row()/Col() objects + + def canonicalize(self): # Return plain list of JobLayout objects at the roots of all trees + L = [] + for job in self.jobs: + L = L + job.canonicalize() + return L + + def addjob(self, job): # Either a JobLayout class or Panel (sub)class + assert isinstance(job, Panel) or isinstance(job, jobs.JobLayout) + self.jobs.append(job) + + def addwidths(self): + "Return width in inches" + width = 0.0 + for job in self.jobs: + width += job.width_in() + config.Config['xspacing'] + width -= config.Config['xspacing'] + return width + + def maxwidths(self): + "Return maximum width in inches of any one subpanel" + width = 0.0 + for job in self.jobs: + width = max(width,job.width_in()) + return width + + def addheights(self): + "Return height in inches" + height = 0.0 + for job in self.jobs: + height += job.height_in() + config.Config['yspacing'] + height -= config.Config['yspacing'] + return height + + def maxheights(self): + "Return maximum height in inches of any one subpanel" + height = 0.0 + for job in self.jobs: + height = max(height,job.height_in()) + return height + + def writeGerber(self, fid, layername): + for job in self.jobs: + job.writeGerber(fid, layername) + + def writeExcellon(self, fid, tool): + for job in self.jobs: + job.writeExcellon(fid, tool) + + def writeDrillHits(self, fid, tool, toolNum): + for job in self.jobs: + job.writeDrillHits(fid, tool, toolNum) + + def writeCutLines(self, fid, drawing_code, X1, Y1, X2, Y2): + for job in self.jobs: + job.writeCutLines(fid, drawing_code, X1, Y1, X2, Y2) + + def drillhits(self, tool): + hits = 0 + for job in self.jobs: + hits += job.drillhits(tool) + + return hits + + def jobarea(self): + area = 0.0 + for job in self.jobs: + area += job.jobarea() + + return area + +class Row(Panel): + def __init__(self): + Panel.__init__(self) + self.LR = 1 # Horizontal arrangement + + def width_in(self): + return self.addwidths() + + def height_in(self): + return self.maxheights() + + def setPosition(self, x, y): # In inches + self.x = x + self.y = y + for job in self.jobs: + job.setPosition(x,y) + x += job.width_in() + config.Config['xspacing'] + +class Col(Panel): + def __init__(self): + Panel.__init__(self) + self.LR = 0 # Vertical arrangement + + def width_in(self): + return self.maxwidths() + + def height_in(self): + return self.addheights() + + def setPosition(self, x, y): # In inches + self.x = x + self.y = y + for job in self.jobs: + job.setPosition(x,y) + y += job.height_in() + config.Config['yspacing'] + +def canonicalizePanel(panel): + L = [] + for job in panel: + L = L + job.canonicalize() + return L + +def findJob(jobname, rotated, Jobs=config.Jobs): + """ + Find a job in config.Jobs, possibly rotating it + If job not in config.Jobs add it for future reference + Return found job + """ + + if rotated == 90: + fullname = jobname + '*rotated90' + elif rotated == 180: + fullname = jobname + '*rotated180' + elif rotated == 270: + fullname = jobname + '*rotated270' + else: + fullname = jobname + + try: + for existingjob in Jobs.keys(): + if existingjob.lower() == fullname.lower(): ## job names are case insensitive + job = Jobs[existingjob] + return jobs.JobLayout(job) + except: + pass + + # Perhaps we just don't have a rotated job yet + if rotated: + try: + for existingjob in Jobs.keys(): + if existingjob.lower() == jobname.lower(): ## job names are case insensitive + job = Jobs[existingjob] + except: + raise RuntimeError, "Job name '%s' not found" % jobname + else: + raise RuntimeError, "Job name '%s' not found" % jobname + + # Make a rotated job + job = jobs.rotateJob(job, rotated) + Jobs[fullname] = job + + return jobs.JobLayout(job) + +def parseJobSpec(spec, data): + for jobspec in spec: + if jobspec[0] in ('ts','comment'): continue + + assert jobspec[0] in ('paneljobspec','basicjobspec') + if jobspec[0] == 'basicjobspec': + namefield = jobspec[3][0] + jobname = data[namefield[1]:namefield[2]] + + if len(jobspec[3]) > 1: + rotationfield = jobspec[3][1] + rotation = data[ rotationfield[1] + 1: rotationfield[2] ] + + if (rotation == "Rotate") or (rotation == "Rotate90"): + rotated = 90 + elif rotation == "Rotate180": + rotated = 180 + elif rotation == "Rotate270": + rotated = 270 + else: + raise RuntimeError, "Unsupported rotation: %s" % rotation + + else: + rotated = 0 + + return findJob(jobname, rotated) + else: + raise RuntimeError, "Matrix panels not yet supported" + +def parseColSpec(spec, data): + jobs = Col() + + for coljob in spec: + if coljob[0] in ('ts','ws','comment'): continue + + assert coljob[0] == 'coljob' + job = coljob[3][0] + if job[0] in ('commentline','nullline'): continue + + assert job[0] in ('jobspec','rowspec') + if job[0] == 'jobspec': + jobs.addjob(parseJobSpec(job[3],data)) + else: + jobs.addjob(parseRowSpec(job[3],data)) + + return jobs + +def parseRowSpec(spec, data): + jobs = Row() + + for rowjob in spec: + if rowjob[0] in ('ts','ws','comment'): continue + + assert rowjob[0] == 'rowjob' + job = rowjob[3][0] + if job[0] in ('commentline','nullline'): continue + + assert job[0] in ('jobspec','colspec') + if job[0] == 'jobspec': + jobs.addjob(parseJobSpec(job[3],data)) + else: + jobs.addjob(parseColSpec(job[3],data)) + + return jobs + +def parseLayoutFile(fname): + """config.Jobs is a dictionary of ('jobname', Job Object). + + The return value is a nested array. The primary dimension + of the array is one row: + + [ Row1, Row2, Row3 ] + + Each row element consists of a list of jobs or columns (i.e., + JobLayout or Col objects). + + Each column consists of a list of either jobs or rows. + These are recursive, so it can look like: + + [ + Row([JobLayout(), Col([ Row([JobLayout(), JobLayout()]), + JobLayout() ]), JobLayout() ]), # That was row 0 + Row([JobLayout(), JobLayout()]) # That was row 1 + ] + + This is a panel with two rows. In the first row there is + a job, a column, and another job, from left to right. In the + second row there are two jobs, from left to right. + + The column in the first row has two jobs side by side, then + another one above them. + """ + + try: + fid = file(fname, 'rt') + except Exception, detail: + raise RuntimeError, "Unable to open layout file: %s\n %s" % (fname, str(detail)) + + data = fid.read() + fid.close() + parser = Parser(declaration, "file") + + # Replace all CR's in data with nothing, to convert DOS line endings + # to unix format (all LF's). + data = string.replace(data, '\x0D', '') + + tree = parser.parse(data) + + # Last element of tree is number of characters parsed + if not tree[0]: + raise RuntimeError, "Layout file cannot be parsed" + + if tree[2] != len(data): + raise RuntimeError, "Parse error at character %d in layout file" % tree[2] + + Rows = [] + for rowspec in tree[1]: + if rowspec[0] in ('nullline', 'commentline'): continue + assert rowspec[0]=='rowspec' + + Rows.append(parseRowSpec(rowspec[3], data)) + + return Rows + +if __name__=="__main__": + fid = file(sys.argv[1]) + testdata = fid.read() + fid.close() + + parser = Parser(declaration, "file") + import pprint + pprint.pprint(parser.parse(testdata)) diff --git a/gerbmerge/placement.py b/gerbmerge/placement.py new file mode 100644 index 0000000..598fa58 --- /dev/null +++ b/gerbmerge/placement.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python +"""A placement is a final arrangement of jobs at given (X,Y) positions. +This class is intended to "un-pack" an arragement of jobs constructed +manually through Layout/Panel/JobLayout/etc. (i.e., a layout.def file) +or automatically through a Tiling. From either source, the result is +simply a list of jobs. +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import sys +import re + +import parselayout +import jobs + +class Placement: + def __init__(self): + self.jobs = [] # A list of JobLayout objects + + def addFromLayout(self, Layout): + # Layout is a recursive list of JobLayout items. At the end + # of each tree there is a JobLayout object which has a 'job' + # member, which is what we're looking for. Fortunately, the + # canonicalize() function flattens the tree. + # + # Positions of jobs have already been set (we're assuming) + # prior to calling this function. + self.jobs = self.jobs + parselayout.canonicalizePanel(Layout) + + def addFromTiling(self, T, OriginX, OriginY): + # T is a Tiling. Calling its canonicalize() method will construct + # a list of JobLayout objects and set the (X,Y) position of each + # object. + self.jobs = self.jobs + T.canonicalize(OriginX,OriginY) + + def extents(self): + """Return the maximum X and Y value over all jobs""" + maxX = 0.0 + maxY = 0.0 + + for job in self.jobs: + maxX = max(maxX, job.x+job.width_in()) + maxY = max(maxY, job.y+job.height_in()) + + return (maxX,maxY) + + def write(self, fname): + """Write placement to a file""" + fid = file(fname, 'wt') + for job in self.jobs: + fid.write('%s %.3f %.3f\n' % (job.job.name, job.x, job.y)) + fid.close() + + def addFromFile(self, fname, Jobs): + """Read placement from a file, placed against jobs in Jobs list""" + pat = re.compile(r'\s*(\S+)\s+(\S+)\s+(\S+)') + comment = re.compile(r'\s*(?:#.+)?$') + + try: + fid = file(fname, 'rt') + except: + print 'Unable to open placement file: "%s"' % fname + sys.exit(1) + + lines = fid.readlines() + fid.close() + + for line in lines: + if comment.match(line): continue + + match = pat.match(line) + if not match: + print 'Cannot interpret placement line in placement file:\n %s' % line + sys.exit(1) + + jobname, X, Y = match.groups() + try: + X = float(X) + Y = float(Y) + except: + print 'Illegal (X,Y) co-ordinates in placement file:\n %s' % line + sys.exit(1) + + rotated = 0 + if len(jobname) > 8: + if jobname[-8:] == '*rotated': + rotated = 90 + jobname = jobname[:-8] + elif jobname[-10:] == '*rotated90': + rotated = 90 + jobname = jobname[:-10] + elif jobname[-11:] == '*rotated180': + rotated = 180 + jobname = jobname[:-11] + elif jobname[-11:] == '*rotated270': + rotated = 270 + jobname = jobname[:-11] + + addjob = parselayout.findJob(jobname, rotated, Jobs) + addjob.setPosition(X,Y) + self.jobs.append(addjob) + diff --git a/gerbmerge/schwartz.py b/gerbmerge/schwartz.py new file mode 100644 index 0000000..e243961 --- /dev/null +++ b/gerbmerge/schwartz.py @@ -0,0 +1,38 @@ +""" +Implement the Schwartizan Transform method of sorting +a list by an arbitrary metric (see the Python FAQ section +4.51). +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +def stripit(pair): + return pair[1] + +def schwartz(List, Metric): + def pairing(element, M = Metric): + return (M(element), element) + + paired = map(pairing, List) + paired.sort() + return map(stripit, paired) + +def stripit2(pair): + return pair[0] + +def schwartz2(List, Metric): + "Returns sorted list and also corresponding metrics" + + def pairing(element, M = Metric): + return (M(element), element) + + paired = map(pairing, List) + paired.sort() + theList = map(stripit, paired) + theMetrics = map(stripit2, paired) + return (theList, theMetrics) diff --git a/gerbmerge/scoring.py b/gerbmerge/scoring.py new file mode 100644 index 0000000..ecb2b80 --- /dev/null +++ b/gerbmerge/scoring.py @@ -0,0 +1,301 @@ +#!/usr/bin/env python +"""This file handles the writing of the scoring lines Gerber file +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import config +import util +import makestroke + +# Add a horizontal line if its within the extents of the panel. Also, trim +# start and/or end points to the extents. +def addHorizontalLine(Lines, x1, x2, y, extents): + assert (x1 < x2) + + # For a horizontal line, y must be above extents[1] and below extents[3]. + if extents[1] < y < extents[3]: + # Now trim endpoints to be greater than extents[0] and below extents[2] + line = (max(extents[0], x1), y, min(extents[2], x2), y) + Lines.append(line) + +# Add a vertical line if its within the extents of the panel. Also, trim +# start and/or end points to the extents. +def addVerticalLine(Lines, x, y1, y2, extents): + assert (y1 < y2) + + # For a vertical line, x must be above extents[0] and below extents[2]. + if extents[0] < x < extents[2]: + # Now trim endpoints to be greater than extents[1] and below extents[3] + line = (x, max(extents[1], y1), x, min(extents[3], y2)) + Lines.append(line) + +def isHorizontal(line): + return line[1]==line[3] + +def isVertical(line): + return line[0]==line[2] + +def clusterOrdinates(values): + """Create a list of tuples where each tuple is a variable-length list of items + from 'values' that are all within 2 mils of each other.""" + + # First, make sure the values are sorted. Then, take the first one and go along + # the list clustering as many as possible. + values.sort() + currCluster = None + L = [] + for val in values: + if currCluster is None: + currCluster = (val,) + else: + if (val - currCluster[0]) <= 0.002: + currCluster = currCluster + (val,) + else: + L.append(currCluster) + currCluster = (val,) + + if currCluster is not None: + L.append(currCluster) + + return L + +def mergeHLines(Lines): + """Lines is a list of 4-tuples (lines) that have nearly the same Y ordinate and are to be + optimized by combining overlapping lines.""" + + # First, make sure lines are sorted by starting X ordinate and that all lines + # proceed to the right. + Lines.sort() + for line in Lines: + assert line[0] < line[2] + + # Obtain the average value of the Y ordinate and use that as the Y ordinate for + # all lines. + yavg = 0.0 + for line in Lines: + yavg += line[1] + yavg /= len(Lines) + + NewLines = [] + + # Now proceed to pick off one line at a time and try to merge it with + # the next one in sequence. + currLine = None + for line in Lines: + if currLine is None: + currLine = line + else: + # If the line to examine starts to the left of (within 0.002") the end + # of the current line, extend the current line. + if line[0] <= currLine[2]+0.002: + currLine = (currLine[0], yavg, max(line[2],currLine[2]), yavg) + else: + NewLines.append(currLine) + currLine = line + + NewLines.append(currLine) + + return NewLines + +def sortByY(A,B): + "Helper function to sort two lines (4-tuples) by their starting Y ordinate" + return cmp(A[1], B[1]) + +def mergeVLines(Lines): + """Lines is a list of 4-tuples (lines) that have nearly the same X ordinate and are to be + optimized by combining overlapping lines.""" + + # First, make sure lines are sorted by starting Y ordinate and that all lines + # proceed up. + Lines.sort(sortByY) + for line in Lines: + assert line[1] < line[3] + + # Obtain the average value of the X ordinate and use that as the X ordinate for + # all lines. + xavg = 0.0 + for line in Lines: + xavg += line[0] + xavg /= len(Lines) + + NewLines = [] + + # Now proceed to pick off one line at a time and try to merge it with + # the next one in sequence. + currLine = None + for line in Lines: + if currLine is None: + currLine = line + else: + # If the line to examine starts below (within 0.002") the end + # of the current line, extend the current line. + if line[1] <= currLine[3]+0.002: + currLine = (xavg, currLine[1], xavg, max(line[3],currLine[3])) + else: + NewLines.append(currLine) + currLine = line + + NewLines.append(currLine) + + return NewLines + +def mergeLines(Lines): + # All lines extend up (vertical) and to the right (horizontal). First, do + # simple merges. Sort all lines, which will order the lines with starting + # points in increasing X order (i.e., to the right). + Lines.sort() + + # Now sort the lines into horizontal lines and vertical lines. For each + # ordinate, group all lines by that ordinate in a dictionary. Thus, all + # horizontal lines will be grouped together by Y ordinate, and all + # vertical lines will be grouped together by X ordinate. + HLines = {} + VLines = {} + + for line in Lines: + if isHorizontal(line): + try: + HLines[line[1]].append(line) + except KeyError: + HLines[line[1]] = [line] + else: + try: + VLines[line[0]].append(line) + except KeyError: + VLines[line[0]] = [line] + + # I don't think the next two blocks of code are necessary (merging lines + # that are at exactly the same ordinate) since the last two blocks of + # code do the same thing more generically by merging lines at close-enough + # ordinates. + + # Extend horizontal lines + NewHLines = {} + for yval,lines in HLines.items(): + # yval is the Y ordinate of this group of lines. lines is the set of all + # lines with this Y ordinate. + NewHLines[yval] = [] + + # Try to extend the first element of this list, which will be the leftmost. + xline = lines[0] + for line in lines[1:]: + # If this line's left edge is within 2 mil of the right edge of the line + # we're currently trying to grow, then grow it. + if abs(line[0] - xline[2]) <= 0.002: # Arbitrary 2mil? + # Extend... + xline = (xline[0], xline[1], line[2], xline[1]) + else: + # ...otherwise, append the currently-extended line and make this + # line the new one we try to extend. + NewHLines[yval].append(xline) + xline = line + NewHLines[yval].append(xline) + + # Extend vertical lines + NewVLines = {} + for xval,lines in VLines.items(): + # xval is the X ordinate of this group of lines. lines is the set of all + # lines with this X ordinate. + NewVLines[xval] = [] + + # Try to extend the first element of this list, which will be the bottom-most. + xline = lines[0] + for line in lines[1:]: + # If this line's bottom edge is within 2 mil of the top edge of the line + # we're currently trying to grow, then grow it. + if abs(line[1] - xline[3]) <= 0.002: # Arbitrary 2mil? + # Extend... + xline = (xline[0], xline[1], xline[0], line[3]) + else: + # ...otherwise, append the currently-extended line and make this + # line the new one we try to extend. + NewVLines[xval].append(xline) + xline = line + NewVLines[xval].append(xline) + + HLines = NewHLines + VLines = NewVLines + NewHLines = [] + NewVLines = [] + + # Now combine lines that have their endpoints either very near each other + # or within each other. We will have to sort all horizontal lines by their + # Y ordinates and group them according to Y ordinates that are close enough + # to each other. + yvals = HLines.keys() + clusters = clusterOrdinates(yvals) # A list of clustered tuples containing yvals + + for cluster in clusters: + clusterLines = [] + for yval in cluster: + clusterLines.extend(HLines[yval]) + + # clusterLines is now a list of lines (4-tuples) that all have nearly the same + # Y ordinate. Merge them together. + NewHLines.extend(mergeHLines(clusterLines)) + + xvals = VLines.keys() + clusters = clusterOrdinates(xvals) + for cluster in clusters: + clusterLines = [] + for xval in cluster: + clusterLines.extend(VLines[xval]) + + # clusterLines is now a list of lines (4-tuples) that all have nearly the same + # X ordinate. Merge them together. + NewVLines.extend(mergeVLines(clusterLines)) + + Lines = NewHLines + NewVLines + + return Lines + +# Main entry point. Gerber file has already been opened, header written +# out, 1mil tool selected. +def writeScoring(fid, Place, OriginX, OriginY, MaxXExtent, MaxYExtent): + # For each job, write out 4 score lines, above, to the right, below, and + # to the left. After we collect all potential scoring lines, we worry + # about merging, etc. + dx = config.Config['xspacing']/2.0 + dy = config.Config['yspacing']/2.0 + extents = (OriginX, OriginY, MaxXExtent, MaxYExtent) + + Lines = [] + for layout in Place.jobs: + x = layout.x - dx + y = layout.y - dy + X = layout.x + layout.width_in() + dx + Y = layout.y + layout.height_in() + dy + + # Just so we don't get 3.75000000004 and 3.75000000009, we round to + # 2.5 limits. + x,y,X,Y = [round(val,5) for val in [x,y,X,Y]] + + if 0: # Scoring lines go all the way across the panel now + addHorizontalLine(Lines, x, X, Y, extents) # above job + addVerticalLine(Lines, X, y, Y, extents) # to the right of job + addHorizontalLine(Lines, x, X, y, extents) # below job + addVerticalLine(Lines, x, y, Y, extents) # to the left of job + else: + addHorizontalLine(Lines, OriginX, MaxXExtent, Y, extents) # above job + addVerticalLine(Lines, X, OriginY, MaxYExtent, extents) # to the right of job + addHorizontalLine(Lines, OriginX, MaxXExtent, y, extents) # below job + addVerticalLine(Lines, x, OriginY, MaxYExtent, extents) # to the left of job + + # Combine disparate lines into single lines + Lines = mergeLines(Lines) + + #for line in Lines: + # print [round(x,3) for x in line] + + # Write 'em out + for line in Lines: + makestroke.drawPolyline(fid, [(util.in2gerb(line[0]),util.in2gerb(line[1])), \ + (util.in2gerb(line[2]),util.in2gerb(line[3]))], 0, 0) + +# vim: expandtab ts=2 sw=2 ai syntax=python diff --git a/gerbmerge/specs.py b/gerbmerge/specs.py new file mode 100644 index 0000000..5c76b13 --- /dev/null +++ b/gerbmerge/specs.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python +""" +Regular expression, SimpleParse, ane message constants. + +Requires: + + - SimpleParse 2.1 or higher + http://simpleparse.sourceforge.net + + +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import re + +from simpleparse.parser import Parser + +DISCLAIMER = """ +**************************************************** +* R E A D C A R E F U L L Y * +* * +* This program comes with no warranty. You use * +* this program at your own risk. Do not submit * +* board files for manufacture until you have * +* thoroughly inspected the output of this program * +* using a previewing program such as: * +* * +* Windows: * +* - GC-Prevue * +* - ViewMate * +* * +* Linux: * +* - gerbv * +* * +* By using this program you agree to take full * +* responsibility for the correctness of the data * +* that is generated by this program. * +**************************************************** +"""[1:-1] + +# [Options] section defaults Data types: "L" = layers (will show layer selection) +# "D" = decimal +# "DP" = possitive decimal +# "I" = integer +# "IP" = integer positive +# "PI" = path input (will show open dialog) +# "PO" = path output (will show save dialog) +# "S" = string +# "B" = boolean +# "BI" = boolean as integer +# +# THESE DATA TYPES ARE FIXED - CODE MUST CHANGE IF TYPES ARE ADDED/MODIFIED +DEFAULT_OPTIONS = { + # Spacing in horizontal direction + 'xspacing': ('0.125', "DP", "XSpacing", "1 XSPACING_HELP"), + # Spacing in vertical direction + 'yspacing': ('0.125', "DP", "YSpacing", "2 YSPACING_HELP"), + # X-Dimension maximum panel size (Olimex) + 'panelwidth': ('12.6', "DP", "PanelWidth", "3 PANEL_WIDTH"), + # Y-Dimension maximum panel size (Olimex) + 'panelheight': ('7.8', "DP", "PanelHeight", "4 PanelHeight"), + # e.g., *toplayer,*bottomlayer + 'cropmarklayers': (None, "L", "CropMarkLayers", "5 CropMarkLayers"), + # Width (inches) of crop lines + 'cropmarkwidth': ('0.01', "DP", "CropMarkWidth", "6 CropMarkWidth"), + # as for cropmarklayers + 'cutlinelayers': (None, "L", "CutLineLayers", "7 CutLineLayers"), + # Width (inches) of cut lines + 'cutlinewidth': ('0.01', "DP", "CutLineWidth", "8 CutLineWidth"), + # Minimum dimension for selected layers + 'minimumfeaturesize': (None, "S", "MinimumFeatureSize", "Use this option to automatically thicken features on particular layers.\nThis is intended for thickening silkscreen to some minimum width.\nThe value of this option must be a comma-separated list\nof layer names followed by minimum feature sizes (in inches) for that layer.\nComment this out to disable thickening. Example usage is:\n\nMinimumFeatureSize = *topsilkscreen,0.008,*bottomsilkscreen,0.008"), + # Name of file containing default tool list + 'toollist': (None, "PI", "ToolList", "10 ToolList"), + # Tolerance for clustering drill sizes + 'drillclustertolerance': ('.002', "DP", "DrillClusterTolerance", "11 DrillClusterTolerance"), + # Set to 1 to allow multiple jobs to have non-matching layers + 'allowmissinglayers': (0, "BI", "AllowMissingLayers", "12 AllowMissingLayers"), + # Name of file to which to write fabrication drawing, or None + 'fabricationdrawingfile': (None, "PO", "FabricationDrawingFile", "13 FabricationDrawingFile"), + # Name of file containing text to write to fab drawing + 'fabricationdrawingtext': (None, "PI", "FabricationDrawingText", "14 FabricationDrawingText"), + # Number of digits after the decimal point in input Excellon files + 'excellondecimals': (4, "IP", "ExcellonDecimals", "15 ExcellonDecimals"), + # Generate leading zeros in merged Excellon output file + 'excellonleadingzeros': (0, "IP", "ExcellonLeadingZeros", "16 ExcellonLeadingZeros"), + # Name of file to which to write simple box outline, or None + 'outlinelayerfile': (None, "PO", "OutlineLayerFile", "17 OutlineLayerFile"), + # Name of file to which to write scoring data, or None + 'scoringfile': (None, "PO", "ScoringFile", "18 ScoringFile"), + # Inches of extra room to leave on left side of panel for tooling + 'leftmargin': (0.0, "DP", "LeftMargin", "19 LeftMargin"), + # Inches of extra room to leave on top side of panel for tooling + 'topmargin': (0.0, "DP", "TopMargin", "20 TopMargin"), + # Inches of extra room to leave on right side of panel for tooling + 'rightmargin': (0.0, "DP", "RightMargin", "21 RightMargin"), + # Inches of extra room to leave on bottom side of panel for tooling + 'bottommargin': (0.0, "DP", "BottomMargin", "22 BottomMargin"), + # List of X,Y points at which to draw fiducials + 'fiducialpoints': (None, "S", "FiducialPoints", "23 FiducialPoints"), +} +DEFAULT_OPTIONS_TYPES = ["IP", "I", "DP", "D", "B", "BI", "S", "PI", "PO", "L"] # List of option types in display order + +# [GerbMergeGUI] section defaults +DEFAULT_GERBMERGEGUI = { + 'unit': "IN", # Unit inidicator: IN, MIL, MM + 'layout': "AUTOMATIC", # Indicates layout: GRID, AUTOMATIC, MANUAL, GRID_FILE, MANUAL_FILE + 'runtime': 10, # Seconds to run automatic placement + 'rows': 1, # Number of rows in grid layout + 'columns': 1, # Number of columns in grid layout + 'mergedoutput': False, # Path of output directory + 'mergedname': False, # Prefix of merged output files + 'layoutfilepath': "", # Path of layout file + 'placementfilepath': "", # Path of placement file + 'configurationfilepath': "", # Path of configuration file + 'configurationcomplete': False, # Indicates that run dialog may be skipped to upon load +} + +# Job names +RE_VALID_JOB = re.compile(r'^[a-zA-Z0-9][a-zA-Z0-9_-]*$') +RE_VALID_JOB_MESSAGE = "Vaild Characters: a-z, A-Z, 0-9, underscores, hyphens\nFirst Character must be: a-z, A-Z, 0-9" +RESERVED_JOB_NAMES = ("Options", "MergeOutputFiles", "GerbMergeGUI") ##not implemented yet + +# Layer names +RE_VALID_LAYER = re.compile(r'^[a-zA-Z0-9][a-zA-Z0-9_-]*$') +RE_VALID_LAYER_MESSAGE = "Vaild Characters: a-z, A-Z, 0-9, underscores, hyphens\nFirst Character must be: a-z, A-Z, 0-9" +DEFAULT_LAYERS = [ "BoardOutline", + "TopCopper", + "BottomCopper", + "InnerLayer2", + "InnerLayer3", + "TopSilkscreen", + "BottomSilkscreen", + "TopSoldermask", + "BottomSoldermask", + "TopSolderPasteMask", + "BottomSolderPasteMask", + "Drills" ] +REQUIRED_LAYERS = ["BoardOutline", "Drills"] +RESERVED_LAYER_NAMES = () ##add "mergeout", not implemented yet + +#Output names +RE_VALID_OUTPUT_NAME = re.compile(r'^[a-zA-Z0-9_-]+$') +RE_VALID_OUTPUT_NAME_MESSAGE = "Vaild Characters: a-z, A-Z, 0-9, underscores, hyphens" +REQUIRED_LAYERS_OUTPUT = ["BoardOutline", "ToolList", "Placement", "Drills"] + +# Default dictionary of layer names to file extensions +FILE_EXTENSIONS = { "boardoutline": "GBO", + "topcopper": "GTL", + "bottomcopper": "GBL", + "innerlayer2": "G2", + "innerlayer3": "G3", + "topsilkscreen": "GTO", + "bottomsilkscreen": "GBO", + "topsoldermask": "GTS", + "bottomsoldermask": "GBS", + "topsolderpastemask": "GTP", + "bottomsolderpastemask": "GBP", + "drills": "GDD", + "placement": "TXT", + "toollist": "DRL", + } +DEFAULT_EXTENSION = "GER" + +#Gerbmerge options +PLACE_FILE = "--place-file=" +NO_TRIM_GERBER = "--no-trim-gerber" +NO_TRIM_EXCELLON = "--no-trim-excellon" +ROTATED_OCTAGONS = "--octagons=rotate" +SEARCH_TIMEOUT = "--search-timeout=" + + diff --git a/gerbmerge/strokes.py b/gerbmerge/strokes.py new file mode 100644 index 0000000..565e74d --- /dev/null +++ b/gerbmerge/strokes.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +# This file was automatically generated by genstroke.py + +StrokeMap = {'"': [[(400, 500), (300, 400)], [(400, 500), (400, 700)], [(200, 700), (200, 500), (100, 400)]], '$': [[(250, -100), (250, 700)], [(350, 600), (450, 500)], [(350, 600), (150, 600), (50, 500), (50, 400), (150, 300), (350, 300), (450, 200), (450, 100), (350, 0), (150, 0), (50, 100)]], '&': [[(150, 600), (50, 500), (50, 400), (450, 0)], [(450, 200), (250, 0), (150, 0), (50, 100), (50, 200), (250, 400), (250, 500), (150, 600)]], '(': [[(350, 600), (150, 400), (150, 200), (350, 0)]], '*': [[(450, 300), (50, 300)], [(50, 500), (450, 100)], [(250, 100), (250, 500)], [(450, 500), (50, 100)]], ',': [[(150, -200), (350, 0), (250, 0), (250, 100), (350, 100), (350, 0)]], '.': [[(200, 100), (300, 100), (300, 0), (200, 0), (200, 100)]], '0': [[(150, 0), (50, 100), (450, 500), (450, 100), (350, 0), (150, 0)], [(50, 100), (50, 500), (150, 600), (350, 600), (450, 500)]], '2': [[(50, 0), (450, 400), (450, 500), (350, 600), (150, 600), (50, 500)], [(50, 0), (450, 0)]], '4': [[(50, 300), (450, 300)], [(350, 0), (350, 600), (50, 300)]], '6': [[(50, 300), (50, 100), (150, 0), (350, 0), (450, 100), (450, 200), (350, 300), (50, 300), (250, 500), (450, 600)]], '8': [[(50, 100), (50, 200), (150, 300), (350, 300), (450, 200), (450, 100), (350, 0), (150, 0), (50, 100)], [(150, 300), (50, 400), (50, 500), (150, 600), (350, 600), (450, 500), (450, 400), (350, 300)]], ':': [[(200, 400), (200, 300), (300, 300), (300, 400), (200, 400)], [(200, 100), (200, 0), (300, 0), (300, 100), (200, 100)]], '<': [[(50, 300), (450, 0)], [(50, 300), (450, 600)]], '>': [[(450, 300), (50, 0)], [(450, 300), (50, 600)]], '@': [[(450, 100), (350, 0), (150, 0), (50, 100), (50, 500), (150, 600), (350, 600), (450, 500), (450, 300), (350, 200), (350, 400), (150, 400), (150, 200), (350, 200)]], 'B': [[(50, 300), (350, 300), (450, 200), (450, 100), (350, 0), (50, 0), (50, 600), (350, 600), (450, 500), (450, 400), (350, 300)]], 'D': [[(50, 600), (50, 0), (350, 0), (450, 100), (450, 500), (350, 600), (50, 600)]], 'F': [[(50, 300), (250, 300)], [(50, 600), (450, 600)], [(50, 600), (50, 0)]], 'H': [[(50, 0), (50, 600)], [(50, 300), (450, 300)], [(450, 600), (450, 0)]], 'J': [[(50, 100), (150, 0), (250, 0), (350, 100), (350, 600)], [(250, 600), (450, 600)]], 'L': [[(50, 0), (450, 0)], [(50, 0), (50, 600)]], 'N': [[(50, 0), (50, 600), (450, 0), (450, 600)]], 'P': [[(450, 300), (350, 200), (50, 200)], [(50, 0), (50, 600), (350, 600), (450, 500), (450, 300)]], 'R': [[(450, 300), (350, 200), (50, 200)], [(50, 0), (50, 600), (350, 600), (450, 500), (450, 300)], [(250, 200), (450, 0)]], 'T': [[(450, 600), (50, 600)], [(250, 600), (250, 0)]], 'V': [[(450, 600), (450, 200), (250, 0), (50, 200), (50, 600)]], 'X': [[(450, 0), (50, 600)], [(450, 600), (50, 0)]], 'Z': [[(50, 600), (450, 600), (450, 500), (50, 100), (50, 0), (450, 0)]], '\\': [[(450, 0), (50, 600)]], '^': [[(450, 300), (250, 500), (50, 300)]], '`': [[(200, 700), (200, 500), (300, 400)]], 'b': [[(450, 100), (450, 300), (350, 400), (50, 400)], [(50, 600), (50, 0), (350, 0), (450, 100)]], 'd': [[(450, 400), (150, 400), (50, 300), (50, 100), (150, 0), (450, 0), (450, 600)]], 'f': [[(350, 300), (150, 300)], [(250, 500), (250, 0)], [(250, 500), (350, 600)]], 'h': [[(450, 300), (450, 0)], [(450, 300), (350, 400), (150, 400), (50, 300)], [(50, 600), (50, 0)]], 'j': [[(250, -200), (350, -100), (350, 400)], [(350, 600), (350, 700)], [(250, -200), (150, -200)]], 'l': [[(350, 0), (150, 0)], [(250, 0), (250, 600), (150, 600)]], 'n': [[(450, 0), (450, 300), (350, 400), (50, 400), (50, 0)]], 'p': [[(50, -200), (50, 400), (350, 400), (450, 300), (450, 100), (350, 0), (50, 0)]], 'r': [[(400, 400), (300, 400), (100, 200)], [(100, 0), (100, 400)]], 't': [[(250, 500), (250, 100), (350, 0)], [(350, 400), (150, 400)]], 'v': [[(50, 400), (250, 0), (450, 400)]], 'x': [[(50, 400), (450, 0)], [(50, 0), (450, 400)]], 'z': [[(50, 400), (450, 400), (50, 0), (450, 0)]], '|': [[(250, 0), (250, 600)]], '~': [[(50, 600), (150, 700), (350, 500), (450, 600)]], '!': [[(250, 0), (250, 100)], [(250, 200), (250, 700)]], '#': [[(450, 200), (50, 200)], [(50, 400), (350, 400), (450, 400)], [(350, 600), (350, 0)], [(150, 0), (150, 600)]], '%': [[(500, 600), (0, 0)], [(0, 500), (0, 600), (100, 600), (100, 500), (0, 500)], [(400, 100), (500, 100), (500, 0), (400, 0), (400, 100)]], "'": [[(200, 400), (300, 500), (300, 700)]], ')': [[(150, 600), (350, 400), (350, 200), (150, 0)]], '+': [[(250, 100), (250, 500)], [(50, 300), (450, 300)]], '-': [[(50, 300), (450, 300)]], '/': [[(50, 0), (450, 600)]], '1': [[(150, 500), (250, 600), (250, 0)], [(150, 0), (350, 0)]], '3': [[(50, 100), (150, 0), (350, 0), (450, 100), (450, 200), (350, 300), (250, 300)], [(350, 300), (450, 400), (450, 500), (350, 600), (150, 600), (50, 500)]], '5': [[(50, 300), (250, 400), (350, 400), (450, 300), (450, 100), (350, 0), (150, 0), (50, 100)], [(50, 300), (50, 600), (450, 600)]], '7': [[(50, 600), (450, 600), (450, 500), (50, 100), (50, 0)]], '9': [[(50, 400), (150, 300), (450, 300)], [(450, 100), (450, 500), (350, 600), (150, 600), (50, 500), (50, 400)], [(50, 100), (150, 0), (350, 0), (450, 100)]], ';': [[(150, -200), (350, 0), (250, 0), (250, 100), (350, 100), (350, 0)], [(350, 300), (250, 300), (250, 400), (350, 400), (350, 300)]], '=': [[(450, 400), (50, 400)], [(50, 200), (450, 200)]], '?': [[(450, 400), (250, 200)], [(250, 100), (250, 0)], [(450, 400), (450, 500), (350, 600), (150, 600), (50, 500)]], 'A': [[(50, 0), (50, 400), (250, 600), (450, 400), (450, 0)], [(450, 300), (50, 300)]], 'C': [[(50, 500), (50, 100), (150, 0), (350, 0), (450, 100)], [(450, 500), (350, 600), (150, 600), (50, 500)]], 'E': [[(450, 600), (50, 600), (50, 0), (450, 0)], [(250, 300), (50, 300)]], 'G': [[(50, 100), (150, 0), (350, 0), (450, 100), (450, 300), (250, 300)], [(450, 500), (350, 600), (150, 600), (50, 500), (50, 100)]], 'I': [[(150, 0), (350, 0)], [(250, 0), (250, 600)], [(150, 600), (350, 600)]], 'K': [[(50, 600), (50, 0)], [(50, 200), (450, 600)], [(150, 300), (450, 0)]], 'M': [[(50, 0), (50, 600), (250, 400), (450, 600), (450, 0)]], 'O': [[(450, 100), (450, 500), (350, 600), (150, 600), (50, 500), (50, 100), (150, 0), (350, 0), (450, 100)]], 'Q': [[(450, 0), (250, 200)], [(350, 0), (150, 0), (50, 100), (50, 500), (150, 600), (350, 600), (450, 500), (450, 100), (350, 0)]], 'S': [[(450, 100), (350, 0), (150, 0), (50, 100)], [(150, 300), (50, 400), (50, 500), (150, 600), (350, 600), (450, 500)], [(350, 300), (450, 200), (450, 100)], [(350, 300), (150, 300)]], 'U': [[(450, 600), (450, 100), (350, 0), (150, 0), (50, 100), (50, 600)]], 'W': [[(450, 0), (450, 600)], [(250, 200), (450, 0)], [(250, 200), (50, 0), (50, 600)]], 'Y': [[(50, 600), (50, 500), (250, 300), (250, 0)], [(250, 300), (450, 500), (450, 600)]], '[': [[(350, 600), (150, 600), (150, 0), (350, 0)]], ']': [[(350, 0), (350, 600), (150, 600)], [(150, 0), (350, 0)]], '_': [[(450, -100), (50, -100)]], 'a': [[(450, 200), (150, 200), (50, 100), (150, 0), (450, 0), (450, 300), (350, 400), (150, 400)]], 'c': [[(450, 400), (150, 400), (50, 300), (50, 100), (150, 0), (450, 0)]], 'e': [[(450, 300), (450, 200), (50, 200)], [(50, 300), (150, 400), (350, 400), (450, 300)], [(350, 0), (150, 0), (50, 100), (50, 300)]], 'g': [[(450, 0), (150, 0), (50, 100), (50, 300), (150, 400), (450, 400), (450, -100), (350, -200), (250, -200)]], 'i': [[(350, 0), (150, 0)], [(250, 0), (250, 400), (150, 400)], [(250, 600), (250, 700)]], 'k': [[(400, 400), (100, 200), (400, 0)], [(100, 0), (100, 600)]], 'm': [[(450, 0), (450, 300), (350, 400), (250, 300), (250, 0)], [(250, 300), (150, 400), (50, 400), (50, 0)]], 'o': [[(450, 100), (450, 300), (350, 400), (150, 400), (50, 300), (50, 100), (150, 0), (350, 0), (450, 100)]], 'q': [[(450, 400), (450, -200)], [(450, 0), (150, 0), (50, 100), (50, 300), (150, 400), (450, 400)]], 's': [[(450, 400), (150, 400), (50, 300), (150, 200), (350, 200), (450, 100), (350, 0), (50, 0)]], 'u': [[(150, 0), (450, 0), (450, 400)], [(50, 400), (50, 100), (150, 0)]], 'w': [[(50, 400), (50, 100), (150, 0), (250, 100), (350, 0), (450, 100), (450, 400)]], 'y': [[(50, 400), (50, 100), (150, 0), (450, 0)], [(450, -100), (350, -200), (250, -200)], [(450, -100), (450, 400)]], '{': [[(400, 600), (300, 600), (200, 500), (200, 400), (100, 300), (200, 200), (200, 100), (300, 0), (400, 0)]], '}': [[(100, 0), (200, 0), (300, 100), (300, 200), (400, 300), (300, 400), (300, 500), (200, 600), (100, 600)]]} +MaxHeight = 700 +MaxWidth = 500 + +# Each drill stroke is in a box with corners (-400,-400) to (400,400). The center of the box at (0,0) +# is the drill center. +DrillStrokeList = [ \ + [[(-400, -400), (400, 400)], [(400, -400), (-400, 400)], [(-400, 0), (400, 0)]], \ + [[(0, 0), (-400, 0)], [(0, 0), (400, 400), (400, -400), (0, 0)]], \ + [[(0, 0), (400, 0)], [(0, 0), (-400, 400), (-400, -400), (0, 0)]], \ + [[(-400, 0), (400, 0)], [(0, -400), (0, 400)], [(-390, 0), (-388, 39), (-382, 79), (-372, 117), (-358, 154), (-341, 189), (-320, 223), (-296, 254), (-269, 283), (-239, 308), (-206, 331), (-172, 350), (-135, 366), (-98, 378), (-59, 386), (-20, 389), (20, 389), (59, 386), (98, 378), (135, 366), (172, 350), (206, 331), (239, 308), (269, 283), (296, 254), (320, 223), (341, 189), (358, 154), (372, 117), (382, 79), (388, 39), (390, 0), (388, -39), (382, -79), (372, -117), (358, -154), (341, -189), (320, -223), (296, -254), (269, -283), (239, -308), (206, -331), (172, -350), (135, -366), (98, -378), (59, -386), (20, -389), (-20, -389), (-59, -386), (-98, -378), (-135, -366), (-172, -350), (-206, -331), (-239, -308), (-269, -283), (-296, -254), (-320, -223), (-341, -189), (-358, -154), (-372, -117), (-382, -79), (-388, -39), (-390, 0)]], \ + [[(-400, 0), (400, 0)], [(0, -400), (0, 400)], [(-390, 0), (-388, 39), (-382, 79), (-372, 117), (-358, 154), (-341, 189), (-320, 223), (-296, 254), (-269, 283), (-239, 308), (-206, 331), (-172, 350), (-135, 366), (-98, 378), (-59, 386), (-20, 389), (20, 389), (59, 386), (98, 378), (135, 366), (172, 350), (206, 331), (239, 308), (269, 283), (296, 254), (320, 223), (341, 189), (358, 154), (372, 117), (382, 79), (388, 39), (390, 0), (388, -39), (382, -79), (372, -117), (358, -154), (341, -189), (320, -223), (296, -254), (269, -283), (239, -308), (206, -331), (172, -350), (135, -366), (98, -378), (59, -386), (20, -389), (-20, -389), (-59, -386), (-98, -378), (-135, -366), (-172, -350), (-206, -331), (-239, -308), (-269, -283), (-296, -254), (-320, -223), (-341, -189), (-358, -154), (-372, -117), (-382, -79), (-388, -39), (-390, 0)], [(-195, 0), (-193, 28), (-187, 56), (-177, 83), (-163, 108), (-145, 130), (-125, 150), (-102, 166), (-76, 179), (-49, 189), (-21, 194), (7, 195), (35, 192), (63, 185), (89, 173), (113, 159), (135, 140), (154, 119), (170, 95), (182, 70), (190, 42), (194, 14), (194, -14), (190, -42), (182, -70), (170, -95), (154, -119), (135, -140), (113, -159), (89, -173), (63, -185), (35, -192), (7, -195), (-21, -194), (-49, -189), (-76, -179), (-102, -166), (-125, -150), (-145, -130), (-163, -108), (-177, -83), (-187, -56), (-193, -28), (-195, 0)]], \ + [[(-400, 0), (400, 0), (0, 400), (0, -400), (-400, 0)]], \ + [[(-400, 0), (400, 0)], [(0, -400), (0, 400)], [(-390, 390), (390, 390), (390, -390), (-390, -390), (-390, 390)]], \ + [[(-400, 0), (400, 0)], [(0, -400), (0, 400)]], \ + [[(-400, 0), (400, 0)], [(0, -400), (0, 400)], [(-390, 390), (390, 390), (390, -390), (-390, -390), (-390, 390)], [(-195, 195), (195, 195), (195, -195), (-195, -195), (-195, 195)]], \ + [[(-400, 0), (400, 0), (0, -400), (0, 400), (-400, 0)]], \ + [[(-400, -400), (400, 400), (400, -400), (-400, 400), (-400, -400)]], \ + [[(-400, -400), (400, 400), (-400, 400), (400, -400), (-400, -400)]], \ + [[(0, 0), (0, 400), (400, 0), (0, -400), (-400, 0), (0, 400)]], \ + [[(0, -400), (0, 0), (-400, 400), (400, 400), (0, 0)]], \ + [[(400, -400), (-400, 400)], [(-400, -400), (400, 400)]], \ + [[(0, 0), (0, 400)], [(0, 0), (-400, -400), (400, -400), (0, 0)]], \ + [[(0, 0), (0, 400), (400, 400), (400, -400), (-400, -400), (-400, 400), (0, 400)]], \ + [[(-400, -400), (400, 400)], [(400, -400), (-400, 400)], [(0, 400), (0, -400)]], \ + [[(-390, 0), (-388, 39), (-382, 79), (-372, 117), (-358, 154), (-341, 189), (-320, 223), (-296, 254), (-269, 283), (-239, 308), (-206, 331), (-172, 350), (-135, 366), (-98, 378), (-59, 386), (-20, 389), (20, 389), (59, 386), (98, 378), (135, 366), (172, 350), (206, 331), (239, 308), (269, 283), (296, 254), (320, 223), (341, 189), (358, 154), (372, 117), (382, 79), (388, 39), (390, 0), (388, -39), (382, -79), (372, -117), (358, -154), (341, -189), (320, -223), (296, -254), (269, -283), (239, -308), (206, -331), (172, -350), (135, -366), (98, -378), (59, -386), (20, -389), (-20, -389), (-59, -386), (-98, -378), (-135, -366), (-172, -350), (-206, -331), (-239, -308), (-269, -283), (-296, -254), (-320, -223), (-341, -189), (-358, -154), (-372, -117), (-382, -79), (-388, -39), (-390, 0)], [(-400, -400), (400, 400)]], \ + [[(400,400), (0,0), (-400,0), (0,-400), (0,0)]], \ + [[(-400,400), (0,0), (0, -400), (400,0), (0,0)]], \ + [[(-400,-400), (0,0), (0,400), (400,0), (0,0)]], \ + [[(400,-400), (0,0), (0,400), (-400,0), (0,0)]], \ + [[(0,0), (-400,0), (-400,400), (400,400), (400,-400), (-400,-400), (-400,0)]], \ + [[(0,0), (0,-400), (-400,-400), (-400,400), (400,400), (400,-400), (0,-400)]], \ + [[(0,0), (400,0), (400,-400), (-400,-400), (-400,400), (400,400), (400,0)]] ] + +MaxNumDrillTools = len(DrillStrokeList) diff --git a/gerbmerge/tilesearch1.py b/gerbmerge/tilesearch1.py new file mode 100644 index 0000000..59be680 --- /dev/null +++ b/gerbmerge/tilesearch1.py @@ -0,0 +1,243 @@ +#!/usr/bin/env python +"""Search for an optimum tiling using brute force exhaustive search +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import sys +import time + +import config +import tiling + +import gerbmerge + +_StartTime = 0.0 # Start time of tiling +_CkpointTime = 0.0 # Next time to print stats +_Placements = 0L # Number of placements attempted +_PossiblePermutations = 0L # Number of different ways of ordering jobs +_Permutations = 0L # Number of different job orderings already computed +_TBestTiling = None # Best tiling so far +_TBestScore = float(sys.maxint) # Smallest area so far +_PrintStats = 1 # Print statistics every 3 seconds + +def printTilingStats(): + global _CkpointTime + _CkpointTime = time.time() + 3 + + if _TBestTiling: + area = _TBestTiling.area() + utilization = _TBestTiling.usedArea() / area * 100.0 + else: + area = 999999.0 + utilization = 0.0 + + percent = 100.0*_Permutations/_PossiblePermutations + + print "\r %5.2f%% complete / %ld/%ld Perm/Place / Smallest area: %.1f sq. in. / Best utilization: %.1f%%" % \ + (percent, _Permutations, _Placements, area, utilization), + + if gerbmerge.GUI is not None: + sys.stdout.flush() + +def bestTiling(): + return _TBestTiling + +def _tile_search1(Jobs, TSoFar, firstAddPoint, cfg=config.Config): + """This recursive function does the following with an existing tiling TSoFar: + + * For each 4-tuple (Xdim,Ydim,job,rjob) in Jobs, the non-rotated 'job' is selected + + * For the non-rotated job, the list of valid add-points is found + + * For each valid add-point, the job is placed at this point in a new, + cloned tiling. + + * The function then calls its recursively with the remaining list of + jobs. + + * The rotated job is then selected and the list of valid add-points is + found. Again, for each valid add-point the job is placed there in + a new, cloned tiling. + + * Once again, the function calls itself recursively with the remaining + list of jobs. + + * The best tiling encountered from all recursive calls is returned. + + If TSoFar is None it means this combination of jobs is not tileable. + + The side-effect of this function is to set _TBestTiling and _TBestScore + to the best tiling encountered so far. _TBestTiling could be None if + no valid tilings have been found so far. + """ + global _StartTime, _CkpointTime, _Placements, _TBestTiling, _TBestScore, _Permutations, _PrintStats + + if not TSoFar: + return (None, float(sys.maxint)) + + if not Jobs: + # Update the best tiling and score. If the new tiling matches + # the best score so far, compare on number of corners, trying to + # minimize them. + score = TSoFar.area() + + if score < _TBestScore: + _TBestTiling,_TBestScore = TSoFar,score + elif score == _TBestScore: + if TSoFar.corners() < _TBestTiling.corners(): + _TBestTiling,_TBestScore = TSoFar,score + + _Placements += 1 + if firstAddPoint: + _Permutations += 1 + return + + xspacing = cfg['xspacing'] + yspacing = cfg['yspacing'] + + minInletSize = tiling.minDimension(Jobs) + TSoFar.removeInlets(minInletSize) + + for job_ix in range(len(Jobs)): + # Pop off the next job and construct remaining_jobs, a sub-list + # of Jobs with the job we've just popped off excluded. + Xdim,Ydim,job,rjob = Jobs[job_ix] + remaining_jobs = Jobs[:job_ix]+Jobs[job_ix+1:] + + if 0: + print "Level %d (%s)" % (level, job.name) + TSoFar.joblist() + for J in remaining_jobs: + print J[2].name, ", ", + print + print '-'*75 + + # Construct add-points for the non-rotated and rotated job. + # As an optimization, do not construct add-points for the rotated + # job if the job is a square (duh). + addpoints1 = TSoFar.validAddPoints(Xdim+xspacing,Ydim+yspacing) # unrotated job + if Xdim != Ydim: + addpoints2 = TSoFar.validAddPoints(Ydim+xspacing,Xdim+yspacing) # rotated job + else: + addpoints2 = [] + + # Recursively construct tilings for the non-rotated job and + # update the best-tiling-so-far as we do so. + if addpoints1: + for ix in addpoints1: + # Clone the tiling we're starting with and add the job at this + # add-point. + T = TSoFar.clone() + T.addJob(ix, Xdim+xspacing, Ydim+yspacing, job) + + # Recursive call with the remaining jobs and this new tiling. The + # point behind the last parameter is simply so that _Permutations is + # only updated once for each permutation, not once per add-point. + # A permutation is some ordering of jobs (N! choices) and some + # ordering of non-rotated and rotated within that ordering (2**N + # possibilities per ordering). + _tile_search1(remaining_jobs, T, firstAddPoint and ix==addpoints1[0]) + elif firstAddPoint: + # Premature prune due to not being able to put this job anywhere. We + # have pruned off 2^M permutations where M is the length of the remaining + # jobs. + _Permutations += 2L**len(remaining_jobs) + + if addpoints2: + for ix in addpoints2: + # Clone the tiling we're starting with and add the job at this + # add-point. Remember that the job is rotated so swap X and Y + # dimensions. + T = TSoFar.clone() + T.addJob(ix, Ydim+xspacing, Xdim+yspacing, rjob) + + # Recursive call with the remaining jobs and this new tiling. + _tile_search1(remaining_jobs, T, firstAddPoint and ix==addpoints2[0]) + elif firstAddPoint: + # Premature prune due to not being able to put this job anywhere. We + # have pruned off 2^M permutations where M is the length of the remaining + # jobs. + _Permutations += 2L**len(remaining_jobs) + + # If we've been at this for 3 seconds, print some status information + if _PrintStats and time.time() > _CkpointTime: + printTilingStats() + + # Check for timeout + if (config.SearchTimeout > 0) and (time.time() - _StartTime > config.SearchTimeout): + raise KeyboardInterrupt + + gerbmerge.updateGUI("Performing automatic layout...") + + # end for each job in job list + +def factorial(N): + if (N <= 1): return 1L + + prod = long(N) + while (N > 2): + N -= 1 + prod *= N + + return prod + +def initialize(printStats=1): + global _StartTime, _CkpointTime, _Placements, _TBestTiling, _TBestScore, _Permutations, _PossiblePermutations, _PrintStats + + _PrintStats = printStats + _Placements = 0L + _Permutations = 0L + _TBestTiling = None + _TBestScore = float(sys.maxint) + +def tile_search1(Jobs, X, Y): + """Wrapper around _tile_search1 to handle keyboard interrupt, etc.""" + global _StartTime, _CkpointTime, _Placements, _TBestTiling, _TBestScore, _Permutations, _PossiblePermutations + + initialize() + + _StartTime = time.time() + _CkpointTime = _StartTime + 3 + # There are (2**N)*(N!) possible permutations where N is the number of jobs. + # This is assuming all jobs are unique and each job has a rotation (i.e., is not + # square). Practically, these assumptions make no difference because the software + # currently doesn't optimize for cases of repeated jobs. + _PossiblePermutations = (2L**len(Jobs))*factorial(len(Jobs)) + #print "Possible permutations:", _PossiblePermutations + + print '='*70 + print "Starting placement using exhaustive search." + print "There are %ld possible permutations..." % _PossiblePermutations, + if _PossiblePermutations < 1e4: + print "this'll take no time at all." + elif _PossiblePermutations < 1e5: + print "surf the web for a few minutes." + elif _PossiblePermutations < 1e6: + print "take a long lunch." + elif _PossiblePermutations < 1e7: + print "come back tomorrow." + else: + print "don't hold your breath." + print "Press Ctrl-C to stop and use the best placement so far." + print "Estimated maximum possible utilization is %.1f%%." % (tiling.maxUtilization(Jobs)*100) + + try: + _tile_search1(Jobs, tiling.Tiling(X,Y), 1) + printTilingStats() + print + except KeyboardInterrupt: + printTilingStats() + print + print "Interrupted." + + computeTime = time.time() - _StartTime + print "Computed %ld placements in %d seconds / %.1f placements/second" % (_Placements, computeTime, _Placements/computeTime) + print '='*70 + + return _TBestTiling diff --git a/gerbmerge/tilesearch2.py b/gerbmerge/tilesearch2.py new file mode 100644 index 0000000..4ad5479 --- /dev/null +++ b/gerbmerge/tilesearch2.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python +"""Tile search using random placement and evaluation. Works surprisingly well. +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import sys +import time +import random + +import config +import tiling +import tilesearch1 + +import gerbmerge + +_StartTime = 0.0 # Start time of tiling +_CkpointTime = 0.0 # Next time to print stats +_Placements = 0L # Number of placements attempted +_TBestTiling = None # Best tiling so far +_TBestScore = float(sys.maxint) # Smallest area so far + +def printTilingStats(): + global _CkpointTime + _CkpointTime = time.time() + 3 + + if _TBestTiling: + area = _TBestTiling.area() + utilization = _TBestTiling.usedArea() / area * 100.0 + else: + area = 999999.0 + utilization = 0.0 + + print "\r %ld placements / Smallest area: %.1f sq. in. / Best utilization: %.1f%%" % \ + (_Placements, area, utilization), + + if gerbmerge.GUI is not None: + sys.stdout.flush() + +def _tile_search2(Jobs, X, Y, cfg=config.Config): + global _CkpointTime, _Placements, _TBestTiling, _TBestScore + + r = random.Random() + N = len(Jobs) + + # M is the number of jobs that will be placed randomly. + # N-M is the number of jobs that will be searched exhaustively. + M = N - config.RandomSearchExhaustiveJobs + M = max(M,0) + + xspacing = cfg['xspacing'] + yspacing = cfg['yspacing'] + + # Must escape with Ctrl-C + while 1: + T = tiling.Tiling(X,Y) + joborder = r.sample(range(N), N) + + minInletSize = tiling.minDimension(Jobs) + + for ix in joborder[:M]: + Xdim,Ydim,job,rjob = Jobs[ix] + + T.removeInlets(minInletSize) + + if r.choice([0,1]): + addpoints = T.validAddPoints(Xdim+xspacing,Ydim+yspacing) + if not addpoints: + break + + pt = r.choice(addpoints) + T.addJob(pt, Xdim+xspacing, Ydim+yspacing, job) + else: + addpoints = T.validAddPoints(Ydim+xspacing,Xdim+yspacing) + if not addpoints: + break + + pt = r.choice(addpoints) + T.addJob(pt, Ydim+xspacing, Xdim+yspacing, rjob) + else: + # Do exhaustive search on remaining jobs + if N-M: + remainingJobs = [] + for ix in joborder[M:]: + remainingJobs.append(Jobs[ix]) + + tilesearch1.initialize(0) + tilesearch1._tile_search1(remainingJobs, T, 1) + T = tilesearch1.bestTiling() + + if T: + score = T.area() + + if score < _TBestScore: + _TBestTiling,_TBestScore = T,score + elif score == _TBestScore: + if T.corners() < _TBestTiling.corners(): + _TBestTiling,_TBestScore = T,score + + _Placements += 1 + + # If we've been at this for 3 seconds, print some status information + if time.time() > _CkpointTime: + printTilingStats() + + # Check for timeout + if (config.SearchTimeout > 0) and ((time.time() - _StartTime) > config.SearchTimeout): + raise KeyboardInterrupt + + gerbmerge.updateGUI("Performing automatic layout...") + + # end while 1 + +def tile_search2(Jobs, X, Y): + """Wrapper around _tile_search2 to handle keyboard interrupt, etc.""" + global _StartTime, _CkpointTime, _Placements, _TBestTiling, _TBestScore + + _StartTime = time.time() + _CkpointTime = _StartTime + 3 + _Placements = 0L + _TBestTiling = None + _TBestScore = float(sys.maxint) + + print '='*70 + print "Starting random placement trials. You must press Ctrl-C to" + print "stop the process and use the best placement so far." + print "Estimated maximum possible utilization is %.1f%%." % (tiling.maxUtilization(Jobs)*100) + + try: + _tile_search2(Jobs, X, Y) + printTilingStats() + print + except KeyboardInterrupt: + printTilingStats() + print + print "Interrupted." + + computeTime = time.time() - _StartTime + print "Computed %ld placements in %d seconds / %.1f placements/second" % (_Placements, computeTime, _Placements/computeTime) + print '='*70 + + return _TBestTiling diff --git a/gerbmerge/tiling.py b/gerbmerge/tiling.py new file mode 100644 index 0000000..8fc83be --- /dev/null +++ b/gerbmerge/tiling.py @@ -0,0 +1,377 @@ +#!/usr/bin/env python +"""A tiling is an arrangement of jobs, where each job may +be a copy of another and may be rotated. A tiling consists +of two things: + + - a list of where each job is located (the lower-left of + each job is the origin) + + - a list of points that begins at (0,Ymax) and ends at + (Xmax,0). These points describe the outside boundary + of the tiling. +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +import sys +import math + +import config +import jobs + +# Helper functions to determine if points are right-of, left-of, above, and +# below each other. These definitions assume that points are on a line that +# is vertical or horizontal. +def left_of(p1,p2): + return p1[0]p2[0] and p1[1]==p2[1] + +def above(p1,p2): + return p1[1]>p2[1] and p1[0]==p2[0] + +def below(p1,p2): + return p1[1]t.left_edge + and + p.bottom_edget.bottom_edge + """ + if self.isL(ix): + p_bl = self.points[ix] + p_tr = (p_bl[0]+X, p_bl[1]+Y) + if p_tr[0]>self.xmax or p_tr[1]>self.ymax: + return 1 + else: + p_bl = (self.points[ix][0]-X,self.points[ix][1]) + p_tr = (self.points[ix][0],self.points[ix][1]+Y) + if p_bl[0]<0 or p_tr[1]>self.ymax: + return 1 + + for t_bl,t_tr,Job in self.jobs: + if p_bl[0]t_bl[0] \ + and \ + p_bl[1]t_bl[1]: + return 1 + + return 0 + + def isL(self, ix): + """True if self.points[ix] represents an L-shaped corner where there + is free space above and to the right, like this: + + +------+ _____ this point is an L-shaped corner + | | / + | +______+ + | | + | | + . . + . . + . . + """ + pts = self.points + # This is an L-point if: + # Previous point X co-ordinates are the same, and + # previous point Y co-ordinate is higher, and + # next point Y co-ordinate is the same, and + # next point X co-ordinate is to the right + return pts[ix-1][0]==pts[ix][0] \ + and pts[ix-1][1]>pts[ix][1] \ + and pts[ix+1][1]==pts[ix][1] \ + and pts[ix+1][0]>pts[ix][0] + + def isMirrorL(self, ix): + """True if self.points[ix] represents a mirrored L-shaped corner where there + is free space above and to the left, like this: + + +------+ +mirrored-L corner __ | | + \ | | + +______+ | + | | + | | + . . + . . + . . + """ + pts = self.points + # This is a mirrored L-point if: + # Previous point Y co-ordinates are the same, and + # previous point X co-ordinate is lower, and + # next point X co-ordinate is the same, and + # next point X co-ordinate is higher + return pts[ix-1][1]==pts[ix][1] \ + and pts[ix-1][0]pts[ix][1] + + def validAddPoints(self, X, Y): + """Return a list of all valid indices into self.points at which we can add + the job with dimensions X-by-Y). Only points which are either L-points or + mirrored-L-points and which would support the given job with no overlaps + are returned. + """ + return [ix for ix in range(1,len(self.points)-1) if (self.isL(ix) or self.isMirrorL(ix)) and not self.isOverlap(ix,X,Y)] + + def mergePoints(self, ix): + """Inspect points self.points[ix] and self.points[ix+1] as well + as self.points[ix+3] and self.points[ix+4]. If they are the same, delete + both points, thus merging lines formed when the corners of two jobs coincide. + """ + + # Do farther-on points first so we can delete things right from the list + if self.points[ix+3]==self.points[ix+4]: + del self.points[ix+3:ix+5] + + if self.points[ix]==self.points[ix+1]: + del self.points[ix:ix+2] + + # Experimental + def removeInlets(self, minSize): + """Find sequences of 3 points that define an "inlet", either a left/right-going gap: + + ...---------------+ +--------..... + | | + | | + +------------+ +------------+ + | | + +----------------------+ +--------------------+ + | | + . . + . . + . . + or a down-going gap: +-------..... + | + ...-----------+ ...-------------+ | + | | | + | | | + | | | + | | | + | +-----.... | | + | | | | + | | | | + +--+ +--+ + + that are too small for any job to fit in (as defined by minSize). These inlets + can be deleted to form corners where new jobs can be placed. + """ + pt = self.points + done = 0 + + while not done: + # Repeat this loop each time there is a change + for ix in range(0, len(pt)-3): + + # Check for horizontal left-going inlet + if right_of(pt[ix],pt[ix+1]) and above(pt[ix+1],pt[ix+2]) and left_of(pt[ix+2],pt[ix+3]): + # Make sure minSize requirement is met + if pt[ix][1]-pt[ix+3][1] < minSize: + # Get rid of middle two points, extend Y-value of highest point down to lowest point + pt[ix] = (pt[ix][0],pt[ix+3][1]) + del pt[ix+1:ix+3] + break + + # Check for horizontal right-going inlet + if left_of(pt[ix],pt[ix+1]) and below(pt[ix+1],pt[ix+2]) and right_of(pt[ix+2],pt[ix+3]): + # Make sure minSize requirement is met + if pt[ix+3][1]-pt[ix][1] < minSize: + # Get rid of middle two points, exten Y-value of highest point down to lowest point + pt[ix+3] = (pt[ix+3][0], pt[ix][1]) + del pt[ix+1:ix+3] + break + + # Check for vertical inlets + if above(pt[ix],pt[ix+1]) and left_of(pt[ix+1],pt[ix+2]) and below(pt[ix+2],pt[ix+3]): + # Make sure minSize requirement is met + if pt[ix+3][0]-pt[ix][0] < minSize: + # Is right side lower or higher? + if pt[ix+3][1]>=pt[ix][1]: # higher? + pt[ix] = (pt[ix+3][0], pt[ix][1]) # Move first point to the right + else: # lower? + pt[ix+3] = (pt[ix][0], pt[ix+3][1]) # Move last point to the left + del pt[ix+1:ix+3] + break + + else: + done = 1 + + def addLJob(self, ix, X, Y, Job, cfg=config.Config): + """Add a job to the tiling at L-point self.points[ix] with actual dimensions X-by-Y. + The job is added with its lower-left corner at the point. The existing point + is removed from the tiling and new points are added at the top-left, top-right + and bottom-right of the new job, with extra space added for inter-job spacing. + """ + x,y = self.points[ix] + x_tr = x+X + y_tr = y+Y + self.points[ix:ix+1] = [(x,y_tr), (x_tr,y_tr), (x_tr,y)] + self.jobs.append( ((x,y),(x_tr,y_tr),Job) ) + + self.mergePoints(ix-1) + + def addMirrorLJob(self, ix, X, Y, Job, cfg=config.Config): + """Add a job to the tiling at mirror-L-point self.points[ix] with dimensions X-by-Y. + The job is added with its lower-right corner at the point. The existing point + is removed from the tiling and new points are added at the bottom-left, top-left + and top-right of the new job, with extra space added for inter-job spacing. + """ + x_tr,y = self.points[ix] + x = x_tr-X + y_tr = y+Y + self.points[ix:ix+1] = [(x,y), (x,y_tr), (x_tr,y_tr)] + self.jobs.append( ((x,y),(x_tr,y_tr),Job) ) + + self.mergePoints(ix-1) + + def addJob(self, ix, X, Y, Job): + """Add a job to the tiling at point self.points[ix] and with dimensions X-by-Y. + If the given point is an L-point, the job will be added with its lower-left + corner at the point. If the given point is a mirrored-L point, the job will + be added with its lower-right corner at the point. + """ + if self.isL(ix): + self.addLJob(ix, X, Y, Job) + else: + self.addMirrorLJob(ix, X, Y, Job) + + def bounds(self): + """Return 2-tuple ((minX, minY), (maxX, maxY)) of rectangular region defined by all jobs""" + minX = minY = float(sys.maxint) + maxX = maxY = 0.0 + + for bl,tr,job in self.jobs: + minX = min(minX,bl[0]) + maxX = max(maxX,tr[0]) + minY = min(minY,bl[1]) + maxY = max(maxY,tr[1]) + + return ( (minX,minY), (maxX-config.Config['xspacing'], maxY-config.Config['yspacing']) ) + + def area(self): + """Return area of rectangular region defined by all jobs.""" + bl,tr = self.bounds() + + DX = tr[0]-bl[0] + DY = tr[1]-bl[1] + return DX*DY + + def usedArea(self): + """Return total area of just jobs, not spaces in-between.""" + area = 0.0 + for job in self.jobs: + area += job[2].jobarea() + + return area + +# Function to estimate the maximum possible utilization given a list of jobs. +# Jobs list is 4-tuple (Xdim,Ydim,job,rjob). +def maxUtilization(Jobs): + xspacing = config.Config['xspacing'] + yspacing = config.Config['yspacing'] + + usedArea = totalArea = 0.0 + for Xdim,Ydim,job,rjob in Jobs: + usedArea += job.jobarea() + totalArea += job.jobarea() + totalArea += job.width_in()*xspacing + job.height_in()*yspacing + xspacing*yspacing + + # Reduce total area by strip of unused spacing around top and side. Assume + # final result will be approximately square. + sq_side = math.sqrt(totalArea) + totalArea -= sq_side*xspacing + sq_side*yspacing + xspacing*yspacing + + return usedArea/totalArea + +# Utility function to compute the minimum dimension along any axis of all jobs. +# Used to remove inlets. +def minDimension(Jobs): + M = float(sys.maxint) + for Xdim,Ydim,job,rjob in Jobs: + M = min(M,Xdim) + M = min(M,Ydim) + return M + +# vim: expandtab ts=2 sw=2 diff --git a/gerbmerge/util.py b/gerbmerge/util.py new file mode 100644 index 0000000..ad5cf84 --- /dev/null +++ b/gerbmerge/util.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +""" +Various utility functions + +-------------------------------------------------------------------- + +This program is licensed under the GNU General Public License (GPL) +Version 3. See http://www.fsf.org for details of the license. + +Rugged Circuits LLC +http://ruggedcircuits.com/gerbmerge +""" + +def in2gerb(value): + """Convert inches to 2.5 Gerber units""" + return int(round(value*1e5)) + +def gerb2in(value): + """Convert 2.5 Gerber units to inches""" + return float(value)*1e-5 diff --git a/misc/gerbmerge.bat b/misc/gerbmerge.bat new file mode 100644 index 0000000..28926c3 --- /dev/null +++ b/misc/gerbmerge.bat @@ -0,0 +1,3 @@ +@echo off +c:\python26\python c:\python26\lib\site-packages\gerbmerge\gerbmerge.py %1 %2 %3 %4 %5 %6 %7 %8 %9 + diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..b7192ea --- /dev/null +++ b/setup.cfg @@ -0,0 +1,5 @@ +[sdist] +keep_temp=1 + +[install] +record=installed_files diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..ea39091 --- /dev/null +++ b/setup.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python +import sys +import glob +import os + +from distutils.core import setup, Extension +import distutils.sysconfig + +from gerbmerge.gerbmerge import VERSION_MAJOR, VERSION_MINOR + +if sys.version_info < (2,4,0): + print '*'*73 + print 'GerbMerge version %d.%d requires Python 2.4 or higher' % (VERSION_MAJOR, VERSION_MINOR) + print '*'*73 + sys.exit(1) + +if 0: + for key,val in distutils.sysconfig.get_config_vars().items(): + print key + print '***********************' + print ' ', val + print + print + + sys.exit(0) + +SampleFiles = glob.glob('testdata/*') +DocFiles = glob.glob('doc/*') +AuxFiles = ['COPYING'] + +if sys.platform == 'win32' or ('bdist_wininst' in sys.argv): + #DestLib = distutils.sysconfig.get_config_var('prefix') + #DestDir = os.path.join(DestLib, 'gerbmerge') + #BinDir = DestLib + DestLib = '.' + DestDir = os.path.join(DestLib, 'gerbmerge') + BinFiles = ['misc/gerbmerge.bat'] + BinDir = '.' +else: + DestLib = distutils.sysconfig.get_config_var('LIBPYTHON') + DestDir = os.path.join(DestLib, 'gerbmerge') + BinFiles = ['misc/gerbmerge'] + BinDir = distutils.sysconfig.get_config_var('BINDIR') + + # Create top-level invocation program + fid = file('misc/gerbmerge', 'wt') + fid.write( \ + r"""#!/bin/sh +python %s/site-packages/gerbmerge/gerbmerge.py $* + """ % DestLib) + fid.close() + +dist=setup (name = "gerbmerge", + license = "GPL", + version = "%d.%d" % (VERSION_MAJOR, VERSION_MINOR), + long_description=\ +r"""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. +""", + description = "Merge multiple Gerber/Excellon files", + author = "Rugged Circuits LLC", + author_email = "support@ruggedcircuits.com", + url = "http://ruggedcircuits.com/gerbmerge", + packages = ['gerbmerge'], + platforms = ['all'], + data_files = [ (DestDir, AuxFiles), + (os.path.join(DestDir,'testdata'), SampleFiles), + (os.path.join(DestDir,'doc'), DocFiles), + (BinDir, BinFiles) ] +) + +do_fix_perms = 0 +if sys.platform != "win32": + for cmd in dist.commands: + if cmd[:7]=='install': + do_fix_perms = 1 + break + +if do_fix_perms: + # Ensure package files and misc/help files are world readable-searchable. + # Shouldn't Distutils do this for us? + print 'Setting permissions on installed files...', + try: + def fixperms(arg, dirname, names): + os.chmod(dirname, 0755) + for name in names: + fullname = os.path.join(dirname, name) + if os.access(fullname, os.X_OK): + os.chmod(fullname, 0755) + else: + os.chmod(fullname, 0644) + + os.path.walk(DestDir, fixperms, 1) + os.path.walk(os.path.join(DestLib, 'site-packages/gerbmerge'), fixperms, 1) + + os.chmod(os.path.join(BinDir, 'gerbmerge'), 0755) + print 'done' + except: + print 'FAILED' + print + print '*** Please verify that the installed files have correct permissions. On' + print "*** systems without permission flags, you don't need to" + print '*** worry about it.' + +if cmd[:7]=='install': + print + print '******** Installation Complete ******** ' + print + print 'Sample files and documentation have been installed in:' + print ' ', DestDir + print + print 'A shortcut to starting the program has been installed as:' + print ' ', os.path.join(BinDir, 'gerbmerge') + print diff --git a/testdata/Makefile b/testdata/Makefile new file mode 100644 index 0000000..e232d91 --- /dev/null +++ b/testdata/Makefile @@ -0,0 +1,23 @@ +all: merge1.xln merge2.xln + +merge1.xln: + gerbmerge layout1.cfg layout1.def + +merge2.xln: + gerbmerge layout2.cfg layout2.def + +view1: + gerbv merge1.* & + +view2: + gerbv merge2.* & + +clean: + -rm -f merge1.* merge2.* toollist.* placement.* + +# Demonstrates randomized search +random: + -rm -f merge2.* + -gerbmerge layout2.cfg + +# vim: noexpandtab diff --git a/testdata/README b/testdata/README new file mode 100644 index 0000000..4087083 --- /dev/null +++ b/testdata/README @@ -0,0 +1,30 @@ +This directory contains example projects for demonstrating GerbMerge. + +Proj1 is a small board that has ovals, thermals, arcs, circles, polygons, +and text. Hexapod is the example board that comes with Eagle. + +Each project has CAM data generated from its associated *.cam file, +hence proj1.cam and hexapod.cam were used to generate drawing data. + +The "layout1.cfg" and "layout1.def" files demonstrate how GerbMerge can +be used to panelize a single job, including rotation. + +The "layout2.cfg" and "layout2.def" files demonstrate panelizing +different jobs. + +The Makefile in this directory shows an example of how to invoke +the program and how to view the results under Linux. You need to +have the gerbv program installed (see http://gerbv.sourceforge.net) +for viewing the output files. + +The syntax for running GerbMerge is: + + gerbmerge layout1.cfg layout1.def + +If you are running Linux and have installed the 'gerbv' Gerber previewer, +you can view the results by typing: + + gerbv *.ger *.xln + +On Windows systems, GC-Prevue and ViewMate should be able to Import +the above files for previewing. diff --git a/testdata/fabdwg.txt b/testdata/fabdwg.txt new file mode 100644 index 0000000..3474362 --- /dev/null +++ b/testdata/fabdwg.txt @@ -0,0 +1,7 @@ +* FR4 Material +* 1 oz. copper +* All holes plated through +* Drills shown as finished sizes +* Board thickness 0.062" + + diff --git a/testdata/hexapod.bor b/testdata/hexapod.bor new file mode 100644 index 0000000..b456bcd --- /dev/null +++ b/testdata/hexapod.bor @@ -0,0 +1,157 @@ +G75* +G70* +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0000*% +D10* +X000101Y000252D02* +X039471Y000252D01* +X039471Y031748D01* +X000101Y031748D01* +X000101Y000252D01* +X043351Y020502D02* +X043354Y020561D01* +X043362Y020620D01* +X043375Y020677D01* +X043394Y020734D01* +X043417Y020788D01* +X043446Y020840D01* +X043479Y020889D01* +X043516Y020935D01* +X043557Y020977D01* +X043602Y021015D01* +X043651Y021050D01* +X043702Y021079D01* +X043756Y021104D01* +X043811Y021124D01* +X043869Y021138D01* +X043927Y021148D01* +X043986Y021152D01* +X044045Y021150D01* +X044104Y021144D01* +X044162Y021132D01* +X044219Y021114D01* +X044273Y021092D01* +X044326Y021065D01* +X044376Y021033D01* +X044423Y020997D01* +X044466Y020956D01* +X044505Y020912D01* +X044540Y020865D01* +X044571Y020814D01* +X044597Y020761D01* +X044618Y020706D01* +X044634Y020649D01* +X044645Y020591D01* +X044650Y020532D01* +X044650Y020472D01* +X044645Y020413D01* +X044634Y020355D01* +X044618Y020298D01* +X044597Y020243D01* +X044571Y020190D01* +X044540Y020139D01* +X044505Y020092D01* +X044466Y020048D01* +X044423Y020007D01* +X044376Y019971D01* +X044326Y019939D01* +X044273Y019912D01* +X044219Y019890D01* +X044162Y019872D01* +X044104Y019860D01* +X044045Y019854D01* +X043986Y019852D01* +X043927Y019856D01* +X043869Y019866D01* +X043811Y019880D01* +X043756Y019900D01* +X043702Y019925D01* +X043651Y019954D01* +X043602Y019989D01* +X043557Y020027D01* +X043516Y020069D01* +X043479Y020115D01* +X043446Y020164D01* +X043417Y020216D01* +X043394Y020270D01* +X043375Y020327D01* +X043362Y020384D01* +X043354Y020443D01* +X043351Y020502D01* +X043351Y025002D02* +X043354Y025061D01* +X043362Y025120D01* +X043375Y025177D01* +X043394Y025234D01* +X043417Y025288D01* +X043446Y025340D01* +X043479Y025389D01* +X043516Y025435D01* +X043557Y025477D01* +X043602Y025515D01* +X043651Y025550D01* +X043702Y025579D01* +X043756Y025604D01* +X043811Y025624D01* +X043869Y025638D01* +X043927Y025648D01* +X043986Y025652D01* +X044045Y025650D01* +X044104Y025644D01* +X044162Y025632D01* +X044219Y025614D01* +X044273Y025592D01* +X044326Y025565D01* +X044376Y025533D01* +X044423Y025497D01* +X044466Y025456D01* +X044505Y025412D01* +X044540Y025365D01* +X044571Y025314D01* +X044597Y025261D01* +X044618Y025206D01* +X044634Y025149D01* +X044645Y025091D01* +X044650Y025032D01* +X044650Y024972D01* +X044645Y024913D01* +X044634Y024855D01* +X044618Y024798D01* +X044597Y024743D01* +X044571Y024690D01* +X044540Y024639D01* +X044505Y024592D01* +X044466Y024548D01* +X044423Y024507D01* +X044376Y024471D01* +X044326Y024439D01* +X044273Y024412D01* +X044219Y024390D01* +X044162Y024372D01* +X044104Y024360D01* +X044045Y024354D01* +X043986Y024352D01* +X043927Y024356D01* +X043869Y024366D01* +X043811Y024380D01* +X043756Y024400D01* +X043702Y024425D01* +X043651Y024454D01* +X043602Y024489D01* +X043557Y024527D01* +X043516Y024569D01* +X043479Y024615D01* +X043446Y024664D01* +X043417Y024716D01* +X043394Y024770D01* +X043375Y024827D01* +X043362Y024884D01* +X043354Y024943D01* +X043351Y025002D01* +M02* diff --git a/testdata/hexapod.brd b/testdata/hexapod.brd new file mode 100644 index 0000000000000000000000000000000000000000..28a0e987805fbe8971a3cf27ae1d20cba23f63e6 GIT binary patch literal 60224 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 literal 0 HcmV?d00001 diff --git a/testdata/hexapod.sol b/testdata/hexapod.sol new file mode 100644 index 0000000..c6bc45a --- /dev/null +++ b/testdata/hexapod.sol @@ -0,0 +1,1413 @@ +G75* +G70* +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0070*% +%ADD11C,0.0630*% +%ADD12C,0.1240*% +%ADD13C,0.0700*% +%ADD14O,0.1575X0.0787*% +%ADD15C,0.0240*% +%ADD16C,0.0850*% +%ADD17C,0.0160*% +%ADD18C,0.0472*% +%ADD19C,0.0500*% +%ADD20C,0.1000*% +%ADD21C,0.0600*% +D10* +X001567Y013287D02* +X001567Y013917D01* +X001777Y013917D02* +X001356Y013917D01* +X002001Y013812D02* +X002001Y013392D01* +X002106Y013287D01* +X002316Y013287D01* +X002421Y013392D01* +X002421Y013812D01* +X002316Y013917D01* +X002106Y013917D01* +X002001Y013812D01* +X002645Y013812D02* +X002645Y013707D01* +X002751Y013602D01* +X003066Y013602D01* +X003066Y013287D02* +X002751Y013287D01* +X002645Y013392D01* +X002645Y013497D01* +X002751Y013602D01* +X002645Y013812D02* +X002751Y013917D01* +X003066Y013917D01* +X003066Y013287D01* +D11* +X005601Y013502D03* +X005601Y012502D03* +X008351Y012502D03* +X008351Y013502D03* +X008351Y011502D03* +X008351Y010502D03* +X008351Y009502D03* +X008351Y008502D03* +X008351Y007502D03* +X008351Y006502D03* +X008851Y004502D03* +X009851Y004502D03* +X010851Y004502D03* +X011851Y004502D03* +X012851Y004502D03* +X013851Y004502D03* +X014851Y004502D03* +X015851Y004502D03* +X016851Y004502D03* +X017851Y004502D03* +X018851Y004502D03* +X019851Y004502D03* +X020851Y004502D03* +X021851Y004502D03* +X022851Y004502D03* +X023851Y004502D03* +X024851Y004502D03* +X025851Y004502D03* +X026851Y004502D03* +X027851Y004502D03* +X028851Y004502D03* +X029851Y004502D03* +X030851Y004502D03* +X031851Y004502D03* +X031851Y003502D03* +X030851Y003502D03* +X029851Y003502D03* +X028851Y003502D03* +X027851Y003502D03* +X026851Y003502D03* +X025851Y003502D03* +X024851Y003502D03* +X023851Y003502D03* +X022851Y003502D03* +X021851Y003502D03* +X020851Y003502D03* +X019851Y003502D03* +X018851Y003502D03* +X017851Y003502D03* +X016851Y003502D03* +X015851Y003502D03* +X014851Y003502D03* +X013851Y003502D03* +X012851Y003502D03* +X011851Y003502D03* +X010851Y003502D03* +X009851Y003502D03* +X008851Y003502D03* +X007851Y003502D03* +X007851Y004502D03* +X005601Y006502D03* +X005601Y007502D03* +X002851Y008002D03* +X001851Y008002D03* +X001851Y009002D03* +X002851Y009002D03* +X002851Y010002D03* +X001851Y010002D03* +X001851Y007002D03* +X002851Y007002D03* +X002851Y006002D03* +X001851Y006002D03* +X001851Y005002D03* +X002851Y005002D03* +X002851Y004002D03* +X001851Y004002D03* +X001851Y003002D03* +X002851Y003002D03* +X011351Y006502D03* +X012351Y006502D03* +X012351Y007502D03* +X012351Y008502D03* +X012351Y009502D03* +X012351Y010502D03* +X011351Y010502D03* +X011351Y009502D03* +X011351Y008502D03* +X011351Y007502D03* +X015351Y007502D03* +X016351Y007502D03* +X016351Y008502D03* +X015351Y008502D03* +X015351Y009502D03* +X016351Y009502D03* +X016351Y010502D03* +X015351Y010502D03* +X015351Y011502D03* +X016351Y011502D03* +X016351Y012502D03* +X015351Y012502D03* +X015351Y013502D03* +X016351Y013502D03* +X016351Y015502D03* +X015351Y015502D03* +X014351Y015502D03* +X012851Y015502D03* +X011851Y015502D03* +X010851Y015502D03* +X009851Y015502D03* +X008851Y015502D03* +X007851Y015502D03* +X006851Y015502D03* +X005851Y015502D03* +X002851Y017002D03* +X001851Y017002D03* +X001851Y018002D03* +X002851Y018002D03* +X002851Y019002D03* +X001851Y019002D03* +X001851Y020002D03* +X002851Y020002D03* +X002851Y021002D03* +X001851Y021002D03* +X001851Y022002D03* +X002851Y022002D03* +X002851Y023002D03* +X001851Y023002D03* +X001851Y024002D03* +X002851Y024002D03* +X002851Y025002D03* +X001851Y025002D03* +X001851Y026002D03* +X002851Y026002D03* +X002851Y027002D03* +X001851Y027002D03* +X001851Y028002D03* +X002851Y028002D03* +X002851Y029002D03* +X001851Y029002D03* +X007851Y022502D03* +X008851Y022502D03* +X009851Y022502D03* +X010851Y022502D03* +X011851Y022502D03* +X012851Y022502D03* +X013851Y022502D03* +X014851Y022502D03* +X015851Y022502D03* +X016851Y022502D03* +X017851Y022502D03* +X018851Y022502D03* +X019851Y022502D03* +X020851Y022502D03* +X021851Y022502D03* +X022851Y022502D03* +X023851Y022502D03* +X024851Y022502D03* +X025851Y022502D03* +X026851Y022502D03* +X027851Y022502D03* +X028851Y022502D03* +X029851Y022502D03* +X030851Y022502D03* +X031851Y022502D03* +X031851Y021502D03* +X030851Y021502D03* +X029851Y021502D03* +X028851Y021502D03* +X027851Y021502D03* +X026851Y021502D03* +X025851Y021502D03* +X024851Y021502D03* +X023851Y021502D03* +X022851Y021502D03* +X021851Y021502D03* +X020851Y021502D03* +X019851Y021502D03* +X018851Y021502D03* +X017851Y021502D03* +X016851Y021502D03* +X015851Y021502D03* +X014851Y021502D03* +X013851Y021502D03* +X012851Y021502D03* +X011851Y021502D03* +X010851Y021502D03* +X009851Y021502D03* +X008851Y021502D03* +X007851Y021502D03* +X007851Y018502D03* +X008851Y018502D03* +X009851Y018502D03* +X010851Y018502D03* +X011851Y018502D03* +X012851Y018502D03* +X014351Y018502D03* +X015351Y018502D03* +X016351Y018502D03* +X017351Y018502D03* +X018351Y018502D03* +X019351Y018502D03* +X020351Y018502D03* +X021351Y018502D03* +X022851Y018502D03* +X023851Y018502D03* +X024851Y018502D03* +X025851Y018502D03* +X026851Y018502D03* +X027851Y018502D03* +X028851Y018502D03* +X029851Y018502D03* +X031851Y018502D03* +X031851Y017502D03* +X032851Y015752D03* +X032851Y014752D03* +X031351Y013502D03* +X031351Y012502D03* +X031351Y011502D03* +X031351Y010502D03* +X031351Y009502D03* +X031351Y008502D03* +X031351Y007502D03* +X031351Y006502D03* +X028351Y006502D03* +X028351Y007502D03* +X028351Y008502D03* +X028351Y009502D03* +X028351Y010502D03* +X027351Y010502D03* +X027351Y009502D03* +X027351Y008502D03* +X027351Y007502D03* +X027351Y006502D03* +X024351Y006502D03* +X023351Y006502D03* +X023351Y007502D03* +X024351Y007502D03* +X024351Y008502D03* +X023351Y008502D03* +X023351Y009502D03* +X024351Y009502D03* +X024351Y010502D03* +X023351Y010502D03* +X023351Y011502D03* +X024351Y011502D03* +X024351Y012502D03* +X023351Y012502D03* +X023351Y013502D03* +X024351Y013502D03* +X024851Y015502D03* +X025851Y015502D03* +X026851Y015502D03* +X027851Y015502D03* +X028851Y015502D03* +X029851Y015502D03* +X028351Y013502D03* +X028351Y012502D03* +X028351Y011502D03* +X027351Y011502D03* +X027351Y012502D03* +X027351Y013502D03* +X023851Y015502D03* +X022851Y015502D03* +X021351Y015502D03* +X020351Y015502D03* +X019351Y015502D03* +X018351Y015502D03* +X017351Y015502D03* +X019351Y013502D03* +X020351Y013502D03* +X020351Y012502D03* +X019351Y012502D03* +X019351Y011502D03* +X020351Y011502D03* +X020351Y010502D03* +X019351Y010502D03* +X019351Y009502D03* +X020351Y009502D03* +X020351Y008502D03* +X019351Y008502D03* +X019351Y007502D03* +X020351Y007502D03* +X020351Y006502D03* +X019351Y006502D03* +X016351Y006502D03* +X015351Y006502D03* +X012351Y011502D03* +X012351Y012502D03* +X012351Y013502D03* +X011351Y013502D03* +X011351Y012502D03* +X011351Y011502D03* +X006851Y018502D03* +X005851Y018502D03* +X021601Y028752D03* +X021601Y029752D03* +X036351Y015252D03* +X037351Y015252D03* +X037351Y014252D03* +X036351Y014252D03* +X036351Y013252D03* +X037351Y013252D03* +X037351Y012252D03* +X036351Y012252D03* +X036351Y011252D03* +X037351Y011252D03* +X037351Y010252D03* +X036351Y010252D03* +X036351Y009252D03* +X037351Y009252D03* +X037351Y008252D03* +X036351Y008252D03* +X036351Y005502D03* +X037351Y005502D03* +X038351Y005502D03* +X035351Y005502D03* +X034351Y005502D03* +X034351Y001502D03* +X035351Y001502D03* +X036351Y001502D03* +X037351Y001502D03* +X038351Y001502D03* +D12* +X020351Y027502D03* +X025351Y029502D03* +X029291Y029502D03* +X032241Y029502D03* +X035191Y029502D03* +X006351Y027502D03* +D13* +X030351Y026252D03* +X030351Y024252D03* +D14* +X037101Y024002D03* +X037101Y025002D03* +X037101Y026002D03* +X037101Y021502D03* +X037101Y020502D03* +X037101Y019502D03* +D15* +X043751Y020502D02* +X043753Y020534D01* +X043759Y020565D01* +X043769Y020596D01* +X043783Y020625D01* +X043801Y020652D01* +X043821Y020676D01* +X043845Y020697D01* +X043871Y020716D01* +X043900Y020731D01* +X043930Y020742D01* +X043961Y020749D01* +X043993Y020752D01* +X044025Y020751D01* +X044057Y020746D01* +X044087Y020737D01* +X044117Y020724D01* +X044144Y020707D01* +X044169Y020687D01* +X044191Y020664D01* +X044211Y020638D01* +X044226Y020610D01* +X044238Y020581D01* +X044246Y020550D01* +X044250Y020518D01* +X044250Y020486D01* +X044246Y020454D01* +X044238Y020423D01* +X044226Y020394D01* +X044211Y020366D01* +X044191Y020340D01* +X044169Y020317D01* +X044144Y020297D01* +X044117Y020280D01* +X044087Y020267D01* +X044057Y020258D01* +X044025Y020253D01* +X043993Y020252D01* +X043961Y020255D01* +X043930Y020262D01* +X043900Y020273D01* +X043871Y020288D01* +X043845Y020307D01* +X043821Y020328D01* +X043801Y020352D01* +X043783Y020379D01* +X043769Y020408D01* +X043759Y020439D01* +X043753Y020470D01* +X043751Y020502D01* +X043751Y025002D02* +X043753Y025034D01* +X043759Y025065D01* +X043769Y025096D01* +X043783Y025125D01* +X043801Y025152D01* +X043821Y025176D01* +X043845Y025197D01* +X043871Y025216D01* +X043900Y025231D01* +X043930Y025242D01* +X043961Y025249D01* +X043993Y025252D01* +X044025Y025251D01* +X044057Y025246D01* +X044087Y025237D01* +X044117Y025224D01* +X044144Y025207D01* +X044169Y025187D01* +X044191Y025164D01* +X044211Y025138D01* +X044226Y025110D01* +X044238Y025081D01* +X044246Y025050D01* +X044250Y025018D01* +X044250Y024986D01* +X044246Y024954D01* +X044238Y024923D01* +X044226Y024894D01* +X044211Y024866D01* +X044191Y024840D01* +X044169Y024817D01* +X044144Y024797D01* +X044117Y024780D01* +X044087Y024767D01* +X044057Y024758D01* +X044025Y024753D01* +X043993Y024752D01* +X043961Y024755D01* +X043930Y024762D01* +X043900Y024773D01* +X043871Y024788D01* +X043845Y024807D01* +X043821Y024828D01* +X043801Y024852D01* +X043783Y024879D01* +X043769Y024908D01* +X043759Y024939D01* +X043753Y024970D01* +X043751Y025002D01* +D16* +X032851Y013502D03* +X032851Y009502D03* +D17* +X000851Y000752D02* +X000601Y001002D01* +X000601Y007752D01* +X000851Y008002D01* +X001851Y008002D01* +X002351Y007502D02* +X001101Y007502D01* +X000851Y007252D01* +X000851Y001252D01* +X001101Y001002D01* +X031601Y001002D01* +X033351Y002752D01* +X033851Y002252D02* +X032351Y000752D01* +X000851Y000752D01* +X001351Y001252D02* +X001101Y001502D01* +X001101Y006752D01* +X001351Y007002D01* +X001851Y007002D01* +X002351Y007502D02* +X002851Y008002D01* +X002851Y007002D02* +X003351Y007002D01* +X003601Y006752D01* +X003601Y006002D01* +X003851Y005752D01* +X004351Y005752D01* +X004601Y005502D01* +X004601Y003002D01* +X004851Y002752D01* +X012351Y002752D01* +X012601Y003002D01* +X018851Y003002D01* +X020101Y001752D01* +X029601Y001752D01* +X029851Y002002D01* +X031351Y002002D01* +X032101Y002752D02* +X030101Y002752D01* +X029851Y003002D01* +X029851Y003502D01* +X029351Y004002D02* +X028851Y004502D01* +X029351Y004002D02* +X033601Y004002D01* +X033851Y004252D01* +X033851Y011002D01* +X034101Y011252D01* +X036351Y011252D01* +X036851Y010752D02* +X034601Y010752D01* +X034351Y010502D01* +X034351Y005502D01* +X035351Y005502D02* +X035351Y009502D01* +X035601Y009752D01* +X036851Y009752D01* +X037351Y010252D01* +X036851Y010752D02* +X037351Y011252D01* +X036351Y010252D02* +X035101Y010252D01* +X034851Y010002D01* +X034851Y003502D01* +X034601Y003252D01* +X032601Y003252D01* +X032101Y002752D01* +X030351Y001502D02* +X030101Y001252D01* +X001351Y001252D01* +X003601Y002002D02* +X003601Y003752D01* +X003351Y004002D01* +X002851Y004002D01* +X002351Y004502D02* +X001851Y004002D01* +X002351Y004502D02* +X003601Y004502D01* +X003851Y004252D01* +X003851Y002252D01* +X004101Y002002D01* +X013351Y002002D01* +X013101Y002502D02* +X014601Y002502D01* +X015101Y002002D01* +X018101Y002002D01* +X018351Y002252D01* +X018351Y002502D01* +X017351Y002502D02* +X017101Y002752D01* +X012851Y002752D01* +X012601Y002502D01* +X004601Y002502D01* +X004351Y002752D01* +X004351Y005252D01* +X004101Y005502D01* +X002351Y005502D01* +X001851Y005002D01* +X002851Y005002D02* +X003851Y005002D01* +X004101Y004752D01* +X004101Y002502D01* +X004351Y002252D01* +X012851Y002252D01* +X013101Y002502D01* +X012851Y001752D02* +X003851Y001752D01* +X003601Y002002D01* +X009351Y007502D02* +X009851Y007002D01* +X011601Y007002D01* +X012101Y007502D01* +X012351Y007502D01* +X013351Y007502D01* +X013851Y007002D01* +X015601Y007002D01* +X016101Y007502D01* +X016351Y007502D01* +X017351Y007502D01* +X017851Y007002D01* +X019601Y007002D01* +X020101Y007502D01* +X020351Y007502D01* +X021351Y007502D01* +X021851Y007002D01* +X023601Y007002D01* +X024101Y007502D01* +X024351Y007502D01* +X025351Y007502D01* +X025851Y007002D01* +X026101Y007002D01* +X027601Y007002D01* +X028101Y007502D01* +X028351Y007502D01* +X028101Y008002D02* +X029351Y008002D01* +X029851Y007502D01* +X031351Y007502D01* +X031351Y008502D02* +X029851Y008502D01* +X029351Y009002D01* +X028101Y009002D01* +X027601Y008502D01* +X027351Y008502D01* +X025851Y008502D01* +X025351Y009002D01* +X024101Y009002D01* +X023601Y008502D01* +X023351Y008502D01* +X021851Y008502D01* +X021351Y009002D01* +X020101Y009002D01* +X019601Y008502D01* +X019351Y008502D01* +X017851Y008502D01* +X017351Y009002D01* +X016101Y009002D01* +X015601Y008502D01* +X015351Y008502D01* +X013851Y008502D01* +X013351Y009002D01* +X012101Y009002D01* +X011601Y008502D01* +X011351Y008502D01* +X011601Y008002D02* +X012101Y008502D01* +X012351Y008502D01* +X013351Y008502D01* +X013851Y008002D01* +X015601Y008002D01* +X016101Y008502D01* +X016351Y008502D01* +X017351Y008502D01* +X017851Y008002D01* +X019601Y008002D01* +X020101Y008502D01* +X020351Y008502D01* +X021351Y008502D01* +X021851Y008002D01* +X023601Y008002D01* +X024101Y008502D01* +X024351Y008502D01* +X025351Y008502D01* +X025851Y008002D01* +X026101Y008002D01* +X027601Y008002D01* +X028101Y008502D01* +X028351Y008502D01* +X028101Y008002D02* +X027601Y007502D01* +X027351Y007502D01* +X025851Y007502D01* +X025351Y008002D01* +X024101Y008002D01* +X023601Y007502D01* +X023351Y007502D01* +X021851Y007502D01* +X021351Y008002D01* +X020101Y008002D01* +X019601Y007502D01* +X019351Y007502D01* +X017851Y007502D01* +X017351Y008002D01* +X016101Y008002D01* +X015601Y007502D01* +X015351Y007502D01* +X013851Y007502D01* +X013351Y008002D01* +X012101Y008002D01* +X011601Y007502D01* +X011351Y007502D01* +X011601Y008002D02* +X009851Y008002D01* +X009351Y008502D01* +X008351Y008502D01* +X007851Y008502D02* +X007601Y008252D01* +X006601Y008252D01* +X006601Y009002D02* +X007351Y009002D01* +X007601Y009252D01* +X007601Y012502D01* +X008101Y013002D01* +X009351Y013002D01* +X009851Y012502D01* +X011351Y012502D01* +X011601Y013002D02* +X012101Y013502D01* +X012351Y013502D01* +X013351Y013502D01* +X013851Y013002D01* +X015601Y013002D01* +X016101Y013502D01* +X016351Y013502D01* +X017351Y013502D01* +X017851Y013002D01* +X019601Y013002D01* +X020101Y013502D01* +X020351Y013502D01* +X021851Y013502D01* +X022351Y013002D01* +X023601Y013002D01* +X024101Y013502D01* +X024351Y013502D01* +X025351Y013502D01* +X025851Y013002D01* +X027601Y013002D01* +X028101Y013502D01* +X028351Y013502D01* +X028101Y013002D02* +X029351Y013002D01* +X029851Y012502D01* +X029351Y012002D02* +X029851Y011502D01* +X029351Y012002D02* +X028101Y012002D01* +X027601Y011502D01* +X027351Y011502D01* +X027601Y012002D02* +X028101Y012502D01* +X028351Y012502D01* +X028101Y013002D02* +X027601Y012502D01* +X027351Y012502D01* +X027601Y012002D02* +X025851Y012002D01* +X025351Y012502D01* +X024351Y012502D01* +X024101Y012502D01* +X023601Y012002D01* +X021851Y012002D01* +X021351Y012502D01* +X020351Y012502D01* +X020101Y012502D01* +X019601Y012002D01* +X017851Y012002D01* +X017351Y012502D01* +X016351Y012502D01* +X016101Y012502D01* +X015601Y012002D01* +X013851Y012002D01* +X013351Y012502D01* +X012351Y012502D01* +X012101Y012502D01* +X011601Y012002D01* +X009851Y012002D01* +X009351Y012502D01* +X008351Y012502D01* +X008101Y012002D02* +X007851Y011752D01* +X007851Y008502D01* +X008351Y009502D02* +X009351Y009502D01* +X009851Y009002D01* +X011601Y009002D01* +X012101Y009502D01* +X012351Y009502D01* +X013351Y009502D01* +X013851Y009002D01* +X015601Y009002D01* +X016101Y009502D01* +X016351Y009502D01* +X017351Y009502D01* +X017851Y009002D01* +X019601Y009002D01* +X020101Y009502D01* +X020351Y009502D01* +X021351Y009502D01* +X021851Y009002D01* +X023601Y009002D01* +X024101Y009502D01* +X024351Y009502D01* +X025351Y009502D01* +X025851Y009002D01* +X027601Y009002D01* +X028101Y009502D01* +X028351Y009502D01* +X027601Y010002D02* +X028101Y010502D01* +X028351Y010502D01* +X028101Y011002D02* +X029351Y011002D01* +X029851Y010502D01* +X031351Y010502D01* +X031351Y009502D02* +X030351Y009502D01* +X028101Y011002D02* +X027601Y010502D01* +X027351Y010502D01* +X026101Y010502D01* +X025851Y010502D01* +X025351Y011002D01* +X024101Y011002D01* +X023601Y010502D01* +X023351Y010502D01* +X021851Y010502D01* +X021351Y011002D01* +X020101Y011002D01* +X019601Y010502D01* +X019351Y010502D01* +X017851Y010502D01* +X017351Y011002D01* +X016101Y011002D01* +X015601Y010502D01* +X015351Y010502D01* +X013851Y010502D01* +X013351Y011002D01* +X012101Y011002D01* +X011601Y010502D01* +X011351Y010502D01* +X011601Y010002D02* +X012101Y010502D01* +X012351Y010502D01* +X013351Y010502D01* +X013851Y010002D01* +X015601Y010002D01* +X016101Y010502D01* +X016351Y010502D01* +X017351Y010502D01* +X017851Y010002D01* +X019601Y010002D01* +X020101Y010502D01* +X020351Y010502D01* +X021351Y010502D01* +X021851Y010002D01* +X023601Y010002D01* +X024101Y010502D01* +X024351Y010502D01* +X025351Y010502D01* +X025851Y010002D01* +X027601Y010002D01* +X027601Y011002D02* +X028101Y011502D01* +X028351Y011502D01* +X027601Y011002D02* +X025851Y011002D01* +X025351Y011502D01* +X024351Y011502D01* +X024101Y011502D01* +X023601Y011002D01* +X021851Y011002D01* +X021351Y011502D01* +X020351Y011502D01* +X020101Y011502D01* +X019601Y011002D01* +X017851Y011002D01* +X017351Y011502D01* +X016351Y011502D01* +X016101Y011502D01* +X015601Y011002D01* +X013851Y011002D01* +X013351Y011502D01* +X012351Y011502D01* +X012101Y011502D01* +X011601Y011002D01* +X009851Y011002D01* +X009351Y011502D01* +X008351Y011502D01* +X008101Y012002D02* +X009351Y012002D01* +X009851Y011502D01* +X011351Y011502D01* +X011601Y013002D02* +X009851Y013002D01* +X009351Y013502D01* +X008351Y013502D01* +X008351Y010502D02* +X009351Y010502D01* +X009851Y010002D01* +X011601Y010002D01* +X014101Y011502D02* +X015351Y011502D01* +X015351Y012502D02* +X014101Y012502D01* +X018101Y012502D02* +X019351Y012502D01* +X019351Y011502D02* +X018101Y011502D01* +X021101Y012002D02* +X021351Y012002D01* +X021851Y011502D01* +X023351Y011502D01* +X023351Y012502D02* +X022101Y012502D01* +X021851Y012752D01* +X024101Y010002D02* +X025351Y010002D01* +X025851Y009502D01* +X026101Y009502D01* +X024101Y010002D02* +X023601Y009502D01* +X023351Y009502D01* +X024101Y007002D02* +X025351Y007002D01* +X025851Y006502D01* +X027351Y006502D01* +X027601Y006502D01* +X028101Y007002D01* +X029351Y007002D01* +X029851Y006502D01* +X031351Y006502D01* +X036351Y005502D02* +X036351Y008252D01* +X036351Y009252D01* +X036851Y008752D02* +X036851Y006002D01* +X037351Y005502D01* +X038351Y005502D02* +X038351Y008002D01* +X038101Y008252D01* +X037351Y008252D01* +X036851Y008752D02* +X037351Y009252D01* +X029101Y002252D02* +X021601Y002252D01* +X021351Y002502D01* +X021351Y004002D01* +X021851Y004502D01* +X021851Y006502D02* +X023351Y006502D01* +X023601Y006502D01* +X024101Y007002D01* +X021851Y006502D02* +X021351Y007002D01* +X020101Y007002D01* +X019601Y006502D01* +X019351Y006502D01* +X017851Y006502D01* +X017351Y007002D01* +X016101Y007002D01* +X015601Y006502D01* +X015351Y006502D01* +X013851Y006502D01* +X013351Y007002D01* +X012101Y007002D01* +X011601Y006502D01* +X011351Y006502D01* +X009351Y007502D02* +X008351Y007502D01* +X014351Y002002D02* +X014351Y001752D01* +X014101Y001502D01* +X013101Y001502D01* +X012851Y001752D01* +X034351Y001502D02* +X035351Y001502D01* +X035851Y002002D01* +X036851Y002002D01* +X037351Y001502D01* +X029851Y018502D02* +X029851Y019752D01* +X029351Y020252D01* +X029351Y025752D01* +X029101Y026002D01* +X019101Y026002D01* +X018101Y027002D01* +X011601Y027002D01* +X009351Y024752D01* +X005601Y024752D01* +X005351Y025002D01* +X005351Y028752D01* +X005101Y029002D01* +X002851Y029002D01* +X002851Y028002D02* +X004851Y028002D01* +X005101Y027752D01* +X005101Y024752D01* +X005351Y024502D01* +X015351Y024502D01* +X015601Y024252D01* +X025101Y024252D01* +X025351Y024002D01* +X025351Y020502D01* +X025851Y020002D01* +X027351Y020002D01* +X027851Y019502D01* +X027851Y018502D01* +X028351Y019752D02* +X028351Y023502D01* +X028351Y025502D01* +X028101Y025752D01* +X018851Y025752D01* +X018101Y026502D01* +X017351Y026502D01* +X012351Y026502D01* +X011351Y026002D02* +X015351Y026002D01* +X016351Y025002D01* +X026601Y025002D01* +X026851Y024752D01* +X026851Y022502D01* +X027351Y022002D02* +X027351Y025002D01* +X027101Y025252D01* +X017101Y025252D01* +X016851Y025502D01* +X016351Y026002D02* +X018101Y026002D01* +X018601Y025502D01* +X027601Y025502D01* +X027851Y025252D01* +X027851Y022502D01* +X027351Y022002D02* +X027851Y021502D01* +X026851Y021502D02* +X026351Y022002D01* +X026351Y024502D01* +X026101Y024752D01* +X016101Y024752D01* +X015351Y025502D01* +X013351Y025502D01* +X015351Y025002D02* +X015851Y024502D01* +X025601Y024502D01* +X025851Y024252D01* +X025851Y022502D01* +X024351Y023752D02* +X024101Y024002D01* +X015351Y024002D01* +X015101Y024252D01* +X005101Y024252D01* +X004851Y024502D01* +X004851Y026752D01* +X004601Y027002D01* +X002851Y027002D01* +X002851Y026002D02* +X004351Y026002D01* +X004601Y025752D01* +X004601Y024252D01* +X005101Y023752D01* +X005101Y021002D01* +X005351Y020752D01* +X022601Y020752D01* +X022851Y020502D01* +X022851Y018502D01* +X021351Y018502D02* +X021351Y020252D01* +X021101Y020502D01* +X005101Y020502D01* +X004851Y020752D01* +X004851Y023502D01* +X004351Y024002D01* +X004351Y024752D01* +X004101Y025002D01* +X002851Y025002D01* +X002851Y024002D02* +X003851Y024002D01* +X004601Y023252D01* +X004601Y020502D01* +X004851Y020252D01* +X019101Y020252D01* +X019351Y020002D01* +X019351Y018502D01* +X016351Y018502D02* +X016351Y019752D01* +X016101Y020002D01* +X004601Y020002D01* +X004351Y020252D01* +X004351Y022752D01* +X004101Y023002D01* +X002851Y023002D01* +X002851Y022002D02* +X003851Y022002D01* +X004101Y021752D01* +X004101Y020002D01* +X004351Y019752D01* +X014101Y019752D01* +X014351Y019502D01* +X014351Y018502D01* +X012851Y018502D02* +X012851Y019252D01* +X012601Y019502D01* +X004101Y019502D01* +X003851Y019752D01* +X003851Y020752D01* +X003601Y021002D01* +X002851Y021002D01* +X002851Y020002D02* +X003351Y020002D01* +X003601Y019752D01* +X003601Y019502D01* +X003851Y019252D01* +X010601Y019252D01* +X010851Y019002D01* +X010851Y018502D01* +X007851Y018502D02* +X007851Y018752D01* +X007601Y019002D01* +X002851Y019002D01* +X003601Y018002D02* +X004101Y018502D01* +X005851Y018502D01* +X003601Y018002D02* +X002851Y018002D01* +X006351Y023252D02* +X013351Y023252D01* +X013851Y023752D01* +X014601Y023752D01* +X014851Y023502D01* +X023101Y023502D01* +X023351Y023252D01* +X023351Y022002D01* +X023851Y021502D01* +X023851Y022502D02* +X023851Y023502D01* +X023601Y023752D01* +X015101Y023752D01* +X014851Y024002D01* +X009601Y024002D01* +X009351Y023752D01* +X010351Y025002D02* +X015351Y025002D01* +X014351Y023252D02* +X022601Y023252D01* +X022851Y023002D01* +X022851Y022502D01* +X024351Y023752D02* +X024351Y020502D01* +X024851Y020002D01* +X024851Y018502D01* +X018601Y027252D02* +X011351Y027252D01* +X009351Y025252D01* +X006351Y025252D01* +X006351Y026002D02* +X009601Y026002D01* +X011351Y027752D01* +X019101Y027752D01* +D18* +X019101Y027752D03* +X018601Y027252D03* +X017351Y026502D03* +X016851Y025502D03* +X016351Y026002D03* +X013351Y025502D03* +X012351Y026502D03* +X011351Y026002D03* +X010351Y025002D03* +X009351Y023752D03* +X006351Y023252D03* +X006351Y025252D03* +X006351Y026002D03* +X014351Y023252D03* +X021851Y013502D03* +X021851Y012752D03* +X021101Y012002D03* +X018101Y012502D03* +X018101Y011502D03* +X014101Y011502D03* +X014101Y012502D03* +X006601Y009002D03* +X006601Y008252D03* +X013351Y002002D03* +X014351Y002002D03* +X017351Y002502D03* +X018351Y002502D03* +X026101Y007002D03* +X026101Y008002D03* +X026101Y009502D03* +X026101Y010502D03* +X029851Y011502D03* +X029851Y012502D03* +X030351Y009502D03* +X033351Y002752D03* +X033851Y002252D03* +X031351Y002002D03* +X030351Y001502D03* +X029101Y002252D03* +X028351Y019752D03* +X028351Y023502D03* +D19* +X028851Y018502D02* +X028851Y017502D01* +X023851Y017502D01* +X023851Y018502D01* +X023851Y017502D02* +X020351Y017502D01* +X020351Y018502D01* +X020351Y017502D02* +X015351Y017502D01* +X015351Y018502D01* +X015351Y017502D02* +X011851Y017502D01* +X011851Y018502D01* +X011851Y017502D02* +X006851Y017502D01* +X004601Y017502D01* +X004601Y017002D01* +X004601Y012502D01* +X005601Y012502D01* +X005601Y013502D02* +X005601Y013752D01* +X007851Y015502D02* +X007851Y016502D01* +X016351Y016502D01* +X016351Y015502D01* +X017351Y015502D02* +X017351Y014502D01* +X018351Y014502D02* +X018351Y015502D01* +X019351Y014502D02* +X019351Y013502D01* +X023351Y013502D02* +X023351Y014502D01* +X024851Y015502D02* +X024851Y016502D01* +X031601Y016502D01* +X031601Y015752D01* +X032851Y015752D01* +X032851Y014752D02* +X032851Y014502D01* +X031351Y014502D02* +X031351Y013502D01* +X027351Y013502D02* +X027351Y014502D01* +X026851Y014502D02* +X026851Y015502D01* +X025851Y015502D02* +X025851Y014502D01* +X024851Y016502D02* +X016351Y016502D01* +X015351Y014502D02* +X015351Y013502D01* +X011351Y013502D02* +X011351Y014502D01* +X009851Y014502D02* +X009851Y015502D01* +X008851Y015502D02* +X008851Y014502D01* +X006851Y017502D02* +X006851Y018502D01* +X004601Y017002D02* +X002851Y017002D01* +X001851Y017002D01* +X001851Y018002D01* +X001851Y019002D01* +X001851Y020002D01* +X001851Y021002D01* +X001851Y022002D01* +X001851Y023002D01* +X001851Y024002D01* +X001851Y025002D01* +X001851Y026002D01* +X001851Y027002D01* +X001851Y028002D01* +X001851Y029002D01* +X001851Y011252D02* +X001851Y010002D01* +X002851Y010002D02* +X002851Y011252D01* +X002851Y009002D02* +X001851Y009002D01* +X002851Y009002D02* +X004101Y009002D01* +X004101Y006502D01* +X005601Y006502D01* +X005601Y006252D01* +X005601Y007502D02* +X005601Y007752D01* +X008351Y006502D02* +X008351Y005502D01* +X012351Y005502D02* +X012351Y006502D01* +X016351Y006502D02* +X016351Y005502D01* +X020351Y005502D02* +X020351Y006502D01* +X024351Y006502D02* +X024351Y005502D01* +X028351Y005502D02* +X028351Y006502D01* +X036351Y012252D02* +X036351Y012752D01* +X036351Y013252D01* +X037351Y013252D01* +X037351Y012252D01* +X036351Y012252D01* +X036351Y014252D02* +X036351Y015252D01* +X036851Y015252D01* +X037351Y015252D01* +X037351Y014252D01* +X036351Y014252D01* +X030851Y017502D02* +X028851Y017502D01* +X030851Y017502D02* +X030851Y018502D01* +X031851Y018502D01* +X036101Y021502D02* +X037101Y021502D01* +X037101Y020502D02* +X038101Y020502D01* +X038101Y025002D02* +X037101Y025002D01* +X037101Y026002D02* +X036101Y026002D01* +D20* +X035351Y026002D01* +X035351Y021502D01* +X036101Y021502D01* +X038101Y020502D02* +X038851Y020502D01* +X038851Y025002D01* +X038851Y031002D01* +X035101Y031002D01* +X006351Y031002D01* +X000601Y031002D01* +X000601Y011252D01* +X001851Y011252D01* +X002851Y011252D01* +X005601Y011252D01* +X005601Y010002D01* +X005601Y007752D01* +X005601Y006252D02* +X005601Y005502D01* +X008351Y005502D01* +X012351Y005502D01* +X016351Y005502D01* +X020351Y005502D01* +X024351Y005502D01* +X028351Y005502D01* +X032851Y005502D01* +X032851Y009502D01* +X032851Y012252D01* +X034101Y012252D01* +X034101Y015752D01* +X032851Y015752D01* +X032851Y017002D02* +X032851Y026252D01* +X031101Y028002D01* +X029291Y028002D01* +X029291Y029502D01* +X032241Y029502D02* +X034101Y027642D01* +X034101Y018252D01* +X036851Y018252D01* +X036851Y015252D01* +X035351Y017002D02* +X035351Y012752D01* +X036351Y012752D01* +X032851Y013502D02* +X032851Y014502D01* +X031351Y014502D01* +X027351Y014502D01* +X026851Y014502D01* +X025851Y014502D01* +X023351Y014502D01* +X019351Y014502D01* +X018351Y014502D01* +X017351Y014502D01* +X015351Y014502D01* +X011351Y014502D01* +X009851Y014502D01* +X008851Y014502D01* +X006851Y014502D01* +X006851Y013752D01* +X005601Y013752D01* +X006851Y013752D02* +X006851Y011252D01* +X005601Y011252D01* +X006351Y027502D02* +X006351Y031002D01* +X032851Y017002D02* +X035351Y017002D01* +X038101Y025002D02* +X038851Y025002D01* +X035191Y029502D02* +X035191Y031002D01* +X035101Y031002D01* +D21* +X036351Y015252D02* +X037351Y014252D01* +X036351Y014252D02* +X037351Y015252D01* +X037351Y013252D02* +X036351Y012252D01* +X036351Y013252D02* +X037351Y012252D01* +M02* diff --git a/testdata/hexapod.xln b/testdata/hexapod.xln new file mode 100644 index 0000000..4adb39e --- /dev/null +++ b/testdata/hexapod.xln @@ -0,0 +1,400 @@ +% +M48 +M72 +T01C0.0197 +T02C0.0320 +T03C0.0360 +T04C0.0400 +T05C0.0440 +T06C0.0520 +T07C0.1300 +% +T01 +X6601Y8252 +X6601Y9002 +X14101Y11502 +X14101Y12502 +X18101Y12502 +X18101Y11502 +X21101Y12002 +X21851Y12752 +X21851Y13502 +X26101Y10502 +X26101Y9502 +X26101Y8002 +X26101Y7002 +X30351Y9502 +X29851Y11502 +X29851Y12502 +X28351Y19752 +X28351Y23502 +X19101Y27752 +X18601Y27252 +X17351Y26502 +X16851Y25502 +X16351Y26002 +X13351Y25502 +X12351Y26502 +X11351Y26002 +X10351Y25002 +X9351Y23752 +X6351Y23252 +X6351Y25252 +X6351Y26002 +X14351Y23252 +X33351Y2752 +X33851Y2252 +X31351Y2002 +X30351Y1502 +X29101Y2252 +X18351Y2502 +X17351Y2502 +X14351Y2002 +X13351Y2002 +T02 +X12351Y6502 +X12351Y7502 +X12351Y8502 +X12351Y9502 +X12351Y10502 +X11351Y10502 +X11351Y9502 +X11351Y8502 +X11351Y7502 +X11351Y6502 +X8351Y6502 +X8351Y7502 +X8351Y8502 +X8351Y9502 +X8351Y10502 +X8351Y11502 +X8351Y12502 +X8351Y13502 +X8851Y15502 +X9851Y15502 +X10851Y15502 +X11851Y15502 +X12851Y15502 +X14351Y15502 +X15351Y15502 +X16351Y15502 +X17351Y15502 +X18351Y15502 +X19351Y15502 +X20351Y15502 +X21351Y15502 +X22851Y15502 +X23851Y15502 +X24851Y15502 +X25851Y15502 +X26851Y15502 +X27851Y15502 +X28851Y15502 +X29851Y15502 +X31351Y13502 +X31351Y12502 +X31351Y11502 +X31351Y10502 +X31351Y9502 +X31351Y8502 +X31351Y7502 +X31351Y6502 +X28351Y6502 +X28351Y7502 +X28351Y8502 +X28351Y9502 +X28351Y10502 +X27351Y10502 +X27351Y9502 +X27351Y8502 +X27351Y7502 +X27351Y6502 +X24351Y6502 +X23351Y6502 +X23351Y7502 +X24351Y7502 +X24351Y8502 +X23351Y8502 +X23351Y9502 +X24351Y9502 +X24351Y10502 +X23351Y10502 +X23351Y11502 +X24351Y11502 +X24351Y12502 +X23351Y12502 +X23351Y13502 +X24351Y13502 +X27351Y13502 +X28351Y13502 +X28351Y12502 +X28351Y11502 +X27351Y11502 +X27351Y12502 +X32851Y14752 +X32851Y15752 +X31851Y17502 +X31851Y18502 +X29851Y18502 +X28851Y18502 +X27851Y18502 +X26851Y18502 +X25851Y18502 +X24851Y18502 +X23851Y18502 +X22851Y18502 +X21351Y18502 +X20351Y18502 +X19351Y18502 +X18351Y18502 +X17351Y18502 +X16351Y18502 +X15351Y18502 +X14351Y18502 +X12851Y18502 +X11851Y18502 +X10851Y18502 +X9851Y18502 +X8851Y18502 +X7851Y18502 +X6851Y18502 +X5851Y18502 +X5851Y15502 +X6851Y15502 +X7851Y15502 +X5601Y13502 +X5601Y12502 +X11351Y12502 +X12351Y12502 +X12351Y13502 +X11351Y13502 +X11351Y11502 +X12351Y11502 +X15351Y11502 +X16351Y11502 +X16351Y12502 +X15351Y12502 +X15351Y13502 +X16351Y13502 +X19351Y13502 +X20351Y13502 +X20351Y12502 +X19351Y12502 +X19351Y11502 +X20351Y11502 +X20351Y10502 +X19351Y10502 +X19351Y9502 +X20351Y9502 +X20351Y8502 +X19351Y8502 +X19351Y7502 +X20351Y7502 +X20351Y6502 +X19351Y6502 +X16351Y6502 +X15351Y6502 +X15351Y7502 +X16351Y7502 +X16351Y8502 +X15351Y8502 +X15351Y9502 +X16351Y9502 +X16351Y10502 +X15351Y10502 +X5601Y7502 +X5601Y6502 +X30351Y24252 +X30351Y26252 +X34351Y5502 +X35351Y5502 +X36351Y5502 +X37351Y5502 +X38351Y5502 +X38351Y1502 +X37351Y1502 +X36351Y1502 +X35351Y1502 +X34351Y1502 +T03 +X1851Y3002 +X2851Y3002 +X2851Y4002 +X1851Y4002 +X1851Y5002 +X2851Y5002 +X2851Y6002 +X1851Y6002 +X1851Y7002 +X2851Y7002 +X2851Y8002 +X1851Y8002 +X1851Y9002 +X2851Y9002 +X2851Y10002 +X1851Y10002 +X1851Y17002 +X2851Y17002 +X2851Y18002 +X1851Y18002 +X1851Y19002 +X2851Y19002 +X2851Y20002 +X1851Y20002 +X1851Y21002 +X2851Y21002 +X2851Y22002 +X1851Y22002 +X1851Y23002 +X2851Y23002 +X2851Y24002 +X1851Y24002 +X1851Y25002 +X2851Y25002 +X2851Y26002 +X1851Y26002 +X1851Y27002 +X2851Y27002 +X2851Y28002 +X1851Y28002 +X1851Y29002 +X2851Y29002 +X36351Y15252 +X37351Y15252 +X37351Y14252 +X36351Y14252 +X36351Y13252 +X37351Y13252 +X37351Y12252 +X36351Y12252 +X36351Y11252 +X37351Y11252 +X37351Y10252 +X36351Y10252 +X36351Y9252 +X37351Y9252 +X37351Y8252 +X36351Y8252 +T04 +X31851Y4502 +X30851Y4502 +X29851Y4502 +X28851Y4502 +X27851Y4502 +X26851Y4502 +X25851Y4502 +X24851Y4502 +X23851Y4502 +X22851Y4502 +X21851Y4502 +X20851Y4502 +X19851Y4502 +X18851Y4502 +X17851Y4502 +X16851Y4502 +X15851Y4502 +X14851Y4502 +X13851Y4502 +X12851Y4502 +X11851Y4502 +X10851Y4502 +X9851Y4502 +X8851Y4502 +X7851Y4502 +X7851Y3502 +X8851Y3502 +X9851Y3502 +X10851Y3502 +X11851Y3502 +X12851Y3502 +X13851Y3502 +X14851Y3502 +X15851Y3502 +X16851Y3502 +X17851Y3502 +X18851Y3502 +X19851Y3502 +X20851Y3502 +X21851Y3502 +X22851Y3502 +X23851Y3502 +X24851Y3502 +X25851Y3502 +X26851Y3502 +X27851Y3502 +X28851Y3502 +X29851Y3502 +X30851Y3502 +X31851Y3502 +X31851Y21502 +X30851Y21502 +X29851Y21502 +X28851Y21502 +X27851Y21502 +X27851Y22502 +X28851Y22502 +X29851Y22502 +X30851Y22502 +X31851Y22502 +X26851Y22502 +X25851Y22502 +X24851Y22502 +X23851Y22502 +X22851Y22502 +X22851Y21502 +X23851Y21502 +X24851Y21502 +X25851Y21502 +X26851Y21502 +X21851Y21502 +X20851Y21502 +X19851Y21502 +X18851Y21502 +X17851Y21502 +X17851Y22502 +X18851Y22502 +X19851Y22502 +X20851Y22502 +X21851Y22502 +X16851Y22502 +X15851Y22502 +X14851Y22502 +X13851Y22502 +X12851Y22502 +X12851Y21502 +X13851Y21502 +X14851Y21502 +X15851Y21502 +X16851Y21502 +X11851Y21502 +X10851Y21502 +X9851Y21502 +X8851Y21502 +X7851Y21502 +X7851Y22502 +X8851Y22502 +X9851Y22502 +X10851Y22502 +X11851Y22502 +X21601Y28752 +X21601Y29752 +T05 +X20351Y27502 +X6351Y27502 +X32851Y13502 +X32851Y9502 +X37101Y19502 +X37101Y20502 +X37101Y21502 +X37101Y24002 +X37101Y25002 +X37101Y26002 +T06 +X35191Y29502 +X32241Y29502 +X29291Y29502 +X25351Y29502 +T07 +X44001Y25002 +X44001Y20502 +M30 diff --git a/testdata/layout1.cfg b/testdata/layout1.cfg new file mode 100644 index 0000000..d38bb0d --- /dev/null +++ b/testdata/layout1.cfg @@ -0,0 +1,272 @@ +# This configuration file demonstrates panelizing a single job. + +############################################################################## +# In the [DEFAULT] section you can create global names to save typing the same +# directory name, for example, over and over. +############################################################################## +[DEFAULT] + +# Change projdir to wherever your project files are, for example: +# +# projdir = /home/stuff/projects/test +# +# or relative pathname from where you are running GerbMerge +# +# projdir = testdata +# +# or if all files are in the current directory (as in this example): +# +# projdir = . +projdir = . + +# For convenience, this is the base name of the merged output files. +MergeOut = merge1 + +############################################################################# +# The [Options] section defines settings that control how the input files are +# read and how the output files are generated. +############################################################################# +[Options] + +################################################################ +# +# Settings that are very important +# +################################################################ + +# Option indicating name of file that maps Excellon tool codes to drill sizes. +# This is not necessary if the Excellon files have embedded tool sizes, or if a +# tool list is specified as part of the job description. The ToolList option +# here is the "last resort" for mapping tool codes to tool sizes. Most recent +# PCB programs embed drill size information right in the Excellon file, so this +# option should not be necessary and can be commented out. +#ToolList=proj1.drl + +# Optional indication of the number of decimal places in input Excellon drill +# files. The default is 4 which works for recent versions of Eagle (since +# version 4.11r12), as well as Orcad and PCB. Older versions of Eagle use 3 +# decimal places. +#ExcellonDecimals = 4 + +################################################################ +# +# Settings that are somewhat important +# +################################################################ + +# Which layers to draw cut lines on. Omit this option or set to 'None' for no +# cut lines. Cut lines are borders around each job that serve as guides for +# cutting the panel into individual jobs. Option 'CutLineWidth' sets the +# thickness of these cut lines. +# +# NOTE: Layer names are ALL LOWERCASE, even if you define them with uppercase +# letters below. +CutLineLayers = *topsilkscreen,*bottomsilkscreen + +# Which layers to draw crop marks on. Omit this option or set to 'None' for no +# crop marks. Crop marks are small L-shaped marks at the 4 corners of the final +# panel. These practically define the extents of the panel and are required by +# some board manufacturers. Crop marks are also required if you want to leave +# extra space around the final panel for tooling or handling. Option +# 'CropMarkWidth' sets the thickness of these crop marks. +# +# NOTE: Layer names are ALL LOWERCASE, even if you define them with uppercase +# letters below. +CropMarkLayers = *topsilkscreen,*bottomsilkscreen + +# Set this option to the name of a file in which to write a Gerber fabrication +# drawing. Some board manufacturers require a fabrication drawing with panel +# dimensions and drill hit marks and drill legend. There's no harm in creating +# this file...you can ignore it if you don't need it. +FabricationDrawingFile = %(mergeout)s.fab + +# If FabricationDrawingFile is specified, you can provide an optional file name +# of a file containing arbitrary text to add to the fabrication drawing. This +# text can indicate manufacturing information, contact information, etc. +#FabricationDrawingText = %(projdir)s/fabdwg.txt + +# Option to generate leading zeros in the output Excellon drill file, i.e., to +# NOT use leading-zero suppression. Some Gerber viewers cannot properly guess +# the Excellon file format when there are no leading zeros. Set this option to +# 1 if your Gerber viewer is putting the drill holes in far off places that do +# not line up with component pads. +ExcellonLeadingZeros = 0 + +# Optional additional Gerber layer on which to draw a rectangle defining the +# extents of the entire panelized job. This will create a Gerber file (with +# name specified by this option) that simply contains a rectangle defining the +# outline of the final panel. This outline file is useful for circuit board +# milling to indicate a path for the router tool. There's no harm in creating +# this file...you can ignore it if you don't need it. +OutlineLayerFile = %(mergeout)s.oln + +# Optional additional Gerber layer on which to draw horizontal and vertical +# lines describing where to score (i.e., V-groove) the panel so that jobs +# can easily snap apart. These scoring lines will be drawn half-way between +# job borders. +ScoringFile = %(mergeout)s.sco + +# Set the maximum dimensions of the final panel, if known. You can set the +# dimensions of the maximum panel size supported by your board manufacturer, +# and GerbMerge will print an error message if your layout exceeds these +# dimensions. Alternatively, when using automatic placement, the panel sizes +# listed here constrain the random placements such that only placements that +# fit within the given panel dimensions will be considered. The dimensions are +# specified in inches. +PanelWidth = 12.6 +PanelHeight = 7.8 + +# 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. +LeftMargin = 0.1 +RightMargin = 0.1 +TopMargin = 0.1 +BottomMargin = 0.1 + +################################################################ +# +# Settings that are probably not important +# +################################################################ + +# Set the inter-job spacing (inches) in both the X-dimension (width) and +# Y-dimension (height). Normally these would be the same unless you're trying +# really hard to make your jobs fit into a panel of exact size and you need to +# tweak these spacings to make it work. 0.125" is probably generous, about half +# that is practical for using a band saw, but you probably want to leave it at +# 0.125" if you have copper features close to the board edges and/or are using +# less precise tools, like a hacksaw, for separating the boards. +XSpacing = 0.125 +YSpacing = 0.125 + +# Width of cut lines, in inches. The default value is 0.01". These are drawn on +# the layers specified by CutLineLayers. +CutLineWidth = 0.01 + +# Width of crop marks, in inches. The default value is 0.01". These are drawn on +# the layers specified by CropMarkLayers. +CropMarkWidth = 0.01 + +# This option is intended to reduce the probability of forgetting to include a +# layer in a job description when panelizing two or more different jobs. +# Unless this option is set to 1, an error will be raised if some jobs do not +# have the same layer names as the others, i.e., are missing layers. For +# example, if one job has a top-side soldermask layer and another doesn't, that +# could be a mistake. Setting this option to 1 prevents this situation from +# raising an error. +AllowMissingLayers = 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 disables clustering. +DrillClusterTolerance = 0.002 + +# 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. +MinimumFeatureSize = *topsilkscreen,0.008,*bottomsilkscreen,0.008 + +############################################################################## +# This section sets the name of merged output files. Each assignment below +# specifies a layer name and the file name that is to be written for that +# merged layer. Except for the BoardOutline and Drills layer names, all other +# layer names must begin with an asterisk '*'. The special layer name Placement +# is used to specify the placement file that can be used with the +# '--place-file' command-line option in a future invocation of GerbMerge. The +# special layer name ToolList is used to specify the file name that represents +# the tool list for the panelized job. +# +# By default, if this section is omitted or no layername=filename assignment is +# made, the following files are generated: +# +# BoardOutline = merged.boardoutline.ger +# Drills = merged.drills.xln +# Placement = merged.placement.txt +# ToolList = merged.toollist.drl +# *layername = merged.layername.ger +# (for example: 'merged.toplayer.ger', 'merged.silkscreen.ger') +# +# Any assignment that does not begin with '*' or is not one of the reserved +# names BoardOutline, Drills, ToolList, or Placement is a generic string +# assignment that can be used for string substitutions, to save typing. +############################################################################## +[MergeOutputFiles] +Prefix = %(mergeout)s + +*TopLayer=%(prefix)s.cmp +*BottomLayer=%(prefix)s.sol +*TopSilkscreen=%(prefix)s.plc +*BottomSilkscreen=%(prefix)s.pls +*TopSoldermask=%(prefix)s.stc +*BottomSoldermask=%(prefix)s.sts +Drills=%(prefix)s.xln +BoardOutline=%(prefix)s.bor +ToolList = toollist.%(prefix)s.drl +Placement = placement.%(prefix)s.txt + +############################################################################## +# The remainder of the file specifies the jobs to be panelized. Each job is +# specified in its own section. To each job you can assign a job name, which +# will be the name of the section in square brackets (e.g., [Proj1]). This job +# name is used in the layout file (if used) to refer to the job. +# +# Job names are case-sensitive, but do not create job names that are the same +# except for the case of the characters, as this may cause problems during +# layout. Job names may only contain the following characters: +# +# a-z A-Z 0-9 _ +# +# In addition, job names must begin with a letter (a-z or A-Z). +############################################################################## +[Proj1] + +# You can set any options you like to make generating filenames easier, like +# Prefix. This is just a helper option, not a reserved name. Note, however, +# that you must write %(prefix)s below, in ALL LOWERCASE. +# +# Note how we are making use of the 'projdir' string defined way up at the top +# in the [DEFAULT] section to save some typing. By setting 'projdir=somedir' +# the expression '%(projdir)s/proj1' expands to 'somedir/proj1'. +Prefix=%(projdir)s/proj1 + +# List all the layers that participate in this job. Required layers are Drills +# and BoardOutline and have no '*' at the beginning. Optional layers have +# names chosen by you and begin with '*'. You should choose consistent layer +# names across all jobs. +*TopLayer=%(prefix)s.cmp +*BottomLayer=%(prefix)s.sol +*TopSilkscreen=%(prefix)s.plc +*BottomSilkscreen=%(prefix)s.pls +*TopSoldermask=%(prefix)s.stc +*BottomSoldermask=%(prefix)s.sts +Drills=%(prefix)s.xln +BoardOutline=%(prefix)s.bor + +# If this job does not have drill tool sizes embedded in the Excellon file, it +# needs to have a separate tool list file that maps tool names (e.g., 'T01') to +# tool diameter. This may be the global tool list specified in the [Options] +# section with the ToolList parameter. If this job doesn't have embedded tool +# sizes, and uses a different tool list than the global one, you can specify it +# here. +#ToolList=proj1.drl + +# If this job has a different ExcellonDecimals setting than the global setting +# in the [Options] section above, it can be overridden here. +#ExcellonDecimals = 3 + +# You can set a 'Repeat' parameter for this job when using automatic placement +# (i.e., no *.def file) to indicate how many times this job should appear in +# the final panel. When using manual placement, this option is ignored. +#Repeat = 5 diff --git a/testdata/layout1.def b/testdata/layout1.def new file mode 100644 index 0000000..120ea57 --- /dev/null +++ b/testdata/layout1.def @@ -0,0 +1,19 @@ +# This example simply takes the small Proj1 board and panelizes +# it in a 2x4 array. To demonstrate rotation, the second column +# consists of rotated jobs. You wouldn't really do it this way, +# of course, as it wastes space. +Row { + Col { + Proj1 + Proj1 + Proj1 + Proj1 + } + Col { + Proj1 Rotate90 + Proj1 Rotate180 + Proj1 Rotate270 + Proj1 Rotate + } +} + diff --git a/testdata/layout2.cfg b/testdata/layout2.cfg new file mode 100644 index 0000000..2eb980e --- /dev/null +++ b/testdata/layout2.cfg @@ -0,0 +1,282 @@ +# This configuration file demonstrates panelizing multiple, different jobs. +# We panelize the HEXAPOD job and several copies of the Proj1 job. + +############################################################################## +# In the [DEFAULT] section you can create global names to save typing the same +# directory name, for example, over and over. +############################################################################## +[DEFAULT] + +# Change projdir to wherever your project files are, for example: +# +# projdir = /home/stuff/projects/test +# +# or relative pathname from where you are running GerbMerge +# +# projdir = testdata +# +# or if all files are in the current directory (as in this example): +# +# projdir = . +projdir = . + +# For convenience, this is the base name of the merged output files. +MergeOut = merge2 + +############################################################################# +# The [Options] section defines settings that control how the input files are +# read and how the output files are generated. +############################################################################# +[Options] + +################################################################ +# +# Settings that are very important +# +################################################################ + +# Option indicating name of file that maps Excellon tool codes to drill sizes. +# This is not necessary if the Excellon files have embedded tool sizes, or if a +# tool list is specified as part of the job description. The ToolList option +# here is the "last resort" for mapping tool codes to tool sizes. Most recent +# PCB programs embed drill size information right in the Excellon file, so this +# option should not be necessary and can be commented out. +#ToolList=proj1.drl + +# Optional indication of the number of decimal places in input Excellon drill +# files. The default is 4 which works for recent versions of Eagle (since +# version 4.11r12), as well as Orcad and PCB. Older versions of Eagle use 3 +# decimal places. +#ExcellonDecimals = 4 + +################################################################ +# +# Settings that are somewhat important +# +################################################################ + +# Which layers to draw cut lines on. Omit this option or set to 'None' for no +# cut lines. Cut lines are borders around each job that serve as guides for +# cutting the panel into individual jobs. Option 'CutLineWidth' sets the +# thickness of these cut lines. +# +# NOTE: Layer names are ALL LOWERCASE, even if you define them with uppercase +# letters below. +CutLineLayers = *topsilkscreen,*bottomsilkscreen + +# Which layers to draw crop marks on. Omit this option or set to 'None' for no +# crop marks. Crop marks are small L-shaped marks at the 4 corners of the final +# panel. These practically define the extents of the panel and are required by +# some board manufacturers. Crop marks are also required if you want to leave +# extra space around the final panel for tooling or handling. Option +# 'CropMarkWidth' sets the thickness of these crop marks. +# +# NOTE: Layer names are ALL LOWERCASE, even if you define them with uppercase +# letters below. +CropMarkLayers = *topsilkscreen,*bottomsilkscreen + +# Set this option to the name of a file in which to write a Gerber fabrication +# drawing. Some board manufacturers require a fabrication drawing with panel +# dimensions and drill hit marks and drill legend. There's no harm in creating +# this file...you can ignore it if you don't need it. +FabricationDrawingFile = %(mergeout)s.fab + +# If FabricationDrawingFile is specified, you can provide an optional file name +# of a file containing arbitrary text to add to the fabrication drawing. This +# text can indicate manufacturing information, contact information, etc. +FabricationDrawingText = %(projdir)s/fabdwg.txt + +# Option to generate leading zeros in the output Excellon drill file, i.e., to +# NOT use leading-zero suppression. Some Gerber viewers cannot properly guess +# the Excellon file format when there are no leading zeros. Set this option to +# 1 if your Gerber viewer is putting the drill holes in far off places that do +# not line up with component pads. +ExcellonLeadingZeros = 0 + +# Optional additional Gerber layer on which to draw a rectangle defining the +# extents of the entire panelized job. This will create a Gerber file (with +# name specified by this option) that simply contains a rectangle defining the +# outline of the final panel. This outline file is useful for circuit board +# milling to indicate a path for the router tool. There's no harm in creating +# this file...you can ignore it if you don't need it. +OutlineLayerFile = %(mergeout)s.oln + +# Optional additional Gerber layer on which to draw horizontal and vertical +# lines describing where to score (i.e., V-groove) the panel so that jobs +# can easily snap apart. These scoring lines will be drawn half-way between +# job borders. +ScoringFile = %(mergeout)s.sco + +# Set the maximum dimensions of the final panel, if known. You can set the +# dimensions of the maximum panel size supported by your board manufacturer, +# and GerbMerge will print an error message if your layout exceeds these +# dimensions. Alternatively, when using automatic placement, the panel sizes +# listed here constrain the random placements such that only placements that +# fit within the given panel dimensions will be considered. The dimensions are +# specified in inches. +PanelWidth = 12.6 +PanelHeight = 7.8 + +# 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 OutlineLayer. +LeftMargin = 0.1 +RightMargin = 0.1 +TopMargin = 0.1 +BottomMargin = 0.1 + +################################################################ +# +# Settings that are probably not important +# +################################################################ + +# Set the inter-job spacing (inches) in both the X-dimension (width) and +# Y-dimension (height). Normally these would be the same unless you're trying +# really hard to make your jobs fit into a panel of exact size and you need to +# tweak these spacings to make it work. 0.125" is probably generous, about half +# that is practical for using a band saw, but you probably want to leave it at +# 0.125" if you have copper features close to the board edges and/or are using +# less precise tools, like a hacksaw, for separating the boards. +XSpacing = 0.125 +YSpacing = 0.125 + +# Width of cut lines, in inches. The default value is 0.01". These are drawn on +# the layers specified by CutLineLayers. +CutLineWidth = 0.01 + +# Width of crop marks, in inches. The default value is 0.01". These are drawn on +# the layers specified by CropMarkLayers. +CropMarkWidth = 0.01 + +# This option is intended to reduce the probability of forgetting to include a +# layer in a job description when panelizing two or more different jobs. +# Unless this option is set to 1, an error will be raised if some jobs do not +# have the same layer names as the others, i.e., are missing layers. For +# example, if one job has a top-side soldermask layer and another doesn't, that +# could be a mistake. Setting this option to 1 prevents this situation from +# raising an error. +AllowMissingLayers = 1 + +# 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 disables clustering. +DrillClusterTolerance = 0.002 + +# 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. +MinimumFeatureSize = *topsilkscreen,0.008,*bottomsilkscreen,0.008 + +############################################################################## +# This section sets the name of merged output files. Each assignment below +# specifies a layer name and the file name that is to be written for that +# merged layer. Except for the BoardOutline and Drills layer names, all other +# layer names must begin with an asterisk '*'. The special layer name Placement +# is used to specify the placement file that can be used with the +# '--place-file' command-line option in a future invocation of GerbMerge. The +# special layer name ToolList is used to specify the file name that represents +# the tool list for the panelized job. +# +# By default, if this section is omitted or no layername=filename assignment is +# made, the following files are generated: +# +# BoardOutline = merged.boardoutline.ger +# Drills = merged.drills.xln +# Placement = merged.placement.txt +# ToolList = merged.toollist.drl +# *layername = merged.layername.ger +# (for example: 'merged.toplayer.ger', 'merged.silkscreen.ger') +# +# Any assignment that does not begin with '*' or is not one of the reserved +# names BoardOutline, Drills, ToolList, or Placement is a generic string +# assignment that can be used for string substitutions, to save typing. +############################################################################## +[MergeOutputFiles] +Prefix = %(mergeout)s + +*TopLayer=%(prefix)s.cmp +*BottomLayer=%(prefix)s.sol +*TopSilkscreen=%(prefix)s.plc +*BottomSilkscreen=%(prefix)s.pls +*TopSoldermask=%(prefix)s.stc +*BottomSoldermask=%(prefix)s.sts +Drills=%(prefix)s.xln +BoardOutline=%(prefix)s.bor +ToolList = toollist.%(prefix)s.drl +Placement = placement.%(prefix)s.txt + +############################################################################## +# The remainder of the file specifies the jobs to be panelized. Each job is +# specified in its own section. To each job you can assign a job name, which +# will be the name of the section in square brackets (e.g., [Proj1]). This job +# name is used in the layout file (if used) to refer to the job. +# +# Job names are case-sensitive, but do not create job names that are the same +# except for the case of the characters, as this may cause problems during +# layout. Job names may only contain the following characters: +# +# a-z A-Z 0-9 _ +# +# In addition, job names must begin with a letter (a-z or A-Z). +############################################################################## +[Proj1] + +# You can set any options you like to make generating filenames easier, like +# Prefix. This is just a helper option, not a reserved name. Note, however, +# that you must write %(prefix)s below, in ALL LOWERCASE. +# +# Note how we are making use of the 'projdir' string defined way up at the top +# in the [DEFAULT] section to save some typing. By setting 'projdir=somedir' +# the expression '%(projdir)s/proj1' expands to 'somedir/proj1'. +Prefix=%(projdir)s/proj1 + +# List all the layers that participate in this job. Required layers are Drills +# and BoardOutline and have no '*' at the beginning. Optional layers have +# names chosen by you and begin with '*'. You should choose consistent layer +# names across all jobs. +*TopLayer=%(prefix)s.cmp +*BottomLayer=%(prefix)s.sol +*TopSilkscreen=%(prefix)s.plc +*BottomSilkscreen=%(prefix)s.pls +*TopSoldermask=%(prefix)s.stc +*BottomSoldermask=%(prefix)s.sts +Drills=%(prefix)s.xln +BoardOutline=%(prefix)s.bor + +# If this job does not have drill tool sizes embedded in the Excellon file, it +# needs to have a separate tool list file that maps tool names (e.g., 'T01') to +# tool diameter. This may be the global tool list specified in the [Options] +# section with the ToolList parameter. If this job doesn't have embedded tool +# sizes, and uses a different tool list than the global one, you can specify it +# here. +#ToolList=proj1.drl + +# If this job has a different ExcellonDecimals setting than the global setting +# in the [Options] section above, it can be overridden here. +#ExcellonDecimals = 3 + +# You can set a 'Repeat' parameter for this job when using automatic placement +# (i.e., no *.def file) to indicate how many times this job should appear in +# the final panel. When using manual placement, this option is ignored. +Repeat = 11 + +[Hexapod] +Prefix=%(projdir)s/hexapod +*TopLayer=%(prefix)s.cmp +*BottomLayer=%(prefix)s.sol +*TopSilkscreen=%(prefix)s.plc +Drills=%(prefix)s.xln +BoardOutline=%(prefix)s.bor diff --git a/testdata/layout2.def b/testdata/layout2.def new file mode 100644 index 0000000..251cba5 --- /dev/null +++ b/testdata/layout2.def @@ -0,0 +1,57 @@ +# This layout merges a Hexapod and Proj1 boards into a single +# panel. The layout demonstrates nested rows and columns. The +# final arrangement looks like this (make sure you are looking +# at this document with a fixed-width font like Courier): +# +# +-----------------------------------------------------+ +# | Proj1 | Proj1 | Proj1 | Proj1 | Proj1 | | +# | | | | | | | +# | | | | | | | +# +---------+---------+---------+---------+--------+ | +# | | +# | +-------+-------+ +# | | P | P | +# +--------------------------------+ | r | r | +# | | | o | o | +# | | | j | j | +# | | | 1 | 1 | +# | | +-------+-------+ +# | | | P | P | +# | | | r | r | +# | | | o | o | +# | Hexapod | | j | j | +# | | | 1 | 1 | +# | | +-------+-------+ +# | | | P | P | +# | | | r | r | +# | | | o | o | +# | | | j | j | +# | | | 1 | 1 | +# +--------------------------------+----+-------+-------+ + +Row { // First row has the hexapod and 2x3 panel of + // rotated Proj1 jobs. + Hexapod + Col { // Could also write this as two separate 1x3 columns + Row { // First 1x2 row + Proj1 Rotate + Proj1 Rotate + } + Row { // Second 1x2 row above first one + Proj1 Rotate + Proj1 Rotate + } + Row { // Third 1x2 row above second row + Proj1 Rotate + Proj1 Rotate + } + } // end of column +} // end of first row + +Row { // Second row has 5x1 panel of Proj1 + Proj1 + Proj1 + Proj1 + Proj1 + Proj1 +} diff --git a/testdata/proj1.bor b/testdata/proj1.bor new file mode 100644 index 0000000..0b33046 --- /dev/null +++ b/testdata/proj1.bor @@ -0,0 +1,52 @@ +G75* +G70* +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0000*% +D10* +X000740Y000477D02* +X000740Y009873D01* +X011210Y009873D01* +X011210Y000477D01* +X000740Y000477D01* +X005505Y005625D02* +X005507Y005647D01* +X005513Y005668D01* +X005523Y005688D01* +X005536Y005706D01* +X005553Y005721D01* +X005572Y005732D01* +X005592Y005740D01* +X005614Y005744D01* +X005636Y005744D01* +X005658Y005740D01* +X005678Y005732D01* +X005697Y005721D01* +X005714Y005706D01* +X005727Y005688D01* +X005737Y005668D01* +X005743Y005647D01* +X005745Y005625D01* +X005743Y005603D01* +X005737Y005582D01* +X005727Y005562D01* +X005714Y005544D01* +X005697Y005529D01* +X005678Y005518D01* +X005658Y005510D01* +X005636Y005506D01* +X005614Y005506D01* +X005592Y005510D01* +X005572Y005518D01* +X005553Y005529D01* +X005536Y005544D01* +X005523Y005562D01* +X005513Y005582D01* +X005507Y005603D01* +X005505Y005625D01* +M02* diff --git a/testdata/proj1.brd b/testdata/proj1.brd new file mode 100644 index 0000000000000000000000000000000000000000..66a2a30868c8ba30ca7b3b04e252156c3fced743 GIT binary patch literal 6152 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 literal 0 HcmV?d00001 diff --git a/testdata/proj1.cam b/testdata/proj1.cam new file mode 100644 index 0000000..f0481ae --- /dev/null +++ b/testdata/proj1.cam @@ -0,0 +1,153 @@ +[CAM Processor Job] +Description="" +Section=Sec_1 +Section=Sec_2 +Section=Sec_3 +Section=Sec_4 +Section=Sec_5 +Section=Sec_6 +Section=Sec_7 +Section=Sec_8 + +[Sec_1] +Name="TopLayer" +Prompt="" +Device="GERBER_RS274X" +Wheel="" +Rack="" +Scale=1.000000 +Output="proj1.cmp" +Flags="0 0 0 1 0 1 1" +Emulate="0 0 0" +Offset="0.0mil 0.0mil" +Sheet=1 +Tolerance="0.000000 0.000000 0.000000 0.000000 0.000000 0.000000" +Pen="0.0mil 0.000000" +Page="12000.0mil 8000.0mil" +Layers=" 1 17 18 50 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 252 253 255" +Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0" + +[Sec_2] +Name="BottomLayer" +Prompt="" +Device="GERBER_RS274X" +Wheel="" +Rack="" +Scale=1.000000 +Output="proj1.sol" +Flags="0 0 0 1 0 1 1" +Emulate="0 0 0" +Offset="0.0mil 0.0mil" +Sheet=1 +Tolerance="0.000000 0.000000 0.000000 0.000000 0.000000 0.000000" +Pen="0.0mil 0.000000" +Page="12000.0mil 8000.0mil" +Layers=" 16 17 18 50 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 252 253 255" +Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0" + +[Sec_3] +Name="BoardOutline" +Prompt="" +Device="GERBER_RS274X" +Wheel="" +Rack="" +Scale=1.000000 +Output="proj1.bor" +Flags="0 0 0 1 0 1 1" +Emulate="0 0 0" +Offset="0.0mil 0.0mil" +Sheet=1 +Tolerance="0.000000 0.000000 0.000000 0.000000 0.000000 0.000000" +Pen="0.0mil 0.000000" +Page="12000.0mil 8000.0mil" +Layers=" 20 50 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 252 253 255" +Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0" + +[Sec_4] +Name="Drills" +Prompt="" +Device="EXCELLON" +Wheel="" +Scale=1.000000 +Output="proj1.xln" +Flags="0 0 0 1 0 1 1" +Emulate="0 0 0" +Offset="0.0mil 0.0mil" +Sheet=1 +Tolerance="0.000000 0.000000 0.000000 0.000000 0.020000 0.100000" +Pen="0.0mil 0.000000" +Page="12000.0mil 8000.0mil" +Layers=" 44 45 50 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 252 253 255" +Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0" + +[Sec_5] +Name="Top Soldermask" +Prompt="" +Device="GERBER_RS274X" +Wheel="" +Rack="proj1.drl" +Scale=1.000000 +Output="proj1.stc" +Flags="0 0 0 1 0 1 1" +Emulate="0 0 0" +Offset="0.0mil 0.0mil" +Sheet=1 +Tolerance="0.000000 0.000000 0.000000 0.000000 0.020000 0.100000" +Pen="0.0mil 0.000000" +Page="12000.0mil 8000.0mil" +Layers=" 29 50 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 252 253 255" +Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0" + +[Sec_6] +Name="Bottom Soldermask" +Prompt="" +Device="GERBER_RS274X" +Wheel="" +Rack="proj1.drl" +Scale=1.000000 +Output="proj1.sts" +Flags="0 0 0 1 0 1 1" +Emulate="0 0 0" +Offset="0.0mil 0.0mil" +Sheet=1 +Tolerance="0.000000 0.000000 0.000000 0.000000 0.020000 0.100000" +Pen="0.0mil 0.000000" +Page="12000.0mil 8000.0mil" +Layers=" 30 50 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 252 253 255" +Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0" + +[Sec_7] +Name="Top Silkscreen" +Prompt="" +Device="GERBER_RS274X" +Wheel="" +Rack="proj1.drl" +Scale=1.000000 +Output="proj1.plc" +Flags="0 0 0 1 0 1 1" +Emulate="0 0 0" +Offset="0.0mil 0.0mil" +Sheet=1 +Tolerance="0.000000 0.000000 0.000000 0.000000 0.020000 0.100000" +Pen="0.0mil 0.000000" +Page="12000.0mil 8000.0mil" +Layers=" 21 25 50 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 252 253 255" +Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0" + +[Sec_8] +Name="Bottom Silkscreen" +Prompt="" +Device="GERBER_RS274X" +Wheel="" +Rack="proj1.drl" +Scale=1.000000 +Output="proj1.pls" +Flags="0 0 0 1 0 1 1" +Emulate="0 0 0" +Offset="0.0mil 0.0mil" +Sheet=1 +Tolerance="0.000000 0.000000 0.000000 0.000000 0.020000 0.100000" +Pen="0.0mil 0.000000" +Page="12000.0mil 8000.0mil" +Layers=" 22 26 50 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 252 253 255" +Colors=" 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 6 6 4 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 1 1 1 1 3 3 1 2 6 8 8 5 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 2 4 3 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0" diff --git a/testdata/proj1.cmp b/testdata/proj1.cmp new file mode 100644 index 0000000..8ae1cd0 --- /dev/null +++ b/testdata/proj1.cmp @@ -0,0 +1,765 @@ +G75* +G70* +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0060*% +%ADD11R,0.1500X0.1000*% +%ADD12C,0.0160*% +%ADD13OC8,0.0850*% +%ADD14O,0.0780X0.1560*% +%ADD15O,0.1560X0.0780*% +%ADD16O,0.1200X0.0600*% +%ADD17C,0.0400*% +%ADD18R,0.0400X0.0400*% +%ADD19C,0.0020*% +D10* +X004768Y008755D02* +X004768Y009395D01* +X004555Y009395D02* +X004982Y009395D01* +X005199Y009075D02* +X005306Y009182D01* +X005520Y009182D01* +X005626Y009075D01* +X005626Y008968D01* +X005199Y008968D01* +X005199Y008862D02* +X005199Y009075D01* +X005199Y008862D02* +X005306Y008755D01* +X005520Y008755D01* +X005844Y008755D02* +X006271Y009182D01* +X006488Y009182D02* +X006702Y009182D01* +X006595Y009289D02* +X006595Y008862D01* +X006702Y008755D01* +X006271Y008755D02* +X005844Y009182D01* +D11* +X002375Y009125D03* +D12* +X007225Y006925D02* +X009725Y006925D01* +X009725Y004925D01* +X007225Y004925D01* +X007225Y006925D01* +X007225Y006808D02* +X009725Y006808D01* +X009725Y006650D02* +X007225Y006650D01* +X007225Y006491D02* +X007935Y006491D01* +X007974Y006530D02* +X007620Y006175D01* +X007620Y005975D01* +X008175Y005975D01* +X008175Y006530D01* +X007974Y006530D01* +X008175Y006491D02* +X008275Y006491D01* +X008275Y006530D02* +X008475Y006530D01* +X008830Y006175D01* +X008830Y005975D01* +X008275Y005975D01* +X008275Y005875D01* +X008830Y005875D01* +X008830Y005674D01* +X008475Y005320D01* +X008275Y005320D01* +X008275Y005875D01* +X008175Y005875D01* +X008175Y005320D01* +X007974Y005320D01* +X007620Y005674D01* +X007620Y005875D01* +X008175Y005875D01* +X008175Y005975D01* +X008275Y005975D01* +X008275Y006530D01* +X008275Y006332D02* +X008175Y006332D01* +X008175Y006174D02* +X008275Y006174D01* +X008275Y006015D02* +X008175Y006015D01* +X008175Y005857D02* +X008275Y005857D01* +X008275Y005698D02* +X008175Y005698D01* +X008175Y005540D02* +X008275Y005540D01* +X008275Y005381D02* +X008175Y005381D01* +X007913Y005381D02* +X007225Y005381D01* +X007225Y005223D02* +X009725Y005223D01* +X009725Y005381D02* +X008537Y005381D01* +X008695Y005540D02* +X009725Y005540D01* +X009725Y005698D02* +X008830Y005698D01* +X008830Y005857D02* +X009725Y005857D01* +X009725Y006015D02* +X008830Y006015D01* +X008830Y006174D02* +X009725Y006174D01* +X009725Y006332D02* +X008673Y006332D01* +X008514Y006491D02* +X009725Y006491D01* +X009765Y007845D02* +X009625Y008125D01* +X009625Y008625D01* +X010009Y009393D01* +X010241Y009393D01* +X010625Y008625D01* +X010625Y008125D01* +X010485Y007845D01* +X010485Y008291D01* +X010407Y008369D01* +X010447Y008410D01* +X010505Y008549D01* +X010505Y008625D01* +X010505Y008700D01* +X010447Y008840D01* +X010340Y008947D01* +X010200Y009005D01* +X010125Y009005D01* +X010125Y008625D01* +X010125Y008625D01* +X010505Y008625D01* +X010125Y008625D01* +X010125Y008625D01* +X010125Y009005D01* +X010049Y009005D01* +X009910Y008947D01* +X009803Y008840D01* +X009745Y008700D01* +X009745Y008625D01* +X010124Y008625D01* +X010124Y008625D01* +X009745Y008625D01* +X009745Y008549D01* +X009803Y008410D01* +X009843Y008369D01* +X009765Y008291D01* +X009765Y007845D01* +X009765Y007918D02* +X009728Y007918D01* +X009765Y008076D02* +X009649Y008076D01* +X009625Y008235D02* +X009765Y008235D01* +X009819Y008394D02* +X009625Y008394D01* +X009625Y008552D02* +X009745Y008552D01* +X009749Y008711D02* +X009668Y008711D01* +X009747Y008869D02* +X009832Y008869D01* +X009826Y009028D02* +X010423Y009028D01* +X010418Y008869D02* +X010503Y008869D01* +X010501Y008711D02* +X010582Y008711D01* +X010625Y008552D02* +X010505Y008552D01* +X010431Y008394D02* +X010625Y008394D01* +X010625Y008235D02* +X010485Y008235D01* +X010485Y008076D02* +X010601Y008076D01* +X010521Y007918D02* +X010485Y007918D01* +X010125Y008711D02* +X010125Y008711D01* +X010125Y008869D02* +X010125Y008869D01* +X009906Y009186D02* +X010344Y009186D01* +X010265Y009345D02* +X009985Y009345D01* +X007777Y006332D02* +X007225Y006332D01* +X007225Y006174D02* +X007620Y006174D01* +X007620Y006015D02* +X007225Y006015D01* +X007225Y005857D02* +X007620Y005857D01* +X007620Y005698D02* +X007225Y005698D01* +X007225Y005540D02* +X007754Y005540D01* +X007225Y005064D02* +X009725Y005064D01* +X006625Y004525D02* +X006625Y003525D01* +X004625Y003525D01* +X004918Y005625D02* +X004921Y005689D01* +X004930Y005753D01* +X004944Y005816D01* +X004964Y005877D01* +X004990Y005936D01* +X005021Y005992D01* +X005057Y006046D01* +X005097Y006096D01* +X005142Y006142D01* +X005191Y006183D01* +X005244Y006221D01* +X005300Y006253D01* +X005358Y006280D01* +X005419Y006301D01* +X005481Y006317D01* +X005545Y006327D01* +X005609Y006332D01* +X005673Y006330D01* +X005737Y006323D01* +X005800Y006310D01* +X005862Y006291D01* +X005921Y006267D01* +X005978Y006237D01* +X006033Y006203D01* +X006084Y006163D01* +X006131Y006119D01* +X006173Y006071D01* +X006212Y006019D01* +X006245Y005964D01* +X006273Y005907D01* +X006296Y005847D01* +X006314Y005785D01* +X006325Y005721D01* +X006331Y005657D01* +X006331Y005593D01* +X006325Y005529D01* +X006314Y005465D01* +X006296Y005403D01* +X006273Y005343D01* +X006245Y005286D01* +X006212Y005231D01* +X006173Y005179D01* +X006131Y005131D01* +X006084Y005087D01* +X006033Y005047D01* +X005979Y005013D01* +X005921Y004983D01* +X005862Y004959D01* +X005800Y004940D01* +X005737Y004927D01* +X005673Y004920D01* +X005609Y004918D01* +X005545Y004923D01* +X005481Y004933D01* +X005419Y004949D01* +X005358Y004970D01* +X005300Y004997D01* +X005244Y005029D01* +X005191Y005067D01* +X005142Y005108D01* +X005097Y005154D01* +X005057Y005204D01* +X005021Y005258D01* +X004990Y005314D01* +X004964Y005373D01* +X004944Y005434D01* +X004930Y005497D01* +X004921Y005561D01* +X004918Y005625D01* +D13* +X001625Y005625D03* +X008225Y005925D03* +D14* +X001625Y001625D03* +D15* +X003625Y001625D03* +D16* +X009564Y002233D03* +X009564Y003217D03* +D17* +X010125Y008625D03* +D18* +X010125Y008025D03* +D19* +X005634Y001056D02* +X005634Y001196D01* +X005635Y001195D02* +X005682Y001198D01* +X005728Y001205D01* +X005773Y001215D01* +X005817Y001229D01* +X005860Y001247D01* +X005902Y001269D01* +X005941Y001294D01* +X005978Y001322D01* +X006013Y001353D01* +X006045Y001387D01* +X006074Y001424D01* +X006100Y001462D01* +X006122Y001503D01* +X006141Y001546D01* +X006156Y001590D01* +X006168Y001635D01* +X006176Y001681D01* +X006180Y001728D01* +X006179Y001774D01* +X006175Y001821D01* +X006168Y001867D01* +X006156Y001912D01* +X006140Y001956D01* +X006121Y001998D01* +X006099Y002039D01* +X006073Y002078D01* +X006044Y002114D01* +X006012Y002148D01* +X005977Y002179D01* +X005940Y002207D01* +X005900Y002232D01* +X005859Y002253D01* +X005816Y002271D01* +X005771Y002285D01* +X005726Y002296D01* +X005680Y002302D01* +X005633Y002305D01* +X005587Y002304D01* +X005540Y002299D01* +X005495Y002289D01* +X005450Y002277D01* +X005406Y002260D01* +X005364Y002240D01* +X005324Y002216D01* +X005286Y002189D01* +X005250Y002159D01* +X005217Y002126D01* +X005187Y002091D01* +X005076Y002174D01* +X005075Y002175D01* +X005109Y002216D01* +X005146Y002254D01* +X005186Y002289D01* +X005228Y002320D01* +X005273Y002349D01* +X005319Y002374D01* +X005368Y002396D01* +X005418Y002413D01* +X005469Y002427D01* +X005521Y002437D01* +X005573Y002443D01* +X005626Y002445D01* +X005679Y002443D01* +X005732Y002437D01* +X005784Y002427D01* +X005835Y002413D01* +X005885Y002395D01* +X005933Y002373D01* +X005980Y002348D01* +X006024Y002319D01* +X006066Y002287D01* +X006106Y002252D01* +X006143Y002214D01* +X006176Y002173D01* +X006207Y002130D01* +X006234Y002084D01* +X006258Y002037D01* +X006278Y001988D01* +X006294Y001937D01* +X006307Y001886D01* +X006315Y001834D01* +X006319Y001781D01* +X006320Y001728D01* +X006316Y001675D01* +X006308Y001623D01* +X006297Y001571D01* +X006281Y001520D01* +X006262Y001471D01* +X006238Y001423D01* +X006212Y001378D01* +X006182Y001334D01* +X006148Y001293D01* +X006112Y001254D01* +X006073Y001219D01* +X006031Y001186D01* +X005987Y001157D01* +X005941Y001131D01* +X005893Y001109D01* +X005843Y001090D01* +X005792Y001075D01* +X005740Y001065D01* +X005688Y001058D01* +X005635Y001055D01* +X005635Y001073D01* +X005687Y001076D01* +X005738Y001082D01* +X005788Y001093D01* +X005838Y001107D01* +X005886Y001125D01* +X005933Y001147D01* +X005978Y001172D01* +X006021Y001201D01* +X006061Y001233D01* +X006100Y001267D01* +X006135Y001305D01* +X006167Y001345D01* +X006197Y001387D01* +X006223Y001432D01* +X006245Y001478D01* +X006264Y001526D01* +X006279Y001576D01* +X006291Y001626D01* +X006298Y001677D01* +X006302Y001729D01* +X006301Y001780D01* +X006297Y001832D01* +X006289Y001882D01* +X006277Y001933D01* +X006261Y001982D01* +X006242Y002029D01* +X006219Y002076D01* +X006192Y002120D01* +X006162Y002162D01* +X006129Y002202D01* +X006093Y002239D01* +X006055Y002273D01* +X006014Y002304D01* +X005970Y002332D01* +X005925Y002357D01* +X005878Y002378D01* +X005830Y002395D01* +X005780Y002409D01* +X005729Y002419D01* +X005678Y002425D01* +X005626Y002427D01* +X005575Y002425D01* +X005524Y002419D01* +X005473Y002410D01* +X005423Y002396D01* +X005374Y002379D01* +X005327Y002358D01* +X005282Y002334D01* +X005238Y002306D01* +X005197Y002275D01* +X005159Y002241D01* +X005123Y002204D01* +X005089Y002164D01* +X005104Y002153D01* +X005137Y002193D01* +X005173Y002229D01* +X005211Y002263D01* +X005252Y002293D01* +X005295Y002321D01* +X005341Y002344D01* +X005388Y002365D01* +X005436Y002381D01* +X005486Y002394D01* +X005536Y002403D01* +X005587Y002408D01* +X005638Y002409D01* +X005689Y002406D01* +X005740Y002399D01* +X005790Y002388D01* +X005839Y002373D01* +X005887Y002355D01* +X005933Y002333D01* +X005977Y002307D01* +X006019Y002278D01* +X006059Y002246D01* +X006096Y002211D01* +X006130Y002173D01* +X006162Y002132D01* +X006190Y002090D01* +X006214Y002045D01* +X006236Y001998D01* +X006253Y001950D01* +X006267Y001901D01* +X006276Y001850D01* +X006282Y001800D01* +X006284Y001748D01* +X006282Y001697D01* +X006276Y001647D01* +X006266Y001596D01* +X006252Y001547D01* +X006234Y001499D01* +X006213Y001453D01* +X006188Y001408D01* +X006160Y001365D01* +X006128Y001325D01* +X006094Y001287D01* +X006057Y001252D01* +X006017Y001220D01* +X005974Y001191D01* +X005930Y001166D01* +X005884Y001144D01* +X005836Y001126D01* +X005787Y001111D01* +X005737Y001101D01* +X005686Y001094D01* +X005635Y001091D01* +X005635Y001109D01* +X005686Y001112D01* +X005736Y001119D01* +X005786Y001129D01* +X005834Y001144D01* +X005881Y001162D01* +X005927Y001185D01* +X005971Y001210D01* +X006012Y001239D01* +X006052Y001272D01* +X006088Y001307D01* +X006122Y001345D01* +X006152Y001385D01* +X006179Y001428D01* +X006203Y001473D01* +X006223Y001520D01* +X006240Y001568D01* +X006252Y001617D01* +X006261Y001667D01* +X006265Y001717D01* +X006266Y001768D01* +X006262Y001819D01* +X006255Y001869D01* +X006244Y001918D01* +X006228Y001967D01* +X006209Y002014D01* +X006187Y002059D01* +X006160Y002103D01* +X006131Y002144D01* +X006098Y002183D01* +X006062Y002219D01* +X006024Y002252D01* +X005983Y002282D01* +X005940Y002308D01* +X005895Y002332D01* +X005848Y002351D01* +X005800Y002367D01* +X005750Y002379D01* +X005700Y002387D01* +X005650Y002391D01* +X005599Y002390D01* +X005548Y002386D01* +X005498Y002378D01* +X005449Y002366D01* +X005401Y002350D01* +X005354Y002331D01* +X005309Y002308D01* +X005266Y002281D01* +X005225Y002251D01* +X005186Y002218D01* +X005151Y002181D01* +X005118Y002143D01* +X005133Y002132D01* +X005164Y002169D01* +X005199Y002205D01* +X005236Y002237D01* +X005276Y002266D01* +X005318Y002292D01* +X005362Y002315D01* +X005407Y002334D01* +X005454Y002349D01* +X005502Y002361D01* +X005551Y002369D01* +X005600Y002372D01* +X005649Y002373D01* +X005698Y002369D01* +X005747Y002361D01* +X005795Y002349D01* +X005842Y002334D01* +X005887Y002315D01* +X005931Y002293D01* +X005973Y002267D01* +X006013Y002238D01* +X006050Y002205D01* +X006085Y002170D01* +X006117Y002133D01* +X006145Y002093D01* +X006171Y002050D01* +X006193Y002006D01* +X006211Y001961D01* +X006226Y001914D01* +X006237Y001866D01* +X006244Y001817D01* +X006248Y001768D01* +X006247Y001718D01* +X006243Y001669D01* +X006234Y001621D01* +X006222Y001573D01* +X006206Y001526D01* +X006187Y001481D01* +X006164Y001437D01* +X006137Y001396D01* +X006108Y001356D01* +X006075Y001319D01* +X006040Y001285D01* +X006002Y001254D01* +X005961Y001226D01* +X005919Y001201D01* +X005874Y001179D01* +X005828Y001161D01* +X005781Y001147D01* +X005733Y001136D01* +X005684Y001130D01* +X005635Y001127D01* +X005635Y001145D01* +X005684Y001148D01* +X005732Y001155D01* +X005780Y001165D01* +X005826Y001180D01* +X005872Y001198D01* +X005915Y001219D01* +X005957Y001244D01* +X005997Y001273D01* +X006034Y001304D01* +X006069Y001339D01* +X006101Y001376D01* +X006129Y001416D01* +X006154Y001457D01* +X006176Y001501D01* +X006195Y001546D01* +X006209Y001593D01* +X006220Y001640D01* +X006227Y001689D01* +X006230Y001738D01* +X006229Y001786D01* +X006224Y001835D01* +X006215Y001883D01* +X006203Y001930D01* +X006186Y001976D01* +X006166Y002021D01* +X006143Y002063D01* +X006116Y002104D01* +X006085Y002142D01* +X006052Y002178D01* +X006016Y002211D01* +X005978Y002241D01* +X005937Y002268D01* +X005894Y002292D01* +X005850Y002312D01* +X005804Y002328D01* +X005757Y002341D01* +X005709Y002349D01* +X005660Y002354D01* +X005611Y002355D01* +X005562Y002352D01* +X005514Y002345D01* +X005467Y002334D01* +X005420Y002319D01* +X005375Y002301D01* +X005331Y002279D01* +X005289Y002253D01* +X005250Y002225D01* +X005213Y002193D01* +X005179Y002158D01* +X005147Y002121D01* +X005161Y002110D01* +X005193Y002147D01* +X005227Y002181D01* +X005264Y002213D01* +X005303Y002241D01* +X005344Y002266D01* +X005388Y002287D01* +X005433Y002305D01* +X005479Y002319D01* +X005526Y002329D01* +X005574Y002335D01* +X005622Y002337D01* +X005671Y002335D01* +X005719Y002329D01* +X005766Y002320D01* +X005812Y002306D01* +X005857Y002289D01* +X005901Y002268D01* +X005943Y002244D01* +X005982Y002216D01* +X006019Y002185D01* +X006054Y002151D01* +X006085Y002114D01* +X006114Y002075D01* +X006139Y002034D01* +X006160Y001991D01* +X006178Y001946D01* +X006193Y001900D01* +X006203Y001852D01* +X006209Y001805D01* +X006212Y001756D01* +X006210Y001708D01* +X006205Y001660D01* +X006196Y001613D01* +X006182Y001566D01* +X006165Y001521D01* +X006145Y001477D01* +X006121Y001435D01* +X006093Y001396D01* +X006062Y001358D01* +X006029Y001324D01* +X005992Y001292D01* +X005953Y001263D01* +X005912Y001238D01* +X005869Y001216D01* +X005824Y001198D01* +X005778Y001183D01* +X005731Y001173D01* +X005683Y001166D01* +X005635Y001163D01* +X005635Y001181D01* +X005683Y001184D01* +X005730Y001191D01* +X005777Y001202D01* +X005822Y001216D01* +X005866Y001235D01* +X005909Y001257D01* +X005949Y001282D01* +X005987Y001311D01* +X006023Y001343D01* +X006055Y001378D01* +X006085Y001415D01* +X006112Y001455D01* +X006135Y001497D01* +X006154Y001541D01* +X006170Y001586D01* +X006182Y001632D01* +X006190Y001679D01* +X006194Y001727D01* +X006193Y001775D01* +X006189Y001822D01* +X006181Y001869D01* +X006169Y001916D01* +X006153Y001961D01* +X006134Y002004D01* +X006111Y002046D01* +X006084Y002086D01* +X006054Y002123D01* +X006022Y002158D01* +X005986Y002190D01* +X005948Y002219D01* +X005907Y002244D01* +X005865Y002266D01* +X005821Y002284D01* +X005775Y002299D01* +X005728Y002310D01* +X005681Y002316D01* +X005633Y002319D01* +X005586Y002318D01* +X005538Y002312D01* +X005491Y002303D01* +X005445Y002290D01* +X005401Y002273D01* +X005357Y002252D01* +X005316Y002228D01* +X005277Y002200D01* +X005241Y002170D01* +X005207Y002136D01* +X005176Y002099D01* +M02* diff --git a/testdata/proj1.drl b/testdata/proj1.drl new file mode 100644 index 0000000..750ab83 --- /dev/null +++ b/testdata/proj1.drl @@ -0,0 +1,17 @@ +T01 0.028in +T02 0.035in +T03 0.042in +T04 0.052in +T05 0.0595in +T06 0.086in +T07 0.125in +T08 0.152in +T09 0.025in +T10 0.032in +T11 0.1015in +T12 0.0670in +T13 0.0465in +T14 0.036in +T15 0.136in +T16 0.020in +T17 0.032in diff --git a/testdata/proj1.plc b/testdata/proj1.plc new file mode 100644 index 0000000..02aed27 --- /dev/null +++ b/testdata/proj1.plc @@ -0,0 +1,160 @@ +G75* +G70* +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0050*% +%ADD11C,0.0060*% +%ADD12C,0.0260*% +%ADD13R,0.2600X0.0240*% +D10* +X003450Y002300D02* +X003450Y002750D01* +X003300Y002750D02* +X003600Y002750D01* +X003760Y002750D02* +X003985Y002750D01* +X004060Y002675D01* +X004060Y002525D01* +X003985Y002450D01* +X003760Y002450D01* +X003760Y002300D02* +X003760Y002750D01* +X004221Y002525D02* +X004521Y002525D01* +X004446Y002300D02* +X004446Y002750D01* +X004221Y002525D01* +X002521Y002500D02* +X002221Y002500D01* +X002521Y002800D01* +X002521Y002875D01* +X002446Y002950D01* +X002296Y002950D01* +X002221Y002875D01* +X002060Y002875D02* +X002060Y002725D01* +X001985Y002650D01* +X001760Y002650D01* +X001760Y002500D02* +X001760Y002950D01* +X001985Y002950D01* +X002060Y002875D01* +X001600Y002950D02* +X001300Y002950D01* +X001450Y002950D02* +X001450Y002500D01* +X001400Y006150D02* +X001400Y006600D01* +X001250Y006600D02* +X001550Y006600D01* +X001710Y006600D02* +X001935Y006600D01* +X002010Y006525D01* +X002010Y006375D01* +X001935Y006300D01* +X001710Y006300D01* +X001710Y006150D02* +X001710Y006600D01* +X002171Y006525D02* +X002246Y006600D01* +X002396Y006600D01* +X002471Y006525D01* +X002471Y006450D01* +X002396Y006375D01* +X002471Y006300D01* +X002471Y006225D01* +X002396Y006150D01* +X002246Y006150D01* +X002171Y006225D01* +X002321Y006375D02* +X002396Y006375D01* +X007850Y006900D02* +X008150Y006900D01* +X008000Y006900D02* +X008000Y006450D01* +X008310Y006450D02* +X008310Y006900D01* +X008535Y006900D01* +X008610Y006825D01* +X008610Y006675D01* +X008535Y006600D01* +X008310Y006600D01* +X008771Y006450D02* +X009071Y006450D01* +X008921Y006450D02* +X008921Y006900D01* +X008771Y006750D01* +X009039Y004468D02* +X009039Y004167D01* +X008889Y004007D02* +X008589Y004007D01* +X008739Y004167D02* +X008589Y004317D01* +X009039Y004317D01* +X008889Y004007D02* +X009039Y003857D01* +X008889Y003707D01* +X008589Y003707D01* +X008664Y003547D02* +X008589Y003472D01* +X008589Y003322D01* +X008664Y003247D01* +X008739Y003247D01* +X008814Y003322D01* +X008814Y003472D01* +X008889Y003547D01* +X008964Y003547D01* +X009039Y003472D01* +X009039Y003322D01* +X008964Y003247D01* +X010289Y003848D02* +X010589Y004148D01* +X010589Y004223D01* +X010514Y004298D01* +X010364Y004298D01* +X010289Y004223D01* +X010289Y003848D02* +X010589Y003848D01* +X010489Y001478D02* +X010489Y001028D01* +X010339Y001028D02* +X010639Y001028D01* +X010339Y001328D02* +X010489Y001478D01* +D11* +X010664Y001773D02* +X010314Y001773D01* +X010314Y003643D01* +X010664Y003643D01* +X014314Y003643D01* +X014564Y003643D01* +X014914Y003843D01* +X014914Y004643D01* +X009714Y004643D01* +X009714Y003603D01* +X010664Y003643D02* +X010664Y001773D01* +X014314Y001773D01* +X014314Y003643D01* +X014314Y001773D02* +X014564Y001773D01* +X014914Y001573D01* +X014914Y000783D01* +X009714Y000783D01* +X009714Y001843D01* +X009714Y002623D02* +X009714Y002823D01* +D12* +X013214Y003217D02* +X013414Y003217D01* +X013414Y002233D02* +X013214Y002233D01* +D13* +X011964Y002233D03* +X011964Y003213D03* +M02* diff --git a/testdata/proj1.pls b/testdata/proj1.pls new file mode 100644 index 0000000..59b1528 --- /dev/null +++ b/testdata/proj1.pls @@ -0,0 +1,43 @@ +G75* +G70* +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0040*% +D10* +X003138Y007845D02* +X003445Y007845D01* +X003598Y007845D02* +X003751Y007998D01* +X003675Y007998D02* +X003905Y007998D01* +X003675Y007998D02* +X003598Y008075D01* +X003598Y008229D01* +X003675Y008305D01* +X003905Y008305D01* +X003905Y007845D01* +X003445Y008152D02* +X003291Y008305D01* +X003291Y007845D01* +X005588Y008195D02* +X005895Y008195D01* +X006048Y008195D02* +X006201Y008348D01* +X006048Y008272D02* +X006125Y008195D01* +X006278Y008195D01* +X006355Y008272D01* +X006355Y008579D01* +X006278Y008655D01* +X006125Y008655D01* +X006048Y008579D01* +X006048Y008272D01* +X005741Y008195D02* +X005741Y008655D01* +X005895Y008502D01* +M02* diff --git a/testdata/proj1.sch b/testdata/proj1.sch new file mode 100644 index 0000000000000000000000000000000000000000..4a312fccc0ed42c23e7be7110bbcfe0fe31fdc0a GIT binary patch literal 42086 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 QiEbbAje*zNWw+h`0ASnyIsgCw literal 0 HcmV?d00001 diff --git a/testdata/proj1.sol b/testdata/proj1.sol new file mode 100644 index 0000000..aa1c9a7 --- /dev/null +++ b/testdata/proj1.sol @@ -0,0 +1,652 @@ +G75* +G70* +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10OC8,0.0850*% +%ADD11O,0.0780X0.1560*% +%ADD12O,0.1560X0.0780*% +%ADD13R,0.0394X0.0551*% +%ADD14R,0.0630X0.0787*% +%ADD15O,0.1200X0.0600*% +%ADD16C,0.0400*% +%ADD17C,0.0100*% +%ADD18R,0.0400X0.0400*% +D10* +X001625Y005625D03* +X008225Y005925D03* +D11* +X001625Y001625D03* +D12* +X003625Y001625D03* +D13* +X005251Y006992D03* +X005999Y006992D03* +X005625Y007858D03* +D14* +X003976Y007325D03* +X002874Y007325D03* +D15* +X009564Y003217D03* +X009564Y002233D03* +D16* +X010125Y008625D03* +D17* +X002165Y001011D02* +X002080Y000927D01* +X010760Y000927D01* +X010760Y009423D01* +X001190Y009423D01* +X001190Y006003D01* +X001387Y006200D01* +X001863Y006200D01* +X002200Y005863D01* +X002200Y005387D01* +X001863Y005050D01* +X001387Y005050D01* +X001190Y005247D01* +X001190Y002343D01* +X001401Y002555D01* +X001849Y002555D01* +X002165Y002239D01* +X002165Y001011D01* +X002165Y001019D02* +X010760Y001019D01* +X010760Y001118D02* +X004271Y001118D01* +X004239Y001085D02* +X004555Y001401D01* +X004555Y001849D01* +X004239Y002165D01* +X003011Y002165D01* +X002695Y001849D01* +X002695Y001401D01* +X003011Y001085D01* +X004239Y001085D01* +X004370Y001216D02* +X010760Y001216D01* +X010760Y001315D02* +X004468Y001315D01* +X004555Y001413D02* +X010760Y001413D01* +X010760Y001512D02* +X004555Y001512D01* +X004555Y001610D02* +X010760Y001610D01* +X010760Y001709D02* +X004555Y001709D01* +X004555Y001807D02* +X009053Y001807D01* +X009078Y001783D02* +X010051Y001783D01* +X010314Y002046D01* +X010314Y002419D01* +X010051Y002683D01* +X009078Y002683D01* +X008814Y002419D01* +X008814Y002046D01* +X009078Y001783D01* +X008955Y001906D02* +X004497Y001906D01* +X004399Y002004D02* +X008856Y002004D01* +X008814Y002103D02* +X004300Y002103D01* +X002949Y002103D02* +X002165Y002103D01* +X002165Y002004D02* +X002851Y002004D01* +X002752Y001906D02* +X002165Y001906D01* +X002165Y001807D02* +X002695Y001807D01* +X002695Y001709D02* +X002165Y001709D01* +X002165Y001610D02* +X002695Y001610D01* +X002695Y001512D02* +X002165Y001512D01* +X002165Y001413D02* +X002695Y001413D01* +X002781Y001315D02* +X002165Y001315D01* +X002165Y001216D02* +X002880Y001216D01* +X002979Y001118D02* +X002165Y001118D01* +X002165Y002202D02* +X008814Y002202D01* +X008814Y002300D02* +X002103Y002300D01* +X002005Y002399D02* +X008814Y002399D01* +X008892Y002497D02* +X001906Y002497D01* +X001344Y002497D02* +X001190Y002497D01* +X001190Y002399D02* +X001245Y002399D01* +X001190Y002596D02* +X008991Y002596D01* +X009078Y002767D02* +X010051Y002767D01* +X010314Y003031D01* +X010314Y003403D01* +X010051Y003667D01* +X009078Y003667D01* +X008814Y003403D01* +X008814Y003031D01* +X009078Y002767D01* +X009052Y002793D02* +X001190Y002793D01* +X001190Y002891D02* +X008953Y002891D01* +X008855Y002990D02* +X001190Y002990D01* +X001190Y003088D02* +X008814Y003088D01* +X008814Y003187D02* +X001190Y003187D01* +X001190Y003286D02* +X008814Y003286D01* +X008814Y003384D02* +X001190Y003384D01* +X001190Y003483D02* +X008894Y003483D01* +X008992Y003581D02* +X001190Y003581D01* +X001190Y003680D02* +X010760Y003680D01* +X010760Y003778D02* +X001190Y003778D01* +X001190Y003877D02* +X010760Y003877D01* +X010760Y003975D02* +X001190Y003975D01* +X001190Y004074D02* +X010760Y004074D01* +X010760Y004172D02* +X001190Y004172D01* +X001190Y004271D02* +X010760Y004271D01* +X010760Y004370D02* +X001190Y004370D01* +X001190Y004468D02* +X010760Y004468D01* +X010760Y004567D02* +X001190Y004567D01* +X001190Y004665D02* +X010760Y004665D01* +X010760Y004764D02* +X001190Y004764D01* +X001190Y004862D02* +X010760Y004862D01* +X010760Y004961D02* +X001190Y004961D01* +X001190Y005059D02* +X001377Y005059D01* +X001279Y005158D02* +X001190Y005158D01* +X001872Y005059D02* +X005501Y005059D01* +X005511Y005055D02* +X005738Y005055D01* +X005948Y005142D01* +X006108Y005302D01* +X006195Y005511D01* +X006195Y005738D01* +X006108Y005948D01* +X005948Y006108D01* +X005738Y006195D01* +X005511Y006195D01* +X005302Y006108D01* +X005142Y005948D01* +X005055Y005738D01* +X005055Y005511D01* +X005142Y005302D01* +X005302Y005142D01* +X005511Y005055D01* +X005286Y005158D02* +X001971Y005158D01* +X002070Y005256D02* +X005187Y005256D01* +X005120Y005355D02* +X002168Y005355D01* +X002200Y005454D02* +X005079Y005454D01* +X005055Y005552D02* +X002200Y005552D01* +X002200Y005651D02* +X005055Y005651D01* +X005059Y005749D02* +X002200Y005749D01* +X002200Y005848D02* +X005100Y005848D01* +X005141Y005946D02* +X002117Y005946D01* +X002018Y006045D02* +X005239Y006045D01* +X005387Y006143D02* +X001920Y006143D01* +X001330Y006143D02* +X001190Y006143D01* +X001190Y006045D02* +X001232Y006045D01* +X001190Y006242D02* +X003325Y006242D01* +X003342Y006225D02* +X005542Y006225D01* +X005708Y006225D01* +X006049Y006566D01* +X006258Y006566D01* +X006346Y006654D01* +X006346Y007330D01* +X006258Y007417D01* +X005740Y007417D01* +X005652Y007330D01* +X005652Y006735D01* +X005598Y006680D01* +X005598Y007330D01* +X005510Y007417D01* +X004992Y007417D01* +X004904Y007330D01* +X004904Y006654D01* +X004933Y006625D01* +X003508Y006625D01* +X003301Y006831D01* +X003339Y006869D01* +X003339Y007781D01* +X003251Y007869D01* +X002497Y007869D01* +X002409Y007781D01* +X002409Y006869D01* +X002497Y006781D01* +X002786Y006781D01* +X003225Y006342D01* +X003342Y006225D01* +X003227Y006340D02* +X001190Y006340D01* +X001190Y006439D02* +X003128Y006439D01* +X003029Y006537D02* +X001190Y006537D01* +X001190Y006636D02* +X002931Y006636D01* +X002832Y006735D02* +X001190Y006735D01* +X001190Y006833D02* +X002445Y006833D01* +X002409Y006932D02* +X001190Y006932D01* +X001190Y007030D02* +X002409Y007030D01* +X002409Y007129D02* +X001190Y007129D01* +X001190Y007227D02* +X002409Y007227D01* +X002409Y007326D02* +X001190Y007326D01* +X001190Y007424D02* +X002409Y007424D01* +X002409Y007523D02* +X001190Y007523D01* +X001190Y007621D02* +X002409Y007621D01* +X002409Y007720D02* +X001190Y007720D01* +X001190Y007819D02* +X002447Y007819D01* +X002874Y007325D02* +X002874Y006976D01* +X003425Y006425D01* +X005625Y006425D01* +X006025Y006825D01* +X005999Y006851D01* +X005999Y006992D01* +X005652Y007030D02* +X005598Y007030D01* +X005598Y006932D02* +X005652Y006932D01* +X005652Y006833D02* +X005598Y006833D01* +X005598Y006735D02* +X005652Y006735D01* +X006020Y006537D02* +X010760Y006537D01* +X010760Y006439D02* +X008524Y006439D01* +X008463Y006500D02* +X008275Y006500D01* +X008275Y005975D01* +X008800Y005975D01* +X008800Y006163D01* +X008463Y006500D01* +X008275Y006439D02* +X008175Y006439D01* +X008175Y006500D02* +X007987Y006500D01* +X007650Y006163D01* +X007650Y005975D01* +X008175Y005975D01* +X008175Y006500D01* +X008175Y006340D02* +X008275Y006340D01* +X008275Y006242D02* +X008175Y006242D01* +X008175Y006143D02* +X008275Y006143D01* +X008275Y006045D02* +X008175Y006045D01* +X008175Y005975D02* +X008275Y005975D01* +X008275Y005875D01* +X008800Y005875D01* +X008800Y005687D01* +X008463Y005350D01* +X008275Y005350D01* +X008275Y005875D01* +X008175Y005875D01* +X008175Y005350D01* +X007987Y005350D01* +X007650Y005687D01* +X007650Y005875D01* +X008175Y005875D01* +X008175Y005975D01* +X008175Y005946D02* +X006109Y005946D01* +X006150Y005848D02* +X007650Y005848D01* +X007650Y005749D02* +X006190Y005749D01* +X006195Y005651D02* +X007686Y005651D01* +X007785Y005552D02* +X006195Y005552D01* +X006171Y005454D02* +X007883Y005454D01* +X007982Y005355D02* +X006130Y005355D01* +X006063Y005256D02* +X010760Y005256D01* +X010760Y005158D02* +X005964Y005158D01* +X005749Y005059D02* +X010760Y005059D01* +X010760Y005355D02* +X008468Y005355D01* +X008567Y005454D02* +X010760Y005454D01* +X010760Y005552D02* +X008665Y005552D01* +X008764Y005651D02* +X010760Y005651D01* +X010760Y005749D02* +X008800Y005749D01* +X008800Y005848D02* +X010760Y005848D01* +X010760Y005946D02* +X008275Y005946D01* +X008275Y005848D02* +X008175Y005848D01* +X008175Y005749D02* +X008275Y005749D01* +X008275Y005651D02* +X008175Y005651D01* +X008175Y005552D02* +X008275Y005552D01* +X008275Y005454D02* +X008175Y005454D01* +X008175Y005355D02* +X008275Y005355D01* +X008800Y006045D02* +X010760Y006045D01* +X010760Y006143D02* +X008800Y006143D01* +X008721Y006242D02* +X010760Y006242D01* +X010760Y006340D02* +X008622Y006340D01* +X007926Y006439D02* +X005922Y006439D01* +X005823Y006340D02* +X007827Y006340D01* +X007729Y006242D02* +X005725Y006242D01* +X005863Y006143D02* +X007650Y006143D01* +X007650Y006045D02* +X006011Y006045D01* +X006328Y006636D02* +X010760Y006636D01* +X010760Y006735D02* +X006346Y006735D01* +X006346Y006833D02* +X010760Y006833D01* +X010760Y006932D02* +X006346Y006932D01* +X006346Y007030D02* +X010760Y007030D01* +X010760Y007129D02* +X006346Y007129D01* +X006346Y007227D02* +X010760Y007227D01* +X010760Y007326D02* +X006346Y007326D01* +X005972Y007520D02* +X005884Y007432D01* +X005366Y007432D01* +X005278Y007520D01* +X005278Y007658D01* +X004441Y007658D01* +X004441Y006869D01* +X004353Y006781D01* +X003599Y006781D01* +X003511Y006869D01* +X003511Y007781D01* +X003599Y007869D01* +X003825Y007869D01* +X003825Y007941D01* +X003942Y008058D01* +X004108Y008058D01* +X005278Y008058D01* +X005278Y008196D01* +X005366Y008284D01* +X005884Y008284D01* +X005972Y008196D01* +X005972Y007520D01* +X005972Y007523D02* +X010760Y007523D01* +X010760Y007621D02* +X005972Y007621D01* +X005972Y007720D02* +X009818Y007720D01* +X009775Y007763D02* +X009863Y007675D01* +X010387Y007675D01* +X010475Y007763D01* +X010475Y008287D01* +X010387Y008375D01* +X010370Y008375D01* +X010422Y008427D01* +X010475Y008555D01* +X010475Y008694D01* +X010422Y008823D01* +X010323Y008922D01* +X010194Y008975D01* +X010055Y008975D01* +X009927Y008922D01* +X009828Y008823D01* +X009775Y008694D01* +X009775Y008555D01* +X009828Y008427D01* +X009880Y008375D01* +X009863Y008375D01* +X009775Y008287D01* +X009775Y007763D01* +X009775Y007819D02* +X005972Y007819D01* +X005972Y007917D02* +X009775Y007917D01* +X009775Y008016D02* +X005972Y008016D01* +X005972Y008114D02* +X009775Y008114D01* +X009775Y008213D02* +X005955Y008213D01* +X005625Y007858D02* +X004025Y007858D01* +X004025Y007325D01* +X003976Y007325D01* +X003511Y007326D02* +X003339Y007326D01* +X003339Y007424D02* +X003511Y007424D01* +X003511Y007523D02* +X003339Y007523D01* +X003339Y007621D02* +X003511Y007621D01* +X003511Y007720D02* +X003339Y007720D01* +X003301Y007819D02* +X003549Y007819D01* +X003825Y007917D02* +X001190Y007917D01* +X001190Y008016D02* +X003900Y008016D01* +X004441Y007621D02* +X005278Y007621D01* +X005278Y007523D02* +X004441Y007523D01* +X004441Y007424D02* +X010760Y007424D01* +X010760Y007720D02* +X010432Y007720D01* +X010475Y007819D02* +X010760Y007819D01* +X010760Y007917D02* +X010475Y007917D01* +X010475Y008016D02* +X010760Y008016D01* +X010760Y008114D02* +X010475Y008114D01* +X010475Y008213D02* +X010760Y008213D01* +X010760Y008311D02* +X010451Y008311D01* +X010405Y008410D02* +X010760Y008410D01* +X010760Y008508D02* +X010455Y008508D01* +X010475Y008607D02* +X010760Y008607D01* +X010760Y008705D02* +X010470Y008705D01* +X010430Y008804D02* +X010760Y008804D01* +X010760Y008903D02* +X010342Y008903D01* +X010760Y009001D02* +X001190Y009001D01* +X001190Y008903D02* +X009908Y008903D01* +X009820Y008804D02* +X001190Y008804D01* +X001190Y008705D02* +X009779Y008705D01* +X009775Y008607D02* +X001190Y008607D01* +X001190Y008508D02* +X009794Y008508D01* +X009845Y008410D02* +X001190Y008410D01* +X001190Y008311D02* +X009799Y008311D01* +X010760Y009100D02* +X001190Y009100D01* +X001190Y009198D02* +X010760Y009198D01* +X010760Y009297D02* +X001190Y009297D01* +X001190Y009395D02* +X010760Y009395D01* +X005652Y007326D02* +X005598Y007326D01* +X005598Y007227D02* +X005652Y007227D01* +X005652Y007129D02* +X005598Y007129D01* +X004904Y007129D02* +X004441Y007129D01* +X004441Y007227D02* +X004904Y007227D01* +X004904Y007326D02* +X004441Y007326D01* +X004441Y007030D02* +X004904Y007030D01* +X004904Y006932D02* +X004441Y006932D01* +X004405Y006833D02* +X004904Y006833D01* +X004904Y006735D02* +X003398Y006735D01* +X003303Y006833D02* +X003547Y006833D01* +X003511Y006932D02* +X003339Y006932D01* +X003339Y007030D02* +X003511Y007030D01* +X003511Y007129D02* +X003339Y007129D01* +X003339Y007227D02* +X003511Y007227D01* +X003496Y006636D02* +X004922Y006636D01* +X005278Y008114D02* +X001190Y008114D01* +X001190Y008213D02* +X005295Y008213D01* +X010136Y003581D02* +X010760Y003581D01* +X010760Y003483D02* +X010235Y003483D01* +X010314Y003384D02* +X010760Y003384D01* +X010760Y003286D02* +X010314Y003286D01* +X010314Y003187D02* +X010760Y003187D01* +X010760Y003088D02* +X010314Y003088D01* +X010274Y002990D02* +X010760Y002990D01* +X010760Y002891D02* +X010175Y002891D01* +X010076Y002793D02* +X010760Y002793D01* +X010760Y002694D02* +X001190Y002694D01* +X010075Y001807D02* +X010760Y001807D01* +X010760Y001906D02* +X010174Y001906D01* +X010272Y002004D02* +X010760Y002004D01* +X010760Y002103D02* +X010314Y002103D01* +X010314Y002202D02* +X010760Y002202D01* +X010760Y002300D02* +X010314Y002300D01* +X010314Y002399D02* +X010760Y002399D01* +X010760Y002497D02* +X010236Y002497D01* +X010138Y002596D02* +X010760Y002596D01* +D18* +X010125Y008025D03* +M02* diff --git a/testdata/proj1.stc b/testdata/proj1.stc new file mode 100644 index 0000000..75aa9f3 --- /dev/null +++ b/testdata/proj1.stc @@ -0,0 +1,33 @@ +G75* +G70* +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0320*% +%ADD11OC8,0.0930*% +%ADD12O,0.0860X0.1640*% +%ADD13O,0.1640X0.0860*% +%ADD14O,0.1280X0.0680*% +%ADD15C,0.0480*% +%ADD16R,0.0480X0.0480*% +D10* +X005625Y005625D03* +D11* +X008225Y005925D03* +X001625Y005625D03* +D12* +X001625Y001625D03* +D13* +X003625Y001625D03* +D14* +X009564Y002233D03* +X009564Y003217D03* +D15* +X010125Y008625D03* +D16* +X010125Y008025D03* +M02* diff --git a/testdata/proj1.sts b/testdata/proj1.sts new file mode 100644 index 0000000..bf96990 --- /dev/null +++ b/testdata/proj1.sts @@ -0,0 +1,42 @@ +G75* +G70* +%OFA0B0*% +%FSLAX24Y24*% +%IPPOS*% +%LPD*% +%AMOC8* +5,1,8,0,0,1.08239X$1,22.5* +% +%ADD10C,0.0320*% +%ADD11OC8,0.0930*% +%ADD12O,0.0860X0.1640*% +%ADD13O,0.1640X0.0860*% +%ADD14R,0.0474X0.0631*% +%ADD15R,0.0710X0.0867*% +%ADD16O,0.1280X0.0680*% +%ADD17C,0.0480*% +%ADD18R,0.0480X0.0480*% +D10* +X005625Y005625D03* +D11* +X008225Y005925D03* +X001625Y005625D03* +D12* +X001625Y001625D03* +D13* +X003625Y001625D03* +D14* +X005251Y006992D03* +X005999Y006992D03* +X005625Y007858D03* +D15* +X003976Y007325D03* +X002874Y007325D03* +D16* +X009564Y003217D03* +X009564Y002233D03* +D17* +X010125Y008625D03* +D18* +X010125Y008025D03* +M02* diff --git a/testdata/proj1.xln b/testdata/proj1.xln new file mode 100644 index 0000000..743e298 --- /dev/null +++ b/testdata/proj1.xln @@ -0,0 +1,20 @@ +% +M48 +M72 +T01C0.0240 +T02C0.0400 +T03C0.0520 +% +T01 +X5625Y5625 +X10125Y8025 +X10125Y8625 +T02 +X9564Y3217 +X9564Y2233 +T03 +X1625Y1625 +X3625Y1625 +X1625Y5625 +X8225Y5925 +M30