Index: pcb-plugins_sources/AUTHORS.plug-ins =================================================================== --- pcb-plugins_sources/AUTHORS.plug-ins (nonexistent) +++ pcb-plugins_sources/AUTHORS.plug-ins (revision 3870) @@ -0,0 +1,108 @@ +Authors. + +autocrop.c by Ben Jackson to be found at: + + http://www.gedasymbols.org/user/ben_jackson/ + + +boardflip.c by DJ Delorie to be found at: + + http://www.delorie.com/pcb/boardflip.c + + +distalign.c by Ben Jackson to be found at: + + http://www.gedasymbols.org/user/ben_jackson/ + + +distaligntext.c by Dan White + + https://github.com/etihwnad/pcb-plugins.git + + +elementupdate.c by Dan White + + https://github.com/etihwnad/pcb-plugins.git + + +findrat.c by DJ Delorie to be found at: + + http://www.delorie.com/pcb/findrat.c + + +smartdisperse.c by Ben Jackson to be found at: + + http://www.gedasymbols.org/user/ben_jackson/ + + +jostle.c by Ben Jackson to be found at: + + http://www.gedasymbols.org/user/ben_jackson/ + + +renumberblock.c by DJ Delorie to be found at: + + http://www.delorie.com/pcb/renumberblock.c + + +teardrops.c by DJ Delorie to be found at: + + http://www.delorie.com/pcb/teardrops.c + + +footprint-update by Dean Ferreyra to be found at: + + http://www.bourbonstreetsoftware.com/PCBFootprintUpdatePlugIn.html + + +lockelements.c by Bert Timmerman to be found at: + + http://www.xs4all.nl/~ljh4timm/downloads/lockelements.c + + +sedrename.c by Peter Clifton to be found at: + + http://www.seul.org/pipermail/geda-dev/attachments/20080610/54d04853/attachment.c + + +ratsel by Endre Bak to be found at: + + http://ratsel.googlecode.com/files/RatSel.tar.bz2 + + +upth2pth.c by Bert Timmerman to be found at: + + http://www.xs4all.nl/~ljh4timm/downloads/upth2pth.c + + +findelement.c by Bert Timmerman to be found at: + + http://www.xs4all.nl/~ljh4timm/downloads/findelement.c + + +join-found.c by Peter Clifton to be found at: + + http://www.seul.org/pipermail/geda-user/attachments/20091026/d4366a3a/attachment.c + + +polystitch.c by DJ Delorie to be found at: + + http://www.delorie.com/pcb/polystitch.c + + +polycombine.c by Peter Clifton to be found at: + + http://www.seul.org/pipermail/geda-user/attachments/20100607/5c480e51/attachment-0001.c + + + +Contributions and / or bug patches by: + +Bert Timmerman + +Dan White + +Eugene Mikhantiev + +# EOF # + Index: pcb-plugins_sources/ChangeLog =================================================================== --- pcb-plugins_sources/ChangeLog (nonexistent) +++ pcb-plugins_sources/ChangeLog (revision 3870) @@ -0,0 +1,1128 @@ +commit f04f3c79a36bf160ec1b7374ccc3864a2007e47e +Author: Bert Timmerman +Date: Wed Nov 28 07:56:33 2012 +0100 + + Ignore more stuff. + + Signed-off-by: Bert Timmerman + +commit c8c03dd23d0ff4c3a5b9bba73b25968bb519a028 +Author: Bert Timmerman +Date: Wed Nov 28 07:52:54 2012 +0100 + + A README file is required. + + Signed-off-by: Bert Timmerman + +commit 66015d58e2b0a125c42f358c9d36b759c6702928 +Author: Bert Timmerman +Date: Wed Nov 28 07:51:33 2012 +0100 + + Added some file for building with autotools. + + Signed-off-by: Bert Timmerman + +commit 5b78dce2fc71290c40b780f0c3a9460d8b5dbbfb +Author: Bert Timmerman +Date: Wed Nov 28 00:24:40 2012 +0100 + + footprint-update: uninstall footprintupdate.so. + + Signed-off-by: Bert Timmerman + +commit ed2bef70fb6b57f7aa19aae1f3d65f378910cfd0 +Author: Bert Timmerman +Date: Tue Nov 27 23:51:42 2012 +0100 + + ratsel: corrections in Makefile. + + Signed-off-by: Bert Timmerman + +commit e4deab9acd16a0abd9a4cf400fd961892ef709e5 +Author: Bert Timmerman +Date: Tue Nov 27 07:53:40 2012 +0100 + + Added contributions and bug patches section to the + AUTHORS.PLUGINS file. + + Signed-off-by: Bert Timmerman + +commit aa6d8c52446187f61f83e85e542a1aac1d1533da +Author: Bert Timmerman +Date: Tue Nov 27 07:51:12 2012 +0100 + + Correction on tabbed white space. + + Signed-off-by: Bert Timmerman + +commit dbfe4752ba99e3abcb168af61292e830c1d0cee4 +Author: Bert Timmerman +Date: Sun Nov 25 23:25:33 2012 +0100 + + footprint-update: ignore stuff. + + Signed-off-by: Bert Timmerman + +commit 9d9284e750649bf4f8db9ec4ce6fdd3889a99001 +Author: Bert Timmerman +Date: Sun Nov 25 23:21:49 2012 +0100 + + footprint-update: make errors go away. + + Signed-off-by: Bert Timmerman + +commit 76adf7dcad511451c2ba8cf800850fe3ef909a3b +Author: Eugene Mikhantiev +Date: Sun Nov 25 01:22:32 2012 +0700 + + Add hid_draw.h to jostle.c + + In upstream pcb commit dc0092500ad8b6a3c9c35aef63eda9ad1cb2a2cb HID drawing API + was moved to separate file `hid_draw.h', so it must be included. + + Signed-off-by: Bert Timmerman + +commit 5143f3731cf3bf68595a22e0f8226635ad49d651 +Author: Bert Timmerman +Date: Mon Nov 19 21:28:17 2012 +0100 + + ratsel: correction of RatType pointer syntax. + + Signed-off-by: Bert Timmerman + +commit d7928db51666803214ee995f2e97a13488236c47 +Author: Eugene Mikhantiev +Date: Sat Nov 17 15:56:31 2012 +0700 + + Fix that makes jostle plugin works with new PCB HID API + + PCB HID API changed in upstream PCB in commit 73b243d90cda84e09f52b7ff995fa82afdc3de0 + + Signed-off-by: Bert Timmerman + +commit 460e3c04d9d4e74de198ff7afa40f15667746644 +Author: Bert Timmerman +Date: Sun Jun 10 14:10:11 2012 +0200 + + README.plugins: updated. + + Signed-off-by: Bert Timmerman + +commit 1ed8246c9799ee6274ecf886b050f4e8bf69c2a6 +Author: Bert Timmerman +Date: Sun Jun 10 13:56:52 2012 +0200 + + Added credits for the distaligntext and elementupdate plugins by Dan White. + + Signed-off-by: Bert Timmerman + +commit d3c6bb5d8682436542fc9c4564daca90c5acfc92 +Author: Dan White +Date: Fri Mar 16 15:05:41 2012 -0500 + + distaligntext: fix plugin registration + + Signed-off-by: Bert Timmerman + +commit 2039406f0cb0c328a5729e32ad9437f0983bb55d +Author: Dan White +Date: Wed Mar 7 11:54:22 2012 -0600 + + Remove warnings + + Signed-off-by: Bert Timmerman + +commit 0dcdeab167c66847fc5c17aad6eb605c4a5cced6 +Author: Dan White +Date: Wed Mar 7 11:52:58 2012 -0600 + + new plugin: ElementUpdate(Selected|All) + + For the indicated elements, reloads the placed footprint from the + currently-loaded footprint library. See the source for a note on how to avoid + restarting PCB to reload the library. + + Signed-off-by: Bert Timmerman + +commit de455bf9b23b9fe3ffb398f6e767ec0e7641bb41 +Author: Dan White +Date: Wed Mar 7 00:17:20 2012 -0600 + + distaligntext plugin + + Functionally equivalent to distalign.c but works for selected, visible text. + Of note is the missing Mark alignment, as PCB text objects do not have a mark + different from the bounding box. + + Signed-off-by: Bert Timmerman + +commit 87f2b2ae28a5a7812ccbb169847a87f210154300 +Author: Dan White +Date: Tue Mar 6 23:01:36 2012 -0600 + + distalign: cleanup, no warnings + + Signed-off-by: Bert Timmerman + +commit 0eb9a05a159f9c764530d118cbdc71e451bc41bc +Author: Bert Timmerman +Date: Wed Jan 25 00:39:14 2012 +0100 + + Added some logo artwork. + + Signed-off-by: Bert Timmerman + +commit 3b7b5de10a08506678581ba72e059298ae0004bc +Author: Bert Timmerman +Date: Tue Jan 24 22:28:22 2012 +0100 + + teardrops: Corrections due to the removal of *TypePtr aliasses. + + Signed-off-by: Bert Timmerman + +commit 36eb7df91a9c7f6136f9fd7fc82201064f8324a9 +Author: Bert Timmerman +Date: Tue Jan 24 22:28:01 2012 +0100 + + smartdisperse: Corrections due to the removal of *TypePtr aliasses. + + Signed-off-by: Bert Timmerman + +commit f4ea47b14e136c99a81914e8e878ba558c547a02 +Author: Bert Timmerman +Date: Tue Jan 24 22:27:29 2012 +0100 + + polystitch: Corrections due to the removal of *TypePtr aliasses. + + Signed-off-by: Bert Timmerman + +commit 8971f4fcb61b6b0d3c9b6e07d9a84915a465fd18 +Author: Bert Timmerman +Date: Tue Jan 24 22:27:06 2012 +0100 + + jostle: Corrections due to the removal of *TypePtr aliasses. + + Signed-off-by: Bert Timmerman + +commit 115804a436f5aebea83e758b7e51bdaaa36d9d6e +Author: Bert Timmerman +Date: Tue Jan 24 22:26:29 2012 +0100 + + distalign: Corrections due to the removal of *TypePtr aliasses. + + Signed-off-by: Bert Timmerman + +commit 241c021f3a5338b2f4685ac85644c8399bb3051f +Author: Bert Timmerman +Date: Tue Jan 24 22:25:49 2012 +0100 + + autocrop: Corrections due to the removal of *TypePtr aliasses. + + Signed-off-by: Bert Timmerman + +commit 8bb143ee3d0ead900086d9f4a18e0b4428208db8 +Author: Bert Timmerman +Date: Sun Nov 27 11:04:26 2011 +0100 + + ratsel: create an "all" target for make. + +commit d49dd93a018f27bd4a972215cb49a144c19ed6dd +Author: Bert Timmerman +Date: Sun Nov 27 10:12:19 2011 +0100 + + New import of ratsel source code files. + +commit 4069cf943f43d10f0eb64215ecccc7f900160ce7 +Author: Bert Timmerman +Date: Sat Nov 26 20:55:25 2011 +0100 + + Moved the footprint-update plugin and documentation to a more correct location. + +commit 3366dc9edd9a45daec02244c5fa0c66f15e1c8dc +Author: Bert Timmerman +Date: Sat Nov 26 20:12:38 2011 +0100 + + Moved the ratsel plugin and documentation to a more correct location. + +commit 48cee031d6fa632ff35f4223f21331fdaabd0644 +Author: Bert Timmerman +Date: Sat Nov 26 19:33:34 2011 +0100 + + Added a make rule for ghellopcb. + +commit ad8107e685792d43df6476866b2c97a9c9f5ff42 +Author: Bert Timmerman +Date: Sat Nov 26 19:27:47 2011 +0100 + + Moved plugin sources to src/plugin directory. + +commit e215f403befb4d8962e956c697594c5d55ae02b5 +Author: Bert Timmerman +Date: Sat Nov 26 15:46:35 2011 +0100 + + smartdisperse: included config.h + + Changed LocationType into Coord. + Correction of ElementTypePtr pointer into GList pointer. + +commit 51ee11ebf84b87a143ba6d84c3c54223a1b635e5 +Author: Bert Timmerman +Date: Thu Nov 24 07:33:49 2011 +0100 + + jostle: included config.h + + Changed LocationType into Coord. + Use pcb_fprintf(), was fprintf(). + +commit b125b68efabc9d72a4a06a3d8e34c9d9c2ec1afe +Author: Bert Timmerman +Date: Wed Nov 23 22:57:29 2011 +0100 + + distalign: included config.h + + Changed LocationType into Coord. + +commit cac72f89c233d96702bbdda7368bdfe1b5976217 +Author: Bert Timmerman +Date: Wed Nov 23 22:46:12 2011 +0100 + + autocrop: included config.h + + Changed LocationType into Coord. + +commit 4066155e57fdc647375ec36643de9c4795671ed1 +Author: Bert Timmerman +Date: Wed Nov 23 07:38:11 2011 +0100 + + upth2pth: included config.h + +commit 89ccea411460a0de6637abe42964fc4254c8fc97 +Author: Bert Timmerman +Date: Wed Nov 23 07:35:33 2011 +0100 + + teardrops: included config.h + +commit 55ff6ecd518e1d7fce023745fed11b2242268795 +Author: Bert Timmerman +Date: Tue Nov 22 23:09:43 2011 +0100 + + sedrename: included config.h + +commit bf2b77635a3c9672872df5bf7eb27781b10e4142 +Author: Bert Timmerman +Date: Tue Nov 22 23:09:18 2011 +0100 + + renumberblock: included config.h + +commit 4b4eb02e90ab3025de01318f3902fcba9d117b0f +Author: Bert Timmerman +Date: Tue Nov 22 23:08:50 2011 +0100 + + polystitch: included config.h + +commit 4d7adade7661674927d26d48a58dfd1ef2deb3c9 +Author: Bert Timmerman +Date: Tue Nov 22 23:08:26 2011 +0100 + + polycombine: included config.h + +commit b5e446389c1fbebdae71b7f7f3b4acd52609067b +Author: Bert Timmerman +Date: Tue Nov 22 23:07:52 2011 +0100 + + lockelements: included config.h + +commit 90797d6d0c491b347cce69213e03118e6a644dc4 +Author: Bert Timmerman +Date: Tue Nov 22 22:58:30 2011 +0100 + + findelement: included config.h + +commit 3825b60f93627b192dd1876f5d4181c00a3b239e +Author: Bert Timmerman +Date: Tue Nov 22 22:57:53 2011 +0100 + + join-found: included config.h + +commit 584cff2825852024e960ad81778e9e22dd3130d6 +Author: Bert Timmerman +Date: Tue Nov 22 22:57:10 2011 +0100 + + boardflip: included config.h + +commit 31656c4ffe391ed2c6ebe8c28c84759e480cfe02 +Author: Bert Timmerman +Date: Tue Nov 22 22:56:29 2011 +0100 + + findrat: included config.h + +commit d69991d412dd7069b7a2acdf5435df21d25474a6 +Author: Bert Timmerman +Date: Sat May 28 21:13:39 2011 +0200 + + Removed the unused variable in the call to DrawPolygon(). + +commit 12b4d4c4f6ff3777ad768bed4c1029fab883c54b +Author: Bert Timmerman +Date: Sat May 28 16:56:55 2011 +0200 + + Use Redraw() instead of ClearAndRedrawOutput(), initialize a uninitialized variable. + +commit 9a712caccb6bdabf66a2ff1ef8084ce61f73045d +Author: Bert Timmerman +Date: Sat May 28 13:47:51 2011 +0200 + + Use Redraw() instead of ClearAndRedrawOutput() which is now obsolete. + +commit 01a07fda052b09a39e9edd6527411da1c210c476 +Author: Bert Timmerman +Date: Sat May 28 13:46:44 2011 +0200 + + Use Redraw() instead of ClearAndRedrawOutput() which is now obsolete. + +commit 3f6039b7535172c3a59b61e46f7ff056875ad247 +Author: Bert Timmerman +Date: Sat May 28 13:44:46 2011 +0200 + + Added `pkg-config --cflags glib-2.0` in CFLAGS. + + Due to the recently added glib dependency in the pcb sources + we now need to compile with this flag. + +commit 005377eeb1d2426223646f41167adf5e8ee47b13 +Author: Bert Timmerman +Date: Sat Feb 26 08:36:21 2011 +0100 + + Smartdisperse: in pcb MyCalloc() was changed to calloc(). + +commit c56ed18158634063175231afbf17d0b0ed3a2821 +Author: Bert Timmerman +Date: Fri Feb 25 18:37:03 2011 +0100 + + Distalign: changes MyMalloc() to malloc() and MYFREE() to free(). + +commit 0fcac70de97768c77853266cb8cee5c1b4db7b96 +Author: Bert Timmerman +Date: Fri Feb 25 18:19:42 2011 +0100 + + Boardflip: in pcb max_layer is changed into max_copper_layer. + +commit c8cf850f2476bdcb85634fef44f38e5eaca989aa +Author: Bert Timmerman +Date: Fri Feb 25 18:11:40 2011 +0100 + + Teardrops: in pcb max_layer is changed into max_copper_layer. + +commit d4850d8ce308f474467b0482998125c77bf2b4db +Author: Bert Timmerman +Date: Sat Aug 7 06:08:28 2010 -0700 + + Added a link to the developer documentation. + +commit 4a531054d4df3ab272df4ed2b7074dcad1596d2c +Author: Bert Timmerman +Date: Thu Aug 5 22:04:50 2010 +0200 + + Added a visual separation. + +commit f00fd98ac006751a56a3f7881c445ad42339f40a +Author: Bert Timmerman +Date: Thu Aug 5 21:57:26 2010 +0200 + + Moved the pcb logo to a better place. + +commit 8437435417abc37ac435fd94e3aa8d54f16bfb1e +Author: Bert Timmerman +Date: Thu Aug 5 21:53:39 2010 +0200 + + Updated the generation of doxygen generated developer documentation. + +commit 4b574a312d5a4842f6f69762bff57cd5920c65e9 +Author: Bert Timmerman +Date: Thu Aug 5 21:51:57 2010 +0200 + + Added a logo for pcb-plugins. + +commit 340641cefaa516ae29c5a615b570c8e48e86df8b +Author: Bert Timmerman +Date: Tue Jun 8 16:54:38 2010 +0200 + + Changed "True" into "true". + +commit fa8a5cee3435400c0e10fd8e85ef5821a746fddb +Author: Bert Timmerman +Date: Tue Jun 8 07:27:12 2010 +0200 + + Added the join-found target. + +commit fd0cb638822df5e9261ae7565b8217874f86d399 +Author: Bert Timmerman +Date: Tue Jun 8 07:17:58 2010 +0200 + + Cleared all warnings during compiling. + +commit 45f6ec75dc717821467d4a59145f7095401b3370 +Author: Bert Timmerman +Date: Mon Jun 7 20:58:46 2010 +0200 + + Changed "True" into "true". + +commit de630703afe7d2055d6482c9a5049d853d26c605 +Author: Bert Timmerman +Date: Mon Jun 7 20:58:12 2010 +0200 + + Changed "Boolean" into "bool" and "True" into "true". + +commit 3ca9192d90a4c4ddb79ec06fd1e40eb00a92f0be +Author: Bert Timmerman +Date: Mon Jun 7 20:46:34 2010 +0200 + + A tab character was lost (and found). + +commit 4ff9544ba1185309b51f7afd49f00a9e4abeb32b +Author: lambert +Date: Mon Jun 7 08:09:31 2010 +0200 + + Added the polycombine target. + +commit 3a8d1d1eff182e9d1247d2a348941e49941ce349 +Author: lambert +Date: Mon Jun 7 07:58:34 2010 +0200 + + Added the polycombine plug-in by Peter Clifton. + +commit 37acca0bf6628985f6f6585b8affea7981ba93ea +Author: Bert Timmerman +Date: Mon May 31 19:25:02 2010 +0200 + + Cleared all warnings during compilation. + +commit f909bfd743ecb1a6aa59b36d90e69347d874d1ba +Author: Bert Timmerman +Date: Mon May 31 19:05:54 2010 +0200 + + Updated the Changelog.plug-ins. + +commit c1dc98b93c122db3da6201b78e07bd02c48eac6b +Merge: 77d9d3a c674087 +Author: Bert Timmerman +Date: Mon May 31 18:53:07 2010 +0200 + + Merge branch 'master' of git://github.com/bert/pcb-plugins + +commit c6740879bdf50b21d175f32eb6f40b498caef02d +Author: Lambert J.H. Timmerman +Date: Mon May 31 18:46:55 2010 +0200 + + Added the polystitch plug-in to the list. + +commit 77d9d3a6b353d0c3392a8d1c828ebd7cdb7fa0ab +Merge: 4886da7 2249d9e +Author: Bert Timmerman +Date: Mon May 31 15:08:09 2010 +0200 + + Merge branch 'master' of git://github.com/bert/pcb-plugins + +commit 2249d9e551121f8c355dd93f7917ac8df6807dc1 +Author: Lambert J.H. Timmerman +Date: Mon May 31 08:27:12 2010 +0200 + + Added information regarding the lighthouse issue tracker for pcb-plugins. + +commit 82af773fb4e360fd6d39d2ce1263a82a6305a191 +Author: Lambert J.H. Timmerman +Date: Mon May 31 07:48:52 2010 +0200 + + Added the polystitch target in the Makefile. + +commit 3b3fe237eab2056dd330ef86dcfba3a8737c6f64 +Author: Lambert J.H. Timmerman +Date: Mon May 31 07:32:09 2010 +0200 + + Added the PolyStitch plug-in by DJ Delorie. + +commit 4886da782e1f18c7abcbf40ffcbf6c605a3d5d9d +Author: lambert +Date: Sat Mar 20 13:36:09 2010 +0100 + + OK, let's give in to windoze and let have it's way with CRLFs. + +commit 41d9a872b5333532e5ba9f030140c50089d9c9f5 +Merge: f6bab9d fbdffc7 +Author: Lambert J.H. Timmerman +Date: Sun Mar 14 18:10:01 2010 +0100 + + Merge branch 'master' of git@github.com:bert/pcb-plugins + +commit fbdffc7fc003af03d5ea9df4f51a237de0eeb79e +Author: bert +Date: Sat Jan 2 09:03:46 2010 -0700 + + More verbosity on compiling and (un)installing plug-ins. + +commit 17755b26330a0a595dfdde0800a5e32b1a3721fa +Author: Bert Timmerman +Date: Sun Nov 22 19:22:24 2009 +0100 + + Cleared all warnings during compiling. + +commit 9b2c64cf534f07200c6bb65d8f2d653b80dae003 +Author: Bert Timmerman +Date: Sun Nov 22 19:17:37 2009 +0100 + + Cleared all warnings during compiling. + +commit 442f5a82db1f1ae1edb68440e6bf52fe8c1aa39f +Author: Bert Timmerman +Date: Sun Nov 22 18:57:34 2009 +0100 + + Cleared all but one warnings during compiling. + +commit 7441cee5be7ceba4d2c674d0a9d39f8c76cd9b2d +Author: Bert Timmerman +Date: Sun Nov 22 18:42:37 2009 +0100 + + Cleared all warnings during compiling. + +commit 0c4c153bd86cb0179b22391a0c8ebdcc9b1941c2 +Author: Bert Timmerman +Date: Sun Nov 22 18:34:47 2009 +0100 + + Cleared all warnings during compiling. + +commit 7f05cc16a96178f1d7147c8ecbe0c0ae939cc46e +Author: Bert Timmerman +Date: Sun Nov 22 18:25:33 2009 +0100 + + Cleared all warnings during compiling. + +commit 1c13fa77ebc5f7257d7061da0b9dbf9e2b4fb661 +Author: Bert Timmerman +Date: Sun Nov 22 18:23:22 2009 +0100 + + Cleared all warnings during compiling. + + Added abbreviated calls "LE" and "UE" for locking + and unlocking of elements. + +commit e42dbc48bfb2755af4548ba20742f2e6d07881ec +Author: Bert Timmerman +Date: Sun Nov 22 12:41:14 2009 +0100 + + Added "make uninstall" target. + +commit f45e02d0006da12f0744fbd9cff6bd5f50053bf1 +Author: Bert Timmerman +Date: Sun Nov 22 09:44:23 2009 +0100 + + Update on the README file. + +commit 3ef110ba3ec428c67111f19ece4de89d51b5f418 +Author: Bert Timmerman +Date: Sun Nov 22 08:34:21 2009 +0100 + + Changed the level of pcb and pcb-plugins directories. + + It is assumed that both source trees have an equal level. + For instance: + pcb-plugins + |-- doc + | |-- doxygen + | | `-- html + | |-- email + | |-- footprint-update + | `-- teardrops + `-- src + |-- dxf + | |-- doc + | | |-- html + | | `-- latex + | `-- template + |-- footprint-update + `-- ratsel + |-- doc + |-- src + | `-- ratsel + `-- utst + `-- ratsel + pcb + |-- README_FILES + |-- autom4te.cache + |-- data + |-- doc + | |-- gs + | `-- ideas + |-- example + | `-- libraries + |-- intl + |-- lib + | `-- pcblib-newlib + | |-- amp + | |-- amphenol + | |-- bourns + | |-- candk + | |-- connector + | |-- crystal + | |-- cts + | |-- geda + | |-- generic + | |-- gtag + | |-- johnstech + | |-- minicircuits + | |-- nichicon + | |-- optek + | |-- optical + | |-- panasonic + | `-- pci + |-- m4 + |-- newlib + | |-- 2_pin_thru-hole_packages + | |-- connectors + | |-- crystal + | |-- electro-optics + | |-- headers + | |-- keystone + | |-- msp430 + | |-- not_vetted_ingo + | |-- sockets + | `-- tests + |-- po + |-- src + | |-- gts + | |-- hid + | | |-- batch + | | |-- bom + | | |-- common + | | |-- gerber + | | |-- gtk + | | |-- lesstif + | | |-- lpr + | | |-- nelma + | | |-- png + | | `-- ps + | `-- icons + |-- tests + | |-- golden + | | |-- hid_bom1 + | | |-- hid_bom2 + | | |-- hid_bom3 + | | |-- hid_bom4 + | | |-- hid_gerber1 + | | |-- hid_gerber2 + | | `-- hid_png1 + | `-- inputs + |-- tools + |-- tutorial + |-- utils + `-- win32 + +commit d6dbfad9ee265bb0cb02dd8345d81a25e0c16b9c +Author: Bert Timmerman +Date: Mon Oct 26 16:35:51 2009 +0100 + + Added the join-found plug-in. + +commit 5babd08d9a9cf79d263a3993b2c9cbaab239821c +Author: Bert Timmerman +Date: Sat Jul 25 16:58:39 2009 +0200 + + Added whitespace for better reading. + +commit 175b5a64d32d6c783405152b88d1727f241f6821 +Author: Bert Timmerman +Date: Sat Jul 25 16:56:43 2009 +0200 + + Removed rule for ghellopcb. + + Since the ghellopcb plug-in depends on gtk and glib it does not fit + in with the other plug-ins, I think it is better to move it to a separate dir. + +commit bd5c69bea78988632d3bd7b5b84f789338b56136 +Author: Bert Timmerman +Date: Sat Jul 25 15:40:02 2009 +0200 + + Remove the toporouter since it is now part of the official pcb repository. + +commit 4d76d864b361ef3b8d20035ae8b03d602d3e9824 +Author: Bert Timmerman +Date: Sat Jul 25 11:45:47 2009 +0200 + + Patch for OSX compatibility. + + Patch by Steven Michalske. + +commit f06e7589122c577d58488d1b824907095726b117 +Author: Bert Timmerman +Date: Sat Jul 25 11:45:10 2009 +0200 + + Patch for OSX compatibility. + + Patch by Steven Michalske. + +commit 097eee34a9a4562982b896f1a30561f8a0da2f08 +Author: Bert Timmerman +Date: Sat Jul 25 10:27:04 2009 +0200 + + make by default, all plugins and make the plugin dir if needed. + + Patch by Steven Michalske + +commit 2946d9118fa22ecfe012b1f90593aa50cc447a4a +Author: Bert Timmerman +Date: Sun Mar 15 16:08:10 2009 +0100 + + Removed version number. + +commit 1720b362ce83639d4496725fc281520431d8c86d +Author: Bert Timmerman +Date: Fri Mar 13 23:25:09 2009 +0100 + + Minor changes in comments. + +commit 42933a4d30832fb1367fab338bdbe98d47845143 +Author: Bert Timmerman +Date: Wed Feb 18 17:02:09 2009 +0100 + + Correction of a typo and doxygenation of a comment. + +commit da3e036006a10fab6782618053715efa83557fa7 +Author: Bert Timmerman +Date: Wed Feb 18 15:52:22 2009 +0100 + + Added a rule to compile the GTK Hello PCB World plug-in. + +commit e878da3820ee6f0975622f8e9fe33a96915bd7fd +Author: Bert Timmerman +Date: Wed Feb 18 15:51:40 2009 +0100 + + Added a GTK based plug-in showing a "Hello PCB World" dialog. + + Just to see if this is possible I wrote this plug-in to launch + a GTK dialog from within pcb. + It contains a single label and a destroy callback to close the dialog. + +commit 88d7c1bf4b5434f4a15c00c3b598011c31db0239 +Author: Bert Timmerman +Date: Tue Feb 17 08:03:31 2009 +0100 + + Added the FindElement plug-in to the list. + +commit de1f0488515d5ea43a14af72ababef7f5818d1f8 +Author: Bert Timmerman +Date: Tue Feb 17 08:00:49 2009 +0100 + + Added findelement plug-in. + +commit 4e7581c7f84a030a4ee05d5e779f8a52dae6f403 +Author: lambert +Date: Sun Feb 15 18:15:38 2009 +0100 + + Updated with comments by DJ Delorie. + +commit 76a7d4798df31f8c4f100ff7cac184e14eda4f05 +Author: Bert Timmerman +Date: Wed Jan 21 22:33:18 2009 +0100 + + Added code for the upth2pth plug-in. + +commit fa0a502995bf8663f78a1e06290210de133ba4b2 +Author: Bert Timmerman +Date: Wed Jan 21 21:55:07 2009 +0100 + + Added upth2pth plug-in. + +commit 48ac3e6ef67f7be419e252630c864b8bec788c8a +Author: Bert Timmerman +Date: Wed Jan 21 20:46:13 2009 +0100 + + Added upth2pth target. + +commit 1ab60c5863d1b20da84d18d1d392297a23bd0ce8 +Author: Bert Timmerman +Date: Tue Jan 20 10:54:09 2009 +0100 + + Added toporouter documentation. + +commit d0b2fbe6fbb00314fa3e5e3b2d036046970541cb +Author: Bert Timmerman +Date: Sun Jan 4 10:07:56 2009 +0100 + + Correction on target names in target "all". + +commit 7eb61a5c5a4686cc3c940c55bf6943cd5034154d +Author: Bert Timmerman +Date: Sat Jan 3 22:44:20 2009 +0100 + + Added framework for Doxygen documentation. + +commit f1dcf899cc716c8346e8ad2b40704c891b8144c7 +Author: Bert Timmerman +Date: Sat Jan 3 19:52:24 2009 +0100 + + Added a makefile to compile single source files against the pcb source tree. + +commit 1fbe3758eb17f38f280a77cd44c2f73e44982b36 +Author: Bert Timmerman +Date: Fri Jan 2 21:23:11 2009 +0100 + + Added toporouter sources. + +commit 53e12b744af567b8bee9f443775d6c096ab6f178 +Author: Bert Timmerman +Date: Fri Jan 2 21:16:20 2009 +0100 + + Added .gitignore files. + +commit 143f0f56cb184c1f1378b692cd2233a841957a7c +Author: Bert Timmerman +Date: Fri Jan 2 10:41:41 2009 +0100 + + Changed the location of PCB source tree. + +commit d628ffa9b45b3ac5328774ebcf5e72c6d063ebca +Author: Bert Timmerman +Date: Fri Jan 2 10:14:59 2009 +0100 + + Changed the location of PCB source tree. + +commit 14186a8d43958d05554b9f5c89d3cbe2785dbfac +Author: Bert Timmerman +Date: Sun Nov 9 13:05:58 2008 +0100 + + Updated the AUTHORS file. + +commit c1a109f4e0e2abadac7f093438247f8a257bf607 +Author: Bert Timmerman +Date: Sun Nov 9 11:30:00 2008 +0100 + + Added ratsel plugin by Endre Bak. + +commit f6bab9d5502fa773bc1590e98b43b029bac4f527 +Author: Lambert J.H. Timmerman +Date: Thu Sep 18 20:15:19 2008 +0200 + + Added a ChangeLog. + +commit 2cfb20d3e5b96888e60dd183bdd74aba093874c6 +Author: Lambert J.H. Timmerman +Date: Thu Sep 18 19:48:03 2008 +0200 + + RenumberBuffer() added by DJ Delorie. + +commit 08200a544f540814695758c4c604a92cc9ebf979 +Author: Bert Timmerman +Date: Sat Jun 28 09:40:02 2008 +0200 + + Bug fix in src/boardflip.c by DJ Delorie. + + I just fixed a bug in my boardflip plugin where before the silk lines + and arcs wouldn't be flipped. So, if you're using boardflip, you + might want to get a fresh copy. + +commit dafe6ae6b2554a4e2a64b33fefde125133a001ef +Author: Bert Timmerman +Date: Thu Jun 26 00:25:28 2008 +0200 + + Correction on doxygen documentation in src/lockelements.c + +commit 58a5b49048e924f2643cb85afd0ed2c8c4eb1085 +Author: Bert Timmerman +Date: Wed Jun 25 23:25:58 2008 +0200 + + Added documentation about lockelements.c + +commit fe7702b45bd6fa83a9627270a23d500f7abf1103 +Author: Bert Timmerman +Date: Wed Jun 25 23:03:53 2008 +0200 + + Dropped UnlockElements(Selected) option in src/lockelements.c + + When locking a selection of elements, it is not easy to unselect the + selection since those elements and their pins/pads/elementlines/elementarcs + are now locked ;) + This may be thought of as understandable at first, + but may also be considered to be a bug in pcb. + +commit 1e49a8f13f64735431695891257607512141cc49 +Author: Bert Timmerman +Date: Tue Jun 24 21:59:55 2008 +0200 + + Initializing variable seems to squash some unwanted behaviour in src/lockelements.c + +commit 9c0d3dd2bfc29901887ef0a5471d2f3d69d3bf3d +Author: Bert Timmerman +Date: Sat Jun 14 13:47:23 2008 +0200 + + Tried to solve a bug in src/lockelements.c + + When locking a selection of elements, it is not easy to unselect the + selection since those elements and their pins/pads/elementlines/elementarcs + are now locked ;-) + This appears to be a bug in pcb. + A possible workaround would be to clear the selected flag of the + locked element at the same instance the lock flag was set. + This needs some further tweaking. + + GUI is updated when leaving the command dialog. + +commit bfd5356ef4eb42d3815a90590b35d29dd4966539 +Author: Bert Timmerman +Date: Sat Jun 14 12:40:37 2008 +0200 + + Updated AUTHORS.plug-ins file. + +commit 620bc1e33077bede93ce2b3eea40b21abc48af5b +Author: Bert Timmerman +Date: Sat Jun 14 12:19:54 2008 +0200 + + Added doc/sedrename.txt + +commit 1f698ce29ee3cd316e7a964e01d3dfe79ef4d6e8 +Author: Bert Timmerman +Date: Sat Jun 14 12:15:35 2008 +0200 + + Added src/sedrename.c + +commit 1449fa7650fb16076ef1470404f6c50a76396408 +Author: Bert Timmerman +Date: Sat Jun 14 12:14:06 2008 +0200 + + Updated AUTHORS.plug-ins file. + +commit de65aafaea2dc561a01b74f90d5e8903ebe72f8a +Author: Bert Timmerman +Date: Sat Jun 14 10:23:29 2008 +0200 + + Added src/lockelements.c + +commit e3e505bce5f19ae0959ba35fb2bd8a5ef808f978 +Author: Bert Timmerman +Date: Wed May 28 22:46:17 2008 +0200 + + Updated boardflip.c with the latest version. + +commit 0062c19b64a835b6888728717974373c2c48cb4e +Author: Bert Timmerman +Date: Wed May 28 06:39:32 2008 +0200 + + Renamed CONTRIB.plug-ins -> AUTHORS.plug-ins as this name better reflects the content of the file. + +commit ad57a5de493b9cb888f403b1d35d1bd0cf3d4c63 +Author: Bert Timmerman +Date: Sun May 25 23:28:15 2008 +0200 + + Added documentation about smartdisperse.c + +commit 25398fbe630a8d3b0a279809f4d27a0a49aee084 +Author: Bert Timmerman +Date: Sun May 25 23:27:44 2008 +0200 + + Added documentation about distalign.c + +commit 8978a3c7e16a35693f01492f4ef4841c0f798685 +Author: Bert Timmerman +Date: Sun May 25 23:26:56 2008 +0200 + + Added documentation about autocrop.c + +commit 438e7031c572df2cc5439da2cc0cde2b0507dcc6 +Author: Bert Timmerman +Date: Sun May 25 23:26:16 2008 +0200 + + Added CONTRIB.plug-ins containing additional information about authors and URLs on where to get updates. + +commit 3eb13df419eccca7e97e22a7114f22ca8b5ab97a +Author: Bert Timmerman +Date: Sun May 25 23:10:41 2008 +0200 + + Updated teardrops.c with the latest version. + +commit a8ec93cfb735863b5f30809e93a854d46067496f +Author: Bert Timmerman +Date: Sun May 25 23:00:36 2008 +0200 + + Updated jostle.c with the latest version. + +commit 3a71f349ff1c7d93bc103bcf3249bce520794c8c +Author: Bert Timmerman +Date: Sun May 25 22:58:02 2008 +0200 + + Updated autocrop.c with the latest version. + +commit 21425b9b70c9869e46825feeff76ae329afb1fd4 +Author: Bert Timmerman +Date: Sun May 25 13:20:15 2008 +0200 + + Renamed README -> README.plug-ins to avoid future filename clash. + +commit 66486380030954789ab6aa20f3a9d6a15cdcd8d5 +Author: Bert Timmerman +Date: Sun May 25 13:17:56 2008 +0200 + + Added various license texts. + +commit d03ce72f30605a1ca47af830ab0607c26bca22aa +Author: Bert Timmerman +Date: Sun May 25 09:27:17 2008 +0200 + + Corrected a small typo in the README file. + +commit 8bb2051aadf58ffd70fc74b91f3fd3c989fb0b73 +Author: Bert Timmerman +Date: Sun May 25 09:18:56 2008 +0200 + + Added smartdisperse.c + +commit dcf47fc1db87160ea0237378e2ba183d277118cb +Author: Bert Timmerman +Date: Sun May 25 09:18:18 2008 +0200 + + Added renumberblock.c + +commit 31a1788c265a96ed1db3894fa1528e8d073f8d7a +Author: Bert Timmerman +Date: Sun May 25 09:17:40 2008 +0200 + + Added jostle.c + +commit 7be539b9dd9065cbd0e9ef759d0a9fafa750ae52 +Author: Bert Timmerman +Date: Sun May 25 09:17:01 2008 +0200 + + Added footprint-update with additional documentation. + +commit 6b17cf546286248780c004d9226467fe1ebb67a9 +Author: Bert Timmerman +Date: Sun May 25 09:14:59 2008 +0200 + + Added teardrops.c with additional documentation. + +commit ca572adec67986dd2af7994a3242bbdb54cd9025 +Author: Bert Timmerman +Date: Sun May 25 09:13:18 2008 +0200 + + Added findrat.c + +commit f52f959f08679b7b6878f532c4278f377f572f10 +Author: Bert Timmerman +Date: Sun May 25 09:12:39 2008 +0200 + + Added distalign.c + +commit 810df79d91d8a9c97700c65afe3c85dccb7c1785 +Author: Bert Timmerman +Date: Sun May 25 09:12:06 2008 +0200 + + Added boardflip.c + +commit c7a40a2e25d531a19ece7ee294c36dde633ec4c0 +Author: Bert Timmerman +Date: Sun May 25 09:11:26 2008 +0200 + + Added autocrop.c + +commit 823ea456ca81bee4f6f4c69cbf480df003e1bf9e +Author: Bert Timmerman +Date: Sun May 25 08:49:57 2008 +0200 + + Initial commit Index: pcb-plugins_sources/ChangeLog.plug-ins =================================================================== --- pcb-plugins_sources/ChangeLog.plug-ins (nonexistent) +++ pcb-plugins_sources/ChangeLog.plug-ins (revision 3870) @@ -0,0 +1,623 @@ +commit c1dc98b93c122db3da6201b78e07bd02c48eac6b +Merge: 77d9d3a c674087 +Author: Bert Timmerman +Date: Mon May 31 18:53:07 2010 +0200 + + Merge branch 'master' of git://github.com/bert/pcb-plugins + +commit c6740879bdf50b21d175f32eb6f40b498caef02d +Author: Lambert J.H. Timmerman +Date: Mon May 31 18:46:55 2010 +0200 + + Added the polystitch plug-in to the list. + +commit 77d9d3a6b353d0c3392a8d1c828ebd7cdb7fa0ab +Merge: 4886da7 2249d9e +Author: Bert Timmerman +Date: Mon May 31 15:08:09 2010 +0200 + + Merge branch 'master' of git://github.com/bert/pcb-plugins + +commit 2249d9e551121f8c355dd93f7917ac8df6807dc1 +Author: Lambert J.H. Timmerman +Date: Mon May 31 08:27:12 2010 +0200 + + Added information regarding the lighthouse issue tracker for pcb-plugins. + +commit 82af773fb4e360fd6d39d2ce1263a82a6305a191 +Author: Lambert J.H. Timmerman +Date: Mon May 31 07:48:52 2010 +0200 + + Added the polystitch target in the Makefile. + +commit 3b3fe237eab2056dd330ef86dcfba3a8737c6f64 +Author: Lambert J.H. Timmerman +Date: Mon May 31 07:32:09 2010 +0200 + + Added the PolyStitch plug-in by DJ Delorie. + +commit 4886da782e1f18c7abcbf40ffcbf6c605a3d5d9d +Author: lambert +Date: Sat Mar 20 13:36:09 2010 +0100 + + OK, let's give in to windoze and let have it's way with CRLFs. + +commit 41d9a872b5333532e5ba9f030140c50089d9c9f5 +Merge: f6bab9d fbdffc7 +Author: Lambert J.H. Timmerman +Date: Sun Mar 14 18:10:01 2010 +0100 + + Merge branch 'master' of git@github.com:bert/pcb-plugins + +commit fbdffc7fc003af03d5ea9df4f51a237de0eeb79e +Author: bert +Date: Sat Jan 2 09:03:46 2010 -0700 + + More verbosity on compiling and (un)installing plug-ins. + +commit 17755b26330a0a595dfdde0800a5e32b1a3721fa +Author: Bert Timmerman +Date: Sun Nov 22 19:22:24 2009 +0100 + + Cleared all warnings during compiling. + +commit 9b2c64cf534f07200c6bb65d8f2d653b80dae003 +Author: Bert Timmerman +Date: Sun Nov 22 19:17:37 2009 +0100 + + Cleared all warnings during compiling. + +commit 442f5a82db1f1ae1edb68440e6bf52fe8c1aa39f +Author: Bert Timmerman +Date: Sun Nov 22 18:57:34 2009 +0100 + + Cleared all but one warnings during compiling. + +commit 7441cee5be7ceba4d2c674d0a9d39f8c76cd9b2d +Author: Bert Timmerman +Date: Sun Nov 22 18:42:37 2009 +0100 + + Cleared all warnings during compiling. + +commit 0c4c153bd86cb0179b22391a0c8ebdcc9b1941c2 +Author: Bert Timmerman +Date: Sun Nov 22 18:34:47 2009 +0100 + + Cleared all warnings during compiling. + +commit 7f05cc16a96178f1d7147c8ecbe0c0ae939cc46e +Author: Bert Timmerman +Date: Sun Nov 22 18:25:33 2009 +0100 + + Cleared all warnings during compiling. + +commit 1c13fa77ebc5f7257d7061da0b9dbf9e2b4fb661 +Author: Bert Timmerman +Date: Sun Nov 22 18:23:22 2009 +0100 + + Cleared all warnings during compiling. + + Added abbreviated calls "LE" and "UE" for locking + and unlocking of elements. + +commit e42dbc48bfb2755af4548ba20742f2e6d07881ec +Author: Bert Timmerman +Date: Sun Nov 22 12:41:14 2009 +0100 + + Added "make uninstall" target. + +commit f45e02d0006da12f0744fbd9cff6bd5f50053bf1 +Author: Bert Timmerman +Date: Sun Nov 22 09:44:23 2009 +0100 + + Update on the README file. + +commit 3ef110ba3ec428c67111f19ece4de89d51b5f418 +Author: Bert Timmerman +Date: Sun Nov 22 08:34:21 2009 +0100 + + Changed the level of pcb and pcb-plugins directories. + + It is assumed that both source trees have an equal level. + For instance: + pcb-plugins + |-- doc + | |-- doxygen + | | `-- html + | |-- email + | |-- footprint-update + | `-- teardrops + `-- src + |-- dxf + | |-- doc + | | |-- html + | | `-- latex + | `-- template + |-- footprint-update + `-- ratsel + |-- doc + |-- src + | `-- ratsel + `-- utst + `-- ratsel + pcb + |-- README_FILES + |-- autom4te.cache + |-- data + |-- doc + | |-- gs + | `-- ideas + |-- example + | `-- libraries + |-- intl + |-- lib + | `-- pcblib-newlib + | |-- amp + | |-- amphenol + | |-- bourns + | |-- candk + | |-- connector + | |-- crystal + | |-- cts + | |-- geda + | |-- generic + | |-- gtag + | |-- johnstech + | |-- minicircuits + | |-- nichicon + | |-- optek + | |-- optical + | |-- panasonic + | `-- pci + |-- m4 + |-- newlib + | |-- 2_pin_thru-hole_packages + | |-- connectors + | |-- crystal + | |-- electro-optics + | |-- headers + | |-- keystone + | |-- msp430 + | |-- not_vetted_ingo + | |-- sockets + | `-- tests + |-- po + |-- src + | |-- gts + | |-- hid + | | |-- batch + | | |-- bom + | | |-- common + | | |-- gerber + | | |-- gtk + | | |-- lesstif + | | |-- lpr + | | |-- nelma + | | |-- png + | | `-- ps + | `-- icons + |-- tests + | |-- golden + | | |-- hid_bom1 + | | |-- hid_bom2 + | | |-- hid_bom3 + | | |-- hid_bom4 + | | |-- hid_gerber1 + | | |-- hid_gerber2 + | | `-- hid_png1 + | `-- inputs + |-- tools + |-- tutorial + |-- utils + `-- win32 + +commit d6dbfad9ee265bb0cb02dd8345d81a25e0c16b9c +Author: Bert Timmerman +Date: Mon Oct 26 16:35:51 2009 +0100 + + Added the join-found plug-in. + +commit 5babd08d9a9cf79d263a3993b2c9cbaab239821c +Author: Bert Timmerman +Date: Sat Jul 25 16:58:39 2009 +0200 + + Added whitespace for better reading. + +commit 175b5a64d32d6c783405152b88d1727f241f6821 +Author: Bert Timmerman +Date: Sat Jul 25 16:56:43 2009 +0200 + + Removed rule for ghellopcb. + + Since the ghellopcb plug-in depends on gtk and glib it does not fit + in with the other plug-ins, I think it is better to move it to a separate dir. + +commit bd5c69bea78988632d3bd7b5b84f789338b56136 +Author: Bert Timmerman +Date: Sat Jul 25 15:40:02 2009 +0200 + + Remove the toporouter since it is now part of the official pcb repository. + +commit 4d76d864b361ef3b8d20035ae8b03d602d3e9824 +Author: Bert Timmerman +Date: Sat Jul 25 11:45:47 2009 +0200 + + Patch for OSX compatibility. + + Patch by Steven Michalske. + +commit f06e7589122c577d58488d1b824907095726b117 +Author: Bert Timmerman +Date: Sat Jul 25 11:45:10 2009 +0200 + + Patch for OSX compatibility. + + Patch by Steven Michalske. + +commit 097eee34a9a4562982b896f1a30561f8a0da2f08 +Author: Bert Timmerman +Date: Sat Jul 25 10:27:04 2009 +0200 + + make by default, all plugins and make the plugin dir if needed. + + Patch by Steven Michalske + +commit 2946d9118fa22ecfe012b1f90593aa50cc447a4a +Author: Bert Timmerman +Date: Sun Mar 15 16:08:10 2009 +0100 + + Removed version number. + +commit 1720b362ce83639d4496725fc281520431d8c86d +Author: Bert Timmerman +Date: Fri Mar 13 23:25:09 2009 +0100 + + Minor changes in comments. + +commit 42933a4d30832fb1367fab338bdbe98d47845143 +Author: Bert Timmerman +Date: Wed Feb 18 17:02:09 2009 +0100 + + Correction of a typo and doxygenation of a comment. + +commit da3e036006a10fab6782618053715efa83557fa7 +Author: Bert Timmerman +Date: Wed Feb 18 15:52:22 2009 +0100 + + Added a rule to compile the GTK Hello PCB World plug-in. + +commit e878da3820ee6f0975622f8e9fe33a96915bd7fd +Author: Bert Timmerman +Date: Wed Feb 18 15:51:40 2009 +0100 + + Added a GTK based plug-in showing a "Hello PCB World" dialog. + + Just to see if this is possible I wrote this plug-in to launch + a GTK dialog from within pcb. + It contains a single label and a destroy callback to close the dialog. + +commit 88d7c1bf4b5434f4a15c00c3b598011c31db0239 +Author: Bert Timmerman +Date: Tue Feb 17 08:03:31 2009 +0100 + + Added the FindElement plug-in to the list. + +commit de1f0488515d5ea43a14af72ababef7f5818d1f8 +Author: Bert Timmerman +Date: Tue Feb 17 08:00:49 2009 +0100 + + Added findelement plug-in. + +commit 4e7581c7f84a030a4ee05d5e779f8a52dae6f403 +Author: lambert +Date: Sun Feb 15 18:15:38 2009 +0100 + + Updated with comments by DJ Delorie. + +commit 76a7d4798df31f8c4f100ff7cac184e14eda4f05 +Author: Bert Timmerman +Date: Wed Jan 21 22:33:18 2009 +0100 + + Added code for the upth2pth plug-in. + +commit fa0a502995bf8663f78a1e06290210de133ba4b2 +Author: Bert Timmerman +Date: Wed Jan 21 21:55:07 2009 +0100 + + Added upth2pth plug-in. + +commit 48ac3e6ef67f7be419e252630c864b8bec788c8a +Author: Bert Timmerman +Date: Wed Jan 21 20:46:13 2009 +0100 + + Added upth2pth target. + +commit 1ab60c5863d1b20da84d18d1d392297a23bd0ce8 +Author: Bert Timmerman +Date: Tue Jan 20 10:54:09 2009 +0100 + + Added toporouter documentation. + +commit d0b2fbe6fbb00314fa3e5e3b2d036046970541cb +Author: Bert Timmerman +Date: Sun Jan 4 10:07:56 2009 +0100 + + Correction on target names in target "all". + +commit 7eb61a5c5a4686cc3c940c55bf6943cd5034154d +Author: Bert Timmerman +Date: Sat Jan 3 22:44:20 2009 +0100 + + Added framework for Doxygen documentation. + +commit f1dcf899cc716c8346e8ad2b40704c891b8144c7 +Author: Bert Timmerman +Date: Sat Jan 3 19:52:24 2009 +0100 + + Added a makefile to compile single source files against the pcb source tree. + +commit 1fbe3758eb17f38f280a77cd44c2f73e44982b36 +Author: Bert Timmerman +Date: Fri Jan 2 21:23:11 2009 +0100 + + Added toporouter sources. + +commit 53e12b744af567b8bee9f443775d6c096ab6f178 +Author: Bert Timmerman +Date: Fri Jan 2 21:16:20 2009 +0100 + + Added .gitignore files. + +commit 143f0f56cb184c1f1378b692cd2233a841957a7c +Author: Bert Timmerman +Date: Fri Jan 2 10:41:41 2009 +0100 + + Changed the location of PCB source tree. + +commit d628ffa9b45b3ac5328774ebcf5e72c6d063ebca +Author: Bert Timmerman +Date: Fri Jan 2 10:14:59 2009 +0100 + + Changed the location of PCB source tree. + +commit 14186a8d43958d05554b9f5c89d3cbe2785dbfac +Author: Bert Timmerman +Date: Sun Nov 9 13:05:58 2008 +0100 + + Updated the AUTHORS file. + +commit c1a109f4e0e2abadac7f093438247f8a257bf607 +Author: Bert Timmerman +Date: Sun Nov 9 11:30:00 2008 +0100 + + Added ratsel plugin by Endre Bak. + +commit f6bab9d5502fa773bc1590e98b43b029bac4f527 +Author: Lambert J.H. Timmerman +Date: Thu Sep 18 20:15:19 2008 +0200 + + Added a ChangeLog. + +commit 2cfb20d3e5b96888e60dd183bdd74aba093874c6 +Author: Lambert J.H. Timmerman +Date: Thu Sep 18 19:48:03 2008 +0200 + + RenumberBuffer() added by DJ Delorie. + +commit 08200a544f540814695758c4c604a92cc9ebf979 +Author: Bert Timmerman +Date: Sat Jun 28 09:40:02 2008 +0200 + + Bug fix in src/boardflip.c by DJ Delorie. + + I just fixed a bug in my boardflip plugin where before the silk lines + and arcs wouldn't be flipped. So, if you're using boardflip, you + might want to get a fresh copy. + +commit dafe6ae6b2554a4e2a64b33fefde125133a001ef +Author: Bert Timmerman +Date: Thu Jun 26 00:25:28 2008 +0200 + + Correction on doxygen documentation in src/lockelements.c + +commit 58a5b49048e924f2643cb85afd0ed2c8c4eb1085 +Author: Bert Timmerman +Date: Wed Jun 25 23:25:58 2008 +0200 + + Added documentation about lockelements.c + +commit fe7702b45bd6fa83a9627270a23d500f7abf1103 +Author: Bert Timmerman +Date: Wed Jun 25 23:03:53 2008 +0200 + + Dropped UnlockElements(Selected) option in src/lockelements.c + + When locking a selection of elements, it is not easy to unselect the + selection since those elements and their pins/pads/elementlines/elementarcs + are now locked ;) + This may be thought of as understandable at first, + but may also be considered to be a bug in pcb. + +commit 1e49a8f13f64735431695891257607512141cc49 +Author: Bert Timmerman +Date: Tue Jun 24 21:59:55 2008 +0200 + + Initializing variable seems to squash some unwanted behaviour in src/lockelements.c + +commit 9c0d3dd2bfc29901887ef0a5471d2f3d69d3bf3d +Author: Bert Timmerman +Date: Sat Jun 14 13:47:23 2008 +0200 + + Tried to solve a bug in src/lockelements.c + + When locking a selection of elements, it is not easy to unselect the + selection since those elements and their pins/pads/elementlines/elementarcs + are now locked ;-) + This appears to be a bug in pcb. + A possible workaround would be to clear the selected flag of the + locked element at the same instance the lock flag was set. + This needs some further tweaking. + + GUI is updated when leaving the command dialog. + +commit bfd5356ef4eb42d3815a90590b35d29dd4966539 +Author: Bert Timmerman +Date: Sat Jun 14 12:40:37 2008 +0200 + + Updated AUTHORS.plug-ins file. + +commit 620bc1e33077bede93ce2b3eea40b21abc48af5b +Author: Bert Timmerman +Date: Sat Jun 14 12:19:54 2008 +0200 + + Added doc/sedrename.txt + +commit 1f698ce29ee3cd316e7a964e01d3dfe79ef4d6e8 +Author: Bert Timmerman +Date: Sat Jun 14 12:15:35 2008 +0200 + + Added src/sedrename.c + +commit 1449fa7650fb16076ef1470404f6c50a76396408 +Author: Bert Timmerman +Date: Sat Jun 14 12:14:06 2008 +0200 + + Updated AUTHORS.plug-ins file. + +commit de65aafaea2dc561a01b74f90d5e8903ebe72f8a +Author: Bert Timmerman +Date: Sat Jun 14 10:23:29 2008 +0200 + + Added src/lockelements.c + +commit e3e505bce5f19ae0959ba35fb2bd8a5ef808f978 +Author: Bert Timmerman +Date: Wed May 28 22:46:17 2008 +0200 + + Updated boardflip.c with the latest version. + +commit 0062c19b64a835b6888728717974373c2c48cb4e +Author: Bert Timmerman +Date: Wed May 28 06:39:32 2008 +0200 + + Renamed CONTRIB.plug-ins -> AUTHORS.plug-ins as this name better reflects the content of the file. + +commit ad57a5de493b9cb888f403b1d35d1bd0cf3d4c63 +Author: Bert Timmerman +Date: Sun May 25 23:28:15 2008 +0200 + + Added documentation about smartdisperse.c + +commit 25398fbe630a8d3b0a279809f4d27a0a49aee084 +Author: Bert Timmerman +Date: Sun May 25 23:27:44 2008 +0200 + + Added documentation about distalign.c + +commit 8978a3c7e16a35693f01492f4ef4841c0f798685 +Author: Bert Timmerman +Date: Sun May 25 23:26:56 2008 +0200 + + Added documentation about autocrop.c + +commit 438e7031c572df2cc5439da2cc0cde2b0507dcc6 +Author: Bert Timmerman +Date: Sun May 25 23:26:16 2008 +0200 + + Added CONTRIB.plug-ins containing additional information about authors and URLs on where to get updates. + +commit 3eb13df419eccca7e97e22a7114f22ca8b5ab97a +Author: Bert Timmerman +Date: Sun May 25 23:10:41 2008 +0200 + + Updated teardrops.c with the latest version. + +commit a8ec93cfb735863b5f30809e93a854d46067496f +Author: Bert Timmerman +Date: Sun May 25 23:00:36 2008 +0200 + + Updated jostle.c with the latest version. + +commit 3a71f349ff1c7d93bc103bcf3249bce520794c8c +Author: Bert Timmerman +Date: Sun May 25 22:58:02 2008 +0200 + + Updated autocrop.c with the latest version. + +commit 21425b9b70c9869e46825feeff76ae329afb1fd4 +Author: Bert Timmerman +Date: Sun May 25 13:20:15 2008 +0200 + + Renamed README -> README.plug-ins to avoid future filename clash. + +commit 66486380030954789ab6aa20f3a9d6a15cdcd8d5 +Author: Bert Timmerman +Date: Sun May 25 13:17:56 2008 +0200 + + Added various license texts. + +commit d03ce72f30605a1ca47af830ab0607c26bca22aa +Author: Bert Timmerman +Date: Sun May 25 09:27:17 2008 +0200 + + Corrected a small typo in the README file. + +commit 8bb2051aadf58ffd70fc74b91f3fd3c989fb0b73 +Author: Bert Timmerman +Date: Sun May 25 09:18:56 2008 +0200 + + Added smartdisperse.c + +commit dcf47fc1db87160ea0237378e2ba183d277118cb +Author: Bert Timmerman +Date: Sun May 25 09:18:18 2008 +0200 + + Added renumberblock.c + +commit 31a1788c265a96ed1db3894fa1528e8d073f8d7a +Author: Bert Timmerman +Date: Sun May 25 09:17:40 2008 +0200 + + Added jostle.c + +commit 7be539b9dd9065cbd0e9ef759d0a9fafa750ae52 +Author: Bert Timmerman +Date: Sun May 25 09:17:01 2008 +0200 + + Added footprint-update with additional documentation. + +commit 6b17cf546286248780c004d9226467fe1ebb67a9 +Author: Bert Timmerman +Date: Sun May 25 09:14:59 2008 +0200 + + Added teardrops.c with additional documentation. + +commit ca572adec67986dd2af7994a3242bbdb54cd9025 +Author: Bert Timmerman +Date: Sun May 25 09:13:18 2008 +0200 + + Added findrat.c + +commit f52f959f08679b7b6878f532c4278f377f572f10 +Author: Bert Timmerman +Date: Sun May 25 09:12:39 2008 +0200 + + Added distalign.c + +commit 810df79d91d8a9c97700c65afe3c85dccb7c1785 +Author: Bert Timmerman +Date: Sun May 25 09:12:06 2008 +0200 + + Added boardflip.c + +commit c7a40a2e25d531a19ece7ee294c36dde633ec4c0 +Author: Bert Timmerman +Date: Sun May 25 09:11:26 2008 +0200 + + Added autocrop.c + +commit 823ea456ca81bee4f6f4c69cbf480df003e1bf9e +Author: Bert Timmerman +Date: Sun May 25 08:49:57 2008 +0200 + + Initial commit Index: pcb-plugins_sources/GPLv1-license.txt =================================================================== --- pcb-plugins_sources/GPLv1-license.txt (nonexistent) +++ pcb-plugins_sources/GPLv1-license.txt (revision 3870) @@ -0,0 +1,251 @@ + + GNU GENERAL PUBLIC LICENSE + Version 1, February 1989 + + Copyright (C) 1989 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The license agreements of most software companies try to keep users +at the mercy of those companies. By contrast, our General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. The +General Public License applies to the Free Software Foundation's +software and to any other program whose authors commit to using it. +You can use it for your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Specifically, the General Public License is designed to make +sure that you have the freedom to give away or sell copies of free +software, 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of a such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must tell them their rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any program or other work which +contains a notice placed by the copyright holder saying it may be +distributed under the terms of this General Public License. The +"Program", below, refers to any such program or work, and a "work based +on the Program" means either the Program or any work containing the +Program or a portion of it, either verbatim or with modifications. Each +licensee is addressed as "you". + + 1. You may copy and distribute 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 and +disclaimer of warranty; keep intact all the notices that refer to this +General Public License and to the absence of any warranty; and give any +other recipients of the Program a copy of this General Public License +along with the Program. You may charge a fee for the physical act of +transferring a copy. + + 2. You may modify your copy or copies of the Program or any portion of +it, and copy and distribute such modifications under the terms of Paragraph +1 above, provided that you also do the following: + + a) cause the modified files to carry prominent notices stating that + you changed the files and the date of any change; and + + b) cause the whole of any work that you distribute or publish, that + in whole or in part contains the Program or any part thereof, either + with or without modifications, to be licensed at no charge to all + third parties under the terms of this General Public License (except + that you may choose to grant warranty protection to some or all + third parties, at your option). + + c) If the modified program normally reads commands interactively when + run, you must cause it, when started running for such interactive use + in the simplest and most usual way, to print or display an + announcement including an appropriate copyright notice and a notice + that there is no warranty (or else, saying that you provide a + warranty) and that users may redistribute the program under these + conditions, and telling the user how to view a copy of this General + Public License. + + d) You may charge a fee for the physical act of transferring a + copy, and you may at your option offer warranty protection in + exchange for a fee. + +Mere aggregation of another independent work with the Program (or its +derivative) on a volume of a storage or distribution medium does not bring +the other work under the scope of these terms. + + 3. You may copy and distribute the Program (or a portion or derivative of +it, under Paragraph 2) in object code or executable form under the terms of +Paragraphs 1 and 2 above provided that you also do one of the following: + + a) accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of + Paragraphs 1 and 2 above; or, + + b) accompany it with a written offer, valid for at least three + years, to give any third party free (except for a nominal charge + for the cost of distribution) a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of + Paragraphs 1 and 2 above; or, + + c) accompany it with the information you received as to where the + corresponding source code may be obtained. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form alone.) + +Source code for a work means the preferred form of the work for making +modifications to it. For an executable file, complete source code means +all the source code for all modules it contains; but, as a special +exception, it need not include source code for modules which are standard +libraries that accompany the operating system on which the executable +file runs, or for standard header files or definitions files that +accompany that operating system. + + 4. You may not copy, modify, sublicense, distribute or transfer the +Program except as expressly provided under this General Public License. +Any attempt otherwise to copy, modify, sublicense, distribute or transfer +the Program is void, and will automatically terminate your rights to use +the Program under this License. However, parties who have received +copies, or rights to use copies, from you under this General Public +License will not have their licenses terminated so long as such parties +remain in full compliance. + + 5. By copying, distributing or modifying the Program (or any work based +on the Program) you indicate your acceptance of this license to do so, +and all its terms and conditions. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these +terms and conditions. You may not impose any further restrictions on the +recipients' exercise of the rights granted herein. + + 7. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of the license which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +the license, you may choose any version ever published by the Free Software +Foundation. + + 8. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + END OF TERMS AND CONDITIONS + + Appendix: 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 humanity, 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 convey +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) 19yy + + 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 1, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19xx name of author + Gnomovision 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, the +commands you use may be called something other than `show w' and `show +c'; they could even be mouse-clicks or menu items--whatever suits your +program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program `Gnomovision' (a program to direct compilers to make passes + at assemblers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +That's all there is to it! Index: pcb-plugins_sources/GPLv2-license.txt =================================================================== --- pcb-plugins_sources/GPLv2-license.txt (nonexistent) +++ pcb-plugins_sources/GPLv2-license.txt (revision 3870) @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey 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 library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! Index: pcb-plugins_sources/GPLv3-license.txt =================================================================== --- pcb-plugins_sources/GPLv3-license.txt (nonexistent) +++ pcb-plugins_sources/GPLv3-license.txt (revision 3870) @@ -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 +. Index: pcb-plugins_sources/LGPLv2.1-license.txt =================================================================== --- pcb-plugins_sources/LGPLv2.1-license.txt (nonexistent) +++ pcb-plugins_sources/LGPLv2.1-license.txt (revision 3870) @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey 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 library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + Index: pcb-plugins_sources/Makefile.am =================================================================== --- pcb-plugins_sources/Makefile.am (nonexistent) +++ pcb-plugins_sources/Makefile.am (revision 3870) @@ -0,0 +1,28 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = src/plugins/ src/plugins/ratsel/ src/plugins/footprint-update/ + +EXTRA_DIST = \ + autogen.sh + +install-data-local: + @$(NORMAL_INSTALL) + if test -d $(srcdir)/pixmaps; then \ + $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/pixmaps; \ + for pixmap in $(srcdir)/pixmaps/*; do \ + if test -f $$pixmap; then \ + $(INSTALL_DATA) $$pixmap $(DESTDIR)$(pkgdatadir)/pixmaps; \ + fi \ + done \ + fi + +dist-hook: + if test -d pixmaps; then \ + mkdir $(distdir)/pixmaps; \ + for pixmap in pixmaps/*; do \ + if test -f $$pixmap; then \ + cp -p $$pixmap $(distdir)/pixmaps; \ + fi \ + done \ + fi + Index: pcb-plugins_sources/README.plug-ins =================================================================== --- pcb-plugins_sources/README.plug-ins (nonexistent) +++ pcb-plugins_sources/README.plug-ins (revision 3870) @@ -0,0 +1,160 @@ +This is a collection of pcb plugins collected from the +geda mailing lists. + +WARNING: before using one of these plugins make sure you + backup your previous work ! and make sure that + you apply these in a safe sandbox (not having + an influence on other work). + +There happens to be some documentation included in both the +source (files) and in the doc directory, the latter if this +was available at the time of the publication. + +Documentation for developers generated with Doxygen can be found here: +http://www.xs4all.nl/~ljh4timm/gaf/dox_pcb-plugins/index.html + +For more information inquire at the geda project user +mailing list (http://geda.seul.org/mailinglist/index.html) + +All issues may be reported at: + +https://bugs.launchpad.net/pcb-plugins + + +It is assumed that both the pcb and pcb-plugins source trees remain on an equal +level. +For instance the command "tree -d" given on a terminal screen would give a +result similar as below: + +pcb-plugins +├── autom4te.cache +├── doc +│   ├── doxygen +│   │   └── html +│   ├── footprint-update +│   ├── issues +│   ├── ratsel +│   └── teardrops +├── examples +│   └── polycombine +├── po +└── src + └── plugins + ├── footprint-update + └── ratsel + ├── src + │   └── ratsel + └── utst + └── ratsel + +pcb +├── autom4te.cache +├── data +├── doc +│   ├── gs +│   └── ideas +├── example +│   └── libraries +├── gts +├── intl +├── lib +│   └── pcblib-newlib +│   ├── amp +│   ├── amphenol +│   ├── bourns +│   ├── candk +│   ├── connector +│   ├── crystal +│   ├── cts +│   ├── geda +│   ├── generic +│   ├── gtag +│   ├── johnstech +│   ├── minicircuits +│   ├── nichicon +│   ├── optek +│   ├── optical +│   ├── panasonic +│   └── pci +├── m4 +├── newlib +│   ├── 2_pin_thru-hole_packages +│   ├── connectors +│   ├── crystal +│   ├── electro-optics +│   ├── headers +│   ├── keystone +│   ├── msp430 +│   ├── not_vetted_ingo +│   ├── sockets +│   └── tests +├── po +├── README_FILES +├── src +│   ├── hid +│   │   ├── batch +│   │   ├── bom +│   │   ├── common +│   │   ├── gcode +│   │   ├── gerber +│   │   ├── gtk +│   │   ├── lesstif +│   │   ├── lpr +│   │   ├── nelma +│   │   ├── png +│   │   └── ps +│   └── icons +├── tests +│   ├── golden +│   │   ├── hid_bom1 +│   │   ├── hid_bom2 +│   │   ├── hid_bom3 +│   │   ├── hid_bom4 +│   │   ├── hid_gcode1 +│   │   ├── hid_gcode10 +│   │   ├── hid_gcode11 +│   │   ├── hid_gcode2 +│   │   ├── hid_gcode3 +│   │   ├── hid_gcode4 +│   │   ├── hid_gcode5 +│   │   ├── hid_gcode6 +│   │   ├── hid_gcode7 +│   │   ├── hid_gcode8 +│   │   ├── hid_gcode9 +│   │   ├── hid_gerber1 +│   │   ├── hid_gerber2 +│   │   ├── hid_gerber3 +│   │   ├── hid_png1 +│   │   ├── hid_png2 +│   │   └── hid_png3 +│   └── inputs +├── tools +├── tutorial +├── utils +└── w32 + ├── patches + │   ├── gd + │   ├── gettext + │   ├── gtk+ + │   └── zlib + ├── recipes + └── tools + +To compile and install the single file plug-ins go into: + +cd pcb-plugins/src + +And type: + +make all +make install + +Or if you want to uninstall them type: + +make uninstall + +Reading the Makefile might give a good idea how to compile and install +a single plug-ins. + +Kind regards, have fun and the usual YMMV disclaimers apply. + Index: pcb-plugins_sources/autogen.sh =================================================================== --- pcb-plugins_sources/autogen.sh (nonexistent) +++ pcb-plugins_sources/autogen.sh (revision 3870) @@ -0,0 +1,159 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +DIE=0 + +if [ -n "$GNOME2_DIR" ]; then + ACLOCAL_FLAGS="-I $GNOME2_DIR/share/aclocal $ACLOCAL_FLAGS" + LD_LIBRARY_PATH="$GNOME2_DIR/lib:$LD_LIBRARY_PATH" + PATH="$GNOME2_DIR/bin:$PATH" + export PATH + export LD_LIBRARY_PATH +fi + +(test -f $srcdir/configure.ac) || { + echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" + echo " top-level package directory" + exit 1 +} + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`autoconf' installed." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +(grep "^AC_PROG_INTLTOOL" $srcdir/configure.ac >/dev/null) && { + (intltoolize --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`intltool' installed." + echo "You can get it from:" + echo " ftp://ftp.gnome.org/pub/GNOME/" + DIE=1 + } +} + +(grep "^AM_PROG_XML_I18N_TOOLS" $srcdir/configure.ac >/dev/null) && { + (xml-i18n-toolize --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`xml-i18n-toolize' installed." + echo "You can get it from:" + echo " ftp://ftp.gnome.org/pub/GNOME/" + DIE=1 + } +} + +(grep "^AM_PROG_LIBTOOL" $srcdir/configure.ac >/dev/null) && { + (libtool --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`libtool' installed." + echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" + DIE=1 + } +} + +(grep "^AM_GLIB_GNU_GETTEXT" $srcdir/configure.ac >/dev/null) && { + (grep "sed.*POTFILES" $srcdir/configure.ac) > /dev/null || \ + (glib-gettextize --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`glib' installed." + echo "You can get it from: ftp://ftp.gtk.org/pub/gtk" + DIE=1 + } +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`automake' installed." + echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" + DIE=1 + NO_AUTOMAKE=yes +} + + +# if no automake, don't bother testing for aclocal +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing \`aclocal'. The version of \`automake'" + echo "installed doesn't appear recent enough." + echo "You can get automake from ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +if test -z "$*"; then + echo "**Warning**: I am going to run \`configure' with no arguments." + echo "If you wish to pass any to it, please specify them on the" + echo \`$0\'" command line." + echo +fi + +case $CC in +xlc ) + am_opt=--include-deps;; +esac + +for coin in `find $srcdir -name configure.ac -print` +do + dr=`dirname $coin` + if test -f $dr/NO-AUTO-GEN; then + echo skipping $dr -- flagged as no auto-gen + else + echo processing $dr + ( cd $dr + + aclocalinclude="$ACLOCAL_FLAGS" + + if grep "^AM_GLIB_GNU_GETTEXT" configure.ac >/dev/null; then + echo "Creating $dr/aclocal.m4 ..." + test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 + echo "Running glib-gettextize... Ignore non-fatal messages." + echo "no" | glib-gettextize --force --copy + echo "Making $dr/aclocal.m4 writable ..." + test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 + fi + if grep "^AC_PROG_INTLTOOL" configure.ac >/dev/null; then + echo "Running intltoolize..." + intltoolize --copy --force --automake + fi + if grep "^AM_PROG_XML_I18N_TOOLS" configure.ac >/dev/null; then + echo "Running xml-i18n-toolize..." + xml-i18n-toolize --copy --force --automake + fi + if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then + if test -z "$NO_LIBTOOLIZE" ; then + echo "Running libtoolize..." + libtoolize --force --copy + fi + fi + echo "Running aclocal $aclocalinclude ..." + aclocal $aclocalinclude + if grep "^AM_CONFIG_HEADER" configure.ac >/dev/null; then + echo "Running autoheader..." + autoheader + fi + echo "Running automake --gnu $am_opt ..." + automake --add-missing --gnu $am_opt + echo "Running autoconf ..." + autoconf + ) + fi +done + +conf_flags="--enable-maintainer-mode" + +if test x$NOCONFIGURE = x; then + echo Running $srcdir/configure $conf_flags "$@" ... + $srcdir/configure $conf_flags "$@" \ + && echo Now type \`make\' to compile. || exit 1 +else + echo Skipping configure process. +fi Property changes on: pcb-plugins_sources/autogen.sh ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: pcb-plugins_sources/configure.ac =================================================================== --- pcb-plugins_sources/configure.ac (nonexistent) +++ pcb-plugins_sources/configure.ac (revision 3870) @@ -0,0 +1,93 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT([pcb-plugins], [0.0.2]) +AM_INIT_AUTOMAKE([-Wall -Werror foreign]) +AC_CONFIG_HEADERS([config.h]) +AM_MAINTAINER_MODE + +# Try to figure out if we are building from git sources. +# If we are then unless building of the documentation has been disabled +# then just require the user have all the right tools. +# Users building from a tarball won't need latex, makeinfo, +# etc. but if you're already downloading development sources, then +# it is not unreasonable to require development tools. +# What motivated this is that using maintainer mode proved to cause +# regular confusion. + +pcb_plugins_sources="tarball" +AC_MSG_CHECKING([if you are building from a git checkout]) +pcb_plugins_git_version=no +if test -f $srcdir/.gitignore ; then + pcb_plugins_git_version=yes + AC_MSG_RESULT([yes]) + pcb_plugins_sources="GIT" +else + AC_MSG_RESULT([no]) +fi +AM_CONDITIONAL(GIT_VERSION, test x$pcb_plugins_git_version = xyes) + +AC_ISC_POSIX + +# Checks for programs. +AC_PROG_CC +AC_PROG_CXX +AC_PROG_CC_STDC +AC_HEADER_STDC +AC_PROG_INSTALL +AC_PROG_MAKE_SET +AC_PROG_AWK +AC_PROG_CPP + +# AC_PROG_MKDIR_P +# is a backport of autoconf-2.60's AC_PROG_MKDIR_P. +# Remove this macro when we can assume autoconf >= 2.60. +m4_ifdef([AC_PROG_MKDIR_P], [], [ + AC_DEFUN([AC_PROG_MKDIR_P], + [AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake + MKDIR_P='$(mkdir_p)' + AC_SUBST([MKDIR_P])])]) +AC_PROG_MKDIR_P + +pkg_modules="gtk+-2.0 >= 2.0.0" +PKG_CHECK_MODULES(PACKAGE, [$pkg_modules]) +AC_SUBST(PACKAGE_CFLAGS) +AC_SUBST(PACKAGE_LIBS) + +GETTEXT_PACKAGE=pcb-plugins +AC_SUBST(GETTEXT_PACKAGE) +AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package.]) + +dnl Add the languages which your application supports here. +ALL_LINGUAS="" +AM_GLIB_GNU_GETTEXT + +# Create makefiles for (sub)directories. +AC_CONFIG_FILES([ +Makefile +]) + +# FIXME: add Makefile.in files to get the following +#src/plugins/Makefile + +AC_OUTPUT + +# Print some results. +expandedXDGDATADIR=`eval "echo $XDGDATADIR"` +expandedKDEDATADIR=`eval "echo $KDEDATADIR"` +AC_MSG_RESULT([ +----------------------------------------------- +Configuration summary for $PACKAGE $VERSION: +Source tree distribution: $pcb_plugins_sources +Build Doxygen documentation: $docs_yesno +xdg data directory: $expandedXDGDATADIR +KDE data directory: $expandedKDEDATADIR +CC: $CC +CXX: $CXX +CPPFLAGS: $CPPFLAGS +CFLAGS: $CFLAGS +CXXFLAGS: $CXXFLAGS +LIBS: $LIBS +----------------------------------------------- +]) + +# EOF Index: pcb-plugins_sources/doc/autocrop.txt =================================================================== --- pcb-plugins_sources/doc/autocrop.txt (nonexistent) +++ pcb-plugins_sources/doc/autocrop.txt (revision 3870) @@ -0,0 +1,39 @@ +From: Ben Jackson +To: geda-user@moria.seul.org +Date: Mon, 19 Feb 2007 13:30:58 -0800 +Subject: Autocrop() plugin for PCB + +As a "learn PCB internals" project I've written an Autocrop() plugin. +It finds the extents of your existing board and resizes the board to +contain only your parts plus a margin. + +There are some issues that I can't resolve from a plugin: + +1) Board size has no Undo function, so while Undo will put your objects +back where they started, the board size has to be replaced manually. + +2) There is no 'edge clearance' DRC paramater, so I used 5*line spacing. + +3) Moving a layout with lots of objects and polygons is slow due to the +repeated clearing/unclearing of the polygons as things move. Undo is +slower than moving because every individual move is drawn (instead of +one redraw at the end). + +The source is: + +http://ad7gd.net/geda/autocrop.c + +And you compile/install with: + +# set PCB to your PCB source directory +PCB=$(HOME)/cvs/pcb +gcc -I$(PCB) -I$(PCB)/src -O2 -shared autocrop.c -o autocrop.so +cp autocrop.so ~/.pcb/plugins + +Run it by typing `:Autocrop()' in the gui, or by binding Autocrop() to a +key. + +-- +Ben Jackson AD7GD + +http://www.ben.com/ Index: pcb-plugins_sources/doc/distalign.txt =================================================================== --- pcb-plugins_sources/doc/distalign.txt (nonexistent) +++ pcb-plugins_sources/doc/distalign.txt (revision 3870) @@ -0,0 +1,73 @@ +From: Ben Jackson +To: geda-user@moria.seul.org +Date: Sat, 24 Feb 2007 22:13:51 -0800 +Subject: The amazing Align/Distribute plugin + +Ok, having "finished" the smartdisperse plugin, I moved on to phase 2 of +my "I'm sick of moving LEDs by hand" master plan. + +Introducing Align() and Distribute(), which work much like the similarly +named functions in Visio. Given that PCB does not have the concept of +"first selected object" to draw on, the reference points can be selected +by arguments. + +Both functions always work on all selected elements[*]. Some examples: + +:Align(X) + Objects are moved left/right to align their Marks with + the Mark of the topmost selected object. All objects remain + on or move to the current grid. + +:Align(Y,Centers) + Now objects are aligned up/down to their geometric centers + rather than their marks. The reference point is the center + of the leftmost object. + +:Align(Y,Tops,Average,Gridless) + Feeling bold, you align the tops all selected objects to the + average of their top edges and let them wander off the grid + to exactly the average of their tops. + +:Align(X,Marks,Crosshair) + None of the objects are where you want them, so you move the + crosshair to a likely spot and cause them all to move their X + coordinates to your new X location. + +:Align(X,Marks,Last) + As above, but instead of the crosshair you just override the + default "First" to "Last" so the reference object is bottommost + instead of topmost. + +Now you have them in a neat line, but they're all clumped! + +:Distribute(Y) + Objects are spread out evenly from the first (uppermost) to last + using their marks as the reference point. + +:Distribute(X,Lefts,Crosshair,Last) + You move your crosshair to the left edge of the target area, + which will be the leftmost edge of the leftmost object. The + objects are spread between your crosshair and the original + location of the Last (rightmost) object. + +:Distribute(Y,Gaps) + You have chosen to select many oddly sized objects, and instead + of their centers being spread out evenly, you want the space + (or "gaps") to be even. + +You get tricky and bind `Align(X,Marks,Crosshair)' to a key. Now you +can select an object and hit your key and the object will warp to the +same X coordinate as your cursor. + +Source: http://ad7gd.net/geda/distalign.c + +Same compile instructions as before. Feedback is appreciated! + +[*] If it has any flaws, it is that you can't operate non-element objects, +though some melding of autocrop (which knows how to do such things) and +distalign could produce such a capability. + +-- +Ben Jackson AD7GD + +http://www.ben.com/ Index: pcb-plugins_sources/doc/doxygen/pcb-plugins-dox-no-call-graphs.dox =================================================================== --- pcb-plugins_sources/doc/doxygen/pcb-plugins-dox-no-call-graphs.dox (nonexistent) +++ pcb-plugins_sources/doc/doxygen/pcb-plugins-dox-no-call-graphs.dox (revision 3870) @@ -0,0 +1,1237 @@ +# Doxyfile 1.4.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = pcb-plugins + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = YES + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = YES + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ../.. ../doc/doxygen/pcb-fpw-main.txt + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py + +FILE_PATTERNS = *.c *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = ../config.h + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = ../doc/doxygen/ + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = YES + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = YES + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO Index: pcb-plugins_sources/doc/doxygen/pcb-plugins-dox-with-call-graphs.dox =================================================================== --- pcb-plugins_sources/doc/doxygen/pcb-plugins-dox-with-call-graphs.dox (nonexistent) +++ pcb-plugins_sources/doc/doxygen/pcb-plugins-dox-with-call-graphs.dox (revision 3870) @@ -0,0 +1,1237 @@ +# Doxyfile 1.4.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = pcb-plugins + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 0.0.1 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = YES + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = YES + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ../../src ./pcb-plugins-main.txt + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py + +FILE_PATTERNS = *.c *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = . + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = .. + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = YES + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = YES + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = YES + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO Index: pcb-plugins_sources/doc/doxygen/pcb-plugins-main.txt =================================================================== --- pcb-plugins_sources/doc/doxygen/pcb-plugins-main.txt (nonexistent) +++ pcb-plugins_sources/doc/doxygen/pcb-plugins-main.txt (revision 3870) @@ -0,0 +1,9 @@ +/*! \mainpage Plug-ins for PCB. +\image html ../pcb-plugin-logo.png +\section pcb-plugins-introduction PCB Plugins Introduction + \htmlinclude ./what-are-pcb-plugins.html +
+\image html ../pcb-logo-small.png +\section pcb-introduction PCB Introduction + \htmlinclude ./what-is-pcb.html +*/ Index: pcb-plugins_sources/doc/doxygen/what-are-pcb-plugins.html =================================================================== --- pcb-plugins_sources/doc/doxygen/what-are-pcb-plugins.html (nonexistent) +++ pcb-plugins_sources/doc/doxygen/what-are-pcb-plugins.html (revision 3870) @@ -0,0 +1,7 @@ + +What are PCB Plug-ins ?
+
+PCB Plug-ins are shared libraries for PCB.
+
+ + Index: pcb-plugins_sources/doc/doxygen/what-is-pcb.html =================================================================== --- pcb-plugins_sources/doc/doxygen/what-is-pcb.html (nonexistent) +++ pcb-plugins_sources/doc/doxygen/what-is-pcb.html (revision 3870) @@ -0,0 +1,17 @@ + +What is PCB ? +

+PCB is an interactive printed circuit board editor for the X11 window system with either a GTK interface (default) or a lesstif interface.
+PCB includes a rats nest feature and Design Rule Checking.
+PCB offers high end features such as an autorouter, a topological router and a trace optimizer which can tremendously reduce layout time.
+Plug-ins: compile separately and load at startup of pcb.
+PCB includes exporters for: +

    +
  • Batch: text line "batch" HID, which exists for scripting and non-GUI needs. +
  • Gerber: Industry standard RS-274-X and NC drill output. +
  • BOM: Bill of material and centroid data X-Y data output for use in the board fabrication and assembly process. +
  • PS: PS output. +
  • PNG: GIF, JPG and PNG graphic formats output. +
  • Nelma: Output files for trace capacitance calculations. +
+ Index: pcb-plugins_sources/doc/footprint-update/else.gif =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/footprint-update/else.gif =================================================================== --- pcb-plugins_sources/doc/footprint-update/else.gif (nonexistent) +++ pcb-plugins_sources/doc/footprint-update/else.gif (revision 3870) Property changes on: pcb-plugins_sources/doc/footprint-update/else.gif ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/footprint-update/footprint-update.html =================================================================== --- pcb-plugins_sources/doc/footprint-update/footprint-update.html (nonexistent) +++ pcb-plugins_sources/doc/footprint-update/footprint-update.html (revision 3870) @@ -0,0 +1,185 @@ + +PCB Footprint Update Plug In < Bourbon Street Software + + + + + + + + + +
+

Start of topic | Skip to actions
+
+

PCB Footprint Update Plug-in

+

+This PCB plug-in lets you replace existing footprints in your layout with updated footprints. You can download the source code below. +

+

Motivation

+

+Like some others, I found myself with a routed board and while +inspecting the Gerber files decided several of my footprints needed +tweaking. All my footprints are generated with Make and Guile +scripts, so updating the footprint files themselves was easy. +Unfortunately there wasn't an easy way in PCB to update my layout to +use my new footprints. (Some discussion of these problems can be found +in the email archives here and here.) +

+

Plug-in

+

+This PCB plug-in replaces existing footprints in your layout with +updated footprints doing its best to preserve the existing footprint's: +

    +
  • position, +
  • +
  • rotation, +
  • +
  • side of the board it's on, +
  • +
  • component name and relative placement, scale, orientation, etc., +
  • +
  • and pad and pin names. +
  • +
Because PCB modifies its internal copies of the footprints any +time they are moved, rotated, etc., the plug-in needs to use some guess +work. The plug-in cannot always determine the correct orientation and +in these cases it will skip the replacement. Even when it thinks it has +determined the correct orientation, it might get it wrong. +

+The plug-in adds the UpdateFootprintsFromBuffer +action to PCB. The action takes a footprint (i.e, element) that has +been loaded into the buffer and uses it to replace existing footprints +(i.e., elements) in the layout. +

+The action runs in one of two modes; "auto" or "manual". +

In "auto" mode, the plug-in uses the buffer footprint +description text to find corresponding layout footprints. In my +workflow the description text always contains the footprint file name, +e.g., "PHOENIX-PT-4-R.fp", so executing the action in "auto" mode will +automatically replace all existing instances of the footprint in the +layout. +

In "manual" mode, the footprint description text is not used +and the plug-in will try to replace the selected or named footprints. +

+Here's the usage: +

+
UpdateFootprintsFromBuffer() or UpdateFootprintsFromBuffer(auto)
Use the description field of the buffer element and try to replace any layout element that has a matching description field. +
+
UpdateFootprintsFromBuffer(auto, selected)
Like UpdateFootprintsFromBuffer(auto) but only consider selected layout elements. +
+
UpdateFootprintsFromBuffer(auto, named, <name1>[, <name2>...])
Like UpdateFootprintsFromBuffer(auto) but only consider elements that match the given element names. For example, UpdateFootprintsFromBuffer(auto, named, U101, U103, U105). +
+
UpdateFootprintsFromBuffer(manual) or UpdateFootprintsFromBuffer(manual, selected)
Like the "auto" version, but try to replace the selected layout elements regardless of their description field. +
+
UpdateFootprintsFromBuffer(manual, named, <name1>[, <name2>...])
Like the "auto" version, but try to replace the named layout elements regardless of their description field. +
+
+

+

Limitations

+

+Here are the limitations I now of: +

    +
  • The rotation of the new element is calculated using two +non-coincident pads or pins from both the buffer element and the layout +element. For elements consisting entirely of coincident pads and pins, +or only a single pad or pin, the plug-in will only translate the +replacement element from the buffer without regard to rotation. +
  • +
  • Element-specific attributes in the layout element, if it has any, +are replaced with the buffer element's attributes; i.e., attributes in +the layout element, if it has any, will be lost. +
  • +
  • The quality of the replacement is not evaluated by the plug-in. You may be unhappy with the results. +
  • +
+

Since this is my first trip into PCB's internals, and since the +biggest layout I tested it on is a simple two layer board with about +100 footprints, please use this plug-in with care and: +

+Definitely backup any design before you try out this plug-in! +

+If you find any problems with this plug-in or have any suggestions, feel free to contact me at dferreyra@igc.org . +

+

Action Scripts

+

+To update all my footprints at once, I generated a PCB action script. Here's what a piece of the script looks like: +

    ...
+    LoadFrom(ElementToBuffer, EDAC-RJ45-RA.fp)
+    UpdateFootprintsFromBuffer(auto)
+    LoadFrom(ElementToBuffer, LITEON-LTST-C195GEKT.fp)
+    UpdateFootprintsFromBuffer(auto)
+    LoadFrom(ElementToBuffer, LUMEX-LDD-C402NI.fp)
+    UpdateFootprintsFromBuffer(auto)
+    ...
+
+Then I execute the script with the ExecuteFile() action. This allows me to update all 100 footprints on my small board automatically and at will. +

+

Building

+

+To build the plug-in: +

    +
  1. Untar the distribution file; e.g.: +
      +
    • tar -xzf footprint-update-1.00.tar.gz +
    • +
    +
  2. +
  3. Edit the Makefile: +
      +
    • Change PCB_CVS_DIR to point to the directory containing the PCB source tree. +
    • +
    • Change INSTALL_DIR to point to the directory where you want the plug-in installed. +
    • +
    +
  4. +
  5. Run make to build the plug-in. Run make install to install it. +
  6. +
+

+

References

+

+

+

+-- DeanFerreyra - 30 Apr 2008 +
+ +to top
+

+ + +

+ + + +
Attachment Size Date Comment
footprint-update-1.01.tar.gz 23.6 K 25 May 2008 - 00:17 Footprint-Update plug-in for PCB
+
+

+

+

You are here: Bourbon Street Software > PCB Footprint Update Plug In

to top

+
BourbonStreetSoftware.PCBFootprintUpdatePlugIn r1.10 - 25 May 2008 - 00:19
+ +
+ Index: pcb-plugins_sources/doc/join-found.txt =================================================================== --- pcb-plugins_sources/doc/join-found.txt (nonexistent) +++ pcb-plugins_sources/doc/join-found.txt (revision 3870) @@ -0,0 +1,70 @@ +From: Peter Clifton +To: gEDA user mailing list +Date: Mon, 26 Oct 2009 14:59:43 +0000 +Subject: Re: gEDA-user: PCB+GL testing + +On Mon, 2009-10-26 at 10:04 +0100, michalwd1979 wrote: +> Hello, +> +> Today I've done all possible tests with new, freshly compiled 3d pcb +> using available PCs and these are the results: +> +> 1) I can not reproduce "strange" crash with drc window on any machine. +> Was it secret testing of new electromagnetic weapon? I'm living close +> to military shipyard by the way. +> +> 2) On intel graphics card (composite enabled) I also can not reproduce +> crash in pinout window. Here everything works OK (dri2 in use). +> +> 3) On intel graphics with composite disabled pcb does not start at +> all: Can not set up gl context, then segmantation fault. Strange, but +> rather related to driver not pcb itself. +> +> 4) On radeon (composite disabled) there are problems when closing +> pinout window. +> +> 5) On radeon with composite some drawing errors occur, but this is +> rather problem with driver because I can see similar problems with +> other apps. This is also quite complicated system with 2 graphics +> cards and 3 screens (my favorite). + + +Sounds like GL drivers are going to cause me grief! + +> I've also tried to run teardrops() during these test but this did not +> change anything. + +Ok, that is good at least. (Although only running under valgrind would +reliably catch if this causes problems). + +> And one question: is there any "plugins documentation" for pcb? In my +> wish list there is something that automatically add thermals tools to +> vias on given net and set "don't clear polygons" flag on tracks. I +> think that I will try to write it myself. I've been looking around for +> a while and did not find anything yet. + +No documentation, sorry. I've coded up a very hacky start for what you +want to do.. Unfortunately, the APIs I wanted to use to make PCB "find" +the connected objects are burried in find.c and not exposed sufficiently +for me to call them. I could probably have ripped out and duplicated a +load of the find.c code in the plugin, but I think it is useful as is. + +Find the net you want to join. Hit "F" to "find" the connected objects. +(Highlighting them in green). + +Run action "JoinFound". Presto. + +You might want to hack the plugin's code to change the thermal style +number. IIRC: + +1,2 = square ish thermals +3 = solid join thermal +4,5 = rounded thermals + +************************************ +SAVE WORK BEFORE RUNNING THIS ONE ;) +************************************ + +Best wishes, + +Peter C. Index: pcb-plugins_sources/doc/lockelements.txt =================================================================== --- pcb-plugins_sources/doc/lockelements.txt (nonexistent) +++ pcb-plugins_sources/doc/lockelements.txt (revision 3870) @@ -0,0 +1,37 @@ +From: Bert Timmerman +To: gEDA developer mailing list , gEDA user mailing list +Organization: me organized ? +Date: Wed, 25 Jun 2008 23:17:52 +0200 +Subject: gEDA-user: [pcb] lock elements plug-in + +Hi all, + +The final version of the plug-in can be found here: + +http://www.xs4all.nl/~ljh4timm/downloads/lockelements.c + + +Usage: + +LockElements(Selected) to lock a (selected first) selection of elements +(only). + +LockElements(All) to lock all elements on the pcb. + +UnlockElements(All) to unlock all elements on the pcb. + +If no argument is given, no locking/unlocking is performed on elements. + + +Usual disclaimers apply, just my EUR 0.02 and have fun :) + +Kind regards, + +Bert Timmerman. + + + +_______________________________________________ +geda-user mailing list +geda-user@moria.seul.org +http://www.seul.org/cgi-bin/mailman/listinfo/geda-user Index: pcb-plugins_sources/doc/pcb-logo-small.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/pcb-logo-small.png =================================================================== --- pcb-plugins_sources/doc/pcb-logo-small.png (nonexistent) +++ pcb-plugins_sources/doc/pcb-logo-small.png (revision 3870) Property changes on: pcb-plugins_sources/doc/pcb-logo-small.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/pcb-plugin-logo.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/pcb-plugin-logo.png =================================================================== --- pcb-plugins_sources/doc/pcb-plugin-logo.png (nonexistent) +++ pcb-plugins_sources/doc/pcb-plugin-logo.png (revision 3870) Property changes on: pcb-plugins_sources/doc/pcb-plugin-logo.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/pcb-plugin-logo_14x14.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/pcb-plugin-logo_14x14.png =================================================================== --- pcb-plugins_sources/doc/pcb-plugin-logo_14x14.png (nonexistent) +++ pcb-plugins_sources/doc/pcb-plugin-logo_14x14.png (revision 3870) Property changes on: pcb-plugins_sources/doc/pcb-plugin-logo_14x14.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/pcb-plugin-logo_192x192.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/pcb-plugin-logo_192x192.png =================================================================== --- pcb-plugins_sources/doc/pcb-plugin-logo_192x192.png (nonexistent) +++ pcb-plugins_sources/doc/pcb-plugin-logo_192x192.png (revision 3870) Property changes on: pcb-plugins_sources/doc/pcb-plugin-logo_192x192.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/pcb-plugin-logo_64x64.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/pcb-plugin-logo_64x64.png =================================================================== --- pcb-plugins_sources/doc/pcb-plugin-logo_64x64.png (nonexistent) +++ pcb-plugins_sources/doc/pcb-plugin-logo_64x64.png (revision 3870) Property changes on: pcb-plugins_sources/doc/pcb-plugin-logo_64x64.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/polycombine.txt =================================================================== --- pcb-plugins_sources/doc/polycombine.txt (nonexistent) +++ pcb-plugins_sources/doc/polycombine.txt (revision 3870) @@ -0,0 +1,44 @@ +From: geda-user-bounces@moria.seul.org on behalfe of Peter Clifton [pcjc2@cam.ac.uk] +Date: Monday June 7th, 2010 3:31 +To: geda-user +Subjects: gEDA-user: Polygon combiner plugin + +This is far less tested than the support for hole'd polygons. The idea is similar to DJ's polystitch plugin, but this one uses PCB's new support for saving polygons with holes in them. + + +Usage: + +1. Have some file from pstoedit's pcbfill back-end handy. Polygon contours are all thrown in as separate polygons are a real mess. + +2. Select the region you want to sort out (all at once). NB: Only polygons on the same layer will be processed. + +3. Run the action "polycombine" + +4. Fix up the letter A in the logo! ;) + + +I've attached a before + after example (which requires git HEAD pcb). + +NB: For some reason, the "A" in the logo I'm working with appears to have been emitted with the wrong winding orders by pstoedit. + + +The work the plugin does to process the contours is actually pretty slow. (Awful computational complexity, and no speed-up tricks like r-trees are used). + +A more naive algorithm won't work because the contours to add / subtract are multiply nested in this image. I started off trying to loop over all polygons, computing the union of the positive contours, the union of the negative contours - then doing a single subtraction. This unfortunately deleted detail in the image. + +The plugin now works to construct a tree ordered by "containership" - and processes the relevant contours in an appropriate order so outer contours are processed before inner ones. + +Best regards, + +-- +Peter Clifton + +Electrical Engineering Division, +Engineering Department, +University of Cambridge, +9, JJ Thomson Avenue, +Cambridge +CB3 0FA + +Tel: +44 (0)7729 980173 - (No signal in the lab!) +Tel: +44 (0)1223 748328 - (Shared lab phone, ask for me) Index: pcb-plugins_sources/doc/polystitch.txt =================================================================== --- pcb-plugins_sources/doc/polystitch.txt (nonexistent) +++ pcb-plugins_sources/doc/polystitch.txt (revision 3870) @@ -0,0 +1,29 @@ +From: geda-user-bounces@moria.seul.org on behalf of DJ Delorie [dj@delorie.com] +Date: Friday May 28 2010 7:33 +To: geda-user@moria.seul.org +Subject: gEDA-user: PolyStitch plugin + + +I needed to do some logos, so everyone gets a logo tool :-) + +PolyStitch is a PCB plugin to fix the output of pstoedit's "pcbfill" +output, when you have text with holes in it (like the letter "d"). +Pstoedit makes two polygons, one for the outside and one for the hole, but what you really want in PCB is one polygon, so that the hole is not filled. + +This plugin, used when the crosshair is over the inner polygon, stitches the two polygons together such that the area inside the inner polygon becomes "outside" the resulting polygon. Basically, it cuts the shape at the narrowest spot and stitches the point lists together. + +It can also be used to cut holes in a ground plane, by drawing the hole as a separate polygon then stitching it to the plane's polygon. + +Plugin source: http://www.delorie.com/pcb/polystitch.c + +Sample board: http://www.delorie.com/pcb/polystitch.pcb + +Undo is not supported (sorry). + +DJ + + +_______________________________________________ +geda-user mailing list +geda-user@moria.seul.org +http://www.seul.org/cgi-bin/mailman/listinfo/geda-user Index: pcb-plugins_sources/doc/ratsel/FullyRouted.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/ratsel/FullyRouted.png =================================================================== --- pcb-plugins_sources/doc/ratsel/FullyRouted.png (nonexistent) +++ pcb-plugins_sources/doc/ratsel/FullyRouted.png (revision 3870) Property changes on: pcb-plugins_sources/doc/ratsel/FullyRouted.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/ratsel/Layout.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/ratsel/Layout.png =================================================================== --- pcb-plugins_sources/doc/ratsel/Layout.png (nonexistent) +++ pcb-plugins_sources/doc/ratsel/Layout.png (revision 3870) Property changes on: pcb-plugins_sources/doc/ratsel/Layout.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/ratsel/RatsSelected.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/ratsel/RatsSelected.png =================================================================== --- pcb-plugins_sources/doc/ratsel/RatsSelected.png (nonexistent) +++ pcb-plugins_sources/doc/ratsel/RatsSelected.png (revision 3870) Property changes on: pcb-plugins_sources/doc/ratsel/RatsSelected.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/ratsel/Schematic.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/ratsel/Schematic.png =================================================================== --- pcb-plugins_sources/doc/ratsel/Schematic.png (nonexistent) +++ pcb-plugins_sources/doc/ratsel/Schematic.png (revision 3870) Property changes on: pcb-plugins_sources/doc/ratsel/Schematic.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/ratsel/SelectedRatsAutorouted.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/ratsel/SelectedRatsAutorouted.png =================================================================== --- pcb-plugins_sources/doc/ratsel/SelectedRatsAutorouted.png (nonexistent) +++ pcb-plugins_sources/doc/ratsel/SelectedRatsAutorouted.png (revision 3870) Property changes on: pcb-plugins_sources/doc/ratsel/SelectedRatsAutorouted.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/ratsel/UserGuide.html =================================================================== --- pcb-plugins_sources/doc/ratsel/UserGuide.html (nonexistent) +++ pcb-plugins_sources/doc/ratsel/UserGuide.html (revision 3870) @@ -0,0 +1,55 @@ + + +

RatSel PCB plugin quick introduction

+

Last update: 2008.Nov.05

+

+

Purpose

+In an electrical circuit there can be component pins with high current flow and there can be pins with low current flow. On the printed circuit representation it is often good to connect the high current pins with wide tracks and the low current pins with narrow tracks. RatSel intends to provide some help for accomplishing this kind of variable track width autorouting in PCB. +

+

Usage

+Here is the schematic of 2 DC-DC converters:
+

+1. Write the list of high current pins into a new file, called power.DCDC.rs:
+
+GND-1
+Uboost1-(1,2)
+PowDCDC-1
+Rsb1-(1,2)
+Lb1-(1,2), Lb2-(1,2), Db1-(1,2), BOOSTED-1
+Cobb1-(1,2)
+
+Rsi1-(1,2)
+Uinv1-(1,2)
+Li1-(1,2), Li2-(1,2), Di1-(1,2), INVERTED-1
+Cobi1-(1,2)
+

+2. Launch PCB, generate the layout and place the rats:
+

+3. Execute the RatSel plugin from the PCB command line with this command: RatSel(power.DCDC.rs). The result should look like this:
+

+4. Setup the autorouter to route with wide tracks, e.g. with 60 mils. Execute the "Auto-route selected rats" functionality:
+

+5. Setup the autorouter to narrow track width, e.g. 20 mils. Execute the "Auto-route all rats" functionality for routing the remaining rats. After some "Auto optimize" and a "Miter" the result looks like this:
+

+

+ +

+

Problems

+There can be many. The plugin hasn't been intensively tested. I haven't tried it on SMT board. My tests were made with pcb-20080202. +

+ +

+

Compilation and installation.

+For compilation you'll need the source distribution of PCB, gcc, g++, and gcj environment.
+1st you have to edit the Make.Settings file, currently it contains 2 variables: PCBDIR, LIBGCJPATH. +Then "make install" should do the remaining tasks. +


+ +

+Hopping that this functionality will be useful.

+Cheers,
+Endre Bak +

+ + + Index: pcb-plugins_sources/doc/ratsel.txt =================================================================== --- pcb-plugins_sources/doc/ratsel.txt (nonexistent) +++ pcb-plugins_sources/doc/ratsel.txt (revision 3870) @@ -0,0 +1,23 @@ +From: Endre Bak +Date: Thu, 6 Nov 2008 05:30:47 -0800 (PST) +To: geda-dev@moria.seul.org +Subject: gEDA-dev: PCB plugin for rat selection + +Hi, + +I have made a PCB plugin which intends to help auto-routing with variable track width. +You can download it from here: + +http://ratsel.googlecode.com/files/RatSel.tar.bz2 + +There is a quick introduction under the doc directory. + +Any feedback is welcome. + +Cheers, +Endre + +_______________________________________________ +geda-dev mailing list +geda-dev@moria.seul.org +http://www.seul.org/cgi-bin/mailman/listinfo/geda-dev Index: pcb-plugins_sources/doc/renumberblock.txt =================================================================== --- pcb-plugins_sources/doc/renumberblock.txt (nonexistent) +++ pcb-plugins_sources/doc/renumberblock.txt (revision 3870) @@ -0,0 +1,74 @@ +From: DJ Delorie [dj AT delorie DOT com] +Date: friday 12 september 2008 5:38 +To: geda-user AT moria DOT seul DOT org +Subject: gEDA-user: RenumberBuffer() + + +http://www.delorie.com/pcb/renumberblock.c + +I added RenumberBuffer() to my RenumberBlock() plug in. It does the same thing, but to the paste buffer. Why? I needed twenty copies of a block on a board, and not in a simple grid: + +LoadFrom(Layout,powermeter.pcb) +LoadFrom(LayoutToBuffer,channel1.pcb) + +# left upper + +PasteBuffer(ToLayout,0,30000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,0,80000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,0,130000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,0,180000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,0,230000) + +# Now skip 300 more for the next five + +RenumberBuffer(0,10) +PasteBuffer(ToLayout,0,310000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,0,360000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,0,410000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,0,460000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,0,510000) + +# Other side +pastebuffer(Rotate,2) + +RenumberBuffer(0,10) +PasteBuffer(ToLayout,250000,90000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,250000,140000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,250000,190000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,250000,240000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,250000,290000) + +# skip + +RenumberBuffer(0,10) +PasteBuffer(ToLayout,250000,370000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,250000,420000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,250000,470000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,250000,520000) +RenumberBuffer(0,10) +PasteBuffer(ToLayout,250000,570000) + +SaveTo(LayoutAs,djtest.pcb) +Quit() + + + +_______________________________________________ +geda-user mailing list +geda-user@moria.seul.org +http://www.seul.org/cgi-bin/mailman/listinfo/geda-user Index: pcb-plugins_sources/doc/sedrename.txt =================================================================== --- pcb-plugins_sources/doc/sedrename.txt (nonexistent) +++ pcb-plugins_sources/doc/sedrename.txt (revision 3870) @@ -0,0 +1,30 @@ +From: Peter Clifton +To: geda-dev +Date: Tue, 10 Jun 2008 22:09:49 +0100 +Subject: gEDA-dev: sedrename action for PCB + +This was / is a crufty hack which saved me quite a bit of time today, it +renames the selected elements in PCB by applying a sed expression to +them. + +Enjoy, but don't come to me if it eats your homework. + +Best wishes, + +-- +Peter Clifton + +Electrical Engineering Division, +Engineering Department, +University of Cambridge, +9, JJ Thomson Avenue, +Cambridge +CB3 0FA + +Tel: +44 (0)7729 980173 - (No signal in the lab!) + + +_______________________________________________ +geda-dev mailing list +geda-dev@moria.seul.org +http://www.seul.org/cgi-bin/mailman/listinfo/geda-dev Index: pcb-plugins_sources/doc/smartdisperse.txt =================================================================== --- pcb-plugins_sources/doc/smartdisperse.txt (nonexistent) +++ pcb-plugins_sources/doc/smartdisperse.txt (revision 3870) @@ -0,0 +1,38 @@ +From: Ben Jackson +To: geda-user@moria.seul.org +Date: Sat, 24 Feb 2007 17:51:23 -0800 +Subject: A (premature) release of SmartDisperse plugin + +My first test board for PCB involved an array of LEDs, and even with just +a few components it got really annoying searching for the resistors that +went with each LED after the DisperseElements(). + +My head was filled with grandiose schemes for improving Disperse without +turning it into autoplace. I've written something that does a better job +than the stock function, with a better framework for changing the placement +order if you come up with a better algorithm. The actual placement +algorithm is fairly weak, but it's still a dramatic improvement (compare +a ratsnest after the two disperses). + +In the spirit of open source I cast this hack upon the waters for someone +else to improve. Ultimately I think the PCB data structures are so bad, +especially from the perspective of a plugin, that a really good plugin would +have to construct a whole new element/netlist representation internally. + +Get your copy from: + + http://ad7gd.net/geda/smartdisperse.c + +Compile/install: + + PCB=$(HOME)/cvs/pcb + gcc -I$(PCB) -I$(PCB)/src -g -O2 -shared autocrop.c -o autocrop.so + cp smartdisperse.so $(HOME)/.pcb/plugins/ + +Run with :SmartDisperse() or :SmartDisperse(Selected) (you can also +say All, but it's the default). + +-- +Ben Jackson AD7GD + +http://www.ben.com/ Index: pcb-plugins_sources/doc/teardrops/sz=468x60B.htm =================================================================== --- pcb-plugins_sources/doc/teardrops/sz=468x60B.htm (nonexistent) +++ pcb-plugins_sources/doc/teardrops/sz=468x60B.htm (revision 3870) @@ -0,0 +1 @@ +
\ No newline at end of file Property changes on: pcb-plugins_sources/doc/teardrops/sz=468x60B.htm ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: pcb-plugins_sources/doc/teardrops/td-ex1.jpg =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/teardrops/td-ex1.jpg =================================================================== --- pcb-plugins_sources/doc/teardrops/td-ex1.jpg (nonexistent) +++ pcb-plugins_sources/doc/teardrops/td-ex1.jpg (revision 3870) Property changes on: pcb-plugins_sources/doc/teardrops/td-ex1.jpg ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/teardrops/td-ex1.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/teardrops/td-ex1.png =================================================================== --- pcb-plugins_sources/doc/teardrops/td-ex1.png (nonexistent) +++ pcb-plugins_sources/doc/teardrops/td-ex1.png (revision 3870) Property changes on: pcb-plugins_sources/doc/teardrops/td-ex1.png ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/teardrops/td-ex2.jpg =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/teardrops/td-ex2.jpg =================================================================== --- pcb-plugins_sources/doc/teardrops/td-ex2.jpg (nonexistent) +++ pcb-plugins_sources/doc/teardrops/td-ex2.jpg (revision 3870) Property changes on: pcb-plugins_sources/doc/teardrops/td-ex2.jpg ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/teardrops/td-ex2.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/teardrops/td-ex2.png =================================================================== --- pcb-plugins_sources/doc/teardrops/td-ex2.png (nonexistent) +++ pcb-plugins_sources/doc/teardrops/td-ex2.png (revision 3870) Property changes on: pcb-plugins_sources/doc/teardrops/td-ex2.png ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/teardrops/td-ex3.jpg =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/teardrops/td-ex3.jpg =================================================================== --- pcb-plugins_sources/doc/teardrops/td-ex3.jpg (nonexistent) +++ pcb-plugins_sources/doc/teardrops/td-ex3.jpg (revision 3870) Property changes on: pcb-plugins_sources/doc/teardrops/td-ex3.jpg ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/teardrops/td-ex3.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/teardrops/td-ex3.png =================================================================== --- pcb-plugins_sources/doc/teardrops/td-ex3.png (nonexistent) +++ pcb-plugins_sources/doc/teardrops/td-ex3.png (revision 3870) Property changes on: pcb-plugins_sources/doc/teardrops/td-ex3.png ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/teardrops/td-ex4.jpg =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/teardrops/td-ex4.jpg =================================================================== --- pcb-plugins_sources/doc/teardrops/td-ex4.jpg (nonexistent) +++ pcb-plugins_sources/doc/teardrops/td-ex4.jpg (revision 3870) Property changes on: pcb-plugins_sources/doc/teardrops/td-ex4.jpg ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/teardrops/td-ex4.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/teardrops/td-ex4.png =================================================================== --- pcb-plugins_sources/doc/teardrops/td-ex4.png (nonexistent) +++ pcb-plugins_sources/doc/teardrops/td-ex4.png (revision 3870) Property changes on: pcb-plugins_sources/doc/teardrops/td-ex4.png ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/teardrops/td-ex5.jpg =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/teardrops/td-ex5.jpg =================================================================== --- pcb-plugins_sources/doc/teardrops/td-ex5.jpg (nonexistent) +++ pcb-plugins_sources/doc/teardrops/td-ex5.jpg (revision 3870) Property changes on: pcb-plugins_sources/doc/teardrops/td-ex5.jpg ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/teardrops/td-ex5.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: pcb-plugins_sources/doc/teardrops/td-ex5.png =================================================================== --- pcb-plugins_sources/doc/teardrops/td-ex5.png (nonexistent) +++ pcb-plugins_sources/doc/teardrops/td-ex5.png (revision 3870) Property changes on: pcb-plugins_sources/doc/teardrops/td-ex5.png ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: pcb-plugins_sources/doc/teardrops/teardrops.html =================================================================== --- pcb-plugins_sources/doc/teardrops/teardrops.html (nonexistent) +++ pcb-plugins_sources/doc/teardrops/teardrops.html (revision 3870) @@ -0,0 +1,101 @@ + + +Teardrops Plug-in for PCB + + + +
+ + + + +
  http://www.delorie.com//pcb/teardrops/  search   +
Teardrops +Plug-in for PCB +

+

Download: teardrops.c +(4k)

The Teardrops plug-in adds teardrops to the intersections between traces +and pins/vias. This is a simplistic test, so there are cases where you'd think +it would add them but doesn't: +
    +
  • If the trace doesn't end at *exactly* the same point as the pin/via, it + will be skipped. This often happens with metric parts on an English grid or + visa-versa. +

    +
  • If a trace passes through a pin/via but doesn't end there, there + won't be any teardrops. Use :djopt(none) to split those lines into + two segments, each of which ends at the pin/via. +

+

Install

Compile like this:
gcc -I$HOME/geda/pcb-cvs/src -I$HOME/geda/pcb-cvs -O2 -shared teardrops.c -o teardrops.so
+
+

The resulting teardrops.so goes in $HOME/.pcb/plugins/teardrops.so - +note that the name is important; pcb uses the name to find the init +function.

+

The plug-in is loaded when you restart pcb.

+

Usage

+

This plug-in exports a single action Teardrops() which takes no +parameters. To invoke it, use the command window, usually by typing :. +Example:

:Teardrops()
+
With the lesstif HID you can add this action to your menu or a hotkey by +editing $HOME/.pcb/pcb-menu.res (grab a copy from the pcb +source if you haven't one there yet). +

Known Bugs

+
    +
  • Square pins are teardropped too
+

Examples


+

+ + + + + + + +
  webmaster   + donations +   bookstore     delorie software   privacy   +
  Copyright © + 2006   by + DJ Delorie     Updated Dec 1 2006 +  
+
+ +
Please take a moment to fill out +this visitor +survey
You can help support this site by visiting +the advertisers that sponsor it! (only once each, though) +
Index: pcb-plugins_sources/examples/polycombine/uc.pcb =================================================================== --- pcb-plugins_sources/examples/polycombine/uc.pcb (nonexistent) +++ pcb-plugins_sources/examples/polycombine/uc.pcb (revision 3870) @@ -0,0 +1,2174 @@ +# release: pcb 1.99z +# date: Mon Jun 7 02:26:08 2010 +# user: pcjc2 (Peter Clifton,,,) +# host: pcjc2lap + +# To read pcb files, the pcb version (or the git source date) must be >= the file version +FileVersion[20100606] + +PCB["" 140000 30000] + +Grid[2000.000000 0 0 0] +Cursor[0 0 0.000000] +PolyArea[200000000.000000] +Thermal[0.500000] +DRC[787 787 787 787 1500 1000] +Flags("nameonpcb,uniquename,clearnew,snappin") +Groups("1,c:2,s:3:4:5:6:7:8") +Styles["Signal,1000,3600,2000,1000:Power,2500,6000,3500,1000:Fat,4000,6000,3500,1000:Skinny,600,2402,1181,600"] + +Symbol(' ' 18) +( +) +Symbol('!' 12) +( + SymbolLine(0 45 0 50 8) + SymbolLine(0 10 0 35 8) +) +Symbol('"' 12) +( + SymbolLine(0 10 0 20 8) + SymbolLine(10 10 10 20 8) +) +Symbol('#' 12) +( + SymbolLine(0 35 20 35 8) + SymbolLine(0 25 20 25 8) + SymbolLine(15 20 15 40 8) + SymbolLine(5 20 5 40 8) +) +Symbol('$' 12) +( + SymbolLine(15 15 20 20 8) + SymbolLine(5 15 15 15 8) + SymbolLine(0 20 5 15 8) + SymbolLine(0 20 0 25 8) + SymbolLine(0 25 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 40 8) + SymbolLine(15 45 20 40 8) + SymbolLine(5 45 15 45 8) + SymbolLine(0 40 5 45 8) + SymbolLine(10 10 10 50 8) +) +Symbol('%' 12) +( + SymbolLine(0 15 0 20 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 10 10 8) + SymbolLine(10 10 15 15 8) + SymbolLine(15 15 15 20 8) + SymbolLine(10 25 15 20 8) + SymbolLine(5 25 10 25 8) + SymbolLine(0 20 5 25 8) + SymbolLine(0 50 40 10 8) + SymbolLine(35 50 40 45 8) + SymbolLine(40 40 40 45 8) + SymbolLine(35 35 40 40 8) + SymbolLine(30 35 35 35 8) + SymbolLine(25 40 30 35 8) + SymbolLine(25 40 25 45 8) + SymbolLine(25 45 30 50 8) + SymbolLine(30 50 35 50 8) +) +Symbol('&' 12) +( + SymbolLine(0 45 5 50 8) + SymbolLine(0 15 0 25 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 35 15 20 8) + SymbolLine(5 50 10 50 8) + SymbolLine(10 50 20 40 8) + SymbolLine(0 25 25 50 8) + SymbolLine(5 10 10 10 8) + SymbolLine(10 10 15 15 8) + SymbolLine(15 15 15 20 8) + SymbolLine(0 35 0 45 8) +) +Symbol(''' 12) +( + SymbolLine(0 20 10 10 8) +) +Symbol('(' 12) +( + SymbolLine(0 45 5 50 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 45 8) +) +Symbol(')' 12) +( + SymbolLine(0 10 5 15 8) + SymbolLine(5 15 5 45 8) + SymbolLine(0 50 5 45 8) +) +Symbol('*' 12) +( + SymbolLine(0 20 20 40 8) + SymbolLine(0 40 20 20 8) + SymbolLine(0 30 20 30 8) + SymbolLine(10 20 10 40 8) +) +Symbol('+' 12) +( + SymbolLine(0 30 20 30 8) + SymbolLine(10 20 10 40 8) +) +Symbol(',' 12) +( + SymbolLine(0 60 10 50 8) +) +Symbol('-' 12) +( + SymbolLine(0 30 20 30 8) +) +Symbol('.' 12) +( + SymbolLine(0 50 5 50 8) +) +Symbol('/' 12) +( + SymbolLine(0 45 30 15 8) +) +Symbol('0' 12) +( + SymbolLine(0 45 5 50 8) + SymbolLine(0 15 0 45 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 40 20 20 8) +) +Symbol('1' 12) +( + SymbolLine(5 50 15 50 8) + SymbolLine(10 10 10 50 8) + SymbolLine(0 20 10 10 8) +) +Symbol('2' 12) +( + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 25 8) + SymbolLine(0 50 25 25 8) + SymbolLine(0 50 25 50 8) +) +Symbol('3' 12) +( + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 30 20 30 8) +) +Symbol('4' 12) +( + SymbolLine(0 30 20 10 8) + SymbolLine(0 30 25 30 8) + SymbolLine(20 10 20 50 8) +) +Symbol('5' 12) +( + SymbolLine(0 10 20 10 8) + SymbolLine(0 10 0 30 8) + SymbolLine(0 30 5 25 8) + SymbolLine(5 25 15 25 8) + SymbolLine(15 25 20 30 8) + SymbolLine(20 30 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('6' 12) +( + SymbolLine(15 10 20 15 8) + SymbolLine(5 10 15 10 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(15 30 20 35 8) + SymbolLine(0 30 15 30 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(20 35 20 45 8) +) +Symbol('7' 12) +( + SymbolLine(0 50 25 25 8) + SymbolLine(25 10 25 25 8) + SymbolLine(0 10 25 10 8) +) +Symbol('8' 12) +( + SymbolLine(0 45 5 50 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 25 5 30 8) + SymbolLine(0 15 0 25 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 25 8) + SymbolLine(15 30 20 25 8) +) +Symbol('9' 12) +( + SymbolLine(0 50 20 30 8) + SymbolLine(20 15 20 30 8) + SymbolLine(15 10 20 15 8) + SymbolLine(5 10 15 10 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 25 8) + SymbolLine(0 25 5 30 8) + SymbolLine(5 30 20 30 8) +) +Symbol(':' 12) +( + SymbolLine(0 25 5 25 8) + SymbolLine(0 35 5 35 8) +) +Symbol(';' 12) +( + SymbolLine(0 50 10 40 8) + SymbolLine(10 25 10 30 8) +) +Symbol('<' 12) +( + SymbolLine(0 30 10 20 8) + SymbolLine(0 30 10 40 8) +) +Symbol('=' 12) +( + SymbolLine(0 25 20 25 8) + SymbolLine(0 35 20 35 8) +) +Symbol('>' 12) +( + SymbolLine(0 20 10 30 8) + SymbolLine(0 40 10 30 8) +) +Symbol('?' 12) +( + SymbolLine(10 30 10 35 8) + SymbolLine(10 45 10 50 8) + SymbolLine(0 15 0 20 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 20 8) + SymbolLine(10 30 20 20 8) +) +Symbol('@' 12) +( + SymbolLine(0 10 0 40 8) + SymbolLine(0 40 10 50 8) + SymbolLine(10 50 40 50 8) + SymbolLine(50 35 50 10 8) + SymbolLine(50 10 40 0 8) + SymbolLine(40 0 10 0 8) + SymbolLine(10 0 0 10 8) + SymbolLine(15 20 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 30 35 8) + SymbolLine(30 35 35 30 8) + SymbolLine(35 30 40 35 8) + SymbolLine(35 30 35 15 8) + SymbolLine(35 20 30 15 8) + SymbolLine(20 15 30 15 8) + SymbolLine(20 15 15 20 8) + SymbolLine(40 35 50 35 8) +) +Symbol('A' 12) +( + SymbolLine(0 15 0 50 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 50 8) + SymbolLine(0 30 25 30 8) +) +Symbol('B' 12) +( + SymbolLine(0 50 20 50 8) + SymbolLine(20 50 25 45 8) + SymbolLine(25 35 25 45 8) + SymbolLine(20 30 25 35 8) + SymbolLine(5 30 20 30 8) + SymbolLine(5 10 5 50 8) + SymbolLine(0 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 25 8) + SymbolLine(20 30 25 25 8) +) +Symbol('C' 12) +( + SymbolLine(5 50 20 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(0 15 0 45 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 20 10 8) +) +Symbol('D' 12) +( + SymbolLine(5 10 5 50 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 45 8) + SymbolLine(20 50 25 45 8) + SymbolLine(0 50 20 50 8) + SymbolLine(0 10 20 10 8) +) +Symbol('E' 12) +( + SymbolLine(0 30 15 30 8) + SymbolLine(0 50 20 50 8) + SymbolLine(0 10 0 50 8) + SymbolLine(0 10 20 10 8) +) +Symbol('F' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 10 20 10 8) + SymbolLine(0 30 15 30 8) +) +Symbol('G' 12) +( + SymbolLine(20 10 25 15 8) + SymbolLine(5 10 20 10 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 20 50 8) + SymbolLine(20 50 25 45 8) + SymbolLine(25 35 25 45 8) + SymbolLine(20 30 25 35 8) + SymbolLine(10 30 20 30 8) +) +Symbol('H' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(25 10 25 50 8) + SymbolLine(0 30 25 30 8) +) +Symbol('I' 12) +( + SymbolLine(0 10 10 10 8) + SymbolLine(5 10 5 50 8) + SymbolLine(0 50 10 50 8) +) +Symbol('J' 12) +( + SymbolLine(0 10 15 10 8) + SymbolLine(15 10 15 45 8) + SymbolLine(10 50 15 45 8) + SymbolLine(5 50 10 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('K' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 30 20 10 8) + SymbolLine(0 30 20 50 8) +) +Symbol('L' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 50 20 50 8) +) +Symbol('M' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 10 15 25 8) + SymbolLine(15 25 30 10 8) + SymbolLine(30 10 30 50 8) +) +Symbol('N' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 10 0 15 8) + SymbolLine(0 15 25 40 8) + SymbolLine(25 10 25 50 8) +) +Symbol('O' 12) +( + SymbolLine(0 15 0 45 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('P' 12) +( + SymbolLine(5 10 5 50 8) + SymbolLine(0 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 25 8) + SymbolLine(20 30 25 25 8) + SymbolLine(5 30 20 30 8) +) +Symbol('Q' 12) +( + SymbolLine(0 15 0 45 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(10 40 20 50 8) +) +Symbol('R' 12) +( + SymbolLine(0 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 25 8) + SymbolLine(20 30 25 25 8) + SymbolLine(5 30 20 30 8) + SymbolLine(5 10 5 50 8) + SymbolLine(5 30 25 50 8) +) +Symbol('S' 12) +( + SymbolLine(20 10 25 15 8) + SymbolLine(5 10 20 10 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 25 8) + SymbolLine(0 25 5 30 8) + SymbolLine(5 30 20 30 8) + SymbolLine(20 30 25 35 8) + SymbolLine(25 35 25 45 8) + SymbolLine(20 50 25 45 8) + SymbolLine(5 50 20 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('T' 12) +( + SymbolLine(0 10 20 10 8) + SymbolLine(10 10 10 50 8) +) +Symbol('U' 12) +( + SymbolLine(0 10 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(20 10 20 45 8) +) +Symbol('V' 12) +( + SymbolLine(0 10 0 40 8) + SymbolLine(0 40 10 50 8) + SymbolLine(10 50 20 40 8) + SymbolLine(20 10 20 40 8) +) +Symbol('W' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 50 15 35 8) + SymbolLine(15 35 30 50 8) + SymbolLine(30 10 30 50 8) +) +Symbol('X' 12) +( + SymbolLine(0 10 0 15 8) + SymbolLine(0 15 25 40 8) + SymbolLine(25 40 25 50 8) + SymbolLine(0 40 0 50 8) + SymbolLine(0 40 25 15 8) + SymbolLine(25 10 25 15 8) +) +Symbol('Y' 12) +( + SymbolLine(0 10 0 15 8) + SymbolLine(0 15 10 25 8) + SymbolLine(10 25 20 15 8) + SymbolLine(20 10 20 15 8) + SymbolLine(10 25 10 50 8) +) +Symbol('Z' 12) +( + SymbolLine(0 10 25 10 8) + SymbolLine(25 10 25 15 8) + SymbolLine(0 40 25 15 8) + SymbolLine(0 40 0 50 8) + SymbolLine(0 50 25 50 8) +) +Symbol('[' 12) +( + SymbolLine(0 10 5 10 8) + SymbolLine(0 10 0 50 8) + SymbolLine(0 50 5 50 8) +) +Symbol('\' 12) +( + SymbolLine(0 15 30 45 8) +) +Symbol(']' 12) +( + SymbolLine(0 10 5 10 8) + SymbolLine(5 10 5 50 8) + SymbolLine(0 50 5 50 8) +) +Symbol('^' 12) +( + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 10 15 8) +) +Symbol('_' 12) +( + SymbolLine(0 50 20 50 8) +) +Symbol('a' 12) +( + SymbolLine(15 30 20 35 8) + SymbolLine(5 30 15 30 8) + SymbolLine(0 35 5 30 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(20 30 20 45 8) + SymbolLine(20 45 25 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) +) +Symbol('b' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(20 35 20 45 8) + SymbolLine(15 30 20 35 8) + SymbolLine(5 30 15 30 8) + SymbolLine(0 35 5 30 8) +) +Symbol('c' 12) +( + SymbolLine(5 30 20 30 8) + SymbolLine(0 35 5 30 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 20 50 8) +) +Symbol('d' 12) +( + SymbolLine(20 10 20 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) +) +Symbol('e' 12) +( + SymbolLine(5 50 20 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(0 40 20 40 8) + SymbolLine(20 40 20 35 8) +) +Symbol('f' 10) +( + SymbolLine(5 15 5 50 8) + SymbolLine(5 15 10 10 8) + SymbolLine(10 10 15 10 8) + SymbolLine(0 30 10 30 8) +) +Symbol('g' 12) +( + SymbolLine(15 30 20 35 8) + SymbolLine(5 30 15 30 8) + SymbolLine(0 35 5 30 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(0 60 5 65 8) + SymbolLine(5 65 15 65 8) + SymbolLine(15 65 20 60 8) + SymbolLine(20 30 20 60 8) +) +Symbol('h' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 50 8) +) +Symbol('i' 10) +( + SymbolLine(0 20 0 25 8) + SymbolLine(0 35 0 50 8) +) +Symbol('j' 10) +( + SymbolLine(5 20 5 25 8) + SymbolLine(5 35 5 60 8) + SymbolLine(0 65 5 60 8) +) +Symbol('k' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 35 15 50 8) + SymbolLine(0 35 10 25 8) +) +Symbol('l' 10) +( + SymbolLine(0 10 0 45 8) + SymbolLine(0 45 5 50 8) +) +Symbol('m' 12) +( + SymbolLine(5 35 5 50 8) + SymbolLine(5 35 10 30 8) + SymbolLine(10 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 50 8) + SymbolLine(20 35 25 30 8) + SymbolLine(25 30 30 30 8) + SymbolLine(30 30 35 35 8) + SymbolLine(35 35 35 50 8) + SymbolLine(0 30 5 35 8) +) +Symbol('n' 12) +( + SymbolLine(5 35 5 50 8) + SymbolLine(5 35 10 30 8) + SymbolLine(10 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 50 8) + SymbolLine(0 30 5 35 8) +) +Symbol('o' 12) +( + SymbolLine(0 35 0 45 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('p' 12) +( + SymbolLine(5 35 5 65 8) + SymbolLine(0 30 5 35 8) + SymbolLine(5 35 10 30 8) + SymbolLine(10 30 20 30 8) + SymbolLine(20 30 25 35 8) + SymbolLine(25 35 25 45 8) + SymbolLine(20 50 25 45 8) + SymbolLine(10 50 20 50 8) + SymbolLine(5 45 10 50 8) +) +Symbol('q' 12) +( + SymbolLine(20 35 20 65 8) + SymbolLine(15 30 20 35 8) + SymbolLine(5 30 15 30 8) + SymbolLine(0 35 5 30 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) +) +Symbol('r' 12) +( + SymbolLine(5 35 5 50 8) + SymbolLine(5 35 10 30 8) + SymbolLine(10 30 20 30 8) + SymbolLine(0 30 5 35 8) +) +Symbol('s' 12) +( + SymbolLine(5 50 20 50 8) + SymbolLine(20 50 25 45 8) + SymbolLine(20 40 25 45 8) + SymbolLine(5 40 20 40 8) + SymbolLine(0 35 5 40 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 20 30 8) + SymbolLine(20 30 25 35 8) + SymbolLine(0 45 5 50 8) +) +Symbol('t' 10) +( + SymbolLine(5 10 5 45 8) + SymbolLine(5 45 10 50 8) + SymbolLine(0 25 10 25 8) +) +Symbol('u' 12) +( + SymbolLine(0 30 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(20 30 20 45 8) +) +Symbol('v' 12) +( + SymbolLine(0 30 0 40 8) + SymbolLine(0 40 10 50 8) + SymbolLine(10 50 20 40 8) + SymbolLine(20 30 20 40 8) +) +Symbol('w' 12) +( + SymbolLine(0 30 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 10 50 8) + SymbolLine(10 50 15 45 8) + SymbolLine(15 30 15 45 8) + SymbolLine(15 45 20 50 8) + SymbolLine(20 50 25 50 8) + SymbolLine(25 50 30 45 8) + SymbolLine(30 30 30 45 8) +) +Symbol('x' 12) +( + SymbolLine(0 30 20 50 8) + SymbolLine(0 50 20 30 8) +) +Symbol('y' 12) +( + SymbolLine(0 30 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(20 30 20 60 8) + SymbolLine(15 65 20 60 8) + SymbolLine(5 65 15 65 8) + SymbolLine(0 60 5 65 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) +) +Symbol('z' 12) +( + SymbolLine(0 30 20 30 8) + SymbolLine(0 50 20 30 8) + SymbolLine(0 50 20 50 8) +) +Symbol('{' 12) +( + SymbolLine(5 15 10 10 8) + SymbolLine(5 15 5 25 8) + SymbolLine(0 30 5 25 8) + SymbolLine(0 30 5 35 8) + SymbolLine(5 35 5 45 8) + SymbolLine(5 45 10 50 8) +) +Symbol('|' 12) +( + SymbolLine(0 10 0 50 8) +) +Symbol('}' 12) +( + SymbolLine(0 10 5 15 8) + SymbolLine(5 15 5 25 8) + SymbolLine(5 25 10 30 8) + SymbolLine(5 35 10 30 8) + SymbolLine(5 35 5 45 8) + SymbolLine(0 50 5 45 8) +) +Symbol('~' 12) +( + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 10 30 8) + SymbolLine(10 30 15 35 8) + SymbolLine(15 35 20 35 8) + SymbolLine(20 35 25 30 8) +) +Layer(1 "component") +( +) +Layer(2 "solder") +( +) +Layer(3 "outline") +( +) +Layer(4 "GND") +( +) +Layer(5 "power") +( +) +Layer(6 "signal1") +( +) +Layer(7 "signal2") +( +) +Layer(8 "signal3") +( +) +Layer(9 "signal9") +( +) +Layer(10 "silk") +( + Polygon("clearpoly,selected") + ( + [39463 646] [39463 999] [39230 999] [38937 1015] [38638 1129] + [38400 1449] [38307 2078] [38307 6500] [38085 8269] [37412 9522] + [36289 10271] [34705 10520] [32925 10308] [31678 9679] [30940 8610] + [30701 7091] [30701 2078] [30598 1449] [30343 1129] [29985 1015] + [29600 999] [29491 999] [29491 646] [29692 646] [30159 646] + [30799 646] [31537 646] [32269 646] [32909 646] [33376 646] + [33582 646] [33582 999] [33474 999] [33077 1015] [32709 1129] + [32432 1449] [32329 2078] [32329 6863] [32486 8214] [32980 9169] + [33805 9744] [34965 9934] [36105 9728] [36930 9137] [37429 8155] + [37602 6809] [37602 2078] [37499 1449] [37250 1129] [36913 1015] + [36571 999] [36349 999] [36349 646] [36864 646] [37906 646] + [38942 646] [39463 646] + ) + Polygon("clearpoly,selected") + ( + [43885 9956] [43885 10308] [43738 10308] [43359 10308] [42816 10308] + [42192 10308] [41568 10308] [41009 10308] [40608 10308] [40434 10308] + [40434 9956] [40570 9956] [41243 9804] [41628 9402] [41801 8816] + [41845 8122] [41845 2317] [41747 1715] [41481 1308] [41069 1069] + [40554 999] [40434 999] [40434 646] [43147 646] [49023 7845] + [49023 2371] [48876 1633] [48540 1221] [48133 1037] [47786 999] + [47541 999] [47541 646] [47715 646] [48111 646] [48659 646] + [49283 646] [49901 646] [50449 646] [50845 646] [51025 646] + [51025 999] [50878 999] [50417 1042] [50015 1281] [49722 1829] + [49614 2832] [49614 10357] [49099 10363] [42436 2301] [42436 8117] + [42474 8811] [42653 9397] [43049 9804] [43749 9956] [43885 9956] + ) + Polygon("clearpoly,selected") + ( + [62396 8263] [64523 2322] [64685 1682] [64620 1275] [64317 1058] + [63779 999] [63600 999] [63600 646] [66351 646] [66351 999] + [66291 999] [65819 1123] [65380 1753] [62157 10347] [61544 10347] + [58050 1834] [57822 1400] [57567 1145] [57247 1026] [56857 999] + [56775 999] [56775 646] [56971 646] [57426 646] [58056 646] + [58772 646] [59483 646] [60112 646] [60568 646] [60768 646] + [60768 999] [60611 999] [60513 999] [60096 1069] [59868 1275] + [59803 1579] [59889 1948] [62396 8263] + ) + Polygon("clearpoly,selected") + ( + [78526 1102] [78520 5382] [79350 5382] [80321 5252] [80994 4845] + [81390 4151] [81520 3142] [81368 2274] [80951 1612] [80300 1188] + [79459 1042] [78526 1102] + ) + Polygon("clearpoly,selected") + ( + [80007 646] [81406 792] [82410 1237] [83007 1991] [83208 3055] + [83023 3961] [82567 4650] [81944 5138] [81293 5469] [81227 5496] + [83598 9104] [84163 9728] [84944 9950] [84944 10308] [84510 10308] + [83663 10308] [82833 10308] [82464 10308] [79589 5773] [78520 5773] + [78520 8784] [78607 9424] [78846 9777] [79220 9923] [79692 9956] + [79882 9956] [79882 10308] [79676 10308] [79193 10308] [78531 10308] + [77782 10308] [77028 10308] [76366 10308] [75883 10308] [75683 10308] + [75683 9956] [75873 9956] [76231 9912] [76556 9771] [76795 9522] + [76893 9147] [76893 2122] [76779 1471] [76513 1134] [76176 1015] + [75873 999] [75683 999] [75683 646] [75894 646] [76399 646] + [77093 646] [77880 646] [78661 646] [79345 646] [79822 646] + [80007 646] + ) + Polygon("clearpoly,selected") + ( + [90049 8475] [89875 7710] [89425 7151] [88796 6717] [88096 6348] + [87260 5892] [86495 5323] [85937 4525] [85725 3391] [85958 2214] + [86615 1319] [87624 749] [88920 548] [90071 635] [90939 782] + [91069 2664] [90711 2713] [90516 2019] [90163 1465] [89637 1096] + [88915 966] [88188 1080] [87613 1427] [87233 1991] [87098 2762] + [87266 3467] [87716 3999] [88340 4411] [89040 4775] [89903 5225] + [90700 5800] [91275 6603] [91503 7748] [91199 9039] [90407 9940] + [89311 10460] [88085 10634] [86967 10515] [85795 10091] [85562 7997] + [85915 7938] [86224 8865] [86734 9554] [87412 9978] [88226 10129] + [88975 10005] [89550 9668] [89919 9142] [90049 8475] + ) + Polygon("clearpoly,selected") + ( + [96945 646] [96945 999] [96809 999] [96408 1026] [96066 1140] + [95832 1400] [95746 1856] [95746 9104] [95832 9549] [96066 9809] + [96408 9923] [96809 9956] [96945 9956] [96945 10308] [96744 10308] + [96283 10308] [95648 10308] [94926 10308] [94199 10308] [93565 10308] + [93104 10308] [92908 10308] [92908 9956] [93044 9956] [93440 9923] + [93776 9809] [94009 9549] [94102 9104] [94102 1856] [94009 1400] + [93776 1140] [93440 1026] [93044 999] [92908 999] [92908 646] + [93104 646] [93565 646] [94199 646] [94926 646] [95648 646] + [96283 646] [96744 646] [96945 646] + ) + Polygon("clearpoly,selected") + ( + [56217 646] [56217 999] [56075 999] [55674 1026] [55338 1140] + [55104 1400] [55018 1856] [55018 9104] [55104 9549] [55338 9809] + [55674 9923] [56075 9956] [56217 9956] [56217 10308] [56016 10308] + [55555 10308] [54920 10308] [54198 10308] [53471 10308] [52837 10308] + [52375 10308] [52180 10308] [52180 9956] [52316 9956] [52712 9923] + [53048 9809] [53281 9549] [53374 9104] [53374 1856] [53281 1400] + [53048 1140] [52712 1026] [52316 999] [52180 999] [52180 646] + [52375 646] [52837 646] [53471 646] [54198 646] [54920 646] + [55555 646] [56016 646] [56217 646] + ) + Polygon("clearpoly,selected") + ( + [136658 14605] [136691 17166] [136523 17210] [136284 17275] [136159 16477] + [135850 15831] [135220 15392] [134146 15235] [131732 15235] [131732 19976] + [133805 19976] [134434 19868] [134841 19570] [135079 19081] [135210 18430] + [135622 18430] [135622 18636] [135622 19103] [135622 19743] [135622 20459] + [135622 21175] [135622 21794] [135622 22228] [135622 22396] [135210 22402] + [135117 21740] [134900 21203] [134488 20845] [133810 20720] [131732 20720] + [131732 24881] [131911 25575] [132388 25939] [133077 26069] [133880 26091] + [134569 26080] [135177 26037] [135692 25944] [136137 25776] [136517 25516] + [136832 25136] [137103 24626] [137331 23964] [137564 24018] [137738 24056] + [137185 26726] [136799 26726] [135796 26726] [134369 26726] [132730 26726] + [131086 26726] [129643 26726] [128607 26726] [128184 26726] [128184 26281] + [128357 26281] [128851 26243] [129280 26096] [129573 25776] [129687 25212] + [129687 16119] [129573 15549] [129280 15224] [128851 15077] [128357 15045] + [128184 15045] [128184 14605] [128585 14605] [129562 14605] [130924 14605] + [132470 14605] [134011 14605] [135351 14605] [136295 14605] [136658 14605] + ) + Polygon("clearpoly,selected") + ( + [85758 15175] [85758 20541] [86794 20541] [88014 20378] [88861 19873] + [89349 19000] [89512 17730] [89322 16640] [88801 15810] [87987 15284] + [86929 15099] [85758 15175] + ) + Polygon("clearpoly,selected") + ( + [87618 14605] [89376 14790] [90635 15349] [91384 16293] [91639 17622] + [91411 18761] [90830 19618] [90049 20237] [89230 20655] [89148 20682] + [92127 25212] [92469 25679] [92838 25999] [93266 26188] [93809 26275] + [93809 26492] [93809 26726] [93635 26726] [93266 26726] [92767 26726] + [92208 26726] [91650 26726] [91172 26726] [90830 26726] [90705 26726] + [87098 21034] [85758 21034] [85758 24810] [85861 25613] [86165 26058] + [86631 26243] [87222 26281] [87461 26281] [87461 26726] [87201 26726] + [86599 26726] [85768 26726] [84824 26726] [83880 26726] [83050 26726] + [82448 26726] [82193 26726] [82193 26281] [82432 26281] [82877 26226] + [83289 26053] [83593 25738] [83712 25266] [83712 16450] [83571 15636] + [83240 15218] [82817 15067] [82432 15045] [82193 15045] [82193 14605] + [82459 14605] [83094 14605] [83962 14605] [84955 14605] [85931 14605] + [86788 14605] [87391 14605] [87618 14605] + ) + Polygon("clearpoly,selected") + ( + [99609 14600] [99609 15045] [99440 15045] [98936 15077] [98513 15224] + [98220 15549] [98111 16114] [98111 25212] [98220 25771] [98513 26096] + [98936 26243] [99440 26281] [99609 26281] [99609 26726] [99359 26726] + [98778 26726] [97981 26726] [97075 26726] [96169 26726] [95371 26726] + [94791 26726] [94547 26726] [94547 26281] [94715 26281] [95214 26243] + [95637 26096] [95930 25771] [96044 25212] [96044 16114] [95930 15549] + [95637 15224] [95214 15077] [94715 15045] [94547 15045] [94547 14600] + [94791 14600] [95371 14600] [96169 14600] [97075 14600] [97981 14600] + [98778 14600] [99359 14600] [99609 14600] + ) + Polygon("clearpoly,selected") + ( + [99044 646] [105435 646] [105935 548] [106238 147] [106548 141] + [106303 2664] [105956 2664] [105918 2192] [105777 1731] [105468 1378] + [104920 1237] [102967 1237] [102967 8697] [103059 9381] [103319 9761] + [103699 9918] [104150 9956] [104356 9956] [104356 10308] [104139 10308] + [103634 10308] [102940 10308] [102153 10308] [101361 10308] [100666 10308] + [100162 10308] [99950 10308] [99950 9956] [100156 9956] [100645 9923] + [101019 9777] [101252 9408] [101334 8724] [101334 1237] [99364 1237] + [98762 1319] [98409 1579] [98209 2019] [98068 2653] [97720 2653] + [97943 163] [98062 163] [98225 163] [98550 554] [99044 646] + ) + Polygon("clearpoly,selected") + ( + [116432 646] [116432 1004] [115743 1264] [115288 1769] [115179 1926] + [114903 2355] [114506 2963] [114062 3657] [113611 4351] [113215 4959] + [112939 5388] [112835 5551] [112835 8643] [112911 9365] [113150 9755] + [113519 9918] [114018 9956] [114224 9956] [114224 10308] [114007 10308] + [113503 10308] [112808 10308] [112022 10308] [111229 10308] [110535 10308] + [110031 10308] [109819 10308] [109819 9956] [110025 9956] [110530 9907] + [110899 9733] [111121 9365] [111202 8751] [111202 5784] [108539 1975] + [108246 1574] [107947 1264] [107605 1064] [107182 999] [107101 999] + [107101 646] [111094 646] [111094 999] [110969 999] [110519 1069] + [110313 1259] [110307 1536] [110475 1872] [112543 5068] [114365 2181] + [114604 1731] [114658 1351] [114441 1091] [113872 999] [113709 999] + [113714 646] [116432 646] + ) + Polygon("clearpoly,selected") + ( + [121158 5057] [121207 5952] [121359 6836] [121614 7672] [121972 8431] + [122444 9071] [123024 9576] [123719 9896] [124527 10016] [125911 9733] + [126898 8898] [127484 7498] [127679 5523] [127620 4688] [127457 3869] + [127185 3093] [126811 2398] [126328 1801] [125748 1346] [125070 1047] + [124299 944] [123323 1080] [122574 1449] [122021 1986] [121635 2637] + [121380 3326] [121234 4004] [121169 4601] [121158 5057] + ) + Polygon("clearpoly,selected") + ( + [119368 5551] [119465 4503] [119747 3538] [120198 2670] [120800 1916] + [121532 1292] [122373 825] [123312 532] [124326 434] [125417 521] + [126410 782] [127283 1199] [128037 1764] [128645 2463] [129095 3277] + [129377 4200] [129475 5214] [129377 6321] [129090 7341] [128640 8241] + [128037 9017] [127294 9652] [126426 10119] [125455 10417] [124391 10520] + [123339 10422] [122373 10146] [121521 9706] [120784 9115] [120187 8388] + [119742 7542] [119460 6587] [119368 5551] + ) + Polygon("clearpoly,selected") + ( + [130576 10308] [130576 9956] [130712 9956] [131108 9923] [131444 9809] + [131678 9549] [131770 9104] [131770 1856] [131678 1400] [131444 1140] + [131108 1026] [130712 999] [130576 999] [130576 646] [137331 646] + [137353 2691] [137027 2778] [136935 2171] [136723 1650] [136305 1286] + [135611 1151] [133403 1151] [133403 4932] [135340 4932] [135817 4823] + [136094 4552] [136224 4183] [136262 3798] [136577 3798] [136577 3798] + [136577 6896] [136262 6896] [136213 6424] [136056 5979] [135714 5648] + [135123 5523] [133403 5523] [133403 9104] [133522 9592] [133842 9847] + [134276 9940] [134759 9956] [134884 9956] [134884 10308] [130576 10308] + ) + Polygon("clearpoly,selected") + ( + [30256 20655] [30386 19315] [30777 18050] [31401 16906] [32247 15956] + [33186 15256] [34249 14741] [35416 14426] [36680 14318] [38839 14529] + [40787 15191] [40912 17996] [40516 18050] [40326 17448] [40087 16873] + [39789 16347] [39409 15880] [38931 15484] [38335 15186] [37608 14996] + [36729 14931] [35785 15023] [34944 15305] [34211 15766] [33593 16396] + [33105 17177] [32741 18110] [32519 19179] [32448 20383] [32508 21490] + [32703 22553] [33034 23541] [33511 24420] [34135 25152] [34922 25716] + [35866 26080] [36984 26210] [38242 26080] [39327 25711] [40255 25109] + [41047 24284] [41367 24881] [40440 25814] [39322 26492] [38047 26905] + [36658 27046] [35258 26937] [34005 26617] [32915 26096] [31992 25380] + [31249 24469] [30707 23373] [30370 22098] [30256 20655] + ) + Polygon("clearpoly,selected") + ( + [56396 16949] [56374 17269] [56330 18116] [56265 19315] [56195 20693] + [56119 22065] [56054 23264] [56010 24111] [55994 24436] [56048 25413] + [56325 25961] [56824 26205] [57551 26281] [57654 26281] [57654 26720] + [53569 26720] [53569 26281] [53721 26281] [54529 26107] [54974 25706] + [55175 25103] [55245 24338] [55723 16678] [55652 15978] [55365 15463] + [54893 15148] [54247 15039] [54106 15039] [54106 14595] [54291 14595] + [54692 14595] [55229 14595] [55842 14595] [56450 14595] [56982 14595] + [57367 14595] [57540 14595] [57589 14708] [57725 15012] [57931 15479] + [58197 16070] [58511 16765] [58859 17540] [59228 18371] [59613 19222] + [59993 20074] [60361 20899] [60709 21669] [61018 22358] [61278 22944] + [61479 23389] [61609 23682] [61658 23785] [61696 23682] [61821 23389] + [62011 22944] [62260 22358] [62548 21669] [62879 20899] [63226 20074] + [63590 19222] [63948 18371] [64300 17540] [64626 16765] [64924 16070] + [65174 15479] [65369 15012] [65499 14708] [65554 14595] [65722 14595] + [66118 14595] [66660 14595] [67268 14595] [67876 14595] [68402 14595] + [68776 14595] [68917 14595] [68917 15039] [68852 15039] [68022 15132] + [67545 15463] [67344 16119] [67349 17177] [67816 25217] [67946 25776] + [68239 26085] [68695 26226] [69313 26281] [69313 26715] [69058 26715] + [68483 26715] [67691 26715] [66796 26715] [65895 26715] [65103 26715] + [64528 26715] [64279 26715] [64279 26281] [64311 26275] [64875 26226] + [65326 26113] [65619 25847] [65727 25369] [65705 24501] [65689 24165] + [65646 23286] [65586 22044] [65521 20622] [65450 19201] [65391 17958] + [65347 17079] [65337 16748] [65288 16857] [65158 17172] [64951 17665] + [64685 18305] [64371 19060] [64018 19906] [63644 20807] [63253 21740] + [62863 22673] [62488 23579] [62136 24431] [61815 25196] [61544 25841] + [61338 26346] [61197 26677] [61148 26807] [60779 26807] [60720 26677] + [60579 26351] [60356 25858] [60074 25223] [59743 24474] [59374 23644] + [58978 22754] [58571 21837] [58164 20926] [57768 20042] [57399 19211] + [57074 18474] [56792 17850] [56580 17367] [56439 17058] [56396 16949] + ) + Polygon("clearpoly,selected") + ( + [105077 15180] [105077 24697] [105180 25467] [105511 25923] [106081 26134] + [106922 26188] [107991 26069] [108908 25733] [109673 25217] [110296 24545] + [110774 23752] [111110 22874] [111311 21935] [111381 20969] [111300 19559] + [111067 18354] [110676 17351] [110123 16537] [109412 15907] [108539 15468] + [107502 15202] [106309 15121] [105690 15137] [105077 15180] + ) + Polygon("clearpoly,selected") + ( + [101518 26726] [101518 26281] [101692 26281] [102185 26243] [102614 26096] + [102907 25771] [103021 25206] [103021 16114] [102907 15549] [102614 15224] + [102185 15077] [101692 15045] [101518 15045] [101518 14600] [106938 14595] + [108381 14687] [109689 14985] [110839 15484] [111821 16200] [112586 17090] + [113139 18137] [113481 19320] [113595 20628] [113470 21886] [113107 23085] + [112521 24181] [111740 25141] [110763 25885] [109656 26368] [108457 26639] + [107215 26720] [101518 26726] + ) + Polygon("clearpoly,selected") + ( + [123914 26102] [123914 23129] [123822 22695] [123561 22385] [123133 22195] + [122547 22136] [122400 22136] [122400 21702] [127061 21702] [127061 22136] + [126920 22136] [126176 22385] [125927 23129] [125921 26438] [123995 26888] + [121663 27078] [120225 26959] [118939 26606] [117816 26042] [116861 25277] + [116096 24322] [115537 23194] [115185 21902] [115071 20470] [115223 18973] + [115651 17692] [116319 16624] [117176 15756] [118185 15094] [119303 14622] + [120485 14340] [121695 14253] [122769 14302] [123805 14432] [124750 14627] + [125547 14855] [125737 17747] [125330 17774] [124864 16439] [124164 15539] + [123171 15029] [121814 14871] [120811 14963] [119916 15246] [119145 15701] + [118494 16325] [117979 17106] [117599 18034] [117366 19098] [117290 20291] + [117355 21430] [117561 22537] [117914 23573] [118413 24496] [119058 25277] + [119861 25879] [120822 26264] [121950 26406] [123035 26335] [123914 26102] + ) + Polygon("clearpoly,selected") + ( + [77082 20123] [78097 20248] [78905 20476] [79551 20812] [80099 21273] + [80701 22185] [80907 23291] [80826 23980] [80598 24626] [80235 25212] + [79752 25716] [79160 26134] [78477 26449] [77717 26650] [76898 26720] + [70957 26720] [70957 26281] [71196 26281] [71641 26221] [72053 26042] + [72357 25722] [72476 25250] [72476 16450] [72335 15636] [71999 15224] + [71581 15072] [71196 15050] [70957 15050] [70957 14605] [76339 14600] + [78016 14768] [79242 15273] [79996 16103] [80256 17253] [80180 17915] + [79969 18474] [79643 18940] [79225 19315] [78737 19613] [78205 19841] + [77641 20009] [77082 20123] + ) + Polygon("clearpoly,selected") + ( + [74598 15050] [74598 19917] [75509 19917] [76616 19765] [77430 19315] + [77923 18577] [78097 17557] [77945 16439] [77489 15658] [76741 15197] + [75694 15050] [74598 15050] + ) + Polygon("clearpoly,selected") + ( + [74598 20448] [74598 24713] [74674 25445] [74934 25917] [75428 26161] + [76204 26237] [77229 26020] [78048 25418] [78591 24512] [78791 23367] + [78580 22119] [77983 21208] [77034 20638] [75759 20448] [74598 20448] + ) + Polygon("found,clearpoly,selected") + ( + [46532 17074] [48225 21794] [44834 21794] [46532 17074] + ) + Polygon("clearpoly,selected") + ( + [46739 14600] [46695 14714] [46570 15045] [46380 15566] [46136 16233] + [45843 17025] [45518 17909] [45170 18853] [44812 19830] [44454 20807] + [44107 21751] [43782 22635] [43489 23427] [43245 24094] [43055 24615] + [42930 24946] [42892 25065] [42295 25939] [41357 26264] [41319 26264] + [41313 26720] [45002 26720] [45002 26264] [44845 26264] [44237 26199] + [43809 25977] [43619 25543] [43738 24838] [44617 22391] [48437 22391] + [49391 25055] [49478 25597] [49337 25982] [48974 26205] [48399 26281] + [48290 26281] [48290 26726] [52983 26726] [52989 26281] [52950 26281] + [52148 26009] [51605 25120] [47655 14600] [46739 14600] + ) + Polygon("clearpoly,selected") + ( + [73757 646] [73784 2691] [73648 2724] [73458 2773] [73361 2138] + [73111 1622] [72607 1275] [71749 1151] [69834 1151] [69834 4926] + [71478 4926] [71977 4840] [72308 4601] [72498 4216] [72601 3695] + [72927 3695] [72927 3858] [72927 4232] [72927 4742] [72927 5317] + [72927 5881] [72927 6375] [72927 6722] [72927 6858] [72601 6858] + [72531 6326] [72357 5903] [72026 5621] [71484 5518] [69834 5518] + [69834 8833] [69975 9386] [70355 9674] [70903 9782] [71543 9798] + [72574 9755] [73339 9549] [73898 9039] [74294 8106] [74478 8144] + [74614 8176] [74175 10303] [73871 10303] [73068 10303] [71928 10303] + [70626 10303] [69319 10303] [68169 10303] [67339 10303] [67002 10303] + [67002 9950] [67138 9950] [67534 9918] [67876 9804] [68109 9544] + [68201 9099] [68201 1850] [68109 1400] [67876 1140] [67534 1026] + [67138 999] [67002 999] [67002 646] [67317 646] [68098 646] + [69183 646] [70415 646] [71646 646] [72715 646] [73469 646] + [73757 646] + ) + Polygon("clearpoly,selected") + ( + [6390 532] [19406 532] [19997 527] [21321 527] [22579 499] + [24467 434] [25015 413] [24961 1134] [24934 1655] [24918 2078] + [24918 2507] [24907 4254] [24901 5909] [24901 6375] [24901 15164] + [24831 17204] [24592 18929] [24147 20400] [23453 21675] [22460 22819] + [21136 23894] [19427 24962] [17295 26080] [16590 26433] [15309 27078] + [14224 27632] [13530 27995] [13215 28163] [12895 28332] [12575 28163] + [12255 27995] [10264 26964] [8490 26080] [6358 24968] [4654 23910] + [3330 22836] [2337 21691] [1643 20410] [1198 18940] [959 17210] + [894 15164] [894 6375] [894 5909] [878 4254] [867 2507] + [856 1845] [845 1362] [818 923] [770 413] [1317 434] + [3200 499] [4475 527] [5788 527] [6390 532] + ) + Polygon("clearpoly,selected") + ( + [12895 27637] [15331 26454] [15423 26454] [15380 26368] [15380 15153] + [15331 15050] [15434 15099] [24299 15099] [24397 15142] [24354 15045] + [24354 10216] [24397 10119] [24299 10157] [15434 10157] [15331 10200] + [15380 10102] [15380 1129] [15423 1031] [15326 1075] [10470 1075] + [10367 1031] [10416 1129] [10416 10102] [10454 10200] [10362 10157] + [1486 10157] [1393 10119] [1431 10216] [1431 15045] [1393 15142] + [1486 15099] [10362 15099] [10454 15050] [10416 15153] [10416 26368] + [10367 26454] [10454 26454] [12895 27637] + ) + Polygon("clearpoly,selected") + ( + [1741 1541] [1833 1801] [1762 2176] [1714 2480] [1914 2756] + [1952 2778] [1963 2811] [1974 2881] [1985 3033] [2001 3245] + [2001 3294] [1969 3342] [1963 3337] [1947 3321] [1931 3304] + [1914 3277] [1860 3174] [1817 3087] [1410 2838] [1345 2838] + [1307 2838] [1269 2865] [1274 2881] [1290 2892] [1307 2908] + [1328 2925] [1496 3299] [1703 3722] [2001 3961] [2050 4010] + [1979 4069] [1898 4053] [1784 4031] [1708 4124] [1779 4422] + [1952 4688] [2077 4813] [2169 4889] [2229 4932] [2272 5002] + [2245 5046] [2207 5046] [2175 5024] [2153 5019] [2115 5002] + [2077 4986] [2044 4981] [2001 5051] [2012 5133] [2050 5268] + [2337 5719] [2647 5881] [2733 5903] [2793 5919] [2831 5936] + [2750 6022] [2679 6022] [2620 6022] [2565 6017] [2538 6017] + [2424 6077] [2435 6109] [2457 6164] [2511 6277] [2630 6489] + [2712 6576] [2771 6614] [2847 6527] [2902 6462] [2999 6337] + [3336 6153] [3509 6109] [3661 5979] [3650 5827] [3618 5697] + [3602 5529] [3585 5328] [3585 5230] [3564 5176] [3558 5154] + [3526 5149] [3520 5144] [3498 5154] [3466 5187] [3428 5225] + [3374 5290] [3092 5475] [2766 5361] [2516 5057] [2359 4574] + [2305 3955] [2316 3478] [2348 2957] [2370 2583] [2202 1981] + [1741 1541] + ) + Polygon("clearpoly,selected") + ( + [2853 3342] [2853 3315] [2739 3044] [2625 2984] [2527 3163] + [2506 3397] [2478 3673] [2538 3803] [2679 3706] [2853 3342] + ) + Polygon("clearpoly,selected") + ( + [1746 7889] [1887 7948] [2039 8090] [2191 8225] [2305 8263] + [2750 8090] [2837 8008] [2918 7948] [2875 7948] [2544 7851] + [2327 7764] [2148 7748] [1746 7889] + ) + Polygon("clearpoly,selected") + ( + [1746 9332] [1952 9272] [2104 9218] [2234 9185] [2403 8996] + [2554 8827] [2679 8746] [2799 8627] [2869 8567] [2902 8529] + [2940 8524] [2945 8551] [2940 8605] [2918 8659] [2831 8925] + [2902 9147] [3092 9332] [3260 8920] [3406 8730] [3515 8410] + [3498 8225] [3488 8100] [3504 8041] [3547 7981] [3574 7997] + [3602 8019] [3623 8111] [3656 8187] [3721 8263] [3753 8252] + [3808 8209] [3922 8111] [4025 7965] [4117 7710] [4117 7661] + [4090 7514] [4084 7417] [4144 7292] [4220 7422] [4383 7672] + [4464 7596] [4643 7319] [4697 7091] [4692 6994] [4692 6966] + [4741 6858] [4811 6928] [4833 6994] [4849 7026] [4866 7053] + [4893 7064] [4931 7048] [4963 7015] [5001 6977] [5056 6901] + [5099 6842] [5131 6760] [5099 6684] [5077 6657] [5045 6614] + [5001 6560] [4969 6473] [5056 6201] [5159 5995] [5273 5778] + [5338 5681] [5397 5626] [5446 5675] [5435 5719] [5403 5773] + [5381 5849] [5365 5925] [5403 6001] [5490 5995] [5598 5946] + [5810 5881] [6016 5816] [6325 5773] [6406 5778] [6504 5805] + [6580 5811] [6640 5795] [6732 5773] [6884 5697] [6808 5512] + [6748 5404] [6678 5306] [6640 5268] [6634 5225] [6672 5230] + [6694 5230] [6862 5371] [7068 5702] [7719 6744] [8419 7238] + [8745 7352] [8994 7542] [9087 7845] [8902 8301] [8680 8583] + [8322 9533] [8305 9652] [8419 9549] [8604 9500] [8880 9370] + [8962 9131] [8962 9110] [8956 8952] [8956 8936] [9016 8811] + [9070 8865] [9146 9093] [9504 9462] [9477 9272] [9504 9126] + [9537 8865] [9445 8545] [9352 8382] [9309 8290] [9293 8241] + [9336 8198] [9369 8209] [9407 8241] [9428 8263] [9477 8306] + [9537 8345] [9635 8127] [9629 8019] [9613 7840] [9466 7607] + [9385 7552] [9293 7433] [9352 7379] [9412 7401] [9531 7438] + [9586 7455] [9656 7335] [9597 7021] [9466 6885] [9445 6891] + [9374 6896] [9320 6896] [8783 6684] [8506 6060] [8338 5588] + [8056 5323] [7866 5230] [7736 5176] [7665 5160] [7622 5116] + [7730 5068] [8213 5149] [8511 5247] [9190 5393] [9618 5198] + [9797 4726] [9635 4210] [9233 3782] [9141 3717] [9108 3711] + [9076 3744] [9087 3787] [9092 3869] [9141 3977] [9168 4037] + [9200 4091] [9168 4118] [9130 4102] [9103 4080] [9027 3977] + [8951 3820] [8777 3576] [8582 3413] [8392 3321] [8267 3261] + [8191 3239] [8148 3288] [8164 3369] [8224 3511] [8289 3614] + [8360 3673] [8381 3728] [8305 3733] [8246 3695] [8164 3624] + [8045 3467] [7752 3147] [7345 2903] [7237 2849] [7166 2811] + [7117 2876] [7155 2995] [7209 3055] [7269 3125] [7307 3163] + [7318 3190] [7285 3223] [7274 3218] [7231 3190] [7177 3147] + [6792 2404] [7009 1937] [7426 1758] [7730 1818] [8099 2024] + [8636 2333] [9027 2431] [9358 2360] [9607 2154] [9559 2176] + [9483 2198] [9407 2219] [9336 2230] [8967 2149] [8484 1916] + [8240 1780] [8001 1644] [7958 1590] [8001 1557] [8083 1579] + [8408 1726] [8745 1888] [9097 2002] [9401 2057] [9662 1981] + [9748 1758] [9580 1357] [9450 1281] [9390 1351] [9412 1406] + [9439 1433] [9461 1519] [9477 1579] [9477 1595] [9298 1747] + [9032 1688] [8620 1519] [8067 1286] [7703 1243] [7204 1330] + [6797 1574] [6520 1937] [6423 2382] [6537 2919] [6938 3380] + [7676 3814] [8821 4270] [9282 4498] [9428 4769] [9347 4975] + [9152 5062] [8929 5035] [8452 4905] [7763 4747] [7014 4710] + [6103 4786] [5490 5062] [5354 5160] [5202 5257] [5094 5279] + [5083 5279] [5007 5274] [4616 5637] [4491 5773] [4366 5664] + [4236 5420] [4144 5290] [4063 5209] [3998 5149] [3954 5116] + [3932 5068] [4014 4889] [4068 4796] [4084 4742] [4166 4639] + [4177 4644] [4182 4671] [4198 4737] [4204 4823] [4236 4981] + [4269 5095] [4312 5187] [4448 5355] [4632 5187] [4741 4840] + [4746 4758] [4811 4699] [4817 4710] [4839 4742] [4855 4775] + [4876 4840] [4985 5002] [5039 5046] [5083 5062] [5121 5073] + [5153 5046] [5186 5019] [5224 4932] [5245 4834] [5245 4818] + [5235 4710] [5229 4606] [5224 4503] [5235 4476] [5273 4455] + [5365 4541] [5479 4671] [5576 4699] [5717 4601] [5679 4514] + [5625 4422] [5560 4292] [5376 4107] [5321 4118] [5245 4140] + [5186 4167] [5137 4178] [5126 4178] [5094 4167] [5099 4124] + [5131 4080] [5186 4010] [5354 3657] [5441 2957] [5500 2501] + [5582 2371] [5620 2404] [5636 2496] [5636 2572] [5625 2680] + [5609 2778] [5598 2849] [5593 2870] [5652 2930] [5853 2718] + [5972 2333] [5951 2214] [5853 2067] [5772 2002] [5658 1964] + [5598 1964] [5538 1921] [5566 1840] [5571 1726] [5549 1612] + [5522 1563] [5490 1481] [5457 1422] [5359 1481] [5235 1541] + [5137 1628] [5061 1709] [5001 1780] [4947 1823] [4920 1785] + [4942 1709] [4969 1536] [4909 1335] [4833 1221] [4725 1123] + [4681 1075] [4627 1123] [4567 1188] [4475 1292] [4334 1590] + [4334 1682] [4296 1731] [4209 1633] [4117 1514] [4036 1443] + [3954 1384] [3911 1335] [3878 1395] [3753 1747] [3753 1764] + [3770 1840] [3770 1916] [3748 1986] [3726 1991] [3715 2002] + [3650 1986] [3520 1937] [3314 2008] [3243 2208] [3450 2735] + [3569 2843] [3585 2838] [3623 2816] [3629 2805] [3623 2756] + [3618 2680] [3602 2572] [3596 2447] [3634 2344] [3721 2469] + [3791 2838] [3932 3548] [4182 4064] [4198 4102] [4177 4129] + [4128 4118] [4046 4086] [3987 4053] [3938 4042] [3748 4232] + [3688 4834] [3721 5279] [3808 5659] [4014 6207] [4046 6429] + [3954 6863] [3672 7362] [3162 7916] [2609 8323] [2283 8491] + [2023 8637] [1876 8784] [1795 8996] [1746 9332] + ) + Polygon("clearpoly,selected") + ( + [5110 8231] [5213 8323] [5251 8377] [5289 8421] [5365 8524] + [5582 8616] [5620 8616] [5750 8600] [5842 8589] [5896 8578] + [5951 8540] [5728 8290] [5603 8209] [5376 8166] [5207 8203] + [5110 8231] + ) + Polygon("clearpoly,selected") + ( + [4914 9402] [5104 9348] [5191 9354] [5300 9365] [5414 9370] + [5517 9381] [5598 9348] [5734 9223] [5864 9110] [6059 9012] + [6320 8882] [6358 8860] [6379 8882] [6341 8936] [6141 9164] + [6065 9424] [6146 9701] [6390 9375] [6575 9223] [6732 9028] + [6775 8751] [6770 8719] [6770 8676] [6824 8594] [6840 8600] + [6873 8654] [6884 8697] [6916 8746] [6949 8773] [6954 8779] + [7106 8676] [7242 8486] [7269 8328] [7231 8149] [7182 8046] + [7166 7981] [7215 7916] [7237 7927] [7274 7959] [7307 8003] + [7432 8095] [7546 7997] [7595 7894] [7627 7813] [7638 7764] + [7535 7699] [7302 7547] [7215 7254] [7220 7086] [7253 6977] + [7291 6891] [7312 6787] [7329 6717] [7307 6657] [7274 6603] + [7231 6478] [7177 6370] [7123 6245] [6987 6104] [6808 6185] + [6640 6272] [6450 6456] [6379 6760] [6542 7314] [6710 7661] + [6797 7986] [6548 8469] [5880 8730] [5479 8800] [5213 8920] + [5039 9110] [4914 9402] + ) + Polygon("clearpoly,selected") + ( + [7893 8827] [7942 8822] [8001 8806] [8056 8806] [8153 8806] + [8262 8806] [8327 8811] [8452 8681] [8506 8600] [8625 8421] + [8408 8366] [8083 8496] [7893 8827] + ) + Polygon("clearpoly,selected") + ( + [16243 1541] [16335 1801] [16264 2176] [16215 2480] [16416 2756] + [16476 2881] [16487 3033] [16503 3245] [16503 3294] [16470 3342] + [16465 3337] [16449 3321] [16432 3304] [16416 3277] [16362 3174] + [16319 3087] [15912 2838] [15847 2838] [15809 2838] [15771 2865] + [15776 2881] [15792 2892] [15809 2908] [15830 2925] [15998 3299] + [16205 3722] [16503 3961] [16552 4010] [16481 4069] [16400 4053] + [16286 4031] [16210 4124] [16281 4422] [16454 4688] [16579 4813] + [16671 4889] [16731 4932] [16774 5002] [16747 5046] [16715 5046] + [16677 5024] [16655 5019] [16617 5002] [16579 4986] [16552 4981] + [16503 5051] [16519 5133] [16557 5268] [16839 5719] [17149 5881] + [17235 5903] [17295 5919] [17333 5936] [17252 6022] [17181 6022] + [17121 6022] [17067 6017] [17040 6017] [16932 6077] [16937 6109] + [16959 6164] [17013 6277] [17132 6489] [17214 6576] [17273 6614] + [17349 6527] [17404 6462] [17507 6337] [17838 6153] [18011 6109] + [18169 5979] [18152 5827] [18120 5697] [18104 5529] [18087 5328] + [18087 5230] [18065 5176] [18060 5154] [18028 5149] [18022 5144] + [18000 5154] [17968 5187] [17930 5225] [17876 5290] [17599 5475] + [17273 5361] [17024 5057] [16861 4574] [16807 3955] [16818 3478] + [16850 2957] [16872 2583] [16704 1981] [16243 1541] + ) + Polygon("clearpoly,selected") + ( + [17355 3342] [17360 3315] [17241 3044] [17127 2984] [17029 3163] + [17008 3397] [16980 3673] [17040 3803] [17181 3706] [17355 3342] + ) + Polygon("clearpoly,selected") + ( + [16248 7889] [16389 7948] [16541 8090] [16693 8225] [16807 8263] + [17252 8090] [17344 8008] [17420 7948] [17376 7948] [17046 7851] + [16829 7764] [16650 7748] [16248 7889] + ) + Polygon("clearpoly,selected") + ( + [16248 9332] [16454 9272] [16606 9218] [16736 9185] [16905 8996] + [17056 8827] [17181 8746] [17306 8627] [17371 8567] [17404 8529] + [17431 8518] [17452 8551] [17420 8659] [17344 8822] [17333 8925] + [17409 9147] [17594 9332] [17762 8920] [17908 8730] [18017 8410] + [18000 8225] [17990 8100] [18006 8041] [18049 7981] [18076 7997] + [18104 8019] [18131 8111] [18158 8187] [18223 8263] [18255 8252] + [18310 8209] [18424 8111] [18527 7965] [18619 7710] [18619 7661] + [18592 7514] [18586 7417] [18646 7292] [18722 7422] [18885 7672] + [18966 7596] [19145 7319] [19199 7086] [19199 6994] [19199 6966] + [19254 6858] [19286 6874] [19297 6891] [19319 6928] [19335 6994] + [19351 7026] [19368 7053] [19395 7064] [19433 7048] [19465 7015] + [19503 6977] [19557 6901] [19601 6842] [19633 6760] [19601 6684] + [19579 6657] [19547 6614] [19503 6560] [19471 6473] [19557 6201] + [19661 5995] [19780 5778] [19840 5681] [19899 5626] [19948 5675] + [19937 5719] [19905 5773] [19883 5849] [19867 5925] [19905 6001] + [19991 5995] [20100 5946] [20312 5881] [20518 5816] [20827 5773] + [20908 5778] [21006 5805] [21082 5811] [21147 5795] [21234 5773] + [21391 5697] [21359 5605] [21321 5512] [21250 5404] [21190 5306] + [21147 5268] [21136 5225] [21174 5230] [21196 5230] [21364 5371] + [21570 5702] [22221 6744] [22927 7238] [23247 7352] [23496 7542] + [23589 7845] [23404 8301] [23182 8583] [22824 9533] [22807 9652] + [22921 9549] [23106 9500] [23382 9370] [23469 9131] [23464 9110] + [23458 8952] [23458 8936] [23518 8811] [23572 8865] [23648 9093] + [24006 9462] [23979 9272] [24006 9126] [24050 8882] [23947 8545] + [23854 8382] [23811 8290] [23795 8241] [23838 8198] [23871 8209] + [23909 8241] [23930 8263] [23979 8306] [24039 8345] [24142 8079] + [23968 7607] [23887 7552] [23795 7433] [23865 7379] [23925 7401] + [24033 7438] [24093 7455] [24158 7319] [24153 7270] [24120 7124] + [24060 6923] [23974 6885] [23957 6891] [23887 6896] [23827 6901] + [23285 6690] [23008 6060] [22840 5588] [22558 5323] [22368 5230] + [22238 5176] [22167 5160] [22124 5116] [22232 5068] [22720 5149] + [23013 5247] [23692 5393] [24120 5198] [24299 4726] [24136 4210] + [23735 3782] [23643 3717] [23610 3711] [23583 3744] [23589 3787] + [23594 3869] [23643 3977] [23670 4037] [23702 4091] [23670 4118] + [23632 4102] [23605 4080] [23529 3977] [23453 3820] [23279 3576] + [23084 3413] [22894 3321] [22769 3261] [22699 3239] [22650 3288] + [22666 3369] [22726 3511] [22796 3614] [22861 3673] [22883 3728] + [22807 3733] [22748 3695] [22672 3624] [22552 3467] [22238 3125] + [22021 3001] [21847 2903] [21739 2849] [21684 2816] [21668 2816] + [21619 2876] [21657 2995] [21711 3055] [21771 3125] [21809 3163] + [21820 3190] [21787 3223] [21776 3218] [21733 3190] [21679 3147] + [21294 2404] [21511 1937] [21928 1758] [22232 1818] [22601 2024] + [23138 2333] [23529 2431] [23860 2360] [24109 2154] [24060 2176] + [23985 2198] [23909 2219] [23838 2230] [23469 2149] [22986 1916] + [22742 1780] [22503 1644] [22460 1590] [22503 1557] [22585 1579] + [22910 1726] [23247 1888] [23599 2002] [23909 2057] [24164 1981] + [24256 1758] [24082 1357] [23952 1281] [23892 1351] [23914 1406] + [23941 1433] [23963 1519] [23979 1579] [23985 1617] [23800 1747] + [23534 1688] [23122 1519] [22569 1286] [22205 1243] [21706 1330] + [21299 1579] [21022 1943] [20925 2387] [21039 2919] [21440 3380] + [22178 3809] [23323 4270] [23789 4503] [23930 4786] [23849 4981] + [23654 5062] [23431 5035] [22954 4905] [22270 4747] [21538 4710] + [20979 4726] [20556 4796] [20209 4932] [19856 5160] [19704 5257] + [19595 5279] [19585 5279] [19509 5274] [19118 5637] [18993 5773] + [18869 5664] [18738 5420] [18646 5290] [18565 5209] [18500 5149] + [18456 5116] [18434 5068] [18451 5008] [18472 4965] [18527 4889] + [18570 4796] [18592 4742] [18608 4671] [18668 4639] [18679 4644] + [18684 4671] [18700 4737] [18711 4823] [18738 4981] [18771 5095] + [18814 5187] [18950 5355] [19134 5187] [19221 4965] [19243 4840] + [19259 4758] [19297 4693] [19303 4693] [19330 4710] [19340 4742] + [19357 4775] [19389 4840] [19541 5046] [19585 5062] [19623 5073] + [19655 5046] [19688 5019] [19726 4932] [19747 4834] [19747 4818] + [19736 4710] [19731 4606] [19726 4503] [19736 4476] [19775 4455] + [19867 4541] [19981 4671] [20078 4699] [20219 4601] [20181 4514] + [20127 4422] [20062 4292] [19878 4107] [19823 4118] [19747 4140] + [19688 4167] [19639 4178] [19628 4178] [19595 4167] [19601 4124] + [19633 4080] [19688 4010] [19856 3662] [19948 2957] [20002 2507] + [20073 2366] [20089 2377] [20138 2453] [20149 2523] [20143 2572] + [20127 2680] [20111 2778] [20100 2849] [20095 2870] [20154 2930] + [20360 2718] [20474 2333] [20453 2214] [20360 2067] [20274 2002] + [20160 1964] [20100 1964] [20040 1921] [20067 1840] [20073 1726] + [20051 1612] [20024 1563] [19991 1481] [19959 1422] [19861 1481] + [19736 1541] [19639 1628] [19563 1709] [19509 1780] [19449 1823] + [19422 1785] [19444 1709] [19471 1536] [19411 1335] [19335 1221] + [19227 1123] [19183 1075] [19129 1123] [19069 1188] [18977 1292] + [18836 1590] [18836 1682] [18798 1731] [18711 1633] [18619 1514] + [18543 1443] [18456 1384] [18413 1335] [18380 1395] [18255 1747] + [18255 1764] [18272 1840] [18272 1916] [18250 1986] [18228 1991] + [18217 2002] [18152 1986] [18022 1937] [17816 2008] [17745 2208] + [17952 2735] [18071 2843] [18087 2838] [18131 2816] [18131 2805] + [18131 2756] [18120 2680] [18104 2572] [18098 2447] [18136 2344] + [18190 2387] [18250 2556] [18304 2838] [18348 3212] [18451 3597] + [18586 3869] [18657 4015] [18684 4064] [18700 4102] [18668 4129] + [18608 4107] [18554 4086] [18489 4053] [18434 4048] [18245 4237] + [18185 4823] [18190 4872] [18212 5192] [18250 5523] [18310 5659] + [18516 6207] [18554 6429] [18456 6863] [18174 7362] [17664 7921] + [17111 8323] [16785 8491] [16525 8637] [16378 8784] [16297 8996] + [16248 9332] + ) + Polygon("clearpoly,selected") + ( + [19612 8231] [19715 8323] [19753 8377] [19791 8421] [19867 8524] + [20084 8616] [20122 8616] [20252 8600] [20344 8589] [20404 8578] + [20447 8551] [20409 8458] [20236 8290] [19878 8166] [19709 8203] + [19612 8231] + ) + Polygon("clearpoly,selected") + ( + [19416 9402] [19606 9348] [19693 9354] [19802 9365] [19916 9370] + [20019 9381] [20100 9348] [20236 9223] [20366 9110] [20567 9012] + [20822 8882] [20865 8860] [20881 8882] [20843 8936] [20643 9164] + [20567 9424] [20648 9701] [20892 9375] [21077 9223] [21283 8757] + [21283 8719] [21272 8643] [21321 8589] [21332 8594] [21375 8654] + [21391 8697] [21418 8746] [21451 8773] [21456 8779] [21608 8676] + [21744 8486] [21771 8328] [21733 8149] [21684 8046] [21668 7981] + [21717 7916] [21739 7927] [21776 7959] [21809 8003] [21934 8095] + [22048 7997] [22097 7894] [22129 7813] [22140 7764] [22037 7699] + [21804 7547] [21717 7254] [21728 7086] [21755 6977] [21793 6891] + [21814 6787] [21831 6717] [21809 6657] [21776 6603] [21733 6478] + [21679 6370] [21625 6245] [21489 6104] [21315 6185] [21147 6272] + [20952 6456] [20881 6760] [21044 7314] [21212 7661] [21299 7986] + [21049 8469] [20382 8730] [19981 8800] [19726 8914] [19552 9099] + [19416 9402] + ) + Polygon("clearpoly,selected") + ( + [22395 8827] [22444 8822] [22503 8806] [22558 8806] [22655 8806] + [22764 8806] [22829 8811] [22954 8681] [23008 8600] [23127 8421] + [22910 8366] [22590 8496] [22395 8827] + ) + Polygon("clearpoly,selected") + ( + [1990 16222] [1990 16271] [1974 16434] [1936 16559] [1898 16770] + [2001 17106] [2082 17334] [2012 17432] [1974 17405] [1610 17264] + [1502 17275] [1616 17524] [1670 17709] [2028 18154] [2137 18246] + [2072 18278] [2044 18273] [1963 18257] [1898 18246] [1844 18316] + [1865 18436] [1963 18669] [2110 18940] [2321 19081] [2424 19174] + [2365 19211] [2251 19282] [2267 19336] [2283 19380] [2554 19781] + [3005 19922] [3026 19922] [3075 19955] [3043 19998] [2907 20052] + [2826 20112] [2929 20313] [2999 20389] [3113 20476] [3238 20400] + [3705 20128] [3916 19976] [3895 19906] [3753 19526] [3715 19342] + [3688 19239] [3672 19190] [3640 19174] [3634 19174] [3602 19184] + [3580 19222] [3542 19282] [3504 19363] [3385 19499] [3227 19559] + [2837 19277] [2451 18512] [2337 17866] [2375 17540] [2462 17161] + [2484 16971] [2359 16531] [1990 16222] + ) + Polygon("clearpoly,selected") + ( + [2674 18050] [2755 17893] [2847 17671] [2793 17551] [2668 17454] + [2544 17584] [2495 17893] [2495 18050] [2560 18219] [2571 18219] + [2609 18175] [2674 18050] + ) + Polygon("clearpoly,selected") + ( + [3585 21327] [3705 21392] [3748 21452] [3802 21517] [4008 21642] + [4464 21452] [4410 21420] [4334 21376] [4242 21300] [3949 21181] + [3585 21327] + ) + Polygon("clearpoly,selected") + ( + [3634 22543] [3862 22450] [4008 22445] [4383 22141] [4497 22022] + [4551 21995] [4605 21968] [4638 22006] [4616 22098] [4578 22255] + [4562 22407] [4584 22586] [4719 22819] [4741 22711] [4849 22564] + [5094 22157] [5164 21799] [5153 21685] [5148 21647] [5197 21582] + [5245 21599] [5262 21626] [5305 21696] [5321 21751] [5359 21778] + [5506 21604] [5587 21327] [5549 21208] [5533 21154] [5566 21116] + [5603 21132] [5641 21154] [5690 21192] [5739 21213] [5777 21197] + [5826 21143] [5907 21045] [5989 20888] [5983 20872] [5962 20834] + [5940 20796] [5842 20703] [5755 20590] [5647 20340] [5712 20069] + [5755 19938] [5777 19863] [5842 19781] [5896 19863] [5880 19960] + [5853 20134] [5929 20231] [6075 20183] [6282 20112] [6488 20063] + [6629 20036] [6748 20063] [6862 20112] [6976 20145] [7047 20155] + [7150 20074] [7117 19998] [7030 19841] [7068 19803] [7280 20052] + [7557 20649] [7741 21137] [7942 21506] [8267 21772] [8620 21978] + [8891 22282] [8973 22830] [8913 23313] [8756 23888] [8620 24290] + [8560 24669] [8826 25445] [8870 25326] [8962 25206] [9163 24745] + [9108 24496] [9070 24376] [9065 24268] [9059 24208] [9103 24170] + [9222 24284] [9342 24420] [9575 24550] [9542 24317] [9461 23834] + [9249 23481] [9217 23427] [9260 23384] [9390 23481] [9488 23546] + [9521 23514] [9537 23438] [9559 23237] [9564 23188] [9369 22765] + [9238 22597] [9266 22559] [9385 22613] [9499 22657] [9575 22581] + [9597 22293] [9591 22071] [9575 21908] [9504 21816] [9466 21816] + [9455 21816] [8994 21604] [8712 21002] [8587 20497] [8376 20052] + [8007 19787] [7904 19705] [7953 19678] [8045 19705] [8191 19749] + [8506 19868] [9038 19976] [9607 19754] [9835 19206] [9694 18696] + [9352 18322] [9217 18235] [9141 18208] [9092 18240] [9103 18305] + [9146 18381] [9168 18447] [9135 18490] [9032 18398] [8636 18023] + [8256 17915] [8137 17975] [8224 18121] [8300 18219] [8316 18262] + [8305 18289] [8267 18322] [8229 18305] [8164 18246] [7985 18067] + [7817 17893] [7437 17730] [7345 17725] [7237 17774] [7329 17926] + [7399 17996] [7361 18029] [7047 17839] [6689 17443] [6596 17036] + [6775 16618] [7237 16455] [7719 16607] [8061 16824] [8419 17058] + [8696 17215] [8908 17258] [9331 17052] [9260 17068] [9200 17074] + [9184 17074] [9125 17068] [9038 17058] [8810 16993] [8560 16851] + [8246 16607] [7529 16260] [7416 16190] [7486 16152] [7926 16260] + [8528 16602] [8978 16868] [9282 16933] [9569 16819] [9700 16569] + [9607 16320] [9515 16255] [9472 16314] [9477 16336] [9493 16390] + [9493 16412] [9423 16564] [9266 16634] [9043 16559] [8707 16341] + [8061 15945] [7540 15848] [7041 15935] [6634 16179] [6368 16548] + [6271 17009] [6379 17589] [6737 18034] [7388 18381] [8381 18658] + [8913 18783] [9238 18897] [9396 19027] [9439 19195] [9304 19466] + [8956 19575] [8620 19542] [8018 19391] [7318 19228] [6754 19184] + [5750 19353] [5207 19825] [5169 19906] [5131 19949] [5077 19901] + [4735 19683] [4513 19770] [4383 19830] [4263 19732] [4144 19510] + [4036 19146] [4030 19054] [4030 19005] [4084 18891] [4144 19000] + [4166 19119] [4307 19412] [4394 19466] [4616 19174] [4681 19054] + [4779 19211] [4914 19504] [5066 19618] [5115 19597] [5153 19559] + [5229 19293] [5235 19217] [5229 19168] [5224 19108] [5251 19060] + [5305 19081] [5354 19136] [5522 19222] [5593 19239] [5663 19211] + [5712 19168] [5712 19152] [5690 19060] [5636 19000] [5560 18886] + [5484 18756] [5435 18642] [5294 18495] [5213 18517] [5148 18555] + [5018 18598] [4963 18560] [4985 18517] [5066 18441] [5245 18132] + [5365 17459] [5430 17112] [5468 16971] [5528 16889] [5560 16917] + [5560 16971] [5566 17068] [5566 17182] [5566 17258] [5603 17329] + [5696 17237] [5864 16797] [5793 16586] [5614 16510] [5549 16515] + [5473 16542] [5457 16542] [5381 16428] [5392 16320] [5392 16233] + [5359 16038] [5316 15837] [5159 15967] [5045 16054] [4952 16135] + [4833 16238] [4773 16135] [4627 15739] [4551 15663] [4480 15587] + [4242 16141] [4242 16157] [4247 16211] [4204 16298] [4160 16271] + [4122 16228] [4036 16157] [3916 16043] [3732 15907] [3710 16021] + [3672 16184] [3656 16336] [3656 16488] [3667 16542] [3629 16580] + [3596 16569] [3542 16548] [3406 16521] [3173 16765] [3336 17139] + [3580 17351] [3618 17275] [3612 17177] [3596 17052] [3585 16998] + [3629 16938] [3688 16993] [3732 17090] [3781 17318] [3884 17980] + [4074 18338] [4236 18490] [4307 18555] [4334 18598] [4285 18636] + [4215 18609] [4063 18577] [3857 18664] [3786 18929] [3987 19667] + [4578 20307] [4980 20655] [5083 20969] [4958 21300] [4643 21566] + [4307 21734] [4025 21843] [3781 22011] [3661 22374] [3634 22543] + ) + Polygon("clearpoly,selected") + ( + [5636 22928] [5728 22939] [5804 22960] [5886 23026] [6124 23080] + [6233 23063] [6412 22993] [6553 22933] [6672 22863] [6591 22836] + [6450 22781] [6075 22695] [5886 22733] [5636 22928] + ) + Polygon("clearpoly,selected") + ( + [5766 24002] [5972 23942] [6227 23877] [6358 23780] [6390 23682] + [6520 23492] [6640 23422] [6672 23449] [6667 23476] [6640 23519] + [6580 23780] [6672 24094] [6721 24192] [6873 23980] [7085 23677] + [7139 23373] [7133 23248] [7128 23194] [7177 23139] [7237 23199] + [7258 23259] [7318 23340] [7497 23139] [7546 22868] [7535 22798] + [7513 22727] [7508 22711] [7567 22651] [7660 22733] [7719 22803] + [7828 22727] [7888 22640] [7947 22521] [7909 22467] [7681 22152] + [7611 21647] [7529 21251] [7416 20969] [7350 20763] [7302 20606] + [7209 20497] [7177 20503] [7117 20535] [6987 20579] [6819 20736] + [6759 21024] [6819 21311] [7003 21767] [7177 22440] [7057 22776] + [6689 23031] [6244 23237] [5994 23454] [5875 23655] [5766 24002] + ) + Polygon("clearpoly,selected") + ( + [7833 24615] [7980 24501] [8137 24469] [8370 24387] [8490 24192] + [8560 23980] [8620 23785] [8653 23682] [8544 23742] [8452 23801] + [8289 23866] [7947 24100] [7828 24496] [7833 24615] + ) + Polygon("clearpoly,selected") + ( + [16172 16173] [16210 16417] [16188 16596] [16178 16727] [16302 17074] + [16411 17253] [16432 17378] [16384 17465] [16335 17432] [16270 17356] + [15830 17188] [15912 17351] [15977 17600] [16064 17861] [16243 18061] + [16335 18137] [16416 18240] [16411 18267] [16378 18289] [16373 18289] + [16324 18284] [16270 18273] [16167 18414] [16400 18919] [16443 18978] + [16400 19022] [16281 18984] [16232 18967] [16172 19049] [16259 19450] + [16492 19694] [16606 19749] [16677 19787] [16715 19819] [16617 19868] + [16579 19863] [16503 19830] [16449 19825] [16357 19890] [16373 19976] + [16416 20215] [16541 20400] [16677 20351] [17203 20215] [17371 20215] + [17496 20221] [17566 20231] [17637 20128] [17664 19955] [17686 19711] + [17702 19564] [17707 19488] [17686 19456] [17670 19450] [17588 19488] + [17241 19602] [16964 19515] [16780 19260] [16677 18815] [16644 18170] + [16655 17665] [16693 17253] [16731 16835] [16568 16407] [16172 16173] + ) + Polygon("clearpoly,selected") + ( + [17100 17519] [17035 17432] [16948 17356] [16877 17481] [16850 17654] + [16823 17844] [16818 17915] [16872 18040] [17013 17915] [17127 17644] + [17100 17519] + ) + Polygon("clearpoly,selected") + ( + [16172 21609] [16400 21756] [16693 21913] [17121 21799] [16845 21577] + [16546 21496] [16172 21609] + ) + Polygon("clearpoly,selected") + ( + [16080 22857] [16335 22765] [16519 22733] [16753 22575] [17024 22342] + [17040 22353] [17046 22391] [17013 22450] [16921 22651] [16905 22803] + [17008 23101] [17084 22977] [17241 22798] [17420 22396] [17420 22320] + [17463 22223] [17534 22304] [17583 22391] [17588 22391] [17664 22353] + [17740 22299] [17908 21919] [17897 21827] [17897 21789] [17935 21751] + [18006 21810] [18098 21897] [18196 21832] [18288 21734] [18359 21517] + [18337 21398] [18304 21311] [18272 21224] [18326 21159] [18375 21181] + [18402 21230] [18462 21311] [18510 21382] [18559 21420] [18700 21300] + [18793 21078] [18771 21007] [18684 20725] [18700 20600] [18787 20410] + [18847 20269] [18928 20155] [18977 20215] [18977 20237] [18955 20318] + [18944 20378] [19118 20514] [19368 20427] [19845 20145] [20046 20025] + [20181 19998] [20350 20036] [20643 20112] [20702 20058] [20664 19884] + [20648 19825] [20691 19770] [20756 19814] [20870 19993] [20990 20204] + [21283 20541] [21673 20703] [21950 20779] [22031 20926] [21918 21317] + [21543 21685] [21207 22233] [21305 22733] [21489 22516] [21635 22385] + [21700 22239] [21700 22109] [21836 21886] [21890 21962] [22021 22369] + [22037 22315] [22091 22201] [22167 22049] [22259 21870] [22297 21718] + [22238 21474] [22205 21382] [22254 21322] [22292 21338] [22411 21398] + [22465 21344] [22558 21083] [22509 20986] [22449 20915] [22428 20855] + [22476 20796] [22536 20817] [22579 20866] [22661 20899] [22758 20817] + [22802 20720] [22824 20617] [22786 20530] [22601 20481] [22324 20389] + [22140 20237] [21863 19901] [21511 19624] [21435 19570] [21489 19526] + [21625 19559] [21945 19678] [22389 19808] [22775 19863] [23334 19651] + [23567 19152] [23491 18691] [23323 18387] [23171 18273] [23041 18208] + [23008 18246] [23046 18419] [23062 18484] [23046 18517] [23019 18533] + [22965 18457] [22585 17926] [22140 17730] [22075 17774] [22086 17833] + [22097 17871] [22183 18007] [22227 18094] [22254 18159] [22216 18192] + [22124 18116] [21907 17861] [21700 17709] [21516 17627] [21408 17595] + [21364 17644] [21402 17747] [21435 17806] [21397 17850] [21353 17833] + [21299 17795] [21120 17671] [20908 17410] [20827 17079] [21011 16640] + [21456 16455] [21771 16515] [22189 16765] [22655 16976] [23073 17063] + [23442 16868] [23312 16884] [22992 16824] [22628 16640] [22265 16439] + [22048 16341] [21901 16287] [21836 16244] [21939 16200] [22216 16266] + [22726 16477] [23182 16667] [23442 16710] [23708 16602] [23816 16347] + [23762 16119] [23643 16016] [23583 16076] [23589 16108] [23610 16152] + [23621 16200] [23458 16379] [23192 16320] [22666 16124] [22303 16011] + [22042 15956] [21814 15945] [21288 16027] [20865 16266] [20583 16618] + [20485 17068] [20572 17540] [20870 17931] [21429 18278] [22292 18626] + [22932 18929] [23127 19266] [23019 19477] [22726 19553] [22433 19510] + [21918 19353] [21348 19233] [20708 19190] [19834 19320] [19275 19705] + [19129 19841] [19069 19819] [18814 19738] [18570 19901] [18467 20025] + [18413 20052] [18245 19911] [18120 19597] [18087 19293] [18190 18929] + [18245 19011] [18234 19108] [18228 19239] [18277 19526] [18413 19635] + [18575 19510] [18668 19211] [18684 19076] [18733 19011] [18793 19136] + [18874 19412] [19037 19526] [19151 19428] [19205 19168] [19254 19022] + [19292 19049] [19378 19163] [19541 19228] [19677 19136] [19650 19054] + [19595 18984] [19509 18848] [19449 18696] [19406 18588] [19292 18501] + [19237 18512] [19151 18544] [19069 18571] [19020 18588] [18982 18560] + [18999 18517] [19037 18479] [19167 18343] [19330 18078] [19411 17649] + [19503 17182] [19644 17003] [19688 17052] [19671 17177] [19655 17264] + [19639 17345] [19633 17378] [19671 17410] [19878 17237] [20008 16911] + [19867 16618] [19736 16564] [19677 16569] [19612 16586] [19579 16580] + [19547 16548] [19547 16542] [19547 16515] [19547 16504] [19487 16206] + [19411 15978] [19319 16054] [19189 16152] [19091 16266] [18972 16369] + [18944 16341] [18939 16314] [18944 16266] [18966 16190] [18972 16152] + [18928 15891] [18733 15587] [18668 15652] [18608 15718] [18483 15913] + [18429 16141] [18434 16173] [18451 16271] [18451 16293] [18418 16336] + [18380 16314] [18342 16260] [18217 16130] [18000 16000] [17984 16081] + [17946 16206] [17914 16358] [17897 16488] [17865 16640] [17821 16624] + [17740 16586] [17653 16548] [17550 16526] [17382 16596] [17317 16786] + [17561 17313] [17713 17427] [17740 17383] [17745 17318] [17740 17220] + [17713 17106] [17702 17031] [17745 16982] [17930 17432] [18022 17969] + [18169 18305] [18272 18436] [18348 18506] [18375 18544] [18353 18577] + [18310 18577] [18266 18550] [18180 18517] [18131 18512] [17962 18669] + [17876 19320] [17838 19846] [17832 19971] [17849 20199] [17930 20535] + [17984 20855] [17914 21251] [17691 21577] [17295 21848] [16693 22098] + [16232 22364] [16080 22857] + ) + Polygon("clearpoly,selected") + ( + [17447 24078] [18375 23530] [18250 23503] [18158 23481] [17838 23438] + [17534 23557] [17425 23899] [17447 24078] + ) + Polygon("clearpoly,selected") + ( + [17013 25033] [17268 24946] [17404 24957] [17436 24957] [17664 24876] + [17821 24621] [17881 24452] [18060 24246] [18141 24192] [18185 24176] + [18207 24192] [18207 24214] [18196 24252] [18152 24382] [18120 24539] + [18190 24794] [18255 24745] [18614 24414] [18695 24100] [18711 23866] + [18760 23818] [18825 23888] [18912 23997] [19118 23839] [19237 23498] + [19237 23427] [19237 23422] [19281 23335] [19313 23351] [19335 23389] + [19351 23465] [19368 23535] [19433 23628] [19503 23584] [19650 23422] + [19726 23264] [19709 23172] [19693 23080] [19758 23004] [19840 23085] + [19916 23194] [20067 23085] [20165 22895] [20100 22743] [19959 22244] + [20035 21859] [20344 21322] [20637 20845] [20708 20693] [20653 20579] + [20615 20514] [20572 20481] [20518 20503] [20464 20524] [20420 20541] + [20409 20541] [20328 20481] [20127 20351] [19894 20459] [19894 20552] + [19612 20915] [19275 21251] [19167 21653] [19275 22098] [19389 22336] + [19427 22521] [19330 22868] [19031 23226] [18494 23628] [17702 24094] + [17355 24295] [17154 24474] [17056 24702] [17013 25033] + ) + Polygon("clearpoly,selected") + ( + [20816 21957] [21131 21794] [21261 21772] [21337 21685] [21429 21604] + [21543 21496] [21614 21409] [21559 21382] [21473 21376] [21359 21365] + [20979 21523] [20816 21957] + ) + Polygon("clearpoly,selected") + ( + [4160 2181] [4274 2268] [4437 2377] [4502 2415] [4518 2463] + [4502 2545] [4480 2626] [4448 2740] [4437 2800] [4377 2854] + [4182 2697] [4101 2556] [4014 2404] [3960 2284] [3922 2165] + [3987 2078] [4025 2084] [4074 2122] [4160 2181] + ) + Polygon("clearpoly,selected") + ( + [5273 2116] [5305 2138] [5316 2181] [5245 2426] [5045 2778] + [4942 2881] [4920 2887] [4914 2887] [4887 2865] [4876 2838] + [4833 2702] [4801 2572] [4773 2474] [4763 2426] [4866 2344] + [5148 2198] [5213 2154] [5251 2132] [5273 2116] + ) + Polygon("clearpoly,selected") + ( + [4285 3749] [4182 3467] [4128 3223] [4242 3082] [4329 3125] + [4464 3207] [4654 3223] [4942 3136] [5034 3098] [5148 3256] + [5072 3581] [4898 4010] [4649 4216] [4453 4096] [4285 3749] + ) + Polygon("clearpoly,selected") + ( + [18527 2404] [18462 2284] [18434 2160] [18489 2078] [18586 2122] + [18662 2181] [18776 2268] [18939 2377] [19020 2458] [19004 2545] + [18982 2626] [18955 2740] [18939 2800] [18879 2854] [18771 2794] + [18684 2697] [18603 2556] [18527 2404] + ) + Polygon("clearpoly,selected") + ( + [19780 2116] [19807 2138] [19818 2181] [19747 2426] [19547 2778] + [19444 2881] [19422 2887] [19416 2887] [19389 2865] [19378 2838] + [19335 2702] [19303 2572] [19275 2474] [19264 2426] [19368 2344] + [19650 2198] [19715 2154] [19753 2132] [19780 2116] + ) + Polygon("clearpoly,selected") + ( + [18787 3749] [18684 3467] [18630 3223] [18744 3082] [18830 3125] + [18966 3207] [19156 3223] [19444 3136] [19536 3098] [19650 3256] + [19574 3581] [19406 4010] [19151 4216] [18955 4096] [18787 3749] + ) + Polygon("clearpoly,selected") + ( + [4155 16808] [4269 16851] [4350 16884] [4432 16987] [4426 17020] + [4410 17112] [4399 17242] [4372 17296] [4345 17329] [4334 17329] + [4215 17253] [3954 16917] [3895 16759] [3932 16700] [3987 16727] + [4052 16754] [4155 16808] + ) + Polygon("clearpoly,selected") + ( + [4746 17128] [4719 17014] [4708 16955] [4817 16846] [4931 16813] + [5039 16770] [5110 16738] [5159 16700] [5186 16694] [5229 16732] + [5229 16738] [5197 16830] [5121 16976] [4914 17258] [4871 17296] + [4833 17313] [4763 17226] [4746 17128] + ) + Polygon("clearpoly,selected") + ( + [4985 17595] [5094 17758] [5001 18083] [4773 18403] [4616 18484] + [4231 18137] [4074 17741] [4198 17600] [4334 17638] [4605 17720] + [4849 17649] [4985 17595] + ) + Polygon("clearpoly,selected") + ( + [18554 17166] [18543 17275] [18489 17323] [18413 17280] [18152 16938] + [18098 16803] [18076 16710] [18109 16662] [18169 16689] [18266 16748] + [18375 16803] [18500 16862] [18554 16879] [18592 16965] [18586 17047] + [18554 17166] + ) + Polygon("clearpoly,selected") + ( + [19351 16813] [19248 16976] [19048 17269] [18928 17351] [18852 17199] + [18814 16960] [18814 16922] [18906 16868] [19161 16770] [19281 16694] + [19330 16678] [19378 16716] [19351 16813] + ) + Polygon("clearpoly,selected") + ( + [18396 17540] [18478 17589] [18727 17649] [18917 17611] [19075 17557] + [19172 17660] [19004 18170] [18706 18457] [18386 18143] [18255 17823] + [18217 17649] [18320 17519] [18396 17540] + ) + Polygon("clearpoly,selected") + ( + [2923 10585] [2978 10645] [3037 10715] [3108 10781] [3168 10846] + [3135 10873] [3059 10943] [2967 11041] [2978 11144] [2994 11426] + [3151 12034] [3471 12430] [3536 12484] [3504 12522] [3406 12517] + [3260 12500] [3130 12479] [3054 12462] [2978 13010] [2869 13010] + [2793 12462] [2592 12500] [2441 12517] [2375 12522] [2365 12522] + [2310 12500] [2348 12451] [2462 12365] [2582 12235] [2733 11974] + [2815 11725] [2864 11426] [2875 11144] [2885 11041] [2853 11014] + [2793 10943] [2717 10873] [2685 10846] [2750 10781] [2853 10672] + [2923 10585] + ) + Polygon("clearpoly,selected") + ( + [5831 10585] [5886 10645] [5945 10715] [6016 10781] [6075 10846] + [6048 10873] [5972 10943] [5880 11041] [5886 11144] [5902 11426] + [6059 12034] [6385 12430] [6450 12484] [6412 12522] [6314 12517] + [6168 12500] [6038 12479] [5962 12462] [5886 13010] [5777 13010] + [5701 12462] [5506 12500] [5354 12517] [5283 12522] [5273 12522] + [5224 12500] [5262 12451] [5376 12365] [5641 11974] [5717 11725] + [5772 11426] [5788 11144] [5793 11041] [5766 11014] [5701 10943] + [5625 10873] [5598 10846] [5658 10781] [5761 10672] [5831 10585] + ) + Polygon("clearpoly,selected") + ( + [4383 12289] [4627 12549] [4589 12576] [4518 12647] [4448 12717] + [4426 12739] [4426 12810] [4562 13634] [4931 14128] [4996 14193] + [4990 14204] [4931 14226] [4866 14220] [4719 14204] [4589 14182] + [4513 14166] [4437 14714] [4329 14714] [4253 14166] [4177 14182] + [4046 14204] [3900 14220] [3829 14226] [3824 14226] [3770 14193] + [3829 14128] [4187 13640] [4334 12810] [4334 12739] [4312 12717] + [4242 12647] [4177 12576] [4139 12549] [4198 12484] [4269 12419] + [4329 12348] [4383 12289] + ) + Polygon("clearpoly,selected") + ( + [7302 12289] [7350 12348] [7416 12419] [7481 12484] [7546 12549] + [7508 12576] [7437 12647] [7367 12717] [7345 12739] [7350 12842] + [7367 13130] [7529 13743] [7850 14128] [7920 14188] [7909 14204] + [7850 14226] [7779 14220] [7633 14204] [7508 14182] [7426 14166] + [7350 14714] [7247 14714] [7171 14166] [7095 14182] [6965 14204] + [6819 14220] [6748 14226] [6743 14226] [6683 14193] [6748 14128] + [6992 13884] [7182 13423] [7237 13130] [7253 12842] [7258 12739] + [7231 12717] [7171 12647] [7095 12576] [7052 12549] [7302 12289] + ) + Polygon("clearpoly,selected") + ( + [8745 10585] [8794 10645] [8859 10715] [8924 10781] [8989 10846] + [8956 10873] [8880 10943] [8788 11041] [8794 11144] [8810 11426] + [8967 12034] [9293 12430] [9358 12484] [9320 12522] [9222 12517] + [9076 12500] [8951 12479] [8870 12462] [8794 13010] [8691 13010] + [8615 12462] [8539 12479] [8414 12500] [8262 12517] [8191 12522] + [8181 12522] [8132 12500] [8170 12451] [8284 12365] [8549 11974] + [8625 11725] [8680 11426] [8696 11144] [8707 11041] [8674 11014] + [8615 10943] [8539 10873] [8501 10846] [8745 10585] + ) + Polygon("clearpoly,selected") + ( + [17046 10585] [17100 10645] [17160 10715] [17225 10781] [17290 10846] + [17257 10873] [17181 10943] [17089 11041] [17100 11144] [17111 11426] + [17268 12034] [17594 12430] [17659 12484] [17626 12522] [17523 12517] + [17382 12500] [17252 12479] [17176 12462] [17100 13010] [16991 13010] + [16915 12462] [16839 12479] [16715 12500] [16563 12517] [16492 12522] + [16481 12522] [16432 12500] [16470 12451] [16584 12365] [16850 11974] + [16932 11725] [16980 11426] [16997 11144] [17008 11041] [16975 11014] + [16915 10943] [16839 10873] [16801 10846] [17046 10585] + ) + Polygon("clearpoly,selected") + ( + [19954 10585] [20008 10645] [20067 10715] [20138 10781] [20198 10846] + [20165 10873] [20089 10943] [19997 11041] [20008 11144] [20024 11426] + [20105 11855] [20268 12186] [20420 12365] [20501 12430] [20567 12484] + [20501 12522] [20436 12517] [20290 12500] [20160 12479] [20084 12462] + [20008 13010] [19899 13010] [19823 12462] [19747 12479] [19617 12500] + [19471 12517] [19406 12522] [19395 12522] [19340 12500] [19378 12451] + [19492 12365] [19764 11974] [19840 11725] [19894 11426] [19905 11144] + [19916 11041] [19883 11014] [19823 10943] [19747 10873] [19709 10846] + [19954 10585] + ) + Polygon("clearpoly,selected") + ( + [18489 12289] [18543 12348] [18603 12419] [18668 12484] [18733 12549] + [18700 12576] [18624 12647] [18554 12717] [18532 12739] [18543 12842] + [18554 13130] [18717 13743] [19037 14128] [19102 14188] [19048 14226] + [18966 14220] [18825 14204] [18695 14182] [18619 14166] [18543 14714] + [18440 14714] [18359 14166] [18158 14204] [18006 14220] [17935 14226] + [17930 14226] [17876 14193] [17946 14128] [18180 13884] [18380 13423] + [18424 13130] [18440 12842] [18451 12739] [18418 12717] [18359 12647] + [18283 12576] [18250 12549] [18310 12484] [18413 12376] [18489 12289] + ) + Polygon("clearpoly,selected") + ( + [21413 12289] [21657 12549] [21619 12576] [21543 12647] [21478 12717] + [21451 12739] [21456 12842] [21473 13130] [21630 13732] [21961 14128] + [22026 14193] [22021 14204] [21961 14226] [21890 14220] [21749 14204] + [21619 14182] [21543 14166] [21467 14714] [21359 14714] [21283 14166] + [21207 14182] [21077 14204] [20930 14220] [20860 14226] [20854 14226] + [20795 14182] [20860 14128] [21218 13651] [21364 12810] [21364 12739] + [21342 12717] [21272 12647] [21207 12576] [21169 12549] [21229 12484] + [21299 12419] [21359 12348] [21413 12289] + ) + Polygon("clearpoly,selected") + ( + [22861 10585] [22916 10645] [22975 10715] [23046 10781] [23106 10846] + [23079 10873] [23003 10943] [22910 11041] [22916 11144] [22932 11426] + [23013 11855] [23176 12186] [23328 12365] [23415 12430] [23480 12484] + [23415 12522] [23344 12517] [23198 12500] [23068 12479] [22992 12462] + [22916 13010] [22807 13010] [22731 12462] [22655 12479] [22525 12500] + [22384 12517] [22314 12522] [22303 12522] [22254 12500] [22286 12451] + [22395 12365] [22672 11974] [22748 11725] [22802 11426] [22818 11144] + [22824 11041] [22796 11014] [22731 10943] [22655 10873] [22617 10846] + [22861 10585] + ) + Polygon("clearpoly,selected") + ( + [11523 18474] [11577 18533] [11631 18604] [11767 18739] [11729 18772] + [11658 18837] [11593 18902] [11566 18929] [11566 19000] [11707 19819] + [12070 20318] [12136 20389] [12136 20400] [12070 20410] [12005 20410] + [11859 20389] [11729 20367] [11653 20351] [11577 20899] [11468 20899] + [11392 20351] [11316 20367] [11186 20389] [11040 20410] [10975 20410] + [10909 20383] [10975 20318] [11333 19825] [11479 19000] [11474 18929] + [11452 18902] [11387 18837] [11316 18772] [11278 18739] [11414 18604] + [11468 18533] [11523 18474] + ) + Polygon("clearpoly,selected") + ( + [14273 18474] [14317 18533] [14376 18604] [14447 18680] [14506 18739] + [14479 18772] [14403 18837] [14338 18902] [14311 18929] [14317 19032] + [14333 19315] [14490 19928] [14816 20318] [14886 20389] [14881 20400] + [14821 20410] [14751 20410] [14599 20389] [14469 20367] [14403 20351] + [14317 20899] [14219 20899] [14143 20351] [14067 20367] [13937 20389] + [13758 20416] [13655 20378] [13720 20318] [13807 20253] [13959 20074] + [14072 19863] [14154 19613] [14203 19315] [14219 19032] [14224 18929] + [14132 18837] [14029 18739] [14089 18680] [14154 18604] [14219 18533] + [14273 18474] + ) + Polygon("clearpoly,selected") + ( + [12895 20964] [12944 21024] [13004 21083] [13074 21159] [13139 21224] + [13101 21251] [13036 21322] [12966 21392] [12944 21414] [12944 21485] + [13080 22315] [13449 22803] [13514 22868] [13508 22879] [13449 22895] + [13378 22895] [13025 22841] [12949 23389] [12841 23389] [12765 22841] + [12418 22895] [12347 22895] [12282 22863] [12347 22803] [12700 22320] + [12852 21485] [12852 21414] [12830 21392] [12760 21322] [12689 21251] + [12651 21224] [12716 21159] [12781 21083] [12841 21024] [12895 20964] + ) + Polygon("clearpoly,selected") + ( + [11523 23443] [11577 23503] [11631 23573] [11696 23644] [11767 23704] + [11729 23736] [11658 23801] [11593 23872] [11566 23904] [11566 23970] + [11685 24756] [12070 25293] [12136 25342] [12070 25386] [12005 25375] + [11859 25364] [11729 25337] [11653 25320] [11577 25874] [11468 25874] + [11392 25320] [11316 25337] [11186 25364] [11040 25375] [10975 25386] + [10964 25386] [10909 25358] [10947 25310] [11056 25223] [11360 24724] + [11479 23970] [11474 23904] [11452 23872] [11387 23801] [11316 23736] + [11278 23704] [11349 23644] [11414 23573] [11468 23503] [11523 23443] + ) + Polygon("clearpoly,selected") + ( + [14273 23443] [14344 23530] [14447 23644] [14506 23704] [14479 23736] + [14403 23801] [14338 23872] [14311 23904] [14317 24002] [14333 24284] + [14420 24713] [14577 25049] [14729 25223] [14816 25293] [14881 25342] + [14821 25386] [14751 25375] [14599 25364] [14469 25337] [14403 25320] + [14317 25874] [14219 25874] [14143 25320] [14067 25337] [13937 25364] + [13790 25375] [13709 25386] [13660 25358] [13693 25310] [13807 25223] + [13921 25098] [14072 24832] [14154 24583] [14203 24284] [14219 24002] + [14224 23904] [14132 23801] [14056 23736] [14029 23704] [14089 23644] + [14154 23573] [14219 23503] [14273 23443] + ) + Polygon("clearpoly,selected") + ( + [12895 15989] [13139 16249] [13101 16282] [13036 16352] [12966 16417] + [12944 16450] [12944 16515] [13020 17150] [13204 17595] [13362 17768] + [13449 17839] [13508 17888] [13449 17931] [13378 17926] [13232 17909] + [13101 17882] [13025 17871] [12949 18419] [12841 18419] [12765 17871] + [12689 17882] [12559 17909] [12418 17926] [12347 17931] [12336 17931] + [12282 17904] [12315 17861] [12429 17768] [12732 17275] [12852 16515] + [12852 16450] [12830 16417] [12760 16352] [12689 16282] [12651 16249] + [12716 16190] [12781 16119] [12841 16054] [12895 15989] + ) + Polygon("clearpoly,selected") + ( + [11523 2024] [11577 2084] [11631 2154] [11767 2290] [11729 2322] + [11658 2387] [11593 2453] [11566 2480] [11566 2550] [11707 3369] + [12070 3869] [12136 3939] [12136 3950] [12070 3961] [12005 3961] + [11859 3939] [11729 3917] [11653 3901] [11577 4449] [11468 4449] + [11392 3901] [11316 3917] [11186 3939] [11040 3961] [10975 3961] + [10909 3939] [10975 3869] [11333 3375] [11479 2550] [11474 2480] + [11452 2453] [11387 2387] [11316 2322] [11278 2290] [11414 2154] + [11468 2084] [11523 2024] + ) + Polygon("clearpoly,selected") + ( + [14273 2024] [14317 2084] [14376 2154] [14447 2230] [14506 2290] + [14479 2322] [14403 2387] [14338 2453] [14311 2480] [14317 2583] + [14333 2865] [14490 3478] [14816 3869] [14886 3939] [14881 3950] + [14821 3961] [14751 3961] [14599 3939] [14469 3917] [14403 3901] + [14317 4449] [14219 4449] [14143 3901] [14067 3917] [13937 3939] + [13758 3966] [13655 3928] [13720 3869] [13807 3803] [13959 3624] + [14072 3413] [14154 3163] [14203 2865] [14219 2583] [14224 2480] + [14132 2387] [14029 2290] [14089 2230] [14154 2154] [14219 2084] + [14273 2024] + ) + Polygon("clearpoly,selected") + ( + [12895 4444] [13139 4704] [13101 4737] [13036 4802] [12966 4872] + [12944 4905] [12944 4970] [13020 5605] [13204 6050] [13362 6223] + [13449 6294] [13508 6343] [13449 6386] [13378 6375] [13232 6359] + [13101 6337] [13025 6321] [12949 6874] [12841 6874] [12765 6321] + [12689 6337] [12559 6359] [12418 6375] [12347 6386] [12336 6386] + [12282 6359] [12315 6310] [12429 6223] [12732 5730] [12852 4970] + [12852 4905] [12830 4872] [12760 4802] [12689 4737] [12651 4704] + [12716 4644] [12781 4574] [12841 4503] [12895 4444] + ) + Polygon("clearpoly,selected") + ( + [11523 6863] [11577 6928] [11631 6994] [11696 7064] [11767 7124] + [11729 7156] [11658 7222] [11593 7292] [11566 7314] [11566 7384] + [11707 8209] [12070 8703] [12136 8773] [12136 8784] [12070 8806] + [12005 8795] [11859 8784] [11729 8757] [11653 8746] [11577 9294] + [11468 9294] [11392 8746] [11316 8757] [11186 8784] [11040 8795] + [10975 8806] [10964 8806] [10909 8768] [10975 8703] [11333 8214] + [11479 7384] [11474 7314] [11452 7292] [11387 7222] [11316 7156] + [11278 7124] [11349 7064] [11414 6994] [11468 6928] [11523 6863] + ) + Polygon("clearpoly,selected") + ( + [14273 6863] [14447 7064] [14506 7124] [14479 7156] [14403 7222] + [14338 7292] [14311 7314] [14317 7422] [14333 7704] [14490 8317] + [14816 8703] [14886 8773] [14881 8784] [14821 8806] [14751 8795] + [14599 8784] [14469 8757] [14403 8746] [14317 9294] [14219 9294] + [14143 8746] [14067 8757] [13937 8784] [13790 8795] [13709 8806] + [13655 8762] [13720 8703] [13959 8458] [14154 8003] [14203 7704] + [14219 7422] [14224 7314] [14203 7292] [14132 7222] [14056 7156] + [14029 7124] [14089 7064] [14154 6994] [14219 6928] [14273 6863] + ) + Polygon("clearpoly,selected") + ( + [10188 10563] [10985 10563] [11392 10287] [11631 10352] [11810 10563] + [12467 10563] [12901 10287] [13150 10363] [13307 10563] [13921 10563] + [14322 10287] [14729 10515] [14761 10563] [15608 10563] [15608 14486] + [14865 14486] [14865 15989] [13997 15989] [13997 14486] [11799 14486] + [11799 15989] [10926 15989] [10926 14470] [10188 14470] [10188 10563] + ) + Polygon("clearpoly,selected") + ( + [4681 3445] [4632 3445] [4589 3445] [4540 3435] [4529 3435] + [4432 3527] [4437 3581] [4459 3706] [4627 4053] [4779 3934] + [4822 3820] [4855 3673] [4871 3559] [4871 3543] [4806 3435] + [4801 3435] [4681 3445] + ) + Polygon("clearpoly,selected") + ( + [19210 3445] [19134 3445] [19091 3445] [19042 3435] [19031 3435] + [18934 3527] [18939 3581] [18961 3706] [19129 4053] [19281 3934] + [19330 3820] [19357 3673] [19373 3559] [19313 3435] [19303 3435] + [19210 3445] + ) + Polygon("clearpoly,selected") + ( + [4594 18349] [4735 18132] [4746 18040] [4757 17964] [4697 17893] + [4632 17899] [4578 17909] [4529 17899] [4480 17893] [4410 18002] + [4437 18137] [4464 18246] [4594 18349] + ) + Polygon("clearpoly,selected") + ( + [18847 18083] [18874 17969] [18885 17909] [18830 17833] [18787 17839] + [18771 17839] [18738 17839] [18657 17833] [18624 17823] [18603 17823] + [18538 17920] [18624 18235] [18722 18305] [18782 18267] [18847 18083] + ) + Polygon("clearpoly,selected") + ( + [11192 10835] [11192 11225] [11192 11312] [11398 11507] [11604 11312] + [11604 11225] [11604 10846] [11550 10629] [11414 10553] [11322 10574] + [11268 10607] [11224 10667] [11192 10753] [11192 10835] + ) + Polygon("clearpoly,selected") + ( + [12684 11225] [12684 11312] [12884 11507] [13096 11312] [13096 11225] + [13096 10846] [13042 10629] [12906 10553] [12743 10629] [12684 10835] + [12684 11225] + ) + Polygon("clearpoly,selected") + ( + [14127 10835] [14127 11225] [14127 11312] [14327 11507] [14539 11312] + [14539 11225] [14539 10846] [14485 10629] [14349 10553] [14257 10574] + [14203 10607] [14154 10667] [14127 10753] [14127 10835] + ) + Polygon("clearpoly,selected") + ( + [11002 11638] [10839 11703] [10774 11866] [10839 12028] [11002 12099] + [11164 12028] [11230 11866] [11164 11703] [11002 11638] + ) + Polygon("clearpoly,selected") + ( + [14783 11638] [14620 11703] [14555 11866] [14620 12028] [14783 12099] + [14940 12028] [15011 11866] [14940 11703] [14783 11638] + ) + Polygon("clearpoly,selected") + ( + [11002 13433] [10839 13499] [10774 13661] [10839 13819] [11013 13889] + [11164 13819] [11230 13661] [11164 13499] [11002 13433] + ) + Polygon("clearpoly,selected") + ( + [14783 13433] [14620 13499] [14555 13661] [14620 13819] [14783 13889] + [14940 13819] [15011 13661] [14940 13499] [14783 13433] + ) + Polygon("clearpoly,selected") + ( + [11539 14828] [11089 14828] [11089 15408] [11539 15408] [11539 14828] + ) + Polygon("clearpoly,selected") + ( + [11539 15539] [11089 15539] [11089 15723] [11539 15723] [11539 15539] + ) + Polygon("clearpoly,selected") + ( + [14610 14828] [14154 14828] [14154 15408] [14610 15408] [14610 14828] + ) + Polygon("clearpoly,selected") + ( + [14610 15539] [14154 15539] [14154 15723] [14610 15723] [14610 15539] + ) + Polygon("clearpoly,selected") + ( + [11723 12739] [12250 13173] [12906 13320] [13497 13184] [14029 12739] + [13487 12332] [12884 12213] [12228 12348] [11723 12739] + ) + Polygon("clearpoly,selected") + ( + [11951 12739] [12407 12468] [12873 12386] [13329 12468] [13790 12744] + [13362 13043] [12868 13135] [11951 12739] + ) + Polygon("clearpoly,selected") + ( + [12342 12663] [12863 12831] [13416 12663] [12868 12533] [12342 12663] + ) +) Index: pcb-plugins_sources/examples/polycombine/uc_combined.pcb =================================================================== --- pcb-plugins_sources/examples/polycombine/uc_combined.pcb (nonexistent) +++ pcb-plugins_sources/examples/polycombine/uc_combined.pcb (revision 3870) @@ -0,0 +1,2046 @@ +# release: pcb 1.99z +# date: Mon Jun 7 02:26:32 2010 +# user: pcjc2 (Peter Clifton,,,) +# host: pcjc2lap + +# To read pcb files, the pcb version (or the git source date) must be >= the file version +FileVersion[20100606] + +PCB["" 140000 30000] + +Grid[2000.000000 0 0 0] +Cursor[0 0 0.000000] +PolyArea[200000000.000000] +Thermal[0.500000] +DRC[787 787 787 787 1500 1000] +Flags("nameonpcb,uniquename,clearnew,snappin") +Groups("1,c:2,s:3:4:5:6:7:8") +Styles["Signal,1000,3600,2000,1000:Power,2500,6000,3500,1000:Fat,4000,6000,3500,1000:Skinny,600,2402,1181,600"] + +Symbol(' ' 18) +( +) +Symbol('!' 12) +( + SymbolLine(0 45 0 50 8) + SymbolLine(0 10 0 35 8) +) +Symbol('"' 12) +( + SymbolLine(0 10 0 20 8) + SymbolLine(10 10 10 20 8) +) +Symbol('#' 12) +( + SymbolLine(0 35 20 35 8) + SymbolLine(0 25 20 25 8) + SymbolLine(15 20 15 40 8) + SymbolLine(5 20 5 40 8) +) +Symbol('$' 12) +( + SymbolLine(15 15 20 20 8) + SymbolLine(5 15 15 15 8) + SymbolLine(0 20 5 15 8) + SymbolLine(0 20 0 25 8) + SymbolLine(0 25 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 40 8) + SymbolLine(15 45 20 40 8) + SymbolLine(5 45 15 45 8) + SymbolLine(0 40 5 45 8) + SymbolLine(10 10 10 50 8) +) +Symbol('%' 12) +( + SymbolLine(0 15 0 20 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 10 10 8) + SymbolLine(10 10 15 15 8) + SymbolLine(15 15 15 20 8) + SymbolLine(10 25 15 20 8) + SymbolLine(5 25 10 25 8) + SymbolLine(0 20 5 25 8) + SymbolLine(0 50 40 10 8) + SymbolLine(35 50 40 45 8) + SymbolLine(40 40 40 45 8) + SymbolLine(35 35 40 40 8) + SymbolLine(30 35 35 35 8) + SymbolLine(25 40 30 35 8) + SymbolLine(25 40 25 45 8) + SymbolLine(25 45 30 50 8) + SymbolLine(30 50 35 50 8) +) +Symbol('&' 12) +( + SymbolLine(0 45 5 50 8) + SymbolLine(0 15 0 25 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 35 15 20 8) + SymbolLine(5 50 10 50 8) + SymbolLine(10 50 20 40 8) + SymbolLine(0 25 25 50 8) + SymbolLine(5 10 10 10 8) + SymbolLine(10 10 15 15 8) + SymbolLine(15 15 15 20 8) + SymbolLine(0 35 0 45 8) +) +Symbol(''' 12) +( + SymbolLine(0 20 10 10 8) +) +Symbol('(' 12) +( + SymbolLine(0 45 5 50 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 45 8) +) +Symbol(')' 12) +( + SymbolLine(0 10 5 15 8) + SymbolLine(5 15 5 45 8) + SymbolLine(0 50 5 45 8) +) +Symbol('*' 12) +( + SymbolLine(0 20 20 40 8) + SymbolLine(0 40 20 20 8) + SymbolLine(0 30 20 30 8) + SymbolLine(10 20 10 40 8) +) +Symbol('+' 12) +( + SymbolLine(0 30 20 30 8) + SymbolLine(10 20 10 40 8) +) +Symbol(',' 12) +( + SymbolLine(0 60 10 50 8) +) +Symbol('-' 12) +( + SymbolLine(0 30 20 30 8) +) +Symbol('.' 12) +( + SymbolLine(0 50 5 50 8) +) +Symbol('/' 12) +( + SymbolLine(0 45 30 15 8) +) +Symbol('0' 12) +( + SymbolLine(0 45 5 50 8) + SymbolLine(0 15 0 45 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 40 20 20 8) +) +Symbol('1' 12) +( + SymbolLine(5 50 15 50 8) + SymbolLine(10 10 10 50 8) + SymbolLine(0 20 10 10 8) +) +Symbol('2' 12) +( + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 25 8) + SymbolLine(0 50 25 25 8) + SymbolLine(0 50 25 50 8) +) +Symbol('3' 12) +( + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 30 20 30 8) +) +Symbol('4' 12) +( + SymbolLine(0 30 20 10 8) + SymbolLine(0 30 25 30 8) + SymbolLine(20 10 20 50 8) +) +Symbol('5' 12) +( + SymbolLine(0 10 20 10 8) + SymbolLine(0 10 0 30 8) + SymbolLine(0 30 5 25 8) + SymbolLine(5 25 15 25 8) + SymbolLine(15 25 20 30 8) + SymbolLine(20 30 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('6' 12) +( + SymbolLine(15 10 20 15 8) + SymbolLine(5 10 15 10 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(15 30 20 35 8) + SymbolLine(0 30 15 30 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(20 35 20 45 8) +) +Symbol('7' 12) +( + SymbolLine(0 50 25 25 8) + SymbolLine(25 10 25 25 8) + SymbolLine(0 10 25 10 8) +) +Symbol('8' 12) +( + SymbolLine(0 45 5 50 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 25 5 30 8) + SymbolLine(0 15 0 25 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 25 8) + SymbolLine(15 30 20 25 8) +) +Symbol('9' 12) +( + SymbolLine(0 50 20 30 8) + SymbolLine(20 15 20 30 8) + SymbolLine(15 10 20 15 8) + SymbolLine(5 10 15 10 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 25 8) + SymbolLine(0 25 5 30 8) + SymbolLine(5 30 20 30 8) +) +Symbol(':' 12) +( + SymbolLine(0 25 5 25 8) + SymbolLine(0 35 5 35 8) +) +Symbol(';' 12) +( + SymbolLine(0 50 10 40 8) + SymbolLine(10 25 10 30 8) +) +Symbol('<' 12) +( + SymbolLine(0 30 10 20 8) + SymbolLine(0 30 10 40 8) +) +Symbol('=' 12) +( + SymbolLine(0 25 20 25 8) + SymbolLine(0 35 20 35 8) +) +Symbol('>' 12) +( + SymbolLine(0 20 10 30 8) + SymbolLine(0 40 10 30 8) +) +Symbol('?' 12) +( + SymbolLine(10 30 10 35 8) + SymbolLine(10 45 10 50 8) + SymbolLine(0 15 0 20 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 20 8) + SymbolLine(10 30 20 20 8) +) +Symbol('@' 12) +( + SymbolLine(0 10 0 40 8) + SymbolLine(0 40 10 50 8) + SymbolLine(10 50 40 50 8) + SymbolLine(50 35 50 10 8) + SymbolLine(50 10 40 0 8) + SymbolLine(40 0 10 0 8) + SymbolLine(10 0 0 10 8) + SymbolLine(15 20 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 30 35 8) + SymbolLine(30 35 35 30 8) + SymbolLine(35 30 40 35 8) + SymbolLine(35 30 35 15 8) + SymbolLine(35 20 30 15 8) + SymbolLine(20 15 30 15 8) + SymbolLine(20 15 15 20 8) + SymbolLine(40 35 50 35 8) +) +Symbol('A' 12) +( + SymbolLine(0 15 0 50 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 50 8) + SymbolLine(0 30 25 30 8) +) +Symbol('B' 12) +( + SymbolLine(0 50 20 50 8) + SymbolLine(20 50 25 45 8) + SymbolLine(25 35 25 45 8) + SymbolLine(20 30 25 35 8) + SymbolLine(5 30 20 30 8) + SymbolLine(5 10 5 50 8) + SymbolLine(0 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 25 8) + SymbolLine(20 30 25 25 8) +) +Symbol('C' 12) +( + SymbolLine(5 50 20 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(0 15 0 45 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 20 10 8) +) +Symbol('D' 12) +( + SymbolLine(5 10 5 50 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 45 8) + SymbolLine(20 50 25 45 8) + SymbolLine(0 50 20 50 8) + SymbolLine(0 10 20 10 8) +) +Symbol('E' 12) +( + SymbolLine(0 30 15 30 8) + SymbolLine(0 50 20 50 8) + SymbolLine(0 10 0 50 8) + SymbolLine(0 10 20 10 8) +) +Symbol('F' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 10 20 10 8) + SymbolLine(0 30 15 30 8) +) +Symbol('G' 12) +( + SymbolLine(20 10 25 15 8) + SymbolLine(5 10 20 10 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 20 50 8) + SymbolLine(20 50 25 45 8) + SymbolLine(25 35 25 45 8) + SymbolLine(20 30 25 35 8) + SymbolLine(10 30 20 30 8) +) +Symbol('H' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(25 10 25 50 8) + SymbolLine(0 30 25 30 8) +) +Symbol('I' 12) +( + SymbolLine(0 10 10 10 8) + SymbolLine(5 10 5 50 8) + SymbolLine(0 50 10 50 8) +) +Symbol('J' 12) +( + SymbolLine(0 10 15 10 8) + SymbolLine(15 10 15 45 8) + SymbolLine(10 50 15 45 8) + SymbolLine(5 50 10 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('K' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 30 20 10 8) + SymbolLine(0 30 20 50 8) +) +Symbol('L' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 50 20 50 8) +) +Symbol('M' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 10 15 25 8) + SymbolLine(15 25 30 10 8) + SymbolLine(30 10 30 50 8) +) +Symbol('N' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 10 0 15 8) + SymbolLine(0 15 25 40 8) + SymbolLine(25 10 25 50 8) +) +Symbol('O' 12) +( + SymbolLine(0 15 0 45 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('P' 12) +( + SymbolLine(5 10 5 50 8) + SymbolLine(0 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 25 8) + SymbolLine(20 30 25 25 8) + SymbolLine(5 30 20 30 8) +) +Symbol('Q' 12) +( + SymbolLine(0 15 0 45 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(10 40 20 50 8) +) +Symbol('R' 12) +( + SymbolLine(0 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 25 8) + SymbolLine(20 30 25 25 8) + SymbolLine(5 30 20 30 8) + SymbolLine(5 10 5 50 8) + SymbolLine(5 30 25 50 8) +) +Symbol('S' 12) +( + SymbolLine(20 10 25 15 8) + SymbolLine(5 10 20 10 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 25 8) + SymbolLine(0 25 5 30 8) + SymbolLine(5 30 20 30 8) + SymbolLine(20 30 25 35 8) + SymbolLine(25 35 25 45 8) + SymbolLine(20 50 25 45 8) + SymbolLine(5 50 20 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('T' 12) +( + SymbolLine(0 10 20 10 8) + SymbolLine(10 10 10 50 8) +) +Symbol('U' 12) +( + SymbolLine(0 10 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(20 10 20 45 8) +) +Symbol('V' 12) +( + SymbolLine(0 10 0 40 8) + SymbolLine(0 40 10 50 8) + SymbolLine(10 50 20 40 8) + SymbolLine(20 10 20 40 8) +) +Symbol('W' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 50 15 35 8) + SymbolLine(15 35 30 50 8) + SymbolLine(30 10 30 50 8) +) +Symbol('X' 12) +( + SymbolLine(0 10 0 15 8) + SymbolLine(0 15 25 40 8) + SymbolLine(25 40 25 50 8) + SymbolLine(0 40 0 50 8) + SymbolLine(0 40 25 15 8) + SymbolLine(25 10 25 15 8) +) +Symbol('Y' 12) +( + SymbolLine(0 10 0 15 8) + SymbolLine(0 15 10 25 8) + SymbolLine(10 25 20 15 8) + SymbolLine(20 10 20 15 8) + SymbolLine(10 25 10 50 8) +) +Symbol('Z' 12) +( + SymbolLine(0 10 25 10 8) + SymbolLine(25 10 25 15 8) + SymbolLine(0 40 25 15 8) + SymbolLine(0 40 0 50 8) + SymbolLine(0 50 25 50 8) +) +Symbol('[' 12) +( + SymbolLine(0 10 5 10 8) + SymbolLine(0 10 0 50 8) + SymbolLine(0 50 5 50 8) +) +Symbol('\' 12) +( + SymbolLine(0 15 30 45 8) +) +Symbol(']' 12) +( + SymbolLine(0 10 5 10 8) + SymbolLine(5 10 5 50 8) + SymbolLine(0 50 5 50 8) +) +Symbol('^' 12) +( + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 10 15 8) +) +Symbol('_' 12) +( + SymbolLine(0 50 20 50 8) +) +Symbol('a' 12) +( + SymbolLine(15 30 20 35 8) + SymbolLine(5 30 15 30 8) + SymbolLine(0 35 5 30 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(20 30 20 45 8) + SymbolLine(20 45 25 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) +) +Symbol('b' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(20 35 20 45 8) + SymbolLine(15 30 20 35 8) + SymbolLine(5 30 15 30 8) + SymbolLine(0 35 5 30 8) +) +Symbol('c' 12) +( + SymbolLine(5 30 20 30 8) + SymbolLine(0 35 5 30 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 20 50 8) +) +Symbol('d' 12) +( + SymbolLine(20 10 20 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) +) +Symbol('e' 12) +( + SymbolLine(5 50 20 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(0 40 20 40 8) + SymbolLine(20 40 20 35 8) +) +Symbol('f' 10) +( + SymbolLine(5 15 5 50 8) + SymbolLine(5 15 10 10 8) + SymbolLine(10 10 15 10 8) + SymbolLine(0 30 10 30 8) +) +Symbol('g' 12) +( + SymbolLine(15 30 20 35 8) + SymbolLine(5 30 15 30 8) + SymbolLine(0 35 5 30 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(0 60 5 65 8) + SymbolLine(5 65 15 65 8) + SymbolLine(15 65 20 60 8) + SymbolLine(20 30 20 60 8) +) +Symbol('h' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 50 8) +) +Symbol('i' 10) +( + SymbolLine(0 20 0 25 8) + SymbolLine(0 35 0 50 8) +) +Symbol('j' 10) +( + SymbolLine(5 20 5 25 8) + SymbolLine(5 35 5 60 8) + SymbolLine(0 65 5 60 8) +) +Symbol('k' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 35 15 50 8) + SymbolLine(0 35 10 25 8) +) +Symbol('l' 10) +( + SymbolLine(0 10 0 45 8) + SymbolLine(0 45 5 50 8) +) +Symbol('m' 12) +( + SymbolLine(5 35 5 50 8) + SymbolLine(5 35 10 30 8) + SymbolLine(10 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 50 8) + SymbolLine(20 35 25 30 8) + SymbolLine(25 30 30 30 8) + SymbolLine(30 30 35 35 8) + SymbolLine(35 35 35 50 8) + SymbolLine(0 30 5 35 8) +) +Symbol('n' 12) +( + SymbolLine(5 35 5 50 8) + SymbolLine(5 35 10 30 8) + SymbolLine(10 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 50 8) + SymbolLine(0 30 5 35 8) +) +Symbol('o' 12) +( + SymbolLine(0 35 0 45 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('p' 12) +( + SymbolLine(5 35 5 65 8) + SymbolLine(0 30 5 35 8) + SymbolLine(5 35 10 30 8) + SymbolLine(10 30 20 30 8) + SymbolLine(20 30 25 35 8) + SymbolLine(25 35 25 45 8) + SymbolLine(20 50 25 45 8) + SymbolLine(10 50 20 50 8) + SymbolLine(5 45 10 50 8) +) +Symbol('q' 12) +( + SymbolLine(20 35 20 65 8) + SymbolLine(15 30 20 35 8) + SymbolLine(5 30 15 30 8) + SymbolLine(0 35 5 30 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) +) +Symbol('r' 12) +( + SymbolLine(5 35 5 50 8) + SymbolLine(5 35 10 30 8) + SymbolLine(10 30 20 30 8) + SymbolLine(0 30 5 35 8) +) +Symbol('s' 12) +( + SymbolLine(5 50 20 50 8) + SymbolLine(20 50 25 45 8) + SymbolLine(20 40 25 45 8) + SymbolLine(5 40 20 40 8) + SymbolLine(0 35 5 40 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 20 30 8) + SymbolLine(20 30 25 35 8) + SymbolLine(0 45 5 50 8) +) +Symbol('t' 10) +( + SymbolLine(5 10 5 45 8) + SymbolLine(5 45 10 50 8) + SymbolLine(0 25 10 25 8) +) +Symbol('u' 12) +( + SymbolLine(0 30 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(20 30 20 45 8) +) +Symbol('v' 12) +( + SymbolLine(0 30 0 40 8) + SymbolLine(0 40 10 50 8) + SymbolLine(10 50 20 40 8) + SymbolLine(20 30 20 40 8) +) +Symbol('w' 12) +( + SymbolLine(0 30 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 10 50 8) + SymbolLine(10 50 15 45 8) + SymbolLine(15 30 15 45 8) + SymbolLine(15 45 20 50 8) + SymbolLine(20 50 25 50 8) + SymbolLine(25 50 30 45 8) + SymbolLine(30 30 30 45 8) +) +Symbol('x' 12) +( + SymbolLine(0 30 20 50 8) + SymbolLine(0 50 20 30 8) +) +Symbol('y' 12) +( + SymbolLine(0 30 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(20 30 20 60 8) + SymbolLine(15 65 20 60 8) + SymbolLine(5 65 15 65 8) + SymbolLine(0 60 5 65 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) +) +Symbol('z' 12) +( + SymbolLine(0 30 20 30 8) + SymbolLine(0 50 20 30 8) + SymbolLine(0 50 20 50 8) +) +Symbol('{' 12) +( + SymbolLine(5 15 10 10 8) + SymbolLine(5 15 5 25 8) + SymbolLine(0 30 5 25 8) + SymbolLine(0 30 5 35 8) + SymbolLine(5 35 5 45 8) + SymbolLine(5 45 10 50 8) +) +Symbol('|' 12) +( + SymbolLine(0 10 0 50 8) +) +Symbol('}' 12) +( + SymbolLine(0 10 5 15 8) + SymbolLine(5 15 5 25 8) + SymbolLine(5 25 10 30 8) + SymbolLine(5 35 10 30 8) + SymbolLine(5 35 5 45 8) + SymbolLine(0 50 5 45 8) +) +Symbol('~' 12) +( + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 10 30 8) + SymbolLine(10 30 15 35 8) + SymbolLine(15 35 20 35 8) + SymbolLine(20 35 25 30 8) +) +Layer(1 "component") +( +) +Layer(2 "solder") +( +) +Layer(3 "outline") +( +) +Layer(4 "GND") +( +) +Layer(5 "power") +( +) +Layer(6 "signal1") +( +) +Layer(7 "signal2") +( +) +Layer(8 "signal3") +( +) +Layer(9 "signal9") +( +) +Layer(10 "silk") +( + Polygon("") + ( + [39463 646] [39463 999] [39230 999] [38937 1015] [38638 1129] + [38400 1449] [38307 2078] [38307 6500] [38085 8269] [37412 9522] + [36289 10271] [34705 10520] [32925 10308] [31678 9679] [30940 8610] + [30701 7091] [30701 2078] [30598 1449] [30343 1129] [29985 1015] + [29600 999] [29491 999] [29491 646] [33582 646] [33582 999] + [33474 999] [33077 1015] [32709 1129] [32432 1449] [32329 2078] + [32329 6863] [32486 8214] [32980 9169] [33805 9744] [34965 9934] + [36105 9728] [36930 9137] [37429 8155] [37602 6809] [37602 2078] + [37499 1449] [37250 1129] [36913 1015] [36571 999] [36349 999] + [36349 646] + ) + Polygon("") + ( + [43885 9956] [43885 10308] [40434 10308] [40434 9956] [40570 9956] + [41243 9804] [41628 9402] [41801 8816] [41845 8122] [41845 2317] + [41747 1715] [41481 1308] [41069 1069] [40554 999] [40434 999] + [40434 646] [43147 646] [49023 7845] [49023 2371] [48876 1633] + [48540 1221] [48133 1037] [47786 999] [47541 999] [47541 646] + [51025 646] [51025 999] [50878 999] [50417 1042] [50015 1281] + [49722 1829] [49614 2832] [49614 10357] [49099 10363] [42436 2301] + [42436 8117] [42474 8811] [42653 9397] [43049 9804] [43749 9956] + ) + Polygon("") + ( + [62396 8263] [64523 2322] [64685 1682] [64620 1275] [64317 1058] + [63779 999] [63600 999] [63600 646] [66351 646] [66351 999] + [66291 999] [65819 1123] [65380 1753] [62157 10347] [61544 10347] + [58050 1834] [57822 1400] [57567 1145] [57247 1026] [56857 999] + [56775 999] [56775 646] [60768 646] [60768 999] [60513 999] + [60096 1069] [59868 1275] [59803 1579] [59889 1948] + ) + Polygon("") + ( + [80007 646] [81406 792] [82410 1237] [83007 1991] [83208 3055] + [83023 3961] [82567 4650] [81944 5138] [81293 5469] [81227 5496] + [83598 9104] [84163 9728] [84944 9950] [84944 10308] [82464 10308] + [79589 5773] [78520 5773] [78520 8784] [78607 9424] [78846 9777] + [79220 9923] [79692 9956] [79882 9956] [79882 10308] [75683 10308] + [75683 9956] [75873 9956] [76231 9912] [76556 9771] [76795 9522] + [76893 9147] [76893 2122] [76779 1471] [76513 1134] [76176 1015] + [75873 999] [75683 999] [75683 646] + Hole ( + [78526 1102] [78520 5382] [79350 5382] [80321 5252] [80994 4845] + [81390 4151] [81520 3142] [81368 2274] [80951 1612] [80300 1188] + [79459 1042] + ) + ) + Polygon("") + ( + [90049 8475] [89875 7710] [89425 7151] [88796 6717] [88096 6348] + [87260 5892] [86495 5323] [85937 4525] [85725 3391] [85958 2214] + [86615 1319] [87624 749] [88920 548] [90071 635] [90939 782] + [91069 2664] [90711 2713] [90516 2019] [90163 1465] [89637 1096] + [88915 966] [88188 1080] [87613 1427] [87233 1991] [87098 2762] + [87266 3467] [87716 3999] [88340 4411] [89040 4775] [89903 5225] + [90700 5800] [91275 6603] [91503 7748] [91199 9039] [90407 9940] + [89311 10460] [88085 10634] [86967 10515] [85795 10091] [85562 7997] + [85915 7938] [86224 8865] [86734 9554] [87412 9978] [88226 10129] + [88975 10005] [89550 9668] [89919 9142] + ) + Polygon("") + ( + [96945 646] [96945 999] [96809 999] [96408 1026] [96066 1140] + [95832 1400] [95746 1856] [95746 9104] [95832 9549] [96066 9809] + [96408 9923] [96809 9956] [96945 9956] [96945 10308] [92908 10308] + [92908 9956] [93044 9956] [93440 9923] [93776 9809] [94009 9549] + [94102 9104] [94102 1856] [94009 1400] [93776 1140] [93440 1026] + [93044 999] [92908 999] [92908 646] + ) + Polygon("") + ( + [56217 646] [56217 999] [56075 999] [55674 1026] [55338 1140] + [55104 1400] [55018 1856] [55018 9104] [55104 9549] [55338 9809] + [55674 9923] [56075 9956] [56217 9956] [56217 10308] [52180 10308] + [52180 9956] [52316 9956] [52712 9923] [53048 9809] [53281 9549] + [53374 9104] [53374 1856] [53281 1400] [53048 1140] [52712 1026] + [52316 999] [52180 999] [52180 646] + ) + Polygon("") + ( + [136658 14605] [136691 17166] [136523 17210] [136284 17275] [136159 16477] + [135850 15831] [135220 15392] [134146 15235] [131732 15235] [131732 19976] + [133805 19976] [134434 19868] [134841 19570] [135079 19081] [135210 18430] + [135622 18430] [135622 22396] [135210 22402] [135117 21740] [134900 21203] + [134488 20845] [133810 20720] [131732 20720] [131732 24881] [131911 25575] + [132388 25939] [133077 26069] [133880 26091] [134569 26080] [135177 26037] + [135692 25944] [136137 25776] [136517 25516] [136832 25136] [137103 24626] + [137331 23964] [137564 24018] [137738 24056] [137185 26726] [128184 26726] + [128184 26281] [128357 26281] [128851 26243] [129280 26096] [129573 25776] + [129687 25212] [129687 16119] [129573 15549] [129280 15224] [128851 15077] + [128357 15045] [128184 15045] [128184 14605] + ) + Polygon("") + ( + [87618 14605] [89376 14790] [90635 15349] [91384 16293] [91639 17622] + [91411 18761] [90830 19618] [90049 20237] [89230 20655] [89148 20682] + [92127 25212] [92469 25679] [92838 25999] [93266 26188] [93809 26275] + [93809 26726] [90705 26726] [87098 21034] [85758 21034] [85758 24810] + [85861 25613] [86165 26058] [86631 26243] [87222 26281] [87461 26281] + [87461 26726] [82193 26726] [82193 26281] [82432 26281] [82877 26226] + [83289 26053] [83593 25738] [83712 25266] [83712 16450] [83571 15636] + [83240 15218] [82817 15067] [82432 15045] [82193 15045] [82193 14605] + Hole ( + [85758 15175] [85758 20541] [86794 20541] [88014 20378] [88861 19873] + [89349 19000] [89512 17730] [89322 16640] [88801 15810] [87987 15284] + [86929 15099] + ) + ) + Polygon("") + ( + [99609 14600] [99609 15045] [99440 15045] [98936 15077] [98513 15224] + [98220 15549] [98111 16114] [98111 25212] [98220 25771] [98513 26096] + [98936 26243] [99440 26281] [99609 26281] [99609 26726] [94547 26726] + [94547 26281] [94715 26281] [95214 26243] [95637 26096] [95930 25771] + [96044 25212] [96044 16114] [95930 15549] [95637 15224] [95214 15077] + [94715 15045] [94547 15045] [94547 14600] + ) + Polygon("") + ( + [99044 646] [105435 646] [105935 548] [106238 147] [106548 141] + [106303 2664] [105956 2664] [105918 2192] [105777 1731] [105468 1378] + [104920 1237] [102967 1237] [102967 8697] [103059 9381] [103319 9761] + [103699 9918] [104150 9956] [104356 9956] [104356 10308] [99950 10308] + [99950 9956] [100156 9956] [100645 9923] [101019 9777] [101252 9408] + [101334 8724] [101334 1237] [99364 1237] [98762 1319] [98409 1579] + [98209 2019] [98068 2653] [97720 2653] [97943 163] [98225 163] + [98550 554] + ) + Polygon("") + ( + [116432 646] [116432 1004] [115743 1264] [115288 1769] [115179 1926] + [114903 2355] [114506 2963] [114062 3657] [113611 4351] [113215 4959] + [112939 5388] [112835 5551] [112835 8643] [112911 9365] [113150 9755] + [113519 9918] [114018 9956] [114224 9956] [114224 10308] [109819 10308] + [109819 9956] [110025 9956] [110530 9907] [110899 9733] [111121 9365] + [111202 8751] [111202 5784] [108539 1975] [108246 1574] [107947 1264] + [107605 1064] [107182 999] [107101 999] [107101 646] [111094 646] + [111094 999] [110969 999] [110519 1069] [110313 1259] [110307 1536] + [110475 1872] [112543 5068] [114365 2181] [114604 1731] [114658 1351] + [114441 1091] [113872 999] [113709 999] [113714 646] + ) + Polygon("") + ( + [119368 5551] [119465 4503] [119747 3538] [120198 2670] [120800 1916] + [121532 1292] [122373 825] [123312 532] [124326 434] [125417 521] + [126410 782] [127283 1199] [128037 1764] [128645 2463] [129095 3277] + [129377 4200] [129475 5214] [129377 6321] [129090 7341] [128640 8241] + [128037 9017] [127294 9652] [126426 10119] [125455 10417] [124391 10520] + [123339 10422] [122373 10146] [121521 9706] [120784 9115] [120187 8388] + [119742 7542] [119460 6587] + Hole ( + [121158 5057] [121207 5952] [121359 6836] [121614 7672] [121972 8431] + [122444 9071] [123024 9576] [123719 9896] [124527 10016] [125911 9733] + [126898 8898] [127484 7498] [127679 5523] [127620 4688] [127457 3869] + [127185 3093] [126811 2398] [126328 1801] [125748 1346] [125070 1047] + [124299 944] [123323 1080] [122574 1449] [122021 1986] [121635 2637] + [121380 3326] [121234 4004] [121169 4601] + ) + ) + Polygon("") + ( + [130576 10308] [130576 9956] [130712 9956] [131108 9923] [131444 9809] + [131678 9549] [131770 9104] [131770 1856] [131678 1400] [131444 1140] + [131108 1026] [130712 999] [130576 999] [130576 646] [137331 646] + [137353 2691] [137027 2778] [136935 2171] [136723 1650] [136305 1286] + [135611 1151] [133403 1151] [133403 4932] [135340 4932] [135817 4823] + [136094 4552] [136224 4183] [136262 3798] [136577 3798] [136577 6896] + [136262 6896] [136213 6424] [136056 5979] [135714 5648] [135123 5523] + [133403 5523] [133403 9104] [133522 9592] [133842 9847] [134276 9940] + [134759 9956] [134884 9956] [134884 10308] + ) + Polygon("") + ( + [30256 20655] [30386 19315] [30777 18050] [31401 16906] [32247 15956] + [33186 15256] [34249 14741] [35416 14426] [36680 14318] [38839 14529] + [40787 15191] [40912 17996] [40516 18050] [40326 17448] [40087 16873] + [39789 16347] [39409 15880] [38931 15484] [38335 15186] [37608 14996] + [36729 14931] [35785 15023] [34944 15305] [34211 15766] [33593 16396] + [33105 17177] [32741 18110] [32519 19179] [32448 20383] [32508 21490] + [32703 22553] [33034 23541] [33511 24420] [34135 25152] [34922 25716] + [35866 26080] [36984 26210] [38242 26080] [39327 25711] [40255 25109] + [41047 24284] [41367 24881] [40440 25814] [39322 26492] [38047 26905] + [36658 27046] [35258 26937] [34005 26617] [32915 26096] [31992 25380] + [31249 24469] [30707 23373] [30370 22098] + ) + Polygon("") + ( + [56396 16949] [56374 17269] [56330 18116] [56265 19315] [56195 20693] + [56119 22065] [56054 23264] [56010 24111] [55994 24436] [56048 25413] + [56325 25961] [56824 26205] [57551 26281] [57654 26281] [57654 26720] + [53569 26720] [53569 26281] [53721 26281] [54529 26107] [54974 25706] + [55175 25103] [55245 24338] [55723 16678] [55652 15978] [55365 15463] + [54893 15148] [54247 15039] [54106 15039] [54106 14595] [57540 14595] + [57589 14708] [57725 15012] [57931 15479] [58197 16070] [58511 16765] + [58859 17540] [59228 18371] [59613 19222] [59993 20074] [60361 20899] + [60709 21669] [61018 22358] [61278 22944] [61479 23389] [61609 23682] + [61658 23785] [61696 23682] [61821 23389] [62011 22944] [62260 22358] + [62548 21669] [62879 20899] [63226 20074] [63590 19222] [63948 18371] + [64300 17540] [64626 16765] [64924 16070] [65174 15479] [65369 15012] + [65499 14708] [65554 14595] [68917 14595] [68917 15039] [68852 15039] + [68022 15132] [67545 15463] [67344 16119] [67349 17177] [67816 25217] + [67946 25776] [68239 26085] [68695 26226] [69313 26281] [69313 26715] + [64279 26715] [64279 26281] [64311 26275] [64875 26226] [65326 26113] + [65619 25847] [65727 25369] [65705 24501] [65689 24165] [65646 23286] + [65586 22044] [65521 20622] [65450 19201] [65391 17958] [65347 17079] + [65337 16748] [65288 16857] [65158 17172] [64951 17665] [64685 18305] + [64371 19060] [64018 19906] [63644 20807] [63253 21740] [62863 22673] + [62488 23579] [62136 24431] [61815 25196] [61544 25841] [61338 26346] + [61197 26677] [61148 26807] [60779 26807] [60720 26677] [60579 26351] + [60356 25858] [60074 25223] [59743 24474] [59374 23644] [58978 22754] + [58571 21837] [58164 20926] [57768 20042] [57399 19211] [57074 18474] + [56792 17850] [56580 17367] [56439 17058] + ) + Polygon("") + ( + [101518 26726] [101518 26281] [101692 26281] [102185 26243] [102614 26096] + [102907 25771] [103021 25206] [103021 16114] [102907 15549] [102614 15224] + [102185 15077] [101692 15045] [101518 15045] [101518 14600] [106938 14595] + [108381 14687] [109689 14985] [110839 15484] [111821 16200] [112586 17090] + [113139 18137] [113481 19320] [113595 20628] [113470 21886] [113107 23085] + [112521 24181] [111740 25141] [110763 25885] [109656 26368] [108457 26639] + [107215 26720] + Hole ( + [105077 15180] [105077 24697] [105180 25467] [105511 25923] [106081 26134] + [106922 26188] [107991 26069] [108908 25733] [109673 25217] [110296 24545] + [110774 23752] [111110 22874] [111311 21935] [111381 20969] [111300 19559] + [111067 18354] [110676 17351] [110123 16537] [109412 15907] [108539 15468] + [107502 15202] [106309 15121] [105690 15137] + ) + ) + Polygon("") + ( + [123914 26102] [123914 23129] [123822 22695] [123561 22385] [123133 22195] + [122547 22136] [122400 22136] [122400 21702] [127061 21702] [127061 22136] + [126920 22136] [126176 22385] [125927 23129] [125921 26438] [123995 26888] + [121663 27078] [120225 26959] [118939 26606] [117816 26042] [116861 25277] + [116096 24322] [115537 23194] [115185 21902] [115071 20470] [115223 18973] + [115651 17692] [116319 16624] [117176 15756] [118185 15094] [119303 14622] + [120485 14340] [121695 14253] [122769 14302] [123805 14432] [124750 14627] + [125547 14855] [125737 17747] [125330 17774] [124864 16439] [124164 15539] + [123171 15029] [121814 14871] [120811 14963] [119916 15246] [119145 15701] + [118494 16325] [117979 17106] [117599 18034] [117366 19098] [117290 20291] + [117355 21430] [117561 22537] [117914 23573] [118413 24496] [119058 25277] + [119861 25879] [120822 26264] [121950 26406] [123035 26335] + ) + Polygon("") + ( + [77082 20123] [78097 20248] [78905 20476] [79551 20812] [80099 21273] + [80701 22185] [80907 23291] [80826 23980] [80598 24626] [80235 25212] + [79752 25716] [79160 26134] [78477 26449] [77717 26650] [76898 26720] + [70957 26720] [70957 26281] [71196 26281] [71641 26221] [72053 26042] + [72357 25722] [72476 25250] [72476 16450] [72335 15636] [71999 15224] + [71581 15072] [71196 15050] [70957 15050] [70957 14605] [76339 14600] + [78016 14768] [79242 15273] [79996 16103] [80256 17253] [80180 17915] + [79969 18474] [79643 18940] [79225 19315] [78737 19613] [78205 19841] + [77641 20009] + Hole ( + [74598 15050] [74598 19917] [75509 19917] [76616 19765] [77430 19315] + [77923 18577] [78097 17557] [77945 16439] [77489 15658] [76741 15197] + [75694 15050] + ) + Hole ( + [74598 20448] [74598 24713] [74674 25445] [74934 25917] [75428 26161] + [76204 26237] [77229 26020] [78048 25418] [78591 24512] [78791 23367] + [78580 22119] [77983 21208] [77034 20638] [75759 20448] + ) + ) + Polygon("") + ( + [46532 17074] [48225 21794] [44834 21794] + ) + Polygon("") + ( + [73757 646] [73784 2691] [73648 2724] [73458 2773] [73361 2138] + [73111 1622] [72607 1275] [71749 1151] [69834 1151] [69834 4926] + [71478 4926] [71977 4840] [72308 4601] [72498 4216] [72601 3695] + [72927 3695] [72927 6858] [72601 6858] [72531 6326] [72357 5903] + [72026 5621] [71484 5518] [69834 5518] [69834 8833] [69975 9386] + [70355 9674] [70903 9782] [71543 9798] [72574 9755] [73339 9549] + [73898 9039] [74294 8106] [74478 8144] [74614 8176] [74175 10303] + [67002 10303] [67002 9950] [67138 9950] [67534 9918] [67876 9804] + [68109 9544] [68201 9099] [68201 1850] [68109 1400] [67876 1140] + [67534 1026] [67138 999] [67002 999] [67002 646] + ) + Polygon("") + ( + [6390 532] [19406 532] [19997 527] [21321 527] [22579 499] + [24467 434] [25015 413] [24961 1134] [24934 1655] [24918 2078] + [24918 2507] [24907 4254] [24901 5909] [24901 15164] [24831 17204] + [24592 18929] [24147 20400] [23453 21675] [22460 22819] [21136 23894] + [19427 24962] [17295 26080] [16590 26433] [15309 27078] [14224 27632] + [13530 27995] [13215 28163] [12895 28332] [12575 28163] [12255 27995] + [10264 26964] [8490 26080] [6358 24968] [4654 23910] [3330 22836] + [2337 21691] [1643 20410] [1198 18940] [959 17210] [894 15164] + [894 5909] [878 4254] [867 2507] [856 1845] [845 1362] + [818 923] [770 413] [1317 434] [3200 499] [4475 527] + [5788 527] + Hole ( + [1741 1541] [1833 1801] [1762 2176] [1714 2480] [1914 2756] + [1952 2778] [1963 2811] [1974 2881] [1985 3033] [2001 3245] + [2001 3294] [1969 3342] [1963 3337] [1947 3321] [1931 3304] + [1914 3277] [1860 3174] [1817 3087] [1410 2838] [1307 2838] + [1269 2865] [1274 2881] [1290 2892] [1307 2908] [1328 2925] + [1496 3299] [1703 3722] [2001 3961] [2050 4010] [1979 4069] + [1898 4053] [1784 4031] [1708 4124] [1779 4422] [1952 4688] + [2077 4813] [2169 4889] [2229 4932] [2272 5002] [2245 5046] + [2207 5046] [2175 5024] [2153 5019] [2115 5002] [2077 4986] + [2044 4981] [2001 5051] [2012 5133] [2050 5268] [2337 5719] + [2647 5881] [2733 5903] [2793 5919] [2831 5936] [2750 6022] + [2620 6022] [2565 6017] [2538 6017] [2424 6077] [2435 6109] + [2457 6164] [2511 6277] [2630 6489] [2712 6576] [2771 6614] + [2847 6527] [2902 6462] [2999 6337] [3336 6153] [3509 6109] + [3661 5979] [3650 5827] [3618 5697] [3602 5529] [3585 5328] + [3585 5230] [3564 5176] [3558 5154] [3526 5149] [3520 5144] + [3498 5154] [3466 5187] [3428 5225] [3374 5290] [3092 5475] + [2766 5361] [2516 5057] [2359 4574] [2305 3955] [2316 3478] + [2348 2957] [2370 2583] [2202 1981] + ) + Hole ( + [2853 3342] [2853 3315] [2739 3044] [2625 2984] [2527 3163] + [2506 3397] [2478 3673] [2538 3803] [2679 3706] + ) + Hole ( + [1746 7889] [1887 7948] [2039 8090] [2191 8225] [2305 8263] + [2750 8090] [2837 8008] [2918 7948] [2875 7948] [2544 7851] + [2327 7764] [2148 7748] + ) + Hole ( + [5110 8231] [5213 8323] [5251 8377] [5289 8421] [5365 8524] + [5582 8616] [5620 8616] [5750 8600] [5842 8589] [5896 8578] + [5951 8540] [5728 8290] [5603 8209] [5376 8166] [5207 8203] + ) + Hole ( + [4914 9402] [5104 9348] [5191 9354] [5300 9365] [5414 9370] + [5517 9381] [5598 9348] [5734 9223] [5864 9110] [6059 9012] + [6320 8882] [6358 8860] [6379 8882] [6341 8936] [6141 9164] + [6065 9424] [6146 9701] [6390 9375] [6575 9223] [6732 9028] + [6775 8751] [6770 8719] [6770 8676] [6824 8594] [6840 8600] + [6873 8654] [6884 8697] [6916 8746] [6949 8773] [6954 8779] + [7106 8676] [7242 8486] [7269 8328] [7231 8149] [7182 8046] + [7166 7981] [7215 7916] [7237 7927] [7274 7959] [7307 8003] + [7432 8095] [7546 7997] [7595 7894] [7627 7813] [7638 7764] + [7535 7699] [7302 7547] [7215 7254] [7220 7086] [7253 6977] + [7291 6891] [7312 6787] [7329 6717] [7307 6657] [7274 6603] + [7231 6478] [7177 6370] [7123 6245] [6987 6104] [6808 6185] + [6640 6272] [6450 6456] [6379 6760] [6542 7314] [6710 7661] + [6797 7986] [6548 8469] [5880 8730] [5479 8800] [5213 8920] + [5039 9110] + ) + Hole ( + [7893 8827] [7942 8822] [8001 8806] [8262 8806] [8327 8811] + [8452 8681] [8506 8600] [8625 8421] [8408 8366] [8083 8496] + ) + Hole ( + [16243 1541] [16335 1801] [16264 2176] [16215 2480] [16416 2756] + [16476 2881] [16487 3033] [16503 3245] [16503 3294] [16470 3342] + [16432 3304] [16416 3277] [16362 3174] [16319 3087] [15912 2838] + [15809 2838] [15771 2865] [15776 2881] [15792 2892] [15809 2908] + [15830 2925] [15998 3299] [16205 3722] [16503 3961] [16552 4010] + [16481 4069] [16400 4053] [16286 4031] [16210 4124] [16281 4422] + [16454 4688] [16579 4813] [16671 4889] [16731 4932] [16774 5002] + [16747 5046] [16715 5046] [16677 5024] [16655 5019] [16617 5002] + [16579 4986] [16552 4981] [16503 5051] [16519 5133] [16557 5268] + [16839 5719] [17149 5881] [17235 5903] [17295 5919] [17333 5936] + [17252 6022] [17121 6022] [17067 6017] [17040 6017] [16932 6077] + [16937 6109] [16959 6164] [17013 6277] [17132 6489] [17214 6576] + [17273 6614] [17349 6527] [17404 6462] [17507 6337] [17838 6153] + [18011 6109] [18169 5979] [18152 5827] [18120 5697] [18104 5529] + [18087 5328] [18087 5230] [18065 5176] [18060 5154] [18028 5149] + [18022 5144] [18000 5154] [17968 5187] [17930 5225] [17876 5290] + [17599 5475] [17273 5361] [17024 5057] [16861 4574] [16807 3955] + [16818 3478] [16850 2957] [16872 2583] [16704 1981] + ) + Hole ( + [17355 3342] [17360 3315] [17241 3044] [17127 2984] [17029 3163] + [17008 3397] [16980 3673] [17040 3803] [17181 3706] + ) + Hole ( + [16248 7889] [16389 7948] [16541 8090] [16693 8225] [16807 8263] + [17252 8090] [17344 8008] [17420 7948] [17376 7948] [17046 7851] + [16829 7764] [16650 7748] + ) + Hole ( + [19612 8231] [19715 8323] [19753 8377] [19791 8421] [19867 8524] + [20084 8616] [20122 8616] [20252 8600] [20344 8589] [20404 8578] + [20447 8551] [20409 8458] [20236 8290] [19878 8166] [19709 8203] + ) + Hole ( + [19416 9402] [19606 9348] [19693 9354] [19802 9365] [19916 9370] + [20019 9381] [20100 9348] [20236 9223] [20366 9110] [20567 9012] + [20822 8882] [20865 8860] [20881 8882] [20843 8936] [20643 9164] + [20567 9424] [20648 9701] [20892 9375] [21077 9223] [21283 8757] + [21283 8719] [21272 8643] [21321 8589] [21332 8594] [21375 8654] + [21391 8697] [21418 8746] [21451 8773] [21456 8779] [21608 8676] + [21744 8486] [21771 8328] [21733 8149] [21684 8046] [21668 7981] + [21717 7916] [21739 7927] [21776 7959] [21809 8003] [21934 8095] + [22048 7997] [22097 7894] [22129 7813] [22140 7764] [22037 7699] + [21804 7547] [21717 7254] [21728 7086] [21755 6977] [21793 6891] + [21814 6787] [21831 6717] [21809 6657] [21776 6603] [21733 6478] + [21679 6370] [21625 6245] [21489 6104] [21315 6185] [21147 6272] + [20952 6456] [20881 6760] [21044 7314] [21212 7661] [21299 7986] + [21049 8469] [20382 8730] [19981 8800] [19726 8914] [19552 9099] + ) + Hole ( + [22395 8827] [22444 8822] [22503 8806] [22764 8806] [22829 8811] + [22954 8681] [23008 8600] [23127 8421] [22910 8366] [22590 8496] + ) + Hole ( + [1990 16222] [1990 16271] [1974 16434] [1936 16559] [1898 16770] + [2001 17106] [2082 17334] [2012 17432] [1974 17405] [1610 17264] + [1502 17275] [1616 17524] [1670 17709] [2028 18154] [2137 18246] + [2072 18278] [2044 18273] [1963 18257] [1898 18246] [1844 18316] + [1865 18436] [1963 18669] [2110 18940] [2321 19081] [2424 19174] + [2365 19211] [2251 19282] [2267 19336] [2283 19380] [2554 19781] + [3005 19922] [3026 19922] [3075 19955] [3043 19998] [2907 20052] + [2826 20112] [2929 20313] [2999 20389] [3113 20476] [3238 20400] + [3705 20128] [3916 19976] [3895 19906] [3753 19526] [3715 19342] + [3688 19239] [3672 19190] [3640 19174] [3634 19174] [3602 19184] + [3580 19222] [3542 19282] [3504 19363] [3385 19499] [3227 19559] + [2837 19277] [2451 18512] [2337 17866] [2375 17540] [2462 17161] + [2484 16971] [2359 16531] + ) + Hole ( + [2674 18050] [2755 17893] [2847 17671] [2793 17551] [2668 17454] + [2544 17584] [2495 17893] [2495 18050] [2560 18219] [2571 18219] + [2609 18175] + ) + Hole ( + [3585 21327] [3705 21392] [3748 21452] [3802 21517] [4008 21642] + [4464 21452] [4410 21420] [4334 21376] [4242 21300] [3949 21181] + ) + Hole ( + [5636 22928] [5728 22939] [5804 22960] [5886 23026] [6124 23080] + [6233 23063] [6412 22993] [6553 22933] [6672 22863] [6591 22836] + [6450 22781] [6075 22695] [5886 22733] + ) + Hole ( + [5766 24002] [5972 23942] [6227 23877] [6358 23780] [6390 23682] + [6520 23492] [6640 23422] [6672 23449] [6667 23476] [6640 23519] + [6580 23780] [6672 24094] [6721 24192] [6873 23980] [7085 23677] + [7139 23373] [7133 23248] [7128 23194] [7177 23139] [7237 23199] + [7258 23259] [7318 23340] [7497 23139] [7546 22868] [7535 22798] + [7513 22727] [7508 22711] [7567 22651] [7660 22733] [7719 22803] + [7828 22727] [7888 22640] [7947 22521] [7909 22467] [7681 22152] + [7611 21647] [7529 21251] [7416 20969] [7350 20763] [7302 20606] + [7209 20497] [7177 20503] [7117 20535] [6987 20579] [6819 20736] + [6759 21024] [6819 21311] [7003 21767] [7177 22440] [7057 22776] + [6689 23031] [6244 23237] [5994 23454] [5875 23655] + ) + Hole ( + [7833 24615] [7980 24501] [8137 24469] [8370 24387] [8490 24192] + [8560 23980] [8620 23785] [8653 23682] [8544 23742] [8452 23801] + [8289 23866] [7947 24100] [7828 24496] + ) + Hole ( + [16172 16173] [16210 16417] [16188 16596] [16178 16727] [16302 17074] + [16411 17253] [16432 17378] [16384 17465] [16335 17432] [16270 17356] + [15830 17188] [15912 17351] [15977 17600] [16064 17861] [16243 18061] + [16335 18137] [16416 18240] [16411 18267] [16378 18289] [16373 18289] + [16324 18284] [16270 18273] [16167 18414] [16400 18919] [16443 18978] + [16400 19022] [16281 18984] [16232 18967] [16172 19049] [16259 19450] + [16492 19694] [16606 19749] [16677 19787] [16715 19819] [16617 19868] + [16579 19863] [16503 19830] [16449 19825] [16357 19890] [16373 19976] + [16416 20215] [16541 20400] [16677 20351] [17203 20215] [17371 20215] + [17496 20221] [17566 20231] [17637 20128] [17664 19955] [17686 19711] + [17702 19564] [17707 19488] [17686 19456] [17670 19450] [17588 19488] + [17241 19602] [16964 19515] [16780 19260] [16677 18815] [16644 18170] + [16655 17665] [16693 17253] [16731 16835] [16568 16407] + ) + Hole ( + [17100 17519] [17035 17432] [16948 17356] [16877 17481] [16850 17654] + [16823 17844] [16818 17915] [16872 18040] [17013 17915] [17127 17644] + ) + Hole ( + [16172 21609] [16400 21756] [16693 21913] [17121 21799] [16845 21577] + [16546 21496] + ) + Hole ( + [17447 24078] [18375 23530] [18250 23503] [18158 23481] [17838 23438] + [17534 23557] [17425 23899] + ) + Hole ( + [17013 25033] [17268 24946] [17404 24957] [17436 24957] [17664 24876] + [17821 24621] [17881 24452] [18060 24246] [18141 24192] [18185 24176] + [18207 24192] [18207 24214] [18196 24252] [18152 24382] [18120 24539] + [18190 24794] [18255 24745] [18614 24414] [18695 24100] [18711 23866] + [18760 23818] [18825 23888] [18912 23997] [19118 23839] [19237 23498] + [19237 23422] [19281 23335] [19313 23351] [19335 23389] [19351 23465] + [19368 23535] [19433 23628] [19503 23584] [19650 23422] [19726 23264] + [19709 23172] [19693 23080] [19758 23004] [19840 23085] [19916 23194] + [20067 23085] [20165 22895] [20100 22743] [19959 22244] [20035 21859] + [20344 21322] [20637 20845] [20708 20693] [20653 20579] [20615 20514] + [20572 20481] [20518 20503] [20464 20524] [20420 20541] [20409 20541] + [20328 20481] [20127 20351] [19894 20459] [19894 20552] [19612 20915] + [19275 21251] [19167 21653] [19275 22098] [19389 22336] [19427 22521] + [19330 22868] [19031 23226] [18494 23628] [17702 24094] [17355 24295] + [17154 24474] [17056 24702] + ) + Hole ( + [20816 21957] [21131 21794] [21261 21772] [21337 21685] [21429 21604] + [21543 21496] [21614 21409] [21559 21382] [21473 21376] [21359 21365] + [20979 21523] + ) + Hole ( + [1746 9332] [1952 9272] [2104 9218] [2234 9185] [2403 8996] + [2554 8827] [2679 8746] [2799 8627] [2869 8567] [2902 8529] + [2940 8524] [2945 8551] [2940 8605] [2918 8659] [2831 8925] + [2902 9147] [3092 9332] [3260 8920] [3406 8730] [3515 8410] + [3498 8225] [3488 8100] [3504 8041] [3547 7981] [3574 7997] + [3602 8019] [3623 8111] [3656 8187] [3721 8263] [3753 8252] + [3808 8209] [3922 8111] [4025 7965] [4117 7710] [4117 7661] + [4090 7514] [4084 7417] [4144 7292] [4220 7422] [4383 7672] + [4464 7596] [4643 7319] [4697 7091] [4692 6994] [4692 6966] + [4741 6858] [4811 6928] [4833 6994] [4849 7026] [4866 7053] + [4893 7064] [4931 7048] [4963 7015] [5001 6977] [5056 6901] + [5099 6842] [5131 6760] [5099 6684] [5077 6657] [5045 6614] + [5001 6560] [4969 6473] [5056 6201] [5159 5995] [5273 5778] + [5338 5681] [5397 5626] [5446 5675] [5435 5719] [5403 5773] + [5381 5849] [5365 5925] [5403 6001] [5490 5995] [5598 5946] + [5810 5881] [6016 5816] [6325 5773] [6406 5778] [6504 5805] + [6580 5811] [6640 5795] [6732 5773] [6884 5697] [6808 5512] + [6748 5404] [6678 5306] [6640 5268] [6634 5225] [6672 5230] + [6694 5230] [6862 5371] [7068 5702] [7719 6744] [8419 7238] + [8745 7352] [8994 7542] [9087 7845] [8902 8301] [8680 8583] + [8322 9533] [8305 9652] [8419 9549] [8604 9500] [8880 9370] + [8962 9131] [8962 9110] [8956 8952] [8956 8936] [9016 8811] + [9070 8865] [9146 9093] [9504 9462] [9477 9272] [9504 9126] + [9537 8865] [9445 8545] [9352 8382] [9309 8290] [9293 8241] + [9336 8198] [9369 8209] [9407 8241] [9428 8263] [9477 8306] + [9537 8345] [9635 8127] [9629 8019] [9613 7840] [9466 7607] + [9385 7552] [9293 7433] [9352 7379] [9412 7401] [9531 7438] + [9586 7455] [9656 7335] [9597 7021] [9466 6885] [9445 6891] + [9374 6896] [9320 6896] [8783 6684] [8506 6060] [8338 5588] + [8056 5323] [7866 5230] [7736 5176] [7665 5160] [7622 5116] + [7730 5068] [8213 5149] [8511 5247] [9190 5393] [9618 5198] + [9797 4726] [9635 4210] [9233 3782] [9141 3717] [9108 3711] + [9076 3744] [9087 3787] [9092 3869] [9141 3977] [9168 4037] + [9200 4091] [9168 4118] [9130 4102] [9103 4080] [9027 3977] + [8951 3820] [8777 3576] [8582 3413] [8392 3321] [8267 3261] + [8191 3239] [8148 3288] [8164 3369] [8224 3511] [8289 3614] + [8360 3673] [8381 3728] [8305 3733] [8246 3695] [8164 3624] + [8045 3467] [7752 3147] [7345 2903] [7237 2849] [7166 2811] + [7117 2876] [7155 2995] [7209 3055] [7269 3125] [7307 3163] + [7318 3190] [7285 3223] [7274 3218] [7231 3190] [7177 3147] + [6792 2404] [7009 1937] [7426 1758] [7730 1818] [8099 2024] + [8636 2333] [9027 2431] [9358 2360] [9607 2154] [9559 2176] + [9483 2198] [9407 2219] [9336 2230] [8967 2149] [8484 1916] + [8240 1780] [8001 1644] [7958 1590] [8001 1557] [8083 1579] + [8408 1726] [8745 1888] [9097 2002] [9401 2057] [9662 1981] + [9748 1758] [9580 1357] [9450 1281] [9390 1351] [9412 1406] + [9439 1433] [9461 1519] [9477 1579] [9477 1595] [9298 1747] + [9032 1688] [8620 1519] [8067 1286] [7703 1243] [7204 1330] + [6797 1574] [6520 1937] [6423 2382] [6537 2919] [6938 3380] + [7676 3814] [8821 4270] [9282 4498] [9428 4769] [9347 4975] + [9152 5062] [8929 5035] [8452 4905] [7763 4747] [7014 4710] + [6103 4786] [5490 5062] [5354 5160] [5202 5257] [5094 5279] + [5083 5279] [5007 5274] [4616 5637] [4491 5773] [4366 5664] + [4236 5420] [4144 5290] [4063 5209] [3998 5149] [3954 5116] + [3932 5068] [4014 4889] [4068 4796] [4084 4742] [4166 4639] + [4177 4644] [4182 4671] [4198 4737] [4204 4823] [4236 4981] + [4269 5095] [4312 5187] [4448 5355] [4632 5187] [4741 4840] + [4746 4758] [4811 4699] [4817 4710] [4839 4742] [4855 4775] + [4876 4840] [4985 5002] [5039 5046] [5083 5062] [5121 5073] + [5153 5046] [5186 5019] [5224 4932] [5245 4834] [5245 4818] + [5235 4710] [5229 4606] [5224 4503] [5235 4476] [5273 4455] + [5365 4541] [5479 4671] [5576 4699] [5717 4601] [5679 4514] + [5625 4422] [5560 4292] [5376 4107] [5321 4118] [5245 4140] + [5186 4167] [5137 4178] [5126 4178] [5094 4167] [5099 4124] + [5131 4080] [5186 4010] [5354 3657] [5441 2957] [5500 2501] + [5582 2371] [5620 2404] [5636 2496] [5636 2572] [5625 2680] + [5609 2778] [5598 2849] [5593 2870] [5652 2930] [5853 2718] + [5972 2333] [5951 2214] [5853 2067] [5772 2002] [5658 1964] + [5598 1964] [5538 1921] [5566 1840] [5571 1726] [5549 1612] + [5522 1563] [5490 1481] [5457 1422] [5359 1481] [5235 1541] + [5137 1628] [5061 1709] [5001 1780] [4947 1823] [4920 1785] + [4942 1709] [4969 1536] [4909 1335] [4833 1221] [4725 1123] + [4681 1075] [4627 1123] [4567 1188] [4475 1292] [4334 1590] + [4334 1682] [4296 1731] [4209 1633] [4117 1514] [4036 1443] + [3954 1384] [3911 1335] [3878 1395] [3753 1747] [3753 1764] + [3770 1840] [3770 1916] [3748 1986] [3726 1991] [3715 2002] + [3650 1986] [3520 1937] [3314 2008] [3243 2208] [3450 2735] + [3569 2843] [3585 2838] [3623 2816] [3629 2805] [3623 2756] + [3618 2680] [3602 2572] [3596 2447] [3634 2344] [3721 2469] + [3791 2838] [3932 3548] [4182 4064] [4198 4102] [4177 4129] + [4128 4118] [4046 4086] [3987 4053] [3938 4042] [3748 4232] + [3688 4834] [3721 5279] [3808 5659] [4014 6207] [4046 6429] + [3954 6863] [3672 7362] [3162 7916] [2609 8323] [2283 8491] + [2023 8637] [1876 8784] [1795 8996] + ) + Hole ( + [16248 9332] [16454 9272] [16606 9218] [16736 9185] [16905 8996] + [17056 8827] [17181 8746] [17306 8627] [17371 8567] [17404 8529] + [17431 8518] [17452 8551] [17420 8659] [17344 8822] [17333 8925] + [17409 9147] [17594 9332] [17762 8920] [17908 8730] [18017 8410] + [18000 8225] [17990 8100] [18006 8041] [18049 7981] [18076 7997] + [18104 8019] [18131 8111] [18158 8187] [18223 8263] [18255 8252] + [18310 8209] [18424 8111] [18527 7965] [18619 7710] [18619 7661] + [18592 7514] [18586 7417] [18646 7292] [18722 7422] [18885 7672] + [18966 7596] [19145 7319] [19199 7086] [19199 6966] [19254 6858] + [19286 6874] [19297 6891] [19319 6928] [19335 6994] [19351 7026] + [19368 7053] [19395 7064] [19433 7048] [19465 7015] [19503 6977] + [19557 6901] [19601 6842] [19633 6760] [19601 6684] [19579 6657] + [19547 6614] [19503 6560] [19471 6473] [19557 6201] [19661 5995] + [19780 5778] [19840 5681] [19899 5626] [19948 5675] [19937 5719] + [19905 5773] [19883 5849] [19867 5925] [19905 6001] [19991 5995] + [20100 5946] [20312 5881] [20518 5816] [20827 5773] [20908 5778] + [21006 5805] [21082 5811] [21147 5795] [21234 5773] [21391 5697] + [21359 5605] [21321 5512] [21250 5404] [21190 5306] [21147 5268] + [21136 5225] [21174 5230] [21196 5230] [21364 5371] [21570 5702] + [22221 6744] [22927 7238] [23247 7352] [23496 7542] [23589 7845] + [23404 8301] [23182 8583] [22824 9533] [22807 9652] [22921 9549] + [23106 9500] [23382 9370] [23469 9131] [23464 9110] [23458 8952] + [23458 8936] [23518 8811] [23572 8865] [23648 9093] [24006 9462] + [23979 9272] [24006 9126] [24050 8882] [23947 8545] [23854 8382] + [23811 8290] [23795 8241] [23838 8198] [23871 8209] [23909 8241] + [23930 8263] [23979 8306] [24039 8345] [24142 8079] [23968 7607] + [23887 7552] [23795 7433] [23865 7379] [23925 7401] [24033 7438] + [24093 7455] [24158 7319] [24153 7270] [24120 7124] [24060 6923] + [23974 6885] [23957 6891] [23887 6896] [23827 6901] [23285 6690] + [23008 6060] [22840 5588] [22558 5323] [22368 5230] [22238 5176] + [22167 5160] [22124 5116] [22232 5068] [22720 5149] [23013 5247] + [23692 5393] [24120 5198] [24299 4726] [24136 4210] [23735 3782] + [23643 3717] [23610 3711] [23583 3744] [23589 3787] [23594 3869] + [23643 3977] [23670 4037] [23702 4091] [23670 4118] [23632 4102] + [23605 4080] [23529 3977] [23453 3820] [23279 3576] [23084 3413] + [22894 3321] [22769 3261] [22699 3239] [22650 3288] [22666 3369] + [22726 3511] [22796 3614] [22861 3673] [22883 3728] [22807 3733] + [22748 3695] [22672 3624] [22552 3467] [22238 3125] [22021 3001] + [21847 2903] [21739 2849] [21684 2816] [21668 2816] [21619 2876] + [21657 2995] [21711 3055] [21771 3125] [21809 3163] [21820 3190] + [21787 3223] [21776 3218] [21733 3190] [21679 3147] [21294 2404] + [21511 1937] [21928 1758] [22232 1818] [22601 2024] [23138 2333] + [23529 2431] [23860 2360] [24109 2154] [24060 2176] [23985 2198] + [23909 2219] [23838 2230] [23469 2149] [22986 1916] [22742 1780] + [22503 1644] [22460 1590] [22503 1557] [22585 1579] [22910 1726] + [23247 1888] [23599 2002] [23909 2057] [24164 1981] [24256 1758] + [24082 1357] [23952 1281] [23892 1351] [23914 1406] [23941 1433] + [23963 1519] [23979 1579] [23985 1617] [23800 1747] [23534 1688] + [23122 1519] [22569 1286] [22205 1243] [21706 1330] [21299 1579] + [21022 1943] [20925 2387] [21039 2919] [21440 3380] [22178 3809] + [23323 4270] [23789 4503] [23930 4786] [23849 4981] [23654 5062] + [23431 5035] [22954 4905] [22270 4747] [21538 4710] [20979 4726] + [20556 4796] [20209 4932] [19856 5160] [19704 5257] [19595 5279] + [19585 5279] [19509 5274] [19118 5637] [18993 5773] [18869 5664] + [18738 5420] [18646 5290] [18565 5209] [18500 5149] [18456 5116] + [18434 5068] [18451 5008] [18472 4965] [18527 4889] [18570 4796] + [18592 4742] [18608 4671] [18668 4639] [18679 4644] [18684 4671] + [18700 4737] [18711 4823] [18738 4981] [18771 5095] [18814 5187] + [18950 5355] [19134 5187] [19221 4965] [19243 4840] [19259 4758] + [19297 4693] [19303 4693] [19330 4710] [19340 4742] [19357 4775] + [19389 4840] [19541 5046] [19585 5062] [19623 5073] [19655 5046] + [19688 5019] [19726 4932] [19747 4834] [19747 4818] [19736 4710] + [19731 4606] [19726 4503] [19736 4476] [19775 4455] [19867 4541] + [19981 4671] [20078 4699] [20219 4601] [20181 4514] [20127 4422] + [20062 4292] [19878 4107] [19823 4118] [19747 4140] [19688 4167] + [19639 4178] [19628 4178] [19595 4167] [19601 4124] [19633 4080] + [19688 4010] [19856 3662] [19948 2957] [20002 2507] [20073 2366] + [20089 2377] [20138 2453] [20149 2523] [20143 2572] [20127 2680] + [20111 2778] [20100 2849] [20095 2870] [20154 2930] [20360 2718] + [20474 2333] [20453 2214] [20360 2067] [20274 2002] [20160 1964] + [20100 1964] [20040 1921] [20067 1840] [20073 1726] [20051 1612] + [20024 1563] [19991 1481] [19959 1422] [19861 1481] [19736 1541] + [19639 1628] [19563 1709] [19509 1780] [19449 1823] [19422 1785] + [19444 1709] [19471 1536] [19411 1335] [19335 1221] [19227 1123] + [19183 1075] [19129 1123] [19069 1188] [18977 1292] [18836 1590] + [18836 1682] [18798 1731] [18711 1633] [18619 1514] [18543 1443] + [18456 1384] [18413 1335] [18380 1395] [18255 1747] [18255 1764] + [18272 1840] [18272 1916] [18250 1986] [18228 1991] [18217 2002] + [18152 1986] [18022 1937] [17816 2008] [17745 2208] [17952 2735] + [18071 2843] [18087 2838] [18131 2816] [18131 2756] [18120 2680] + [18104 2572] [18098 2447] [18136 2344] [18190 2387] [18250 2556] + [18304 2838] [18348 3212] [18451 3597] [18586 3869] [18657 4015] + [18684 4064] [18700 4102] [18668 4129] [18608 4107] [18554 4086] + [18489 4053] [18434 4048] [18245 4237] [18185 4823] [18190 4872] + [18212 5192] [18250 5523] [18310 5659] [18516 6207] [18554 6429] + [18456 6863] [18174 7362] [17664 7921] [17111 8323] [16785 8491] + [16525 8637] [16378 8784] [16297 8996] + ) + Hole ( + [3634 22543] [3862 22450] [4008 22445] [4383 22141] [4497 22022] + [4605 21968] [4638 22006] [4616 22098] [4578 22255] [4562 22407] + [4584 22586] [4719 22819] [4741 22711] [4849 22564] [5094 22157] + [5164 21799] [5153 21685] [5148 21647] [5197 21582] [5245 21599] + [5262 21626] [5305 21696] [5321 21751] [5359 21778] [5506 21604] + [5587 21327] [5549 21208] [5533 21154] [5566 21116] [5603 21132] + [5641 21154] [5690 21192] [5739 21213] [5777 21197] [5826 21143] + [5907 21045] [5989 20888] [5983 20872] [5962 20834] [5940 20796] + [5842 20703] [5755 20590] [5647 20340] [5712 20069] [5755 19938] + [5777 19863] [5842 19781] [5896 19863] [5880 19960] [5853 20134] + [5929 20231] [6075 20183] [6282 20112] [6488 20063] [6629 20036] + [6748 20063] [6862 20112] [6976 20145] [7047 20155] [7150 20074] + [7117 19998] [7030 19841] [7068 19803] [7280 20052] [7557 20649] + [7741 21137] [7942 21506] [8267 21772] [8620 21978] [8891 22282] + [8973 22830] [8913 23313] [8756 23888] [8620 24290] [8560 24669] + [8826 25445] [8870 25326] [8962 25206] [9163 24745] [9108 24496] + [9070 24376] [9065 24268] [9059 24208] [9103 24170] [9222 24284] + [9342 24420] [9575 24550] [9542 24317] [9461 23834] [9249 23481] + [9217 23427] [9260 23384] [9390 23481] [9488 23546] [9521 23514] + [9537 23438] [9559 23237] [9564 23188] [9369 22765] [9238 22597] + [9266 22559] [9385 22613] [9499 22657] [9575 22581] [9597 22293] + [9591 22071] [9575 21908] [9504 21816] [9455 21816] [8994 21604] + [8712 21002] [8587 20497] [8376 20052] [8007 19787] [7904 19705] + [7953 19678] [8045 19705] [8191 19749] [8506 19868] [9038 19976] + [9607 19754] [9835 19206] [9694 18696] [9352 18322] [9217 18235] + [9141 18208] [9092 18240] [9103 18305] [9146 18381] [9168 18447] + [9135 18490] [9032 18398] [8636 18023] [8256 17915] [8137 17975] + [8224 18121] [8300 18219] [8316 18262] [8305 18289] [8267 18322] + [8229 18305] [8164 18246] [7985 18067] [7817 17893] [7437 17730] + [7345 17725] [7237 17774] [7329 17926] [7399 17996] [7361 18029] + [7047 17839] [6689 17443] [6596 17036] [6775 16618] [7237 16455] + [7719 16607] [8061 16824] [8419 17058] [8696 17215] [8908 17258] + [9331 17052] [9260 17068] [9200 17074] [9184 17074] [9125 17068] + [9038 17058] [8810 16993] [8560 16851] [8246 16607] [7529 16260] + [7416 16190] [7486 16152] [7926 16260] [8528 16602] [8978 16868] + [9282 16933] [9569 16819] [9700 16569] [9607 16320] [9515 16255] + [9472 16314] [9477 16336] [9493 16390] [9493 16412] [9423 16564] + [9266 16634] [9043 16559] [8707 16341] [8061 15945] [7540 15848] + [7041 15935] [6634 16179] [6368 16548] [6271 17009] [6379 17589] + [6737 18034] [7388 18381] [8381 18658] [8913 18783] [9238 18897] + [9396 19027] [9439 19195] [9304 19466] [8956 19575] [8620 19542] + [8018 19391] [7318 19228] [6754 19184] [5750 19353] [5207 19825] + [5169 19906] [5131 19949] [5077 19901] [4735 19683] [4513 19770] + [4383 19830] [4263 19732] [4144 19510] [4036 19146] [4030 19054] + [4030 19005] [4084 18891] [4144 19000] [4166 19119] [4307 19412] + [4394 19466] [4616 19174] [4681 19054] [4779 19211] [4914 19504] + [5066 19618] [5115 19597] [5153 19559] [5229 19293] [5235 19217] + [5229 19168] [5224 19108] [5251 19060] [5305 19081] [5354 19136] + [5522 19222] [5593 19239] [5663 19211] [5712 19168] [5712 19152] + [5690 19060] [5636 19000] [5560 18886] [5484 18756] [5435 18642] + [5294 18495] [5213 18517] [5148 18555] [5018 18598] [4963 18560] + [4985 18517] [5066 18441] [5245 18132] [5365 17459] [5430 17112] + [5468 16971] [5528 16889] [5560 16917] [5560 16971] [5566 17068] + [5566 17258] [5603 17329] [5696 17237] [5864 16797] [5793 16586] + [5614 16510] [5549 16515] [5473 16542] [5457 16542] [5381 16428] + [5392 16320] [5392 16233] [5359 16038] [5316 15837] [5159 15967] + [5045 16054] [4952 16135] [4833 16238] [4773 16135] [4627 15739] + [4551 15663] [4480 15587] [4242 16141] [4242 16157] [4247 16211] + [4204 16298] [4160 16271] [4122 16228] [4036 16157] [3916 16043] + [3732 15907] [3710 16021] [3672 16184] [3656 16336] [3656 16488] + [3667 16542] [3629 16580] [3596 16569] [3542 16548] [3406 16521] + [3173 16765] [3336 17139] [3580 17351] [3618 17275] [3612 17177] + [3596 17052] [3585 16998] [3629 16938] [3688 16993] [3732 17090] + [3781 17318] [3884 17980] [4074 18338] [4236 18490] [4307 18555] + [4334 18598] [4285 18636] [4215 18609] [4063 18577] [3857 18664] + [3786 18929] [3987 19667] [4578 20307] [4980 20655] [5083 20969] + [4958 21300] [4643 21566] [4307 21734] [4025 21843] [3781 22011] + [3661 22374] + ) + Hole ( + [16080 22857] [16335 22765] [16519 22733] [16753 22575] [17024 22342] + [17040 22353] [17046 22391] [17013 22450] [16921 22651] [16905 22803] + [17008 23101] [17084 22977] [17241 22798] [17420 22396] [17420 22320] + [17463 22223] [17534 22304] [17583 22391] [17588 22391] [17664 22353] + [17740 22299] [17908 21919] [17897 21827] [17897 21789] [17935 21751] + [18006 21810] [18098 21897] [18196 21832] [18288 21734] [18359 21517] + [18337 21398] [18304 21311] [18272 21224] [18326 21159] [18375 21181] + [18402 21230] [18462 21311] [18510 21382] [18559 21420] [18700 21300] + [18793 21078] [18771 21007] [18684 20725] [18700 20600] [18787 20410] + [18847 20269] [18928 20155] [18977 20215] [18977 20237] [18955 20318] + [18944 20378] [19118 20514] [19368 20427] [19845 20145] [20046 20025] + [20181 19998] [20350 20036] [20643 20112] [20702 20058] [20664 19884] + [20648 19825] [20691 19770] [20756 19814] [20870 19993] [20990 20204] + [21283 20541] [21673 20703] [21950 20779] [22031 20926] [21918 21317] + [21543 21685] [21207 22233] [21305 22733] [21489 22516] [21635 22385] + [21700 22239] [21700 22109] [21836 21886] [21890 21962] [22021 22369] + [22037 22315] [22091 22201] [22167 22049] [22259 21870] [22297 21718] + [22238 21474] [22205 21382] [22254 21322] [22292 21338] [22411 21398] + [22465 21344] [22558 21083] [22509 20986] [22449 20915] [22428 20855] + [22476 20796] [22536 20817] [22579 20866] [22661 20899] [22758 20817] + [22802 20720] [22824 20617] [22786 20530] [22601 20481] [22324 20389] + [22140 20237] [21863 19901] [21511 19624] [21435 19570] [21489 19526] + [21625 19559] [21945 19678] [22389 19808] [22775 19863] [23334 19651] + [23567 19152] [23491 18691] [23323 18387] [23171 18273] [23041 18208] + [23008 18246] [23046 18419] [23062 18484] [23046 18517] [23019 18533] + [22965 18457] [22585 17926] [22140 17730] [22075 17774] [22086 17833] + [22097 17871] [22183 18007] [22227 18094] [22254 18159] [22216 18192] + [22124 18116] [21907 17861] [21700 17709] [21516 17627] [21408 17595] + [21364 17644] [21402 17747] [21435 17806] [21397 17850] [21353 17833] + [21299 17795] [21120 17671] [20908 17410] [20827 17079] [21011 16640] + [21456 16455] [21771 16515] [22189 16765] [22655 16976] [23073 17063] + [23442 16868] [23312 16884] [22992 16824] [22628 16640] [22265 16439] + [22048 16341] [21901 16287] [21836 16244] [21939 16200] [22216 16266] + [22726 16477] [23182 16667] [23442 16710] [23708 16602] [23816 16347] + [23762 16119] [23643 16016] [23583 16076] [23589 16108] [23610 16152] + [23621 16200] [23458 16379] [23192 16320] [22666 16124] [22303 16011] + [22042 15956] [21814 15945] [21288 16027] [20865 16266] [20583 16618] + [20485 17068] [20572 17540] [20870 17931] [21429 18278] [22292 18626] + [22932 18929] [23127 19266] [23019 19477] [22726 19553] [22433 19510] + [21918 19353] [21348 19233] [20708 19190] [19834 19320] [19275 19705] + [19129 19841] [19069 19819] [18814 19738] [18570 19901] [18467 20025] + [18413 20052] [18245 19911] [18120 19597] [18087 19293] [18190 18929] + [18245 19011] [18234 19108] [18228 19239] [18277 19526] [18413 19635] + [18575 19510] [18668 19211] [18684 19076] [18733 19011] [18793 19136] + [18874 19412] [19037 19526] [19151 19428] [19205 19168] [19254 19022] + [19292 19049] [19378 19163] [19541 19228] [19677 19136] [19650 19054] + [19595 18984] [19509 18848] [19449 18696] [19406 18588] [19292 18501] + [19237 18512] [19151 18544] [19069 18571] [19020 18588] [18982 18560] + [18999 18517] [19037 18479] [19167 18343] [19330 18078] [19411 17649] + [19503 17182] [19644 17003] [19688 17052] [19671 17177] [19655 17264] + [19639 17345] [19633 17378] [19671 17410] [19878 17237] [20008 16911] + [19867 16618] [19736 16564] [19677 16569] [19612 16586] [19579 16580] + [19547 16548] [19547 16504] [19487 16206] [19411 15978] [19319 16054] + [19189 16152] [19091 16266] [18972 16369] [18944 16341] [18939 16314] + [18944 16266] [18966 16190] [18972 16152] [18928 15891] [18733 15587] + [18668 15652] [18608 15718] [18483 15913] [18429 16141] [18434 16173] + [18451 16271] [18451 16293] [18418 16336] [18380 16314] [18342 16260] + [18217 16130] [18000 16000] [17984 16081] [17946 16206] [17914 16358] + [17897 16488] [17865 16640] [17821 16624] [17740 16586] [17653 16548] + [17550 16526] [17382 16596] [17317 16786] [17561 17313] [17713 17427] + [17740 17383] [17745 17318] [17740 17220] [17713 17106] [17702 17031] + [17745 16982] [17930 17432] [18022 17969] [18169 18305] [18272 18436] + [18348 18506] [18375 18544] [18353 18577] [18310 18577] [18266 18550] + [18180 18517] [18131 18512] [17962 18669] [17876 19320] [17838 19846] + [17832 19971] [17849 20199] [17930 20535] [17984 20855] [17914 21251] + [17691 21577] [17295 21848] [16693 22098] [16232 22364] + ) + Hole ( + [12895 27637] [15331 26454] [15423 26454] [15380 26368] [15380 15153] + [15331 15050] [15434 15099] [24299 15099] [24397 15142] [24354 15045] + [24354 10216] [24397 10119] [24299 10157] [15434 10157] [15331 10200] + [15380 10102] [15380 1129] [15423 1031] [15326 1075] [10470 1075] + [10367 1031] [10416 1129] [10416 10102] [10454 10200] [10362 10157] + [1486 10157] [1393 10119] [1431 10216] [1431 15045] [1393 15142] + [1486 15099] [10362 15099] [10454 15050] [10416 15153] [10416 26368] + [10367 26454] [10454 26454] + ) + ) + Polygon("") + ( + [10188 10563] [10985 10563] [11392 10287] [11631 10352] [11810 10563] + [12467 10563] [12901 10287] [13150 10363] [13307 10563] [13921 10563] + [14322 10287] [14729 10515] [14761 10563] [15608 10563] [15608 14486] + [14865 14486] [14865 15989] [13997 15989] [13997 14486] [11799 14486] + [11799 15989] [10926 15989] [10926 14470] [10188 14470] + Hole ( + [11192 10835] [11192 11312] [11398 11507] [11604 11312] [11604 10846] + [11550 10629] [11414 10553] [11322 10574] [11268 10607] [11224 10667] + [11192 10753] + ) + Hole ( + [12684 11225] [12684 11312] [12884 11507] [13096 11312] [13096 10846] + [13042 10629] [12906 10553] [12743 10629] [12684 10835] + ) + Hole ( + [14127 10835] [14127 11312] [14327 11507] [14539 11312] [14539 10846] + [14485 10629] [14349 10553] [14257 10574] [14203 10607] [14154 10667] + [14127 10753] + ) + Hole ( + [11002 11638] [10839 11703] [10774 11866] [10839 12028] [11002 12099] + [11164 12028] [11230 11866] [11164 11703] + ) + Hole ( + [14783 11638] [14620 11703] [14555 11866] [14620 12028] [14783 12099] + [14940 12028] [15011 11866] [14940 11703] + ) + Hole ( + [11002 13433] [10839 13499] [10774 13661] [10839 13819] [11013 13889] + [11164 13819] [11230 13661] [11164 13499] + ) + Hole ( + [14783 13433] [14620 13499] [14555 13661] [14620 13819] [14783 13889] + [14940 13819] [15011 13661] [14940 13499] + ) + Hole ( + [11539 14828] [11089 14828] [11089 15408] [11539 15408] + ) + Hole ( + [11539 15539] [11089 15539] [11089 15723] [11539 15723] + ) + Hole ( + [14610 14828] [14154 14828] [14154 15408] [14610 15408] + ) + Hole ( + [14610 15539] [14154 15539] [14154 15723] [14610 15723] + ) + Hole ( + [11723 12739] [12250 13173] [12906 13320] [13497 13184] [14029 12739] + [13487 12332] [12884 12213] [12228 12348] + ) + ) + Polygon("") + ( + [11951 12739] [12407 12468] [12873 12386] [13329 12468] [13790 12744] + [13362 13043] [12868 13135] + Hole ( + [12342 12663] [12863 12831] [13416 12663] [12868 12533] + ) + ) + Polygon("") + ( + [14273 6863] [14447 7064] [14506 7124] [14479 7156] [14403 7222] + [14338 7292] [14311 7314] [14317 7422] [14333 7704] [14490 8317] + [14816 8703] [14886 8773] [14881 8784] [14821 8806] [14751 8795] + [14599 8784] [14469 8757] [14403 8746] [14317 9294] [14219 9294] + [14143 8746] [14067 8757] [13937 8784] [13790 8795] [13709 8806] + [13655 8762] [13720 8703] [13959 8458] [14154 8003] [14203 7704] + [14219 7422] [14224 7314] [14203 7292] [14132 7222] [14056 7156] + [14029 7124] [14089 7064] [14154 6994] [14219 6928] + ) + Polygon("") + ( + [11523 6863] [11577 6928] [11631 6994] [11696 7064] [11767 7124] + [11729 7156] [11658 7222] [11593 7292] [11566 7314] [11566 7384] + [11707 8209] [12070 8703] [12136 8773] [12136 8784] [12070 8806] + [12005 8795] [11859 8784] [11729 8757] [11653 8746] [11577 9294] + [11468 9294] [11392 8746] [11316 8757] [11186 8784] [11040 8795] + [10975 8806] [10964 8806] [10909 8768] [10975 8703] [11333 8214] + [11479 7384] [11474 7314] [11452 7292] [11387 7222] [11316 7156] + [11278 7124] [11349 7064] [11414 6994] [11468 6928] + ) + Polygon("") + ( + [12895 4444] [13139 4704] [13101 4737] [12966 4872] [12944 4905] + [12944 4970] [13020 5605] [13204 6050] [13362 6223] [13449 6294] + [13508 6343] [13449 6386] [13378 6375] [13232 6359] [13101 6337] + [13025 6321] [12949 6874] [12841 6874] [12765 6321] [12689 6337] + [12559 6359] [12418 6375] [12347 6386] [12336 6386] [12282 6359] + [12315 6310] [12429 6223] [12732 5730] [12852 4970] [12852 4905] + [12830 4872] [12760 4802] [12689 4737] [12651 4704] [12716 4644] + [12781 4574] [12841 4503] + ) + Polygon("") + ( + [14273 2024] [14317 2084] [14376 2154] [14447 2230] [14506 2290] + [14479 2322] [14403 2387] [14338 2453] [14311 2480] [14317 2583] + [14333 2865] [14490 3478] [14816 3869] [14886 3939] [14881 3950] + [14821 3961] [14751 3961] [14599 3939] [14469 3917] [14403 3901] + [14317 4449] [14219 4449] [14143 3901] [14067 3917] [13937 3939] + [13758 3966] [13655 3928] [13720 3869] [13807 3803] [13959 3624] + [14072 3413] [14154 3163] [14203 2865] [14219 2583] [14224 2480] + [14132 2387] [14029 2290] [14089 2230] [14154 2154] [14219 2084] + ) + Polygon("") + ( + [11523 2024] [11577 2084] [11631 2154] [11767 2290] [11729 2322] + [11658 2387] [11593 2453] [11566 2480] [11566 2550] [11707 3369] + [12070 3869] [12136 3939] [12136 3950] [12070 3961] [12005 3961] + [11859 3939] [11729 3917] [11653 3901] [11577 4449] [11468 4449] + [11392 3901] [11316 3917] [11186 3939] [11040 3961] [10975 3961] + [10909 3939] [10975 3869] [11333 3375] [11479 2550] [11474 2480] + [11452 2453] [11387 2387] [11316 2322] [11278 2290] [11414 2154] + [11468 2084] + ) + Polygon("") + ( + [12895 15989] [13139 16249] [13101 16282] [13036 16352] [12966 16417] + [12944 16450] [12944 16515] [13020 17150] [13204 17595] [13362 17768] + [13449 17839] [13508 17888] [13449 17931] [13378 17926] [13232 17909] + [13101 17882] [13025 17871] [12949 18419] [12841 18419] [12765 17871] + [12689 17882] [12559 17909] [12418 17926] [12347 17931] [12336 17931] + [12282 17904] [12315 17861] [12429 17768] [12732 17275] [12852 16515] + [12852 16450] [12830 16417] [12760 16352] [12689 16282] [12651 16249] + [12716 16190] [12781 16119] [12841 16054] + ) + Polygon("") + ( + [14273 23443] [14344 23530] [14447 23644] [14506 23704] [14479 23736] + [14403 23801] [14338 23872] [14311 23904] [14317 24002] [14333 24284] + [14420 24713] [14577 25049] [14729 25223] [14816 25293] [14881 25342] + [14821 25386] [14751 25375] [14599 25364] [14469 25337] [14403 25320] + [14317 25874] [14219 25874] [14143 25320] [14067 25337] [13937 25364] + [13790 25375] [13709 25386] [13660 25358] [13693 25310] [13807 25223] + [13921 25098] [14072 24832] [14154 24583] [14203 24284] [14219 24002] + [14224 23904] [14132 23801] [14056 23736] [14029 23704] [14089 23644] + [14154 23573] [14219 23503] + ) + Polygon("") + ( + [11523 23443] [11577 23503] [11631 23573] [11696 23644] [11767 23704] + [11729 23736] [11658 23801] [11593 23872] [11566 23904] [11566 23970] + [11685 24756] [12070 25293] [12136 25342] [12070 25386] [12005 25375] + [11859 25364] [11729 25337] [11653 25320] [11577 25874] [11468 25874] + [11392 25320] [11316 25337] [11186 25364] [11040 25375] [10975 25386] + [10964 25386] [10909 25358] [10947 25310] [11056 25223] [11360 24724] + [11479 23970] [11474 23904] [11452 23872] [11387 23801] [11316 23736] + [11278 23704] [11349 23644] [11414 23573] [11468 23503] + ) + Polygon("") + ( + [12895 20964] [12944 21024] [13004 21083] [13074 21159] [13139 21224] + [13101 21251] [13036 21322] [12944 21414] [12944 21485] [13080 22315] + [13449 22803] [13514 22868] [13508 22879] [13449 22895] [13378 22895] + [13025 22841] [12949 23389] [12841 23389] [12765 22841] [12418 22895] + [12347 22895] [12282 22863] [12347 22803] [12700 22320] [12852 21485] + [12852 21414] [12689 21251] [12651 21224] [12716 21159] [12781 21083] + [12841 21024] + ) + Polygon("") + ( + [14273 18474] [14317 18533] [14376 18604] [14447 18680] [14506 18739] + [14479 18772] [14403 18837] [14311 18929] [14317 19032] [14333 19315] + [14490 19928] [14816 20318] [14886 20389] [14881 20400] [14821 20410] + [14751 20410] [14599 20389] [14469 20367] [14403 20351] [14317 20899] + [14219 20899] [14143 20351] [14067 20367] [13937 20389] [13758 20416] + [13655 20378] [13720 20318] [13807 20253] [13959 20074] [14072 19863] + [14154 19613] [14203 19315] [14219 19032] [14224 18929] [14132 18837] + [14029 18739] [14089 18680] [14154 18604] [14219 18533] + ) + Polygon("") + ( + [11523 18474] [11577 18533] [11631 18604] [11767 18739] [11729 18772] + [11658 18837] [11566 18929] [11566 19000] [11707 19819] [12070 20318] + [12136 20389] [12136 20400] [12070 20410] [12005 20410] [11859 20389] + [11729 20367] [11653 20351] [11577 20899] [11468 20899] [11392 20351] + [11316 20367] [11186 20389] [11040 20410] [10975 20410] [10909 20383] + [10975 20318] [11333 19825] [11479 19000] [11474 18929] [11452 18902] + [11387 18837] [11316 18772] [11278 18739] [11414 18604] [11468 18533] + ) + Polygon("") + ( + [22861 10585] [22916 10645] [22975 10715] [23046 10781] [23106 10846] + [23079 10873] [23003 10943] [22910 11041] [22916 11144] [22932 11426] + [23013 11855] [23176 12186] [23328 12365] [23415 12430] [23480 12484] + [23415 12522] [23344 12517] [23198 12500] [23068 12479] [22992 12462] + [22916 13010] [22807 13010] [22731 12462] [22655 12479] [22525 12500] + [22384 12517] [22314 12522] [22303 12522] [22254 12500] [22286 12451] + [22395 12365] [22672 11974] [22748 11725] [22802 11426] [22818 11144] + [22824 11041] [22796 11014] [22731 10943] [22655 10873] [22617 10846] + ) + Polygon("") + ( + [21413 12289] [21657 12549] [21619 12576] [21543 12647] [21478 12717] + [21451 12739] [21456 12842] [21473 13130] [21630 13732] [21961 14128] + [22026 14193] [22021 14204] [21961 14226] [21890 14220] [21749 14204] + [21619 14182] [21543 14166] [21467 14714] [21359 14714] [21283 14166] + [21207 14182] [21077 14204] [20930 14220] [20860 14226] [20854 14226] + [20795 14182] [20860 14128] [21218 13651] [21364 12810] [21364 12739] + [21272 12647] [21207 12576] [21169 12549] [21229 12484] [21299 12419] + [21359 12348] + ) + Polygon("") + ( + [18489 12289] [18543 12348] [18603 12419] [18733 12549] [18700 12576] + [18624 12647] [18532 12739] [18543 12842] [18554 13130] [18717 13743] + [19037 14128] [19102 14188] [19048 14226] [18966 14220] [18825 14204] + [18695 14182] [18619 14166] [18543 14714] [18440 14714] [18359 14166] + [18158 14204] [18006 14220] [17935 14226] [17930 14226] [17876 14193] + [17946 14128] [18180 13884] [18380 13423] [18424 13130] [18440 12842] + [18451 12739] [18418 12717] [18359 12647] [18283 12576] [18250 12549] + [18310 12484] [18413 12376] + ) + Polygon("") + ( + [19954 10585] [20008 10645] [20067 10715] [20138 10781] [20198 10846] + [20165 10873] [20089 10943] [19997 11041] [20008 11144] [20024 11426] + [20105 11855] [20268 12186] [20420 12365] [20501 12430] [20567 12484] + [20501 12522] [20436 12517] [20290 12500] [20160 12479] [20084 12462] + [20008 13010] [19899 13010] [19823 12462] [19747 12479] [19617 12500] + [19471 12517] [19406 12522] [19395 12522] [19340 12500] [19378 12451] + [19492 12365] [19764 11974] [19840 11725] [19894 11426] [19905 11144] + [19916 11041] [19883 11014] [19823 10943] [19747 10873] [19709 10846] + ) + Polygon("") + ( + [17046 10585] [17100 10645] [17160 10715] [17225 10781] [17290 10846] + [17257 10873] [17181 10943] [17089 11041] [17100 11144] [17111 11426] + [17268 12034] [17594 12430] [17659 12484] [17626 12522] [17523 12517] + [17382 12500] [17252 12479] [17176 12462] [17100 13010] [16991 13010] + [16915 12462] [16839 12479] [16715 12500] [16563 12517] [16492 12522] + [16481 12522] [16432 12500] [16470 12451] [16584 12365] [16850 11974] + [16932 11725] [16980 11426] [16997 11144] [17008 11041] [16975 11014] + [16915 10943] [16839 10873] [16801 10846] + ) + Polygon("") + ( + [8745 10585] [8794 10645] [8859 10715] [8924 10781] [8989 10846] + [8956 10873] [8880 10943] [8788 11041] [8794 11144] [8810 11426] + [8967 12034] [9293 12430] [9358 12484] [9320 12522] [9222 12517] + [9076 12500] [8951 12479] [8870 12462] [8794 13010] [8691 13010] + [8615 12462] [8539 12479] [8414 12500] [8262 12517] [8191 12522] + [8181 12522] [8132 12500] [8170 12451] [8284 12365] [8549 11974] + [8625 11725] [8680 11426] [8696 11144] [8707 11041] [8674 11014] + [8615 10943] [8539 10873] [8501 10846] + ) + Polygon("") + ( + [7302 12289] [7350 12348] [7416 12419] [7546 12549] [7508 12576] + [7345 12739] [7350 12842] [7367 13130] [7529 13743] [7850 14128] + [7920 14188] [7909 14204] [7850 14226] [7779 14220] [7633 14204] + [7508 14182] [7426 14166] [7350 14714] [7247 14714] [7171 14166] + [7095 14182] [6965 14204] [6819 14220] [6748 14226] [6743 14226] + [6683 14193] [6992 13884] [7182 13423] [7237 13130] [7253 12842] + [7258 12739] [7231 12717] [7171 12647] [7095 12576] [7052 12549] + ) + Polygon("") + ( + [4383 12289] [4627 12549] [4589 12576] [4426 12739] [4426 12810] + [4562 13634] [4931 14128] [4996 14193] [4990 14204] [4931 14226] + [4866 14220] [4719 14204] [4589 14182] [4513 14166] [4437 14714] + [4329 14714] [4253 14166] [4177 14182] [4046 14204] [3900 14220] + [3829 14226] [3824 14226] [3770 14193] [3829 14128] [4187 13640] + [4334 12810] [4334 12739] [4242 12647] [4177 12576] [4139 12549] + [4198 12484] [4269 12419] [4329 12348] + ) + Polygon("") + ( + [5831 10585] [5886 10645] [5945 10715] [6016 10781] [6075 10846] + [6048 10873] [5972 10943] [5880 11041] [5886 11144] [5902 11426] + [6059 12034] [6385 12430] [6450 12484] [6412 12522] [6314 12517] + [6168 12500] [6038 12479] [5962 12462] [5886 13010] [5777 13010] + [5701 12462] [5506 12500] [5354 12517] [5283 12522] [5273 12522] + [5224 12500] [5262 12451] [5376 12365] [5641 11974] [5717 11725] + [5772 11426] [5788 11144] [5793 11041] [5766 11014] [5701 10943] + [5625 10873] [5598 10846] [5658 10781] [5761 10672] + ) + Polygon("") + ( + [2923 10585] [2978 10645] [3037 10715] [3108 10781] [3168 10846] + [3135 10873] [3059 10943] [2967 11041] [2978 11144] [2994 11426] + [3151 12034] [3471 12430] [3536 12484] [3504 12522] [3406 12517] + [3260 12500] [3130 12479] [3054 12462] [2978 13010] [2869 13010] + [2793 12462] [2592 12500] [2441 12517] [2375 12522] [2365 12522] + [2310 12500] [2348 12451] [2462 12365] [2582 12235] [2733 11974] + [2815 11725] [2864 11426] [2875 11144] [2885 11041] [2853 11014] + [2793 10943] [2717 10873] [2685 10846] [2750 10781] [2853 10672] + ) + Polygon("") + ( + [18396 17540] [18478 17589] [18727 17649] [18917 17611] [19075 17557] + [19172 17660] [19004 18170] [18706 18457] [18386 18143] [18255 17823] + [18217 17649] [18320 17519] + Hole ( + [18847 18083] [18874 17969] [18885 17909] [18830 17833] [18787 17839] + [18738 17839] [18657 17833] [18624 17823] [18603 17823] [18538 17920] + [18624 18235] [18722 18305] [18782 18267] + ) + ) + Polygon("") + ( + [19351 16813] [19248 16976] [19048 17269] [18928 17351] [18852 17199] + [18814 16960] [18814 16922] [18906 16868] [19161 16770] [19281 16694] + [19330 16678] [19378 16716] + ) + Polygon("") + ( + [18554 17166] [18543 17275] [18489 17323] [18413 17280] [18152 16938] + [18098 16803] [18076 16710] [18109 16662] [18169 16689] [18266 16748] + [18375 16803] [18500 16862] [18554 16879] [18592 16965] [18586 17047] + ) + Polygon("") + ( + [4985 17595] [5094 17758] [5001 18083] [4773 18403] [4616 18484] + [4231 18137] [4074 17741] [4198 17600] [4334 17638] [4605 17720] + [4849 17649] + Hole ( + [4594 18349] [4735 18132] [4746 18040] [4757 17964] [4697 17893] + [4632 17899] [4578 17909] [4529 17899] [4480 17893] [4410 18002] + [4437 18137] [4464 18246] + ) + ) + Polygon("") + ( + [4746 17128] [4719 17014] [4708 16955] [4817 16846] [4931 16813] + [5039 16770] [5110 16738] [5159 16700] [5186 16694] [5229 16732] + [5229 16738] [5197 16830] [5121 16976] [4914 17258] [4871 17296] + [4833 17313] [4763 17226] + ) + Polygon("") + ( + [4155 16808] [4269 16851] [4350 16884] [4432 16987] [4426 17020] + [4410 17112] [4399 17242] [4372 17296] [4345 17329] [4334 17329] + [4215 17253] [3954 16917] [3895 16759] [3932 16700] [3987 16727] + [4052 16754] + ) + Polygon("") + ( + [18787 3749] [18684 3467] [18630 3223] [18744 3082] [18830 3125] + [18966 3207] [19156 3223] [19444 3136] [19536 3098] [19650 3256] + [19574 3581] [19406 4010] [19151 4216] [18955 4096] + Hole ( + [19210 3445] [19091 3445] [19042 3435] [19031 3435] [18934 3527] + [18939 3581] [18961 3706] [19129 4053] [19281 3934] [19330 3820] + [19357 3673] [19373 3559] [19313 3435] [19303 3435] + ) + ) + Polygon("") + ( + [19780 2116] [19807 2138] [19818 2181] [19747 2426] [19547 2778] + [19444 2881] [19422 2887] [19416 2887] [19389 2865] [19378 2838] + [19335 2702] [19303 2572] [19275 2474] [19264 2426] [19368 2344] + [19650 2198] [19715 2154] [19753 2132] + ) + Polygon("") + ( + [18527 2404] [18462 2284] [18434 2160] [18489 2078] [18586 2122] + [18662 2181] [18776 2268] [18939 2377] [19020 2458] [19004 2545] + [18982 2626] [18955 2740] [18939 2800] [18879 2854] [18771 2794] + [18684 2697] [18603 2556] + ) + Polygon("") + ( + [4285 3749] [4182 3467] [4128 3223] [4242 3082] [4329 3125] + [4464 3207] [4654 3223] [4942 3136] [5034 3098] [5148 3256] + [5072 3581] [4898 4010] [4649 4216] [4453 4096] + Hole ( + [4681 3445] [4589 3445] [4540 3435] [4529 3435] [4432 3527] + [4437 3581] [4459 3706] [4627 4053] [4779 3934] [4822 3820] + [4855 3673] [4871 3559] [4871 3543] [4806 3435] [4801 3435] + ) + ) + Polygon("") + ( + [5273 2116] [5305 2138] [5316 2181] [5245 2426] [5045 2778] + [4942 2881] [4920 2887] [4914 2887] [4887 2865] [4876 2838] + [4833 2702] [4801 2572] [4773 2474] [4763 2426] [4866 2344] + [5148 2198] [5213 2154] [5251 2132] + ) + Polygon("") + ( + [4160 2181] [4274 2268] [4437 2377] [4502 2415] [4518 2463] + [4502 2545] [4480 2626] [4448 2740] [4437 2800] [4377 2854] + [4182 2697] [4101 2556] [4014 2404] [3960 2284] [3922 2165] + [3987 2078] [4025 2084] [4074 2122] + ) +) Index: pcb-plugins_sources/examples/polystitch.pcb =================================================================== --- pcb-plugins_sources/examples/polystitch.pcb (nonexistent) +++ pcb-plugins_sources/examples/polystitch.pcb (revision 3870) @@ -0,0 +1,870 @@ +# release: pcb 1.99z +# date: Fri May 28 01:02:59 2010 +# user: dj (DJ Delorie) +# host: localhost + +# To read pcb files, the pcb version (or the cvs source date) must be >= the file version +FileVersion[20070407] + +PCB["" 200000 100000] + +Grid[1.000000 0 0 0] +Cursor[0 0 0.000000] +PolyArea[200000000.000000] +Thermal[0.500000] +DRC[1000 1000 1000 100 1500 1000] +Flags("nameonpcb,uniquename,clearnew,snappin") +Groups("1,c:2,s:3:4:5:6:7:8") +Styles["Signal,1000,3600,2000,1000:Power,2500,6000,3500,1000:Fat,4000,6000,3500,1000:Skinny,600,2402,1181,600"] + +Symbol(' ' 18) +( +) +Symbol('!' 12) +( + SymbolLine(0 45 0 50 8) + SymbolLine(0 10 0 35 8) +) +Symbol('"' 12) +( + SymbolLine(0 10 0 20 8) + SymbolLine(10 10 10 20 8) +) +Symbol('#' 12) +( + SymbolLine(0 35 20 35 8) + SymbolLine(0 25 20 25 8) + SymbolLine(15 20 15 40 8) + SymbolLine(5 20 5 40 8) +) +Symbol('$' 12) +( + SymbolLine(15 15 20 20 8) + SymbolLine(5 15 15 15 8) + SymbolLine(0 20 5 15 8) + SymbolLine(0 20 0 25 8) + SymbolLine(0 25 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 40 8) + SymbolLine(15 45 20 40 8) + SymbolLine(5 45 15 45 8) + SymbolLine(0 40 5 45 8) + SymbolLine(10 10 10 50 8) +) +Symbol('%' 12) +( + SymbolLine(0 15 0 20 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 10 10 8) + SymbolLine(10 10 15 15 8) + SymbolLine(15 15 15 20 8) + SymbolLine(10 25 15 20 8) + SymbolLine(5 25 10 25 8) + SymbolLine(0 20 5 25 8) + SymbolLine(0 50 40 10 8) + SymbolLine(35 50 40 45 8) + SymbolLine(40 40 40 45 8) + SymbolLine(35 35 40 40 8) + SymbolLine(30 35 35 35 8) + SymbolLine(25 40 30 35 8) + SymbolLine(25 40 25 45 8) + SymbolLine(25 45 30 50 8) + SymbolLine(30 50 35 50 8) +) +Symbol('&' 12) +( + SymbolLine(0 45 5 50 8) + SymbolLine(0 15 0 25 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 35 15 20 8) + SymbolLine(5 50 10 50 8) + SymbolLine(10 50 20 40 8) + SymbolLine(0 25 25 50 8) + SymbolLine(5 10 10 10 8) + SymbolLine(10 10 15 15 8) + SymbolLine(15 15 15 20 8) + SymbolLine(0 35 0 45 8) +) +Symbol(''' 12) +( + SymbolLine(0 20 10 10 8) +) +Symbol('(' 12) +( + SymbolLine(0 45 5 50 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 45 8) +) +Symbol(')' 12) +( + SymbolLine(0 10 5 15 8) + SymbolLine(5 15 5 45 8) + SymbolLine(0 50 5 45 8) +) +Symbol('*' 12) +( + SymbolLine(0 20 20 40 8) + SymbolLine(0 40 20 20 8) + SymbolLine(0 30 20 30 8) + SymbolLine(10 20 10 40 8) +) +Symbol('+' 12) +( + SymbolLine(0 30 20 30 8) + SymbolLine(10 20 10 40 8) +) +Symbol(',' 12) +( + SymbolLine(0 60 10 50 8) +) +Symbol('-' 12) +( + SymbolLine(0 30 20 30 8) +) +Symbol('.' 12) +( + SymbolLine(0 50 5 50 8) +) +Symbol('/' 12) +( + SymbolLine(0 45 30 15 8) +) +Symbol('0' 12) +( + SymbolLine(0 45 5 50 8) + SymbolLine(0 15 0 45 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 40 20 20 8) +) +Symbol('1' 12) +( + SymbolLine(5 50 15 50 8) + SymbolLine(10 10 10 50 8) + SymbolLine(0 20 10 10 8) +) +Symbol('2' 12) +( + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 25 8) + SymbolLine(0 50 25 25 8) + SymbolLine(0 50 25 50 8) +) +Symbol('3' 12) +( + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 30 20 30 8) +) +Symbol('4' 12) +( + SymbolLine(0 30 20 10 8) + SymbolLine(0 30 25 30 8) + SymbolLine(20 10 20 50 8) +) +Symbol('5' 12) +( + SymbolLine(0 10 20 10 8) + SymbolLine(0 10 0 30 8) + SymbolLine(0 30 5 25 8) + SymbolLine(5 25 15 25 8) + SymbolLine(15 25 20 30 8) + SymbolLine(20 30 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('6' 12) +( + SymbolLine(15 10 20 15 8) + SymbolLine(5 10 15 10 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(15 30 20 35 8) + SymbolLine(0 30 15 30 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(20 35 20 45 8) +) +Symbol('7' 12) +( + SymbolLine(0 50 25 25 8) + SymbolLine(25 10 25 25 8) + SymbolLine(0 10 25 10 8) +) +Symbol('8' 12) +( + SymbolLine(0 45 5 50 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 25 5 30 8) + SymbolLine(0 15 0 25 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 25 8) + SymbolLine(15 30 20 25 8) +) +Symbol('9' 12) +( + SymbolLine(0 50 20 30 8) + SymbolLine(20 15 20 30 8) + SymbolLine(15 10 20 15 8) + SymbolLine(5 10 15 10 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 25 8) + SymbolLine(0 25 5 30 8) + SymbolLine(5 30 20 30 8) +) +Symbol(':' 12) +( + SymbolLine(0 25 5 25 8) + SymbolLine(0 35 5 35 8) +) +Symbol(';' 12) +( + SymbolLine(0 50 10 40 8) + SymbolLine(10 25 10 30 8) +) +Symbol('<' 12) +( + SymbolLine(0 30 10 20 8) + SymbolLine(0 30 10 40 8) +) +Symbol('=' 12) +( + SymbolLine(0 25 20 25 8) + SymbolLine(0 35 20 35 8) +) +Symbol('>' 12) +( + SymbolLine(0 20 10 30 8) + SymbolLine(0 40 10 30 8) +) +Symbol('?' 12) +( + SymbolLine(10 30 10 35 8) + SymbolLine(10 45 10 50 8) + SymbolLine(0 15 0 20 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 20 8) + SymbolLine(10 30 20 20 8) +) +Symbol('@' 12) +( + SymbolLine(0 10 0 40 8) + SymbolLine(0 40 10 50 8) + SymbolLine(10 50 40 50 8) + SymbolLine(50 35 50 10 8) + SymbolLine(50 10 40 0 8) + SymbolLine(40 0 10 0 8) + SymbolLine(10 0 0 10 8) + SymbolLine(15 20 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 30 35 8) + SymbolLine(30 35 35 30 8) + SymbolLine(35 30 40 35 8) + SymbolLine(35 30 35 15 8) + SymbolLine(35 20 30 15 8) + SymbolLine(20 15 30 15 8) + SymbolLine(20 15 15 20 8) + SymbolLine(40 35 50 35 8) +) +Symbol('A' 12) +( + SymbolLine(0 15 0 50 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 50 8) + SymbolLine(0 30 25 30 8) +) +Symbol('B' 12) +( + SymbolLine(0 50 20 50 8) + SymbolLine(20 50 25 45 8) + SymbolLine(25 35 25 45 8) + SymbolLine(20 30 25 35 8) + SymbolLine(5 30 20 30 8) + SymbolLine(5 10 5 50 8) + SymbolLine(0 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 25 8) + SymbolLine(20 30 25 25 8) +) +Symbol('C' 12) +( + SymbolLine(5 50 20 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(0 15 0 45 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 20 10 8) +) +Symbol('D' 12) +( + SymbolLine(5 10 5 50 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 45 8) + SymbolLine(20 50 25 45 8) + SymbolLine(0 50 20 50 8) + SymbolLine(0 10 20 10 8) +) +Symbol('E' 12) +( + SymbolLine(0 30 15 30 8) + SymbolLine(0 50 20 50 8) + SymbolLine(0 10 0 50 8) + SymbolLine(0 10 20 10 8) +) +Symbol('F' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 10 20 10 8) + SymbolLine(0 30 15 30 8) +) +Symbol('G' 12) +( + SymbolLine(20 10 25 15 8) + SymbolLine(5 10 20 10 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 20 50 8) + SymbolLine(20 50 25 45 8) + SymbolLine(25 35 25 45 8) + SymbolLine(20 30 25 35 8) + SymbolLine(10 30 20 30 8) +) +Symbol('H' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(25 10 25 50 8) + SymbolLine(0 30 25 30 8) +) +Symbol('I' 12) +( + SymbolLine(0 10 10 10 8) + SymbolLine(5 10 5 50 8) + SymbolLine(0 50 10 50 8) +) +Symbol('J' 12) +( + SymbolLine(0 10 15 10 8) + SymbolLine(15 10 15 45 8) + SymbolLine(10 50 15 45 8) + SymbolLine(5 50 10 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('K' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 30 20 10 8) + SymbolLine(0 30 20 50 8) +) +Symbol('L' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 50 20 50 8) +) +Symbol('M' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 10 15 25 8) + SymbolLine(15 25 30 10 8) + SymbolLine(30 10 30 50 8) +) +Symbol('N' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 10 0 15 8) + SymbolLine(0 15 25 40 8) + SymbolLine(25 10 25 50 8) +) +Symbol('O' 12) +( + SymbolLine(0 15 0 45 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('P' 12) +( + SymbolLine(5 10 5 50 8) + SymbolLine(0 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 25 8) + SymbolLine(20 30 25 25 8) + SymbolLine(5 30 20 30 8) +) +Symbol('Q' 12) +( + SymbolLine(0 15 0 45 8) + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 15 10 8) + SymbolLine(15 10 20 15 8) + SymbolLine(20 15 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(10 40 20 50 8) +) +Symbol('R' 12) +( + SymbolLine(0 10 20 10 8) + SymbolLine(20 10 25 15 8) + SymbolLine(25 15 25 25 8) + SymbolLine(20 30 25 25 8) + SymbolLine(5 30 20 30 8) + SymbolLine(5 10 5 50 8) + SymbolLine(5 30 25 50 8) +) +Symbol('S' 12) +( + SymbolLine(20 10 25 15 8) + SymbolLine(5 10 20 10 8) + SymbolLine(0 15 5 10 8) + SymbolLine(0 15 0 25 8) + SymbolLine(0 25 5 30 8) + SymbolLine(5 30 20 30 8) + SymbolLine(20 30 25 35 8) + SymbolLine(25 35 25 45 8) + SymbolLine(20 50 25 45 8) + SymbolLine(5 50 20 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('T' 12) +( + SymbolLine(0 10 20 10 8) + SymbolLine(10 10 10 50 8) +) +Symbol('U' 12) +( + SymbolLine(0 10 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(20 10 20 45 8) +) +Symbol('V' 12) +( + SymbolLine(0 10 0 40 8) + SymbolLine(0 40 10 50 8) + SymbolLine(10 50 20 40 8) + SymbolLine(20 10 20 40 8) +) +Symbol('W' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 50 15 35 8) + SymbolLine(15 35 30 50 8) + SymbolLine(30 10 30 50 8) +) +Symbol('X' 12) +( + SymbolLine(0 10 0 15 8) + SymbolLine(0 15 25 40 8) + SymbolLine(25 40 25 50 8) + SymbolLine(0 40 0 50 8) + SymbolLine(0 40 25 15 8) + SymbolLine(25 10 25 15 8) +) +Symbol('Y' 12) +( + SymbolLine(0 10 0 15 8) + SymbolLine(0 15 10 25 8) + SymbolLine(10 25 20 15 8) + SymbolLine(20 10 20 15 8) + SymbolLine(10 25 10 50 8) +) +Symbol('Z' 12) +( + SymbolLine(0 10 25 10 8) + SymbolLine(25 10 25 15 8) + SymbolLine(0 40 25 15 8) + SymbolLine(0 40 0 50 8) + SymbolLine(0 50 25 50 8) +) +Symbol('[' 12) +( + SymbolLine(0 10 5 10 8) + SymbolLine(0 10 0 50 8) + SymbolLine(0 50 5 50 8) +) +Symbol('\' 12) +( + SymbolLine(0 15 30 45 8) +) +Symbol(']' 12) +( + SymbolLine(0 10 5 10 8) + SymbolLine(5 10 5 50 8) + SymbolLine(0 50 5 50 8) +) +Symbol('^' 12) +( + SymbolLine(0 15 5 10 8) + SymbolLine(5 10 10 15 8) +) +Symbol('_' 12) +( + SymbolLine(0 50 20 50 8) +) +Symbol('a' 12) +( + SymbolLine(15 30 20 35 8) + SymbolLine(5 30 15 30 8) + SymbolLine(0 35 5 30 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(20 30 20 45 8) + SymbolLine(20 45 25 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) +) +Symbol('b' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(20 35 20 45 8) + SymbolLine(15 30 20 35 8) + SymbolLine(5 30 15 30 8) + SymbolLine(0 35 5 30 8) +) +Symbol('c' 12) +( + SymbolLine(5 30 20 30 8) + SymbolLine(0 35 5 30 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 20 50 8) +) +Symbol('d' 12) +( + SymbolLine(20 10 20 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) +) +Symbol('e' 12) +( + SymbolLine(5 50 20 50 8) + SymbolLine(0 45 5 50 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(0 40 20 40 8) + SymbolLine(20 40 20 35 8) +) +Symbol('f' 10) +( + SymbolLine(5 15 5 50 8) + SymbolLine(5 15 10 10 8) + SymbolLine(10 10 15 10 8) + SymbolLine(0 30 10 30 8) +) +Symbol('g' 12) +( + SymbolLine(15 30 20 35 8) + SymbolLine(5 30 15 30 8) + SymbolLine(0 35 5 30 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(0 60 5 65 8) + SymbolLine(5 65 15 65 8) + SymbolLine(15 65 20 60 8) + SymbolLine(20 30 20 60 8) +) +Symbol('h' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 50 8) +) +Symbol('i' 10) +( + SymbolLine(0 20 0 25 8) + SymbolLine(0 35 0 50 8) +) +Symbol('j' 10) +( + SymbolLine(5 20 5 25 8) + SymbolLine(5 35 5 60 8) + SymbolLine(0 65 5 60 8) +) +Symbol('k' 12) +( + SymbolLine(0 10 0 50 8) + SymbolLine(0 35 15 50 8) + SymbolLine(0 35 10 25 8) +) +Symbol('l' 10) +( + SymbolLine(0 10 0 45 8) + SymbolLine(0 45 5 50 8) +) +Symbol('m' 12) +( + SymbolLine(5 35 5 50 8) + SymbolLine(5 35 10 30 8) + SymbolLine(10 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 50 8) + SymbolLine(20 35 25 30 8) + SymbolLine(25 30 30 30 8) + SymbolLine(30 30 35 35 8) + SymbolLine(35 35 35 50 8) + SymbolLine(0 30 5 35 8) +) +Symbol('n' 12) +( + SymbolLine(5 35 5 50 8) + SymbolLine(5 35 10 30 8) + SymbolLine(10 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 50 8) + SymbolLine(0 30 5 35 8) +) +Symbol('o' 12) +( + SymbolLine(0 35 0 45 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 15 30 8) + SymbolLine(15 30 20 35 8) + SymbolLine(20 35 20 45 8) + SymbolLine(15 50 20 45 8) + SymbolLine(5 50 15 50 8) + SymbolLine(0 45 5 50 8) +) +Symbol('p' 12) +( + SymbolLine(5 35 5 65 8) + SymbolLine(0 30 5 35 8) + SymbolLine(5 35 10 30 8) + SymbolLine(10 30 20 30 8) + SymbolLine(20 30 25 35 8) + SymbolLine(25 35 25 45 8) + SymbolLine(20 50 25 45 8) + SymbolLine(10 50 20 50 8) + SymbolLine(5 45 10 50 8) +) +Symbol('q' 12) +( + SymbolLine(20 35 20 65 8) + SymbolLine(15 30 20 35 8) + SymbolLine(5 30 15 30 8) + SymbolLine(0 35 5 30 8) + SymbolLine(0 35 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) +) +Symbol('r' 12) +( + SymbolLine(5 35 5 50 8) + SymbolLine(5 35 10 30 8) + SymbolLine(10 30 20 30 8) + SymbolLine(0 30 5 35 8) +) +Symbol('s' 12) +( + SymbolLine(5 50 20 50 8) + SymbolLine(20 50 25 45 8) + SymbolLine(20 40 25 45 8) + SymbolLine(5 40 20 40 8) + SymbolLine(0 35 5 40 8) + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 20 30 8) + SymbolLine(20 30 25 35 8) + SymbolLine(0 45 5 50 8) +) +Symbol('t' 10) +( + SymbolLine(5 10 5 45 8) + SymbolLine(5 45 10 50 8) + SymbolLine(0 25 10 25 8) +) +Symbol('u' 12) +( + SymbolLine(0 30 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) + SymbolLine(20 30 20 45 8) +) +Symbol('v' 12) +( + SymbolLine(0 30 0 40 8) + SymbolLine(0 40 10 50 8) + SymbolLine(10 50 20 40 8) + SymbolLine(20 30 20 40 8) +) +Symbol('w' 12) +( + SymbolLine(0 30 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(5 50 10 50 8) + SymbolLine(10 50 15 45 8) + SymbolLine(15 30 15 45 8) + SymbolLine(15 45 20 50 8) + SymbolLine(20 50 25 50 8) + SymbolLine(25 50 30 45 8) + SymbolLine(30 30 30 45 8) +) +Symbol('x' 12) +( + SymbolLine(0 30 20 50 8) + SymbolLine(0 50 20 30 8) +) +Symbol('y' 12) +( + SymbolLine(0 30 0 45 8) + SymbolLine(0 45 5 50 8) + SymbolLine(20 30 20 60 8) + SymbolLine(15 65 20 60 8) + SymbolLine(5 65 15 65 8) + SymbolLine(0 60 5 65 8) + SymbolLine(5 50 15 50 8) + SymbolLine(15 50 20 45 8) +) +Symbol('z' 12) +( + SymbolLine(0 30 20 30 8) + SymbolLine(0 50 20 30 8) + SymbolLine(0 50 20 50 8) +) +Symbol('{' 12) +( + SymbolLine(5 15 10 10 8) + SymbolLine(5 15 5 25 8) + SymbolLine(0 30 5 25 8) + SymbolLine(0 30 5 35 8) + SymbolLine(5 35 5 45 8) + SymbolLine(5 45 10 50 8) +) +Symbol('|' 12) +( + SymbolLine(0 10 0 50 8) +) +Symbol('}' 12) +( + SymbolLine(0 10 5 15 8) + SymbolLine(5 15 5 25 8) + SymbolLine(5 25 10 30 8) + SymbolLine(5 35 10 30 8) + SymbolLine(5 35 5 45 8) + SymbolLine(0 50 5 45 8) +) +Symbol('~' 12) +( + SymbolLine(0 35 5 30 8) + SymbolLine(5 30 10 30 8) + SymbolLine(10 30 15 35 8) + SymbolLine(15 35 20 35 8) + SymbolLine(20 35 25 30 8) +) +Layer(1 "component") +( + Text[28000 85400 0 133 "Unstitched Polygons" ""] + Text[108675 85575 0 133 "Stitched Polygons" ""] +) +Layer(2 "solder") +( +) +Layer(3 "GND") +( +) +Layer(4 "power") +( + Text[43750 3500 0 133 "(toggle thindraw to see stitches)" ""] +) +Layer(5 "signal1") +( +) +Layer(6 "signal2") +( +) +Layer(7 "signal3") +( +) +Layer(8 "signal4") +( +) +Layer(9 "signal9") +( +) +Layer(10 "silk") +( + Polygon("clearpoly") + ( + [149883 73944] [171698 73944] [171698 70521] [165752 70211] [164119 68969] + [164119 16468] [158748 16468] [141365 20124] [141365 23233] [149883 23233] + [149883 35831] [146838 35479] [144001 35240] [141365 35098] [138918 35055] + [132533 35434] [126733 36547] [121600 38348] [117216 40779] [113663 43801] + [111026 47359] [109382 51406] [108818 55899] [109252 59919] [110516 63549] + [112529 66750] [115231 69468] [118546 71665] [122398 73287] [126722 74297] + [131447 74644] [135901 74313] [140400 73336] [145033 71752] [149883 69587] + [149883 66555] [147170 67179] [144631 67640] [142270 67927] [140084 68030] + [136629 67792] [133552 67103] [130878 65969] [128631 64412] [126841 62448] + [125528 60088] [124720 57359] [124449 54266] [124525 52573] [124763 50968] + [125148 49454] [125675 48038] [126347 46719] [127145 45494] [128078 44376] + [129131 43366] [130297 42461] [131572 41669] [132955 40990] [134437 40426] + [136015 39987] [137681 39666] [139423 39477] [141251 39412] [143155 39483] + [145212 39699] [147447 40068] [149883 40579] + ) + Polygon("clearpoly") + ( + [69883 66555] [67170 67179] [64631 67640] [62270 67927] [60084 68030] + [56629 67792] [53552 67103] [50878 65969] [48631 64412] [46841 62448] + [45528 60088] [44720 57359] [44449 54266] [44525 52573] [44763 50968] + [45148 49454] [45675 48038] [46347 46719] [47145 45494] [48078 44376] + [49131 43366] [50297 42461] [51572 41669] [52955 40990] [54437 40426] + [56015 39987] [57681 39666] [59423 39477] [61251 39412] [63155 39483] + [65212 39699] [67447 40068] [69883 40579] [69883 66555] + ) + Polygon("clearpoly") + ( + [69883 23233] [69883 35831] [66838 35479] [64001 35240] [61365 35098] + [58918 35055] [52533 35434] [46733 36547] [41600 38348] [37216 40779] + [33663 43801] [31026 47359] [29382 51406] [28818 55899] [29252 59919] + [30516 63549] [32529 66750] [35231 69468] [38546 71665] [42398 73287] + [46722 74297] [51447 74644] [55901 74313] [60400 73336] [65033 71752] + [69883 69587] [69883 73944] [91698 73944] [91698 70521] [85752 70211] + [84119 68969] [84119 16468] [78748 16468] [61365 20124] [61365 23233] + [69883 23233] + ) +) Index: pcb-plugins_sources/src/plugins/Makefile =================================================================== --- pcb-plugins_sources/src/plugins/Makefile (nonexistent) +++ pcb-plugins_sources/src/plugins/Makefile (revision 3870) @@ -0,0 +1,107 @@ +# Compile single source files against the pcb source tree. + +CC=gcc + +# Test for osx install, pass in cflags for shared libraries under OS X. +OSX_INSTALL=$(shell bash -c "if [ -n \"`which sw_vers`\" ]; then sw_vers -productName; else echo 'Not OSX'; fi" ) + +ifeq ($(OSX_INSTALL),Mac OS X) + CFLAGS= -Wall -I../../../pcb/src -I../../../pcb -O2 -flat_namespace -bundle -undefined suppress +else + CFLAGS=-g -Wall -I../../../pcb/src -I../../../pcb -O2 -shared `pkg-config --cflags glib-2.0` +endif + +%.so: %.c + ${CC} ${CFLAGS} $< -o $@ + +ghellopcb.so: ghellopcb.c + ${CC} ${CFLAGS} ghellopcb.c -o ghellopcb.so `pkg-config --cflags gtk+-2.0 --libs gtk+-2.0` + +.DEFAULT_GOAL := all + +# Individual target definitions. +autocrop: autocrop.so + +boardflip: boardflip.so + +distalign: distalign.so + +distaligntext: distaligntext.so + +elementupdate: elementupdate.so + +findelement: findelement.so + +findrat: findrat.so + +ghellopcb: ghellopcb.so + +join-found: join-found.so + +jostle: jostle.so + +lockelements: lockelements.so + +polycombine: polycombine.so + +polystitch: polystitch.so + +renumberblock: renumberblock.so + +sedrename: sedrename.so + +smartdisperse: smartdisperse.so + +teardrops: teardrops.so + +upth2pth: upth2pth.so + +# +all: \ + autocrop \ + boardflip \ + distalign \ + distaligntext \ + elementupdate \ + findelement \ + findrat \ + ghellopcb \ + join-found \ + jostle \ + lockelements \ + polycombine \ + polystitch \ + renumberblock \ + sedrename \ + smartdisperse \ + teardrops \ + upth2pth + +install: + mkdir -p ~/.pcb/plugins + mv *.so ~/.pcb/plugins + +clean: + rm -f *.so *~ + +uninstall: + rm ~/.pcb/plugins/autocrop.so + rm ~/.pcb/plugins/boardflip.so + rm ~/.pcb/plugins/distalign.so + rm ~/.pcb/plugins/distaligntext.so + rm ~/.pcb/plugins/elementupdate.so + rm ~/.pcb/plugins/findelement.so + rm ~/.pcb/plugins/findrat.so + rm ~/.pcb/plugins/ghellopcb.so + rm ~/.pcb/plugins/join-found.so + rm ~/.pcb/plugins/jostle.so + rm ~/.pcb/plugins/lockelements.so + rm ~/.pcb/plugins/polycombine.so + rm ~/.pcb/plugins/polystitch.so + rm ~/.pcb/plugins/renumberblock.so + rm ~/.pcb/plugins/sedrename.so + rm ~/.pcb/plugins/smartdisperse.so + rm ~/.pcb/plugins/teardrops.so + rm ~/.pcb/plugins/upth2pth.so + +# EOF # Index: pcb-plugins_sources/src/plugins/autocrop.c =================================================================== --- pcb-plugins_sources/src/plugins/autocrop.c (nonexistent) +++ pcb-plugins_sources/src/plugins/autocrop.c (revision 3870) @@ -0,0 +1,262 @@ +/*! + * \file autocrop.c + * + * \brief Autocrop plug-in for PCB. + * Reduce the board dimensions to just enclose the elements. + * + * \author Copyright (C) 2007 Ben Jackson based on teardrops.c by + * Copyright (C) 2006 DJ Delorie + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * From: Ben Jackson + * To: geda-user@moria.seul.org + * Date: Mon, 19 Feb 2007 13:30:58 -0800 + * Subject: Autocrop() plugin for PCB + * + * As a "learn PCB internals" project I've written an Autocrop() plugin. + * It finds the extents of your existing board and resizes the board to + * contain only your parts plus a margin. + * + * There are some issues that I can't resolve from a plugin: + * + *
    + *
  1. Board size has no Undo function, so while Undo will put your objects + * back where they started, the board size has to be replaced manually. + *
  2. There is no 'edge clearance' DRC paramater, so I used 5*line spacing. + *
  3. Moving a layout with lots of objects and polygons is slow due to the + * repeated clearing/unclearing of the polygons as things move. Undo is + * slower than moving because every individual move is drawn (instead of + * one redraw at the end). + *
+ * + * The source is: http://ad7gd.net/geda/autocrop.c + * + * And you compile/install with: + *
+# set PCB to your PCB source directory
+PCB=$(HOME)/cvs/pcb
+gcc -I$(PCB) -I$(PCB)/src -O2 -shared autocrop.c -o autocrop.so
+cp autocrop.so ~/.pcb/plugins
+ * 
+ * Run it by typing `:Autocrop()' in the gui, or by binding Autocrop() to a key. + * + * -- + * Ben Jackson AD7GD + * + * http://www.ben.com/ + */ + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "create.h" +#include "rtree.h" +#include "undo.h" +#include "move.h" +#include "draw.h" +#include "set.h" +#include "polygon.h" + +static void * +MyMoveViaLowLevel (DataType *Data, PinType *Via, Coord dx, Coord dy) +{ + if (Data) + { + RestoreToPolygon (Data, VIA_TYPE, Via, Via); + r_delete_entry (Data->via_tree, (BoxType *) Via); + } + MOVE_VIA_LOWLEVEL (Via, dx, dy); + if (Data) + { + r_insert_entry (Data->via_tree, (BoxType *) Via, 0); + ClearFromPolygon (Data, VIA_TYPE, Via, Via); + } + return Via; +} + +static void * +MyMoveLineLowLevel (DataType *Data, LayerType *Layer, LineType *Line, Coord dx, Coord dy) +{ + if (Data) + { + RestoreToPolygon (Data, LINE_TYPE, Layer, Line); + r_delete_entry (Layer->line_tree, (BoxType *) Line); + } + MOVE_LINE_LOWLEVEL (Line, dx, dy); + if (Data) + { + r_insert_entry (Layer->line_tree, (BoxType *) Line, 0); + ClearFromPolygon (Data, LINE_TYPE, Layer, Line); + } + return Line; +} + +static void * +MyMoveArcLowLevel (DataType *Data, LayerType *Layer, ArcType *Arc, Coord dx, Coord dy) +{ + if (Data) + { + RestoreToPolygon (Data, ARC_TYPE, Layer, Arc); + r_delete_entry(Layer->arc_tree, (BoxType *) Arc); + } + MOVE_ARC_LOWLEVEL (Arc, dx, dy); + if (Data) + { + r_insert_entry (Layer->arc_tree, (BoxType *) Arc, 0); + ClearFromPolygon (Data, ARC_TYPE, Layer, Arc); + } + return Arc; +} + +static void * +MyMovePolygonLowLevel (DataType *Data, LayerType *Layer, PolygonType *Polygon, Coord dx, Coord dy) +{ + if (Data) + { + r_delete_entry (Layer->polygon_tree, (BoxType *) Polygon); + } + /* move.c actually only moves points, note no Data/Layer args */ + MovePolygonLowLevel (Polygon, dx, dy); + if (Data) + { + r_insert_entry (Layer->polygon_tree, (BoxType *) Polygon, 0); + InitClip(Data, Layer, Polygon); + } + return Polygon; +} + +static void * +MyMoveTextLowLevel (LayerType *Layer, TextType *Text, Coord dx, Coord dy) +{ + if (Layer) + r_delete_entry (Layer->text_tree, (BoxType *) Text); + MOVE_TEXT_LOWLEVEL (Text, dx, dy); + if (Layer) + r_insert_entry (Layer->text_tree, (BoxType *) Text, 0); + return Text; +} + +/*! + * \brief Move everything. + * + * Call our own 'MyMove*LowLevel' where they don't exist in move.c. + * This gets very slow if there are large polygons present, since every + * element move re-clears the poly, followed by the polys moving and + * re-clearing everything again. + */ +static void +MoveAll(Coord dx, Coord dy) +{ + ELEMENT_LOOP (PCB->Data); + { + MoveElementLowLevel (PCB->Data, element, dx, dy); + AddObjectToMoveUndoList (ELEMENT_TYPE, NULL, NULL, element, dx, dy); + } + END_LOOP; + VIA_LOOP (PCB->Data); + { + MyMoveViaLowLevel (PCB->Data, via, dx, dy); + AddObjectToMoveUndoList (VIA_TYPE, NULL, NULL, via, dx, dy); + } + END_LOOP; + ALLLINE_LOOP (PCB->Data); + { + MyMoveLineLowLevel (PCB->Data, layer, line, dx, dy); + AddObjectToMoveUndoList (LINE_TYPE, NULL, NULL, line, dx, dy); + } + ENDALL_LOOP; + ALLARC_LOOP (PCB->Data); + { + MyMoveArcLowLevel (PCB->Data, layer, arc, dx, dy); + AddObjectToMoveUndoList (ARC_TYPE, NULL, NULL, arc, dx, dy); + } + ENDALL_LOOP; + ALLTEXT_LOOP (PCB->Data); + { + MyMoveTextLowLevel (layer, text, dx, dy); + AddObjectToMoveUndoList (TEXT_TYPE, NULL, NULL, text, dx, dy); + } + ENDALL_LOOP; + ALLPOLYGON_LOOP (PCB->Data); + { + /* + * XXX MovePolygonLowLevel does not mean "no gui" like + * XXX MoveElementLowLevel, it doesn't even handle layer + * XXX tree activity. + */ + MyMovePolygonLowLevel (PCB->Data, layer, polygon, dx, dy); + AddObjectToMoveUndoList (POLYGON_TYPE, NULL, NULL, polygon, dx, dy); + } + ENDALL_LOOP; +} + +static int +autocrop (int argc, char **argv, Coord x, Coord y) +{ +// int changed = 0; + Coord dx, dy, pad; + BoxType *box; + + box = GetDataBoundingBox (PCB->Data); /* handy! */ + if (!box || (box->X1 == box->X2 || box->Y1 == box->Y2)) + { + /* board would become degenerate */ + return 0; + } + /* + * Now X1/Y1 are the distance to move the left/top edge + * (actually moving all components to the left/up) such that + * the exact edge of the leftmost/topmost component would touch + * the edge. Reduce the move by the edge relief requirement XXX + * and expand the board by the same amount. + */ + pad = PCB->minWid * 5; /* XXX real edge clearance */ + dx = -box->X1 + pad; + dy = -box->Y1 + pad; + box->X2 += pad; + box->Y2 += pad; + /* + * Round move to keep components grid-aligned, then translate the + * upper coordinates into the new space. + */ + dx -= dx % (long) PCB->Grid; + dy -= dy % (long) PCB->Grid; + box->X2 += dx; + box->Y2 += dy; + /* + * Avoid touching any data if there's nothing to do. + */ + if (dx == 0 && dy == 0 && PCB->MaxWidth == box->X2 + && PCB->MaxHeight == box->Y2) + { + return 0; + } + /* Resize -- XXX cannot be undone */ + PCB->MaxWidth = box->X2; + PCB->MaxHeight = box->Y2; + MoveAll (dx, dy); + IncrementUndoSerialNumber (); + Redraw (); + SetChangedFlag (1); + return 0; +} + +static HID_Action autocrop_action_list[] = +{ + {"autocrop", NULL, autocrop, NULL, NULL} +}; + +REGISTER_ACTIONS (autocrop_action_list) + +void +hid_autocrop_init () +{ + register_autocrop_action_list (); +} Index: pcb-plugins_sources/src/plugins/boardflip.c =================================================================== --- pcb-plugins_sources/src/plugins/boardflip.c (nonexistent) +++ pcb-plugins_sources/src/plugins/boardflip.c (revision 3870) @@ -0,0 +1,177 @@ +/*! + * \file boardflip.c + * + * \brief BoardFlip plug-in for PCB. + * + * \author Copyright (C) 2008 DJ Delorie + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * http://www.delorie.com/pcb/boardflip.c + * + * Compile like this: + *
+gcc -I$HOME/geda/pcb-cvs/src -I$HOME/geda/pcb-cvs -O2 -shared boardflip.c -o boardflip.so
+ * 
+ * The resulting boardflip.so goes in $HOME/.pcb/plugins/boardflip.so. + * + * Usage: Boardflip() + * + * All objects on the board are up-down flipped. + * + * Command line board flipping: + * + * pcb --action-string "BoardFlip() SaveTo(LayoutAs,$OUTFILE) Quit()" $INFILE + * + * To flip the board physically, use BoardFlip(sides) + * + */ + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "create.h" +#include "rtree.h" +#include "undo.h" + +/* Things that need to be flipped: + + lines + text + polygons + arcs + vias + elements + elementlines + elementarcs + pins + pads + rats +*/ + +#define FLIP(y) (y) = h - (y) +#define NEG(y) (y) = - (y) + +static int +boardflip (int argc, char **argv, Coord x, Coord y) +{ + int h = PCB->MaxHeight; + int sides = 0; + + if (argc > 0 && strcasecmp (argv[0], "sides") == 0) + sides = 1; + printf("argc %d argv %s sides %d\n", argc, argv[0], sides); + LAYER_LOOP (PCB->Data, max_copper_layer + 2); + { + LINE_LOOP (layer); + { + FLIP (line->Point1.Y); + FLIP (line->Point2.Y); + } + END_LOOP; + TEXT_LOOP (layer); + { + FLIP (text->Y); + TOGGLE_FLAG(ONSOLDERFLAG, text); + } + END_LOOP; + POLYGON_LOOP (layer); + { + int i, j; + POLYGONPOINT_LOOP (polygon); + { + FLIP (point->Y); + } + END_LOOP; + i = 0; + j = polygon->PointN - 1; + while (i < j) + { + PointType p = polygon->Points[i]; + polygon->Points[i] = polygon->Points[j]; + polygon->Points[j] = p; + i++; + j--; + } + } + END_LOOP; + ARC_LOOP (layer); + { + FLIP (arc->Y); + NEG (arc->StartAngle); + NEG (arc->Delta); + } + END_LOOP; + } + END_LOOP; + VIA_LOOP(PCB->Data); + { + FLIP (via->Y); + } + END_LOOP; + ELEMENT_LOOP (PCB->Data); + { + FLIP (element->MarkY); + if (sides) + TOGGLE_FLAG (ONSOLDERFLAG, element); + ELEMENTTEXT_LOOP (element); + { + FLIP (text->Y); + TOGGLE_FLAG (ONSOLDERFLAG, text); + } + END_LOOP; + ELEMENTLINE_LOOP (element); + { + FLIP (line->Point1.Y); + FLIP (line->Point2.Y); + } + END_LOOP; + ELEMENTARC_LOOP (element); + { + FLIP (arc->Y); + NEG (arc->StartAngle); + NEG (arc->Delta); + } + END_LOOP; + PIN_LOOP (element); + { + FLIP (pin->Y); + } + END_LOOP; + PAD_LOOP (element); + { + FLIP (pad->Point1.Y); + FLIP (pad->Point2.Y); + if (sides) + TOGGLE_FLAG (ONSOLDERFLAG, pad); + } + END_LOOP; + } + END_LOOP; + RAT_LOOP (PCB->Data); + { + FLIP (line->Point1.Y); + FLIP (line->Point2.Y); + } + END_LOOP; + return 0; +} + +static HID_Action boardflip_action_list[] = +{ + {"BoardFlip", NULL, boardflip, NULL, NULL} +}; + +REGISTER_ACTIONS (boardflip_action_list) + +void +pcb_plugin_init () +{ + register_boardflip_action_list (); +} Index: pcb-plugins_sources/src/plugins/distalign.c =================================================================== --- pcb-plugins_sources/src/plugins/distalign.c (nonexistent) +++ pcb-plugins_sources/src/plugins/distalign.c (revision 3870) @@ -0,0 +1,678 @@ +/*! + * \file distalign.c + * + * \brief distalign plug-in for PCB. + * Functions to distribute (evenly spread out) and align PCB elements. + * + * \author Copyright (C) 2007 Ben Jackson + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * From: Ben Jackson + * To: geda-user@moria.seul.org + * Date: Sat, 24 Feb 2007 22:13:51 -0800 + * Subject: The amazing Align/Distribute plugin + * + * Ok, having "finished" the smartdisperse plugin, I moved on to phase 2 + * of my "I'm sick of moving LEDs by hand" master plan. + * + * Introducing Align() and Distribute(), which work much like the + * similarly named functions in Visio. + * Given that PCB does not have the concept of "first selected object" + * to draw on, the reference points can be selected by arguments. + * + * Both functions always work on all selected elements[*]. + * + * Some examples: + * + *
+ * :Align(X) + * + * Objects are moved left/right to align their Marks with the Mark of + * the topmost selected object. All objects remain on or move to the + * current grid. + *
+ * :Align(Y,Centers) + * + * Now objects are aligned up/down to their geometric centers rather + * than their marks. The reference point is the center of the leftmost + * object. + *
+ * :Align(Y,Tops,Average,Gridless) + * + * Feeling bold, you align the tops all selected objects to the average + * of their top edges and let them wander off the grid to exactly the + * average of their tops. + *
+ * :Align(X,Marks,Crosshair) + * + * None of the objects are where you want them, so you move the + * crosshair to a likely spot and cause them all to move their X + * coordinates to your new X location. + *
+ * :Align(X,Marks,Last) + * + * As above, but instead of the crosshair you just override the default + * "First" to "Last" so the reference object is bottommost instead of + * topmost. + *
+ * + * Now you have them in a neat line, but they're all clumped! + * + * + *
+ * :Distribute(Y) + * + * Objects are spread out evenly from the first (uppermost) to last + * using their marks as the reference point. + *
+ * :Distribute(X,Lefts,Crosshair,Last) + * + * You move your crosshair to the left edge of the target area, which + * will be the leftmost edge of the leftmost object. The objects are + * spread between your crosshair and the original location of the Last + * (rightmost) object. + *
+ * :Distribute(Y,Gaps) + * + * You have chosen to select many oddly sized objects, and instead of + * their centers being spread out evenly, you want the space (or "gaps") + * to be even. + * + * You get tricky and bind `Align(X,Marks,Crosshair)' to a key. + * Now you can select an object and hit your key and the object will + * warp to the same X coordinate as your cursor. + * + * Source: http://ad7gd.net/geda/distalign.c + * + * Same compile instructions as before. Feedback is appreciated! + * + * [*] If it has any flaws, it is that you can't operate non-element + * objects, though some melding of autocrop (which knows how to do such + * things) and distalign could produce such a capability. + * + * Ben Jackson AD7GD + * + * http://www.ben.com/ + */ + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "create.h" +#include "rtree.h" +#include "undo.h" +#include "rats.h" +#include "error.h" +#include "move.h" +#include "draw.h" +#include "set.h" + +#define ARG(n) (argc > (n) ? argv[n] : 0) + +static const char align_syntax[] = "Align(X/Y, [Lefts/Rights/Tops/Bottoms/Centers/Marks, [First/Last/Crosshair/Average[, Gridless]]])"; + +static const char distribute_syntax[] = "Distribute(Y, [Lefts/Rights/Tops/Bottoms/Centers/Marks/Gaps, [First/Last/Crosshair, First/Last/Crosshair[, Gridless]]])"; + +enum +{ + K_X, + K_Y, + K_Lefts, + K_Rights, + K_Tops, + K_Bottoms, + K_Centers, + K_Marks, + K_Gaps, + K_First, + K_Last, + K_Average, + K_Crosshair, + K_Gridless, + K_none, + K_align, + K_distribute +}; + +static const char *keywords[] = +{ + [K_X] "X", + [K_Y] "Y", + [K_Lefts] "Lefts", + [K_Rights] "Rights", + [K_Tops] "Tops", + [K_Bottoms] "Bottoms", + [K_Centers] "Centers", + [K_Marks] "Marks", + [K_Gaps] "Gaps", + [K_First] "First", + [K_Last] "Last", + [K_Average] "Average", + [K_Crosshair] "Crosshair", + [K_Gridless] "Gridless", +}; + +static int +keyword (const char *s) +{ + int i; + + if (! s) + { + return K_none; + } + for (i = 0; i < ENTRIES(keywords); ++i) + { + if (keywords[i] && strcasecmp(s, keywords[i]) == 0) + return i; + } + return -1; +} + + +/* this macro produces a function in X or Y that switches on 'point' */ +#define COORD(DIR) \ +static inline Coord \ +coord ## DIR(ElementType *element, int point) \ +{ \ + switch (point) { \ + case K_Marks: \ + return element->Mark ## DIR; \ + case K_Lefts: \ + case K_Tops: \ + return element->BoundingBox.DIR ## 1; \ + case K_Rights: \ + case K_Bottoms: \ + return element->BoundingBox.DIR ## 2; \ + case K_Centers: \ + case K_Gaps: \ + return (element->BoundingBox.DIR ## 1 + \ + element->BoundingBox.DIR ## 2) / 2; \ + } \ + return 0; \ +} + +COORD(X) +COORD(Y) + +/* return the element coordinate associated with the given internal point */ +static Coord +coord (ElementType *element, int dir, int point) +{ + if (dir == K_X) + return coordX (element, point); + else + return coordY (element, point); +} + +static struct element_by_pos +{ + ElementType *element; + Coord pos; + Coord width; +} *elements_by_pos; + +static int nelements_by_pos; + +static int +cmp_ebp (const void *a, const void *b) +{ + const struct element_by_pos *ea = a; + const struct element_by_pos *eb = b; + + return ea->pos - eb->pos; +} + +/*! + * Find all selected objects, then order them in order by coordinate in + * the 'dir' axis. This is used to find the "First" and "Last" elements + * and also to choose the distribution order. + * + * For alignment, first and last are in the orthogonal axis (imagine if + * you were lining up letters in a sentence, aligning *vertically* to the + * first letter means selecting the first letter *horizontally*). + * + * For distribution, first and last are in the distribution axis. + */ +static int +sort_elements_by_pos (int op, int dir, int point) +{ + int nsel = 0; + + if (nelements_by_pos) + return nelements_by_pos; + if (op == K_align) + dir = dir == K_X ? K_Y : K_X; /* see above */ + ELEMENT_LOOP (PCB->Data); + { + if (! TEST_FLAG (SELECTEDFLAG, element)) + continue; + nsel++; + } + END_LOOP; + if (! nsel) + return 0; + elements_by_pos = malloc (nsel * sizeof (*elements_by_pos)); + nelements_by_pos = nsel; + nsel = 0; + ELEMENT_LOOP (PCB->Data); + { + if (! TEST_FLAG (SELECTEDFLAG, element)) + continue; + elements_by_pos[nsel].element = element; + elements_by_pos[nsel++].pos = coord (element, dir, point); + } + END_LOOP; + qsort (elements_by_pos, nelements_by_pos, + sizeof (*elements_by_pos), cmp_ebp); + return nelements_by_pos; +} + +static void +free_elements_by_pos (void) +{ + if (nelements_by_pos) + { + free (elements_by_pos); + elements_by_pos = NULL; + nelements_by_pos = 0; + } +} + +/*! + * \brief Find the reference coordinate from the specified points of all + * selected elements. + */ +static Coord +reference_coord (int op, int x, int y, int dir, int point, int reference) +{ + Coord q; + int nsel; + + q = 0; + switch (reference) + { + case K_Crosshair: + if (dir == K_X) + q = x; + else + q = y; + break; + case K_Average: /* the average among selected elements */ + nsel = 0; + q = 0; + ELEMENT_LOOP (PCB->Data); + { + if (! TEST_FLAG (SELECTEDFLAG, element)) + continue; + q += coord (element, dir, point); + nsel++; + } + END_LOOP; + if (nsel) + q /= nsel; + break; + case K_First: /* first or last in the orthogonal direction */ + case K_Last: + if (! sort_elements_by_pos(op, dir, point)) + { + q = 0; + break; + } + if (reference == K_First) + { + q = coord(elements_by_pos[0].element, dir, point); + } + else + { + q = coord(elements_by_pos[nelements_by_pos-1].element, dir, point); + } + break; + } + return q; +} + +/*! + * Align(X, [Lefts/Rights/Centers/Marks, [First/Last/Crosshair/Average[, Gridless]]])\n + * Align(Y, [Tops/Bottoms/Centers/Marks, [First/Last/Crosshair/Average[, Gridless]]]) + * + * X or Y - Select which axis will move, other is untouched. \n + * Lefts, Rights, \n + * Tops, Bottoms, \n + * Centers, Marks - Pick alignment point within each element. \n + * First, Last, \n + * Crosshair, \n + * Average - Alignment reference, First=Topmost/Leftmost, \n + * Last=Bottommost/Rightmost, Average or Crosshair point \n + * Gridless - Do not force results to align to prevailing grid. \n + * + * Defaults are Marks, First. + */ +static int +align (int argc, char **argv, Coord x, Coord y) +{ + int dir; + int point; + int reference; + int gridless; + Coord q; + int changed = 0; + + if (argc < 1 || argc > 4) + { + AFAIL (align); + } + /* parse direction arg */ + switch ((dir = keyword(ARG(0)))) + { + case K_X: + case K_Y: + break; + default: + AFAIL (align); + } + /* parse point (within each element) which will be aligned */ + switch ((point = keyword(ARG(1)))) + { + case K_Centers: + case K_Marks: + break; + case K_Lefts: + case K_Rights: + if (dir == K_Y) + { + AFAIL (align); + } + break; + case K_Tops: + case K_Bottoms: + if (dir == K_X) + { + AFAIL (align); + } + break; + case K_none: + point = K_Marks; /* default value */ + break; + default: + AFAIL (align); + } + /* parse reference which will determine alignment coordinates */ + switch ((reference = keyword(ARG(2)))) + { + case K_First: + case K_Last: + case K_Average: + case K_Crosshair: + break; + case K_none: + reference = K_First; /* default value */ + break; + default: + AFAIL (align); + } + /* optionally work off the grid (solar cells!) */ + switch (keyword(ARG(3))) + { + case K_Gridless: + gridless = 1; + break; + case K_none: + gridless = 0; + break; + default: + AFAIL (align); + } + /* find the final alignment coordinate using the above options */ + q = reference_coord(K_align, Crosshair.X, Crosshair.Y, dir, point, reference); + /* move all selected elements to the new coordinate */ + ELEMENT_LOOP (PCB->Data); + { + Coord p, dp, dx, dy; + + if (!TEST_FLAG (SELECTEDFLAG, element)) + continue; + /* find delta from reference point to reference point */ + p = coord(element, dir, point); + dp = q - p; + /* ...but if we're gridful, keep the mark on the grid */ + if (!gridless) + { + dp -= (coord(element, dir, K_Marks) + dp) % (long) (PCB->Grid); + } + if (dp) + { + /* move from generic to X or Y */ + dx = dy = dp; + if (dir == K_X) + dy = 0; + else + dx = 0; + MoveElementLowLevel (PCB->Data, element, dx, dy); + AddObjectToMoveUndoList (ELEMENT_TYPE, NULL, NULL, element, dx, dy); + changed = 1; + } + } + END_LOOP; + if (changed) + { + IncrementUndoSerialNumber (); + Redraw (); + SetChangedFlag (1); + } + free_elements_by_pos (); + return 0; +} + +/*! + * Distribute(X, [Lefts/Rights/Centers/Marks/Gaps, [First/Last/Crosshair, First/Last/Crosshair[, Gridless]]]) \n + * Distribute(Y, [Tops/Bottoms/Centers/Marks/Gaps, [First/Last/Crosshair, First/Last/Crosshair[, Gridless]]]) \n + * \n + * As with align, plus: \n + * \n + * Gaps - Make gaps even rather than spreading points evenly. \n + * First, Last, \n + * Crosshair - Two arguments specifying both ends of the distribution, + * they can't both be the same. \n + * \n + * Defaults are Marks, First, Last \n + * \n + * Distributed elements always retain the same relative order they had + * before they were distributed. \n + */ +static int +distribute (int argc, char **argv, Coord x, Coord y) +{ + int dir; + int point; + int refa, refb; + int gridless; + Coord s, e, slack; + int divisor; + int changed = 0; + int i; + + if (argc < 1 || argc == 3 || argc > 4) + { + AFAIL (distribute); + } + /* parse direction arg */ + switch ((dir = keyword(ARG(0)))) + { + case K_X: + case K_Y: + break; + default: + AFAIL(distribute); + } + /* parse point (within each element) which will be distributed */ + switch ((point = keyword(ARG(1)))) + { + case K_Centers: + case K_Marks: + case K_Gaps: + break; + case K_Lefts: + case K_Rights: + if (dir == K_Y) + { + AFAIL (distribute); + } + break; + case K_Tops: + case K_Bottoms: + if (dir == K_X) + { + AFAIL (distribute); + } + break; + case K_none: + point = K_Marks; /* default value */ + break; + default: + AFAIL (distribute); + } + /* parse reference which will determine first distribution coordinate */ + switch ((refa = keyword(ARG(2)))) + { + case K_First: + case K_Last: + case K_Average: + case K_Crosshair: + break; + case K_none: + refa = K_First; /* default value */ + break; + default: + AFAIL (distribute); + } + /* parse reference which will determine final distribution coordinate */ + switch ((refb = keyword(ARG(3)))) + { + case K_First: + case K_Last: + case K_Average: + case K_Crosshair: + break; + case K_none: + refb = K_Last; /* default value */ + break; + default: + AFAIL (distribute); + } + if (refa == refb) + { + AFAIL (distribute); + } + /* optionally work off the grid (solar cells!) */ + switch (keyword(ARG(4))) + { + case K_Gridless: + gridless = 1; + break; + case K_none: + gridless = 0; + break; + default: + AFAIL (distribute); + } + /* build list of elements in orthogonal axis order */ + sort_elements_by_pos (K_distribute, dir, point); + /* find the endpoints given the above options */ + s = reference_coord (K_distribute, x, y, dir, point, refa); + e = reference_coord (K_distribute, x, y, dir, point, refb); + slack = e - s; + /* use this divisor to calculate spacing (for 1 elt, avoid 1/0) */ + divisor = (nelements_by_pos > 1) ? (nelements_by_pos - 1) : 1; + /* even the gaps instead of the edges or whatnot */ + /* find the "slack" in the row */ + if (point == K_Gaps) + { + Coord w; + + /* subtract all the "widths" from the slack */ + for (i = 0; i < nelements_by_pos; ++i) + { + ElementType *element = elements_by_pos[i].element; + /* coord doesn't care if I mix Lefts/Tops */ + w = elements_by_pos[i].width = + coord (element, dir, K_Rights) - + coord (element, dir, K_Lefts); + /* Gaps distribution is on centers, so half of + * first and last element don't count */ + if (i == 0 || i == nelements_by_pos - 1) + { + w /= 2; + } + slack -= w; + } + /* slack could be negative */ + } + /* move all selected elements to the new coordinate */ + for (i = 0; i < nelements_by_pos; ++i) + { + ElementType *element = elements_by_pos[i].element; + Coord p, q, dp, dx, dy; + + /* find reference point for this element */ + q = s + slack * i / divisor; + /* find delta from reference point to reference point */ + p = coord (element, dir, point); + dp = q - p; + /* ...but if we're gridful, keep the mark on the grid */ + if (! gridless) + { + dp -= (coord (element, dir, K_Marks) + dp) % (long) (PCB->Grid); + } + if (dp) + { + /* move from generic to X or Y */ + dx = dy = dp; + if (dir == K_X) + dy = 0; + else + dx = 0; + MoveElementLowLevel (PCB->Data, element, dx, dy); + AddObjectToMoveUndoList (ELEMENT_TYPE, NULL, NULL, element, dx, dy); + changed = 1; + } + /* in gaps mode, accumulate part widths */ + if (point == K_Gaps) + { + /* move remaining half of our element */ + s += elements_by_pos[i].width / 2; + /* move half of next element */ + if (i < nelements_by_pos - 1) + s += elements_by_pos[i + 1].width / 2; + } + } + if (changed) + { + IncrementUndoSerialNumber (); + Redraw(); + SetChangedFlag(1); + } + free_elements_by_pos (); + return 0; +} + +static HID_Action distalign_action_list[] = +{ + {"distribute", NULL, distribute, "Distribute Elements", distribute_syntax}, + {"align", NULL, align, "Align Elements", align_syntax} +}; + +REGISTER_ACTIONS (distalign_action_list) + +void +hid_distalign_init () +{ + register_distalign_action_list (); +} Index: pcb-plugins_sources/src/plugins/distaligntext.c =================================================================== --- pcb-plugins_sources/src/plugins/distaligntext.c (nonexistent) +++ pcb-plugins_sources/src/plugins/distaligntext.c (revision 3870) @@ -0,0 +1,674 @@ +/*! + * \file distaligntext.c + * + * \brief distaligntext plug-in for PCB. + * + * \author Copyright (C) 2012 Dan White + * Functions to distribute (evenly spread out) and align PCB text. + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * Substantially from distalign.c + * Copyright (C) 2007 Ben Jackson + * + * Modifications and internal differences are significant enough warrant + * a new related plugin. + */ + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "create.h" +#include "rtree.h" +#include "undo.h" +#include "rats.h" +#include "error.h" +#include "move.h" +#include "draw.h" +#include "set.h" + +#define ARG(n) (argc > (n) ? argv[n] : 0) + +static const char aligntext_syntax[] = "AlignText(X/Y, [Lefts/Rights/Tops/Bottoms/Centers, [First/Last/Crosshair/Average[, Gridless]]])"; + +static const char distributetext_syntax[] = "DistributeText(Y, [Lefts/Rights/Tops/Bottoms/Centers/Gaps, [First/Last/Crosshair, First/Last/Crosshair[, Gridless]]])"; + +enum +{ + K_X, + K_Y, + K_Lefts, + K_Rights, + K_Tops, + K_Bottoms, + K_Centers, + K_Gaps, + K_First, + K_Last, + K_Average, + K_Crosshair, + K_Gridless, + K_none, + K_aligntext, + K_distributetext +}; + +static const char *keywords[] = +{ + [K_X] "X", + [K_Y] "Y", + [K_Lefts] "Lefts", + [K_Rights] "Rights", + [K_Tops] "Tops", + [K_Bottoms] "Bottoms", + [K_Centers] "Centers", + [K_Gaps] "Gaps", + [K_First] "First", + [K_Last] "Last", + [K_Average] "Average", + [K_Crosshair] "Crosshair", + [K_Gridless] "Gridless", +}; + +static int +keyword(const char *s) +{ + int i; + + if (! s) + { + return K_none; + } + for (i = 0; i < ENTRIES(keywords); ++i) + { + if (keywords[i] && strcasecmp(s, keywords[i]) == 0) + return i; + } + return -1; +} + + +/* this macro produces a function in X or Y that switches on 'point' */ +#define COORD(DIR) \ +static inline Coord \ +coord ## DIR(TextType *text, int point) \ +{ \ + switch (point) { \ + case K_Lefts: \ + case K_Tops: \ + return text->BoundingBox.DIR ## 1; \ + case K_Rights: \ + case K_Bottoms: \ + return text->BoundingBox.DIR ## 2; \ + case K_Centers: \ + case K_Gaps: \ + return (text->BoundingBox.DIR ## 1 + \ + text->BoundingBox.DIR ## 2) / 2; \ + } \ + return 0; \ +} + +COORD(X) +COORD(Y) + +/*! + * Return the text coordinate associated with the given internal point. + */ +static Coord +coord (TextType *text, int dir, int point) +{ + if (dir == K_X) + return coordX (text, point); + else + return coordY (text, point); +} + +static struct text_by_pos +{ + TextType *text; + Coord pos; + Coord width; + int type; +} *texts_by_pos; + +static int ntexts_by_pos; + +static int +cmp_tbp (const void *a, const void *b) +{ + const struct text_by_pos *ta = a; + const struct text_by_pos *tb = b; + + return ta->pos - tb->pos; +} + +/*! + * Find all selected text objects, then order them in order by coordinate in + * the 'dir' axis. This is used to find the "First" and "Last" elements + * and also to choose the distribution order. + * + * For alignment, first and last are in the orthogonal axis (imagine if + * you were lining up letters in a sentence, aligning *vertically* to the + * first letter means selecting the first letter *horizontally*). + * + * For distribution, first and last are in the distribution axis. + */ +static int +sort_texts_by_pos (int op, int dir, int point) +{ + int nsel = 0; + + if (ntexts_by_pos) + return ntexts_by_pos; + if (op == K_aligntext) + dir = dir == K_X ? K_Y : K_X; /* see above */ + ELEMENT_LOOP (PCB->Data); + { + TextType *text; + text = &(element)->Name[NAME_INDEX(PCB)]; + if (!TEST_FLAG (SELECTEDFLAG, text)) + continue; + nsel++; + } + END_LOOP; + ALLTEXT_LOOP (PCB->Data); + { + if (!TEST_FLAG (SELECTEDFLAG, text)) + continue; + nsel++; + } + ENDALL_LOOP; + if (! nsel) + return 0; + texts_by_pos = malloc (nsel * sizeof (*texts_by_pos)); + ntexts_by_pos = nsel; + nsel = 0; + ELEMENT_LOOP(PCB->Data); + { + TextType *text; + text = &(element)->Name[NAME_INDEX(PCB)]; + if (!TEST_FLAG (SELECTEDFLAG, text)) + continue; + texts_by_pos[nsel].text = text; + texts_by_pos[nsel].type = ELEMENTNAME_TYPE; + texts_by_pos[nsel++].pos = coord(text, dir, point); + } + END_LOOP; + ALLTEXT_LOOP (PCB->Data); + { + if (!TEST_FLAG (SELECTEDFLAG, text)) + continue; + texts_by_pos[nsel].text = text; + texts_by_pos[nsel].type = TEXT_TYPE; + texts_by_pos[nsel++].pos = coord(text, dir, point); + } + ENDALL_LOOP; + qsort (texts_by_pos, ntexts_by_pos, sizeof (*texts_by_pos), cmp_tbp); + return ntexts_by_pos; +} + +static void +free_texts_by_pos (void) +{ + if (ntexts_by_pos) + { + free (texts_by_pos); + texts_by_pos = NULL; + ntexts_by_pos = 0; + } +} + + +/*! + * Find the reference coordinate from the specified points of all + * selected text. + */ +static Coord +reference_coord (int op, int x, int y, int dir, int point, int reference) +{ + Coord q; + int i, nsel; + + q = 0; + switch (reference) + { + case K_Crosshair: + if (dir == K_X) + q = x; + else + q = y; + break; + case K_Average: /* the average among selected text */ + nsel = ntexts_by_pos; + for (i = 0; i < ntexts_by_pos; ++i) + { + q += coord (texts_by_pos[i].text, dir, point); + } + if (nsel) + q /= nsel; + break; + case K_First: /* first or last in the orthogonal direction */ + case K_Last: + if (! sort_texts_by_pos (op, dir, point)) + { + q = 0; + break; + } + if (reference == K_First) + { + q = coord (texts_by_pos[0].text, dir, point); + } + else + { + q = coord (texts_by_pos[ntexts_by_pos-1].text, dir, point); + } + break; + } + return q; +} + + +/*! + * AlignText(X, [Lefts/Rights/Centers, [First/Last/Crosshair/Average[, Gridless]]])\n + * AlignText(Y, [Tops/Bottoms/Centers, [First/Last/Crosshair/Average[, Gridless]]]) + * + * X or Y - Select which axis will move, other is untouched. \n + * Lefts, Rights, \n + * Tops, Bottoms, \n + * Centers - Pick alignment point within each element. \n + * NB: text objects have no Mark. \n + * First, Last, \n + * Crosshair, \n + * Average - Alignment reference, First=Topmost/Leftmost, \n + * Last=Bottommost/Rightmost, Average or Crosshair point \n + * Gridless - Do not force results to align to prevailing grid. \n + * + * Defaults are Lefts/Tops, First + */ +static int +aligntext (int argc, char **argv, Coord x, Coord y) +{ + int dir; + int point; + int reference; + int gridless; + Coord q; + Coord p, dp, dx, dy; + int changed = 0; + + if (argc < 1 || argc > 4) + { + AFAIL (aligntext); + } + /* parse direction arg */ + switch ((dir = keyword(ARG(0)))) + { + case K_X: + case K_Y: + break; + default: + AFAIL (aligntext); + } + /* parse point (within each element) which will be aligned */ + switch ((point = keyword(ARG(1)))) + { + case K_Centers: + break; + case K_Lefts: + case K_Rights: + if (dir == K_Y) + { + AFAIL (aligntext); + } + break; + case K_Tops: + case K_Bottoms: + if (dir == K_X) + { + AFAIL (aligntext); + } + break; + case K_none: /* default value */ + if (dir == K_X) + { + point = K_Lefts; + } + else + { + point = K_Tops; + } + break; + default: + AFAIL (aligntext); + } + /* parse reference which will determine alignment coordinates */ + switch ((reference = keyword(ARG(2)))) + { + case K_First: + case K_Last: + case K_Average: + case K_Crosshair: + break; + case K_none: + reference = K_First; /* default value */ + break; + default: + AFAIL (aligntext); + } + /* optionally work off the grid (solar cells!) */ + switch (keyword(ARG(3))) + { + case K_Gridless: + gridless = 1; + break; + case K_none: + gridless = 0; + break; + default: + AFAIL (aligntext); + } + SaveUndoSerialNumber(); + /* find the final alignment coordinate using the above options */ + q = reference_coord (K_aligntext, Crosshair.X, Crosshair.Y, dir, point, reference); + /* move all selected elements to the new coordinate */ + /* selected text part of an element */ + ELEMENT_LOOP (PCB->Data); + { + TextType *text; + text = &(element)->Name[NAME_INDEX (PCB)]; + if (!TEST_FLAG (SELECTEDFLAG, text)) + continue; + /* find delta from reference point to reference point */ + p = coord (text, dir, point); + dp = q - p; + /* ...but if we're gridful, keep the mark on the grid */ + /* TODO re-enable for text, need textcoord() + if (!gridless) + { + dp -= (coord (text, dir, K_Marks) + dp) % (long) (PCB->Grid); + } + */ + if (dp) + { + /* move from generic to X or Y */ + dx = dy = dp; + if (dir == K_X) + dy = 0; + else + dx = 0; + MoveObject (ELEMENTNAME_TYPE, element, text, text, dx, dy); + changed = 1; + } + } + END_LOOP; + /* Selected bare text objects */ + ALLTEXT_LOOP (PCB->Data); + { + if (TEST_FLAG (SELECTEDFLAG, text)) + { + /* find delta from reference point to reference point */ + p = coord (text, dir, point); + dp = q - p; + /* ...but if we're gridful, keep the mark on the grid */ + /* TODO re-enable for text, need textcoord() + if (!gridless) + { + dp -= (coord (text, dir, K_Marks) + dp) % (long) (PCB->Grid); + } + */ + if (dp) + { + /* move from generic to X or Y */ + dx = dy = dp; + if (dir == K_X) + dy = 0; + else + dx = 0; + MoveObject (TEXT_TYPE, layer, text, text, dx, dy); + changed = 1; + } + } + } + ENDALL_LOOP; + if (changed) + { + RestoreUndoSerialNumber (); + IncrementUndoSerialNumber (); + Redraw (); + SetChangedFlag (true); + } + free_texts_by_pos (); + return 0; +} + +/*! + * DistributeText(X, [Lefts/Rights/Centers/Gaps, [First/Last/Crosshair, First/Last/Crosshair[, Gridless]]]) \n + * DistributeText(Y, [Tops/Bottoms/Centers/Gaps, [First/Last/Crosshair, First/Last/Crosshair[, Gridless]]]) \n + * \n + * As with align, plus: \n + * \n + * Gaps - Make gaps even rather than spreading points evenly. \n + * First, Last, \n + * Crosshair - Two arguments specifying both ends of the distribution, + * they can't both be the same. \n + * \n + * Defaults are Lefts/Tops, First, Last \n + * \n + * Distributed texts always retain the same relative order they had + * before they were distributed. \n + */ +static int +distributetext(int argc, char **argv, Coord x, Coord y) +{ + int dir; + int point; + int refa, refb; + int gridless; + Coord s, e, slack; + int divisor; + int changed = 0; + int i; + + if (argc < 1 || argc == 3 || argc > 4) + { + AFAIL (distributetext); + } + /* parse direction arg */ + switch ((dir = keyword(ARG(0)))) + { + case K_X: + case K_Y: + break; + default: + AFAIL (distributetext); + } + /* parse point (within each element) which will be distributed */ + switch ((point = keyword(ARG(1)))) + { + case K_Centers: + case K_Gaps: + break; + case K_Lefts: + case K_Rights: + if (dir == K_Y) + { + AFAIL (distributetext); + } + break; + case K_Tops: + case K_Bottoms: + if (dir == K_X) + { + AFAIL (distributetext); + } + break; + case K_none: /* default value */ + if (dir == K_X) + { + point = K_Lefts; + } + else + { + point = K_Tops; + } + break; + default: + AFAIL (distributetext); + } + /* parse reference which will determine first distribution coordinate */ + switch ((refa = keyword(ARG(2)))) + { + case K_First: + case K_Last: + case K_Average: + case K_Crosshair: + break; + case K_none: + refa = K_First; /* default value */ + break; + default: + AFAIL (distributetext); + } + /* parse reference which will determine final distribution coordinate */ + switch ((refb = keyword(ARG(3)))) + { + case K_First: + case K_Last: + case K_Average: + case K_Crosshair: + break; + case K_none: + refb = K_Last; /* default value */ + break; + default: + AFAIL (distributetext); + } + if (refa == refb) + { + AFAIL (distributetext); + } + /* optionally work off the grid (solar cells!) */ + switch (keyword(ARG(4))) + { + case K_Gridless: + gridless = 1; + break; + case K_none: + gridless = 0; + break; + default: + AFAIL (distributetext); + } + SaveUndoSerialNumber (); + /* build list of texts in orthogonal axis order */ + sort_texts_by_pos (K_distributetext, dir, point); + /* find the endpoints given the above options */ + s = reference_coord (K_distributetext, x, y, dir, point, refa); + e = reference_coord (K_distributetext, x, y, dir, point, refb); + slack = e - s; + /* use this divisor to calculate spacing (for 1 elt, avoid 1/0) */ + divisor = (ntexts_by_pos > 1) ? (ntexts_by_pos - 1) : 1; + /* even the gaps instead of the edges or whatnot */ + /* find the "slack" in the row */ + if (point == K_Gaps) + { + Coord w; + + /* subtract all the "widths" from the slack */ + for (i = 0; i < ntexts_by_pos; ++i) + { + TextType *text = texts_by_pos[i].text; + + /* coord doesn't care if I mix Lefts/Tops */ + w = texts_by_pos[i].width = + coord (text, dir, K_Rights) - + coord (text, dir, K_Lefts); + /* Gaps distribution is on centers, so half of + * first and last text don't count */ + if (i == 0 || i == ntexts_by_pos - 1) + { + w /= 2; + } + slack -= w; + } + /* slack could be negative */ + } + /* move all selected texts to the new coordinate */ + for (i = 0; i < ntexts_by_pos; ++i) + { + TextType *text = texts_by_pos[i].text; + int type = texts_by_pos[i].type; + Coord p, q, dp, dx, dy; + + /* find reference point for this text */ + q = s + slack * i / divisor; + /* find delta from reference point to reference point */ + p = coord (text, dir, point); + dp = q - p; + /* ...but if we're gridful, keep the mark on the grid */ + /* TODO re-enable grid + if (! gridless) + { + dp -= (coord (text, dir, K_Marks) + dp) % (long) (PCB->Grid); + } + */ + if (dp) + { + /* move from generic to X or Y */ + dx = dy = dp; + if (dir == K_X) + dy = 0; + else + dx = 0; + /* need to know if the text is part of an element, + * all are TEXT_TYPE, but text associated with an + * element is also ELEMENTNAME_TYPE. For undo, this is + * significant in search.c: SearchObjectByID. + * + * MoveObject() is better as in aligntext(), but we + * didn't keep the element reference when sorting. + */ + MOVE_TEXT_LOWLEVEL (text, dx, dy); + AddObjectToMoveUndoList (type, NULL, NULL, text, dx, dy); + changed = 1; + } + /* in gaps mode, accumulate part widths */ + if (point == K_Gaps) + { + /* move remaining half of our text */ + s += texts_by_pos[i].width / 2; + /* move half of next text */ + if (i < ntexts_by_pos - 1) + s += texts_by_pos[i + 1].width / 2; + } + } + if (changed) + { + RestoreUndoSerialNumber (); + IncrementUndoSerialNumber (); + Redraw (); + SetChangedFlag (true); + } + free_texts_by_pos (); + return 0; +} + +static HID_Action distaligntext_action_list[] = +{ + {"distributetext", NULL, distributetext, "Distribute Text Elements", distributetext_syntax}, + {"aligntext", NULL, aligntext, "Align Text Elements", aligntext_syntax} +}; + +REGISTER_ACTIONS (distaligntext_action_list) + +void +hid_distaligntext_init () +{ + register_distaligntext_action_list (); +} Index: pcb-plugins_sources/src/plugins/elementupdate.c =================================================================== --- pcb-plugins_sources/src/plugins/elementupdate.c (nonexistent) +++ pcb-plugins_sources/src/plugins/elementupdate.c (revision 3870) @@ -0,0 +1,252 @@ +/*! + * \file elementupdate.c + * + * \brief elementupdate plug-in for PCB + * + * \author Copyright (C) 2012 Dan White + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * Updates selected/all elements from disk. + * + * ElementUpdate(Selected|All) + * + * Action will attempt to update the selected packages to use the + * footprint in the currently-loaded Library instead of from the .pcb + * file. + * + * Assumes the footprint name (newlib filename) to load is contained in + * the current element's "Desc" field (internally as: + * DESCRIPTION_NAME(element)). + * + * The new footprint's mark is placed at the same location and in the + * same orientation as the old footprint. + * + * The element's name, refdes, and value are preserved. + * + * NO OTHER CHECKING is done (e.g. number of pins). + * + * Reports and does not touch missing footprints. + * + */ + +#include + +#include "config.h" +#include "global.h" + +#include "buffer.h" +#include "change.h" +#include "copy.h" +#include "create.h" +#include "data.h" +#include "error.h" +#include "mirror.h" +#include "misc.h" +#include "move.h" +#include "remove.h" +#include "rotate.h" +#include "select.h" +#include "set.h" +#include "undo.h" + +#define ARG(n) (argc > (n) ? argv[n] : 0) + +enum +{ + F_none, + F_All, + F_Selected, +}; + +static const char *functions[] = +{ + [F_All] "All", + [F_Selected] "Selected", +}; + +static int +GetFunctionID(const char *s) +{ + int i; + + if (! s) + return F_none; + for (i = 0; i < ENTRIES(functions); ++i) + if (functions[i] && strcasecmp(s, functions[i]) == 0) + return i; + return F_none; +} + +/* ---------------------------------------------------------------- */ +static const char elementupdate_syntax[] = "ElementUpdate(Selected|All)"; + +static const char elementupdate_help[] = "Reloads the indicated element packages."; + +/* %start-doc actions ElementUpdate + +@table @code + +@item Selected +Only updates the footprint of the selected elements from the currently-loaded +library. + +@item All +Reloads from the currently-loaded library the packages of all elements in the +layout. + +@end table + +Extracts the footprint name to load from the element's @code{Desc} field. +Preserves the old element's Desc, Name, and Value fields. + +%end-doc */ + +static int update_footprints_not_found; + +static int +ActionElementUpdate (int argc, char **argv, Coord x, Coord y) +{ + char *function = NULL; + int fnid; + int er, pr; + ElementType *pe = NULL; + Coord mx, my; + int i; + char *old; + + function = ARG (0); + update_footprints_not_found = 0; +#ifdef DEBUG + printf ("Entered ActionElementUpdate, executing function %s\n", function); +#endif + if (function) + { + fnid = GetFunctionID (function); + if (!(fnid == F_All || fnid == F_Selected)) + AFAIL (elementupdate); + } + else + { + AFAIL (elementupdate); + } + /* make sure to re-read footprints from disk */ + /* to enable this, add the following to buffer.h: + * void clear_footprint_hash (void); + * and un-comment below */ + /* clear_footprint_hash ();*/ + /* Select all elements for All mode */ + if (fnid == F_All) + SelectObjectByName (ELEMENT_TYPE, ".*", true); + /* Flag all original elements, we are adding more but don't want to process + * the new ones*/ + ELEMENT_LOOP (PCB->Data); + { + SET_FLAG (VISITFLAG, element); + } + END_LOOP; + ELEMENT_LOOP (PCB->Data); + { + /* All elements (from here on ??) were added in previous iterations of this + * loop; we are done. */ + if (!TEST_FLAG(VISITFLAG, element)) + break; + /* Only touch selected elements. */ + if (!TEST_FLAG (SELECTEDFLAG, element)) + continue; + /* no element name, it's likely not something we wish to change skip */ + if (EMPTY_STRING_P (NAMEONPCB_NAME (element))) + continue; + if (EMPTY_STRING_P (DESCRIPTION_NAME (element))) + { + Message (_("Skipping refdes %s, no footprint name\n"), NAMEONPCB_NAME (element)); + continue; + } + if (EMPTY_STRING_P (VALUE_NAME (element))) + { + Message (_("For refdes %s, no value\n"), NAMEONPCB_NAME (element)); + } + /* to get here, this is a footprint element (??) */ + /* do not touch element if not in current library */ + if (LoadFootprint(1, &DESCRIPTION_NAME(element), x, y)) + { + update_footprints_not_found ++; + Message (_("Footprint not found: %s\n"), DESCRIPTION_NAME(element)); + continue; + } + /* all good, now update the package */ + Message (_("Updating footprint for (%s, %s, %s).\n"), + NAMEONPCB_NAME(element), + VALUE_NAME(element), + DESCRIPTION_NAME(element) + ); + /* in the method of ElementList(Need,...) */ + pe = PASTEBUFFER->Data->Element->data; + if (!FRONT (element)) + MirrorElementCoordinates (PASTEBUFFER->Data, pe, pe->MarkY*2 - PCB->MaxHeight); + er = ElementOrientation (element); + pr = ElementOrientation (pe); + if (er != pr) + RotateElementLowLevel (PASTEBUFFER->Data, pe, pe->MarkX, pe->MarkY, (er-pr+4)%4); + /* move element parts to their previous locations */ + mx = element->MarkX; + my = element->MarkY; + for (i=0; iName[i].X = element->Name[i].X - mx + pe->MarkX ; + pe->Name[i].Y = element->Name[i].Y - my + pe->MarkY ; + pe->Name[i].Direction = element->Name[i].Direction; + pe->Name[i].Scale = element->Name[i].Scale; + } + /* preserve attributes */ + for (i=0; iAttributes.Number; i++) + { + CreateNewAttribute (& pe->Attributes, + element->Attributes.List[i].name, + element->Attributes.List[i].value); + } + /* preserve name, refdes, and value */ + old = ChangeElementText (PCB, PASTEBUFFER->Data, pe, + DESCRIPTION_INDEX, strdup (DESCRIPTION_NAME(element))); + if (old) + free (old); + old = ChangeElementText (PCB, PASTEBUFFER->Data, pe, + NAMEONPCB_INDEX, strdup (NAMEONPCB_NAME(element))); + if (old) + free (old); + old = ChangeElementText (PCB, PASTEBUFFER->Data, pe, VALUE_INDEX, + strdup (VALUE_NAME(element))); + if (old) + free (old); + /* who needs old data? */ + RemoveElement (element); + /* place in layout */ + if (CopyPastebufferToLayout (mx, my)) + SetChangedFlag (true); + } + END_LOOP; + if (update_footprints_not_found > 0) + { + gui->confirm_dialog (_("Not all requested footprints were found.\n" + "See the message log for details"), 0); + } +#ifdef DEBUG + printf (" ... Leaving ActionElementUpdate.\n"); +#endif + return 0; +} + + +static HID_Action elementupdate_action_list[] = +{ + {"ElementUpdate", 0, ActionElementUpdate, elementupdate_help, elementupdate_syntax} +}; + +REGISTER_ACTIONS (elementupdate_action_list) + +void +hid_elementupdate_init () +{ + register_elementupdate_action_list (); +} Index: pcb-plugins_sources/src/plugins/findelement.c =================================================================== --- pcb-plugins_sources/src/plugins/findelement.c (nonexistent) +++ pcb-plugins_sources/src/plugins/findelement.c (revision 3870) @@ -0,0 +1,114 @@ +/*! + * \file findelement.c + * + * \author Copyright (C) 2009 .. 2011 by Bert Timmerman + * with some usefull hints from DJ Delorie to finish this plug-in. + * + * \brief Plug-in for PCB to find the specified element. + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * Function to look up the specified PCB element on the screen.\n + * \n + * Compile like this:\n + * \n + * gcc -Ipath/to/pcb/src -Ipath/to/pcb -O2 -shared findelement.c -o findelement.so + * \n\n + * The resulting findelement.so file should go in $HOME/.pcb/plugins/\n + * \n + * \warning Be very strict in compiling this plug-in against the exact pcb + * sources you compiled/installed the pcb executable (i.e. src/pcb) with.\n + * + * Usage: FindElement(Refdes)\n + * Usage: FE(Refdes)\n + * If no argument is passed, no action is carried out.\n + * \n + * FE is a shortcut for lazy users ;-). + *
+ * This program is free software; you can redistribute it and/or modify\n + * it under the terms of the GNU General Public License as published by\n + * the Free Software Foundation; either version 2 of the License, or\n + * (at your option) any later version.\n + * \n + * This program is distributed in the hope that it will be useful,\n + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details.\n + * \n + * You should have received a copy of the GNU General Public License\n + * along with this program; if not, write to:\n + * the Free Software Foundation, Inc.,\n + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n + */ + + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "create.h" +#include "rtree.h" +#include "undo.h" +#include "set.h" +#include "error.h" + +/*! + * \brief Find the specified element. + * + * Usage: FindElement(Refdes)\n + * If no argument is passed, no action is carried out. + */ +static int +find_element (int argc, char **argv, Coord x, Coord y) +{ + if (argc == 0 || strcasecmp (argv[0], "") == 0) + { + Message ("WARNING: in FindElement the argument should be a non-empty string value.\n"); + return 0; + } + else + { + SET_FLAG (NAMEONPCBFLAG, PCB); + ELEMENT_LOOP(PCB->Data); + { + if (NAMEONPCB_NAME(element) + && strcmp (argv[0], NAMEONPCB_NAME(element)) == 0) + { + gui->set_crosshair + ( + element->MarkX, + element->MarkY, + HID_SC_PAN_VIEWPORT + ); + } + } + END_LOOP; + gui->invalidate_all (); + IncrementUndoSerialNumber (); + return 0; + }; +} + + +static HID_Action findelement_action_list[] = +{ + {"FindElement", NULL, find_element, "Find the specified element", NULL}, + {"FE", NULL, find_element, "Find the specified element", NULL} +}; + + +REGISTER_ACTIONS (findelement_action_list) + + +void +pcb_plugin_init () +{ + register_findelement_action_list (); +} + +/* EOF */ Index: pcb-plugins_sources/src/plugins/findrat.c =================================================================== --- pcb-plugins_sources/src/plugins/findrat.c (nonexistent) +++ pcb-plugins_sources/src/plugins/findrat.c (revision 3870) @@ -0,0 +1,60 @@ +/*! + * \file findrat.c + * + * \brief FindRat plug-in for PCB. + * + * \author Copyright (C) 2008 DJ Delorie + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * Compile like this: + *
+gcc -I$HOME/geda/pcb-cvs/src -I$HOME/geda/pcb-cvs -O2 -shared findrat.c -o findrat.so
+ * 
+ * + * The resulting findrat.so goes in $HOME/.pcb/plugins/findrat.so. + * + * Usage: FindRat() + * + * The cursor scrolls to one of the rats on the board. + * + * http://www.delorie.com/pcb/findrat.c + */ + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "error.h" + +static int +findrat (int argc, char **argv, Coord x, Coord y) +{ + RatType *r; + + if (PCB->Data->RatN == 0) + { + Message("No Rats"); + return 0; + } + r = & (PCB->Data->Rat[0]); + gui->set_crosshair (r->Point1.X, r->Point1.Y, HID_SC_PAN_VIEWPORT); + return 0; +} + +static HID_Action findrat_action_list[] = +{ + {"FindRat", NULL, findrat, NULL, NULL} +}; + +REGISTER_ACTIONS (findrat_action_list) + +void +pcb_plugin_init () +{ + register_findrat_action_list (); +} Index: pcb-plugins_sources/src/plugins/footprint-update/COPYING =================================================================== --- pcb-plugins_sources/src/plugins/footprint-update/COPYING (nonexistent) +++ pcb-plugins_sources/src/plugins/footprint-update/COPYING (revision 3870) @@ -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 +. Index: pcb-plugins_sources/src/plugins/footprint-update/Makefile =================================================================== --- pcb-plugins_sources/src/plugins/footprint-update/Makefile (nonexistent) +++ pcb-plugins_sources/src/plugins/footprint-update/Makefile (revision 3870) @@ -0,0 +1,77 @@ +# +# Makefile +# +# Copyright 2008 Dean Ferreyra , All rights reserved +# +# This file is part of Footprint-Update. +# +# Footprint-Update 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. +# +# Footprint-Update 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 Footprint-Update. If not, see . +# +# $Id: Makefile,v 1.12 2008-05-25 00:16:06 dean Exp $ + +# Location of PCB source tree +PCB_CVS_DIR=../../../../pcb + +# Installation location of PCB plug-ins +INSTALL_DIR=~/.pcb/plugins + +#MY_VERSION=1.01 + +# DEBUG_FLAGS=-DDEBUG=1 +CFLAGS=-Wall -O2 -shared `pkg-config --cflags glib-2.0` +# -Werror -fPIC $(DEBUG_FLAGS) -DVERSION='"$(VERSION)"' + +all: footprintupdate.so + +%.o: %.c + $(CC) $(CFLAGS) -I$(PCB_CVS_DIR)/src -I$(PCB_CVS_DIR) -c $< -o $@ + +footprintupdate.so: footprintupdate.o utilities.o matrix.o pad-pin-data.o + $(CC) $(CFLAGS) -I$(PCB_CVS_DIR)/src -I$(PCB_CVS_DIR) $+ -o $@ + +footprintupdate.o: footprintupdate.c pad-pin-data.h utilities.h +pad-pin-data.o: pad-pin-data.c pad-pin-data.h matrix.h utilities.h +matrix.o: matrix.c matrix.h utilities.h +utilities.o: utilities.c utilities.h + + +.PHONY : install +install: footprintupdate.so + install -m755 -d $(INSTALL_DIR) + install -m755 $+ $(INSTALL_DIR)/ + +.PHONY : clean +clean: + rm -f *.o *.so + +DIST_DIR=footprint-update-$(VERSION) +DIST_FILE=$(DIST_DIR).tar.gz + +.PHONY : dist +dist: + rm -rf $(DIST_FILE) $(DIST_DIR) + mkdir $(DIST_DIR) + cp README \ + COPYING \ + Makefile \ + footprintupdate.c \ + pad-pin-data.[ch] \ + matrix.[ch] \ + utilities.[ch] \ + $(DIST_DIR) + tar -czf $(DIST_FILE) $(DIST_DIR) + +.PHONY : uninstall +uninstall: + rm ~/.pcb/plugins/footprintupdate.so Index: pcb-plugins_sources/src/plugins/footprint-update/README =================================================================== --- pcb-plugins_sources/src/plugins/footprint-update/README (nonexistent) +++ pcb-plugins_sources/src/plugins/footprint-update/README (revision 3870) @@ -0,0 +1,2 @@ +See http://www.bourbonstreetsoftware.com/PCBFootprintUpdatePlugIn.html +for more information. Index: pcb-plugins_sources/src/plugins/footprint-update/footprintupdate.c =================================================================== --- pcb-plugins_sources/src/plugins/footprint-update/footprintupdate.c (nonexistent) +++ pcb-plugins_sources/src/plugins/footprint-update/footprintupdate.c (revision 3870) @@ -0,0 +1,549 @@ +/* + * footprintupdate -- Replaces footprints in layout with updated + * footprints. + * + * Copyright 2008 Dean Ferreyra , All rights reserved + * + * This file is part of Footprint-Update. + * + * Footprint-Update 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. + * + * Footprint-Update 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 Footprint-Update. If not, see . + * + * $Id: footprintupdate.c,v 1.31 2008-05-22 07:57:03 dean Exp $ + */ + +/* + * This PCB plug-in adds the UpdateFootprintsFromBuffer action. It + * allows you to replace existing elements (i.e., footprints) in your + * PCB layout with an updated element that you've loaded into the + * buffer. + * + * Because PCB modifies the elements it places, the plug-in needs to + * make an educated guess about which elements to replace, and how to + * position and orient the replacement elements. It might guess wrong + * or not replace some elements. + * + * WARNING: Make a backup copy of your layout before using this + * plug-in in case something goes wrong! + * + * Usage: + * + * UpdateFootprintsFromBuffer() or UpdateFootprintsFromBuffer(auto) -- + * Uses the description field of the buffer element and tries to + * replace any layout element with a matching description field. + * (In my workflow, the element description in the footprint files + * and in the layout elements is the original footprint file name, + * e.g., "PHOENIX-PT-4-R.fp".) + * + * UpdateFootprintsFromBuffer(auto, selected) -- Like + * UpdateFootprintsFromBuffer(auto) but will only consider selected + * layout elements. + * + * UpdateFootprintsFromBuffer(auto, named, [, ...]) -- + * Like UpdateFootprintsFromBuffer(auto) but will only consider + * elements that match the given element names. For example, + * UpdateFootprintsFromBuffer(auto, named, U101, U103, U105). + * + * UpdateFootprintsFromBuffer(manual) or + * UpdateFootprintsFromBuffer(manual, selected) -- Like the "auto" + * version, but tries to replace the selected layout elements + * regardless of their description field. + * + * UpdateFootprintsFromBuffer(manual, named, [, ...]) -- + * Like the "auto" version, but tries to replace the named layout + * elements regardless of their description field. + * + * Current assumptions and limitations: + * + * * The rotation of the new element is calculated using two + * non-coincident pads or pins from both the buffer element and + * the layout element. For elements consisting entirely of + * coincident pads and pins, the plug-in will only translate the + * replacement element without regard to rotation. + * + * * Element-specific attributes in the layout element, if it has + * any, are replaced with the buffer element's attributes; i.e., + * attributes in the layout element, if it has any, will be lost. + */ + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "error.h" +#include "draw.h" +#include "undo.h" + +#include "utilities.h" +#include "matrix.h" +#include "pad-pin-data.h" + +static int replace_footprints (ElementType *new_element); +static bool replace_one_footprint (ElementType *old_element, ElementType *new_element); +static bool replace_one_footprint_quick (ElementType *old_element, ElementType *new_element); +static bool replace_one_footprint_expensive (ElementType *old_element, ElementType *new_element); +static bool replace_one_footprint_translate_only (ElementType *old_element, ElementType *new_element); +static void replace_one_footprint_aux (ElementType *old_element, PadOrPinType* old1_pp, PadOrPinType* old2_pp, ElementType *new_element, PadOrPinType* new1_pp, PadOrPinType* new2_pp); +static BYTE calculate_rotation_steps (CheapPointType new1_pt, CheapPointType new2_pt, CheapPointType old1_pt, CheapPointType old2_pt); +static void transfer_text (ElementType *old_element, ElementType *new_element); +static void transfer_names (ElementType *old_element, ElementType *new_element); +static void transfer_flags (ElementType *old_element, ElementType* new_element); + +enum { + MATCH_MODE_AUTO, /* Use element description field. */ + MATCH_MODE_MANUAL +} match_mode = MATCH_MODE_AUTO; + +enum { + STYLE_ALL, /* Only valid in auto mode. */ + STYLE_SELECTED, /* Only consider selected elements. */ + STYLE_NAMED /* Only consider elements named in the + arguments. */ +} style = STYLE_ALL; + +/* + * Plug-in housekeeping. + */ + +static int footprint_update (int argc, char **argv, Coord x, Coord y); + +int global_argc = 0; +char **global_argv = NULL; + +int +usage() +{ + base_log("usage:\n"); + base_log(" UpdateFootprintsFromBuffer()\n"); + base_log(" UpdateFootprintsFromBuffer(auto|manual)\n"); + base_log(" UpdateFootprintsFromBuffer(auto|manual, selected)\n"); + base_log(" UpdateFootprintsFromBuffer(auto|manual, named, " + "[, ...])\n"); + base_log("version: %s\n", VERSION); + return 1; +} + +static int +footprint_update (int argc, char **argv, Coord x, Coord y) +{ + global_argc = argc; + global_argv = argv; + + debug_log("footprint_update\n"); + debug_log(" argc: %d\n", argc); + if (argc) { + int i; + for (i = 0; i < argc; i++) { + debug_log(" argv[%d]: %s\n", i, argv[i]); + } + } + if (argc >= 1) { + if (strcasecmp(argv[0], "auto") == 0) { + match_mode = MATCH_MODE_AUTO; + style = STYLE_ALL; + } else if (strcasecmp(argv[0], "manual") == 0) { + match_mode = MATCH_MODE_MANUAL; + style = STYLE_SELECTED; + } else { + base_log("Error: If given, the first argument must be " + "\"auto\" or \"manual\".\n"); + return usage(); + } + if (argc >= 2) { + if (strcasecmp(argv[1], "selected") == 0) { + style = STYLE_SELECTED; + } else if (strcasecmp(argv[1], "named") == 0) { + style = STYLE_NAMED; + } else { + base_log("Error: If given, the second argument must be " + "\"selected\", or \"named\".\n"); + return usage(); + } + } + + } + debug_log("match_mode: %d\n", match_mode); + debug_log("style: %d\n", style); + + if (PASTEBUFFER->Data->ElementN != 1) { + base_log("Error: Paste buffer should contain one element.\n"); + return usage(); + } + + ELEMENT_LOOP(PASTEBUFFER->Data); + { + int replaced = replace_footprints(element); + if (replaced) { + base_log("Replaced %d elements.\n", replaced); + IncrementUndoSerialNumber(); + } + } + END_LOOP; + + return 0; +} + +static int +replace_footprints (ElementType *new_element) +{ + int replaced = 0; + int i = 0; + + ELEMENT_LOOP (PCB->Data); + { + if (match_mode != MATCH_MODE_AUTO + || strcmp(DESCRIPTION_NAME(new_element), + DESCRIPTION_NAME(element)) == 0) { + bool matched = false; + + switch (style) { + case STYLE_ALL: + matched = true; + break; + case STYLE_SELECTED: + matched = TEST_FLAG(SELECTEDFLAG, element); + break; + case STYLE_NAMED: + for (i = 0; i < global_argc; i++) { + if (NAMEONPCB_NAME(element) + && strcasecmp(NAMEONPCB_NAME(element), global_argv[i]) == 0) { + matched = true; + break; + } + } + break; + } + if (matched) { + if (TEST_FLAG (LOCKFLAG, element)) { + base_log("Skipping \"%s\". Element locked.\n", + NAMEONPCB_NAME(element)); + } else { + debug_log("Considering \"%s\".\n", NAMEONPCB_NAME(element)); + if (replace_one_footprint(element, new_element)) { + base_log("Replaced \"%s\".\n", NAMEONPCB_NAME(element)); + replaced++; + } + } + } + } + } + END_LOOP; + return replaced; +} + +static bool +replace_one_footprint(ElementType *old_element, + ElementType *new_element) +{ + /* Called in order from from most desirable to least desirable. */ + return (replace_one_footprint_quick(old_element, new_element) + || replace_one_footprint_expensive(old_element, new_element) + || replace_one_footprint_translate_only(old_element, new_element)); +} + +static bool +replace_one_footprint_quick (ElementType *old_element, + ElementType *new_element) +{ + /* Requires that there be two non-coincident, uniquely numbered + pads/pins that correspond between the old and new element. */ + if (! have_two_corresponding_unique_non_coincident(old_element, + new_element, + NULL, NULL, + NULL, NULL)) { + return false; + } + + /* Create copy of new element. */ + ElementType *copy_element = + CopyElementLowLevel (PCB->Data, NULL, new_element, false, 0, 0); + + PadOrPinType old1_pp; + PadOrPinType old2_pp; + PadOrPinType copy1_pp; + PadOrPinType copy2_pp; + if (! have_two_corresponding_unique_non_coincident(old_element, + copy_element, + &old1_pp, &old2_pp, + ©1_pp, ©2_pp)) { + base_log("Error: Couldn't find two corresponding, unique, " + "non-coincident element pads/pins."); + return false; + } + replace_one_footprint_aux(old_element, &old1_pp, &old2_pp, + copy_element, ©1_pp, ©2_pp); + debug_log("Used quick replacement.\n"); + return true; +} + +static bool +replace_one_footprint_expensive (ElementType *old_element, + ElementType *new_element) +{ + /* Requires that there be two corresponding, non-coincident + pads/pins; non-unique pad/pin numbers okay. + + It's expensive because it does an exhaustive comparison of the + resulting transformations for the four possible 90 degree + rotations plus combinations of same-numbered pads/pins. Should + only be necessary if the element *only* has pads and pins that + share the same pad/pin number. */ + if (! have_two_corresponding_non_coincident(old_element, new_element, + NULL, NULL, NULL, NULL)) { + return false; + } + + /* Create copy of new element. */ + ElementType *copy_element = + CopyElementLowLevel (PCB->Data, NULL, new_element, false, 0, 0); + + int old_ppd_len = 0; + ElementPadPinData* old_ppd = + alloc_pad_pin_data_array(old_element, &old_ppd_len); + + int copy_ppd_len = 0; + ElementPadPinData* copy_ppd = + alloc_pad_pin_data_array(copy_element, ©_ppd_len); + + int copy_index1 = 0; + int copy_index2 = 0; + if (! find_non_coincident(copy_ppd, copy_ppd_len, + ©_index1, ©_index2)) { + base_log("Error: Couldn't find non-coincident element pads/pins."); + free (old_ppd); + free (copy_ppd); + return false; + } + + bool reflect = IS_REFLECTED (new_element, old_element); + int old_index1 = 0; + int old_index2 = 0; + if (! find_best_corresponding_pads_or_pins(copy_ppd, copy_ppd_len, + copy_index1, copy_index2, + reflect, + old_ppd, old_ppd_len, + &old_index1, &old_index2)) { + free (old_ppd); + free (copy_ppd); + return false; + } + + replace_one_footprint_aux(old_element, + &old_ppd[old_index1].pp, + &old_ppd[old_index2].pp, + copy_element, + ©_ppd[copy_index1].pp, + ©_ppd[copy_index2].pp); + free (old_ppd); + free (copy_ppd); + debug_log("Used expensive replacement.\n"); + return true; +} + +static bool +replace_one_footprint_translate_only (ElementType *old_element, + ElementType *new_element) +{ + /* Just requires one corresponding pad/pin. Does no rotations. */ + if (! have_any_corresponding_pad_or_pin(old_element, new_element, + NULL, NULL)) { + return false; + } + + /* Create copy of new element. */ + ElementType *copy_element = + CopyElementLowLevel (PCB->Data, NULL, new_element, false, 0, 0); + + PadOrPinType old_pp = make_pad_or_pin(NULL, NULL); + PadOrPinType copy_pp = make_pad_or_pin(NULL, NULL); + if (! have_any_corresponding_pad_or_pin(old_element, copy_element, + &old_pp, ©_pp)) { + base_log("Error: Couldn't find any corresponding pads or pins."); + return false; + } + replace_one_footprint_aux(old_element, &old_pp, NULL, + copy_element, ©_pp, NULL); + debug_log("Used translation-only replacement.\n"); + return true; +} + +static void +replace_one_footprint_aux (ElementType *old_element, + PadOrPinType* old1_pp, PadOrPinType* old2_pp, + ElementType *copy_element, + PadOrPinType* copy1_pp, PadOrPinType* copy2_pp) +{ + bool two_points = (old2_pp && copy2_pp); + bool reflect = IS_REFLECTED (copy_element, old_element); + + debug_log("Reflect?: %s\n", (reflect ? "yes" : "no")); + if (reflect) { + /* Change side of board */ + ChangeElementSide(copy_element, 0); + } + + CheapPointType copy1_pt = pad_or_pin_center(copy1_pp); + CheapPointType old1_pt = pad_or_pin_center(old1_pp); + + BYTE rot_steps = 0; + if (two_points) { + /* Calculate nearest rotation steps */ + CheapPointType copy2_pt = pad_or_pin_center(copy2_pp); + CheapPointType old2_pt = pad_or_pin_center(old2_pp); + rot_steps = + calculate_rotation_steps(copy1_pt, copy2_pt, old1_pt, old2_pt); + } + if (rot_steps) { + /* Rotate copy */ + RotateElementLowLevel(PCB->Data, copy_element, 0, 0, rot_steps); + /* Recalculate since copy_element has changed. */ + copy1_pt = pad_or_pin_center(copy1_pp); + } + + /* Calculate translation */ + Coord dx = old1_pt.X - copy1_pt.X; + Coord dy = old1_pt.Y - copy1_pt.Y; + /* Move element */ + MoveElementLowLevel(PCB->Data, copy_element, dx, dy); + + /* Transfer pad/pin text and names. */ + transfer_text(old_element, copy_element); + transfer_names(old_element, copy_element); + transfer_flags(old_element, copy_element); + SetElementBoundingBox(PCB->Data, copy_element, &PCB->Font); + + AddObjectToCreateUndoList(ELEMENT_TYPE, + copy_element, copy_element, copy_element); + /* Remove old element. */ + MoveObjectToRemoveUndoList(ELEMENT_TYPE, + old_element, old_element, old_element); +} + +static BYTE +calculate_rotation_steps(CheapPointType new1_pt, CheapPointType new2_pt, + CheapPointType old1_pt, CheapPointType old2_pt) +{ + /* Translation of new1_pt to origin. */ + Coord new1_to_origin_dx = -new1_pt.X; + Coord new1_to_origin_dy = -new1_pt.Y; + /* Use translation for new2_pt. */ + CheapPointType new2_translated_pt = + make_point(new2_pt.X + new1_to_origin_dx, + new2_pt.Y + new1_to_origin_dy); + double new2_angle = + (new2_translated_pt.Y || new2_translated_pt.X + ? atan2(new2_translated_pt.Y, new2_translated_pt.X) : 0); + + /* Translation of old1_pt to origin. */ + Coord old1_to_origin_dx = -old1_pt.X; + Coord old1_to_origin_dy = -old1_pt.Y; + /* Use translation for old2_pt. */ + CheapPointType old2_translated_pt = + make_point(old2_pt.X + old1_to_origin_dx, + old2_pt.Y + old1_to_origin_dy); + double old2_angle = + (old2_translated_pt.X || old2_translated_pt.Y + ? atan2(old2_translated_pt.Y, old2_translated_pt.X) : 0); + + /* Compute rotation, adjust to match atan2 range. */ + double angle = old2_angle - new2_angle; + if (angle > M_PI) { + angle -= 2 * M_PI; + } else if (angle < -M_PI) { + angle += 2 * M_PI; + } + debug_log("Rotation: %lf\n", RAD_TO_DEG * angle); + /* Return a PCB rotation steps count. */ + return angle_to_rotation_steps(angle); +} + +static void +transfer_text (ElementType *old_element, ElementType *new_element) +{ + int i; + for (i = 0; i < MAX_ELEMENTNAMES; i++) { + TextType *old_text = &old_element->Name[i]; + TextType *new_text = &new_element->Name[i]; + free (new_text->TextString); + new_text->X = old_text->X; + new_text->Y = old_text->Y; + new_text->Direction = old_text->Direction; + new_text->Flags = old_text->Flags; + new_text->Scale = old_text->Scale; + new_text->TextString = + (old_text->TextString && *old_text->TextString) + ? strdup (old_text->TextString) + : NULL; + } +} + +static void +transfer_names (ElementType *old_element, ElementType *new_element) +{ + PAD_OR_PIN_LOOP_HYG(old_element, _old); + { + const char* old_name = pad_or_pin_name(&pp_old); + PAD_OR_PIN_LOOP_HYG(new_element, _new); + { + if (pad_or_pin_number_cmp(&pp_old, &pp_new) == 0) { + if (pp_new.pad) { + free (pp_new.pad->Name); + pp_new.pad->Name = strdup ((char*) old_name); + } else if (pp_new.pin) { + free (pp_new.pin->Name); + pp_new.pin->Name = strdup ((char*)old_name); + } + } + } + END_LOOP; + } + END_LOOP; +} + +static void +transfer_flags (ElementType *old_element, ElementType *new_element) +{ + PAD_OR_PIN_LOOP_HYG(old_element, _old); + { + if (pad_or_pin_test_flag(&pp_old, SELECTEDFLAG)) { + PAD_OR_PIN_LOOP_HYG(new_element, _new); + { + if (pad_or_pin_number_cmp(&pp_old, &pp_new) == 0) { + pad_or_pin_set_flag(&pp_new, SELECTEDFLAG); + } + } + END_LOOP; + } + } + END_LOOP; + if (TEST_FLAG(SELECTEDFLAG, old_element)) { + SET_FLAG(SELECTEDFLAG, new_element); + } +} + +static HID_Action footprint_update_action_list[] = { + {ACTION_NAME, NULL, footprint_update, NULL, NULL} +}; + +REGISTER_ACTIONS (footprint_update_action_list) + +void +pcb_plugin_init () +{ + register_footprint_update_action_list (); +} + Index: pcb-plugins_sources/src/plugins/footprint-update/matrix.c =================================================================== --- pcb-plugins_sources/src/plugins/footprint-update/matrix.c (nonexistent) +++ pcb-plugins_sources/src/plugins/footprint-update/matrix.c (revision 3870) @@ -0,0 +1,194 @@ +/* + * matrix + * + * Copyright 2008 Dean Ferreyra , All rights reserved + * + * This file is part of Footprint-Update. + * + * Footprint-Update 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. + * + * Footprint-Update 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 Footprint-Update. If not, see . + * + * $Id: matrix.c,v 1.3 2008-05-22 05:29:29 dean Exp $ + */ + +#include "matrix.h" + +/* + * 3x1 Vectors + */ + +void +make_vec(Vector3x1 vec, double x, double y) +{ + vec[0][0] = x; + vec[1][0] = y; + vec[2][0] = 1; +} + +CheapPointType +vec_to_point(Vector3x1 vec) +{ + return make_point(round(vec[0][0]), round(vec[1][0])); +} + +void +point_to_vec(CheapPointType pt, Vector3x1 vec) +{ + make_vec(vec, pt.X, pt.Y); +} + +/* + * 3x3 Matrices + */ + +void +copy_matrix(Matrix3x3 src, Matrix3x3 dst) +{ + memcpy(dst, src, sizeof(Matrix3x3)); +} + +void +make_identity_matrix(Matrix3x3 mat) +{ + memset(mat, 0, sizeof(Matrix3x3)); + int i; + for (i = 0; i < 3; i++) { + mat[i][i] = 1; + } +} + +void +make_translation_matrix(Matrix3x3 mat, double dx, double dy) +{ + make_identity_matrix(mat); + mat[0][2] = dx; + mat[1][2] = dy; +} + +void +make_rotation_matrix(Matrix3x3 mat, double theta) +{ + double c = cos(theta); + double s = sin(theta); + make_identity_matrix(mat); + mat[0][0] = c; mat[0][1] = -s; + mat[1][0] = s; mat[1][1] = c; +} + +void +make_reflection_matrix_x_axis(Matrix3x3 mat) +{ + make_identity_matrix(mat); + mat[1][1] = -1; +} + +void +make_reflection_matrix_y_axis(Matrix3x3 mat) +{ + make_identity_matrix(mat); + mat[0][0] = -1; +} + +void +multiply_matrix_vector(Matrix3x3 mat, Vector3x1 vec, + Vector3x1 result) +{ + int i; + for (i = 0; i < 3; i++) { + double s = 0; + int j; + for (j = 0; j < 3; j++) { + s += mat[i][j] * vec[j][0]; + } + result[i][0] = s; + } +} + +void +multiply_matrix_matrix(Matrix3x3 mat1, Matrix3x3 mat2, + Matrix3x3 result) +{ + int k; + for (k = 0; k < 3; k++) { + int i; + for (i = 0; i < 3; i++) { + double s = 0; + int j; + for (j = 0; j < 3; j++) { + s += mat1[i][j] * mat2[j][k]; + } + result[i][k] = s; + } + } +} + +void +multiply_matrix_matrix_inplace(Matrix3x3 mat1, Matrix3x3 mat2) +{ + Matrix3x3 result; + multiply_matrix_matrix(mat1, mat2, result); + memcpy(mat2, result, sizeof(Matrix3x3)); +} + +CheapPointType +transform_point(Matrix3x3 mat, CheapPointType pt) +{ + Vector3x1 vec; + Vector3x1 vec_result; + + point_to_vec(pt, vec); + multiply_matrix_vector(mat, vec, vec_result); + return vec_to_point(vec_result); +} + +/* + * Logging + */ + +void +log_vector(Vector3x1 vec) +{ + base_log("Vector\n"); + int i; + for (i = 0; i < 3; i++) { + base_log("%7.4f\n", vec[i][0]); + } +} + +void +debug_log_vector(Vector3x1 vec) +{ +#if DEBUG + log_vector(vec); +#endif +} + +void +log_matrix(Matrix3x3 mat) +{ + base_log("Matrix\n"); + int i; + for (i = 0; i < 3; i++) { + base_log("%7.4f %7.4f %7.4f\n", + mat[i][0], mat[i][1], mat[i][2]); + } +} + +void +debug_log_matrix(Matrix3x3 mat) +{ +#if DEBUG + debug_log_matrix(mat); +#endif +} + Index: pcb-plugins_sources/src/plugins/footprint-update/matrix.h =================================================================== --- pcb-plugins_sources/src/plugins/footprint-update/matrix.h (nonexistent) +++ pcb-plugins_sources/src/plugins/footprint-update/matrix.h (revision 3870) @@ -0,0 +1,68 @@ +/* + * matrix + * + * Copyright 2008 Dean Ferreyra , All rights reserved + * + * This file is part of Footprint-Update. + * + * Footprint-Update 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. + * + * Footprint-Update 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 Footprint-Update. If not, see . + * + * $Id: matrix.h,v 1.3 2008-05-22 04:52:13 dean Exp $ + */ + +#ifndef MATRIX_H_INCLUDED +#define MATRIX_H_INCLUDED 1 + +#include "utilities.h" + +/* + * 3x1 Vectors + */ + +typedef double Vector3x1[3][1]; /* [row][column] */ + +void make_vec(Vector3x1 vec, double x, double y); +CheapPointType vec_to_point(Vector3x1 vec); +void point_to_vec(CheapPointType pt, Vector3x1 vec); + +/* + * 3x3 Matrices + */ + +typedef double Matrix3x3[3][3]; /* [row][column] */ + +void make_identity_matrix(Matrix3x3 mat); +void make_translation_matrix(Matrix3x3 mat, double dx, double dy); +void make_rotation_matrix(Matrix3x3 mat, double theta); +void make_reflection_matrix_x_axis(Matrix3x3 mat); +void make_reflection_matrix_y_axis(Matrix3x3 mat); +void copy_matrix(Matrix3x3 src, Matrix3x3 dst); + +void multiply_matrix_vector(Matrix3x3 mat, Vector3x1 vec, + Vector3x1 result); +void multiply_matrix_matrix(Matrix3x3 mat1, Matrix3x3 mat2, + Matrix3x3 result); +void multiply_matrix_matrix_inplace(Matrix3x3 mat1, Matrix3x3 mat2); +CheapPointType transform_point(Matrix3x3 mat, CheapPointType pt); + +/* + * Logging + */ + +void log_vector(Vector3x1 vec); +void debug_log_vector(Vector3x1 vec); +void log_matrix(Matrix3x3 mat); +void debug_log_matrix(Matrix3x3 mat); + +#endif Index: pcb-plugins_sources/src/plugins/footprint-update/pad-pin-data.c =================================================================== --- pcb-plugins_sources/src/plugins/footprint-update/pad-pin-data.c (nonexistent) +++ pcb-plugins_sources/src/plugins/footprint-update/pad-pin-data.c (revision 3870) @@ -0,0 +1,287 @@ +/* + * pad-pin-data + * + * Copyright 2008 Dean Ferreyra , All rights reserved + * + * This file is part of Footprint-Update. + * + * Footprint-Update 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. + * + * Footprint-Update 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 Footprint-Update. If not, see . + * + * $Id: pad-pin-data.c,v 1.2 2008-05-22 04:52:13 dean Exp $ + * Dean Ferreyra + */ + +#include "matrix.h" +#include "pad-pin-data.h" + +static bool calculate_transformation (CheapPointType new1_pt, CheapPointType new2_pt, CheapPointType old1_pt, CheapPointType old2_pt, bool reflect, double angle, Matrix3x3 new_to_old_mat); +static void transform_pad_pin_data (ElementPadPinData* ppd, int len, Matrix3x3 trans); +static double calculate_sum_of_distances (ElementPadPinData* ppd_a, int len_a, ElementPadPinData* ppd_b, int len_b); +static bool find_number_block (const ElementPadPinData* ppd, int len, const PadOrPinType* pp, int* start, int* end); +static int pad_pin_data_cmp_by_number (const void* va, const void* vb); + +ElementPadPinData* +alloc_pad_pin_data_array (ElementType *element, int* len_ptr) +{ + int len; + int i; + ElementPadPinData* ppd = NULL; + + len = element->PadN + element->PinN; + realloc ((ElementPadPinData*) ppd, len * sizeof (ElementPadPinData)); + + /* Set the pad/pin pointers and centers */ + i = 0; + PAD_OR_PIN_LOOP(element); + { + ppd[i].pp = pp; + ppd[i].center + = ppd[i].transformed_center + = pad_or_pin_center(&pp); + i++; + } + END_LOOP; + + /* Sort by pad/pin number */ + qsort(ppd, len, sizeof(ElementPadPinData), pad_pin_data_cmp_by_number); + + /* Set the shared field */ + int i_start = 0; + const PadOrPinType* pp_start = &ppd[0].pp; + /* Index i goes all the way to len; watch out. */ + for (i = 1; i < len + 1; i++) { + if (i == len || pad_or_pin_number_cmp(pp_start, &ppd[i].pp) != 0) { + int shares = i - i_start; + int j; + for (j = i_start; j < i; j++) { + ppd[j].shares = shares; + } + /* Prepare for next block */ + if (i != len) { + i_start = i; + pp_start = &ppd[i].pp; + } + } + } + *len_ptr = len; + return ppd; +} + +double +find_non_coincident(const ElementPadPinData* ppd, int len, + int* index1_ptr, int* index2_ptr) +{ + int index1 = 0; + const ElementPadPinData* ppd1 = &ppd[index1]; + int i; + for (i = 1; i < len; i++) { + double d2 = point_distance2(ppd1->center, ppd[i].center); + if (d2) { + *index1_ptr = index1; + *index2_ptr = i; + return d2; + } + } + return 0; +} + +bool +find_best_corresponding_pads_or_pins(ElementPadPinData* ppd_a, int len_a, + int index1_a, int index2_a, + bool reflect, + ElementPadPinData* ppd_b, int len_b, + int* index1_b_ptr, int* index2_b_ptr) +{ + int block1_start = 0; + int block1_end = 0; + int block2_start = 0; + int block2_end = 0; + if (! find_number_block(ppd_b, len_b, &ppd_a[index1_a].pp, + &block1_start, &block1_end)) { + return false; + } + if (! find_number_block(ppd_b, len_b, &ppd_a[index2_a].pp, + &block2_start, &block2_end)) { + return false; + } + + bool min_set = false; + double min_sum_of_distances = 0; + int min_index1_b = 0; + int min_index2_b = 0; + + int i; + for (i = block1_start; i < block1_end; i++) { + int j; + for (j = block2_start; j < block2_end; j++) { + /* Block1 and block2 ranges may coincide. */ + if (i != j) { + int k; + for (k = 0; k < 4; k++) { + /* Find transformation */ + double angle = k * M_PI / 2; + Matrix3x3 trans; + if (calculate_transformation(ppd_a[index1_a].center, + ppd_a[index2_a].center, + ppd_b[i].center, + ppd_b[j].center, + reflect, angle, + trans)) { + /* Transform ppd_a */ + transform_pad_pin_data(ppd_a, len_a, trans); + /* Sum of distances */ + double sd = calculate_sum_of_distances(ppd_a, len_a, + ppd_b, len_b); + if (! min_set || sd < min_sum_of_distances) { + min_set = true; + min_sum_of_distances = sd; + min_index1_b = i; + min_index2_b = j; + } + } + } + } + } + } + if (min_set) { + debug_log("Best corresponding pads/pins found.\n"); + *index1_b_ptr = min_index1_b; + *index2_b_ptr = min_index2_b; + } else { + debug_log("No best corresponding pads/pins found.\n"); + } + return min_set; +} + +static void +transform_pad_pin_data(ElementPadPinData* ppd, int len, + Matrix3x3 trans) +{ + int i; + for (i = 0; i < len; i++) { + Vector3x1 v; + point_to_vec(ppd[i].center, v); + Vector3x1 t; + multiply_matrix_vector(trans, v, t); + ppd[i].transformed_center = vec_to_point(t); + } +} + +/* Isn't guaranteed to find the minimum distances between all + corresponding pads/pins when pad/pin numbers are shared, but it + takes a pretty good stab at it. */ +static double +calculate_sum_of_distances(ElementPadPinData* ppd_a, int len_a, + ElementPadPinData* ppd_b, int len_b) +{ + /* Clear the taken flags */ + int i; + for (i = 0; i < len_b; i++) { + ppd_b[i].taken = false; + } + + double sum_d2 = 0; + for (i = 0; i < len_a; i++) { + int block_b_start = 0; + int block_b_end = 0; + ElementPadPinData* a = &ppd_a[i]; + if (find_number_block(ppd_b, len_b, &a->pp, + &block_b_start, &block_b_end)) { + bool min_set = false; + double min_d2 = 0; + int min_index = 0; + int j; + for (j = block_b_start; j < block_b_end; j++) { + ElementPadPinData* b = &ppd_b[j]; + if (! b->taken) { + double d2 = point_distance2(a->transformed_center, + b->transformed_center); + if (! min_set || d2 < min_d2) { + min_set = true; + min_d2 = d2; + min_index = j; + } + } + } + if (min_set) { + ppd_b[min_index].taken = true; + sum_d2 += min_d2; + } + } + } + return sum_d2; +} + +bool +calculate_transformation(CheapPointType new1_pt, CheapPointType new2_pt, + CheapPointType old1_pt, CheapPointType old2_pt, + bool reflect, + double angle, + Matrix3x3 new_to_old_mat) +{ + Matrix3x3 t; + + /* Translation of new1_pt to origin. */ + Matrix3x3 new_to_origin_mat; + make_translation_matrix(new_to_origin_mat, -new1_pt.X, -new1_pt.Y); + if (reflect) { + /* If components are not on same side of board, reflect through + the y-axis. */ + make_reflection_matrix_y_axis(t); + multiply_matrix_matrix_inplace(t, new_to_origin_mat); + } + + Matrix3x3 result; + /* Start with translation of new1_pt to origin. */ + copy_matrix(new_to_origin_mat, result); + /* Rotate from new element angle to old element angle. */ + make_rotation_matrix(t, angle); + multiply_matrix_matrix_inplace(t, result); + /* Translate from origin to old1_pt. */ + make_translation_matrix(t, old1_pt.X, old1_pt.Y); + multiply_matrix_matrix_inplace(t, result); + + copy_matrix(result, new_to_old_mat); + return true; +} + +static bool +find_number_block(const ElementPadPinData* ppd, int len, + const PadOrPinType* pp, + int* start, int* end) +{ + int i; + for (i = 0; i < len; i++) { + if (pad_or_pin_number_cmp(&ppd[i].pp, pp) == 0) { + int j; + for (j = i + 1; j < len; j++) { + if (pad_or_pin_number_cmp(&ppd[j].pp, pp) != 0) { + break; + } + } + *start = i; + *end = j; + return true; + } + } + return false; +} + +static int +pad_pin_data_cmp_by_number(const void* va, const void* vb) +{ + const ElementPadPinData* a = (const ElementPadPinData*)va; + const ElementPadPinData* b = (const ElementPadPinData*)vb; + return pad_or_pin_number_cmp(&a->pp, &b->pp); +} Index: pcb-plugins_sources/src/plugins/footprint-update/pad-pin-data.h =================================================================== --- pcb-plugins_sources/src/plugins/footprint-update/pad-pin-data.h (nonexistent) +++ pcb-plugins_sources/src/plugins/footprint-update/pad-pin-data.h (revision 3870) @@ -0,0 +1,51 @@ +/* + * pad-pin-data + * + * Copyright 2008 Dean Ferreyra , All rights reserved + * + * This file is part of Footprint-Update. + * + * Footprint-Update 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. + * + * Footprint-Update 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 Footprint-Update. If not, see . + * + * $Id: pad-pin-data.h,v 1.2 2008-05-22 04:52:13 dean Exp $ + * Dean Ferreyra + */ + +#ifndef PAD_PIN_DATA_H_INCLUDED +#define PAD_PIN_DATA_H_INCLUDED 1 + +#include "utilities.h" + +typedef struct { + PadOrPinType pp; + CheapPointType center; + int shares; + bool taken; + CheapPointType transformed_center; +} ElementPadPinData; + +ElementPadPinData* alloc_pad_pin_data_array (ElementType *element, + int* len_ptr); +double find_non_coincident(const ElementPadPinData* ppd, int len, + int* index1_ptr, int* index2_ptr); +bool find_best_corresponding_pads_or_pins (ElementPadPinData* ppd_a, + int len_a, + int index1_a, int index2_a, + bool reflect, + ElementPadPinData* ppd_b, + int len_b, + int* index1_ptr, + int* index2_ptr); + +#endif Index: pcb-plugins_sources/src/plugins/footprint-update/utilities.c =================================================================== --- pcb-plugins_sources/src/plugins/footprint-update/utilities.c (nonexistent) +++ pcb-plugins_sources/src/plugins/footprint-update/utilities.c (revision 3870) @@ -0,0 +1,481 @@ +/* + * utilities + * + * Copyright 2008 Dean Ferreyra , All rights reserved + * + * This file is part of Footprint-Update. + * + * Footprint-Update 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. + * + * Footprint-Update 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 Footprint-Update. If not, see . + * + * $Id: utilities.c,v 1.22 2008-05-22 04:52:13 dean Exp $ + * Dean Ferreyra + */ + +#include "utilities.h" + +static bool have_two_corresponding_aux (ElementType *old_element, + ElementType *new_element, + bool unique, + bool non_coincident, + PadOrPinType* old1_pp_ptr, + PadOrPinType* old2_pp_ptr, + PadOrPinType* new1_pp_ptr, + PadOrPinType* new2_pp_ptr); + +/* + * Pad/pin type + */ + +PadOrPinType +make_pad_or_pin (GList *pad, GList *pin) +{ + PadOrPinType pp = { pad, pin }; + return pp; +} + +bool +is_pad_or_pin(const PadOrPinType* pp) +{ + return pp->pad || pp->pin; +} + +const char* +pad_or_pin_number(const PadOrPinType* pp) +{ + if (pp->pad) { + return pp->pad->Number; + } else if (pp->pin) { + return pp->pin->Number; + } else { + return NULL; + } +} + +const char* +pad_or_pin_name(const PadOrPinType* pp) +{ + if (pp->pad) { + return pp->pad->Name; + } else if (pp->pin) { + return pp->pin->Name; + } else { + return NULL; + } +} + +int +number_cmp(const char* number_a, const char* number_b) +{ + if (! number_a && ! number_b) { + return 0; + } else if (! number_a) { + return -1; + } else if (! number_b) { + return 1; + } else { + return strcmp(number_a, number_b); + } +} + +bool +pad_or_pin_test_flag(const PadOrPinType* pp, unsigned long flag) +{ + if (pp->pad) { + return TEST_FLAG(flag, pp->pad); + } else if (pp->pin) { + return TEST_FLAG(flag, pp->pin); + } else { + return false; + } +} + +void +pad_or_pin_set_flag(PadOrPinType* pp, unsigned long flag) +{ + if (pp->pad) { + SET_FLAG(flag, pp->pad); + } else if (pp->pin) { + SET_FLAG(flag, pp->pin); + } +} + +int +pad_or_pin_number_cmp(const PadOrPinType* ppa, const PadOrPinType* ppb) +{ + return number_cmp(pad_or_pin_number(ppa), pad_or_pin_number(ppb)); +} + +CheapPointType +pad_or_pin_center(PadOrPinType* pp) +{ + if (pp->pad) { + return pad_center(pp->pad); + } else if (pp->pin) { + return pin_center(pp->pin); + } else { + base_log("Error: pad_or_pin_center() got an empty PadOrPinType.\n"); + return make_point(0, 0); + } +} + +CheapPointType +pad_center(PadType *pad) +{ + return make_point((pad->Point1.X + pad->Point2.X) / 2, + (pad->Point1.Y + pad->Point2.Y) / 2); +} + +CheapPointType +pin_center(PinType *pin) +{ + return MAKE_PT(*pin); +} + +bool +find_pad_or_pin(ElementType *element, const char* number, + PadOrPinType* pp_ptr) +{ + PadOrPinType pp = make_pad_or_pin(NULL, NULL); + if (number && + ((pp.pad = find_pad(element, number)) + || (pp.pin = find_pin(element, number)))) { + *pp_ptr = pp; + return true; + } else { + return false; + } +} + +PadType * +find_pad (ElementType *element, const char* number) +{ + PAD_LOOP(element); + { + if (pad->Number && number_cmp(pad->Number, number) == 0) { + return pad; + } + } + END_LOOP; + return NULL; +} + +PinType * +find_pin (ElementType *element, const char* number) +{ + PIN_LOOP(element); + { + if (pin->Number && number_cmp(pin->Number, number) == 0) { + return pin; + } + } + END_LOOP; + return NULL; +} + +bool +is_number_unique (ElementType *element, const char* number) +{ + int count = 0; + PAD_OR_PIN_LOOP(element); + { + const char* pp_number = pad_or_pin_number(&pp); + if (pp_number && number_cmp(pp_number, number) == 0) { + if (++count > 1) { + return false; + } + } + } + END_LOOP; + return true; +} + +bool +have_two_corresponding_non_coincident (ElementType *old_element, + ElementType *new_element, + PadOrPinType* old1_pp_ptr, + PadOrPinType* old2_pp_ptr, + PadOrPinType* new1_pp_ptr, + PadOrPinType* new2_pp_ptr) +{ + return have_two_corresponding_aux(old_element, new_element, + false, true, + old1_pp_ptr, old2_pp_ptr, + new1_pp_ptr, new2_pp_ptr); +} + +bool +have_two_corresponding_unique_non_coincident (ElementType *old_element, + ElementType *new_element, + PadOrPinType* old1_pp_ptr, + PadOrPinType* old2_pp_ptr, + PadOrPinType* new1_pp_ptr, + PadOrPinType* new2_pp_ptr) +{ + return have_two_corresponding_aux(old_element, new_element, + true, true, + old1_pp_ptr, old2_pp_ptr, + new1_pp_ptr, new2_pp_ptr); +} + +static bool +have_two_corresponding_aux (ElementType *old_element, + ElementType *new_element, + bool unique, + bool non_coincident, + PadOrPinType* old1_pp_ptr, + PadOrPinType* old2_pp_ptr, + PadOrPinType* new1_pp_ptr, + PadOrPinType* new2_pp_ptr) +{ + PadOrPinType old1_pp = make_pad_or_pin(NULL, NULL); + PadOrPinType new1_pp = make_pad_or_pin(NULL, NULL); + bool first_found = false; + + PAD_OR_PIN_LOOP_HYG(old_element, _old); + { + if (! unique + || is_number_unique(old_element, + pad_or_pin_number(&pp_old))) { + CheapPointType old_pt = pad_or_pin_center(&pp_old); + PAD_OR_PIN_LOOP_HYG(new_element, _new); + { + if (pad_or_pin_number_cmp(&pp_old, &pp_new) == 0 + && (! unique + || is_number_unique(new_element, + pad_or_pin_number(&pp_new)))) { + CheapPointType new_pt = pad_or_pin_center(&pp_new); + if (! non_coincident || point_distance2(old_pt, new_pt)) { + if (! first_found) { + old1_pp = pp_old; + new1_pp = pp_new; + first_found = true; + } else { + if (old1_pp_ptr) { + *old1_pp_ptr = old1_pp; + } + if (new1_pp_ptr) { + *new1_pp_ptr = new1_pp; + } + if (old2_pp_ptr) { + *old2_pp_ptr = pp_old; + } + if (new2_pp_ptr) { + *new2_pp_ptr = pp_new; + } + return true; + } + } + } + } + END_LOOP; + } + } + END_LOOP; + return false; +} + +bool +have_any_corresponding_pad_or_pin (ElementType *old_element, + ElementType *new_element, + PadOrPinType* old_pp, + PadOrPinType* new_pp) +{ + PAD_OR_PIN_LOOP_HYG(old_element, _old); + { + PAD_OR_PIN_LOOP_HYG(new_element, _new); + { + if (pad_or_pin_number_cmp(&pp_old, &pp_new) == 0) { + if (old_pp) { + *old_pp = pp_old; + } + if (new_pp) { + *new_pp = pp_new; + } + return true; + } + } + END_LOOP; + } + END_LOOP; + return false; +} + +/* + * CheapPointType helpers. + */ + +CheapPointType +make_point (Coord x, Coord y) +{ + CheapPointType pt = { x, y }; + return pt; +} + +CheapPointType +point_subtract(CheapPointType pt1, CheapPointType pt2) +{ + return make_point(pt1.X - pt2.X, pt1.Y - pt2.Y); +} + +/* Distance squared */ +double +point_distance2(CheapPointType pt1, CheapPointType pt2) +{ + CheapPointType diff = point_subtract(pt1, pt2); + return (double)diff.X * (double)diff.X + (double)diff.Y * (double)diff.Y; +} + +/* + * Miscellaneous + */ + +double +round(double v) +{ + if (v < 0) { + return ceil(v - 0.5); + } else { + return floor(v + 0.5); + } +} + +double +multiple_of_90(double rad) +{ + return (M_PI / 2) * round(rad / (M_PI / 2)); +} + +#define ANGLE_EPSILON 0.01 +#define ANGLE_NEAR(a1, a2) (fabs((a1) - (a2)) < ANGLE_EPSILON) + +BYTE +angle_to_rotation_steps(double rad) +{ + double rad90 = multiple_of_90(rad); + + if (ANGLE_NEAR(rad90, M_PI / 2)) { + return 3; + } else if (ANGLE_NEAR(fabs(rad90), M_PI)) { + return 2; + } else if (ANGLE_NEAR(rad90, -M_PI / 2)) { + return 1; + } else if (ANGLE_NEAR(rad90, 0)) { + return 0; + } else { + base_log("Error: angle_to_rotation_steps() got " + "an unhandled angle: %lf\n", + rad * RAD_TO_DEG); + return 0; + } +} + +/* + * Logging + */ + +void +log_point(CheapPointType pt) +{ + base_log("Point\n"); + base_log("%8d %8d\n", pt.X, pt.Y); +} + +void +log_pad_or_pin(const PadOrPinType* pp) +{ + if (pp->pad) { + log_pad(pp->pad); + } else { + log_pin(pp->pin); + } +} + +void +log_pad(PadType *p) +{ + base_log("Pad\n"); + base_log("Name: \"%s\"\n", p->Name); + base_log("Number: \"%s\"\n", p->Number); + base_log("Point 1: (%d, %d)\n", p->Point1.X, p->Point1.Y); + base_log("Point 2: (%d, %d)\n", p->Point2.X, p->Point2.Y); +} + +void +log_pin(PinType *p) +{ + base_log("Pin\n"); + base_log("Name: \"%s\"\n", p->Name); + base_log("Number: \"%s\"\n", p->Number); + base_log("Point: (%d, %d)\n", p->X, p->Y); +} + +void +log_element(ElementType *e) +{ + base_log("Element\n"); + base_log("Description: %s\n", DESCRIPTION_NAME(e)); + base_log("Name on PCB: %s\n", NAMEONPCB_NAME(e)); + base_log("Value: %s\n", VALUE_NAME(e)); + base_log("Flags: %04x\n", FLAG_VALUE(e->Flags)); + base_log("MarkX, MarkY: %d, %d\n", e->MarkX, e->MarkY); + base_log("PinN: %d\n", e->PinN); + base_log("PadN: %d\n", e->PadN); + base_log("LineN: %d\n", e->LineN); + base_log("ArcN: %d\n", e->ArcN); + base_log("Attributes number: %d\n", e->Attributes.Number); + + int i = 0; + PAD_LOOP(e); + { + base_log("Pad %d\n", i++); + log_pad(pad); + } + END_LOOP; + + i = 0; + PIN_LOOP(e); + { + base_log("Pin %d\n", i++); + log_pin(pin); + } + END_LOOP; +} + +void base_log(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + gui->log(TITLE); + gui->log(": "); + gui->logv(fmt, args); +#if DEBUG + /* In debug mode, output logs to stderr. */ + vfprintf(stderr, fmt, args); +#endif + va_end(args); +} + +void debug_log(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); +#if DEBUG + gui->log(TITLE); + gui->log(": "); + gui->logv(fmt, args); + /* In debug mode, output logs to stderr. */ + vfprintf(stderr, fmt, args); +#endif + va_end(args); +} Index: pcb-plugins_sources/src/plugins/footprint-update/utilities.h =================================================================== --- pcb-plugins_sources/src/plugins/footprint-update/utilities.h (nonexistent) +++ pcb-plugins_sources/src/plugins/footprint-update/utilities.h (revision 3870) @@ -0,0 +1,207 @@ +/* + * utilities + * + * Copyright 2008 Dean Ferreyra , All rights reserved + * + * This file is part of Footprint-Update. + * + * Footprint-Update 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. + * + * Footprint-Update 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 Footprint-Update. If not, see . + * + * $Id: utilities.h,v 1.21 2008-05-22 04:52:13 dean Exp $ + * Dean Ferreyra + */ + +#ifndef UTILITIES_H_INCLUDED +#define UTILITIES_H_INCLUDED + +#include +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "box.h" +#include "copy.h" +#include "change.h" +#include "rotate.h" +#include "move.h" +#include "create.h" +#include "rtree.h" +#include "polygon.h" +#include "undo.h" + +#define TITLE "footprintupdate" +#define ACTION_NAME "UpdateFootprintsFromBuffer" + +/* + * Pad/pin type + */ + +typedef struct { + PadType *pad; + PinType *pin; +} PadOrPinType; + +PadOrPinType make_pad_or_pin (GList *pad, GList *pin); +bool is_pad_or_pin (const PadOrPinType* pp); +int number_cmp(const char* number_a, const char* number_b); +const char* pad_or_pin_number(const PadOrPinType* pp); +const char* pad_or_pin_name(const PadOrPinType* pp); +bool pad_or_pin_test_flag (const PadOrPinType* pp, unsigned long flag); +void pad_or_pin_set_flag(PadOrPinType* pp, unsigned long flag); +int pad_or_pin_number_cmp(const PadOrPinType* ppa, const PadOrPinType* ppb); + +CheapPointType pad_center (PadType *pad); +CheapPointType pin_center (PinType *pin); +CheapPointType pad_or_pin_center(PadOrPinType* pp); + +PadType *find_pad (ElementType *element, const char* number); +PinType *find_pin (ElementType *element, const char* number); +bool find_pad_or_pin (ElementType *element, const char* number, PadOrPinType* pp_ptr); + +bool is_number_unique (ElementType *element, const char* number); + +bool have_two_corresponding_non_coincident (ElementType *old_element, + ElementType *new_element, + PadOrPinType* old1_pp_ptr, + PadOrPinType* old2_pp_ptr, + PadOrPinType* new1_pp_ptr, + PadOrPinType* new2_pp_ptr); +bool have_two_corresponding_unique_non_coincident (ElementType *old_element, + ElementType *new_element, + PadOrPinType* old1_pp_ptr, + PadOrPinType* old2_pp_ptr, + PadOrPinType* new1_pp_ptr, + PadOrPinType* new2_pp_ptr); +bool have_any_corresponding_pad_or_pin (ElementType *old_element, + ElementType *new_element, + PadOrPinType* old_pp, + PadOrPinType* new_pp); + +/* + * Points + */ + +CheapPointType make_point (Coord x, Coord y); +CheapPointType subtract_point(CheapPointType pt1, CheapPointType pt2); +double point_distance2(CheapPointType pt1, CheapPointType pt2); + +/* + * Logging + */ + +void log_point(CheapPointType pt); + +void log_pad_or_pin(const PadOrPinType* pp); +void log_pad (PadType *p); +void log_pin (PinType *p); +void log_element (ElementType *e); + +#if DEBUG +# define debug_log_point(pt) log_point(pt) +# define debug_log_pad_or_pin(pp) log_pad_or_pin(pp) +# define debug_log_pad(p) log_pad(p) +# define debug_log_pin(p) log_pin(p) +# define debug_log_element(e) log_element(e) +#else +# define debug_log_point(pt) +# define debug_log_pad_or_pin(pp) +# define debug_log_pad(p) +# define debug_log_pin(p) +# define debug_log_element(e) +#endif + +void base_log(const char *fmt, ...); +void debug_log(const char *fmt, ...); + +/* + * Miscellaneous + */ + +double round(double v); +double multiple_of_90(double rad); +BYTE angle_to_rotation_steps(double rad); + +/* + * Macros + */ + +#define FLAG_VALUE(o) ((o).f) + +#define MAKE_PT(obj) \ + make_point((obj).X, (obj).Y) + +#define IS_REFLECTED(elem1, elem2) \ + (TEST_FLAG(ONSOLDERFLAG, (elem1)) \ + != TEST_FLAG(ONSOLDERFLAG, (elem2))); + +/* "Hygienic" loop macros for nesting */ + +#define PAD_LOOP_HYG(element, suffix) \ + do { \ + Cardinal n##suffix, sn##suffix; \ + PadType* pad##suffix; \ + for (sn##suffix = (element)->PadN, n##suffix = 0; \ + (element)->PadN > 0 && n##suffix < (element)->PadN ; \ + sn##suffix == (element)->PadN ? n##suffix++ : 0) \ + { \ + pad##suffix = &(element)->Pad[n##suffix] + + +#define PIN_LOOP_HYG(element, suffix) \ + do { \ + Cardinal n##suffix, sn##suffix; \ + PinType* pin##suffix; \ + for (sn##suffix = (element)->PinN, n##suffix = 0; \ + (element)->PinN > 0 && n##suffix < (element)->PinN ; \ + sn##suffix == (element)->PinN ? n##suffix++ : 0) \ + { \ + pin##suffix = &(element)->Pin[n##suffix] + +#define PAD_OR_PIN_LOOP_HYG(element, suffix) \ + do { \ + Cardinal n##suffix = 0; \ + Cardinal internal_n##suffix = 0; \ + bool pad_done##suffix = false; \ + while (1) { \ + PadOrPinType pp##suffix = make_pad_or_pin(NULL, NULL); \ + if (! pad_done##suffix) { \ + if (internal_n##suffix < (element)->PadN) { \ + n##suffix = internal_n##suffix++; \ + pp##suffix = \ + make_pad_or_pin(&(element)->Pad[n##suffix], \ + NULL); \ + } else { \ + pad_done##suffix = true; \ + internal_n##suffix = 0; \ + } \ + } \ + if (pad_done##suffix) { \ + if (internal_n##suffix < (element)->PinN) { \ + n##suffix = internal_n##suffix++; \ + pp##suffix = \ + make_pad_or_pin(NULL, \ + &(element)->Pin[n##suffix]); \ + \ + } else { \ + break; \ + } \ + } + +#define PAD_OR_PIN_LOOP(element) PAD_OR_PIN_LOOP_HYG(element, ) + +#endif Index: pcb-plugins_sources/src/plugins/ghellopcb.c =================================================================== --- pcb-plugins_sources/src/plugins/ghellopcb.c (nonexistent) +++ pcb-plugins_sources/src/plugins/ghellopcb.c (revision 3870) @@ -0,0 +1,114 @@ +/*! + * \file ghellopcb.c + * + * \author Copyright (C) 2009 by Bert Timmerman + * + * \brief Plug-in for PCB to say "Hello world". + * + * Function to show a GTK dialog with a "Hello world" message on the + * screen.\n + * \n + * Compile like this:\n + * \n + gcc -Wall -Ipath/to/pcb/src -Ipath/to/pcb -O2 -shared -lglib-2.0 \ + ghellopcb.c -o ghellopcb.so `pkg-config --cflags gtk+-2.0 --libs gtk+-2.0` + * \n\n + * The resulting ghellopcb.so file should go in $HOME/.pcb/plugins/\n + * \n + * \warning Be very strict in compiling this plug-in against the exact pcb + * sources you compiled/installed the pcb executable (i.e. src/pcb) with.\n + * + * Usage: gHelloPCB()\n + *
+ * This program is free software; you can redistribute it and/or modify\n + * it under the terms of the GNU General Public License as published by\n + * the Free Software Foundation; either version 2 of the License, or\n + * (at your option) any later version.\n + * \n + * This program is distributed in the hope that it will be useful,\n + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details.\n + * \n + * You should have received a copy of the GNU General Public License\n + * along with this program; if not, write to:\n + * the Free Software Foundation, Inc.,\n + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n + */ + + +#include +#include +#include +#include + +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "create.h" +#include "rtree.h" +#include "undo.h" +#include "set.h" + +/*! + * \brief Terminate the main loop. + */ +static void +on_destroy (GtkWidget * widget, gpointer data) +{ + gtk_main_quit (); +} + +/*! + * \brief Show a GTK dialog with a "Hello world" message on the screen. + * + * Usage: gHelloPCB()\n + */ +static int +ghellopcb (int argc, char **argv, Coord x, Coord y) +{ + GtkWidget *window; + GtkWidget *label; + gtk_init (&argc, &argv); + /* create a new top level window */ + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + /* give the window a 20px wide border */ + gtk_container_set_border_width (GTK_CONTAINER (window), 20); + /* give it the title */ + gtk_window_set_title (GTK_WINDOW (window), PACKAGE " " VERSION); + /* open it a bit wider so that both the label and title show up */ + gtk_window_set_default_size (GTK_WINDOW (window), 200, 50); + /* Connect the destroy event of the window with our on_destroy function + * When the window is about to be destroyed we get a notificaton and + * stop the main GTK loop + */ + g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (on_destroy), NULL); + /* Create the "Hello, PCB World" label */ + label = gtk_label_new ("Hello, PCB World"); + /* and insert it into the main window */ + gtk_container_add (GTK_CONTAINER (window), label); + /* make sure that everything, window and label, are visible */ + gtk_widget_show_all (window); + /* start the main loop */ + gtk_main (); + return 0; +} + + +static HID_Action ghellopcb_action_list[] = +{ + {"gHelloPCB", NULL, ghellopcb, "show a GTK dialog with a Hello world message on the screen", NULL} +}; + + +REGISTER_ACTIONS (ghellopcb_action_list) + + +void +pcb_plugin_init () +{ + register_ghellopcb_action_list (); +} + +/* EOF */ Index: pcb-plugins_sources/src/plugins/join-found.c =================================================================== --- pcb-plugins_sources/src/plugins/join-found.c (nonexistent) +++ pcb-plugins_sources/src/plugins/join-found.c (revision 3870) @@ -0,0 +1,165 @@ +/*! + * \file join-found.c + * + * \brief Join found plug-in for PCB. + * + * \author Copyright (C) 2009 Peter Clifton + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * Compile like this: + *
+gcc -Wall -I$HOME/pcbsrc/pcb.clean/src -I$HOME/pcbsrc/pcb.clean -O2 -shared join-found.c -o join-found.so
+ * 
+ * The resulting join-found.so goes in $HOME/.pcb/plugins/join-found.so + */ + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "change.h" +#include "undo.h" + +#define THERMAL_STYLE 4 + +static int changed = 0; + + +/* FIXME: PCB API STOPS ME DOING THIS */ +#if 0 +static void * +init_line (LayerTypePtr Layer, LineTypePtr Line) +{ + ListStart (LINE_TYPE, NULL, Line, NULL); + return Line; +} + +static void * +init_via (PinTypePtr Via) +{ + ListStart (VIA_TYPE, NULL, Via, NULL); + return Via; +} + +static void * +init_pin (ElementTypePtr Element, PinTypePtr Pin) +{ + ListStart (PIN_TYPE, Element, Pin, NULL); + return Pin; +} + +static void * +init_pad (ElementTypePtr Element, PadTypePtr Pad) +{ + ListStart (PAD_TYPE, Element, Pad, NULL); + return Pad; +} + +static void * +init_arc (LayerTypePtr Layer, ArcTypePtr Arc) +{ + ListStart (ARC_TYPE, Layer, Arc, NULL); + return Arc; +} + +static ObjectFunctionType init_funcs = { + init_line, + NULL, + NULL, + init_via, + NULL, + NULL, + init_pin, + init_pad, + NULL, + NULL, + init_arc, + NULL +}; +#endif + +static int +joinfound (int argc, char **argv, Coord x, Coord y) +{ + int TheFlag = FOUNDFLAG; + + changed = 0; + /* FIXME: PCB API STOPS ME DOING THIS */ +#if 0 + TheFlag = FOUNDFLAG; // | DRCFLAG; + SaveFindFlag (TheFlag); + InitConnectionLookup (); + ResetConnections (False); + SelectedOperation (init_funcs, False, LINE_TYPE | ARC_TYPE | PIN_TYPE | VIA_TYPE | PAD_TYPE); + DoIt (true, False); +#endif + VISIBLELINE_LOOP (PCB->Data); + { + if (TEST_FLAG (TheFlag, line)) + { + ChangeObjectJoin (LINE_TYPE, layer, line, line); + changed = true; + } + } + ENDALL_LOOP; + VISIBLEARC_LOOP (PCB->Data); + { + if (TEST_FLAG (TheFlag, arc)) + { + ChangeObjectJoin (ARC_TYPE, layer, arc, arc); + changed = true; + } + } + ENDALL_LOOP; + if (PCB->PinOn) + ELEMENT_LOOP (PCB->Data); + { + PIN_LOOP (element); + { + if (TEST_FLAG (TheFlag, pin)) + { + ChangeObjectThermal (PIN_TYPE, element, pin, pin, THERMAL_STYLE); + changed = true; + } + } + END_LOOP; /* PIN_LOOP */ + } + END_LOOP; /* ELEMENT_LOOP */ + if (PCB->ViaOn) + VIA_LOOP (PCB->Data); + { + if (TEST_FLAG (TheFlag, via)) + { + ChangeObjectThermal (VIA_TYPE, via, via, via, THERMAL_STYLE); + changed = true; + } + } + END_LOOP; + /* FIXME: PCB API STOPS ME DOING THIS */ +#if 0 + ResetConnections (False); + FreeConnectionLookupMemory (); + RestoreFindFlag (); +#endif + gui->invalidate_all (); + if (changed) + IncrementUndoSerialNumber (); + return 0; +} + +static HID_Action joinfound_action_list[] = +{ + {"JoinFound", NULL, joinfound, NULL, NULL} +}; + +REGISTER_ACTIONS (joinfound_action_list) + +void +pcb_plugin_init () +{ + register_joinfound_action_list (); +} Index: pcb-plugins_sources/src/plugins/jostle.c =================================================================== --- pcb-plugins_sources/src/plugins/jostle.c (nonexistent) +++ pcb-plugins_sources/src/plugins/jostle.c (revision 3870) @@ -0,0 +1,662 @@ +/*! + * \file jostle.c + * + * \brief jostle plug-in for PCB. + * + * \author Copyright (C) 2007 Ben Jackson + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * Pushes lines out of the way. + */ + +#include +#include +#include +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "hid_draw.h" +#include "misc.h" +#include "create.h" +#include "rtree.h" +#include "undo.h" +#include "rats.h" +#include "polygon.h" +#include "remove.h" +#include "error.h" +#include "set.h" +#include "pcb-printf.h" + +//#define DEBUG_POLYAREA + +double vect_dist2 (Vector v1, Vector v2); +#define Vcpy2(r,a) {(r)[0] = (a)[0]; (r)[1] = (a)[1];} +#define Vswp2(a,b) { long t; \ + t = (a)[0], (a)[0] = (b)[0], (b)[0] = t; \ + t = (a)[1], (a)[1] = (b)[1], (b)[1] = t; \ +} + +//{if (!Marked.status && side==NORTHWEST) { DrawMark(True); Marked.status = True; Marked.X = p[0]; Marked.Y = p[1]; DrawMark(False);} } + +enum +{ + NORTH, + NORTHEAST, + EAST, + SOUTHEAST, + SOUTH, + SOUTHWEST, + WEST, + NORTHWEST +}; + +const char *dirnames[] = +{ + "NORTH", + "NORTHEAST", + "EAST", + "SOUTHEAST", + "SOUTH", + "SOUTHWEST", + "WEST", + "NORTHWEST" +}; + +#define ARG(n) (argc > (n) ? argv[n] : 0) + +static const char jostle_syntax[] = "Jostle(diameter)"; + +/* DEBUG */ +static void +DebugPOLYAREA (POLYAREA *s, char *color) +{ + int *x, *y, n, i = 0; + PLINE *pl; + VNODE *v; + POLYAREA *p; + +#ifndef DEBUG_POLYAREA + return; +#endif + p = s; + do + { + for (pl = p->contours; pl; pl = pl->next) + { + n = pl->Count; + x = (int *) malloc (n * sizeof (int)); + y = (int *) malloc (n * sizeof (int)); + for (v = &pl->head; i < n; v = v->next) + { + x[i] = v->point[0]; + y[i++] = v->point[1]; + } + if (1) + { + gui->graphics->set_color (Output.fgGC, color ? color : PCB->ConnectedColor); + gui->graphics->set_line_width (Output.fgGC, 1); + for (i = 0; i < n - 1; i++) + { + gui->graphics->draw_line (Output.fgGC, x[i], y[i], x[i + 1], y[i + 1]); + // gui->fill_circle (Output.fgGC, x[i], y[i], 30); + } + gui->graphics->draw_line (Output.fgGC, x[n - 1], y[n - 1], x[0], y[0]); + } + free (x); + free (y); + } + } while ((p = p->f) != s); + hid_action ("Busy"); + sleep (3); +} + + +#if 0 +enum +{ + K_X, + K_Y, + K_Lefts, + K_Rights, + K_Tops, + K_Bottoms, + K_Centers, + K_Marks, + K_Gaps, + K_First, + K_Last, + K_Average, + K_Crosshair, + K_Gridless, + K_none, + K_align, + K_distribute +}; + +static const char *keywords[] = +{ + [K_X] "X", + [K_Y] "Y", + [K_Lefts] "Lefts", + [K_Rights] "Rights", + [K_Tops] "Tops", + [K_Bottoms] "Bottoms", + [K_Centers] "Centers", + [K_Marks] "Marks", + [K_Gaps] "Gaps", + [K_First] "First", + [K_Last] "Last", + [K_Average] "Average", + [K_Crosshair] "Crosshair", + [K_Gridless] "Gridless", +}; + +static int +keyword (const char *s) +{ + int i; + + if (! s) + { + return K_none; + } + for (i = 0; i < ENTRIES(keywords); ++i) + { + if (keywords[i] && strcasecmp(s, keywords[i]) == 0) + return i; + } + return -1; +} +#endif + +/*! + * \brief Find the bounding box of a POLYAREA. + * + * POLYAREAs linked by ->f/b are outlines.\n + * n->contours->next would be the start of the inner holes (irrelevant + * for bounding box). + */ +static BoxType +POLYAREA_boundingBox (POLYAREA *a) +{ + POLYAREA *n; + PLINE *pa; + BoxType box; + int first = 1; + + n = a; + do + { + pa = n->contours; + if (first) + { + box.X1 = pa->xmin; + box.X2 = pa->xmax + 1; + box.Y1 = pa->ymin; + box.Y2 = pa->ymax + 1; + first = 0; + } + else + { + MAKEMIN (box.X1, pa->xmin); + MAKEMAX (box.X2, pa->xmax + 1); + MAKEMIN (box.Y1, pa->ymin); + MAKEMAX (box.Y2, pa->ymax + 1); + } + } while ((n = n->f) != a); + return box; +} + +/*! + * Given a polygon and a side of it (a direction north/northeast/etc), + * find a line tangent to that side, offset by clearance, and return it + * as a pair of vectors PQ.\n + * Make it long so it will intersect everything in the area. + */ +static void +POLYAREA_findXmostLine (POLYAREA *a, int side, Vector p, Vector q, int clearance) +{ + p[0] = p[1] = 0; + q[0] = q[1] = 0; + int extra = a->contours->xmax - a->contours->xmin + + a->contours->ymax - a->contours->ymin; + switch (side) + { + case NORTH: + p[1] = q[1] = a->contours->ymin - clearance; + p[0] = a->contours->xmin - extra; + q[0] = a->contours->xmax + extra; + break; + case SOUTH: + p[1] = q[1] = a->contours->ymax + clearance; + p[0] = a->contours->xmin - extra; + q[0] = a->contours->xmax + extra; + break; + case EAST: + p[0] = q[0] = a->contours->xmax + clearance; + p[1] = a->contours->ymin - extra; + q[1] = a->contours->ymax + extra; + break; + case WEST: + p[0] = q[0] = a->contours->xmin - clearance; + p[1] = a->contours->ymin - extra; + q[1] = a->contours->ymax + extra; + break; + default: /* diagonal case */ + { + int kx, ky, minmax, dq, ckx, cky; + Coord mm[2] = {MAX_COORD, -MAX_COORD}; + Vector mmp[2]; + VNODE *v; + + switch (side) + { + case NORTHWEST: + kx = 1; /* new_x = kx * x + ky * y */ + ky = 1; + dq = -1; /* extend line in +x, dq*y */ + ckx = cky = -1; /* clear line in ckx*clear, cky*clear */ + minmax = 0; /* min or max */ + break; + case SOUTHWEST: + kx = 1; + ky = -1; + dq = 1; + ckx = -1; + cky = 1; + minmax = 0; + break; + case NORTHEAST: + kx = 1; + ky = -1; + dq = 1; + ckx = 1; + cky = -1; + minmax = 1; + break; + case SOUTHEAST: + kx = ky = 1; + dq = -1; + ckx = cky = 1; + minmax = 1; + break; + default: + Message("bjj: aiee, what side?"); + return; + } + v = &a->contours->head; + do + { + int test = kx * v->point[0] + ky * v->point[1]; + if (test < mm[0]) + { + mm[0] = test; + mmp[0][0] = v->point[0]; + mmp[0][1] = v->point[1]; + } + if (test > mm[1]) + { + mm[1] = test; + mmp[1][0] = v->point[0]; + mmp[1][1] = v->point[1]; + } + } while ((v = v->next) != &a->contours->head); + Vcpy2 (p, mmp[minmax]); + /* add clearance in the right direction */ + clearance *= 0.707123; /* = cos(45) = sqrt(2)/2 */ + p[0] += ckx * clearance; + p[1] += cky * clearance; + /* now create a tangent line to that point */ + Vcpy2 (q, p); + p[0] += -extra; + p[1] += -extra * dq; + q[0] += extra; + q[1] += extra * dq; + } + } +} + +/*! + * Given a 'side' from the NORTH/SOUTH/etc enum, rotate it by n. + */ +static int +rotateSide (int side, int n) +{ + return (side + n + 8) % 8; +} + +/*! + * Wrapper for CreateNewLineOnLayer that takes vectors and deals with Undo + */ +static LineType * +CreateVectorLineOnLayer (LayerType *layer, Vector a, Vector b, int thickness, int clearance, FlagType flags) +{ + LineType *line; + + line = CreateNewLineOnLayer (layer, a[0], a[1], b[0], b[1], thickness, clearance, flags); + if (line) + { + AddObjectToCreateUndoList (LINE_TYPE, layer, line, line); + } + return line; +} + +static LineType * +MakeBypassLine (LayerType *layer, Vector a, Vector b, LineType *orig, POLYAREA **expandp) +{ + LineType *line; + + line = CreateVectorLineOnLayer (layer, a, b, + orig->Thickness, orig->Clearance, orig->Flags); + if (line && expandp) + { + POLYAREA *p = LinePoly (line, line->Thickness + line->Clearance); + poly_Boolean_free (*expandp, p, expandp, PBO_UNITE); + } + return line; +} + +/*! + * Given a 'brush' that's pushing things out of the way (possibly already + * cut down to just the part relevant to our line) and a line that + * intersects it on some layer, find the 45/90 lines required to go around + * the brush on the named side. Create them and remove the original. + * + * Imagine side = north: + *
+                 /      \
+            ----b##FLAT##c----
+               Q          P
+   lA-ORIG####a            d####ORIG-lB
+             /              \
+ * 
+ * First find the extended three lines that go around the brush. + * Then intersect them with each other and the original to find + * points a, b, c, d. Finally connect the dots and remove the + * old straight line. + */ +static int +MakeBypassingLines (POLYAREA *brush, LayerType *layer, LineType *line, int side, POLYAREA **expandp) +{ + Vector pA, pB, flatA, flatB, qA, qB; + Vector lA, lB; + Vector a, b, c, d, junk; + int hits; + + SET_FLAG (DRCFLAG, line); /* will cause sublines to inherit */ + lA[0] = line->Point1.X; + lA[1] = line->Point1.Y; + lB[0] = line->Point2.X; + lB[1] = line->Point2.Y; + + POLYAREA_findXmostLine (brush, side, flatA, flatB, line->Thickness / 2); + POLYAREA_findXmostLine (brush, rotateSide(side, 1), pA, pB, line->Thickness / 2); + POLYAREA_findXmostLine (brush, rotateSide(side, -1), qA, qB, line->Thickness / 2); + hits = vect_inters2 (lA, lB, qA, qB, a, junk) + + vect_inters2 (qA, qB, flatA, flatB, b, junk) + + vect_inters2 (pA, pB, flatA, flatB, c, junk) + + vect_inters2 (lA, lB, pA, pB, d, junk); + if (hits != 4) + { + return 0; + } + /* flip the line endpoints to match up with a/b */ + if (vect_dist2 (lA, d) < vect_dist2 (lA, a)) + { + Vswp2 (lA, lB); + } + MakeBypassLine (layer, lA, a, line, NULL); + MakeBypassLine (layer, a, b, line, expandp); + MakeBypassLine (layer, b, c, line, expandp); + MakeBypassLine (layer, c, d, line, expandp); + MakeBypassLine (layer, d, lB, line, NULL); + RemoveLine (layer, line); + return 1; +} + +struct info +{ + BoxType box; + POLYAREA *brush; + LayerType *layer; + POLYAREA *smallest; + /*!< after cutting brush with line, the smallest chunk, which we + * will go around on 'side'. + */ + LineType *line; + int side; + double centroid; + /*!< smallest difference between slices of brush after cutting with + * line, trying to find the line closest to the centroid to process + * first + */ +}; + +/*! + * Process lines that intersect our 'brush'. + */ +static int +jostle_callback (const BoxType *targ, void *private) +{ + LineType *line = (LineType *) targ; + struct info *info = private; + POLYAREA *lp, *copy, *tmp, *n, *smallest = NULL; + Vector p; + int inside = 0, side, r; + double small, big; + int nocentroid = 0; + + if (TEST_FLAG (DRCFLAG, line)) + { + return 0; + } + fprintf (stderr, "hit! %p\n", line); + p[0] = line->Point1.X; + p[1] = line->Point1.Y; + if (poly_InsideContour (info->brush->contours, p)) + { + pcb_fprintf (stderr, "\tinside1 %ms,%ms\n", p[0],p[1]); + inside++; + } + p[0] = line->Point2.X; + p[1] = line->Point2.Y; + if (poly_InsideContour (info->brush->contours, p)) + { + pcb_fprintf (stderr, "\tinside2 %ms,%ms\n", p[0],p[1]); + inside++; + } + lp = LinePoly (line, line->Thickness); + if (!Touching (lp, info->brush)) + { + /* not a factor */ + return 0; + } + poly_Free (&lp); + if (inside) + { + // XXX not done! + // XXX if this is part of a series of lines passing + // XXX through, need to process as a group. + // XXX if it just ends in here, shorten it?? + return 0; + } + /* + * Cut the brush with the line to figure out which side to go + * around. Use a very fine line. XXX can still graze. + */ + lp = LinePoly (line, 1); + if (!poly_M_Copy0 (©, info->brush)) + return 0; + r = poly_Boolean_free (copy, lp, &tmp, PBO_SUB); + if (r != err_ok) + { + pcb_fprintf (stderr, "Error while jostling PBO_SUB: %d\n", r); + return 0; + } + if (tmp == tmp->f) + { + /* it didn't slice, must have glanced. intersect instead + * to get the glancing sliver?? + */ + pcb_fprintf (stderr, "try isect??\n"); + lp = LinePoly (line, line->Thickness); + r = poly_Boolean_free (tmp, lp, &tmp, PBO_ISECT); + if (r != err_ok) + { + fprintf (stderr, "Error while jostling PBO_ISECT: %d\n", r); + return 0; + } + nocentroid = 1; + } + /* XXX if this operation did not create two chunks, bad things are about to happen */ + if (! tmp) + return 0; + n = tmp; + small = big = tmp->contours->area; + do + { + pcb_fprintf (stderr, "\t\tarea %g, %ms,%ms %ms,%ms\n", n->contours->area, n->contours->xmin,n->contours->ymin, n->contours->xmax,n->contours->ymax); + if (n->contours->area <= small) + { + smallest = n; + small = n->contours->area; + } + if (n->contours->area >= big) + { + big = n->contours->area; + } + } while((n = n->f) != tmp); + if (line->Point1.X == line->Point2.X) + { /* | */ + if (info->box.X2 - smallest->contours->xmax > + smallest->contours->xmin - info->box.X1) + { + side = WEST; + } + else + { + side = EAST; + } + } + else if (line->Point1.Y == line->Point2.Y) + { /* - */ + if (info->box.Y2 - smallest->contours->ymax > + smallest->contours->ymin - info->box.Y1) + { + side = NORTH; + } + else + { + side = SOUTH; + } + } + else if ((line->Point1.X > line->Point2.X) == + (line->Point1.Y > line->Point2.Y)) + { /* \ */ + if (info->box.X2 - smallest->contours->xmax > + smallest->contours->xmin - info->box.X1) + { + side = SOUTHWEST; + } + else + { + side = NORTHEAST; + } + } + else + { /* / */ + if (info->box.X2 - smallest->contours->xmax > + smallest->contours->xmin - info->box.X1) + { + side = NORTHWEST; + } + else + { + side = SOUTHEAST; + } + } + pcb_fprintf (stderr, "\t%s\n", dirnames[side]); + if (info->line == NULL || + (!nocentroid && (big - small) < info->centroid)) + { + pcb_fprintf (stderr, "\tkeep it!\n"); + if (info->smallest) + { + poly_Free (&info->smallest); + } + info->centroid = nocentroid ? DBL_MAX : (big - small); + info->side = side; + info->line = line; + info->smallest = smallest; + return 1; + } + return 0; +} + +static int +jostle (int argc, char **argv, Coord x, Coord y) +{ + bool rel; + POLYAREA *expand; + float value; + struct info info; + int found; + + if (argc == 2) + { + value = GetValue (ARG(0), ARG(1), &rel); + } + else + { + value = Settings.ViaThickness + (PCB->Bloat + 1) * 2 + 50; + } + x = Crosshair.X; + y = Crosshair.Y; + fprintf (stderr, "%d, %d, %f\n", (int)x, (int)y, value); + info.brush = CirclePoly (x, y, value / 2); + info.layer = CURRENT; + LINE_LOOP (info.layer); + { + CLEAR_FLAG (DRCFLAG, line); + } + END_LOOP; + do + { + info.box = POLYAREA_boundingBox (info.brush); + DebugPOLYAREA (info.brush, NULL); + pcb_fprintf (stderr, "search (%ms,%ms)->(%ms,%ms):\n", info.box.X1,info.box.Y1, info.box.X2,info.box.Y2); + info.line = NULL; + info.smallest = NULL; + found = r_search (info.layer->line_tree, &info.box, NULL, jostle_callback, &info); + if (found) + { + expand = NULL; + MakeBypassingLines (info.smallest, info.layer, info.line, + info.side, &expand); + poly_Free (&info.smallest); + poly_Boolean_free (info.brush, expand, &info.brush, PBO_UNITE); + } + } while (found); + SetChangedFlag (true); + IncrementUndoSerialNumber (); + return 0; +} + +static HID_Action jostle_action_list[] = +{ + {"jostle", NULL, jostle, "Move lines out of the way", jostle_syntax}, +}; + +REGISTER_ACTIONS (jostle_action_list) + +void +hid_jostle_init () +{ + register_jostle_action_list (); +} Index: pcb-plugins_sources/src/plugins/lockelements.c =================================================================== --- pcb-plugins_sources/src/plugins/lockelements.c (nonexistent) +++ pcb-plugins_sources/src/plugins/lockelements.c (revision 3870) @@ -0,0 +1,165 @@ +/*! + * \file lockelements.c + * + * \author Copyright (C) 2008 .. 2011 by Bert Timmerman + * + * \brief Unlocking/locking elements plug-in for PCB. + * + * Function to lock all or a selection of PCB elements.\n + * Locked elements can all be unlocked in the same instance.\n + * \n + * Compile like this:\n + * \n + * gcc -Ipath/to/pcb/src -Ipath/to/pcb -O2 -shared lockelements.c -o lockelements.so + * \n\n + * The resulting lockelements.so file should go in $HOME/.pcb/plugins/\n + * \n + * \warning Be very strict in compiling this plug-in against the exact pcb + * sources you compiled/installed the pcb executable (i.e. src/pcb) with.\n + * + * Usage: LockElements([Selected|All])\n + * Usage: UnlockElements(All)\n + * \n + * If no argument is passed, no locking/unlocking of elements is carried out.\n + * \n + * \bug When locking a selection of elements, it is not easy to unselect the + * selection since those elements and their pins/pads/elementlines/elementarcs + * are now locked ;)\n + * This may be thought of as understandable at first, + * but may also be considered to be a bug in pcb.\n + * + *
+ * This program is free software; you can redistribute it and/or modify\n + * it under the terms of the GNU General Public License as published by\n + * the Free Software Foundation; either version 2 of the License, or\n + * (at your option) any later version.\n + * \n + * This program is distributed in the hope that it will be useful,\n + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details.\n + * \n + * You should have received a copy of the GNU General Public License\n + * along with this program; if not, write to:\n + * the Free Software Foundation, Inc.,\n + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n + */ + + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "create.h" +#include "rtree.h" +#include "undo.h" +#include "set.h" +#include "error.h" + +/*! + * \brief Locking all or selected elements. + * + * Usage:\n + * LockElements([Selected|All])\n + * LE([Selected|All])\n + * If no argument is passed, no action is carried out. + */ +static int +lock_elements (int argc, char **argv, Coord x, Coord y) +{ + int selected = 0; + int all = 0; + if (argc > 0 && strcasecmp (argv[0], "Selected") == 0) + selected = 1; + else if (argc >0 && strcasecmp (argv[0], "All") == 0) + all = 1; + else + { + Message ("ERROR: in LockElements argument should be either Selected or All.\n"); + return 1; + } + SET_FLAG (NAMEONPCBFLAG, PCB); + ELEMENT_LOOP(PCB->Data); + { + if (!TEST_FLAG (LOCKFLAG, element)) + { + /* element is not locked */ + if (all) + SET_FLAG(LOCKFLAG, element); + if (selected) + { + if (TEST_FLAG (SELECTEDFLAG, element)) + { + /* better to unselect element first */ + CLEAR_FLAG(SELECTEDFLAG, element); + SET_FLAG(LOCKFLAG, element); + } + } + } + } + END_LOOP; + gui->invalidate_all (); + IncrementUndoSerialNumber (); + return 0; +} + + +/*! + * \brief Locking all or selected elements. + * + * Usage:\n + * UnlockElements(All)\n + * UE(All)\n + * If no argument is passed, no action is carried out. + */ +static int +unlock_elements (int argc, char **argv, Coord x, Coord y) +{ + int all = 0; + if (strcasecmp (argv[0], "All") == 0) + all = 1; + else + { + Message ("ERROR: in UnlockElements argument should be All.\n"); + return 1; + } + SET_FLAG (NAMEONPCBFLAG, PCB); + ELEMENT_LOOP(PCB->Data); + { + if (TEST_FLAG (LOCKFLAG, element)) + { + /* element is locked */ + if (all) + CLEAR_FLAG(LOCKFLAG, element); + } + } + END_LOOP; + gui->invalidate_all (); + IncrementUndoSerialNumber (); + return 0; +} + + +static HID_Action lockelements_action_list[] = +{ + {"LockElements", NULL, lock_elements, "Lock selected or all elements", NULL}, + {"LE", NULL, lock_elements, "Lock selected or all elements", NULL}, + {"UnlockElements", NULL, unlock_elements, "Unlock selected or all elements", NULL}, + {"UE", NULL, unlock_elements, "Unlock selected or all elements", NULL} +}; + + +REGISTER_ACTIONS (lockelements_action_list) + + +void +pcb_plugin_init() +{ + register_lockelements_action_list(); +} + +/* EOF */ Index: pcb-plugins_sources/src/plugins/polycombine.c =================================================================== --- pcb-plugins_sources/src/plugins/polycombine.c (nonexistent) +++ pcb-plugins_sources/src/plugins/polycombine.c (revision 3870) @@ -0,0 +1,382 @@ +/*! + * \file polycombine.c + * + * \brief PolyCombine plug-in for PCB. + * + * \author Copyright (C) 2010 Peter Clifton + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2. + * + * Compile like this: + * + * gcc -I$HOME/pcbsrc/git/src -I$HOME/pcbsrc/git -O2 -shared polycombine.c -o polycombine.so + * + * The resulting polycombine.so goes in $HOME/.pcb/plugins/polycombine.so. + * + * Usage: PolyCombine() + * + * The selected polygons are combined together according to the ordering + * of their points. + */ + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "macro.h" +#include "create.h" +#include "remove.h" +#include "hid.h" +#include "error.h" +#include "rtree.h" +#include "polygon.h" +#include "polyarea.h" +#include "assert.h" +#include "strflags.h" +#include "find.h" +#include "misc.h" +#include "draw.h" +#include "undo.h" + +static POLYAREA * +original_poly (PolygonType * p, bool *forward) +{ + PLINE *contour = NULL; + POLYAREA *np = NULL; + Cardinal n; + Vector v; + int hole = 0; + + *forward = true; + + if ((np = poly_Create ()) == NULL) + return NULL; + + /* first make initial polygon contour */ + for (n = 0; n < p->PointN; n++) + { + /* No current contour? Make a new one starting at point */ + /* (or) Add point to existing contour */ + + v[0] = p->Points[n].X; + v[1] = p->Points[n].Y; + if (contour == NULL) + { + if ((contour = poly_NewContour (v)) == NULL) + return NULL; + } + else + { + poly_InclVertex (contour->head.prev, poly_CreateNode (v)); + } + + /* Is current point last in contour? If so process it. */ + if (n == p->PointN - 1 || + (hole < p->HoleIndexN && n == p->HoleIndex[hole] - 1)) + { + poly_PreContour (contour, TRUE); + + /* Log the direction in which the outer contour was specified */ + if (hole == 0) + *forward = (contour->Flags.orient == PLF_DIR); + + /* make sure it is a positive contour (outer) or negative (hole) */ + if (contour->Flags.orient != (hole ? PLF_INV : PLF_DIR)) + poly_InvContour (contour); + assert (contour->Flags.orient == (hole ? PLF_INV : PLF_DIR)); + + poly_InclContour (np, contour); + contour = NULL; + assert (poly_Valid (np)); + + hole++; + } + } + return np; +} + +typedef struct poly_tree poly_tree; + +struct poly_tree +{ + PolygonType *polygon; + bool forward; + POLYAREA *polyarea; + poly_tree *parent; + poly_tree *child; + poly_tree *prev; + poly_tree *next; +}; + +/*! + *
+ *                      ______
+ *  ___________________|_  P6 |             +P1 ____ +P6
+ * | P1                | |    |              |
+ * |   _____      ____ |_|____|             -P2 ____ -P4 ____ -P5
+ * |  |P2   |    |P5  |  |                   |
+ * |  | []  |    |____|  |                  +P3
+ * |  |  P3 |            |
+ * |  |_____|            |
+ * |                     |
+ * |          ___        |
+ * |         |P4 |       |
+ * |         |___|       |
+ * |                     |
+ * |_____________________|
+ *
+ * 
+ * As we encounter each polygon, it gets a record. We need to check + * whether it contains any of the polygons existing in our tree. If + * it does, it will become the parent of them. (Check breadth first). + * + * When processing, work top down (breadth first), although if the + * contours can be assumed not to overlap, we can drill down in this + * order: P1, P2, P3, P4, P5, P6. + */ +static bool +PolygonContainsPolygon (POLYAREA *outer, POLYAREA *inner) +{ +// int contours_isect; + /* Should check outer contours don't intersect? */ +// contours_isect = Touching (outer, inner); + /* Cheat and assume simple single contour polygons for now */ +// return contours_isect ? +// 0 : poly_ContourInContour (outer->contours, inner->contours); + return poly_ContourInContour (outer->contours, inner->contours); +} + + +static poly_tree * +insert_node_recursive (poly_tree *start_point, poly_tree *to_insert) +{ + poly_tree *cur_node, *next = NULL; +// bool to_insert_isects_cur_node; /* Intersection */ + bool to_insert_contains_cur_node; /* Containment */ + bool cur_node_contains_to_insert; /* Containment */ + bool placed_to_insert = false; + + poly_tree *return_root = start_point; + + if (start_point == NULL) + { +// printf ("start_point is NULL, so returning to_insert\n"); + //to_insert->parent = !!; UNDEFINED + return to_insert; + } + + /* Investigate the start point and its peers first */ + for (cur_node = start_point; cur_node != NULL; cur_node = next) + { + next = cur_node->next; + +// to_insert_isects_cur_node = IsPolygonInPolygon (to_insert->polygon, cur_node->polygon); + to_insert_contains_cur_node = PolygonContainsPolygon (to_insert->polyarea, cur_node->polyarea); + +#if 0 + printf ("Inspecting polygon %ld %s, curnode is %ld %s: to_insert_isects_cur_node = %d, to_insert_contains_cur_node = %i\n", + to_insert->polygon->ID, + to_insert->forward ? "FWD" : "BWD", + cur_node->polygon->ID, + cur_node->forward ? "FWD" : "BWD", + to_insert_isects_cur_node, + to_insert_contains_cur_node); + + if (to_insert_isects_cur_node) /* Place as peer of this node? */ + { + } +#endif + + if (to_insert_contains_cur_node) /* Should be a parent of this node */ + { + /* Remove cur_node from its peers */ + if (cur_node->prev) + cur_node->prev->next = cur_node->next; + if (cur_node->next) + cur_node->next->prev = cur_node->prev; + + /* If we've not yet got a home, insert the to_insert node where cur_node was previously */ + if (!placed_to_insert) + { + to_insert->parent = cur_node->parent; + to_insert->next = cur_node->next; + to_insert->prev = cur_node->prev; + if (to_insert->prev) + to_insert->prev->next = to_insert; + if (to_insert->next) + to_insert->next->prev = to_insert; + placed_to_insert = true; + + if (cur_node == start_point) + return_root = to_insert; + } + + /* Prepend cur_node to our list of children */ + cur_node->parent = to_insert; + + cur_node->prev = NULL; + cur_node->next = to_insert->child; + if (to_insert->child) + to_insert->child->prev = cur_node; + to_insert->child = cur_node; + + } + } + + if (placed_to_insert) + { +// printf ("Returning new root %ld\n", return_root->polygon->ID); + return return_root; + } +// return (to_insert->parent == NULL) ? to_insert : to_insert->parent; + + /* Ok, so we still didn't find anywhere which the to_insert contour contained, + * we need to start looking at the children of the start_point and its peers. + */ +// printf ("Looking at child nodes of the start_point\n"); + + /* Investigate the start point and its peers first */ + for (cur_node = start_point; cur_node != NULL; cur_node = next) + { + next = cur_node->next; + + cur_node_contains_to_insert = PolygonContainsPolygon (cur_node->polyarea, to_insert->polyarea); + +#if 0 + printf ("Inspecting polygon %ld, curnode is %ld: cur_node_contains_to_insert = %d\n", + to_insert->polygon->ID, cur_node->polygon->ID, + cur_node_contains_to_insert); +#endif + + /* Need to look at the child, ONLY if we know it engulfs our to_insert polygon */ + if (cur_node_contains_to_insert) + { + /* Can't set the parent within the call, so: */ + to_insert->parent = cur_node; + cur_node->child = insert_node_recursive (cur_node->child, to_insert); + return start_point; + //return cur_node->parent; + } + } + +// if (!placed_to_insert) + /* prepend to_insert polygon to peer of start_point ? */ +// printf ("Prepending as peer to start_poly\n"); + to_insert->parent = start_point->parent; + to_insert->prev = NULL; + to_insert->next = start_point; + to_insert->next->prev = to_insert; + + return to_insert; +} + +static POLYAREA * +compute_polygon_recursive (poly_tree *root, POLYAREA *accumulate) +{ + POLYAREA *res; + poly_tree *cur_node; + for (cur_node = root; cur_node != NULL; cur_node = cur_node->next) + { + /* Process this element */ +// printf ("Processing node %ld %s\n", cur_node->polygon->ID, cur_node->forward ? "FWD" : "BWD"); + poly_Boolean_free (accumulate, cur_node->polyarea, &res, cur_node->forward ? PBO_UNITE : PBO_SUB); + accumulate = res; + + /* And its children if it has them */ + if (cur_node->child) + { +// printf ("Processing children\n"); + accumulate = compute_polygon_recursive (cur_node->child, accumulate); + } + } + return accumulate; +} + +static int +polycombine (int argc, char **argv, Coord x, Coord y) +{ + POLYAREA *res; + bool forward; +// bool outer; + POLYAREA *np; +// POLYAREA *pa; +// PLINE *pline; +// VNODE *node; +// PolygonType *Polygon; + LayerType *Layer = NULL; + poly_tree *root = NULL; + poly_tree *this_node; + + /* First pass to combine the forward and backward contours */ + VISIBLEPOLYGON_LOOP (PCB->Data); + { + if (!TEST_FLAG (SELECTEDFLAG, polygon)) + continue; + + /* Pick the layer of the first polygon we find selected */ + if (Layer == NULL) + Layer = layer; + + /* Only combine polygons on the same layer */ + if (Layer != layer) + continue; + + np = original_poly (polygon, &forward); + + /* Build a poly_tree record */ + this_node = calloc (1, sizeof (poly_tree)); + this_node->polygon = polygon; + this_node->forward = forward; + this_node->polyarea = np; + + /* Check where we should place the node in the tree */ + root = insert_node_recursive (root, this_node); + + //RemovePolygon (layer, polygon); + } + ENDALL_LOOP; + + /* Now perform a traversal of the tree, computing a polygon */ + res = compute_polygon_recursive (root, NULL); + + SaveUndoSerialNumber (); + + /* Second pass to remove the input polygons */ + VISIBLEPOLYGON_LOOP (PCB->Data); + { + if (!TEST_FLAG (SELECTEDFLAG, polygon)) + continue; + + /* Only combine polygons on the same layer */ + if (Layer != layer) + continue; + + RemovePolygon (layer, polygon); + } + ENDALL_LOOP; + + /* Now de-construct the resulting polygon into raw PCB polygons */ + PolyToPolygonsOnLayer (PCB->Data, Layer, res, + string_to_pcbflags ("clearpoly", NULL)); + RestoreUndoSerialNumber (); + IncrementUndoSerialNumber (); + Draw (); + + return 0; +} + +static HID_Action polycombine_action_list[] = { + {"PolyCombine", "???", polycombine, + NULL, NULL} +}; + +REGISTER_ACTIONS (polycombine_action_list) + +void +pcb_plugin_init() +{ + register_polycombine_action_list(); +} Index: pcb-plugins_sources/src/plugins/polystitch.c =================================================================== --- pcb-plugins_sources/src/plugins/polystitch.c (nonexistent) +++ pcb-plugins_sources/src/plugins/polystitch.c (revision 3870) @@ -0,0 +1,277 @@ +/*! + * \file polystitch.c + * + * \brief PolyStitch plug-in for PCB. + * + * \author Copyright (C) 2010 DJ Delorie + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * http://www.delorie.com/pcb/polystitch.c + * + * Compile like this: + * + * gcc -I$HOME/geda/pcb-cvs/src -I$HOME/geda/pcb-cvs -O2 -shared polystitch.c -o polystitch.so + * + * The resulting polystitch.so goes in $HOME/.pcb/plugins/polystitch.so. + * + * Usage: PolyStitch() + * + * The polygon under the cursor (based on closest-corner) is stitched + * together with the polygon surrounding it on the same layer. + * Use with pstoedit conversions where there's a "hole" in the shape - + * select the hole. + */ + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "macro.h" +#include "create.h" +#include "remove.h" +#include "hid.h" +#include "error.h" +#include "rtree.h" +#include "draw.h" +#include "set.h" +#include "polygon.h" +#include "misc.h" + +static PolygonType *inner_poly, *outer_poly; +static LayerType *poly_layer; + +static double +ATAN2 (PointType a, PointType b) +{ + if (a.X == b.X && a.Y == b.Y) + return 0; + return atan2 ((double)b.Y - a.Y, (double)b.X - a.X); +} + +static double +poly_winding (PolygonType *poly) +{ + double winding, turn; + double prev_angle, this_angle; + int i, n; + + winding = 0; + + prev_angle = ATAN2(poly->Points[0], poly->Points[1]); + n = poly->PointN; + for (i=1; i<=n; i++) + { + this_angle = ATAN2 (poly->Points[i%n], poly->Points[(i+1)%n]); + turn = this_angle - prev_angle; + if (turn < -M_PI) turn += 2*M_PI; + if (turn > M_PI) turn -= 2*M_PI; + winding += turn; + prev_angle = this_angle; + } + return winding; +} + +/*! + * \brief Given the X,Y, find the polygon and set inner_poly and + * poly_layer. + */ +static void +find_crosshair_poly (int x, int y) +{ + double best = 0, dist; + + inner_poly = NULL; + poly_layer = NULL; + + VISIBLEPOLYGON_LOOP (PCB->Data); + { + /* layer, polygon */ + POLYGONPOINT_LOOP (polygon); + { + /* point */ + int dx = x - point->X; + int dy = y - point->Y; + dist = (double)dx*dx + (double)dy*dy; + if (dist < best || inner_poly == NULL) + { + inner_poly = polygon; + poly_layer = layer; + best = dist; + } + } + END_LOOP; + } + ENDALL_LOOP; + if (!inner_poly) + { + Message("Cannot find any polygons"); + return; + } +} + +/*! + * \brief Set outer_poly to the enclosing poly. We assume there's only + * one. + */ +static void +find_enclosing_poly () +{ + outer_poly = NULL; + + POLYGON_LOOP (poly_layer); + { + if (polygon == inner_poly) + continue; + if (polygon->BoundingBox.X1 <= inner_poly->BoundingBox.X1 + && polygon->BoundingBox.X2 >= inner_poly->BoundingBox.X2 + && polygon->BoundingBox.Y1 <= inner_poly->BoundingBox.Y1 + && polygon->BoundingBox.Y2 >= inner_poly->BoundingBox.Y2) + { + outer_poly = polygon; + return; + } + } + END_LOOP; + Message("Cannot find a polygon enclosing the one you selected"); +} + +static void +check_windings () +{ + double iw, ow; + int i, j; + + iw = poly_winding (inner_poly); + ow = poly_winding (outer_poly); + if (iw * ow > 0) + { + /* Wound in same direction, must reverse one. */ + for (i=0, j=inner_poly->PointN-1; + iPoints[i]; + inner_poly->Points[i] = inner_poly->Points[j]; + inner_poly->Points[j] = x; + } + } +} + +/*! + * \brief Rotate the polygon point list around so that point N is the + * first one in the list. + */ +static void +rotate_points (PolygonType *poly, int n) +{ + PointType *np; + int n2 = poly->PointN - n; + + np = (PointType *) malloc (poly->PointN * sizeof(PointType)); + memcpy (np, poly->Points + n, n2 * sizeof (PointType)); + memcpy (np+n2, poly->Points, n * sizeof (PointType)); + memcpy (poly->Points, np, poly->PointN * sizeof(PointType)); + free (np); +} + +/*! + * \brief Make sure the first and last point of the polygon are the same + * point, so we can stitch them properly. + */ +static void +dup_endpoints (PolygonType *poly) +{ + int n = poly->PointN; + if (poly->Points[0].X == poly->Points[n-1].X + && poly->Points[0].Y == poly->Points[n-1].Y) + return; + CreateNewPointInPolygon (poly, poly->Points[0].X, poly->Points[0].Y); +} + +/*! + * \brief Find the two closest points between those polygons, and + * connect them. We assume pstoedit winds the two polygons in opposite + * directions. + */ +static void +stitch_them () +{ + int i, o; + int ii, oo; + double best = -1, dist; + + ErasePolygon (inner_poly); + ErasePolygon (outer_poly); + + /* This is O(n^2) but there's not a lot we can do about that. */ + for (i=0; iPointN; i++) + for (o=0; oPointN; o++) + { + int dx = inner_poly->Points[i].X - outer_poly->Points[o].X; + int dy = inner_poly->Points[i].Y - outer_poly->Points[o].Y; + dist = (double)dx*dx + (double)dy*dy; + if (dist < best || best < 0) + { + ii = i; + oo = o; + best = dist; + } + } + if (ii != 0) + rotate_points (inner_poly, ii); + if (oo != 0) + rotate_points (outer_poly, oo); + dup_endpoints (inner_poly); + dup_endpoints (outer_poly); + + r_delete_entry (poly_layer->polygon_tree, (BoxType *)inner_poly); + r_delete_entry (poly_layer->polygon_tree, (BoxType *)outer_poly); + + for (i=0; iPointN; i++) + CreateNewPointInPolygon (outer_poly, inner_poly->Points[i].X, inner_poly->Points[i].Y); + + SetChangedFlag (true); + + outer_poly->NoHolesValid = 0; + SetPolygonBoundingBox (outer_poly); + r_insert_entry (poly_layer->polygon_tree, (BoxType *)outer_poly, 0); + RemoveExcessPolygonPoints (poly_layer, outer_poly); + InitClip (PCB->Data, poly_layer, outer_poly); + DrawPolygon (poly_layer, outer_poly); + Draw (); + + RemovePolygon (poly_layer, inner_poly); +} + +static int +polystitch (int argc, char **argv, Coord x, Coord y) +{ + find_crosshair_poly (x, y); + if (inner_poly) + { + find_enclosing_poly (); + if (outer_poly) + { + check_windings (); + stitch_them (); + } + } + return 0; +} + +static HID_Action polystitch_action_list[] = { + {"PolyStitch", "Select a corner on the inner polygon", polystitch, + NULL, NULL} +}; + +REGISTER_ACTIONS (polystitch_action_list) + +void +pcb_plugin_init() +{ + register_polystitch_action_list(); +} Index: pcb-plugins_sources/src/plugins/ratsel/Make.Settings =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/Make.Settings (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/Make.Settings (revision 3870) @@ -0,0 +1,3 @@ +PCBDIR=../../../../pcb/ +LIBGCJPATH=/usr/share/java/libgcj.jar + Index: pcb-plugins_sources/src/plugins/ratsel/Makefile =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/Makefile (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/Makefile (revision 3870) @@ -0,0 +1,69 @@ +PCBDIR=../../../../pcb/ +LIBGCJPATH=/usr/share/java/libgcj.jar + +CFLAGS=-O2 -Wall -I$(PCBDIR) -I$(PCBDIR)/src -I. -shared `pkg-config --cflags glib-2.0` +CPPFLAGS=-O2 -Wall -I. +LFLAGS=-lstdc++ -lgcj + +CP=$(LIBGCJPATH):src/:src/ratsel/:./ +INC=-Isrc +COBJS=$(shell ./getFileNames.pl . o c cpp) +JOBJS=$(shell ./getFileNames.pl src o java) +OBJS=$(COBJS) $(JOBJS) +HDRS=$(shell ./getFileNames.pl . h c) $(shell ./getFileNames.pl . hpp cpp) + +JAVAS=$(shell find src/ratsel/ -name '*.java') +JHDRS=src/ratsel/JIFace.h src/ratsel/Location.h src/ratsel/Pin.h src/ratsel/Rat.h + +all: RatSel.so + +RatSel.so: JIFace $(OBJS) + g++ $(LFLAGS) $(OBJS) -shared -o RatSel.so + +%.o:%.c + gcc -c $(CFLAGS) $< -o $@ + +%.o:%.cpp + g++ -c $(CPPFLAGS) $(INC) $< -o $@ + +inst: clean install + +java: + gcj -C $(JAVAS) + +src/ratsel/%.class: src/ratsel/%.java + gcj $(INC) -C $< + +src/ratsel/%.h: src/ratsel/%.class + gcjh -classpath $(CP) $< -o $@ + +JIFace: $(JHDRS) + +test: src/ratsel/JIFace.java + gcj --main=ratsel.JIFace src/ratsel/JIFace.java -o JIFace + +src/ratsel/%.o: src/ratsel/%.java + gcj $(INC) -c $< -o $@ + +cleanJIFace: cleanClasses + rm -f src/ratsel/*.h + +cleanClasses: + rm -f *.o src/ratsel/*.class utst/ratsel/*.class + +.PHONY : install +install : + mkdir -p ~/.pcb/plugins + mv *.so ~/.pcb/plugins + +.PHONY : clean +clean: cleanJIFace + rm -f *.o *~ RatSel.so src/ratsel/*.o + +.PHONY : tar +tar: clean + tar -cjf ../RatSel.tar.bz2 * + +.PHONY : uninstall +uninstall: + rm ~/.pcb/plugins/RatSel.so Index: pcb-plugins_sources/src/plugins/ratsel/cIFace.c =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/cIFace.c (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/cIFace.c (revision 3870) @@ -0,0 +1,200 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +/* + necessity of the .c interface: + It would be better to only have a single C++ interface for connecting PCB and + the Java plugin. But I had compile errors when I tried to inlcude PCB headers + from C++ even with playing extern "C" includes. +*/ + + +#include +#include + + +#include "cIFace.h" +#include "cppIFace.hpp" + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "error.h" +#include "draw.h" +#include "undo.h" + +/* + see pcb/src/macro.h: + ON_SIDE(element, side) \ + (TEST_FLAG (ONSOLDERFLAG, element) == (side == BOTTOM_SIDE)) + + #define TEST_FLAG(F,P) ((P)->Flags.f & (F) ? 1 : 0) + + see pcd/src/?: + int layer = GetLayerNumber (PCB->Data, (LayerTypePtr) ptr1); + + see pcb/src/const.h: + #define BOTTOM_SIDE 0 + #define TOP_SIDE 1 + */ + +void msg(const char * fmt,...) { + va_list ap; + va_start(ap, fmt); + Message(fmt, ap); +} + +int getNetNameN() { + LibraryType lib = PCB->NetlistLib; + return lib.MenuN; +} + +const char * getNetName(int idx) { + LibraryType lib = PCB->NetlistLib; + return lib.Menu[idx].Name; +} + +int getPinNameN(int netNameIdx) { + LibraryMenuType menu = PCB->NetlistLib.Menu[netNameIdx]; + return menu.EntryN; +} + +const char * getPinName(int netNameIdx, int pinIdx) { + LibraryMenuType menu = PCB->NetlistLib.Menu[netNameIdx]; + LibraryEntryType entry = menu.Entry[pinIdx]; + return entry.ListEntry; +} + +#define VEC_INC 32 + +typedef struct Vec { + int rawSize, size; + void **data; +} Vec; + +static void vec_init(Vec *vec) { + vec->rawSize = vec->size = 0; + vec->data = NULL; +} + +static void vec_append(Vec *vec, void *ptr) { + if (vec->size == vec->rawSize) { + vec->rawSize += VEC_INC; + vec->data = realloc(vec->data, vec->rawSize*sizeof(void*)); + } + vec->data[vec->size++] = ptr; +} + +CPin ** getPins() { + Vec pinVec; + vec_init(&pinVec); + ELEMENT_LOOP(PCB->Data); { + PIN_LOOP(element); { + CPin * myPin = (CPin*)malloc(sizeof(CPin)); + myPin->eName = ELEMENT_NAME(PCB, element); + myPin->num = atoi(pin->Number); + myPin->seq = 0; + myPin->x = pin->X; + myPin->y = pin->Y; + myPin->sideMask = SIDE_BOTH; + vec_append(&pinVec, myPin); + } END_LOOP; + PAD_LOOP(element); { + char * name = ELEMENT_NAME(PCB, element); + int num = atoi(pad->Number); + int sideMask = TEST_FLAG (ONSOLDERFLAG, pad) ? SIDE_SOLDER : SIDE_COMPONENT; + CPin * myPin = (CPin*)malloc(sizeof(CPin)); + myPin->eName = name; + myPin->num = num; + myPin->seq = 0; + myPin->x = pad->Point1.X; + myPin->y = pad->Point1.Y; + myPin->sideMask = sideMask; + vec_append(&pinVec, myPin); + myPin = (CPin*)malloc(sizeof(CPin)); + myPin->eName = name; + myPin->num = num; + myPin->seq = 1; + myPin->x = pad->Point2.X; + myPin->y = pad->Point2.Y; + myPin->sideMask = sideMask; + vec_append(&pinVec, myPin); + } END_LOOP; + } END_LOOP; + vec_append(&pinVec, NULL); + return (CPin**)pinVec.data; +} + +void freePins(CPin ** pinA) { + int idx = 0; + if (pinA == NULL) return; + while (pinA[idx]) free(pinA[idx++]); + free(pinA); +} + +/* FIXME: this layer mapping may not be right */ +#define SIDEMASK(group) \ + group == TOP_SIDE ? SIDE_SOLDER : SIDE_COMPONENT; + +CRat ** getRats() { + Vec ratVec; + vec_init(&ratVec); + RAT_LOOP(PCB->Data); { + CRat * myRat = (CRat*)malloc(sizeof(CRat)); + myRat->id = n; + myRat->x0 = line->Point1.X; + myRat->y0 = line->Point1.Y; + myRat->sideMask0 = SIDEMASK(line->group1); + myRat->x1 = line->Point2.X; + myRat->y1 = line->Point2.Y; + myRat->sideMask1 = SIDEMASK(line->group2); + vec_append(&ratVec, myRat); + } END_LOOP; + vec_append(&ratVec, NULL); + return (CRat**)ratVec.data; +} + +void freeRats(CRat ** ratA) { + int idx = 0; + if (ratA == NULL) return; + while (ratA[idx]) free(ratA[idx++]); + free(ratA); +} + +void selectRat(int idx) { + /* + type = SearchScreen (Crosshair.X, Crosshair.Y, SELECT_TYPES, + &ptr1, &ptr2, &ptr3); + */ + /* FIXME is ptr1 a layer? */ + RatType *rat = &(PCB->Data)->Rat[idx]; + /* TODO: add undo FIXME: how? */ + /* AddObjectToFlagUndoList (RATLINE_TYPE, ptr1, ptr1, ptr1); */ + TOGGLE_FLAG (SELECTEDFLAG, rat); + DrawRat (rat); +} + +static int ratSel(int argc, char **argv, int x, int y) { + Message("C:RatSel called\n"); + ratSelCpp(argc, (const char**)argv, x, y); + return 0; +} + +static HID_Action ratSelActionList[] = { + { "RatSel", NULL, ratSel, NULL, NULL } +}; + +REGISTER_ACTIONS (ratSelActionList) + +void pcb_plugin_init() { + register_ratSelActionList(); + Message("cIFace.c:RatSel plugin loaded!\n"); + initJava(); +} Index: pcb-plugins_sources/src/plugins/ratsel/cIFace.h =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/cIFace.h (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/cIFace.h (revision 3870) @@ -0,0 +1,43 @@ +#ifndef CIFACE_H +#define CIFACE_H + +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +#include + +#define SIDE_SOLDER 1 +#define SIDE_COMPONENT 2 +#define SIDE_BOTH (SIDE_SOLDER|SIDE_COMPONENT) + +typedef struct CPin { + const char *eName; + int num, seq, x, y; + int sideMask; +} CPin; + +typedef struct CRat { + int id, x0, y0, sideMask0, x1, y1, sideMask1; +} CRat; + +extern void msg(const char * fmt,...); + +extern int getNetNameN(); +extern const char * getNetName(int idx); +extern int getPinNameN(int netNameIdx); +extern const char * getPinName(int netNameIdx, int pinIdx); + +extern CPin ** getPins(); +extern void freePins(CPin ** pinA); + +extern CRat ** getRats(); +extern void freeRats(CRat ** ratA); + +extern void selectRat(int idx); + +#endif Index: pcb-plugins_sources/src/plugins/ratsel/cppIFace.cpp =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/cppIFace.cpp (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/cppIFace.cpp (revision 3870) @@ -0,0 +1,128 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +#include "cppIFace.hpp" +#include +#include +#include +#include "ratsel/JIFace.h" +#include "ratsel/Pin.h" +#include "ratsel/Rat.h" + +extern "C" { +#include "cIFace.h" +} + +#ifndef NULL +#define NULL 0 +#endif + + +using java::lang::String; +using java::lang::Throwable; + +using ratsel::JIFace; +using ratsel::Pin; +using ratsel::Rat; + +extern "C" void initJava() { + try { + if (JvCreateJavaVM(NULL) < 0) { + msg("Error creating the JVM!\n"); + return; + } + JvAttachCurrentThread(NULL, NULL); + msg("Java initialized...\n"); + } catch (Throwable *t) { + msg("Unhandled Java exception!\n"); + } + return; +} + +void ratsel::JIFace::msg(String * jstr) { + const jchar * chrs = JvGetStringChars(jstr); + jsize size = JvGetStringUTFLength(jstr); + char * str = new char[size+1]; + int i=0; + for(; i * ratsel::JIFace::getPins() { + CPin ** pins = ::getPins(); + if (pins == NULL) return NULL; + int idx = 0; + while (pins[idx]) ++idx; + int length = idx; + JArray *pinA = + (JArray *)JvNewObjectArray(length, &Pin::class$, NULL); + for(idx = 0; idx < length; idx++) { + CPin *pin = pins[idx]; + String *eName = JvNewStringUTF(pin->eName); + Pin *jpin = new Pin( + eName, pin->num, pin->seq, pin->x, pin->y, pin->sideMask + ); + elements(pinA)[idx] = jpin; + } + ::freePins(pins); + return pinA; +} + +JArray * ratsel::JIFace::getRats() { + CRat ** rats = ::getRats(); + if (rats == NULL) return NULL; + int idx = 0; + while (rats[idx]) ++idx; + int length = idx; + JArray *ratA = + (JArray *)JvNewObjectArray(length, &Rat::class$, NULL); + for(idx = 0; idx < length; idx++) { + CRat *rat = rats[idx]; + Rat *jrat = new Rat( + rat->x0, rat->y0, rat->sideMask0, + rat->x1, rat->y1, rat->sideMask1, + rat->id + ); + elements(ratA)[idx] = jrat; + } + ::freeRats(rats); + return ratA; +} + +void ratsel::JIFace::selectRat(jint pIdx) { + ::selectRat(pIdx); +} + +extern "C" int ratSelCpp(int argc, const char **argv, int x, int y) { + msg("C++:hello :)\n"); + jstringArray args = JvConvertArgv(argc, argv); + try { + return ratsel::JIFace::ratSel(args, x, y); + } catch (Throwable *t) { + msg("Exception caught: "); ratsel::JIFace::msg(t->getMessage()); msg("\n"); + } + return 0; +} + Index: pcb-plugins_sources/src/plugins/ratsel/cppIFace.hpp =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/cppIFace.hpp (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/cppIFace.hpp (revision 3870) @@ -0,0 +1,23 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +#ifndef CPPIFACE_H +#define CPPIFACE_H + +#ifdef __cplusplus +extern "C" { +#endif + +void initJava(); +int ratSelCpp(int argc, const char **argv, int x, int y); + +#ifdef __cplusplus +} +#endif + +#endif Index: pcb-plugins_sources/src/plugins/ratsel/getFileNames.pl =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/getFileNames.pl (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/getFileNames.pl (revision 3870) @@ -0,0 +1,26 @@ +#!/usr/bin/perl + +use strict; + +sub usage() { + print STDERR "usage: getFileNames.pl path dstExtension srcExtension0 srcExtension1 ...\n"; + exit 1; +} + +sub getNames($$$) { + my ($path, $dstExt, $srcExt) = @_; + my @find = `find $path -name '*.$srcExt'`; + foreach my $srcPath (@find) { + if ($srcPath =~ s/$srcExt$/$dstExt/) { + print "$srcPath"; + } + } +} + +my $path = shift @ARGV or usage(); +my $dstExt = shift @ARGV or usage(); +my @srcExtList = @ARGV; + +foreach my $srcExt (@srcExtList) { + getNames($path, $dstExt, $srcExt); +} Property changes on: pcb-plugins_sources/src/plugins/ratsel/getFileNames.pl ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Connection.java =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Connection.java (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Connection.java (revision 3870) @@ -0,0 +1,79 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +package ratsel; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Connection { + + private static final float PIN_PENALTY_RATIO = 1.2f; + + private ArrayList iRats; + + private Pin[] iPins; + + private double iLength; + + private Key iKey; + + public static class Key implements Comparable { + + private String[] iPinNames; + + public Key(String[] pPinNames) { + if (pPinNames == null || pPinNames.length != 2) + throw new IllegalArgumentException("Length of pPinNamse must be 2!"); + iPinNames = pPinNames; + // make it pinName order independent + Arrays.sort(iPinNames); + } + + public int compareTo(Key pThat) { + int cmp = iPinNames[0].compareTo(pThat.iPinNames[0]); + return cmp == 0 ? iPinNames[1].compareTo(pThat.iPinNames[1]) : cmp; + } + + public String toString() { + return iPinNames[0] + ", " + iPinNames[1]; + } + } + + public Connection(Pin[] pPins, ArrayList pRats) { + iPins = pPins; iRats = pRats; + calcLength(); + iKey = new Key(new String[] { iPins[0].getName(), iPins[1].getName() }); + } + + public Key getKey() { return iKey; } + + public Pin[] getPins() { return iPins; } + + public List getRats() { return iRats; } + + public double getLength() { return iLength; } + + public String toString() { + return "Pins: "+ iKey.toString() + ", Rats:"+iRats.size(); + } + + private void calcLength() { + for(Rat rat: iRats) { + Location l0 = rat.getLocation(0); + Location l1 = rat.getLocation(1); + int dx = l0.getX() - l1.getX(); + int dy = l0.getY() - l1.getY(); + iLength = Math.sqrt(dx*dx + dy*dy); + } + int mul = iRats.size() - 1; + if (mul > 0) iLength *= (mul * PIN_PENALTY_RATIO); + } + +} \ No newline at end of file Index: pcb-plugins_sources/src/plugins/ratsel/src/ratsel/JIFace.java =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/src/ratsel/JIFace.java (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/src/ratsel/JIFace.java (revision 3870) @@ -0,0 +1,64 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +package ratsel; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + + +public class JIFace { + + public static native void msg(String s); + + public static native int getNetNameN(); + + public static native String getNetName(int pIdx); + + public static native int getPinNameN(int pNetNameIdx); + + public static native String getPinName(int pNetNameIdx, int pPinIdx); + + public static native Pin[] getPins(); + + public static native Rat[] getRats(); + + public static native void selectRat(int pIdx); + + public static void trc(String pMsg) { + System.out.print(pMsg); + msg(pMsg); + } + + public static int ratSel(String[] pArgs, int pX , int pY) { + trc("arguments:\n"); + for(String arg: pArgs) trc(" -> "+arg+"\n"); + if (pArgs.length != 1) { + trc("Error: FileName needed! usage: RatSel(fileName)\n"); + return 1; + } + try { + PCB.importLayout(); + PCB.ratSel(pArgs[0]); + } catch (Exception e) { + trc(toString(e)); + } + return 0; + } + + public static void main(String[] args) { + System.out.println("java main"); + } + + private static String toString(Throwable pThr) { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + pThr.printStackTrace(new PrintStream(os)); + return new String(os.toByteArray()); + } + +} Index: pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Location.java =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Location.java (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Location.java (revision 3870) @@ -0,0 +1,53 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +package ratsel; + +public class Location implements Comparable { + + private int iX, iY; + + private Side iSide; + + public Location(int pX, int pY, Side pSide) { + iX = pX; iY = pY; iSide = pSide; + } + + public Location(int pX, int pY, int pSideMask) { + this(pX, pY, new Side(pSideMask)); + } + + public int getX() { return iX; } + + public int getY() { return iY; } + + public Side getSide() { return iSide; } + + public boolean connects(Location pThat) { + if (iX != pThat.iX || iY != pThat.iY) return false; + if (iSide.connects(pThat.iSide)) return true; + return iSide == pThat.iSide; + } + + public int compareTo(Location pThat) { + int res = iX - pThat.iX; + if (res != 0) return res; + res = iY - pThat.iY; + if (res != 0) return res; + return Side.conCompare(iSide, pThat.iSide); + } + + public int getSideMask() { + return iSide.getSideMask(); + } + + public String toString() { + return "("+iX+", "+iY+", "+iSide+")"; + } + +} \ No newline at end of file Index: pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Net.java =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Net.java (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Net.java (revision 3870) @@ -0,0 +1,87 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +package ratsel; + +import java.util.ArrayList; +import java.util.Set; +import java.util.TreeMap; + +public class Net { + + private String iName; + + private TreeMap iPinNameMap = new TreeMap(); + + private ArrayList iSelecetdPinNames = new ArrayList(); + + public Net(String pNetName) { + iName = pNetName; + } + + public String getName() { + return iName; + } + + public void addPinName(String pPinName) { + iPinNameMap.put(pPinName, null); + } + + public void addSelectedPinName(String pPinName) { + iSelecetdPinNames.add(pPinName); + } + + /** + * @param pPin + */ + public void addPin(Pin pPin) { + String pinName = pPin.getName(); + /* + if (!iPinNameMap.containsKey(pinName)) throw new IllegalArgumentException( + "Net:"+iNetName+" doesn't contain pin:"+pinName+"!" + ); + */ + iPinNameMap.put(pinName, pPin); + } + + public boolean hasPin(String pPinName) { + return iPinNameMap.containsKey(pPinName); + } + + public boolean isSelectedPin(String pPinName) { + return iSelecetdPinNames.contains(pPinName); + } + + public Pin getPin(String pPinName) { + return iPinNameMap.get(pPinName); + } + + public Set getPinNames() { + return iPinNameMap.keySet(); + } + + public ArrayList getSelectedPinNames() { + return iSelecetdPinNames; + } + + public boolean equals(Net pNet) { + return iName.equals(pNet.iName); + } + + public String toString() { + StringBuilder bldr = new StringBuilder(iName+":\n -> "); + boolean more = false; + for(String pinName: iPinNameMap.keySet()) { + if (more) bldr.append(" ,"); else more = true; + bldr.append(pinName); + } + bldr.append('\n'); + return bldr.toString(); + } + +} \ No newline at end of file Index: pcb-plugins_sources/src/plugins/ratsel/src/ratsel/NetList.java =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/src/ratsel/NetList.java (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/src/ratsel/NetList.java (revision 3870) @@ -0,0 +1,82 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +package ratsel; + +import java.util.Collection; +import java.util.TreeMap; + + +/** + * Net in this context represents an electrical node (equipotential node, see Kirchoff node rule). + * From PCB context maybe it is better to call them nets, since they connect wires :) + * In PCB pins which are on the same net (same potential, same Kirchoff node) are called nodes :)
+ * To make life easier the plugin uses a mixed naming :) see table below: + * + * + * + * + *
PCBKirchoffPlugin
NetNodeNet
NodePinPin
+ */ +public class NetList { + + // netName -> net + private TreeMap iNetMap = new TreeMap(); + + // pinName -> net + private TreeMap iPinMap = new TreeMap(); + + public void clear() { + iNetMap.clear(); iPinMap.clear(); + } + + public void addNetName(String pNetName) { + if (iNetMap.containsKey(pNetName)) throw new IllegalArgumentException( + "Net "+pNetName+" is already in NetList!" + ); + iNetMap.put(pNetName, new Net(pNetName)); + } + + /* + * A net contians multiply pins. A pin is connected to only one net. + */ + public void addPinName(String pNetName, String pPinName) { + // add to netMap + Net net = iNetMap.get(pNetName); + if (net == null) { + net = new Net(pNetName); + iNetMap.put(pNetName, net); + } + net.addPinName(pPinName); + // add to pinMap + Net pinNet = iPinMap.get(pPinName); + if (pinNet != null && !pinNet.equals(net)) throw new IllegalArgumentException( + "Pin:"+pPinName+" is already connected to net:"+pinNet.getName()+ + " and cannot be connected to net:"+pNetName+" too!" + ); + iPinMap.put(pPinName, net); + } + + public Collection getNets() { + return iNetMap.values(); + } + + public Net getNet(String pPinName) { + return iPinMap.get(pPinName); + } + + public String toString() { + StringBuilder bldr = new StringBuilder(); + for(Net net: iNetMap.values()) { + bldr.append(net.toString()); + } + return bldr.toString(); + } + +} + Index: pcb-plugins_sources/src/plugins/ratsel/src/ratsel/PCB.java =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/src/ratsel/PCB.java (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/src/ratsel/PCB.java (revision 3870) @@ -0,0 +1,199 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +package ratsel; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; + +public class PCB { + + private static NetList cNetList = new NetList(); + + private static Pin[] cPinA; + + private static Rat[] cRatA; + + private static TreeMap cLocPinMap = new TreeMap(); + + private static TreeMap cPinNameMap = new TreeMap(); + + private static TreeMap cConnectionMap = + new TreeMap(); + + private static SortedSet cSelectedPinSet; + + public static void importLayout() { + cleanLayout(); + importNetList(); + cPinA = JIFace.getPins(); + trc("\nPins:\n"); + for(Pin pin: cPinA) trc(pin+"\n"); + cRatA = JIFace.getRats(); + for(Pin pin: cPinA) { + Pin conflictingPin = cLocPinMap.get(pin); + if (conflictingPin != null) { + warn(pin+" conflicts with "+conflictingPin+", rejecting!!!"); + } else { + cLocPinMap.put(pin, pin); + cPinNameMap.put(pin.getName(), pin); + } + } + // collect pins for rat endpoints + for(Rat rat: cRatA) { + for(int i = 0; i < 2; i++) { + Location loc = rat.getLocation(i); + Pin pin = cLocPinMap.get(loc); + if (pin == null) + warn("No pin for rat location["+i+"]:"+loc); + else + pin.addRat(rat); + rat.setPin(i, pin); + } + } + trc("\nRats:\n"); + for(Rat rat: cRatA) trc(rat+"\n"); + } + + public static void ratSel(String pFileName) throws FileNotFoundException, IOException { + trc("\nratSel("+pFileName+")\n"); + cSelectedPinSet = Parser.parseFile(pFileName); + trc("\nselectedPins:\n"+toStr(cSelectedPinSet)); + for(String pinName: cSelectedPinSet) { + Net net = cNetList.getNet(pinName); + if (net == null) { + warn("pin:"+pinName+" is not connected to any net!"); + continue; + } + if (net.getPin(pinName) == null) + setPins(net); + net.addSelectedPinName(pinName); + } + findConnections(); + selectConnections(); + } + + private static void selectConnections() { + SortedSet pinNameSet = new TreeSet(); + for(Connection con: cConnectionMap.values()) { + trc("con:"+con); + for(Rat rat: con.getRats()) { + trc("selectRat("+rat.getId()+")"); + pinNameSet.add(rat.getPin(0).getName()); + pinNameSet.add(rat.getPin(1).getName()); + JIFace.selectRat(rat.getId()); + } + } + // check + trc("\nselection check...\n"); + for(String pinName: cSelectedPinSet) { + if (!pinNameSet.contains(pinName)) { + warn("Selected pin:"+pinName+" is not reached by a selected rat!"); + } + } + } + + private static void findConnections() { + for(Net net: cNetList.getNets()) { + for(String selPinName: net.getSelectedPinNames()) { + Pin selPin = net.getPin(selPinName); + ArrayList ratList = new ArrayList(); + followRats(ratList, net, selPin, selPin); + } + } + } + + private static void followRats(ArrayList pRatList, Net pNet, Pin pSrcPin, Pin pPin) { + for(Rat rat: pPin.getRats()) { + pRatList.add(rat); + for(Pin ratPin: rat.getPins()) { + if (ratPin == null || ratPin.isTraversed() || pSrcPin.equals(ratPin) || pPin.equals(ratPin)) + continue; + ratPin.setTraversed(true); + if (pNet.isSelectedPin(ratPin.getName())) { + addConnection(pSrcPin, ratPin, pRatList); + } else { + followRats(pRatList, pNet, pSrcPin, ratPin); + } + } + pRatList.remove(pRatList.size()-1); + } + } + + private static void addConnection(Pin pPin0, Pin pPin1, ArrayList pRatList) { + // copy ratList + ArrayList ratList = new ArrayList(pRatList); + Connection con = new Connection(new Pin[] { pPin0, pPin1 }, ratList); + trc("addConnection("+con+")"); + Connection oldCon = cConnectionMap.get(con.getKey()); + if (oldCon == null || con.getLength() < oldCon.getLength()) { + trc("connection added"); + cConnectionMap.put(con.getKey(), con); + } + } + + + private static void msg(String pMsg) { + JIFace.trc(pMsg); + } + + private static void trc(String pMsg) { + //msg("trc:"+pMsg+"\n"); + } + + private static void warn(String pMsg) { + msg("Warning:"+pMsg+"\n"); + } + + private static void setPins(Net pNet) { + for(String pinName: pNet.getPinNames()) { + Pin pin = cPinNameMap.get(pinName); + if (pin == null) throw new IllegalArgumentException( + "net:"+pNet.getName()+" contains undefined pin:"+pinName+"!" + ); + pNet.addPin(pin); + } + } + + private static void importNetList() { + int netN = JIFace.getNetNameN(); + for(int netIdx=0; netIdx pSet) { + StringBuilder bldr = new StringBuilder(); + for(String str: pSet) { + bldr.append(" -> "+ str + "\n"); + } + return bldr.toString(); + } + +} \ No newline at end of file Index: pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Parser.java =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Parser.java (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Parser.java (revision 3870) @@ -0,0 +1,244 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +package ratsel; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.SortedSet; +import java.util.TreeSet; + +/* + R1-2 , R2-1, R3-(1), Opa2-(2,3) + Opa3-(1-5), IC3-( 1, 4,6 -10, 12 ), R20-1 + + pinDefList = pinDef *( ( "," / "\n" ) pinDef ) + pinDef = compName "-" pinNumDef + pinNumDef = pinNum / pinNumGrp + pinNumGrp = "(" grpEntry *( "," grpEntry) ")" + grpEntry = pinNum / pinRange + pinRange = pinNum "-" pinNum + + Out-1, normalized: Out-(1-1) +*/ + +public class Parser { + + private static SortedSet cPinSet; + + private static String cStr; + + private static int cPos, cLinePos, cLineNum; + + public static SortedSet parseFile(String pFileName) + throws FileNotFoundException, IOException { + InputStreamReader reader = new InputStreamReader(new FileInputStream(pFileName)); + StringBuilder bldr = new StringBuilder(); + char[] buf = new char[4096]; + int read; + while ((read = reader.read(buf, 0, buf.length)) >= 0) { + bldr.append(buf, 0, read); + } + return parse(bldr.toString()); + } + + public static SortedSet parse(String pStr) { + if (pStr == null) return null; + cPinSet = new TreeSet(); + cStr = pStr; + cPos = cLinePos = cLineNum = 0; + try { + readPinDefList(); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException( + "Problem at line:" + cLineNum + ", pos:" + cLinePos + " -> "+e.getMessage(), + e + ); + } + return cPinSet; + } + + private static final int EOF = -1; + + private static int getChar() { + if (cPos >= cStr.length()) { ++cPos; return EOF; } + int ch = cStr.charAt(cPos); + ++cPos; + if (ch == '\n') { + ++cLineNum; cLinePos = 0; + } else { + ++cLinePos; + } + return ch; + } + + private static void ungetChar() { + if (cPos <= 0) return; + if (--cPos >= cStr.length()) return; + if (cStr.charAt(cPos) == '\n') { + cLinePos = 0; --cLineNum; + } else { + --cLinePos; + } + } + + private static boolean isAlpha(int pCh) { + return (pCh >= 'a' && pCh <= 'z') || (pCh >= 'A' && pCh <= 'Z'); + } + + private static boolean isNumeric(int pCh) { + return pCh >= '0' && pCh <= '9'; + } + + private static boolean isAlphaNumeric(int pCh) { + return isNumeric(pCh) || isAlpha(pCh); + } + + private static boolean isInSet(int pCh, String pSet) { + return pSet.indexOf(pCh) >= 0; + } + + private static final String WS = " \t\n"; + + private static int getCharSkip(String pToSkip) { + int ch; + do { + ch = getChar(); + } while (isInSet(ch, pToSkip)); + return ch; + } + + private static boolean skip(String pChrs, String pWS) { + int ch = getCharSkip(pWS); + boolean res = isInSet(ch, pChrs); + if (!res) ungetChar(); + return res; + } + + private static boolean skipChar(int ch2skip) { + int ch = getCharSkip(WS); + boolean res = ch2skip == ch; + if (!res) ungetChar(); + return res; + } + + /* + readPinNum: + readNumerics + */ + private static int readPinNum() { + StringBuilder bldr = new StringBuilder(); + int ch = getCharSkip(WS); + if (!isNumeric(ch)) throw new IllegalArgumentException("Number expected!"); + bldr.append((char)ch); + while (true) { + ch = getChar(); + if (!isNumeric(ch)) { ungetChar(); break; } + bldr.append((char)ch); + } + return Integer.parseInt(bldr.toString()); + } + + /* + readGrpEntry: + readPinNum(); if ('-') readPinNum(); + can write the result array + */ + private static void readGrpEntry(String pCompName) { + int startPin = readPinNum(); + trc("startPin:"+startPin); + if (skipChar('-')) { + int endPin = readPinNum(); + trc("endPin:"+endPin); + int inc = endPin > startPin ? 1 : -1; + while (true) { + cPinSet.add(pCompName+"-"+startPin); + if (startPin == endPin) return; + startPin += inc; + } + } else { + cPinSet.add(pCompName+"-"+startPin); + } + } + + + /* + readPinNumGrp: + do { readGrpEntry } while (read ','); + */ + private static void readPinNumGrp(String pCompName) { + if (!skipChar('(')) throw new IllegalArgumentException("'(' expected!"); + do { + readGrpEntry(pCompName); + } while (skipChar(',')); + if (!skipChar(')')) throw new IllegalArgumentException( "')' expected!"); + } + + private static final String UNEXPECTED_END = "Unexpected end of file!"; + + /* + readPinNumDef: + if '(' -> readPinNumGrp else -> readPinNum + can write the result array + */ + private static void readPinNumDef(String pCompName) { + trc("compName:"+pCompName); + int ch = getCharSkip(WS); + if (ch == EOF) throw new IllegalArgumentException(UNEXPECTED_END); + ungetChar(); + if (ch == '(') { + readPinNumGrp(pCompName); + } else { + int pinNum = readPinNum(); + cPinSet.add(pCompName+"-"+pinNum); + } + } + + private static final String PINNAME_EXPECTED = "Pin name expected!"; + + /* + readPinDef: + readTill '-' readPinNumDef + */ + private static void readPinDef() { + StringBuilder bldr = new StringBuilder(); + int ch = getCharSkip(WS); + if (ch == EOF) return; + if (!isAlpha(ch)) throw new IllegalArgumentException(PINNAME_EXPECTED); + bldr.append((char)ch); + while (true) { + ch = getChar(); + if (ch == EOF) throw new IllegalArgumentException(UNEXPECTED_END); + if (!isAlphaNumeric(ch) && !isInSet(ch, ".-_")) + throw new IllegalArgumentException(PINNAME_EXPECTED); + if (ch == '-') { + break; + } else { + bldr.append((char)ch); + } + } + readPinNumDef(bldr.toString()); + } + + /* + readPinDefList: + readPinDef *( read(',' / 'n') ) readPinDef + */ + private static void readPinDefList() { + do { + readPinDef(); + } while (skip(",\n", " \t")); + } + + private static void trc(String pMsg) { + //System.out.println("TRC:"+pMsg); + } + +} Index: pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Pin.java =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Pin.java (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Pin.java (revision 3870) @@ -0,0 +1,93 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +package ratsel; + +import java.util.ArrayList; + +public class Pin extends Location { + + private String iName; + private String iElementName; + private int iNum; + private int iSeq; + private ArrayList iRats = new ArrayList(); + private boolean iTraversed; + + public Pin(String pElementName, int pNum, int pSeq, int pX, int pY, Side pSide) { + super(pX, pY, pSide); + iElementName = pElementName; + iNum = pNum; + iSeq = pSeq; + iName = pElementName+"-"+pNum; + iTraversed = false; + } + + public Pin(String pElementName, int pNum, int pSeq, int pX, int pY, int pSideMask) { + this(pElementName, pNum, pSeq, pX, pY, new Side(pSideMask)); + } + + public Pin(String pName, int pSeq, int pX, int pY, Side pSide) { + super(pX, pY, pSide); + iName = pName; iSeq = pSeq; + explodeName(); + } + + public Pin(String pName, int pSeq, int pX, int pY, int pSideMask) { + this(pName, pSeq, pX, pY, new Side(pSideMask)); + } + + public String getName() { return iName; } + + public String getElementName() { return iElementName; } + + public int getNum() { return iNum; } + + /** + * The seq property is introduced to support PCB style pads, which are represented as lines. + * They have to coordinates where rats can connect to. + * Here in the plugin a pad is represented by 2 pins with the same name but different seq + * values (0 and 1). + * @return + */ + public int getSeq() { return iSeq; } + + public boolean isTraversed() { return iTraversed; } + + public void setTraversed(boolean pVal) { iTraversed = pVal; } + + public String toString() { + return "Pin("+iName+", "+super.toString()+")"; + } + + public boolean equals(Pin pThat) { + if (pThat == null) return false; + return iName.equals(pThat.iName); + } + + public void addRat(Rat pRat) { + iRats.add(pRat); + } + + public ArrayList getRats() { + return iRats; + } + + private void explodeName() { + int idx = iName.indexOf('-'); + if (idx < 0) throw new IllegalArgumentException( + "pinName:"+iName+" doesn't contain the '-' separator character!" + ); + if (idx == iName.length()-1) throw new IllegalArgumentException( + "In pinName:"+iName+" pinNumber is expected after the '-' character!" + ); + iElementName = iName.substring(0, idx); + iNum = Integer.parseInt(iName.substring(idx+1)); + } + +} \ No newline at end of file Index: pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Rat.java =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Rat.java (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Rat.java (revision 3870) @@ -0,0 +1,56 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +package ratsel; + + +public class Rat { + + private Location[] iLocs; + + private Pin[] iPins; + + private int iId; + + public Rat(Location[] pLocs, int pId) { + iLocs = pLocs; + iPins = new Pin[] { null, null }; + iId = pId; + } + + public Rat(Location pLoc0, Location pLoc1, int pId) { + this(new Location[] { pLoc0, pLoc1 }, pId); + } + + public Rat(int pX0, int pY0, int pSideMask0, int pX1, int pY1, int pSideMask1, int pId) { + this( + new Location[] { + new Location(pX0, pY0, pSideMask0), new Location(pX1, pY1, pSideMask1) + }, pId + ); + } + + public Location getLocation(int pIdx) { return iLocs[pIdx]; } + + public Pin getPin(int pIdx) { return iPins[pIdx]; } + + public Pin[] getPins() { return iPins; } + + public void setPin(int pIdx, Pin pPin) { iPins[pIdx] = pPin; } + + public int getId() { return iId; } + + public String toString() { + return "Rat("+getLoc(0)+", "+getLoc(1)+")"; + } + + private String getLoc(int pIdx) { + return iPins[pIdx] != null ? iPins[pIdx].toString() : iLocs[pIdx].toString(); + } + +} \ No newline at end of file Index: pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Side.java =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Side.java (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/src/ratsel/Side.java (revision 3870) @@ -0,0 +1,54 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + + +package ratsel; + +import java.util.Comparator; + +public class Side { + + public static final int SOLDER = 1; + + public static final int COMPONENT = 2; + + public static final int BOTH = SOLDER|COMPONENT; + + private final String[] NAMES = { "none", "solder", "component", "both" }; + + public static int conCompare(Side pSide0, Side pSide1) { + if (pSide0.connects(BOTH) || pSide0.connects(BOTH)) return 0; + return pSide0.getSideMask() - pSide1.getSideMask(); + } + + public static final Comparator CON_COMP = new Comparator() { + public int compare(Side pSide0, Side pSide1) { + return conCompare(pSide0, pSide1); + } + }; + + private int iMask; + + public Side(int pMask) { iMask = pMask; } + + public int getSideMask() { return iMask; } + + public boolean connects(int pFlag) { + return (iMask & pFlag) > 0; + } + + public boolean connects(Side pThat) { + return connects(pThat.iMask); + } + + public String toString() { + return NAMES[iMask]; + } + + +} \ No newline at end of file Index: pcb-plugins_sources/src/plugins/ratsel/utst/ratsel/ParserTest.java =================================================================== --- pcb-plugins_sources/src/plugins/ratsel/utst/ratsel/ParserTest.java (nonexistent) +++ pcb-plugins_sources/src/plugins/ratsel/utst/ratsel/ParserTest.java (revision 3870) @@ -0,0 +1,42 @@ +/* + Copyright (C) 2008 Endre Bak + + Licensed under the terms of the GNU General Public License, version + 2 or later. + +*/ + +package ratsel; + +import java.util.SortedSet; + +import junit.framework.TestCase; + +public class ParserTest extends TestCase { + + private static final String DATA = + "\n\nR1-2 , R2-1, R3-(1), Opa2-(2,3)\n"+ + "Opa3-(1-5), IC3-( 1, 4,6 -10, 12 ), R20-1\n"; + + private static final String[] PINNAMES = { + "R1-2", "R2-1", "R3-1", "Opa2-2", "Opa2-3", + "Opa3-1", "Opa3-2", "Opa3-3", "Opa3-4", "Opa3-5", + "IC3-1", "IC3-4", "IC3-6", "IC3-7", "IC3-8", "IC3-9", "IC3-10", "IC3-12", + "R20-1" + }; + + public void testParse() { + SortedSet pinSet = Parser.parse(DATA); + assertTrue( + "Size mismatch! pinSet.size()="+pinSet.size()+ + ", PINNAMES.length="+PINNAMES.length, + pinSet.size() == PINNAMES.length + ); + for(String pinName: pinSet) { + assertTrue( + "pinName:"+pinName+" is not contained in pinSet!", pinSet.contains(pinName) + ); + } + } + +} \ No newline at end of file Index: pcb-plugins_sources/src/plugins/renumberblock.c =================================================================== --- pcb-plugins_sources/src/plugins/renumberblock.c (nonexistent) +++ pcb-plugins_sources/src/plugins/renumberblock.c (revision 3870) @@ -0,0 +1,146 @@ +/*! + * \file renumberblock.c + * + * \brief RenumberBlock plug-in for PCB. + * + * \author Copyright (C) 2006 DJ Delorie + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * http://www.delorie.com/pcb/renumberblock.c + * + * Compile like this: + * + * gcc -I$HOME/geda/pcb-cvs/src -I$HOME/geda/pcb-cvs -O2 -shared renumberblock.c -o renumberblock.so + * + * The resulting renumberblock.so goes in + * $HOME/.pcb/plugins/renumberblock.so. + * + * Usage: RenumberBlock(oldnum,newnum) + * + * All selected elements are renumbered by adding (newnum-oldnum) to + * the existing number. I.e. RenumberBlock(100,200) will change R213 + * to R313. + * + * Usage: RenumberBuffer(oldnum,newnum) + * + * Same, but the paste buffer is renumbered. + */ + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "create.h" +#include "rtree.h" +#include "undo.h" +#include "error.h" +#include "change.h" + +static int +renumber_block (int argc, char **argv, Coord x, Coord y) +{ + char num_buf[15]; + int old_base, new_base; + + if (argc < 2) { + Message("Usage: RenumberBlock oldnum newnum"); + return 1; + } + + old_base = atoi (argv[0]); + new_base = atoi (argv[1]); + + SET_FLAG (NAMEONPCBFLAG, PCB); + + ELEMENT_LOOP (PCB->Data); + { + char *refdes_split, *cp; + char *old_ref, *new_ref; + int num; + + if (!TEST_FLAG (SELECTEDFLAG, element)) + continue; + + old_ref = element->Name[1].TextString; + for (refdes_split=cp=old_ref; *cp; cp++) + if (!isdigit(*cp)) + refdes_split = cp+1; + + num = atoi (refdes_split); + num += (new_base - old_base); + sprintf(num_buf, "%d" ,num); + new_ref = (char *) malloc (refdes_split - old_ref + strlen(num_buf) + 1); + memcpy (new_ref, old_ref, refdes_split - old_ref); + strcpy (new_ref + (refdes_split - old_ref), num_buf); + + AddObjectToChangeNameUndoList (ELEMENT_TYPE, NULL, NULL, + element, + NAMEONPCB_NAME (element)); + + ChangeObjectName (ELEMENT_TYPE, element, NULL, NULL, new_ref); + } + END_LOOP; + IncrementUndoSerialNumber (); + return 0; +} + +static int +renumber_buffer (int argc, char **argv, Coord x, Coord y) +{ + char num_buf[15]; + int old_base, new_base; + + if (argc < 2) { + Message("Usage: RenumberBuffer oldnum newnum"); + return 1; + } + + old_base = atoi (argv[0]); + new_base = atoi (argv[1]); + + SET_FLAG (NAMEONPCBFLAG, PCB); + + ELEMENT_LOOP (PASTEBUFFER->Data); + { + char *refdes_split, *cp; + char *old_ref, *new_ref; + int num; + + old_ref = element->Name[1].TextString; + for (refdes_split=cp=old_ref; *cp; cp++) + if (!isdigit(*cp)) + refdes_split = cp+1; + + num = atoi (refdes_split); + num += (new_base - old_base); + sprintf(num_buf, "%d" ,num); + new_ref = (char *) malloc (refdes_split - old_ref + strlen(num_buf) + 1); + memcpy (new_ref, old_ref, refdes_split - old_ref); + strcpy (new_ref + (refdes_split - old_ref), num_buf); + + ChangeObjectName (ELEMENT_TYPE, element, NULL, NULL, new_ref); + } + END_LOOP; + return 0; +} + +static HID_Action renumber_block_action_list[] = { + {"RenumberBlock", NULL, renumber_block, + NULL, NULL}, + {"RenumberBuffer", NULL, renumber_buffer, + NULL, NULL} +}; + +REGISTER_ACTIONS (renumber_block_action_list) + +void +pcb_plugin_init() +{ + register_renumber_block_action_list(); +} Index: pcb-plugins_sources/src/plugins/sedrename.c =================================================================== --- pcb-plugins_sources/src/plugins/sedrename.c (nonexistent) +++ pcb-plugins_sources/src/plugins/sedrename.c (revision 3870) @@ -0,0 +1,148 @@ +/*! + * \file sedrename.c + * + * \brief Sed rename plug-in for PCB. + * + * \author Copyright (C) 2008 Peter Clifton + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * Compile like this: + * + * gcc -Wall -I$HOME/pcbsrc/pcb.clean/src -I$HOME/pcbsrc/pcb.clean -O2 -shared sedrename.c -o sedrename.so + * + * The resulting sedrename.so goes in $HOME/.pcb/plugins/sedrename.so. + */ + +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "create.h" +#include "error.h" +#include "change.h" +#include "rtree.h" +#include "undo.h" + +static int +sedrename (int argc, char **argv, Coord x, Coord y) +{ + FILE *fp; + int result = STATUS_OK; + char *sed_prog = "sed "; + char *sed_postfix = " > sedrename.tmp"; + char *sed_arguments; + char *sed_cmd; + + static char *last_argument = NULL; + + if (last_argument == NULL) + last_argument = strdup ("s///"); + +#if 0 + if (argc != 1) + { + Message("Usage: sedrename sed_expression"); + return 1; + } + + sed_arguments = argv[0]; +#else + if (argc != 0) + { + Message("Usage: sedrename"); + return 1; + } + + sed_arguments = gui->prompt_for ("sedrename", last_argument); + if (sed_arguments == NULL) + { + Message("Got null for sed arguments"); + return 1; + } + free (last_argument); + last_argument = sed_arguments; +#endif + + sed_cmd = (char *) malloc (strlen (sed_prog) + strlen (sed_arguments) + strlen (sed_postfix) + 1); + memcpy (sed_cmd, sed_prog, strlen (sed_prog) + 1); + strcpy (sed_cmd + strlen (sed_prog), sed_arguments); + strcpy (sed_cmd + strlen (sed_prog) + strlen (sed_arguments), sed_postfix); + + printf ("Calling sed: '%s'\n", sed_cmd); + + if ((fp = popen (sed_cmd, "w")) == NULL) + { + PopenErrorMessage (sed_cmd); + free (sed_cmd); + return STATUS_ERROR; + } + + free (sed_cmd); + + SET_FLAG (NAMEONPCBFLAG, PCB); + + ELEMENT_LOOP (PCB->Data); + { + + if (!TEST_FLAG (SELECTEDFLAG, element)) + continue; + + /* BADNESS.. IF SED DOESN'T MATCH OUTPUT LINE FOR LINE, WE STALL */ + fprintf (fp, "%s\n", element->Name[1].TextString); + } + END_LOOP; + + if (pclose (fp)) + return STATUS_ERROR; + + if ((fp = fopen ("sedrename.tmp", "rb")) == NULL) + { + Message("Cannot open sedrename.tmp for reading"); + return STATUS_ERROR; + } + + ELEMENT_LOOP (PCB->Data); + { + char *new_ref; + + if (!TEST_FLAG (SELECTEDFLAG, element)) + continue; + + if (fscanf (fp, "%as", &new_ref) != EOF) + { + printf ("Send '%s', got '%s'\n", element->Name[1].TextString, new_ref); + + AddObjectToChangeNameUndoList (ELEMENT_TYPE, NULL, NULL, + element, + NAMEONPCB_NAME (element)); + + ChangeObjectName (ELEMENT_TYPE, element, NULL, NULL, new_ref); + } + } + END_LOOP; + + gui->invalidate_all (); + + IncrementUndoSerialNumber (); + + return (fclose (fp) ? STATUS_ERROR : result); +} + +static HID_Action sedrename_action_list[] = { + {"sedrename", NULL, sedrename, + NULL, NULL} +}; + +REGISTER_ACTIONS (sedrename_action_list) + +void +pcb_plugin_init() +{ + register_sedrename_action_list(); +} + Index: pcb-plugins_sources/src/plugins/smartdisperse.c =================================================================== --- pcb-plugins_sources/src/plugins/smartdisperse.c (nonexistent) +++ pcb-plugins_sources/src/plugins/smartdisperse.c (revision 3870) @@ -0,0 +1,284 @@ +/*! + * \file smartdisperse.c + * + * \brief Smartdisperse plug-in for PCB. + * + * \author Copyright (C) 2007 Ben Jackson based on + * teardrops.c by Copyright (C) 2006 DJ Delorie as well + * as the original action.c, and autoplace.c. + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * Improve the initial dispersion of elements by choosing an order based + * on the netlist, rather than the arbitrary element order. This isn't + * the same as a global autoplace, it's more of a linear autoplace. It + * might make some useful local groupings. For example, you should not + * have to chase all over the board to find the resistor that goes with + * a given LED. + */ + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "create.h" +#include "rtree.h" +#include "undo.h" +#include "rats.h" +#include "error.h" +#include "move.h" +#include "draw.h" +#include "set.h" + +#define GAP 10000 +static Coord minx; +static Coord miny; +static Coord maxx; +static Coord maxy; + +/*! + * \brief Place one element. + * + * Must initialize statics above before calling for the first time. + * + * This is taken almost entirely from ActionDisperseElements, with cleanup + */ +static void +place (ElementType *element) +{ + Coord dx, dy; + + /* figure out how much to move the element */ + dx = minx - element->BoundingBox.X1; + dy = miny - element->BoundingBox.Y1; + + /* snap to the grid */ + dx -= (element->MarkX + dx) % (long) (PCB->Grid); + dx += (long) (PCB->Grid); + dy -= (element->MarkY + dy) % (long) (PCB->Grid); + dy += (long) (PCB->Grid); + + /* + * and add one grid size so we make sure we always space by GAP or + * more + */ + dx += (long) (PCB->Grid); + + /* Figure out if this row has room. If not, start a new row */ + if (minx != GAP && GAP + element->BoundingBox.X2 + dx > PCB->MaxWidth) + { + miny = maxy + GAP; + minx = GAP; + place(element); /* recurse can't loop, now minx==GAP */ + return; + } + + /* move the element */ + MoveElementLowLevel (PCB->Data, element, dx, dy); + + /* and add to the undo list so we can undo this operation */ + AddObjectToMoveUndoList (ELEMENT_TYPE, NULL, NULL, element, dx, dy); + + /* keep track of how tall this row is */ + minx += element->BoundingBox.X2 - element->BoundingBox.X1 + GAP; + if (maxy < element->BoundingBox.Y2) + { + maxy = element->BoundingBox.Y2; + } +} + +/*! + * \brief Return the X location of a connection's pad or pin within its + * element. + */ +static Coord +padDX (ConnectionType *conn) +{ + ElementType *element = (ElementType *) conn->ptr1; + AnyLineObjectType *line = (AnyLineObjectType *) conn->ptr2; + + return line->BoundingBox.X1 - + (element->BoundingBox.X1 + element->BoundingBox.X2) / 2; +} + +/*! + * \brief Return true if ea,eb would be the best order, else eb,ea, + * based on pad loc. + */ +static int +padorder (ConnectionType *conna, ConnectionType *connb) +{ + Coord dxa, dxb; + + dxa = padDX (conna); + dxb = padDX (connb); + /* there are other cases that merit rotation, ignore them for now */ + if (dxa > 0 && dxb < 0) + return 1; + return 0; +} + +/* ewww, these are actually arrays */ +#define ELEMENT_N(DATA,ELT) ((ELT) - (DATA)->Element) +#define VISITED(ELT) (visited[ELEMENT_N(PCB->Data, (ELT))]) +#define IS_ELEMENT(CONN) ((CONN)->type == PAD_TYPE || (CONN)->type == PIN_TYPE) + +#define ARG(n) (argc > (n) ? argv[n] : 0) + +static const char smartdisperse_syntax[] = "SmartDisperse([All|Selected])"; + +static int +smartdisperse (int argc, char **argv, Coord x, Coord y) +{ + char *function = ARG(0); + NetListType *Nets; + char *visited; +// PointerListType stack = { 0, 0, NULL }; + int all; +// int changed = 0; +// int i; + + if (! function) + { + all = 1; + } + else if (strcmp(function, "All") == 0) + { + all = 1; + } + else if (strcmp(function, "Selected") == 0) + { + all = 0; + } + else + { + AFAIL (smartdisperse); + } + + Nets = ProcNetlist (&PCB->NetlistLib); + if (! Nets) + { + Message (_("Can't use SmartDisperse because no netlist is loaded.\n")); + return 0; + } + + /* remember which elements we finish with */ + visited = calloc (PCB->Data->ElementN, sizeof(*visited)); + + /* if we're not doing all, mark the unselected elements as "visited" */ + ELEMENT_LOOP (PCB->Data); + { + if (! (all || TEST_FLAG (SELECTEDFLAG, element))) + { + visited[n] = 1; + } + } + END_LOOP; + + /* initialize variables for place() */ + minx = GAP; + miny = GAP; + maxx = GAP; + maxy = GAP; + + /* + * Pick nets with two connections. This is the start of a more + * elaborate algorithm to walk serial nets, but the datastructures + * are too gross so I'm going with the 80% solution. + */ + NET_LOOP (Nets); + { + ConnectionType *conna, *connb; + ElementType *ea, *eb; +// ElementType *epp; + + if (net->ConnectionN != 2) + continue; + + conna = &net->Connection[0]; + connb = &net->Connection[1]; + if (!IS_ELEMENT(conna) || !IS_ELEMENT(conna)) + continue; + + ea = (ElementType *) conna->ptr1; + eb = (ElementType *) connb->ptr1; + + /* place this pair if possible */ + if (VISITED((GList *)ea) || VISITED((GList *)eb)) + continue; + VISITED ((GList *)ea) = 1; + VISITED ((GList *)eb) = 1; + + /* a weak attempt to get the linked pads side-by-side */ + if (padorder(conna, connb)) + { + place ((ElementType *) ea); + place ((ElementType *) eb); + } + else + { + place (eb); + place (ea); + } + } + END_LOOP; + + /* Place larger nets, still grouping by net */ + NET_LOOP (Nets); + { + CONNECTION_LOOP (net); + { + ElementType *element; + + if (! IS_ELEMENT(connection)) + continue; + + element = (ElementType *) connection->ptr1; + + /* place this one if needed */ + if (VISITED ((GList *) element)) + continue; + VISITED ((GList *) element) = 1; + place (element); + } + END_LOOP; + } + END_LOOP; + + /* Place up anything else */ + ELEMENT_LOOP (PCB->Data); + { + if (! visited[n]) + { + place (element); + } + } + END_LOOP; + + free (visited); + + IncrementUndoSerialNumber (); + Redraw (); + SetChangedFlag (1); + + return 0; +} + +static HID_Action +smartdisperse_action_list[] = +{ + {"smartdisperse", NULL, smartdisperse, NULL, NULL} +}; + +REGISTER_ACTIONS (smartdisperse_action_list) + +void +hid_smartdisperse_init () +{ + register_smartdisperse_action_list (); +} Index: pcb-plugins_sources/src/plugins/teardrops.c =================================================================== --- pcb-plugins_sources/src/plugins/teardrops.c (nonexistent) +++ pcb-plugins_sources/src/plugins/teardrops.c (revision 3870) @@ -0,0 +1,374 @@ +/*! + * \file teardrops.c + * + * \brief Teardrops plug-in for PCB. + * + * \author Copyright (C) 2006 DJ Delorie + * + * \copyright Licensed under the terms of the GNU General Public + * License, version 2 or later. + * + * http://www.delorie.com/pcb/teardrops/ +*/ + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "create.h" +#include "rtree.h" +#include "undo.h" + +#define MIN_LINE_LENGTH 700 +#define MAX_DISTANCE 700 +/* changed MAX_DISTANCE to 0.5 mm below */ + /* 0.5mm */ +/* #define MAX_DISTANCE 500000 */ +/* #define MAX_DISTANCE 2000000 */ + /* 1 mm */ +/* #define MAX_DISTANCE 1000000 */ + +static PinType *pin; +static PadType *pad; +static int layer; +static int px, py; +static LayerType *silk; +static Coord thickness; +static ElementType *element; + +static int new_arcs = 0; + +int +distance_between_points (int x1, int y1, int x2, int y2) +{ + /* int a; */ + /* int b; */ + int distance; + /* a = (x1-x2); */ + /* b = (y1-y2); */ + distance = sqrt ((pow ( x1 - x2, 2 )) + (pow ( y1 - y2 , 2))); + return distance; +} + +static int +check_line_callback (const BoxType *box, void *cl) +{ + LayerType *lay = & PCB->Data->Layer[layer]; + LineType *l = (LineType *) box; + int x1, x2, y1, y2; + double a, b, c, x, r, t; + double dx, dy, len; + double ax, ay, lx, ly, theta; + double ldist, adist, radius; + double vx, vy, vr, vl; + int delta, aoffset, count; + ArcType *arc; + + fprintf (stderr, "...Line ((%.6f, %.6f), (%.6f, %.6f)): ", + COORD_TO_MM(l->Point1.X), + COORD_TO_MM(l->Point1.Y), + COORD_TO_MM(l->Point2.X), + COORD_TO_MM(l->Point2.Y)); + + /* if our line is to short ignore it */ + if (distance_between_points (l->Point1.X, l->Point1.Y, l->Point2.X, l->Point2.Y) < MIN_LINE_LENGTH ) + { + fprintf (stderr, "not within max line length\n"); + return 1; + } + + fprintf (stderr, "......Point (%.6f, %.6f): ", + COORD_TO_MM(px), + COORD_TO_MM(py)); + + if (distance_between_points (l->Point1.X, l->Point1.Y, px, py) < MAX_DISTANCE) + { + x1 = l->Point1.X; + y1 = l->Point1.Y; + x2 = l->Point2.X; + y2 = l->Point2.Y; + } + else if (distance_between_points (l->Point2.X, l->Point2.Y, px, py) < MAX_DISTANCE) + { + x1 = l->Point2.X; + y1 = l->Point2.Y; + x2 = l->Point1.X; + y2 = l->Point1.Y; + } + else + { + fprintf (stderr, "not within max distance\n"); + return 1; + } + + /* r = pin->Thickness / 2.0; */ + r = thickness / 2.0; + t = l->Thickness / 2.0; + + if (t > r) + { + fprintf (stderr, "t > r: t = %3.6f, r = %3.6f\n", + COORD_TO_MM(t), + COORD_TO_MM(r)); + return 1; + } + + a = 1; + b = 4 * t - 2 * r; + c = 2 * t * t - r * r; + + x = (-b + sqrt (b * b - 4 * a * c)) / (2 * a); + + len = sqrt (((double) x2-x1)*(x2-x1) + ((double) y2-y1)*(y2-y1)); + + if (len > (x+t)) + { + adist = ldist = x + t; + radius = x + t; + delta = 45; + + if (radius < r || radius < t) + { + fprintf (stderr, + "(radius < r || radius < t): radius = %3.6f, r = %3.6f, t = %3.6f\n", + COORD_TO_MM(radius), + COORD_TO_MM(r), + COORD_TO_MM(t)); + return 1; + } + } + else if (len > r + t) + { + /* special "short teardrop" code */ + + x = (len * len - r * r + t * t) / (2 * (r - t)); + ldist = len; + adist = x + t; + radius = x + t; + delta = atan2 (len, x + t) * 180.0 / M_PI; + } + else + return 1; + + dx = ((double) x2 - x1) / len; + dy = ((double) y2 - y1) / len; + theta = atan2 (y2 - y1, x1 - x2) * 180.0 / M_PI; + + lx = px + dx * ldist; + ly = py + dy * ldist; + + /* We need one up front to determine how many segments it will take + to fill. */ + ax = lx - dy * adist; + ay = ly + dx * adist; + vl = sqrt (r * r - t * t); + vx = px + dx * vl; + vy = py + dy * vl; + vx -= dy * t; + vy += dx * t; + vr = sqrt ((ax-vx) * (ax-vx) + (ay-vy) * (ay-vy)); + + aoffset = 0; + count = 0; + do + { + if (++count > 5) + { + fprintf(stderr,"......a %d,%d v %d,%d adist %g radius %g vr %g\n", + (int) ax, + (int) ay, + (int) vx, + (int) vy, + adist, + radius, + vr); + printf("a %d,%d v %d,%d adist %g radius %g vr %g\n", + (int) ax, + (int) ay, + (int) vx, + (int) vy, + adist, + radius, + vr); + return 1; + } + + ax = lx - dy * adist; + ay = ly + dx * adist; + + arc = CreateNewArcOnLayer (lay, (int) ax, (int) ay, (int) radius, + (int) radius, (int) theta + 90 + aoffset, delta - aoffset, + l->Thickness, l->Clearance, l->Flags); + if (arc) + AddObjectToCreateUndoList (ARC_TYPE, lay, arc, arc); + + ax = lx + dy * (x+t); + ay = ly - dx * (x+t); + + arc = CreateNewArcOnLayer (lay, (int) ax, (int) ay, (int) radius, + (int) radius, (int) theta - 90 - aoffset, - delta + aoffset, + l->Thickness, l->Clearance, l->Flags); + if (arc) + AddObjectToCreateUndoList (ARC_TYPE, lay, arc, arc); + + radius += t * 1.9; + aoffset = acos ((double) adist / radius) * 180.0 / M_PI; + + new_arcs ++; + } while (vr > radius - t); + + fprintf (stderr,"done arc'ing\n"); + return 1; +} + +static void +check_pin (PinType *_pin) +{ + BoxType spot; + + pin = _pin; + + px = pin->X; + py = pin->Y; + thickness = pin->Thickness; + + spot.X1 = px - 10; + spot.Y1 = py - 10; + spot.X2 = px + 10; + spot.Y2 = py + 10; + + element = (ElementType *) pin->Element; + + fprintf (stderr, + "Pin %s (%s) at %.6f, %.6f (element %s, %s, %s)\n", + EMPTY (pin->Number), EMPTY (pin->Name), + /* 0.01 * pin->X, 0.01 * pin->Y, */ + COORD_TO_MM(pin->X), COORD_TO_MM(pin->Y), + EMPTY (NAMEONPCB_NAME (element)), + EMPTY (VALUE_NAME (element)), + EMPTY (DESCRIPTION_NAME (element))); + + for (layer = 0; layer < max_copper_layer; layer ++) + { + LayerType * l = &(PCB->Data->Layer[layer]); + r_search (l->line_tree, &spot, NULL, check_line_callback, l); + } +} + +static void +check_via (PinType *_pin) +{ + BoxType spot; + + pin = _pin; + + px = pin->X; + py = pin->Y; + + spot.X1 = px - 10; + spot.Y1 = py - 10; + spot.X2 = px + 10; + spot.Y2 = py + 10; + + fprintf (stderr, + "Via at %.6f, %.6f\n", + COORD_TO_MM(pin->X), COORD_TO_MM(pin->Y)); + + for (layer = 0; layer < max_copper_layer; layer ++) + { + LayerType * l = &(PCB->Data->Layer[layer]); + r_search (l->line_tree, &spot, NULL, check_line_callback, l); + } +} + +/*! + * \brief Draw teardrops for pads. + */ +static void +check_pad (PadType *_pad) +{ + pad = _pad; + + px = (pad->BoundingBox.X1 + pad->BoundingBox.X2)/2; + py = (pad->BoundingBox.Y1 + pad->BoundingBox.Y2)/2; + thickness = pad->Thickness; + element = (ElementType *)pad->Element; + + fprintf(stderr, + "Pad %s (%s) at %.6f, %.6f (element %s, %s, %s) \n", + EMPTY (pad->Number), EMPTY (pad->Name), + COORD_TO_MM((pad->BoundingBox.X1 + pad->BoundingBox.X2)/2), + COORD_TO_MM((pad->BoundingBox.Y1 + pad->BoundingBox.Y2)/2), + EMPTY (NAMEONPCB_NAME (element)), + EMPTY (VALUE_NAME (element)), + EMPTY (DESCRIPTION_NAME (element))); + + /* fprintf(stderr, */ + /* "Pad %s (%s) at ((%.6f, %.6f), (%.6f, %.6f)) (element %s, %s, %s) \n", */ + /* EMPTY (pad->Number), EMPTY (pad->Name), */ + /* COORD_TO_MM(pad->BoundingBox.X1), */ + /* COORD_TO_MM(pad->BoundingBox.Y1), */ + /* COORD_TO_MM(pad->BoundingBox.X2), */ + /* COORD_TO_MM(pad->BoundingBox.Y2), */ + /* EMPTY (NAMEONPCB_NAME (element)), */ + /* EMPTY (VALUE_NAME (element)), */ + /* EMPTY (DESCRIPTION_NAME (element))); */ + + for (layer = 0; layer < max_copper_layer; layer ++) + { + LayerType *l = &(PCB->Data->Layer[layer]); + r_search (l->line_tree, &(pad->BoundingBox), NULL, check_line_callback, l); + } +} + +static int +teardrops (int argc, char **argv, Coord x, Coord y) +{ + silk = & PCB->Data->SILKLAYER; + + new_arcs = 0; + + VIA_LOOP (PCB->Data); + { + check_via (via); + } + END_LOOP; + + ALLPIN_LOOP (PCB->Data); + { + check_pin (pin); + } + ENDALL_LOOP; + + ALLPAD_LOOP (PCB->Data); + { + check_pad (pad); + } + ENDALL_LOOP; + + gui->invalidate_all (); + + if (new_arcs) + IncrementUndoSerialNumber (); + + return 0; +} + +static HID_Action teardrops_action_list[] = +{ + {"Teardrops", NULL, teardrops, NULL, NULL} +}; + +REGISTER_ACTIONS (teardrops_action_list) + +void +hid_teardrops_init () +{ + register_teardrops_action_list (); +} + + Index: pcb-plugins_sources/src/plugins/upth2pth.c =================================================================== --- pcb-plugins_sources/src/plugins/upth2pth.c (nonexistent) +++ pcb-plugins_sources/src/plugins/upth2pth.c (revision 3870) @@ -0,0 +1,198 @@ +/*! + * \file upth2pth.c + * + * \author Copyright (C) 2009 .. 2011 by Bert Timmerman + * + * \brief A plug-in for pcb to change UnPlated Through Holes to Plated + * Through Holes or vice versa. + * + * Function to change all (or a selection) of the unplated holes into plated holes.\n + * \n + * Compile like this:\n + * \n + * gcc -Ipath/to/pcb/src -Ipath/to/pcb -O2 -shared upth2pth.c -o upth2pth.so + * \n\n + * The resulting upth2pth.so file should go in $HOME/.pcb/plugins/\n + * \n + * \warning Be very strict with compiling this plug-in against the exact pcb + * sources you compiled/installed the pcb executable (i.e. src/pcb) with.\n + * + * Usage: Upth2pth([Selected|All])\n + * Usage: Pth2upth([Selected|All])\n + * \n + * If no argument is passed, no changes are carried out.\n + * Locked holes are not to be changed.\n + * \n + * + *
+ * This program is free software; you can redistribute it and/or modify\n + * it under the terms of the GNU General Public License as published by\n + * the Free Software Foundation; either version 2 of the License, or\n + * (at your option) any later version.\n + * \n + * This program is distributed in the hope that it will be useful,\n + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details.\n + * \n + * You should have received a copy of the GNU General Public License\n + * along with this program; if not, write to:\n + * the Free Software Foundation, Inc.,\n + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n + */ + + +#include +#include + +#include "config.h" +#include "global.h" +#include "data.h" +#include "hid.h" +#include "misc.h" +#include "create.h" +#include "rtree.h" +#include "undo.h" +#include "set.h" +#include "error.h" + +/*! + * \brief Changing all or selected unplated holes to plated holes. + * + * Usage: Upth2pth([Selected|All])\n + * If no argument is passed, no changes are carried out.\n + * Locked holes are not to be changed.\n + */ +static int +upth2pth (int argc, char **argv, Coord x, Coord y) +{ + int selected = 0; + int all = 0; + if (argc > 0 && strcasecmp (argv[0], "Selected") == 0) + selected = 1; + else if (argc >0 && strcasecmp (argv[0], "All") == 0) + all = 1; + else + { + Message ("ERROR: in Upth2pth the argument should be either Selected or All.\n"); + return 1; + } + SET_FLAG (NAMEONPCBFLAG, PCB); + VIA_LOOP(PCB->Data); + { + if (!TEST_FLAG (LOCKFLAG, via)) + { + /* via is not locked */ + if (all) + { + CLEAR_FLAG(HOLEFLAG, via); + } + else if (selected) + { + if (TEST_FLAG (SELECTEDFLAG, via)) + { + CLEAR_FLAG(HOLEFLAG, via); + } + } + } + } + END_LOOP; /* VIA_LOOP */ + ELEMENT_LOOP(PCB->Data); + { + if (!TEST_FLAG (LOCKFLAG, element)) + { + /* element is not locked */ + if (all) + { + PIN_LOOP(element); + { + CLEAR_FLAG(HOLEFLAG, pin); + } + END_LOOP; /* PIN_LOOP */ + } + } + } + END_LOOP; /* ELEMENT_LOOP */ + gui->invalidate_all (); + IncrementUndoSerialNumber (); + return 0; +} + + +/*! + * \brief Changing all or selected plated holes to unplated holes. + * + * Usage: Pth2upth([Selected|All])\n + * If no argument is passed, no changes are carried out.\n + * Locked holes are not to be changed.\n + */ +static int +pth2upth (int argc, char **argv, Coord x, Coord y) +{ + int selected = 0; + int all = 0; + if (argc > 0 && strcasecmp (argv[0], "Selected") == 0) + selected = 1; + else if (argc >0 && strcasecmp (argv[0], "All") == 0) + all = 1; + else + { + Message ("ERROR: in Upth2pth the argument should be either Selected or All.\n"); + return 1; + } + SET_FLAG (NAMEONPCBFLAG, PCB); + VIA_LOOP(PCB->Data); + { + if (!TEST_FLAG (LOCKFLAG, via)) + { + /* via is not locked */ + if (all) + { + SET_FLAG(HOLEFLAG, via); + } + else if (selected) + { + if (TEST_FLAG (SELECTEDFLAG, via)) + { + SET_FLAG(HOLEFLAG, via); + } + } + } + } + END_LOOP; /* VIA_LOOP */ + ELEMENT_LOOP(PCB->Data); + { + if (!TEST_FLAG (LOCKFLAG, element)) + { + /* element is not locked */ + if (all) + { + PIN_LOOP(element); + { + SET_FLAG(HOLEFLAG, pin); + } + END_LOOP; /* PIN_LOOP */ + } + } + } + END_LOOP; /* ELEMENT_LOOP */ + gui->invalidate_all (); + IncrementUndoSerialNumber (); + return 0; +} + +static HID_Action upth2pth_action_list[] = +{ + {"Upth2pth", NULL, upth2pth, "Change selected or all unplated holes to plated holes", NULL}, + {"Pth2upth", NULL, pth2upth, "Change selected or all plated holes to unplated holes", NULL} +}; + +REGISTER_ACTIONS (upth2pth_action_list) + +void +pcb_plugin_init () +{ + register_upth2pth_action_list (); +} + +/* EOF */