Compare commits

...

261 Commits

Author SHA1 Message Date
Maciej Suminski 2c28e1c479 Changed 'line width change' & 'change arc posture' to TOOL_ACTIONs. 2014-08-04 14:23:19 +02:00
jean-pierre charras 5c98cb61fa Fix wx28 compatibility. 2014-08-04 15:06:32 +02:00
unknown 7f4f540cf3 Anti-aliasing patch for the 3D-Viewer from Martin Janitschke 2014-08-04 14:21:28 +02:00
jean-pierre charras 0820eafb6a Fix some case sensitive filename issues. 2014-08-04 14:17:33 +02:00
jean-pierre charras 05f58dd3be 3D viewer: move helper functions from 3d_draw.cpp to 3d_draw_helper_functions.cpp. Add comments in .h sources. Better management of background color. coding style fixes. 2014-08-04 13:28:29 +02:00
Maciej Suminski cd7a9a6875 Selected items do not disappear after rendering backend switch. 2014-08-04 10:43:26 +02:00
Maciej Suminski a0298fc94f Fixed module anchor drawing (GAL). 2014-08-04 10:42:20 +02:00
Maciej Suminski bb9f3f3fe8 bugfix: modules are not selectable in the high contrast mode (GAL). 2014-08-04 10:06:24 +02:00
unknown b3d52ff187 export IDF without empty PLACEMENT section 2014-08-03 09:48:41 +02:00
jean-pierre charras 17a0727ac2 Add comments. Fix bug #1351507 (pad color does not reflect, whether the pad is on front or back layer) and bug #1351388 (Adding a keepout area appears on the opposite layer than selected) 2014-08-02 12:29:10 +02:00
unknown 589b02c662 3D viewer bug fixes 2014-08-02 09:46:47 +02:00
Brian Sidebotham c7e61df19a 3D-Viewer now requires GLEW include - add GLEW_INCLUDE_DIR 2014-08-01 22:27:20 +01:00
Maciej Suminski 5b7d29eae6 Fixed pcbnew crash when a locked footprint is dragged from an edge of the screen. 2014-08-01 11:28:08 +02:00
unknown 29032c22c0 3d_viewer fix translation and rotation issues (patch from Mario Luzeiro) 2014-07-31 09:01:30 +02:00
Michael Narigon 0d27fed9c1 warnings 2014-07-30 22:04:34 -05:00
Dick Hollenbeck 69cadef5a3 WTF 2014-07-30 21:56:25 -05:00
jean-pierre charras 2df35bb1a0 3d viewer: minor code cleaning (remove useless #include )
dialog_track_via_size: set minimal size  and make dialog resizable.
Update demo file.
2014-07-30 17:39:55 +02:00
jean-pierre charras 0b6d521a8a Add patch for 3D viewer enhancements (better render + better vrml reader + x3d reader bug fix) from Mario Luzeiro, with few coding style issues fixed. 2014-07-30 11:34:48 +02:00
unknown eeb12961e9 3D viewer enhancements (better render + better vrml reader) from Mario Luzeiro 2014-07-30 11:01:25 +02:00
jean-pierre charras c1e1a15f59 Minor fixes and changes:
Remove a minor warning message in Debug mode for 2 dialogs.
Pcbnew: update Gerber X2 file format (File Attribute) to very last X2 specification
Eeschema: Fix a minor bug in block selection (sometimes the last selected component was select instead of items in selected area)
and better drag behavior when draging an item by the drag hotkey.
2014-07-29 18:38:27 +02:00
Dick Hollenbeck 6dcff335e5 remove un-used member 2014-07-28 09:13:59 -05:00
Dick Hollenbeck e53abf72b3 KICAD_MANAGER_FRAME::SetProjectFileName() uses PROJECT::SetProjectFullName()
and forces absolute path.
2014-07-28 09:06:08 -05:00
jean-pierre charras da81236777 cvPcb: Remove a debug message displayed when saving .cmp file. 2014-07-28 14:16:14 +02:00
Maciej Suminski 078510f261 Fixed vanishing pads issue in the pad properties dialog (GAL). 2014-07-28 14:01:29 +02:00
Maciej Suminski 7deb7a69bf wxWidgets 2.8 compatibility fix. 2014-07-28 13:59:50 +02:00
Andrew Zonenberg 0215b42329 1) Pad properties dialog can trigger divide-by-zero when "0" is entered as the pad size
2) PNS router incorrectly detects collisions with blind/buried vias that don't actually intersect the active layer
3) PNS router silently converts blind/buried vias to through-board vias when shoved
2014-07-28 11:32:15 +02:00
jean-pierre charras 1b59b47109 Eeschema fixes: fix Bug #1348983 save cmp file crashes cvpcb when eeschema is opened (backannotation crashes). Happens only when some footprint names are not set (blank names).
Also fix incorrect backannotation when footprint names contain spaces (put spaces in names is always a bad idea)
* Fix minor Bug #1349058 Choose component dialog: Search field loses focus after entering a character and internationalize the dialog.
* Fix a subtle bug which prevent eeschema to read the project config file when launched from kicad manager, and when kicad.pro is not found.
2014-07-28 11:24:15 +02:00
Andrew Zonenberg bfbd7ae4b8 Push-and-shove router now handles existing blind/buried vias properly. Can't yet create new ones. 2014-07-27 15:01:06 -04:00
Andrew Zonenberg e48f58aa24 Fixed divide-by-zero in D_PAD::ViewGetLOD() 2014-07-27 15:00:39 -04:00
jean-pierre charras d46d46ed1f * Fix Bug #1348607 and a possible crash in libedit dialog component properties after moving up the first user field (which in not possible now).
* better info message in pcbnew when trying to delete a footprint in legacy library
2014-07-25 19:49:14 +02:00
jean-pierre charras b0546beeb9 Fix overflow in track len calculations and display (Bug #1347878), in high-light tool. 2014-07-24 19:36:26 +02:00
Maciej Suminski f03181e94d Fixed a hot key conflict. 2014-07-24 13:09:16 +02:00
jean-pierre charras 82bf8152da Fix overflow in track len calculations and display (Bug #1347878). 2014-07-24 08:43:23 +02:00
Andrew Zonenberg 5c79127062 Draw VIAs only if a layer they penetrate is visible. 2014-07-23 11:27:52 -05:00
unknown 694c5ebae4 Pcbnew: fix issue for "one file per layer" option in "Export SVG file" 2014-07-23 15:01:23 +02:00
Maciej Suminski e5199b40bc View is automatically centered when a module editor or viewer are opened (GAL). 2014-07-23 12:06:24 +02:00
jean-pierre charras ae9826d290 Make some system error messages not translatable. Better comments in some dialogs. 2014-07-23 12:48:30 +02:00
jean-pierre charras 77dae40d2f ModEdit: fix some issues due to the fact legacy footprint libraries cannot handle 32 copper layers, and are therefore no more editable:
* in file/library save as..., remove option to save a lib under the legacy format (which is not possible and creates an error message)
* if the current loaded lib is a legacy lib, when the user try to save or delete a footprint, displays a message which explains what the user should do.
* add a suitable dialog to select/create a .pretty folder library (a file dialog or a dir dialog coming from wxWidgets is not friendly usable.)
2014-07-23 12:28:48 +02:00
Maciej Suminski 62a9198e5a Modules loaded by the module editor are placed in the world origin (GAL). 2014-07-22 09:50:40 +02:00
jean-pierre charras 96f34ffe4a 3d viewer: Add high quality mode option is realistic mode (Shows holes in copper zones, but with longer calculation time)
Gal: fix a very minor issue: the keys to switch between copper layers are now - and + (according to the doc and the normall mode), instead of - and =
2014-07-21 18:26:18 +02:00
Maciej Suminski 3d7850adf3 Fixed bug: module editor doesn't respect global "per module" solder mask clearance (GAL). 2014-07-21 13:17:11 +02:00
Maciej Suminski 4042f4aab5 Fixed bug: solder paste clearance is not displayed (GAL). 2014-07-21 12:54:58 +02:00
unknown d2b9d6a9c4 Add interactive router doc, from Tomasz Wlostowski (see github.com/twlostow/kicad-dev/blob/junk/Documentation/interactive_router)
Remove the outdated pns_router.txt file.
2014-07-21 13:15:54 +02:00
jean-pierre charras b98c16bf7e fix Bug #1345193: Drill Map coordinates alway 0 when using Gerber format (due to a missing plotter initialization). 2014-07-21 11:42:36 +02:00
Maciej Suminski 23daeb3a4c Fix OpenGL canvas freeze under Windows. 2014-07-20 21:14:42 +02:00
Maciej Suminski c4086d931b Fixed Mac OS build. 2014-07-20 20:58:33 +02:00
jean-pierre charras 83fc0fc71a Fix crash in Pcbnew and Gerbview when selecting (in layers manager) "always hide all layers but active" from popup menu 2014-07-20 19:46:11 +02:00
jean-pierre charras b0cdbfccc4 Fix crash in Pcbnew and Gerbview when seceting (in layers manager) "always hide all layers but activer" 2014-07-20 19:41:12 +02:00
jean-pierre charras ad65c28d86 Apply a workaround to fix a wxWidgets bug in versions 3.0.x relative to mouse wheel event (Windows specific).
Therefore wxWidgets 3.0.1 can be used without need to patch it.
(This bug is fixed in wxWidgets 3.1)
2014-07-20 17:23:48 +02:00
unknown eae9161791 Pcbnew: fix bug when generating drill files for blind/buried vias. 2014-07-20 16:46:59 +02:00
jean-pierre charras 3406ddd45e Very minor fixes. *.kicad_pcb files update to current Pcbnew version. 2014-07-20 12:41:14 +02:00
Dick Hollenbeck 5d2b7bf578 KIWAY::player_destroy_handler() skips on the wxWindowDestroyEvent, just in case 2014-07-17 09:10:15 -05:00
jean-pierre charras 4ca39b286c Fix wx28 compil issue, and a compil warning. 2014-07-15 20:13:08 +02:00
jean-pierre charras ad634b927a dialog non copper zones: better look. dialog copper zones: fix a minor bug. 2014-07-15 18:53:13 +02:00
Maciej Suminski e1d390f8a0 Alternative way to handle mouse buttons (GAL). 2014-07-15 17:34:53 +02:00
Maciej Suminski 9138a14e2c Module editor does not ask for permission to modify a locked module. 2014-07-15 17:33:19 +02:00
Maciej Suminski ced6613bb5 Fixed offset of dragged items when the moving tool is invoked by the hotkey (GAL). 2014-07-15 16:33:46 +02:00
Maciej Suminski 669467f196 Fixed crash in pad properties dialog with wxWidgets 2.8. 2014-07-15 16:02:08 +02:00
Maciej Suminski c1d17b95ec Clicking on the Selection Tool toolbar button deactivates the current tool (GAL). 2014-07-15 11:50:00 +02:00
Maciej Suminski cdb1a44875 Drawing tools reset its state on layer change. 2014-07-15 11:41:55 +02:00
Maciej Suminski ecefcefde8 PNS settings dialog size corrected. 2014-07-15 10:57:51 +02:00
jean-pierre charras 4831942dfa Gerbview: fix scaling error in x.6 file format. Minor cleaning code.
Better separation between Pcbnew code and Gerber code.
Update export to Pcb code (uses now the version 4  kicad_pcb file format).
2014-07-14 20:59:41 +02:00
Dick Hollenbeck 1f7b71edff wxJoin version dependency change 2014-07-14 10:03:51 -05:00
Maciej Suminski 7cd4376567 Refinement to commit #4993. 2014-07-14 16:43:21 +02:00
Maciej Suminski 23f95f9940 Fixed Python scripting enabled builds. 2014-07-14 15:14:37 +02:00
Maciej Suminski 7818201793 Fixed layers order after changing the active layer. 2014-07-14 11:36:34 +02:00
Maciej Suminski f86b8d7e07 Merged module-editor branch (http://www.ohwr.org/projects/cern-kicad/wiki/ModuleEditor). 2014-07-14 11:06:59 +02:00
Maciej Suminski e6dfda51d1 Increase panning area in GAL view. 2014-07-14 09:43:20 +02:00
Kirill Mavreshko 5bd2beb650 bugfix: pcbnew crashes when you try to save a file 2014-07-14 09:41:02 +02:00
jean-pierre charras a0621448f6 Gerber files generation: fix a rounding issue when drawing circles. (explains bug Bug #1339086 ).
Gerbview: allows x.7 format (recently indroduced in Gerber format)
Also minor coding style fixes.
2014-07-14 09:36:37 +02:00
Kirill Mavreshko 17a591f149 bugfix: pcbnew crashes when you try to save a file 2014-07-13 19:08:42 +02:00
Maciej Suminski 39fd9a745e Increase panning area in GAL view. 2014-07-11 17:04:35 +02:00
jean-pierre charras 81d26bb86e Gerber files generation: fix a rounding issue when drawing circles. (explains bug Bug #1339086 ).
Gerbview: allows x.7 format (recently indroduced in Gerber format)
Also minor coding style fixes.
2014-07-09 18:31:39 +02:00
Maciej Suminski 26996d640f Fixed the Module viewer crash when there is no footprint loaded. 2014-07-09 16:57:01 +02:00
Maciej Suminski ed83558ae4 Zone fill/unfill actions in context menu (GAL). 2014-07-09 16:57:01 +02:00
Maciej Suminski 6ed7517522 Fixed the only-type condition for empty selection case. 2014-07-09 16:50:31 +02:00
Maciej Suminski 9280c29fa9 "Create corner" context menu entry for draw segments and zone outlines (GAL). 2014-07-09 16:50:31 +02:00
Maciej Suminski 40361deb56 Cursor position is frozen when a context menu is displayed (GAL). 2014-07-09 16:50:31 +02:00
Maciej Suminski cf0a9ee8af Selection tool uses the real drag origin to compute offset when dragging items. 2014-07-09 16:50:31 +02:00
Maciej Suminski c3ab5c5da8 Added module texts to the preferred types list in SELECTION_TOOL. 2014-07-09 16:50:31 +02:00
Maciej Suminski f3bdc29e8e Support for "locked" property for modules (GAL). 2014-07-09 16:50:31 +02:00
Maciej Suminski 53c0b9d85b Some of the Tool Actions need to be run in immediate mode - fixed. 2014-07-09 16:50:31 +02:00
Maciej Suminski 88319139ed Dragged items offset is cleared when dragging is finished. 2014-07-09 16:50:31 +02:00
Maciej Suminski c8512f0592 New pads in the module editor does not show up in the center of the edited module. 2014-07-09 16:50:31 +02:00
Maciej Suminski e5c0926571 FIx layer switching after via placement in PNS router. 2014-07-09 16:50:31 +02:00
Maciej Suminski df1dfbbb92 Clear selection before opening the module editor. 2014-07-09 16:44:23 +02:00
Maciej Suminski 746786a110 Fixed module editor crash when pcbnew is started from the main launcher. 2014-07-09 16:44:23 +02:00
Maciej Suminski 7a940570bb Workarounded restoring focus to GAL canvas after layer switching. 2014-07-09 16:44:22 +02:00
Maciej Suminski a3eb60e068 Added event queue to handle events at the end of the event processing cycle. 2014-07-09 16:25:50 +02:00
Maciej Suminski 9cfb712624 Code formatting. 2014-07-09 16:25:50 +02:00
Maciej Suminski 942a38349a Simplified code for switching layers in GAL view. Tools are notified of layer change event. 2014-07-09 16:25:50 +02:00
Maciej Suminski 7f13fd0ffd Added AF_NOTIFY flag for TOOL_ACTIONs. 2014-07-09 15:10:32 +02:00
Maciej Suminski ebf59807dc Fixed continous line drawing.
Outline mode can be set up on any layer.
2014-07-09 15:10:32 +02:00
Maciej Suminski dd93dea448 wxWidgets 2.8 compatibility fixes. 2014-07-09 15:10:32 +02:00
Maciej Suminski 242d9812eb Fixed minor bugs introduced with outline mode display for module texts and edges. 2014-07-09 15:10:32 +02:00
Maciej Suminski 1495429f68 Ratsnest is recalculated after global deletion of tracks and after importing a netlist. 2014-07-09 15:10:32 +02:00
Maciej Suminski 3e3626728a Tool indicator is resetted on canvas switch. 2014-07-09 15:10:32 +02:00
Maciej Suminski 23b113b0c3 Outline display mode for module edges & texts in the module editor. 2014-07-09 15:10:32 +02:00
Maciej Suminski 21a86dc646 Modules inserted from the module editor are instantly visible in GAL.
Ratsnest is updated after exporting changes from the module editor to the layout editor.
2014-07-09 15:10:32 +02:00
Maciej Suminski 0b51dd7e01 Added support for changing the cursor size. 2014-07-09 15:10:32 +02:00
Maciej Suminski d4487f1925 Fixed autozooming with empty board/module. 2014-07-09 15:10:32 +02:00
Maciej Suminski 30ea3b7962 Fixed module viewer crash. 2014-07-09 15:10:32 +02:00
Maciej Suminski 82ff9ceca7 Introduced SELECTION_CONDITIONS to determine which menu entries should be visible in the SELECTION_TOOL context menu, depending on the selection. 2014-07-09 15:10:32 +02:00
Maciej Suminski c68bea5a6b Moved SELECTION out of SELECTION_TOOL class. 2014-07-09 15:10:32 +02:00
Maciej Suminski 53660ad91f Pad Enumeration tool support for SMD pads. 2014-07-09 15:10:32 +02:00
Maciej Suminski c9d72036d8 Added settings dialog for Pad Enumeration tool. 2014-07-09 15:10:32 +02:00
Maciej Suminski a961961105 Initial version of the Pad Enumeration tool. 2014-07-09 15:02:56 +02:00
Maciej Suminski fb7b8fd9b1 Removed redundant accessor calls in MODULE_TOOLS. 2014-07-09 15:02:56 +02:00
Maciej Suminski d87232f652 Moved module editor-specific tools to a separate class (MODULE_TOOLS). 2014-07-09 15:02:56 +02:00
Maciej Suminski f5e9774d55 Added support for graphics on Edge.Cuts layer in modules. Tested functionality that works fine:
- zone filling algorithm
- printing
- plotting (pdf & gerbers)
- SVG export
- Specctra export
- 3D viewer
2014-07-09 15:02:56 +02:00
Maciej Suminski 417dc0a9dc Drawing tools used to crash when the drawing tool was interrupted - fixed. 2014-07-09 15:02:56 +02:00
Maciej Suminski 7fc5a9bc60 Fixed anchor placement tool in module editor (GAL). 2014-07-09 15:02:56 +02:00
Maciej Suminski 66bbbec394 Module anchors are visible in GAL canvas. 2014-07-09 15:02:56 +02:00
Maciej Suminski 31f6420197 Renamed "Placement" context menu to "Align/distribute". 2014-07-09 15:02:56 +02:00
Maciej Suminski 35c31a3fb5 Fixed grid drawing when the grid origin has negative coordinates. 2014-07-09 15:02:56 +02:00
Maciej Suminski 55a08a0bda Changes in display options are handled by PCBNEW_CONTROL (GAL). 2014-07-09 15:02:56 +02:00
Maciej Suminski 7091e285e6 Added support for module edge splitting with double click. 2014-07-09 15:02:56 +02:00
Maciej Suminski 422be4badb DXF drawing placement tool for GAL. 2014-07-09 15:02:56 +02:00
Maciej Suminski 7c7ab6f2ad Created dialog_dxf_import.h. Cleaned up some unnecessary stuff and fixed file open dialog DIALOG_DXF_IMPORT. 2014-07-09 15:02:56 +02:00
Maciej Suminski 4f0e03bcc0 Fixed a few memory leaks and Valgrind warnings. 2014-07-09 15:02:56 +02:00
Maciej Suminski 069dac5407 DXF files import is supported by module editor. 2014-07-09 15:02:56 +02:00
Maciej Suminski b4b7f947a9 Refactored DXF import routines:
- DIALOG_DXF_IMPORT works with PCB_BASE_FRAME instead of PCB_EDIT_FRAME
- imported items are not immediately added to a BOARD
- imported items are held in a list, instead of vector
- imported items are instantly visible in GAL view
- added DIALOG_DXF_IMPORT::GetImportedItems()
- code formatting
2014-07-09 15:02:56 +02:00
Maciej Suminski 8c1f783dd9 Code formatting. 2014-07-09 14:41:52 +02:00
Maciej Suminski 8bddf33ab5 Context menu for the Placement Tool. 2014-07-09 14:23:13 +02:00
Maciej Suminski 3dd651cf22 Initial version of the Placement Tool. 2014-07-09 14:23:13 +02:00
Maciej Suminski 21b3eb98b6 Fixed wrong reference point for copied items in subsequent module editor invocations (GAL). 2014-07-09 14:23:13 +02:00
Maciej Suminski 327c8594c5 Pasted module texts are rotated in the right way. 2014-07-09 14:23:13 +02:00
Maciej Suminski cfddb40d79 Reference point is selected for copied items. Enabled autopanning for copy & paste operations (module editor/GAL). 2014-07-09 14:23:13 +02:00
Maciej Suminski bba31a43eb wxWidgets 2.8 compatibility fix. 2014-07-09 14:23:13 +02:00
Maciej Suminski 73245e5930 Copy & paste for module editor (GAL). 2014-07-09 14:22:29 +02:00
Maciej Suminski d2c78c8bb7 Added MODULE::Add( BOARD_ITEM* )/Remove( BOARD_ITEM* )/Delete( BOARD_ITEM* ).
Removed MODULE::AddPad().
2014-07-09 14:22:29 +02:00
Maciej Suminski 098449d7dc Routines for handling clipboard with TOOL_MANAGER. 2014-07-09 14:01:07 +02:00
Maciej Suminski 0b4b0f7b0d Added support for placing the footprint anchor. 2014-07-09 14:01:06 +02:00
Maciej Suminski e5b868cf73 Added support for pads, texts and graphics removal in module editor (GAL). 2014-07-09 14:01:06 +02:00
Maciej Suminski cdeb700f70 Added pad placement tool for module editor (GAL). 2014-07-09 14:01:06 +02:00
Maciej Suminski 0f3f219ed2 MInor fixes. 2014-07-09 14:01:06 +02:00
Maciej Suminski 17e082088b Fixed the legacy module editor. 2014-07-09 14:01:06 +02:00
Maciej Suminski bd22ab3df5 Adapted graphics tools to cooperate with module editor. 2014-07-09 14:01:06 +02:00
Maciej Suminski d373ffa551 Added "edit modules" mode for DRAWING_TOOL. 2014-07-09 14:01:06 +02:00
Maciej Suminski 803c05992c Fixed DRAWING_TOOL::PlaceTextModule() method. 2014-07-09 14:01:06 +02:00
Maciej Suminski e5158c7635 Created a header file for DialogEditModuleText class. 2014-07-09 14:01:06 +02:00
Maciej Suminski 51d2061edf Refactored drawing tools: lines, circles and arcs. 2014-07-09 14:01:06 +02:00
Maciej Suminski 2c19954d19 Updated POINT_EDITOR to handle module edges. 2014-07-09 13:50:27 +02:00
Maciej Suminski ada02bce97 Added a handler for not implemented toolbar buttons functionality in GAL. 2014-07-09 13:50:27 +02:00
Maciej Suminski 06361eb2c1 Added AF_ACTIVATE flag for TOOL_ACTIONs.
Reworked the way of processing events in TOOL_MANAGER class.
Added GetCommandStr() for TOOL_EVENT class.
2014-07-09 13:50:27 +02:00
Maciej Suminski 3ce4e4d356 Improved way of translating wxEvent commands to TOOL_ACTIONs. 2014-07-09 13:50:27 +02:00
Maciej Suminski 6859bf8301 Introduced a new type of action: TA_ACTIVATE to distinguish events activating tools from common tool actions. 2014-07-09 13:50:27 +02:00
Maciej Suminski 6b61ea547f Corrected names of common tool actions. 2014-07-09 13:50:27 +02:00
Maciej Suminski cc7d97319a Module editor: modules are shown in GAL mode when loaded from file/library. 2014-07-09 13:50:27 +02:00
Maciej Suminski d4ae51d024 Module editor loads the last edited footprint in GAL mode. 2014-07-09 13:50:27 +02:00
Maciej Suminski 7a5d144d9d SELECTION_TOOL in edit module mode does not try to select MODULEs. 2014-07-09 13:50:27 +02:00
Maciej Suminski b020162d79 Rotate support for pads. 2014-07-09 13:50:27 +02:00
Maciej Suminski acdf9dd65c Added required resets for tools. 2014-07-09 13:50:27 +02:00
Maciej Suminski 4933fb3f2c Restored invocation of SELECTION_TOOL commands with TOOL_ACTIONs. 2014-07-09 13:50:27 +02:00
Maciej Suminski d63dd3fa70 Implemented stacking for TOOL_STATEs. 2014-07-09 13:50:27 +02:00
Maciej Suminski 3587f47cca Minor fixes to the Tool Framework. 2014-07-09 13:50:27 +02:00
Maciej Suminski 946ffb2ad9 Restored std::map in TOOL_MANAGER. 2014-07-09 13:50:27 +02:00
Maciej Suminski 43275ef943 Restored support for custom angle rotation. 2014-07-09 13:50:27 +02:00
Maciej Suminski d41e93ef14 Adapted tools to PCB_BASE{_EDIT}_FRAME. 2014-07-09 13:50:27 +02:00
Maciej Suminski 98c35ceab4 Created a common interface for edit frames. 2014-07-09 13:50:27 +02:00
Maciej Suminski 6e34910b75 Moved some layout editor specific tool actions to another class (PCB_EDITOR_CONTROL). 2014-07-09 13:50:27 +02:00
Maciej Suminski 63b69d94be Code formatting. 2014-07-09 12:10:28 +02:00
Maciej Suminski f7e3b1b0cb FOOTPRINT_EDIT_FRAME undo buffer handles operations done with GAL editor. 2014-07-09 12:10:27 +02:00
Maciej Suminski 32171720f0 SELECTION_TOOL got a new mode to edit MODULEs. 2014-07-09 12:10:27 +02:00
Maciej Suminski caf2f12dee Unconditionally initialize the Tool Framework in FOOTPRINT_EDIT_FRAME. 2014-07-09 11:59:24 +02:00
Maciej Suminski d0615e8fec Move() method updates local coordinates in EDGE_MODULE, D_PAD and TEXTE_MODULE classes. 2014-07-09 11:59:24 +02:00
Maciej Suminski 520038c750 Minor changes. 2014-07-09 11:59:24 +02:00
Maciej Suminski e290fff052 Removed TOOL_ACTIONs: selectionSingle, selectionClear. SELECTION_TOOL methods are called directly instead. 2014-07-09 11:59:24 +02:00
Maciej Suminski e4ec886a6c Added an alternative way to reach tools in the Tool Framework. 2014-07-09 11:59:24 +02:00
Maciej Suminski d46d241b5e Added layer widget to the module editor. 2014-07-09 11:59:23 +02:00
Maciej Suminski 597338ba5f PCB_LAYER_WIDGET became able to cooperate with PCB_BASE_FRAME. 2014-07-09 11:59:23 +02:00
Maciej Suminski d93ccff534 {Set,Get}ActiveLayer moved from PCB_EDIT_FRAME to PCB_BASE_FRAME. 2014-07-09 11:50:27 +02:00
Maciej Suminski 27ca6c97cb Moved layers visibility synchronization to PCB_DRAW_PANEL_GAL::SyncLayersVisibility(). 2014-07-09 11:24:56 +02:00
Maciej Suminski 748f738675 Initial version of the GAL-based Module Editor. 2014-07-09 11:22:43 +02:00
Maciej Suminski 936fc76581 Code formatting and cleaning. 2014-07-09 11:22:43 +02:00
Maciej Suminski ac73454538 Grid offset is recomputed only when settings are changed. 2014-07-09 11:22:43 +02:00
Maciej Suminski 64e1e419c8 Next/previous footprint toolbar buttons are handled in the Module Viewer using GAL canvas. 2014-07-09 11:22:43 +02:00
Maciej Suminski 677240cd2a bugfix: pads edited with properties dialog were not refreshed.
bugfix: changing track width/via size using the dropdown menu when custom size was enabled did not change anything.
2014-07-09 11:22:43 +02:00
Maciej Suminski 3f173e4c5c GAL view in pad properties dialog - initial version. 2014-07-09 11:22:43 +02:00
Maciej Suminski 47ce871043 FOOTPRINT_VIEWER_FRAME handles events from toolbar buttons and hot keys. 2014-07-09 11:22:43 +02:00
Maciej Suminski 2d44b7e3c2 Reduced number of switched events, allowing to use VIEW_CONTROLS, even if there is no extra event dispatcher. 2014-07-09 11:22:43 +02:00
Maciej Suminski a7807c4ee1 Rework to support multiple views with OpenGL GAL canvas. 2014-07-09 11:22:42 +02:00
Maciej Suminski d3b2e50200 Alternative approach to handling events and commands by TOOL_DISPATCHER.
Event handlers are (dis)connected depending on the active view.
TOOL_DISPATCHER inherits from wxEvtHandler, so now it receives events directly instead of being fed by external handlers.
2014-07-09 11:22:42 +02:00
Maciej Suminski 7c812664f3 TOOL_ACTIONs are automagically registered by TOOL_MANAGER upon its construction. 2014-07-09 11:22:42 +02:00
Maciej Suminski c416f5a1e5 Removed a redundant pointer to EDA_EDIT_FRAME. 2014-07-09 11:22:42 +02:00
Maciej Suminski 03f4502232 Fixed toolbar buttons for zooming in GAL canvas. 2014-07-09 11:22:42 +02:00
Maciej Suminski a4ef6a37fe Added autozooming and display of the last chosen module for module viewer using GAL. 2014-07-09 11:22:42 +02:00
Maciej Suminski cbfe3d0b6e Fixed VIEW::SetViewport(). 2014-07-09 11:22:42 +02:00
Maciej Suminski 3544d30b54 Initial version of GAL-based module viewer in pcbnew. 2014-07-09 11:22:42 +02:00
Maciej Suminski b934b11a60 Minor changes (removed an unnecessary event handler and two function calls that had no real influence). 2014-07-09 10:57:32 +02:00
Maciej Suminski cabec6dbeb Fixed switching between GAL canvases error. 2014-07-09 10:57:32 +02:00
Maciej Suminski 20558f5387 Created a specialization of EDA_DRAW_PANEL_GAL: PCB_DRAW_PANEL_GAL.
Moved View related routines & fields from PCB_{BASE,EDIT}_FRAME & BOARD to PCB_DRAW_PANEL_GAL.
2014-07-09 10:57:32 +02:00
Maciej Suminski 26d0f01592 Removed EDA_DRAW_FRAME::SetGalCanvasActive() [it may be misleading], added EDA_DRAW_PANEL_GAL::GetBackend(). 2014-07-09 10:34:00 +02:00
Dick Hollenbeck 5cedf8100f kicad.exe work:
*) re-enable the MacOpen() support.
*) fix path truncation bug.
*) open *.kicad_pcb and *.sch files in the same process if they are part of the 
   the currently open project, even from the tree view.
2014-07-08 19:52:46 -05:00
Dick Hollenbeck 73890d6dda switch back to original sexpr usage of PTREE, add new DSNLEXER constructor, enforce accessors in kicad.exe 2014-07-07 14:49:14 -05:00
Maciej Suminski 1a0a9564d0 Fixed vertical alignment for strings that contain a newline character at the end (GAL). 2014-07-07 13:09:44 +02:00
Maciej Suminski 2c21cddf8e Bugfix: Bottom layer not correctly handled in (PNS) Interactive router. 2014-07-07 10:48:47 +02:00
Dick Hollenbeck d6991fe8ac backanno 2014-07-07 01:04:53 -05:00
Dick Hollenbeck ece470b4fb netlist_stuff 2014-07-07 00:59:58 -05:00
Dick Hollenbeck 7e94e5ff4f add aDocName to NETLIST::Format() 2014-07-06 23:41:29 -05:00
Dick Hollenbeck a6743561a2 back annotation when CVPCB and EESCHEMA are running under KICAD 2014-07-06 23:12:04 -05:00
Dick Hollenbeck ef05571dbe typo on B_CrtYd, F_CrtYd, B_Fab, F_Fab 2014-07-06 11:59:26 -05:00
jean-pierre charras e362a36710 Update demo files 2014-07-06 12:50:32 +02:00
Dick Hollenbeck b2477e2353 fix Inner1.Cu in pcb_parser.cpp, start cvpcb work. 2014-07-05 15:52:24 -05:00
Dick Hollenbeck 6ccd37856d fix Inner1.Cu in pcb_parser.cpp, start cvpcb work. 2014-07-05 15:42:59 -05:00
Lorenzo Marcantonio 5285d2a8e7 Added missing support for reading the *.CrtYd layer token 2014-07-05 14:35:18 +02:00
jean-pierre charras 558737aa11 Update old demo board files. Minor code cleaning. 2014-07-04 21:36:43 +02:00
jean-pierre charras bf32cb9ddf Pcbnew: fix read .kicad_pcb file error when an outdated plot parameter is found. Now outdated plot parameters are just ignored 2014-07-04 17:54:14 +02:00
jean-pierre charras 5b7ec40f5e Pcbnew: Rework on Gerber ouput: allows choice between format 4.5 and 4.6. Fix a minor issue in Gerber layers attributes.
fix print issue when printing each layer on a separate page.
2014-07-04 16:22:38 +02:00
jean-pierre charras 3ee011d49d Pcbnew, Gerbview : fix crash when updating the layer manager. 2014-07-04 15:53:41 +02:00
Lorenzo Marcantonio 80433334cd - Added the courtyard/fabrication layer to the layer combo and layer
panel
- Corrected handling of scrollability in layer panel (fixes 1336996)
2014-07-04 10:55:51 +02:00
jean-pierre charras f5e0c6ba6e Fix footprint wizard issues. Fix export vrml incorrect Z position of items. 2014-07-02 15:08:28 +02:00
jean-pierre charras e77038d23b Fix Bug #1336614 (Vias missing from drill export) 2014-07-02 09:05:29 +02:00
jean-pierre charras b2f42c3cde Fix Bug #1336534 pcbnew 3D viewer wrong vertical model offset. 2014-07-02 08:45:42 +02:00
jean-pierre charras 1566aad5e2 Minor fixes in Gerber files, in file attribute for copper layers. 2014-07-01 21:20:38 +02:00
jean-pierre charras 7aa85b5fdf Fix Bug #1335914 (Export SVG menu) hangs pcbnew permanently.
Also a minor cosmetic enhancement in SVG export and plot dialogs.
2014-06-30 21:19:58 +02:00
Dick Hollenbeck 3ec5ecd3a2 fix BUG parsing the kicad_pcb (layers ..) declaration section. First non-cu was being dropped. 2014-06-30 13:45:43 -05:00
jean-pierre charras 99427a86cd Fix a double minor bug about layers occupied by SMD pads and CONN pad:
The default layer stack between these 2 types was swaped in pad definition, and also in the dialog pad properties.
This double swap creates no bug, but creates bugs in the footprint wizards (SMD or CONN pads do not have the right layer stack)
FYI, the CONN pad type should be removed soon.
2014-06-30 20:14:06 +02:00
jean-pierre charras cba2109b44 Enable technical layers when starting Pcbnew with no board.
Use format 4.6 (full resolution of Pcbnew) in Gerber files to avoid the creation of self-intersecting polygons.
2014-06-30 17:46:47 +02:00
Dick Hollenbeck e5f6238490 fix export_gencad.cpp 2014-06-30 10:03:20 -05:00
jean-pierre charras 8e241482b7 Update complex_hierarchy.kicad_pcb file, used in qa tests, which was created by a test version of Pcbnew, and was not currently readable. 2014-06-30 14:18:52 +02:00
jean-pierre charras b8d82d94fc Gerber output: Some changes after evaluation of Gerber files by Ucamco (the manager of GERBER format):
* default file ext is now .gbr (the "official extension")
* some outdated commands remoded.
* mainly use mm and 4.5 format instead of inches and 3.4 format. this is mandatory,
  because the 3.4 format (comming from old pcbned internal units) creates truncations in coordinates.
  (with serious issues in polygons which can appear self-intersecting afer truncation)
2014-06-30 12:00:21 +02:00
Dick Hollenbeck 29fdcc8a41 1) Add 32 Cu Layers and provisions for additional future layers.
2) Change from legacy Cu stack to counting down from top=(F_Cu or 0).
   The old Cu stack required knowing the count of Cu layers to make
   sense of the layer number when converting to many exported file types.
   The new Cu stack is more commonly used, although ours still gives
   B_Cu a fixed number.
3) Introduce class LSET and enum LAYER_ID.  LAYER_NUM is only advisory and
   can safely be replaced with int.
4) Change *.kicad_pcb file format version to 4 from 3.
5) Change fixed names Inner1_Cu-Inner14_Cu to In1_Cu-In30_Cu and their
   meanings are typically flipped.
6) Moved the #define LAYER_N_* stuff into legacy_plugin.cpp where they
   can die a quiet death, and switch to enum LAYER_ID symbols throughout.
7) Removed the LEGACY_PLUGIN::Save() and FootprintSave() functions.
   You will need to convert to the format immediately, *.kicad_pcb and
   *.kicad_mod (=pretty) since legacy format was never going to know
   about 32 Cu layers and additional technical layers and the reversed Cu
   stack.
2014-06-30 01:59:52 -05:00
Dick Hollenbeck b51d85d218 merge 2014-06-30 01:44:46 -05:00
Dick Hollenbeck 633f546ea1 merge 2014-06-30 00:46:18 -05:00
Dick Hollenbeck 1601db07bd fix VIA::IsOnLayer() 2014-06-29 23:40:16 -05:00
Dick Hollenbeck 6bb6128b24 fix pcb_parser for new board, coding standards 2014-06-29 16:50:06 -05:00
Dick Hollenbeck b725b18bfa fix LSET() constructors, formatting 2014-06-29 15:33:29 -05:00
Dick Hollenbeck fbe455c1c1 re-work the LSET(int,...) constructor 2014-06-29 13:09:32 -05:00
Dick Hollenbeck 576783dbbb class_marker IsOnLayer() 2014-06-29 08:12:30 -05:00
Dick Hollenbeck a7db812c21 LAYER_ID work 2014-06-29 08:05:51 -05:00
jean-pierre charras f27fb5c874 Fix Pl_Editor scrollbars incorrect position. 2014-06-29 11:24:42 +02:00
jean-pierre charras b8358d1634 Make gerbview compilable and working (does not use now layers and layer masks from Pcbnew).
Export to Pcbnew is broken, but it is a very rarely used feature. It will be fixed later.
2014-06-27 19:09:25 +02:00
jean-pierre charras 4a825e8dcc Make gerbview compilable and working (does not use now layers and layer masks from Pcbnew).
Export to Pcbnew is broken, but it is a very rarely used feature. It will be fixed later.
2014-06-27 19:07:42 +02:00
jean-pierre charras 1d18ebef99 Pspice netlist generator: add option to use net numbers as net names (feature removed a long time ago, but needed by Oscad team)
Note these options are saved in project config.
2014-06-26 21:20:05 +02:00
Dick Hollenbeck ddffb23fb3 use LSET::any() whereever possible and avoid conversion to integral type 2014-06-25 12:01:50 -05:00
Dick Hollenbeck b32b9dee8a copyright 2014-06-25 09:24:02 -05:00
Dick Hollenbeck ff81fc7c60 1) Fix compiles using wx 3.x and 2.8.
2) Fix passing wxString to common/config_params so lookup keys 
   can be dynamically generated.  This gives ~/.kicad files all the colors.
3) Fix LEGACY_PLUGIN so it loads all layer types and masks properly.
4) Extend the table in router/pns_index.h to 128 from 64.
2014-06-24 23:36:02 -05:00
Dick Hollenbeck 01fb6a2573 add lset.cpp 2014-06-24 13:31:41 -05:00
Dick Hollenbeck afac2c5f8a fix zones 2014-06-24 13:30:39 -05:00
jean-pierre charras 4787918fac Make dialog pns properties resizable. DXF import: add very basic polyline import. 2014-06-24 20:04:16 +02:00
Dick Hollenbeck 8fad0a9ea6 1) Add 32 Cu Layers.
2) Change from legacy Cu stack to counting down from top=(F_Cu or 0).
   The old Cu stack required knowing the count of Cu layers to make
   sense of the layer number when converting to many exported file types.
   The new Cu stack is more commonly used, although ours still gives
   B_Cu a fixed number.
3) Introduce class LSET and enum LAYER_ID.
4) Change *.kicad_pcb file format version to 4 from 3.
5) Change fixed names Inner1_Cu-Inner14_Cu to In1_Cu-In30_Cu and their
   meanings are typically flipped.
6) Moved the #define LAYER_N_* stuff into legacy_plugin.cpp where they
   can die a quiet death, and switch to enum LAYER_ID symbols throughout.
7) Removed the LEGACY_PLUGIN::Save() and FootprintSave() functions.
   You will need to convert to the format immediately, *.kicad_pcb and
   *.kicad_mod (=pretty) since legacy format was never going to know
   about 32 Cu layers and additional technical layers and the reversed Cu
   stack.
2014-06-24 11:17:18 -05:00
Maciej Suminski f20a875ee9 Dragging items by their origin is optional (activated by dragging elements with Ctrl held). 2014-06-23 16:12:59 +02:00
Kirill Mavreshko fb30c47123 Fixes bug #1332438: PNS router crashes when you another track while routing in "shove" mode 2014-06-23 08:50:53 +02:00
jean-pierre charras fad894e31a Fix compil issue with KICAD_SCRIPTING_WXPYTHON option ON.
Minor enhancements.
2014-06-20 19:29:35 +02:00
jean-pierre charras a0e04a7a20 Remove 2 global variables: g_DrawBgColor and g_ShowPageLimits.
They are now member of EDA_DRAW_FRAME.
This change could fix Bug #1330781 (Background color change in Eeschema affects background color in Pcbnew)
Show page limits has meaning only for the schematic editor,  the board editor and the page layout editor.
Draw background color selection exists only in eeschema and  page layout editor.
In pcbnew, only a black background is allowed.
A side effect is now the user should set the background color in schematic editor, and the library editor (2 different options).
The default is still the white color.
2014-06-20 13:13:04 +02:00
Lorenzo Marcantonio 57b328538f Fixes 1332429 2014-06-20 10:55:30 +02:00
unknown cd7143c5b7 Gerber X2 patch (Support for the "file function" attribute) from Thiadmer Riemersma, committed in rev 4948: minor fix for better compatibility with older versions of Pcbnew 2014-06-19 09:12:48 +02:00
jean-pierre charras 552a413c01 Pcbnew, python console: make it not dockable (workaround to avoid the fact accelerator keys which are used in the main menu are not sent to the console, in docked mode).
Minor cosmetic enhancement.
2014-06-19 08:26:53 +02:00
jean-pierre charras 655b1de0f4 Pcbnew, python console: make it not dockable (workaround to avoid the fact hot keys which are used in the main menu are not sent to the console, in docked mode)
Minor cosmetic enhancement.
2014-06-18 18:33:16 +02:00
jean-pierre charras d2390f13d7 better management of Python console. 2014-06-18 13:44:17 +02:00
jean-pierre charras cbd98327dc Minor cosmetic enhancement, and try to fix an issue with accelerator keys and the Python scripting console 2014-06-17 20:31:27 +02:00
Dick Hollenbeck 88e12fabaa fix some bugs in FOOTPRINT_VIEWER_FRAME, get rid of statics 2014-06-16 14:00:26 -05:00
Bernhard Stegmaier 9654ec5613 Fixes 2014-06-16 11:42:27 -05:00
Bernhard Stegmaier 39d6e942fa OSX drawing artifacts 2014-06-16 11:32:23 -05:00
jean-pierre charras 7e2fbc9e10 Fix specctra export crash, when a non copper zone was found on the board to export. 2014-06-16 14:04:55 +02:00
unknown 1459f8bfb1 Apply vrml_layer_pth, from Cirilo Bernardo 2014-06-16 14:02:15 +02:00
jean-pierre charras 0d454578f2 Fix a bug in ClassOf which crashes Pcbnew when its argument is NULL. It fixes bug #1329364. 2014-06-12 22:03:57 +02:00
Lorenzo Marcantonio 6d6a70de61 In KIFACE_I::end_common save the 'common' configuration variables loaded in KIFACE_I::begin_common (the background color and the page border flag) 2014-06-12 20:34:16 +02:00
Lorenzo Marcantonio 09ab4d57d0 Fixes #1186269
- Refactored the common part of cursor key movement and crosshair update
  in the various GeneralControl
- Add x10 movement with the keyboard (CTRL modifier)
- Avoid fixup of the cursor position by dummy mouse movements generated
  by cursor warping (original analysis and idea Chris Gibson)
- Do key handling in a way to permit sub-pixel cursor movement
2014-06-12 18:12:14 +02:00
Jean-Samuel Reynaud a9e2f0e3de pcbnew crashed on start compiled with KICAD_SCRIPTING_WXPYTHON=ON 2014-06-12 08:57:00 -05:00
519 changed files with 58166 additions and 45094 deletions
+24 -6
View File
@@ -57,13 +57,31 @@ void S3D_MASTER::ObjectCoordsTo3DUnits( std::vector< S3D_VERTEX >& aVertices )
// adjust rotation
if( m_MatRotation.x )
RotatePoint( &aVertices[ii].y, &aVertices[ii].z, m_MatRotation.x * 10 );
{
double a = aVertices[ii].y;
double b = aVertices[ii].z;
RotatePoint( &a, &b, m_MatRotation.x * 10 );
aVertices[ii].y = (float)a;
aVertices[ii].z = (float)b;
}
if( m_MatRotation.y )
RotatePoint( &aVertices[ii].z, &aVertices[ii].x, m_MatRotation.y * 10 );
{
double a = aVertices[ii].z;
double b = aVertices[ii].x;
RotatePoint( &a, &b, m_MatRotation.x * 10 );
aVertices[ii].z = (float)a;
aVertices[ii].x = (float)b;
}
if( m_MatRotation.z )
RotatePoint( &aVertices[ii].x, &aVertices[ii].y, m_MatRotation.z * 10 );
{
double a = aVertices[ii].x;
double b = aVertices[ii].y;
RotatePoint( &a, &b, m_MatRotation.x * 10 );
aVertices[ii].x = (float)a;
aVertices[ii].y = (float)b;
}
/* adjust offset position (offset is given in UNIT 3D (0.1 inch) */
#define SCALE_3D_CONV ((IU_PER_MILS * 1000) / UNITS3D_TO_UNITSPCB)
@@ -138,9 +156,9 @@ VERTEX_VALUE_CTRL::VERTEX_VALUE_CTRL( wxWindow* aParent, wxBoxSizer* aBoxSizer )
wxString text;
wxFlexGridSizer* gridSizer = new wxFlexGridSizer( 0, 2, 0, 0 );
gridSizer->AddGrowableCol( 1 );
gridSizer->SetFlexibleDirection( wxHORIZONTAL );
gridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
gridSizer->AddGrowableCol( 1 );
gridSizer->SetFlexibleDirection( wxHORIZONTAL );
gridSizer->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
aBoxSizer->Add( gridSizer, 0, wxEXPAND, 5 );
+58 -58
View File
@@ -16,17 +16,23 @@
#include <gestfich.h>
#ifdef __WINDOWS__
#include <GL/glew.h> // must be included before gl.h
#endif
#include <3d_viewer.h>
#include <3d_canvas.h>
#include <info3d_visu.h>
#include <trackball.h>
#include <3d_viewer_id.h>
#include <textures/text_silk.c>
#include <textures/text_pcb.c>
// -----------------
// helper function (from wxWidgets, opengl/cube.cpp sample
// -----------------
void CheckGLError()
void CheckGLError(const char *aFileName, int aLineNumber)
{
GLenum errLast = GL_NO_ERROR;
@@ -47,7 +53,8 @@ void CheckGLError()
errLast = err;
wxLogError(wxT("OpenGL error %d"), err);
wxLogError( wxT( "OpenGL error %d At: %s, line: %d" ), err,
GetChars( FROM_UTF8( aFileName ) ), aLineNumber );
}
}
@@ -78,6 +85,7 @@ EDA_3D_CANVAS::EDA_3D_CANVAS( EDA_3D_FRAME* parent, int* attribList ) :
wxFULL_REPAINT_ON_RESIZE )
{
m_init = false;
m_shadow_init = false;
// Clear all gl list identifiers:
for( int ii = GL_ID_BEGIN; ii < GL_ID_END; ii++ )
@@ -98,7 +106,7 @@ EDA_3D_CANVAS::~EDA_3D_CANVAS()
}
void EDA_3D_CANVAS::ClearLists( GLuint aGlList )
void EDA_3D_CANVAS::ClearLists( int aGlList )
{
if( aGlList )
{
@@ -490,15 +498,46 @@ void EDA_3D_CANVAS::OnEraseBackground( wxEraseEvent& event )
// Do nothing, to avoid flashing.
}
typedef struct s_sImage
{
unsigned int width;
unsigned int height;
unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */
unsigned char pixel_data[64 * 64 * 4 + 1];
}tsImage;
GLuint load_and_generate_texture( tsImage *image )
{
GLuint texture;
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
glPixelStorei (GL_PACK_ALIGNMENT, 1);
glGenTextures( 1, &texture );
glBindTexture( GL_TEXTURE_2D, texture );
gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGBA, image->width, image->height, GL_RGBA, GL_UNSIGNED_BYTE, image->pixel_data );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
return texture;
}
/* Initialize broad parameters for OpenGL */
void EDA_3D_CANVAS::InitGL()
{
wxSize size = GetClientSize();
if( !m_init )
{
m_init = true;
m_text_pcb = load_and_generate_texture( (tsImage *)&text_pcb );
m_text_silk = load_and_generate_texture( (tsImage *)&text_silk );
g_Parm_3D_Visu.m_Zoom = 1.0;
m_ZBottom = 1.0;
m_ZTop = 10.0;
@@ -513,7 +552,7 @@ void EDA_3D_CANVAS::InitGL()
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
// speedups
glEnable( GL_DITHER );
//glEnable( GL_DITHER );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_DONT_CARE );
glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
glHint( GL_POLYGON_SMOOTH_HINT, GL_NICEST );
@@ -521,52 +560,7 @@ void EDA_3D_CANVAS::InitGL()
// Initialize alpha blending function.
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
}
// set viewing projection
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
#define MAX_VIEW_ANGLE 160.0 / 45.0
if( g_Parm_3D_Visu.m_Zoom > MAX_VIEW_ANGLE )
g_Parm_3D_Visu.m_Zoom = MAX_VIEW_ANGLE;
if( Parent()->ModeIsOrtho() )
{
// OrthoReductionFactor is chosen so as to provide roughly the same size as
// Perspective View
const double orthoReductionFactor = 400 / g_Parm_3D_Visu.m_Zoom;
// Initialize Projection Matrix for Ortographic View
glOrtho( -size.x / orthoReductionFactor, size.x / orthoReductionFactor,
-size.y / orthoReductionFactor, size.y / orthoReductionFactor, 1, 10 );
}
else
{
// Ratio width / height of the window display
double ratio_HV = (double) size.x / size.y;
// Initialize Projection Matrix for Perspective View
gluPerspective( 45.0 * g_Parm_3D_Visu.m_Zoom, ratio_HV, 1, 10 );
}
// position viewer
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0.0F, 0.0F, -( m_ZBottom + m_ZTop) / 2 );
// clear color and depth buffers
glClearColor( g_Parm_3D_Visu.m_BgColor.m_Red,
g_Parm_3D_Visu.m_BgColor.m_Green,
g_Parm_3D_Visu.m_BgColor.m_Blue, 1 );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
// Setup light sources:
SetLights();
CheckGLError();
}
}
@@ -578,16 +572,19 @@ void EDA_3D_CANVAS::SetLights()
/* set viewing projection */
light_color[3] = 1.0;
GLfloat Z_axis_pos[4] = { 0.0, 0.0, 3.0, 0.0 };
GLfloat lowZ_axis_pos[4] = { 0.0, 0.0, -3.0, 0.5 };
GLfloat Z_axis_pos[4] = { 0.0, 0.0, 30.0, 0.0 };
GLfloat lowZ_axis_pos[4] = { 0.0, 0.0, -30.0, 0.5 };
/* activate light */
light = 1.0;
light_color[0] = light_color[1] = light_color[2] = light;
glLightfv( GL_LIGHT0, GL_POSITION, Z_axis_pos );
glLightfv( GL_LIGHT0, GL_DIFFUSE, light_color );
light = 0.3;
light_color[0] = light_color[1] = light_color[2] = light;
light_color[0] = 0.3;
light_color[1] = 0.3;
light_color[2] = 0.4;
glLightfv( GL_LIGHT1, GL_POSITION, lowZ_axis_pos );
glLightfv( GL_LIGHT1, GL_DIFFUSE, light_color );
glEnable( GL_LIGHT0 ); // White spot on Z axis
@@ -629,7 +626,7 @@ void EDA_3D_CANVAS::TakeScreenshot( wxCommandEvent& event )
wxYield();
}
struct vieport_params
struct viewport_params
{
GLint originx;
GLint originy;
@@ -637,6 +634,10 @@ void EDA_3D_CANVAS::TakeScreenshot( wxCommandEvent& event )
GLint y;
} viewport;
// Be sure we have the latest 3D view (remember 3D view is buffered)
Refresh();
wxYield();
// Build image from the 3D buffer
wxWindowUpdateLocker noUpdates( this );
glGetIntegerv( GL_VIEWPORT, (GLint*) &viewport );
@@ -654,7 +655,6 @@ void EDA_3D_CANVAS::TakeScreenshot( wxCommandEvent& event )
viewport.x, viewport.y,
GL_ALPHA, GL_UNSIGNED_BYTE, alphabuffer );
image.SetData( pixelbuffer );
image.SetAlpha( alphabuffer );
image = image.Mirror( false );
+88 -7
View File
@@ -46,7 +46,8 @@
class BOARD_DESIGN_SETTINGS;
class EDA_3D_FRAME;
class S3D_VERTEX;
class CPOLYGONS_LIST;
class VIA;
class D_PAD;
@@ -61,8 +62,14 @@ enum GL_LIST_ID
GL_ID_BOARD, // List id for copper layers
GL_ID_TECH_LAYERS, // List id for non copper layers (masks...)
GL_ID_AUX_LAYERS, // List id for user layers (draw, eco, comment)
GL_ID_3DSHAPES_SOLID, // List id for 3D shapes, non transparent entities
GL_ID_3DSHAPES_TRANSP, // List id for 3D shapes, transparent entities
GL_ID_3DSHAPES_SOLID_FRONT, // List id for 3D shapes, non transparent entities
GL_ID_3DSHAPES_TRANSP_FRONT,// List id for 3D shapes, transparent entities
GL_ID_3DSHAPES_SOLID_BACK, // List id for 3D shapes, non transparent entities
GL_ID_3DSHAPES_TRANSP_BACK,// List id for 3D shapes, transparent entities
GL_ID_SHADOW_FRONT,
GL_ID_SHADOW_BACK,
GL_ID_SHADOW_BOARD,
GL_ID_BODY, // Body only list
GL_ID_END
};
@@ -76,6 +83,17 @@ private:
double m_ZBottom; // position of the back layer
double m_ZTop; // position of the front layer
GLuint m_text_pcb;
GLuint m_text_silk;
bool m_shadow_init;
GLuint m_text_fake_shadow_front;
GLuint m_text_fake_shadow_back;
GLuint m_text_fake_shadow_board;
void Create_and_Render_Shadow_Buffer( GLuint *aDst_gl_texture,
GLuint aTexture_size, bool aDraw_body, int aBlurPasses );
public:
EDA_3D_CANVAS( EDA_3D_FRAME* parent, int* attribList = 0 );
~EDA_3D_CANVAS();
@@ -90,7 +108,7 @@ public:
* @param aGlList = the list to clear.
* if 0 (default) all lists are cleared
*/
void ClearLists( GLuint aGlList = 0 );
void ClearLists( int aGlList = 0 );
// Event functions:
void OnPaint( wxPaintEvent& event );
@@ -117,27 +135,61 @@ public:
void CreateDrawGL_List();
void InitGL();
void SetLights();
void SetOffset(double aPosX, double aPosY)
{
m_draw3dOffset.x = aPosX;
m_draw3dOffset.y = aPosY;
}
private:
/**
* Helper function SetGLTechLayersColor
* Initialize the color to draw the non copper layers
* in realistic mode and normal mode.
*/
void SetGLTechLayersColor( LAYER_NUM aLayer );
/**
* Helper function SetGLCopperColor
* Initialize the copper color to draw the board
* in realistic mode (a golden yellow color )
*/
void SetGLCopperColor();
/**
* Helper function SetGLEpoxyColor
* Initialize the color to draw the epoxy body board in realistic mode.
*/
void SetGLEpoxyColor( double aTransparency = 1.0 );
/**
* Helper function SetGLSolderMaskColor
* Initialize the color to draw the solder mask layers in realistic mode.
*/
void SetGLSolderMaskColor( double aTransparency = 1.0 );
/**
* Function BuildBoard3DView
* Called by CreateDrawGL_List()
* Populates the OpenGL GL_ID_BOARD draw list with board items only on copper layers.
* 3D footprint shapes, tech layers and aux layers are not on this list
*/
void BuildBoard3DView();
void BuildBoard3DView(GLuint aBoardList, GLuint aBodyOnlyList);
/**
* Function BuildTechLayers3DView
* Called by CreateDrawGL_List()
* Populates the OpenGL GL_ID_BOARD draw list with items on tech layers
* Populates the OpenGL GL_ID_TECH_LAYERS draw list with items on tech layers
*/
void BuildTechLayers3DView();
/**
* Function BuildShadowList
* Called by CreateDrawGL_List()
*/
void BuildShadowList( GLuint aFrontList, GLuint aBacklist, GLuint aBoardList );
/**
* Function BuildFootprintShape3DList
* Called by CreateDrawGL_List()
@@ -148,7 +200,8 @@ public:
* which need to be drawn after all other items
*/
void BuildFootprintShape3DList( GLuint aOpaqueList,
GLuint aTransparentList);
GLuint aTransparentList,
bool aSideToLoad );
/**
* Function BuildBoard3DAuxLayers
* Called by CreateDrawGL_List()
@@ -160,10 +213,38 @@ public:
void Draw3DGrid( double aGriSizeMM );
void Draw3DAxis();
/**
* Helper function BuildPadShapeThickOutlineAsPolygon:
* Build a pad outline as non filled polygon, to draw pads on silkscreen layer
* with a line thickness = aWidth
* Used only to draw pads outlines on silkscreen layers.
*/
void BuildPadShapeThickOutlineAsPolygon( const D_PAD* aPad,
CPOLYGONS_LIST& aCornerBuffer,
int aWidth,
int aCircleToSegmentsCount,
double aCorrectionFactor );
/**
* Helper function Draw3DViaHole:
* Draw the via hole:
* Build a vertical hole (a cylinder) between the first and the last via layers
*/
void Draw3DViaHole( const VIA * aVia );
/**
* Helper function Draw3DPadHole:
* Draw the pad hole:
* Build a vertical hole (round or oblong) between the front and back layers
*/
void Draw3DPadHole( const D_PAD * aPad );
void GenerateFakeShadowsTextures();
DECLARE_EVENT_TABLE()
};
void CheckGLError(const char *aFileName, int aLineNumber);
#endif /* _3D_CANVAS_H_ */
+12 -31
View File
@@ -29,37 +29,8 @@
#include <fctsys.h>
#include <3d_viewer.h>
#include <3d_struct.h>
S3D_MATERIAL::S3D_MATERIAL( S3D_MASTER* father, const wxString& name ) :
EDA_ITEM( father, NOT_USED )
{
m_DiffuseColor.x = m_DiffuseColor.y = m_DiffuseColor.z = 1.0;
m_SpecularColor.x = m_SpecularColor.y = m_SpecularColor.z = 1.0;
m_AmbientIntensity = 1.0;
m_Transparency = 0.0;
m_Shininess = 1.0;
m_Name = name;
}
void S3D_MATERIAL::SetMaterial()
{
S3D_MASTER * s3dParent = (S3D_MASTER *) GetParent();
s3dParent->SetLastTransparency( m_Transparency );
if( ! s3dParent->IsOpenGlAllowed() )
return;
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
glColor4f( m_DiffuseColor.x * m_AmbientIntensity,
m_DiffuseColor.y * m_AmbientIntensity,
m_DiffuseColor.z * m_AmbientIntensity,
1.0 - m_Transparency );
#if 0
glColorMaterial( GL_FRONT_AND_BACK, GL_SPECULAR );
glColor3f( m_SpecularColor.x, m_SpecularColor.y, m_SpecularColor.z );
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
#endif
}
bool S3D_MASTER::IsOpenGlAllowed()
{
@@ -68,9 +39,12 @@ bool S3D_MASTER::IsOpenGlAllowed()
if( m_lastTransparency == 0.0 )
return true;
}
if( m_loadTransparentObjects ) // return true for transparent objects only
if( m_loadTransparentObjects ) // return true for transparent objects only
{
if( m_lastTransparency != 0.0 )
return true;
}
return false;
}
@@ -102,6 +76,13 @@ S3D_MASTER::S3D_MASTER( EDA_ITEM* aParent ) :
m_3D_Drawings = NULL;
m_Materials = NULL;
m_ShapeType = FILE3D_NONE;
m_use_modelfile_diffuseColor = true;
m_use_modelfile_emissiveColor = false;
m_use_modelfile_specularColor = false;
m_use_modelfile_ambientIntensity = false;
m_use_modelfile_transparency = true;
m_use_modelfile_shininess = false;
}
+694 -454
View File
File diff suppressed because it is too large Load Diff
+39 -11
View File
@@ -33,10 +33,7 @@
#include <3d_viewer.h>
#include <info3d_visu.h>
#include <3d_draw_basic_functions.h>
// Imported function:
extern void TransfertToGLlist( std::vector<S3D_VERTEX>& aVertices, double aBiuTo3DUnits );
extern void CheckGLError();
#include <modelparsers.h>
// Number of segments to approximate a circle by segments
#define SEGM_PER_CIRCLE 16
@@ -54,14 +51,15 @@ static void CALLBACK tessCPolyPt2Vertex( const GLvoid* data );
// 2 helper functions to set the current normal vector for gle items
static inline void SetNormalZpos()
{
glNormal3f( 0.0, 0.0, 1.0 );
//glNormal3f( 0.0, 0.0, 1.0 );
}
static inline void SetNormalZneg()
{
glNormal3f( 0.0, 0.0, -1.0 );
//glNormal3f( 0.0, 0.0, -1.0 );
}
void TransfertToGLlist( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUnits );
/* Draw3D_VerticalPolygonalCylinder is a helper function.
*
@@ -132,6 +130,15 @@ void SetGLColor( EDA_COLOR_T color, double alpha )
glColor4f( red, green, blue, alpha );
}
static float m_texture_scale;
void SetGLTexture( GLuint text_id, float scale )
{
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, text_id );
m_texture_scale = scale;
}
/* draw all solid polygons found in aPolysList
* aZpos = z position in board internal units
@@ -152,9 +159,9 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
gluTessCallback( tess, GLU_TESS_VERTEX, ( void (CALLBACK*) () )tessCPolyPt2Vertex );
GLdouble v_data[3];
double zpos = ( aZpos + (aThickness / 2) ) * aBiuTo3DUnits;
double zpos = ( aZpos + (aThickness / 2.0) ) * aBiuTo3DUnits;
g_Parm_3D_Visu.m_CurrentZpos = zpos;
v_data[2] = aZpos + (aThickness / 2);
v_data[2] = aZpos + (aThickness / 2.0);
// Set normal to toward positive Z axis, for a solid object only (to draw the top side)
if( aThickness )
@@ -165,9 +172,11 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
// Draw solid areas contained in this list
CPOLYGONS_LIST polylist = aPolysList; // temporary copy for gluTessVertex
int startContour;
for( int side = 0; side < 2; side++ )
{
int startContour = 1;
startContour = 1;
for( unsigned ii = 0; ii < polylist.GetCornersCount(); ii++ )
{
@@ -178,6 +187,10 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
startContour = 0;
}
// https://www.opengl.org/sdk/docs/man2/xhtml/gluTessNormal.xml
gluTessNormal( tess, 0.0, 0.0, 0.0 );
v_data[0] = polylist.GetX( ii ) * aBiuTo3DUnits;
v_data[1] = -polylist.GetY( ii ) * aBiuTo3DUnits;
// gluTessVertex store pointers on data, not data, so do not store
@@ -186,6 +199,7 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
// before calling gluDeleteTess
gluTessVertex( tess, v_data, &polylist[ii] );
if( polylist.IsEndContour( ii ) )
{
gluTessEndContour( tess );
@@ -198,20 +212,28 @@ void Draw3D_SolidHorizontalPolyPolygons( const CPOLYGONS_LIST& aPolysList,
break;
// Prepare the bottom side of solid areas
zpos = ( aZpos - (aThickness / 2) ) * aBiuTo3DUnits;
zpos = ( aZpos - (aThickness / 2.0) ) * aBiuTo3DUnits;
g_Parm_3D_Visu.m_CurrentZpos = zpos;
v_data[2] = zpos;
// Now;, set normal to toward negative Z axis, for the solid object bottom side
SetNormalZneg();
}
if( startContour == 0 )
{
gluTessEndContour( tess );
gluTessEndPolygon( tess );
}
gluDeleteTess( tess );
if( aThickness == 0 )
{
return;
}
// Build the 3D data : vertical side
Draw3D_VerticalPolygonalCylinder( polylist, aThickness, aZpos - (aThickness / 2), false, aBiuTo3DUnits );
Draw3D_VerticalPolygonalCylinder( polylist, aThickness, aZpos - (aThickness / 2.0), false, aBiuTo3DUnits );
}
@@ -400,6 +422,12 @@ void CALLBACK tessCPolyPt2Vertex( const GLvoid* data )
// cast back to double type
const CPolyPt* ptr = (const CPolyPt*) data;
if( g_Parm_3D_Visu.IsRealisticMode() && g_Parm_3D_Visu.HightQualityMode() )
{
glTexCoord2f( ptr->x* g_Parm_3D_Visu.m_BiuTo3Dunits * m_texture_scale,
-ptr->y * g_Parm_3D_Visu.m_BiuTo3Dunits * m_texture_scale);
}
glVertex3d( ptr->x * g_Parm_3D_Visu.m_BiuTo3Dunits,
-ptr->y * g_Parm_3D_Visu.m_BiuTo3Dunits,
g_Parm_3D_Visu.m_CurrentZpos );
+8
View File
@@ -126,4 +126,12 @@ void Draw3D_ZaxisOblongCylinder( wxPoint aAxis1Pos, wxPoint aAxis2Pos,
void SetGLColor( EDA_COLOR_T aColor, double aTransparency = 1.0 );
/**
* Set a texture id and a scale to apply when rendering the polygons
* @param text_id = texture ID created by glGenTextures
* @param scale = scale to apply to texture coords
*/
void SetGLTexture( GLuint text_id, float scale );
#endif // _3D_DRAW_BASIC_FUNCTIONS_H_
+395
View File
@@ -0,0 +1,395 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file 3d_draw_helper_functions.cpp
*/
#include <fctsys.h>
#include <PolyLine.h>
#include <colors.h>
#include <colors_selection.h>
#include <class_pad.h>
#include <class_track.h>
#include <convert_basic_shapes_to_polygon.h>
#include <3d_viewer.h>
#include <3d_canvas.h>
#include <info3d_visu.h>
#include <3d_draw_basic_functions.h>
// Helper function: initialize the copper color to draw the board
// in realistic mode.
void EDA_3D_CANVAS::SetGLCopperColor()
{
glDisable( GL_TEXTURE_2D );
// Generates a golden yellow color, near board "copper" color
const double lum = 0.7/255.0;
glColor4f( 255.0*lum, 223.0*lum, 0.0*lum, 1.0 );
}
// Helper function: initialize the color to draw the epoxy
// body board in realistic mode.
void EDA_3D_CANVAS::SetGLEpoxyColor( double aTransparency )
{
// Generates an epoxy color, near board color
const double lum = 0.2/255.0;
glColor4f( 255.0*lum, 218.0*lum, 110.0*lum, aTransparency );
}
// Helper function: initialize the color to draw the
// solder mask layers in realistic mode.
void EDA_3D_CANVAS::SetGLSolderMaskColor( double aTransparency )
{
// Generates a solder mask color
const double lum = 0.2/255.0;
glColor4f( 100.0*lum, 255.0*lum, 180.0*lum, aTransparency );
}
// Helper function: initialize the color to draw the non copper layers
// in realistic mode and normal mode.
void EDA_3D_CANVAS::SetGLTechLayersColor( LAYER_NUM aLayer )
{
EDA_COLOR_T color;
if( g_Parm_3D_Visu.IsRealisticMode() )
{
switch( aLayer )
{
case B_Paste:
case F_Paste:
SetGLColor( DARKGRAY, 0.7 );
break;
case B_SilkS:
case F_SilkS:
SetGLColor( LIGHTGRAY, 0.9 );
if( g_Parm_3D_Visu.HightQualityMode() )
{
SetGLTexture( m_text_silk, 50.0f );
}
break;
case B_Mask:
case F_Mask:
SetGLSolderMaskColor( 0.7 );
if( g_Parm_3D_Visu.HightQualityMode() )
{
SetGLTexture( m_text_pcb, 35.0f );
}
break;
default:
color = g_ColorsSettings.GetLayerColor( aLayer );
SetGLColor( color, 0.7 );
break;
}
}
else
{
color = g_ColorsSettings.GetLayerColor( aLayer );
SetGLColor( color, 0.7 );
}
}
void EDA_3D_CANVAS::Draw3DAxis()
{
if( ! m_glLists[GL_ID_AXIS] )
{
m_glLists[GL_ID_AXIS] = glGenLists( 1 );
glNewList( m_glLists[GL_ID_AXIS], GL_COMPILE );
glEnable( GL_COLOR_MATERIAL );
SetGLColor( WHITE );
glBegin( GL_LINES );
glNormal3f( 0.0f, 0.0f, 1.0f ); // Normal is Z axis
glVertex3f( 0.0f, 0.0f, 0.0f );
glVertex3f( 1.0f, 0.0f, 0.0f ); // X axis
glVertex3f( 0.0f, 0.0f, 0.0f );
glVertex3f( 0.0f, -1.0f, 0.0f ); // Y axis
glNormal3f( 1.0f, 0.0f, 0.0f ); // Normal is Y axis
glVertex3f( 0.0f, 0.0f, 0.0f );
glVertex3f( 0.0f, 0.0f, 0.3f ); // Z axis
glEnd();
glEndList();
}
}
// draw a 3D grid: an horizontal grid (XY plane and Z = 0,
// and a vertical grid (XZ plane and Y = 0)
void EDA_3D_CANVAS::Draw3DGrid( double aGriSizeMM )
{
double zpos = 0.0;
EDA_COLOR_T gridcolor = DARKGRAY; // Color of grid lines
EDA_COLOR_T gridcolor_marker = LIGHTGRAY; // Color of grid lines every 5 lines
const double scale = g_Parm_3D_Visu.m_BiuTo3Dunits;
const double transparency = 0.3;
glNormal3f( 0.0, 0.0, 1.0 );
wxSize brd_size = g_Parm_3D_Visu.m_BoardSize;
wxPoint brd_center_pos = g_Parm_3D_Visu.m_BoardPos;
NEGATE( brd_center_pos.y );
int xsize = std::max( brd_size.x, Millimeter2iu( 100 ) );
int ysize = std::max( brd_size.y, Millimeter2iu( 100 ) );
// Grid limits, in 3D units
double xmin = (brd_center_pos.x - xsize / 2) * scale;
double xmax = (brd_center_pos.x + xsize / 2) * scale;
double ymin = (brd_center_pos.y - ysize / 2) * scale;
double ymax = (brd_center_pos.y + ysize / 2) * scale;
double zmin = Millimeter2iu( -50 ) * scale;
double zmax = Millimeter2iu( 100 ) * scale;
// Draw horizontal grid centered on 3D origin (center of the board)
for( int ii = 0; ; ii++ )
{
if( (ii % 5) )
SetGLColor( gridcolor, transparency );
else
SetGLColor( gridcolor_marker, transparency );
int delta = KiROUND( ii * aGriSizeMM * IU_PER_MM );
if( delta <= xsize / 2 ) // Draw grid lines parallel to X axis
{
glBegin( GL_LINES );
glVertex3f( (brd_center_pos.x + delta) * scale, -ymin, zpos );
glVertex3f( (brd_center_pos.x + delta) * scale, -ymax, zpos );
glEnd();
if( ii != 0 )
{
glBegin( GL_LINES );
glVertex3f( (brd_center_pos.x - delta) * scale, -ymin, zpos );
glVertex3f( (brd_center_pos.x - delta) * scale, -ymax, zpos );
glEnd();
}
}
if( delta <= ysize / 2 ) // Draw grid lines parallel to Y axis
{
glBegin( GL_LINES );
glVertex3f( xmin, -(brd_center_pos.y + delta) * scale, zpos );
glVertex3f( xmax, -(brd_center_pos.y + delta) * scale, zpos );
glEnd();
if( ii != 0 )
{
glBegin( GL_LINES );
glVertex3f( xmin, -(brd_center_pos.y - delta) * scale, zpos );
glVertex3f( xmax, -(brd_center_pos.y - delta) * scale, zpos );
glEnd();
}
}
if( ( delta > ysize / 2 ) && ( delta > xsize / 2 ) )
break;
}
// Draw vertical grid n Z axis
glNormal3f( 0.0, -1.0, 0.0 );
// Draw vertical grid lines (parallel to Z axis)
for( int ii = 0; ; ii++ )
{
if( (ii % 5) )
SetGLColor( gridcolor, transparency );
else
SetGLColor( gridcolor_marker, transparency );
double delta = ii * aGriSizeMM * IU_PER_MM;
glBegin( GL_LINES );
glVertex3f( (brd_center_pos.x + delta) * scale, -brd_center_pos.y * scale, zmin );
glVertex3f( (brd_center_pos.x + delta) * scale, -brd_center_pos.y * scale, zmax );
glEnd();
if( ii != 0 )
{
glBegin( GL_LINES );
glVertex3f( (brd_center_pos.x - delta) * scale, -brd_center_pos.y * scale, zmin );
glVertex3f( (brd_center_pos.x - delta) * scale, -brd_center_pos.y * scale, zmax );
glEnd();
}
if( delta > xsize / 2 )
break;
}
// Draw horizontal grid lines on Z axis
for( int ii = 0; ; ii++ )
{
if( (ii % 5) )
SetGLColor( gridcolor, transparency);
else
SetGLColor( gridcolor_marker, transparency );
double delta = ii * aGriSizeMM * IU_PER_MM * scale;
if( delta <= zmax )
{
// Draw grid lines on Z axis (positive Z axis coordinates)
glBegin( GL_LINES );
glVertex3f( xmin, -brd_center_pos.y * scale, delta );
glVertex3f( xmax, -brd_center_pos.y * scale, delta );
glEnd();
}
if( delta <= -zmin && ( ii != 0 ) )
{
// Draw grid lines on Z axis (negative Z axis coordinates)
glBegin( GL_LINES );
glVertex3f( xmin, -brd_center_pos.y * scale, -delta );
glVertex3f( xmax, -brd_center_pos.y * scale, -delta );
glEnd();
}
if( ( delta > zmax ) && ( delta > -zmin ) )
break;
}
}
// Draw 3D pads.
void EDA_3D_CANVAS::Draw3DPadHole( const D_PAD* aPad )
{
// Draw the pad hole
wxSize drillsize = aPad->GetDrillSize();
bool hasHole = drillsize.x && drillsize.y;
if( !hasHole )
return;
// Store here the points to approximate hole by segments
CPOLYGONS_LIST holecornersBuffer;
int thickness = g_Parm_3D_Visu.GetCopperThicknessBIU();
int height = g_Parm_3D_Visu.GetLayerZcoordBIU( F_Cu ) -
g_Parm_3D_Visu.GetLayerZcoordBIU( B_Cu );
if( g_Parm_3D_Visu.IsRealisticMode() )
SetGLCopperColor();
else
SetGLColor( DARKGRAY );
int holeZpoz = g_Parm_3D_Visu.GetLayerZcoordBIU( B_Cu ) + thickness / 2;
int holeHeight = height - thickness;
if( drillsize.x == drillsize.y ) // usual round hole
{
Draw3D_ZaxisCylinder( aPad->GetPosition(),
(drillsize.x + thickness) / 2, holeHeight,
thickness, holeZpoz, g_Parm_3D_Visu.m_BiuTo3Dunits );
}
else // Oblong hole
{
wxPoint ends_offset;
int width;
if( drillsize.x > drillsize.y ) // Horizontal oval
{
ends_offset.x = ( drillsize.x - drillsize.y ) / 2;
width = drillsize.y;
}
else // Vertical oval
{
ends_offset.y = ( drillsize.y - drillsize.x ) / 2;
width = drillsize.x;
}
RotatePoint( &ends_offset, aPad->GetOrientation() );
wxPoint start = aPad->GetPosition() + ends_offset;
wxPoint end = aPad->GetPosition() - ends_offset;
int hole_radius = ( width + thickness ) / 2;
// Draw the hole
Draw3D_ZaxisOblongCylinder( start, end, hole_radius, holeHeight,
thickness, holeZpoz, g_Parm_3D_Visu.m_BiuTo3Dunits );
}
}
void EDA_3D_CANVAS::Draw3DViaHole( const VIA* aVia )
{
LAYER_ID top_layer, bottom_layer;
int inner_radius = aVia->GetDrillValue() / 2;
int thickness = g_Parm_3D_Visu.GetCopperThicknessBIU();
aVia->LayerPair( &top_layer, &bottom_layer );
// Drawing via hole:
if( g_Parm_3D_Visu.IsRealisticMode() )
SetGLCopperColor();
else
{
EDA_COLOR_T color = g_ColorsSettings.GetItemColor( VIAS_VISIBLE + aVia->GetViaType() );
SetGLColor( color );
}
int height = g_Parm_3D_Visu.GetLayerZcoordBIU( top_layer ) -
g_Parm_3D_Visu.GetLayerZcoordBIU( bottom_layer ) - thickness;
int zpos = g_Parm_3D_Visu.GetLayerZcoordBIU( bottom_layer ) + thickness / 2;
Draw3D_ZaxisCylinder( aVia->GetStart(), inner_radius + thickness / 2, height,
thickness, zpos, g_Parm_3D_Visu.m_BiuTo3Dunits );
}
/* Build a pad outline as non filled polygon, to draw pads on silkscreen layer
* Used only to draw pads outlines on silkscreen layers.
*/
void EDA_3D_CANVAS::BuildPadShapeThickOutlineAsPolygon( const D_PAD* aPad,
CPOLYGONS_LIST& aCornerBuffer,
int aWidth,
int aCircleToSegmentsCount,
double aCorrectionFactor )
{
if( aPad->GetShape() == PAD_CIRCLE ) // Draw a ring
{
TransformRingToPolygon( aCornerBuffer, aPad->ShapePos(),
aPad->GetSize().x / 2, aCircleToSegmentsCount, aWidth );
return;
}
// For other shapes, draw polygon outlines
CPOLYGONS_LIST corners;
aPad->BuildPadShapePolygon( corners, wxSize( 0, 0 ),
aCircleToSegmentsCount, aCorrectionFactor );
// Add outlines as thick segments in polygon buffer
for( unsigned ii = 0, jj = corners.GetCornersCount() - 1;
ii < corners.GetCornersCount(); jj = ii, ii++ )
{
TransformRoundedEndsSegmentToPolygon( aCornerBuffer,
corners.GetPos( jj ),
corners.GetPos( ii ),
aCircleToSegmentsCount, aWidth );
}
}
+81 -6
View File
@@ -45,6 +45,7 @@ static const wxChar keyBgColor_Red[] = wxT( "BgColor_Red" );
static const wxChar keyBgColor_Green[] = wxT( "BgColor_Green" );
static const wxChar keyBgColor_Blue[] = wxT( "BgColor_Blue" );
static const wxChar keyShowRealisticMode[] = wxT( "ShowRealisticMode" );
static const wxChar keyUseHQinRealisticMode[] = wxT( "UseHQinRealisticMode" );
static const wxChar keyShowAxis[] = wxT( "ShowAxis" );
static const wxChar keyShowGrid[] = wxT( "ShowGrid3D" );
static const wxChar keyShowGridSize[] = wxT( "Grid3DSize" );
@@ -106,7 +107,72 @@ EDA_3D_FRAME::EDA_3D_FRAME( KIWAY* aKiway, PCB_BASE_FRAME* aParent,
ReCreateMainToolbar();
// Make a EDA_3D_CANVAS
int attrs[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0 };
// Note: We try to use anti aliasing if the graphic card allows that,
// but only on wxWidgets >= 3.0.0 (this option does not exist on wxWidgets 2.8)
int attrs[] = { // This array should be 2*n+1
// Sadly wxwidgets / glx < 13 allowed
// a thing named "boolean attributes" that don't take a value.
// (See src/unix/glx11.cpp -> wxGLCanvasX11::ConvertWXAttrsToGL() ).
// To avoid problems due to this, just specify those attributes twice.
// Only WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_STEREO are such boolean
// attributes.
// Boolean attributes (using itself at padding):
WX_GL_RGBA, WX_GL_RGBA,
WX_GL_DOUBLEBUFFER, WX_GL_DOUBLEBUFFER,
// Normal attributes with values:
WX_GL_DEPTH_SIZE, 16,
WX_GL_STENCIL_SIZE, 1,
#if wxCHECK_VERSION( 3, 0, 0 )
WX_GL_SAMPLE_BUFFERS, 1, // Enable multisampling support (antialiasing).
WX_GL_SAMPLES, 0, // Disable AA for the start.
#endif
0 }; // NULL termination
#if wxCHECK_VERSION( 3, 0, 0 )
unsigned int ii;
// Check if the canvas supports multisampling.
if( EDA_3D_CANVAS::IsDisplaySupported( attrs ) )
{
// Check for possible sample sizes, start form the top.
int maxSamples = 8; // Any higher doesn't change anything.
int samplesOffset = 0;
for( ii = 0; ii < sizeof( attrs ) / sizeof( attrs[0] ) - 1; ii += 2 )
{
if( attrs[ii] == WX_GL_SAMPLES )
{
samplesOffset = ii+1;
break;
}
}
attrs[samplesOffset] = maxSamples;
for( ; maxSamples > 0 && !EDA_3D_CANVAS::IsDisplaySupported( attrs );
maxSamples = maxSamples>>1 )
{
attrs[samplesOffset] = maxSamples;
}
}
else
{
// Disable multisampling
for( ii = 0; ii < sizeof( attrs ) / sizeof( attrs[0] ) - 1; ii += 2 )
{
if( attrs[ii] == WX_GL_SAMPLE_BUFFERS )
{
attrs[ii+1] = 0;
break;
}
}
}
#endif
m_canvas = new EDA_3D_CANVAS( this, attrs );
m_auimgr.SetManagedWindow( this );
@@ -159,6 +225,9 @@ void EDA_3D_FRAME::LoadSettings( wxConfigBase* aCfg )
aCfg->Read( keyShowRealisticMode, &tmp, false );
prms.SetFlag( FL_USE_REALISTIC_MODE, tmp );
aCfg->Read( keyUseHQinRealisticMode, &tmp, false );
prms.SetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE, tmp );
aCfg->Read( keyShowAxis, &tmp, true );
prms.SetFlag( FL_AXIS, tmp );
@@ -210,6 +279,7 @@ void EDA_3D_FRAME::SaveSettings( wxConfigBase* aCfg )
aCfg->Write( keyBgColor_Green, g_Parm_3D_Visu.m_BgColor.m_Green );
aCfg->Write( keyBgColor_Blue, g_Parm_3D_Visu.m_BgColor.m_Blue );
aCfg->Write( keyShowRealisticMode, prms.GetFlag( FL_USE_REALISTIC_MODE ) );
aCfg->Write( keyUseHQinRealisticMode, prms.GetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE ) );
aCfg->Write( keyShowAxis, prms.GetFlag( FL_AXIS ) );
aCfg->Write( keyShowGrid, prms.GetFlag( FL_GRID ) );
aCfg->Write( keyShowGridSize, prms.m_3D_Grid );
@@ -363,6 +433,11 @@ void EDA_3D_FRAME::Process_Special_Functions( wxCommandEvent& event )
NewDisplay();
return;
case ID_MENU3D_MAX_QUALITY_FOR_REALISTIC_MODE:
g_Parm_3D_Visu.SetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE, isChecked );
NewDisplay();
return;
case ID_MENU3D_SHOW_BOARD_BODY:
g_Parm_3D_Visu.SetFlag( FL_SHOW_BOARD_BODY, isChecked );
NewDisplay();
@@ -400,7 +475,7 @@ void EDA_3D_FRAME::Process_Special_Functions( wxCommandEvent& event )
case ID_MENU3D_SOLDER_MASK_ONOFF:
g_Parm_3D_Visu.SetFlag( FL_SOLDERMASK, isChecked );
NewDisplay(GL_ID_TECH_LAYERS);
NewDisplay(GL_ID_TECH_LAYERS);
return;
case ID_MENU3D_SOLDER_PASTE_ONOFF:
@@ -475,7 +550,7 @@ void EDA_3D_FRAME::On3DGridSelection( wxCommandEvent& event )
}
void EDA_3D_FRAME::NewDisplay( GLuint aGlList )
void EDA_3D_FRAME::NewDisplay( int aGlList )
{
m_reloadRequest = false;
@@ -511,15 +586,15 @@ void EDA_3D_FRAME::Set3DBgColor()
newcolor = wxGetColourFromUser( this, oldcolor );
if( !newcolor.IsOk() ) // Happens on cancel dialog
if( !newcolor.IsOk() ) // Cancel command
return;
if( newcolor != oldcolor )
{
g_Parm_3D_Visu.m_BgColor.m_Red = (double) newcolor.Red() / 255.0;
g_Parm_3D_Visu.m_BgColor.m_Red = (double) newcolor.Red() / 255.0;
g_Parm_3D_Visu.m_BgColor.m_Green = (double) newcolor.Green() / 255.0;
g_Parm_3D_Visu.m_BgColor.m_Blue = (double) newcolor.Blue() / 255.0;
NewDisplay();
m_canvas->Redraw();
}
}
+136
View File
@@ -0,0 +1,136 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file 3d_class.cpp
*/
#include <fctsys.h>
#include <3d_struct.h>
#include <3d_material.h>
#ifdef __WXMAC__
# ifdef __DARWIN__
# include <OpenGL/glu.h>
# else
# include <glu.h>
# endif
#else
# include <GL/glu.h>
#endif
S3D_MATERIAL::S3D_MATERIAL( S3D_MASTER* father, const wxString& name ) :
EDA_ITEM( father, NOT_USED )
{
m_Name = name;
m_AmbientColor.clear();
m_DiffuseColor.clear();
m_EmissiveColor.clear();
m_SpecularColor.clear();
m_Shininess.clear();
m_Transparency.clear();
}
void SetOpenGlDefaultMaterial()
{
glm::vec4 ambient( 0.15, 0.15, 0.15, 1.0 );
glm::vec4 specular( 0.1, 0.1, 0.1, 1.0 );
glm::vec4 emissive( 0.1, 0.1, 0.1, 1.0 );
GLint shininess_value = 80;
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
//glColor4f( 1.0, 1.0, 1.0, 1.0 );
glMateriali ( GL_FRONT_AND_BACK, GL_SHININESS, shininess_value );
glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.x );
glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.x );
glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.x );
}
void S3D_MATERIAL::SetOpenGLMaterial( unsigned int materialIndex )
{
S3D_MASTER * s3dParent = (S3D_MASTER *) GetParent();
if( ! s3dParent->IsOpenGlAllowed() )
return;
float transparency_value = 0.0f;
if( m_Transparency.size() > materialIndex )
{
transparency_value = m_Transparency[materialIndex];
s3dParent->SetLastTransparency( transparency_value );
}
if( m_DiffuseColor.size() > materialIndex )
{
glm::vec3 color = m_DiffuseColor[materialIndex];
if( m_AmbientColor.size() == 0 )
{
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
}
glColor4f( color.x, color.y, color.z, 1.0 - transparency_value );
}
if( m_Shininess.size() > materialIndex )
{
glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, m_Shininess[materialIndex] );
}
// emissive
if( m_EmissiveColor.size() > materialIndex )
{
glm::vec4 emissive;
emissive[0] = m_EmissiveColor[materialIndex].x;
emissive[1] = m_EmissiveColor[materialIndex].y;
emissive[2] = m_EmissiveColor[materialIndex].z;
emissive[3] = 1.0f;
glMaterialfv( GL_FRONT_AND_BACK, GL_EMISSION, &emissive.x );
}
// specular
if( m_SpecularColor.size() > materialIndex )
{
glm::vec4 specular;
specular[0] = m_SpecularColor[materialIndex].x;
specular[1] = m_SpecularColor[materialIndex].y;
specular[2] = m_SpecularColor[materialIndex].z;
specular[3] = 1.0f;
glMaterialfv( GL_FRONT_AND_BACK, GL_SPECULAR, &specular.x );
}
// ambient
if( m_AmbientColor.size() > materialIndex )
{
glm::vec4 ambient;
ambient[0] = m_AmbientColor[materialIndex].x;
ambient[1] = m_AmbientColor[materialIndex].y;
ambient[2] = m_AmbientColor[materialIndex].z;
ambient[3] = 1.0f;
glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.x );
}
}
+66
View File
@@ -0,0 +1,66 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file 3d_material.h
*/
#ifndef STRUCT_3D_MATERIAL_H
#define STRUCT_3D_MATERIAL_H
#include <common.h>
#include <base_struct.h>
#include <gal/opengl/glm/glm.hpp>
class S3D_MASTER;
class S3D_MATERIAL : public EDA_ITEM /* openGL "material" data*/
{
public:
wxString m_Name;
// Material list
std::vector< glm::vec3 > m_AmbientColor;
std::vector< glm::vec3 > m_DiffuseColor;
std::vector< glm::vec3 > m_EmissiveColor;
std::vector< glm::vec3 > m_SpecularColor;
std::vector< float > m_Shininess;
std::vector< float > m_Transparency;
public:
S3D_MATERIAL( S3D_MASTER* father, const wxString& name );
S3D_MATERIAL* Next() const { return (S3D_MATERIAL*) Pnext; }
S3D_MATERIAL* Back() const { return (S3D_MATERIAL*) Pback; }
void SetOpenGLMaterial(unsigned int materialIndex);
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
#endif
};
void SetOpenGlDefaultMaterial();
#endif
+408
View File
@@ -0,0 +1,408 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file 3d_mesh_model.cpp
* @brief
*/
#include <3d_mesh_model.h>
#include <boost/geometry/algorithms/area.hpp>
S3D_MESH::S3D_MESH()
{
isPerFaceNormalsComputed = false;
isPointNormalizedComputed = false;
isPerPointNormalsComputed = false;
m_Materials = NULL;
childs.clear();
m_translation = glm::vec3( 0.0f, 0.0f, 0.0f );
m_rotation = glm::vec4( 0.0f, 0.0f, 0.0f, 0.0f );
m_scale = glm::vec3( 1.0f, 1.0f, 1.0f );
m_scaleOrientation = glm::vec4( 0.0f, 0.0f, 1.0f, 0.0f ); // not used
m_center = glm::vec3( 0.0f, 0.0f, 0.0f ); // not used
}
S3D_MESH::~S3D_MESH()
{
for( unsigned int idx = 0; idx < childs.size(); idx++ )
{
delete childs[idx];
}
}
void S3D_MESH::openGL_RenderAllChilds()
{
//DBG( printf( "openGL_RenderAllChilds") );
glPushMatrix();
glTranslatef( m_translation.x, m_translation.y, m_translation.z );
glRotatef( m_rotation[3], m_rotation[0], m_rotation[1], m_rotation[2] );
glScalef( m_scale.x, m_scale.y, m_scale.z );
SetOpenGlDefaultMaterial();
// Render your self
openGL_Render();
// Render childs
for( unsigned int idx = 0; idx < childs.size(); idx++ )
{
childs[idx]->openGL_Render();
}
SetOpenGlDefaultMaterial();
glPopMatrix();
}
void S3D_MESH::openGL_Render()
{
//DBG( printf( "openGL_Render" ) );
if( m_Materials )
{
m_Materials->SetOpenGLMaterial( 0 );
}
if( m_CoordIndex.size() == 0)
{
return;
}
glPushMatrix();
glTranslatef( m_translation.x, m_translation.y, m_translation.z );
glRotatef( m_rotation[3], m_rotation[0], m_rotation[1], m_rotation[2] );
glScalef( m_scale.x, m_scale.y, m_scale.z );
std::vector< glm::vec3 > normals;
calcPointNormalized();
calcPerFaceNormals();
if( m_PerVertexNormalsNormalized.size() == 0 )
{
if( g_Parm_3D_Visu.IsRealisticMode() && g_Parm_3D_Visu.HightQualityMode() )
{
calcPerPointNormals();
}
}
for( unsigned int idx = 0; idx < m_CoordIndex.size(); idx++ )
{
if( m_MaterialIndex.size() > 1 )
{
if( m_Materials )
{
m_Materials->SetOpenGLMaterial( m_MaterialIndex[idx] );
}
}
switch( m_CoordIndex[idx].size() )
{
case 3: glBegin( GL_TRIANGLES );break;
case 4: glBegin( GL_QUADS ); break;
default: glBegin( GL_POLYGON ); break;
}
if( m_PerVertexNormalsNormalized.size() > 0 )
{
for( unsigned int ii = 0; ii < m_CoordIndex[idx].size(); ii++ )
{
glm::vec3 normal = m_PerVertexNormalsNormalized[m_NormalIndex[idx][ii]];
glNormal3fv( &normal.x );
glm::vec3 point = m_Point[m_CoordIndex[idx][ii]];
glVertex3fv( &point.x );
}
} else if( g_Parm_3D_Visu.IsRealisticMode() && g_Parm_3D_Visu.HightQualityMode() )
{
std::vector< glm::vec3 > normals_list;
normals_list = m_PerFaceVertexNormals[idx];
for( unsigned int ii = 0; ii < m_CoordIndex[idx].size(); ii++ )
{
glm::vec3 normal = normals_list[ii];
glNormal3fv( &normal.x );
glm::vec3 point = m_Point[m_CoordIndex[idx][ii]];
glVertex3fv( &point.x );
}
} else
{
// Flat
glm::vec3 normal = m_PerFaceNormalsNormalized[idx];
for( unsigned int ii = 0; ii < m_CoordIndex[idx].size(); ii++ )
{
glNormal3fv( &normal.x );
glm::vec3 point = m_Point[m_CoordIndex[idx][ii]];
glVertex3fv( &point.x );
}
}
glEnd();
}
glPopMatrix();
}
void S3D_MESH::calcPointNormalized ()
{
//DBG( printf( "calcPointNormalized\n" ) );
if( isPointNormalizedComputed == true )
{
return;
}
isPointNormalizedComputed = true;
if( m_PerVertexNormalsNormalized.size() > 0 )
{
return;
}
m_PointNormalized.clear();
float biggerPoint = 0.0f;
for( unsigned int i = 0; i< m_Point.size(); i++ )
{
if( fabs( m_Point[i].x ) > biggerPoint) biggerPoint = fabs( m_Point[i].x );
if( fabs( m_Point[i].y ) > biggerPoint) biggerPoint = fabs( m_Point[i].y );
if( fabs( m_Point[i].z ) > biggerPoint) biggerPoint = fabs( m_Point[i].z );
}
biggerPoint = 1.0 / biggerPoint;
for( unsigned int i= 0; i< m_Point.size(); i++ )
{
glm::vec3 p;
p = m_Point[i] * biggerPoint;
m_PointNormalized.push_back( p );
}
//DBG( printf("m_Point.size %u\n", m_Point.size()) );
}
bool IsClockwise( glm::vec3 v0, glm::vec3 v1, glm::vec3 v2 )
{
double sum = 0.0;
sum += (v1.x - v0.x) * (v1.y + v0.y);
sum += (v2.x - v1.x) * (v2.y + v1.y);
sum += (v0.x - v2.x) * (v0.y + v2.y);
return sum > FLT_EPSILON;
}
void S3D_MESH::calcPerFaceNormals ()
{
//DBG( printf( "calcPerFaceNormals" ) );
if( isPerFaceNormalsComputed == true )
{
return;
}
isPerFaceNormalsComputed = true;
if( m_PerVertexNormalsNormalized.size() > 0 )
{
return;
}
bool haveAlreadyNormals_from_model_file = false;
if( m_PerFaceNormalsNormalized.size() > 0 )
{
haveAlreadyNormals_from_model_file = true;
}
m_PerFaceNormalsRaw.clear();
m_PerFaceSquaredArea.clear();
//DBG( printf("m_CoordIndex.size %u\n", m_CoordIndex.size()) );
//DBG( printf("m_PointNormalized.size %u\n", m_PointNormalized.size()) );
for( unsigned int idx = 0; idx < m_CoordIndex.size(); idx++ )
{
// User normalized and multiply to get better resolution
glm::vec3 v0 = m_PointNormalized[m_CoordIndex[idx][0]];
glm::vec3 v1 = m_PointNormalized[m_CoordIndex[idx][1]];
glm::vec3 v2 = m_PointNormalized[m_CoordIndex[idx][m_CoordIndex[idx].size() - 1]];
/*
// !TODO: improove and check what is best to calc the normal (check what have more resolution)
glm::vec3 v0 = m_Point[m_CoordIndex[idx][0]];
glm::vec3 v1 = m_Point[m_CoordIndex[idx][1]];
glm::vec3 v2 = m_Point[m_CoordIndex[idx][m_CoordIndex[idx].size() - 1]];
*/
glm::vec3 cross_prod;
/*
// This is not working as good as it is expected :/
if( IsClockwise( v0, v1, v2 ) )
{
// CW
cross_prod = glm::cross( v1 - v2, v0 - v2 );
} else
{*/
// CCW
cross_prod = glm::cross( v1 - v0, v2 - v0 );
//}
float area = glm::dot( cross_prod, cross_prod );
if( cross_prod[2] < 0.0 )
{
area = -area;
}
if( area < FLT_EPSILON )
{
area = FLT_EPSILON * 2.0f;
}
m_PerFaceSquaredArea.push_back( area );
m_PerFaceNormalsRaw.push_back( cross_prod );
if( haveAlreadyNormals_from_model_file == false )
{
// normalize vertex normal
float l = glm::length( cross_prod );
if( l > FLT_EPSILON ) // avoid division by zero
{
cross_prod = cross_prod / l;
}
else
{
// Cannot calc normal
if( ( cross_prod.x > cross_prod.y ) && ( cross_prod.x > cross_prod.z ) )
{
cross_prod.x = 1.0; cross_prod.y = 0.0; cross_prod.z = 0.0;
} else if( ( cross_prod.y > cross_prod.x ) && ( cross_prod.y > cross_prod.z ))
{
cross_prod.x = 0.0; cross_prod.y = 1.0; cross_prod.z = 0.0;
} else
{
cross_prod.x = 0.0; cross_prod.y = 1.0; cross_prod.z = 0.0;
}
}
m_PerFaceNormalsNormalized.push_back( cross_prod );
}
}
}
// http://www.bytehazard.com/code/vertnorm.html
// http://www.emeyex.com/site/tuts/VertexNormals.pdf
void S3D_MESH::calcPerPointNormals ()
{
//DBG( printf( "calcPerPointNormals" ) );
if( isPerPointNormalsComputed == true )
{
return;
}
isPerPointNormalsComputed = true;
if( m_PerVertexNormalsNormalized.size() > 0 )
{
return;
}
m_PerFaceVertexNormals.clear();
// for each face A in mesh
for( unsigned int each_face_A_idx = 0; each_face_A_idx < m_CoordIndex.size(); each_face_A_idx++ )
{
// n = face A facet normal
std::vector< glm::vec3 > face_A_normals;
face_A_normals.clear();
face_A_normals.resize(m_CoordIndex[each_face_A_idx].size());
// loop through all 3 vertices
// for each vert in face A
for( unsigned int each_vert_A_idx = 0; each_vert_A_idx < m_CoordIndex[each_face_A_idx].size(); each_vert_A_idx++ )
{
face_A_normals[each_vert_A_idx] = m_PerFaceNormalsRaw[each_face_A_idx] * (m_PerFaceSquaredArea[each_face_A_idx]);
int vertexIndex = (int)(m_CoordIndex[each_face_A_idx][each_vert_A_idx]);
glm::vec3 vector_face_A = m_PerFaceNormalsNormalized[each_face_A_idx];
// for each face B in mesh
for( unsigned int each_face_B_idx = 0; each_face_B_idx < m_CoordIndex.size(); each_face_B_idx++ )
{
//if A != B { // ignore self
if ( each_face_A_idx != each_face_B_idx)
{
if( (m_CoordIndex[each_face_B_idx][0] == vertexIndex) ||
(m_CoordIndex[each_face_B_idx][1] == vertexIndex) ||
(m_CoordIndex[each_face_B_idx][2] == vertexIndex) )
{
glm::vec3 vector_face_B = m_PerFaceNormalsNormalized[each_face_B_idx];
float dot_prod = glm::dot(vector_face_A, vector_face_B);
if( dot_prod > 0.05f )
{
face_A_normals[each_vert_A_idx] += m_PerFaceNormalsRaw[each_face_B_idx] * (m_PerFaceSquaredArea[each_face_B_idx] * dot_prod);
}
}
}
}
// normalize vertex normal
float l = glm::length( face_A_normals[each_vert_A_idx] );
if( l > FLT_EPSILON ) // avoid division by zero
{
face_A_normals[each_vert_A_idx] /= l;
}
}
m_PerFaceVertexNormals.push_back( face_A_normals );
}
}
+101
View File
@@ -0,0 +1,101 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file 3d_mesh_model.h
* @brief
*/
#ifndef __3D_MESH_MODEL_H__
#define __3D_MESH_MODEL_H__
#include <fctsys.h>
#include <common.h>
#include <macros.h>
#include <base_struct.h>
#include <gal/opengl/glm/glm.hpp>
#include <vector>
#include <kicad_string.h>
#include <info3d_visu.h>
#ifdef __WXMAC__
# ifdef __DARWIN__
# include <OpenGL/glu.h>
# else
# include <glu.h>
# endif
#else
# include <GL/glu.h>
#endif
#include <wx/glcanvas.h>
class S3D_MESH;
class S3D_MESH
{
public:
S3D_MESH();
~S3D_MESH();
void openGL_Render();
void openGL_RenderAllChilds();
S3D_MATERIAL *m_Materials;
// Point and index list
std::vector< glm::vec3 > m_Point;
std::vector< std::vector<int> > m_CoordIndex;
std::vector< std::vector<int> > m_NormalIndex;
std::vector< glm::vec3 > m_PerFaceNormalsNormalized;
std::vector< glm::vec3 > m_PerVertexNormalsNormalized;
std::vector< int > m_MaterialIndex;
glm::vec3 m_translation;
glm::vec4 m_rotation;
glm::vec3 m_scale;
glm::vec4 m_scaleOrientation; // not used
glm::vec3 m_center; // not used
std::vector<S3D_MESH *> childs;
private:
std::vector< glm::vec3 > m_PerFaceNormalsRaw;
std::vector< std::vector< glm::vec3 > > m_PerFaceVertexNormals;
std::vector< glm::vec3 > m_PointNormalized;
std::vector< float > m_PerFaceSquaredArea;
std::vector< std::vector<int> > m_InvalidCoordIndexes; //!TODO: check for invalid CoordIndex in file and remove the index and the same material index
bool isPerFaceNormalsComputed;
void calcPerFaceNormals ();
bool isPointNormalizedComputed;
void calcPointNormalized();
bool isPerPointNormalsComputed;
void calcPerPointNormals();
};
#endif
+15 -44
View File
@@ -1,6 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
* Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2011 KiCad Developers, see AUTHORS.txt for contributors.
@@ -32,8 +33,9 @@
#include <common.h>
#include <base_struct.h>
#include <3d_material.h>
#include <gal/opengl/glm/glm.hpp>
/* 3D modeling units -> PCB units conversion scale:
* 1 "3D model unit" wings3d = 1 unit = 2.54 mm = 0.1 inch = 100 mils
*/
@@ -44,48 +46,7 @@ class S3D_MASTER;
class STRUCT_3D_SHAPE;
/* S3D_VERTEX manages a 3D coordinate (3 float numbers: x,y,z coordinates)*/
class S3D_VERTEX
{
public:
double x, y, z;
public:
S3D_VERTEX()
{
x = y = z = 0.0;
}
S3D_VERTEX( double px, double py, double pz)
{
x = px;
y = py;
z = pz;
}
};
class S3D_MATERIAL : public EDA_ITEM /* openGL "material" data*/
{
public:
wxString m_Name;
S3D_VERTEX m_DiffuseColor;
S3D_VERTEX m_EmissiveColor;
S3D_VERTEX m_SpecularColor;
float m_AmbientIntensity;
float m_Transparency;
float m_Shininess;
public:
S3D_MATERIAL( S3D_MASTER* father, const wxString& name );
S3D_MATERIAL* Next() const { return (S3D_MATERIAL*) Pnext; }
S3D_MATERIAL* Back() const { return (S3D_MATERIAL*) Pback; }
void SetMaterial();
#if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
#endif
};
#define S3D_VERTEX glm::vec3
/* Master structure for a 3D item description */
@@ -106,6 +67,14 @@ public:
FILE3D_UNKNOWN
};
// Check defaults in S3D_MASTER
bool m_use_modelfile_diffuseColor;
bool m_use_modelfile_emissiveColor;
bool m_use_modelfile_specularColor;
bool m_use_modelfile_ambientIntensity;
bool m_use_modelfile_transparency;
bool m_use_modelfile_shininess;
private:
wxString m_Shape3DName; /* 3D shape name in 3D library */
FILE3D_TYPE m_ShapeType;
@@ -114,6 +83,8 @@ private:
bool m_loadTransparentObjects;
bool m_loadNonTransparentObjects;
public:
S3D_MASTER( EDA_ITEM* aParent );
~S3D_MASTER();
+26 -15
View File
@@ -153,14 +153,22 @@ void EDA_3D_FRAME::CreateMenuBar()
menuBar->Append( prefsMenu, _( "&Preferences" ) );
AddMenuItem( prefsMenu, ID_MENU3D_REALISTIC_MODE,
_( "Realistic Mode" ), KiBitmap( use_3D_copper_thickness_xpm ), wxITEM_CHECK );
_( "Realistic Mode" ),
KiBitmap( use_3D_copper_thickness_xpm ), wxITEM_CHECK );
AddMenuItem( prefsMenu, ID_MENU3D_MAX_QUALITY_FOR_REALISTIC_MODE,
_( "Max Quality in Realistic Mode" ),
_( "When using max quality, holes are removed from copper zones, "
"but the calculation time is longer" ),
KiBitmap( green_xpm ), wxITEM_CHECK );
prefsMenu->AppendSeparator();
AddMenuItem( prefsMenu, ID_MENU3D_BGCOLOR_SELECTION,
_( "Choose background color" ), KiBitmap( palette_xpm ) );
_( "Choose Background Color" ), KiBitmap( palette_xpm ) );
AddMenuItem( prefsMenu, ID_MENU3D_AXIS_ONOFF,
_( "Show 3D &Axis" ), KiBitmap( axis3d_front_xpm ), wxITEM_CHECK );
_( "Show 3D &Axis" ), KiBitmap( axis3d_front_xpm ), wxITEM_CHECK );
// Creates grid menu
wxMenu * gridlistMenu = new wxMenu;
@@ -231,40 +239,43 @@ void EDA_3D_FRAME::SetMenuBarOptionsState()
wxMenuItem* item;
// Set the state of toggle menus according to the current display options
item = menuBar->FindItem( ID_MENU3D_REALISTIC_MODE );
item->Check(g_Parm_3D_Visu.GetFlag( FL_USE_REALISTIC_MODE ) );
item->Check( g_Parm_3D_Visu.IsRealisticMode() );
item = menuBar->FindItem( ID_MENU3D_MAX_QUALITY_FOR_REALISTIC_MODE );
item->Check( g_Parm_3D_Visu.HightQualityMode() );
item = menuBar->FindItem( ID_MENU3D_SHOW_BOARD_BODY );
item->Check(g_Parm_3D_Visu.GetFlag( FL_SHOW_BOARD_BODY ) );
item->Check( g_Parm_3D_Visu.GetFlag( FL_SHOW_BOARD_BODY ) );
item = menuBar->FindItem( ID_MENU3D_USE_COPPER_THICKNESS );
item->Check(g_Parm_3D_Visu.GetFlag( FL_USE_COPPER_THICKNESS ) );
item->Check( g_Parm_3D_Visu.GetFlag( FL_USE_COPPER_THICKNESS ) );
item = menuBar->FindItem( ID_MENU3D_MODULE_ONOFF );
item->Check(g_Parm_3D_Visu.GetFlag( FL_MODULE ) );
item->Check( g_Parm_3D_Visu.GetFlag( FL_MODULE ) );
item = menuBar->FindItem( ID_MENU3D_ZONE_ONOFF );
item->Check(g_Parm_3D_Visu.GetFlag( FL_ZONE ) );
item->Check( g_Parm_3D_Visu.GetFlag( FL_ZONE ) );
item = menuBar->FindItem( ID_MENU3D_AXIS_ONOFF );
item->Check(g_Parm_3D_Visu.GetFlag( FL_AXIS ) );
item->Check( g_Parm_3D_Visu.GetFlag( FL_AXIS ) );
item = menuBar->FindItem( ID_MENU3D_ADHESIVE_ONOFF );
item->Check(g_Parm_3D_Visu.GetFlag( FL_ADHESIVE ) );
item->Check( g_Parm_3D_Visu.GetFlag( FL_ADHESIVE ) );
item = menuBar->FindItem( ID_MENU3D_SILKSCREEN_ONOFF );
item->Check(g_Parm_3D_Visu.GetFlag( FL_SILKSCREEN ) );
item->Check( g_Parm_3D_Visu.GetFlag( FL_SILKSCREEN ) );
item = menuBar->FindItem( ID_MENU3D_SOLDER_MASK_ONOFF );
item->Check(g_Parm_3D_Visu.GetFlag( FL_SOLDERMASK ) );
item->Check( g_Parm_3D_Visu.GetFlag( FL_SOLDERMASK ) );
item = menuBar->FindItem( ID_MENU3D_SOLDER_PASTE_ONOFF );
item->Check(g_Parm_3D_Visu.GetFlag( FL_SOLDERPASTE ) );
item->Check( g_Parm_3D_Visu.GetFlag( FL_SOLDERPASTE ) );
item = menuBar->FindItem( ID_MENU3D_COMMENTS_ONOFF );
item->Check(g_Parm_3D_Visu.GetFlag( FL_COMMENTS ) );
item->Check( g_Parm_3D_Visu.GetFlag( FL_COMMENTS ) );
item = menuBar->FindItem( ID_MENU3D_ECO_ONOFF );
item->Check(g_Parm_3D_Visu.GetFlag( FL_ECO ));
item->Check( g_Parm_3D_Visu.GetFlag( FL_ECO ));
}
void EDA_3D_FRAME::SetToolbars()
+1 -15
View File
@@ -37,20 +37,6 @@
#endif
#include <wx/glcanvas.h>
#ifdef __WXMAC__
# ifdef __DARWIN__
# include <OpenGL/glu.h>
# else
# include <glu.h>
# endif
#else
# include <GL/glu.h>
#endif
#define KISYS3DMOD "KISYS3DMOD"
#include <3d_struct.h>
#define KISYS3DMOD "KISYS3DMOD"
@@ -103,7 +89,7 @@ public:
* @param aGlList = the list to rebuild.
* if 0 (default) all lists are rebuilt
*/
void NewDisplay( GLuint aGlList = 0 );
void NewDisplay( int aGlList = 0 );
void SetDefaultFileName(const wxString &aFn) { m_defaultFileName = aFn; }
const wxString &GetDefaultFileName() const { return m_defaultFileName; }
+1
View File
@@ -41,6 +41,7 @@ enum id_3dview_frm
ID_MENU3D_ECO_ONOFF,
ID_MENU3D_SHOW_BOARD_BODY,
ID_MENU3D_REALISTIC_MODE,
ID_MENU3D_MAX_QUALITY_FOR_REALISTIC_MODE,
ID_END_COMMAND_3D,
ID_TOOL_SET_VISIBLE_ITEMS,
+9 -1
View File
@@ -2,8 +2,10 @@ add_definitions(-DPCBNEW)
include_directories(BEFORE ${INC_BEFORE})
include_directories(
textures
../pcbnew
../polygon
${GLEW_INCLUDE_DIR}
${INC_AFTER}
)
@@ -15,13 +17,19 @@ set(3D-VIEWER_SRCS
3d_class.cpp
3d_draw.cpp
3d_draw_basic_functions.cpp
3d_draw_helper_functions.cpp
3d_frame.cpp
3d_material.cpp
3d_mesh_model.cpp
3d_read_mesh.cpp
3d_toolbar.cpp
info3d_visu.cpp
trackball.cpp
x3dmodelparser.cpp
vrmlmodelparser.cpp
vrml_aux.cpp
vrml_v1_modelparser.cpp
vrml_v2_modelparser.cpp
x3dmodelparser.cpp
)
add_library(3d-viewer STATIC ${3D-VIEWER_SRCS})
+38 -34
View File
@@ -62,9 +62,9 @@ INFO3D_VISU::INFO3D_VISU()
m_CopperLayersCount = 2;
m_BoardSettings = NULL;
m_CopperThickness = 0;
m_EpoxyThickness = 0;
m_NonCopperLayerThickness = 0;
m_copperThickness = 0;
m_epoxyThickness = 0;
m_nonCopperLayerThickness = 0;
// default all special item layers Visible
for( ii = 0; ii < FL_LAST; ii++ )
@@ -72,6 +72,7 @@ INFO3D_VISU::INFO3D_VISU()
SetFlag( FL_GRID, false );
SetFlag( FL_USE_COPPER_THICKNESS, false );
SetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE, false );
}
@@ -84,7 +85,7 @@ INFO3D_VISU::~INFO3D_VISU()
*/
void INFO3D_VISU::InitSettings( BOARD* aBoard )
{
EDA_RECT bbbox = aBoard->ComputeBoundingBox( false );
EDA_RECT bbbox = aBoard->ComputeBoundingBox( true );
if( bbbox.GetWidth() == 0 && bbbox.GetHeight() == 0 )
{
@@ -92,6 +93,7 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
bbbox.SetHeight( Millimeter2iu( 100 ) );
}
m_BoardSettings = &aBoard->GetDesignSettings();
m_BoardSize = bbbox.GetSize();
@@ -107,97 +109,99 @@ void INFO3D_VISU::InitSettings( BOARD* aBoard )
m_BiuTo3Dunits = 2.0 / std::max( m_BoardSize.x, m_BoardSize.y );
m_EpoxyThickness = aBoard->GetDesignSettings().GetBoardThickness() * m_BiuTo3Dunits;
m_epoxyThickness = aBoard->GetDesignSettings().GetBoardThickness() * m_BiuTo3Dunits;
// TODO use value defined by user (currently use default values by ctor
m_CopperThickness = COPPER_THICKNESS * m_BiuTo3Dunits;
m_NonCopperLayerThickness = TECH_LAYER_THICKNESS * m_BiuTo3Dunits;
m_copperThickness = COPPER_THICKNESS * m_BiuTo3Dunits;
m_nonCopperLayerThickness = TECH_LAYER_THICKNESS * m_BiuTo3Dunits;
// Init Z position of each layer
// calculate z position for each copper layer
// Z = 0 is the z position of the back (bottom) layer (layer id = 31)
// Z = m_epoxyThickness is the z position of the front (top) layer (layer id = 0)
// all unused copper layer z position are set to 0
int layer;
int copper_layers_cnt = m_CopperLayersCount;
for( layer = 0; layer < copper_layers_cnt; layer++ )
{
m_LayerZcoord[layer] =
m_EpoxyThickness * layer / (copper_layers_cnt - 1);
m_layerZcoord[layer] =
m_epoxyThickness - (m_epoxyThickness * layer / (copper_layers_cnt - 1));
}
#define layerThicknessMargin 1.1
double zpos_offset = m_NonCopperLayerThickness * layerThicknessMargin;
double zpos_copper_back = m_LayerZcoord[0] - layerThicknessMargin*m_CopperThickness/2;
double zpos_copper_front = m_EpoxyThickness + layerThicknessMargin*m_CopperThickness/2;
double zpos_offset = m_nonCopperLayerThickness * layerThicknessMargin;
double zpos_copper_back = - layerThicknessMargin*m_copperThickness/2;
double zpos_copper_front = m_epoxyThickness + layerThicknessMargin*m_copperThickness/2;
// Fill remaining unused copper layers and front layer zpos
// with m_EpoxyThickness
// Solder mask and Solder paste have the same Z position
for( ; layer <= LAST_COPPER_LAYER; layer++ )
// Fill remaining unused copper layers and back layer zpos
// with 0
for( ; layer < MAX_CU_LAYERS; layer++ )
{
m_LayerZcoord[layer] = m_EpoxyThickness;
m_layerZcoord[layer] = 0;
}
// calculate z position for each non copper layer
for( int layer_id = FIRST_NON_COPPER_LAYER; layer_id < NB_PCB_LAYERS; layer_id++ )
// Solder mask and Solder paste have the same Z position
for( int layer_id = MAX_CU_LAYERS; layer_id < LAYER_ID_COUNT; layer_id++ )
{
double zpos;
switch( layer_id )
{
case ADHESIVE_N_BACK:
case B_Adhes:
zpos = zpos_copper_back - 3 * zpos_offset;
break;
case ADHESIVE_N_FRONT:
case F_Adhes:
zpos = zpos_copper_front + 3 * zpos_offset;
break;
case SOLDERPASTE_N_BACK:
case B_Paste:
zpos = zpos_copper_back - 1 * zpos_offset;
break;
case SOLDERPASTE_N_FRONT:
case F_Paste:
zpos = zpos_copper_front + 1 * zpos_offset;
break;
case SOLDERMASK_N_BACK:
case B_Mask:
zpos = zpos_copper_back - 1 * zpos_offset;
break;
case SOLDERMASK_N_FRONT:
case F_Mask:
zpos = zpos_copper_front + 1 * zpos_offset;
break;
case SILKSCREEN_N_BACK:
case B_SilkS:
zpos = zpos_copper_back - 2 * zpos_offset;
break;
case SILKSCREEN_N_FRONT:
case F_SilkS:
zpos = zpos_copper_front + 2 * zpos_offset;
break;
default:
zpos = zpos_copper_front +
(layer_id - FIRST_NON_COPPER_LAYER + 4) * zpos_offset;
zpos = zpos_copper_front + (layer_id - MAX_CU_LAYERS + 4) * zpos_offset;
break;
}
m_LayerZcoord[layer_id] = zpos;
m_layerZcoord[layer_id] = zpos;
}
}
/* return the Z position of 3D shapes, in 3D Units
* aIsFlipped: true for modules on Front (top) layer, false
* if on back (bottom) layer
* Note: in draw functions, the copper has a thickness = m_CopperThickness
* Vias and tracks are draw with the top side position = m_CopperThickness/2
* and the bottom side position = -m_CopperThickness/2 from the Z layer position
* Note: in draw functions, the copper has a thickness = m_copperThickness
* Vias and tracks are draw with the top side position = m_copperThickness/2
* and the bottom side position = -m_copperThickness/2 from the Z layer position
*/
double INFO3D_VISU::GetModulesZcoord3DIU( bool aIsFlipped )
{
if( aIsFlipped )
return m_LayerZcoord[LAYER_N_BACK] - ( m_CopperThickness / 2 );
return m_layerZcoord[B_Paste] - ( m_copperThickness / 2 ); //B_Cu NOTE: in order to display modules in top of Paste and near the shadow
else
return m_LayerZcoord[LAYER_N_FRONT] + ( m_CopperThickness / 2 );
return m_layerZcoord[F_Paste] + ( m_copperThickness / 2 ); //F_Cu
}
+20 -15
View File
@@ -71,6 +71,7 @@ enum DISPLAY3D_FLG {
FL_USE_COPPER_THICKNESS,
FL_SHOW_BOARD_BODY,
FL_USE_REALISTIC_MODE,
FL_USE_MAXQUALITY_IN_REALISTIC_MODE,
FL_LAST
};
@@ -94,11 +95,14 @@ public:
// to scale 3D units between -1.0 and +1.0
double m_CurrentZpos; // temporary storage of current value of Z position,
// used in some calculation
double zpos_offset;
private:
double m_LayerZcoord[NB_LAYERS]; // Z position of each layer (normalized)
double m_CopperThickness; // Copper thickness (normalized)
double m_EpoxyThickness; // Epoxy thickness (normalized)
double m_NonCopperLayerThickness; // Non copper layers thickness
double m_layerZcoord[LAYER_ID_COUNT]; // Z position of each layer (normalized)
double m_copperThickness; // Copper thickness (normalized)
double m_epoxyThickness; // Epoxy thickness (normalized)
double m_nonCopperLayerThickness; // Non copper layers thickness
bool m_drawFlags[FL_LAST]; // Enable/disable flags (see DISPLAY3D_FLG list)
public: INFO3D_VISU();
@@ -133,7 +137,7 @@ public: INFO3D_VISU();
*/
int GetLayerZcoordBIU( int aLayerId )
{
return KiROUND( m_LayerZcoord[aLayerId] / m_BiuTo3Dunits );
return KiROUND( m_layerZcoord[aLayerId] / m_BiuTo3Dunits );
}
/**
@@ -147,11 +151,10 @@ public: INFO3D_VISU();
*/
int GetCopperThicknessBIU() const
{
bool use_thickness = GetFlag( FL_USE_COPPER_THICKNESS )
// || GetFlag( FL_USE_REALISTIC_MODE )
;
bool use_thickness = GetFlag( FL_USE_COPPER_THICKNESS );
return use_thickness ?
KiROUND( m_CopperThickness / m_BiuTo3Dunits )
KiROUND( m_copperThickness / m_BiuTo3Dunits )
: 0;
}
@@ -161,7 +164,7 @@ public: INFO3D_VISU();
*/
int GetEpoxyThicknessBIU() const
{
return KiROUND( m_EpoxyThickness / m_BiuTo3Dunits );
return KiROUND( m_epoxyThickness / m_BiuTo3Dunits );
}
/**
@@ -177,7 +180,7 @@ public: INFO3D_VISU();
// || GetFlag( FL_USE_REALISTIC_MODE )
;
return use_thickness ?
KiROUND( m_NonCopperLayerThickness / m_BiuTo3Dunits )
KiROUND( m_nonCopperLayerThickness / m_BiuTo3Dunits )
: 0;
}
@@ -188,14 +191,16 @@ public: INFO3D_VISU();
*
* Note: if m_drawFlags[FL_USE_COPPER_THICKNESS] is not set, returns 0
*/
int GetLayerObjectThicknessBIU( int aLayerId) const
int GetLayerObjectThicknessBIU( int aLayerId ) const
{
return aLayerId >= FIRST_NON_COPPER_LAYER ?
GetNonCopperLayerThicknessBIU() :
GetCopperThicknessBIU();
return IsCopperLayer( aLayerId ) ?
GetCopperThicknessBIU() :
GetNonCopperLayerThicknessBIU()
;
}
bool IsRealisticMode() { return GetFlag( FL_USE_REALISTIC_MODE ); }
bool HightQualityMode() { return GetFlag( FL_USE_MAXQUALITY_IN_REALISTIC_MODE ); }
};
extern INFO3D_VISU g_Parm_3D_Visu;
+101 -47
View File
@@ -32,13 +32,9 @@
#include <map>
#include <vector>
#include <wx/string.h>
#include <3d_mesh_model.h>
class S3D_MASTER;
class S3D_VERTEX;
extern void TransfertToGLlist( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUnits );
class S3D_MODEL_PARSER;
class X3D_MODEL_PARSER;
@@ -118,13 +114,17 @@ public:
static void GetNodeProperties( wxXmlNode* aNode, PROPERTY_MAP& aProps );
/**
* Return string representing x3d file in vrml format
* Return string representing x3d file in vrml2 format
* Function Load must be called before this function, otherwise empty
* data set is returned.
*/
wxString VRML_representation();
wxString VRML2_representation();
private:
wxString m_Filename;
S3D_MESH *m_model;
std::vector<S3D_MESH *> childs;
std::vector< wxString > vrml_materials;
std::vector< wxString > vrml_points;
std::vector< wxString > vrml_coord_indexes;
@@ -137,8 +137,98 @@ private:
void rotate( S3D_VERTEX& aCoordinate, S3D_VERTEX& aRotAxis, double angle );
};
/**
* class WRL_MODEL_PARSER
* class VRML2_MODEL_PARSER
* Parses
*/
class VRML2_MODEL_PARSER: public S3D_MODEL_PARSER
{
public:
VRML2_MODEL_PARSER( S3D_MASTER* aMaster );
~VRML2_MODEL_PARSER();
void Load( const wxString aFilename );
/**
* Return string representing VRML2 file in vrml2 format
* Function Load must be called before this function, otherwise empty
* data set is returned.
*/
wxString VRML2_representation();
private:
int read_Transform();
int read_DEF();
int read_Shape();
int read_Appearance();
int read_material();
int read_Material();
int read_IndexedFaceSet();
int read_Coordinate();
int read_Normal();
int read_NormalIndex();
int read_Color();
int read_coordIndex();
int read_colorIndex();
bool m_normalPerVertex;
bool colorPerVertex;
S3D_MESH *m_model;
std::vector<S3D_MESH *> childs;
FILE *m_file;
S3D_MATERIAL *m_Materials;
wxString m_Filename;
};
/**
* class VRML1_MODEL_PARSER
* Parses
*/
class VRML1_MODEL_PARSER: public S3D_MODEL_PARSER
{
public:
VRML1_MODEL_PARSER( S3D_MASTER* aMaster );
~VRML1_MODEL_PARSER();
void Load( const wxString aFilename );
/**
* Return string representing VRML2 file in vrml2 format
* Function Load must be called before this function, otherwise empty
* data set is returned.
*/
wxString VRML2_representation();
private:
int read_separator();
int readMaterial();
int readCoordinate3();
int readIndexedFaceSet();
int readMaterial_ambientColor();
int readMaterial_diffuseColor();
int readMaterial_emissiveColor();
int readMaterial_specularColor();
int readMaterial_shininess();
int readMaterial_transparency();
int readCoordinate3_point();
int readIndexedFaceSet_coordIndex();
int readIndexedFaceSet_materialIndex();
bool m_normalPerVertex;
bool colorPerVertex;
S3D_MESH *m_model;
std::vector<S3D_MESH *> childs;
S3D_MATERIAL *m_Materials;
FILE *m_file;
wxString m_Filename;
};
/**
* class VRML_MODEL_PARSER
* Parses
*/
class VRML_MODEL_PARSER: public S3D_MODEL_PARSER
@@ -149,45 +239,9 @@ public:
void Load( const wxString aFilename );
private:
/**
* Function ReadMaterial
* read the description of a 3D material definition in the form:
* DEF yellow material Material (
* DiffuseColor 1.00000 1.00000 0.00000e 0
* EmissiveColor 0.00000e 0 0.00000e 0 0.00000e 0
* SpecularColor 1.00000 1.00000 1.00000
* AmbientIntensity 1.00000
* Transparency 0.00000e 0
* Shininess 1.00000
*)
* Or type:
* USE yellow material
*/
int readMaterial( FILE* file, int* LineNum );
int readChildren( FILE* file, int* LineNum );
int readShape( FILE* file, int* LineNum );
int readAppearance( FILE* file, int* LineNum );
int readGeometry( FILE* file, int* LineNum );
/**
* Function ReadCoordList
* reads 3D coordinate lists like:
* coord Coordinate { point [
* -5.24489 6.57640e-3 -9.42129e-2,
* -5.11821 6.57421e-3 0.542654,
* -3.45868 0.256565 1.32000 ] }
* or:
* normal Normal { vector [
* 0.995171 -6.08102e-6 9.81541e-2,
* 0.923880 -4.09802e-6 0.382683,
* 0.707107 -9.38186e-7 0.707107]
* }
*
* text_buffer contains the first line of this node :
* "coord Coordinate { point ["
*/
void readCoordsList( FILE* file, char* text_buffer, std::vector< double >& aList,
int* LineNum );
VRML1_MODEL_PARSER *vrml1_parser;
VRML2_MODEL_PARSER *vrml2_parser;
};
#endif // MODELPARSERS_H
+922
View File
@@ -0,0 +1,922 @@
/* GIMP RGBA C-Source image dump (text_pcb.c) */
static const struct {
unsigned int width;
unsigned int height;
unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */
unsigned char pixel_data[64 * 64 * 4 + 1];
} text_pcb = {
64, 64, 4,
"\357\357\357\377\357\357\357\377\355\355\355\377\362\362\362\377\362\362"
"\362\377\366\366\366\377\366\366\366\377\370\370\370\377\370\370\370\377"
"\363\363\363\377\363\363\363\377\357\357\357\377\360\360\360\377\354\354"
"\354\377\354\354\354\377\351\351\351\377\351\351\351\377\357\357\357\377"
"\357\357\357\377\363\363\363\377\357\357\357\377\366\366\366\377\366\366"
"\366\377\366\366\366\377\366\366\366\377\362\362\362\377\363\363\363\377"
"\355\355\355\377\346\346\346\377\340\340\340\377\335\335\335\377\331\331"
"\331\377\331\331\331\377\335\335\335\377\335\335\335\377\343\343\343\377"
"\351\351\351\377\355\355\355\377\355\355\355\377\362\362\362\377\362\362"
"\362\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\360\360\360\377\360\360\360\377\354\354\354\377\351\351\351\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\352\352\352\377"
"\352\352\352\377\357\357\357\377\355\355\355\377\360\360\360\377\360\360"
"\360\377\355\355\355\377\355\355\355\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\355\355\355\377\357\357\357\377\355\355\355\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\357\357\357\377\357\357"
"\357\377\354\354\354\377\346\346\346\377\346\346\346\377\351\351\351\377"
"\357\357\357\377\360\360\360\377\363\363\363\377\360\360\360\377\366\366"
"\366\377\366\366\366\377\366\366\366\377\366\366\366\377\363\363\363\377"
"\363\363\363\377\355\355\355\377\346\346\346\377\343\343\343\377\335\335"
"\335\377\331\331\331\377\331\331\331\377\335\335\335\377\340\340\340\377"
"\343\343\343\377\351\351\351\377\355\355\355\377\357\357\357\377\362\362"
"\362\377\362\362\362\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\360\360\360\377\360\360\360\377\354\354\354\377\351\351"
"\351\377\343\343\343\377\343\343\343\377\344\344\344\377\344\344\344\377"
"\352\352\352\377\352\352\352\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\360\360\360\377\355\355\355\377\357\357\357\377"
"\357\357\357\377\354\354\354\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\362\362\362\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\360\360\360\377\357\357"
"\357\377\357\357\357\377\351\351\351\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\355\355\355\377\355\355\355\377\363\363\363\377\363\363"
"\363\377\366\366\366\377\366\366\366\377\366\366\366\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\355\355\355\377\343\343\343\377\340\340"
"\340\377\335\335\335\377\331\331\331\377\331\331\331\377\335\335\335\377"
"\340\340\340\377\346\346\346\377\351\351\351\377\355\355\355\377\357\357"
"\357\377\362\362\362\377\362\362\362\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\360\360\360\377\360\360\360\377\354\354"
"\354\377\354\354\354\377\351\351\351\377\343\343\343\377\344\344\344\377"
"\344\344\344\377\352\352\352\377\352\352\352\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\357\357\357\377\354\354\354\377\352\352\352\377\352\352"
"\352\377\352\352\352\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\354\354\354\377\355\355\355\377\354\354\354\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\355\355\355\377\355\355\355\377\363\363"
"\363\377\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\366\366\366\377\363\363\363\377\363\363\363\377\355\355\355\377\346\346"
"\346\377\340\340\340\377\335\335\335\377\331\331\331\377\331\331\331\377"
"\335\335\335\377\340\340\340\377\346\346\346\377\351\351\351\377\355\355"
"\355\377\360\360\360\377\362\362\362\377\362\362\362\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\354\354\354\377\355\355\355\377\351\351\351\377\343\343\343\377"
"\344\344\344\377\344\344\344\377\352\352\352\377\352\352\352\377\357\357"
"\357\377\355\355\355\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\352\352\352\377\351\351\351\377\354\354\354\377\354\354"
"\354\377\354\354\354\377\354\354\354\377\360\360\360\377\360\360\360\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\363\363"
"\363\377\363\363\363\377\355\355\355\377\355\355\355\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\357\357\357\377\357\357"
"\357\377\363\363\363\377\363\363\363\377\362\362\362\377\362\362\362\377"
"\363\363\363\377\366\366\366\377\363\363\363\377\355\355\355\377\351\351"
"\351\377\346\346\346\377\340\340\340\377\335\335\335\377\332\332\332\377"
"\332\332\332\377\335\335\335\377\335\335\335\377\343\343\343\377\352\352"
"\352\377\355\355\355\377\360\360\360\377\365\365\365\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377\362\362"
"\362\377\362\362\362\377\355\355\355\377\357\357\357\377\352\352\352\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\352\352\352\377\352\352"
"\352\377\357\357\357\377\355\355\355\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\355\355\355\377\351\351\351\377\354\354"
"\354\377\354\354\354\377\357\357\357\377\357\357\357\377\354\354\354\377"
"\354\354\354\377\357\357\357\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\355\355\355\377\355\355\355\377"
"\351\351\351\377\343\343\343\377\343\343\343\377\352\352\352\377\357\357"
"\357\377\357\357\357\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\363\363\363\377\365\365\365\377\363\363\363\377\355\355"
"\355\377\352\352\352\377\346\346\346\377\342\342\342\377\337\337\337\377"
"\332\332\332\377\327\327\327\377\335\335\335\377\337\337\337\377\343\343"
"\343\377\352\352\352\377\355\355\355\377\360\360\360\377\365\365\365\377"
"\363\363\363\377\362\362\362\377\362\362\362\377\363\363\363\377\363\363"
"\363\377\362\362\362\377\362\362\362\377\355\355\355\377\357\357\357\377"
"\352\352\352\377\344\344\344\377\344\344\344\377\344\344\344\377\352\352"
"\352\377\352\352\352\377\357\357\357\377\357\357\357\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\357\357\357\377\357\357"
"\357\377\362\362\362\377\354\354\354\377\357\357\357\377\357\357\357\377"
"\354\354\354\377\354\354\354\377\357\357\357\377\357\357\357\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\355\355\355\377"
"\352\352\352\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\352\352\352\377\355\355\355\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\363\363\363\377\365\365\365\377\365\365\365\377\360\360"
"\360\377\355\355\355\377\352\352\352\377\347\347\347\377\342\342\342\377"
"\335\335\335\377\327\327\327\377\327\327\327\377\335\335\335\377\337\337"
"\337\377\344\344\344\377\346\346\346\377\352\352\352\377\360\360\360\377"
"\365\365\365\377\365\365\365\377\365\365\365\377\363\363\363\377\365\365"
"\365\377\363\363\363\377\362\362\362\377\362\362\362\377\355\355\355\377"
"\357\357\357\377\352\352\352\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\352\352\352\377\352\352\352\377\357\357\357\377\357\357\357\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\357\357"
"\357\377\357\357\357\377\362\362\362\377\354\354\354\377\354\354\354\377"
"\354\354\354\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360"
"\360\377\362\362\362\377\362\362\362\377\362\362\362\377\357\357\357\377"
"\355\355\355\377\352\352\352\377\344\344\344\377\344\344\344\377\337\337"
"\337\377\344\344\344\377\352\352\352\377\355\355\355\377\362\362\362\377"
"\362\362\362\377\363\363\363\377\365\365\365\377\365\365\365\377\365\365"
"\365\377\360\360\360\377\360\360\360\377\354\354\354\377\347\347\347\377"
"\342\342\342\377\335\335\335\377\327\327\327\377\327\327\327\377\335\335"
"\335\377\337\337\337\377\344\344\344\377\347\347\347\377\352\352\352\377"
"\360\360\360\377\365\365\365\377\365\365\365\377\365\365\365\377\363\363"
"\363\377\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\355\355\355\377\355\355\355\377\352\352\352\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\352\352\352\377\352\352\352\377\357\357\357\377"
"\357\357\357\377\352\352\352\377\352\352\352\377\355\355\355\377\355\355"
"\355\377\357\357\357\377\357\357\357\377\357\357\357\377\354\354\354\377"
"\354\354\354\377\354\354\354\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\362\362\362\377\362\362\362\377\362\362\362\377\357\357\357\377"
"\357\357\357\377\352\352\352\377\352\352\352\377\344\344\344\377\344\344"
"\344\377\337\337\337\377\337\337\337\377\344\344\344\377\352\352\352\377"
"\357\357\357\377\362\362\362\377\365\365\365\377\365\365\365\377\363\363"
"\363\377\363\363\363\377\360\360\360\377\352\352\352\377\347\347\347\377"
"\344\344\344\377\337\337\337\377\335\335\335\377\331\331\331\377\331\331"
"\331\377\335\335\335\377\337\337\337\377\344\344\344\377\347\347\347\377"
"\354\354\354\377\360\360\360\377\363\363\363\377\363\363\363\377\365\365"
"\365\377\365\365\365\377\363\363\363\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\355\355\355\377\352\352\352\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\352\352\352\377\352\352\352\377"
"\357\357\357\377\357\357\357\377\352\352\352\377\352\352\352\377\355\355"
"\355\377\355\355\355\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\354\354"
"\354\377\354\354\354\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\352\352\352\377\352\352\352\377\344\344"
"\344\377\342\342\342\377\337\337\337\377\337\337\337\377\344\344\344\377"
"\354\354\354\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\352\352\352\377"
"\347\347\347\377\344\344\344\377\342\342\342\377\337\337\337\377\331\331"
"\331\377\331\331\331\377\337\337\337\377\342\342\342\377\344\344\344\377"
"\347\347\347\377\354\354\354\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\347\347\347\377\347\347"
"\347\377\347\347\347\377\347\347\347\377\347\347\347\377\354\354\354\377"
"\354\354\354\377\354\354\354\377\362\362\362\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\357\357\357\377\357\357\357\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\355\355\355\377\352\352\352\377\352\352\352\377\344\344"
"\344\377\342\342\342\377\342\342\342\377\342\342\342\377\342\342\342\377"
"\347\347\347\377\354\354\354\377\355\355\355\377\360\360\360\377\363\363"
"\363\377\363\363\363\377\360\360\360\377\360\360\360\377\352\352\352\377"
"\352\352\352\377\344\344\344\377\344\344\344\377\342\342\342\377\337\337"
"\337\377\331\331\331\377\331\331\331\377\337\337\337\377\342\342\342\377"
"\347\347\347\377\344\344\344\377\352\352\352\377\352\352\352\377\355\355"
"\355\377\360\360\360\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\355\355\355\377\352\352\352\377\347\347\347\377\344\344"
"\344\377\347\347\347\377\347\347\347\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\354\354\354\377\355\355\355\377\354\354\354\377\357\357"
"\357\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\351\351\351\377\351\351\351\377\351\351"
"\351\377\351\351\351\377\351\351\351\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377\344\344"
"\344\377\344\344\344\377\342\342\342\377\342\342\342\377\342\342\342\377"
"\343\343\343\377\343\343\343\377\351\351\351\377\351\351\351\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\360\360\360\377\355\355\355\377"
"\354\354\354\377\352\352\352\377\344\344\344\377\347\347\347\377\342\342"
"\342\377\334\334\334\377\331\331\331\377\331\331\331\377\334\334\334\377"
"\342\342\342\377\347\347\347\377\344\344\344\377\352\352\352\377\354\354"
"\354\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\351\351\351\377\351\351"
"\351\377\344\344\344\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\346\346\346\377\351\351\351\377\351\351\351\377\355\355"
"\355\377\354\354\354\377\352\352\352\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\352\352\352\377\351\351\351\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377\347\347"
"\347\377\344\344\344\377\344\344\344\377\342\342\342\377\342\342\342\377"
"\343\343\343\377\343\343\343\377\343\343\343\377\346\346\346\377\346\346"
"\346\377\351\351\351\377\351\351\351\377\352\352\352\377\352\352\352\377"
"\354\354\354\377\352\352\352\377\347\347\347\377\344\344\344\377\342\342"
"\342\377\334\334\334\377\331\331\331\377\331\331\331\377\331\331\331\377"
"\331\331\331\377\334\334\334\377\342\342\342\377\344\344\344\377\347\347"
"\347\377\352\352\352\377\354\354\354\377\352\352\352\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351"
"\351\377\346\346\346\377\346\346\346\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\343\343\343\377\346\346\346\377\346\346\346\377\351\351"
"\351\377\351\351\351\377\347\347\347\377\347\347\347\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\347\347"
"\347\377\344\344\344\377\343\343\343\377\343\343\343\377\340\340\340\377"
"\340\340\340\377\335\335\335\377\335\335\335\377\340\340\340\377\340\340"
"\340\377\343\343\343\377\343\343\343\377\343\343\343\377\346\346\346\377"
"\346\346\346\377\347\347\347\377\347\347\347\377\351\351\351\377\344\344"
"\344\377\342\342\342\377\334\334\334\377\331\331\331\377\325\325\325\377"
"\325\325\325\377\331\331\331\377\334\334\334\377\342\342\342\377\344\344"
"\344\377\351\351\351\377\347\347\347\377\347\347\347\377\346\346\346\377"
"\346\346\346\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\340\340\340\377"
"\340\340\340\377\340\340\340\377\340\340\340\377\343\343\343\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\342\342\342\377"
"\337\337\337\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337"
"\337\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\346\346\346\377\343\343\343\377\343\343\343\377"
"\340\340\340\377\335\335\335\377\335\335\335\377\335\335\335\377\340\340"
"\340\377\340\340\340\377\340\340\340\377\343\343\343\377\351\351\351\377"
"\346\346\346\377\346\346\346\377\352\352\352\377\347\347\347\377\347\347"
"\347\377\342\342\342\377\337\337\337\377\331\331\331\377\334\334\334\377"
"\326\326\326\377\326\326\326\377\334\334\334\377\331\331\331\377\337\337"
"\337\377\342\342\342\377\347\347\347\377\347\347\347\377\352\352\352\377"
"\346\346\346\377\346\346\346\377\343\343\343\377\343\343\343\377\343\343"
"\343\377\343\343\343\377\346\346\346\377\343\343\343\377\343\343\343\377"
"\340\340\340\377\335\335\335\377\335\335\335\377\340\340\340\377\343\343"
"\343\377\343\343\343\377\351\351\351\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337"
"\337\377\337\337\337\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\346\346\346\377\343\343\343\377"
"\343\343\343\377\340\340\340\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\340\340\340\377\340\340\340\377\340\340\340\377\346\346\346\377"
"\351\351\351\377\346\346\346\377\352\352\352\377\352\352\352\377\347\347"
"\347\377\347\347\347\377\342\342\342\377\337\337\337\377\334\334\334\377"
"\335\335\335\377\327\327\327\377\327\327\327\377\335\335\335\377\334\334"
"\334\377\337\337\337\377\342\342\342\377\347\347\347\377\344\344\344\377"
"\352\352\352\377\351\351\351\377\346\346\346\377\346\346\346\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\340\340\340\377"
"\340\340\340\377\340\340\340\377\335\335\335\377\335\335\335\377\340\340"
"\340\377\343\343\343\377\343\343\343\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\347\347\347\377\346\346\346\377"
"\343\343\343\377\343\343\343\377\340\340\340\377\340\340\340\377\335\335"
"\335\377\335\335\335\377\340\340\340\377\340\340\340\377\343\343\343\377"
"\346\346\346\377\346\346\346\377\346\346\346\377\347\347\347\377\352\352"
"\352\377\347\347\347\377\347\347\347\377\342\342\342\377\337\337\337\377"
"\334\334\334\377\335\335\335\377\327\327\327\377\327\327\327\377\335\335"
"\335\377\334\334\334\377\337\337\337\377\342\342\342\377\347\347\347\377"
"\347\347\347\377\352\352\352\377\346\346\346\377\346\346\346\377\346\346"
"\346\377\346\346\346\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\340\340\340\377\340\340\340\377\340\340\340\377\340\340\340\377\340\340"
"\340\377\340\340\340\377\343\343\343\377\343\343\343\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\347\347\347\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\344\344\344\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\352\352\352\377\354\354\354\377"
"\351\351\351\377\346\346\346\377\346\346\346\377\343\343\343\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\346\346\346\377"
"\346\346\346\377\352\352\352\377\352\352\352\377\352\352\352\377\354\354"
"\354\377\352\352\352\377\347\347\347\377\347\347\347\377\342\342\342\377"
"\340\340\340\377\334\334\334\377\335\335\335\377\327\327\327\377\327\327"
"\327\377\335\335\335\377\335\335\335\377\340\340\340\377\342\342\342\377"
"\347\347\347\377\347\347\347\377\352\352\352\377\354\354\354\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\351\351\351\377\351\351\351\377"
"\346\346\346\377\346\346\346\377\346\346\346\377\343\343\343\377\343\343"
"\343\377\340\340\340\377\343\343\343\377\346\346\346\377\351\351\351\377"
"\351\351\351\377\355\355\355\377\355\355\355\377\355\355\355\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\355\355\355\377\352\352\352\377"
"\354\354\354\377\351\351\351\377\351\351\351\377\351\351\351\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\351\351\351\377\352\352\352\377\352\352\352\377\352\352\352\377\354\354"
"\354\377\354\354\354\377\354\354\354\377\351\351\351\377\351\351\351\377"
"\344\344\344\377\340\340\340\377\335\335\335\377\335\335\335\377\327\327"
"\327\377\327\327\327\377\335\335\335\377\335\335\335\377\340\340\340\377"
"\344\344\344\377\351\351\351\377\351\351\351\377\352\352\352\377\354\354"
"\354\377\354\354\354\377\352\352\352\377\352\352\352\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377\343\343"
"\343\377\343\343\343\377\340\340\340\377\343\343\343\377\351\351\351\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\357\357\357\377\357\357\357\377\357\357\357\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\357\357\357\377"
"\357\357\357\377\360\360\360\377\355\355\355\377\351\351\351\377\351\351"
"\351\377\343\343\343\377\346\346\346\377\346\346\346\377\343\343\343\377"
"\351\351\351\377\355\355\355\377\360\360\360\377\360\360\360\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\357\357\357\377\354\354\354\377"
"\351\351\351\377\346\346\346\377\343\343\343\377\335\335\335\377\335\335"
"\335\377\327\327\327\377\327\327\327\377\335\335\335\377\335\335\335\377"
"\343\343\343\377\346\346\346\377\351\351\351\377\354\354\354\377\357\357"
"\357\377\362\362\362\377\362\362\362\377\362\362\362\377\360\360\360\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\351\351\351\377\351\351"
"\351\377\343\343\343\377\346\346\346\377\346\346\346\377\346\346\346\377"
"\351\351\351\377\355\355\355\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\363\363\363\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\363\363\363\377\362\362\362\377\363\363\363\377\360\360\360\377\355\355"
"\355\377\351\351\351\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\351\351\351\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\362\362\362\377\362\362\362\377\362\362\362\377\363\363\363\377"
"\357\357\357\377\351\351\351\377\346\346\346\377\343\343\343\377\335\335"
"\335\377\335\335\335\377\327\327\327\377\327\327\327\377\335\335\335\377"
"\335\335\335\377\343\343\343\377\346\346\346\377\351\351\351\377\357\357"
"\357\377\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\360\360\360\377\360\360\360\377\355\355\355\377\355\355\355\377\351\351"
"\351\377\351\351\351\377\343\343\343\377\343\343\343\377\346\346\346\377"
"\351\351\351\377\355\355\355\377\360\360\360\377\363\363\363\377\363\363"
"\363\377\363\363\363\377\363\363\363\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\355\355\355\377\351\351\351\377\351\351\351\377\346\346\346\377"
"\346\346\346\377\351\351\351\377\351\351\351\377\360\360\360\377\363\363"
"\363\377\363\363\363\377\365\365\365\377\365\365\365\377\363\363\363\377"
"\363\363\363\377\357\357\357\377\354\354\354\377\347\347\347\377\343\343"
"\343\377\335\335\335\377\335\335\335\377\327\327\327\377\327\327\327\377"
"\335\335\335\377\335\335\335\377\343\343\343\377\347\347\347\377\351\351"
"\351\377\357\357\357\377\363\363\363\377\363\363\363\377\365\365\365\377"
"\365\365\365\377\365\365\365\377\363\363\363\377\360\360\360\377\355\355"
"\355\377\351\351\351\377\351\351\351\377\351\351\351\377\346\346\346\377"
"\351\351\351\377\351\351\351\377\355\355\355\377\360\360\360\377\365\365"
"\365\377\365\365\365\377\365\365\365\377\365\365\365\377\363\363\363\377"
"\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\362\362\362\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\363\363\363\377\355\355\355\377\355\355\355\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\360\360\360\377\360\360"
"\360\377\363\363\363\377\363\363\363\377\365\365\365\377\365\365\365\377"
"\363\363\363\377\363\363\363\377\357\357\357\377\355\355\355\377\347\347"
"\347\377\343\343\343\377\335\335\335\377\335\335\335\377\327\327\327\377"
"\327\327\327\377\335\335\335\377\335\335\335\377\343\343\343\377\347\347"
"\347\377\351\351\351\377\357\357\357\377\363\363\363\377\363\363\363\377"
"\365\365\365\377\365\365\365\377\365\365\365\377\363\363\363\377\363\363"
"\363\377\360\360\360\377\355\355\355\377\355\355\355\377\351\351\351\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\355\355\355\377\360\360"
"\360\377\365\365\365\377\365\365\365\377\365\365\365\377\365\365\365\377"
"\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\363\363\363\377\365\365\365\377\365\365\365\377\365\365"
"\365\377\363\363\363\377\363\363\363\377\355\355\355\377\355\355\355\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\352\352\352\377\360\360"
"\360\377\360\360\360\377\363\363\363\377\365\365\365\377\365\365\365\377"
"\370\370\370\377\363\363\363\377\363\363\363\377\360\360\360\377\355\355"
"\355\377\347\347\347\377\343\343\343\377\335\335\335\377\335\335\335\377"
"\327\327\327\377\327\327\327\377\335\335\335\377\335\335\335\377\343\343"
"\343\377\347\347\347\377\354\354\354\377\357\357\357\377\363\363\363\377"
"\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377\363\363"
"\363\377\363\363\363\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\352\352\352\377\351\351\351\377\351\351\351\377\351\351\351\377\355\355"
"\355\377\360\360\360\377\365\365\365\377\365\365\365\377\365\365\365\377"
"\365\365\365\377\365\365\365\377\363\363\363\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\365\365\365\377\365\365\365\377\365\365\365\377\365\365"
"\365\377\365\365\365\377\363\363\363\377\363\363\363\377\355\355\355\377"
"\355\355\355\377\351\351\351\377\352\352\352\377\352\352\352\377\352\352"
"\352\377\360\360\360\377\360\360\360\377\365\365\365\377\365\365\365\377"
"\365\365\365\377\370\370\370\377\363\363\363\377\357\357\357\377\352\352"
"\352\377\355\355\355\377\347\347\347\377\343\343\343\377\335\335\335\377"
"\335\335\335\377\327\327\327\377\327\327\327\377\335\335\335\377\335\335"
"\335\377\343\343\343\377\347\347\347\377\355\355\355\377\354\354\354\377"
"\357\357\357\377\363\363\363\377\363\363\363\377\362\362\362\377\362\362"
"\362\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360\360\377"
"\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377\351\351"
"\351\377\351\351\351\377\355\355\355\377\363\363\363\377\365\365\365\377"
"\365\365\365\377\365\365\365\377\365\365\365\377\365\365\365\377\363\363"
"\363\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\355\355\355\377\355\355\355\377\352\352\352\377\351\351\351\377\351\351"
"\351\377\352\352\352\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377\357\357"
"\357\377\355\355\355\377\355\355\355\377\347\347\347\377\343\343\343\377"
"\335\335\335\377\337\337\337\377\331\331\331\377\331\331\331\377\337\337"
"\337\377\335\335\335\377\343\343\343\377\347\347\347\377\355\355\355\377"
"\352\352\352\377\357\357\357\377\357\357\357\377\357\357\357\377\354\354"
"\354\377\354\354\354\377\362\362\362\377\360\360\360\377\360\360\360\377"
"\352\352\352\377\351\351\351\377\346\346\346\377\346\346\346\377\346\346"
"\346\377\346\346\346\377\351\351\351\377\355\355\355\377\355\355\355\377"
"\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\360\360\360\377\352\352\352\377\351\351\351\377\351\351"
"\351\377\352\352\352\377\354\354\354\377\354\354\354\377\354\354\354\377"
"\354\354\354\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\355\355\355\377\355\355\355\377\352\352\352\377\346\346\346\377"
"\335\335\335\377\332\332\332\377\331\331\331\377\331\331\331\377\331\331"
"\331\377\337\337\337\377\335\335\335\377\343\343\343\377\346\346\346\377"
"\352\352\352\377\352\352\352\377\354\354\354\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\357\357\357\377\354\354\354\377\354\354\354\377"
"\354\354\354\377\354\354\354\377\351\351\351\377\346\346\346\377\346\346"
"\346\377\346\346\346\377\346\346\346\377\351\351\351\377\354\354\354\377"
"\352\352\352\377\360\360\360\377\360\360\360\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351"
"\351\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\352\352\352\377\352\352\352\377\352\352\352\377\347\347"
"\347\377\344\344\344\377\344\344\344\377\347\347\347\377\347\347\347\377"
"\347\347\347\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351"
"\351\377\351\351\351\377\352\352\352\377\352\352\352\377\347\347\347\377"
"\343\343\343\377\335\335\335\377\327\327\327\377\331\331\331\377\331\331"
"\331\377\331\331\331\377\337\337\337\377\335\335\335\377\343\343\343\377"
"\346\346\346\377\352\352\352\377\351\351\351\377\347\347\347\377\351\351"
"\351\377\351\351\351\377\351\351\351\377\351\351\351\377\347\347\347\377"
"\347\347\347\377\347\347\347\377\347\347\347\377\344\344\344\377\344\344"
"\344\377\342\342\342\377\342\342\342\377\344\344\344\377\344\344\344\377"
"\347\347\347\377\347\347\347\377\354\354\354\377\352\352\352\377\352\352"
"\352\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\346\346\346\377\346\346\346\377\346\346\346\377\347\347"
"\347\377\347\347\347\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\347\347\347\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347"
"\347\377\347\347\347\377\351\351\351\377\346\346\346\377\346\346\346\377"
"\343\343\343\377\340\340\340\377\335\335\335\377\327\327\327\377\331\331"
"\331\377\331\331\331\377\331\331\331\377\334\334\334\377\335\335\335\377"
"\335\335\335\377\340\340\340\377\346\346\346\377\351\351\351\377\347\347"
"\347\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347\347\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\337\337"
"\337\377\337\337\337\377\337\337\337\377\337\337\337\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\344\344\344\377\347\347\347\377\347\347"
"\347\377\346\346\346\377\346\346\346\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\343\343\343\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\335\335\335\377\335\335\335\377\335\335\335\377\340\340\340\377"
"\340\340\340\377\340\340\340\377\342\342\342\377\342\342\342\377\342\342"
"\342\377\342\342\342\377\342\342\342\377\337\337\337\377\337\337\337\377"
"\337\337\337\377\342\342\342\377\342\342\342\377\342\342\342\377\342\342"
"\342\377\342\342\342\377\342\342\342\377\346\346\346\377\340\340\340\377"
"\340\340\340\377\335\335\335\377\335\335\335\377\335\335\335\377\327\327"
"\327\377\331\331\331\377\337\337\337\377\337\337\337\377\331\331\331\377"
"\327\327\327\377\335\335\335\377\340\340\340\377\346\346\346\377\343\343"
"\343\377\342\342\342\377\342\342\342\377\342\342\342\377\342\342\342\377"
"\342\342\342\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337"
"\337\377\335\335\335\377\332\332\332\377\332\332\332\377\335\335\335\377"
"\337\337\337\377\337\337\337\377\337\337\337\377\337\337\337\377\342\342"
"\342\377\342\342\342\377\342\342\342\377\340\340\340\377\340\340\340\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\334\334\334\377\334\334"
"\334\377\334\334\334\377\334\334\334\377\335\335\335\377\335\335\335\377"
"\337\337\337\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337"
"\337\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337\337\377"
"\337\337\337\377\342\342\342\377\342\342\342\377\337\337\337\377\337\337"
"\337\377\337\337\337\377\337\337\337\377\337\337\337\377\340\340\340\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\327\327\327\377\331\331\331\377\337\337\337\377\335\335\335\377"
"\327\327\327\377\327\327\327\377\335\335\335\377\335\335\335\377\343\343"
"\343\377\337\337\337\377\342\342\342\377\342\342\342\377\342\342\342\377"
"\342\342\342\377\337\337\337\377\337\337\337\377\335\335\335\377\335\335"
"\335\377\335\335\335\377\332\332\332\377\332\332\332\377\332\332\332\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377\337\337"
"\337\377\337\337\337\377\337\337\337\377\337\337\337\377\335\335\335\377"
"\335\335\335\377\334\334\334\377\334\334\334\377\334\334\334\377\331\331"
"\331\377\331\331\331\377\331\331\331\377\331\331\331\377\331\331\331\377"
"\331\331\331\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332"
"\332\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332\332\377"
"\332\332\332\377\332\332\332\377\334\334\334\377\334\334\334\377\331\331"
"\331\377\331\331\331\377\331\331\331\377\331\331\331\377\331\331\331\377"
"\335\335\335\377\335\335\335\377\327\327\327\377\327\327\327\377\327\327"
"\327\377\327\327\327\377\327\327\327\377\327\327\327\377\327\327\327\377"
"\327\327\327\377\332\332\332\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\340\340\340\377\334\334\334\377\334\334\334\377\334\334\334\377"
"\334\334\334\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332"
"\332\377\332\332\332\377\327\327\327\377\332\332\332\377\332\332\332\377"
"\327\327\327\377\327\327\327\377\327\327\327\377\332\332\332\377\332\332"
"\332\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332\332\377"
"\331\331\331\377\331\331\331\377\331\331\331\377\326\326\326\377\326\326"
"\326\377\326\326\326\377\326\326\326\377\326\326\326\377\331\331\331\377"
"\331\331\331\377\331\331\331\377\332\332\332\377\332\332\332\377\332\332"
"\332\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332\332\377"
"\332\332\332\377\332\332\332\377\332\332\332\377\334\334\334\377\331\331"
"\331\377\331\331\331\377\331\331\331\377\331\331\331\377\331\331\331\377"
"\331\331\331\377\335\335\335\377\335\335\335\377\327\327\327\377\327\327"
"\327\377\327\327\327\377\327\327\327\377\327\327\327\377\327\327\327\377"
"\327\327\327\377\327\327\327\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\335\335\335\377\334\334\334\377\334\334\334\377\334\334\334\377"
"\334\334\334\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332"
"\332\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332\332\377"
"\332\332\332\377\327\327\327\377\327\327\327\377\332\332\332\377\332\332"
"\332\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332\332\377"
"\332\332\332\377\331\331\331\377\331\331\331\377\326\326\326\377\326\326"
"\326\377\326\326\326\377\334\334\334\377\334\334\334\377\334\334\334\377"
"\334\334\334\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\335\335\335\377\337\337\337\377\337\337\337\377\337\337\337\377"
"\337\337\337\377\337\337\337\377\337\337\337\377\335\335\335\377\332\332"
"\332\377\334\334\334\377\337\337\337\377\337\337\337\377\337\337\337\377"
"\337\337\337\377\337\337\337\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377"
"\332\332\332\377\327\327\327\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\340\340\340\377\342\342\342\377\342\342\342\377\342\342\342\377"
"\342\342\342\377\337\337\337\377\337\337\337\377\337\337\337\377\335\335"
"\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377"
"\335\335\335\377\335\335\335\377\332\332\332\377\332\332\332\377\335\335"
"\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\334\334\334\377\334\334"
"\334\377\334\334\334\377\334\334\334\377\335\335\335\377\335\335\335\377"
"\335\335\335\377\335\335\335\377\340\340\340\377\340\340\340\377\340\340"
"\340\377\343\343\343\377\343\343\343\377\343\343\343\377\340\340\340\377"
"\340\340\340\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337"
"\337\377\332\332\332\377\334\334\334\377\342\342\342\377\342\342\342\377"
"\342\342\342\377\342\342\342\377\342\342\342\377\342\342\342\377\335\335"
"\335\377\340\340\340\377\340\340\340\377\340\340\340\377\335\335\335\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\334\334\334\377\337\337\337\377\342\342\342\377\342\342\342\377"
"\347\347\347\377\344\344\344\377\344\344\344\377\344\344\344\377\343\343"
"\343\377\340\340\340\377\340\340\340\377\340\340\340\377\335\335\335\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\334\334\334\377\334\334"
"\334\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377"
"\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335"
"\335\377\335\335\335\377\335\335\335\377\335\335\335\377\343\343\343\377"
"\343\343\343\377\343\343\343\377\343\343\343\377\346\346\346\377\346\346"
"\346\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377"
"\343\343\343\377\346\346\346\377\343\343\343\377\344\344\344\377\344\344"
"\344\377\342\342\342\377\337\337\337\377\337\337\337\377\344\344\344\377"
"\344\344\344\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347"
"\347\377\342\342\342\377\342\342\342\377\342\342\342\377\346\346\346\377"
"\343\343\343\377\335\335\335\377\335\335\335\377\335\335\335\377\331\331"
"\331\377\337\337\337\377\337\337\337\377\342\342\342\377\344\344\344\377"
"\344\344\344\377\352\352\352\377\351\351\351\377\351\351\351\377\351\351"
"\351\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377"
"\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\340\340"
"\340\377\340\340\340\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343"
"\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351"
"\351\377\351\351\351\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\351\351\351\377\352\352\352\377\346\346\346\377\346\346"
"\346\377\343\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\344\344\344\377\344\344\344\377\347\347\347\377\351\351\351\377\351\351"
"\351\377\351\351\351\377\347\347\347\377\347\347\347\377\344\344\344\377"
"\344\344\344\377\343\343\343\377\335\335\335\377\334\334\334\377\331\331"
"\331\377\334\334\334\377\342\342\342\377\342\342\342\377\344\344\344\377"
"\347\347\347\377\352\352\352\377\355\355\355\377\360\360\360\377\355\355"
"\355\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\355\355\355\377\355\355\355\377\351\351\351\377\351\351"
"\351\377\343\343\343\377\343\343\343\377\351\351\351\377\351\351\351\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\351\351"
"\351\377\351\351\351\377\351\351\351\377\351\351\351\377\343\343\343\377"
"\343\343\343\377\354\354\354\377\354\354\354\377\354\354\354\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\355\355\355\377\355\355\355\377\351\351"
"\351\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377"
"\351\351\351\377\351\351\351\377\351\351\351\377\352\352\352\377\354\354"
"\354\377\354\354\354\377\357\357\357\377\354\354\354\377\354\354\354\377"
"\351\351\351\377\344\344\344\377\342\342\342\377\337\337\337\377\337\337"
"\337\377\337\337\337\377\334\334\334\377\342\342\342\377\342\342\342\377"
"\344\344\344\377\352\352\352\377\355\355\355\377\362\362\362\377\363\363"
"\363\377\365\365\365\377\365\365\365\377\365\365\365\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\357\357\357\377\357\357\357\377\352\352"
"\352\377\352\352\352\377\344\344\344\377\344\344\344\377\352\352\352\377"
"\354\354\354\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\355\355\355\377\355\355\355\377\354\354\354\377\354\354\354\377"
"\347\347\347\377\347\347\347\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\360\360\360\377\360\360\360\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377\360\360"
"\360\377\355\355\355\377\351\351\351\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\351\351\351\377\352\352\352\377\352\352\352\377\360\360"
"\360\377\362\362\362\377\362\362\362\377\362\362\362\377\357\357\357\377"
"\354\354\354\377\354\354\354\377\347\347\347\377\347\347\347\377\342\342"
"\342\377\337\337\337\377\334\334\334\377\334\334\334\377\337\337\337\377"
"\344\344\344\377\351\351\351\377\355\355\355\377\360\360\360\377\365\365"
"\365\377\366\366\366\377\371\371\371\377\370\370\370\377\366\366\366\377"
"\366\366\366\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\355\355\355\377\355\355\355\377\352\352\352\377\352\352\352\377"
"\355\355\355\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\360\360\360\377\355\355\355\377\351\351\351\377\351\351\351\377"
"\343\343\343\377\343\343\343\377\351\351\351\377\354\354\354\377\355\355"
"\355\377\362\362\362\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\362\362\362\377\357\357\357\377\352\352\352\377\347\347\347\377\344\344"
"\344\377\337\337\337\377\337\337\337\377\332\332\332\377\337\337\337\377"
"\337\337\337\377\343\343\343\377\351\351\351\377\355\355\355\377\363\363"
"\363\377\366\366\366\377\366\366\366\377\371\371\371\377\373\373\373\377"
"\373\373\373\377\371\371\371\377\365\365\365\377\365\365\365\377\365\365"
"\365\377\365\365\365\377\360\360\360\377\360\360\360\377\355\355\355\377"
"\357\357\357\377\357\357\357\377\362\362\362\377\362\362\362\377\363\363"
"\363\377\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\363\363\363\377\363\363\363\377\362\362"
"\362\377\362\362\362\377\355\355\355\377\355\355\355\377\351\351\351\377"
"\351\351\351\377\343\343\343\377\343\343\343\377\351\351\351\377\355\355"
"\355\377\360\360\360\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\362\362\362\377\360\360\360\377\355\355\355\377\354\354"
"\354\377\347\347\347\377\342\342\342\377\337\337\337\377\335\335\335\377"
"\337\337\337\377\340\340\340\377\343\343\343\377\346\346\346\377\355\355"
"\355\377\365\365\365\377\370\370\370\377\371\371\371\377\373\373\373\377"
"\373\373\373\377\373\373\373\377\371\371\371\377\366\366\366\377\366\366"
"\366\377\366\366\366\377\365\365\365\377\365\365\365\377\360\360\360\377"
"\360\360\360\377\355\355\355\377\355\355\355\377\360\360\360\377\363\363"
"\363\377\363\363\363\377\363\363\363\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\357\357\357\377\362\362\362\377\362\362"
"\362\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\355\355\355\377\352\352\352\377"
"\347\347\347\377\347\347\347\377\343\343\343\377\351\351\351\377\351\351"
"\351\377\355\355\355\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\352\352\352\377\346\346\346\377\342\342\342\377\337\337\337\377"
"\335\335\335\377\335\335\335\377\340\340\340\377\340\340\340\377\351\351"
"\351\377\360\360\360\377\363\363\363\377\366\366\366\377\373\373\373\377"
"\373\373\373\377\371\371\371\377\371\371\371\377\373\373\373\377\373\373"
"\373\377\370\370\370\377\370\370\370\377\363\363\363\377\363\363\363\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\363\363"
"\363\377\363\363\363\377\363\363\363\377\363\363\363\377\365\365\365\377"
"\365\365\365\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\363\363\363\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\363\363\363\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\362\362\362\377\362\362\362\377\355\355\355\377"
"\352\352\352\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\352\352\352\377\354\354\354\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377\360\360"
"\360\377\355\355\355\377\351\351\351\377\346\346\346\377\343\343\343\377"
"\335\335\335\377\335\335\335\377\334\334\334\377\340\340\340\377\343\343"
"\343\377\351\351\351\377\357\357\357\377\362\362\362\377\366\366\366\377"
"\373\373\373\377\371\371\371\377\371\371\371\377\370\370\370\377\373\373"
"\373\377\373\373\373\377\370\370\370\377\370\370\370\377\363\363\363\377"
"\363\363\363\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\360\360\360\377\363\363\363\377\362\362\362\377\362\362\362\377"
"\363\363\363\377\363\363\363\377\360\360\360\377\360\360\360\377\357\357"
"\357\377\357\357\357\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\357\357\357\377\360\360\360\377\363\363\363\377\363\363"
"\363\377\363\363\363\377\363\363\363\377\362\362\362\377\362\362\362\377"
"\355\355\355\377\352\352\352\377\344\344\344\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\352\352\352\377\352\352\352\377\357\357\357\377"
"\355\355\355\377\365\365\365\377\365\365\365\377\365\365\365\377\365\365"
"\365\377\363\363\363\377\355\355\355\377\351\351\351\377\346\346\346\377"
"\340\340\340\377\340\340\340\377\334\334\334\377\334\334\334\377\340\340"
"\340\377\343\343\343\377\347\347\347\377\355\355\355\377\362\362\362\377"
"\366\366\366\377\371\371\371\377\371\371\371\377\366\366\366\377\365\365"
"\365\377\365\365\365\377\365\365\365\377\366\366\366\377\366\366\366\377"
"\362\362\362\377\362\362\362\377\355\355\355\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\357\357\357\377\357\357\357\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\360\360\360\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\355\355\355\377"
"\360\360\360\377\354\354\354\377\352\352\352\377\344\344\344\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\352\352\352\377\355\355\355\377"
"\357\357\357\377\360\360\360\377\362\362\362\377\362\362\362\377\363\363"
"\363\377\365\365\365\377\363\363\363\377\363\363\363\377\355\355\355\377"
"\346\346\346\377\340\340\340\377\340\340\340\377\334\334\334\377\334\334"
"\334\377\340\340\340\377\343\343\343\377\347\347\347\377\355\355\355\377"
"\362\362\362\377\366\366\366\377\371\371\371\377\371\371\371\377\365\365"
"\365\377\365\365\365\377\365\365\365\377\365\365\365\377\366\366\366\377"
"\366\366\366\377\362\362\362\377\362\362\362\377\355\355\355\377\357\357"
"\357\377\357\357\357\377\360\360\360\377\357\357\357\377\357\357\357\377"
"\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377\360\360"
"\360\377\360\360\360\377\357\357\357\377\357\357\357\377\360\360\360\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\354\354\354\377\357\357\357\377\351\351\351\377\351\351\351\377\343\343"
"\343\377\343\343\343\377\344\344\344\377\344\344\344\377\352\352\352\377"
"\355\355\355\377\362\362\362\377\362\362\362\377\357\357\357\377\357\357"
"\357\377\363\363\363\377\363\363\363\377\362\362\362\377\363\363\363\377"
"\355\355\355\377\346\346\346\377\340\340\340\377\340\340\340\377\335\335"
"\335\377\335\335\335\377\340\340\340\377\342\342\342\377\344\344\344\377"
"\355\355\355\377\362\362\362\377\366\366\366\377\363\363\363\377\365\365"
"\365\377\370\370\370\377\370\370\370\377\366\366\366\377\366\366\366\377"
"\363\363\363\377\363\363\363\377\362\362\362\377\362\362\362\377\355\355"
"\355\377\355\355\355\377\352\352\352\377\352\352\352\377\360\360\360\377"
"\360\360\360\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\354\354\354\377\354\354\354\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\354\354"
"\354\377\357\357\357\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\357\357\357\377\357\357\357\377\351\351\351\377\351\351"
"\351\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\351\351\351\377\354\354\354\377\360\360\360\377\362\362\362\377\357\357"
"\357\377\362\362\362\377\363\363\363\377\363\363\363\377\357\357\357\377"
"\357\357\357\377\354\354\354\377\351\351\351\377\343\343\343\377\340\340"
"\340\377\335\335\335\377\335\335\335\377\337\337\337\377\337\337\337\377"
"\344\344\344\377\355\355\355\377\362\362\362\377\363\363\363\377\363\363"
"\363\377\363\363\363\377\370\370\370\377\370\370\370\377\366\366\366\377"
"\366\366\366\377\363\363\363\377\362\362\362\377\357\357\357\377\357\357"
"\357\377\355\355\355\377\355\355\355\377\355\355\355\377\352\352\352\377"
"\357\357\357\377\360\360\360\377\363\363\363\377\363\363\363\377\360\360"
"\360\377\357\357\357\377\357\357\357\377\357\357\357\377\354\354\354\377"
"\354\354\354\377\357\357\357\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\357\357\357\377\354\354\354\377\354\354\354\377"
"\354\354\354\377\354\354\354\377\357\357\357\377\357\357\357\377\351\351"
"\351\377\346\346\346\377\343\343\343\377\343\343\343\377\343\343\343\377"
"\343\343\343\377\351\351\351\377\354\354\354\377\355\355\355\377\360\360"
"\360\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\357\357\357\377\357\357\357\377\352\352\352\377\347\347\347\377\343\343"
"\343\377\343\343\343\377\335\335\335\377\335\335\335\377\337\337\337\377"
"\337\337\337\377\344\344\344\377\355\355\355\377\362\362\362\377\360\360"
"\360\377\360\360\360\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\362\362\362\377\362\362\362\377\362\362\362\377\357\357\357\377\355\355"
"\355\377\352\352\352\377\352\352\352\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\355\355\355\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\355\355\355\377\352\352\352\377\352\352\352\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\355\355\355\377\355\355\355\377\355\355\355\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\354\354\354\377\357\357\357\377\357\357"
"\357\377\351\351\351\377\346\346\346\377\340\340\340\377\340\340\340\377"
"\340\340\340\377\343\343\343\377\351\351\351\377\351\351\351\377\355\355"
"\355\377\355\355\355\377\360\360\360\377\360\360\360\377\362\362\362\377"
"\362\362\362\377\357\357\357\377\357\357\357\377\352\352\352\377\344\344"
"\344\377\342\342\342\377\342\342\342\377\334\334\334\377\334\334\334\377"
"\337\337\337\377\337\337\337\377\344\344\344\377\352\352\352\377\357\357"
"\357\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357"
"\357\377\355\355\355\377\352\352\352\377\352\352\352\377\352\352\352\377"
"\352\352\352\377\352\352\352\377\352\352\352\377\357\357\357\377\357\357"
"\357\377\357\357\357\377\355\355\355\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\355\355\355\377\344\344"
"\344\377\344\344\344\377\344\344\344\377\344\344\344\377\347\347\347\377"
"\352\352\352\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347"
"\347\377\352\352\352\377\347\347\347\377\346\346\346\377\340\340\340\377"
"\340\340\340\377\340\340\340\377\340\340\340\377\346\346\346\377\346\346"
"\346\377\354\354\354\377\354\354\354\377\355\355\355\377\355\355\355\377"
"\355\355\355\377\355\355\355\377\355\355\355\377\357\357\357\377\352\352"
"\352\377\344\344\344\377\342\342\342\377\342\342\342\377\334\334\334\377"
"\334\334\334\377\337\337\337\377\337\337\337\377\344\344\344\377\352\352"
"\352\377\357\357\357\377\355\355\355\377\360\360\360\377\354\354\354\377"
"\354\354\354\377\354\354\354\377\352\352\352\377\352\352\352\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\344\344\344\377\344\344\344\377"
"\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377\351\351"
"\351\377\351\351\351\377\351\351\351\377\347\347\347\377\347\347\347\377"
"\347\347\347\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347"
"\347\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377"
"\347\347\347\377\352\352\352\377\347\347\347\377\347\347\347\377\347\347"
"\347\377\347\347\347\377\347\347\347\377\344\344\344\377\344\344\344\377"
"\337\337\337\377\332\332\332\377\332\332\332\377\337\337\337\377\346\346"
"\346\377\346\346\346\377\351\351\351\377\351\351\351\377\354\354\354\377"
"\351\351\351\377\354\354\354\377\355\355\355\377\354\354\354\377\357\357"
"\357\377\352\352\352\377\344\344\344\377\342\342\342\377\342\342\342\377"
"\334\334\334\377\334\334\334\377\335\335\335\377\335\335\335\377\342\342"
"\342\377\344\344\344\377\352\352\352\377\354\354\354\377\360\360\360\377"
"\357\357\357\377\354\354\354\377\354\354\354\377\354\354\354\377\355\355"
"\355\377\352\352\352\377\352\352\352\377\347\347\347\377\344\344\344\377"
"\340\340\340\377\340\340\340\377\340\340\340\377\340\340\340\377\346\346"
"\346\377\346\346\346\377\354\354\354\377\354\354\354\377\347\347\347\377"
"\347\347\347\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347"
"\347\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347\347\377"
"\347\347\347\377\347\347\347\377\352\352\352\377\352\352\352\377\355\355"
"\355\377\355\355\355\377\352\352\352\377\352\352\352\377\344\344\344\377"
"\344\344\344\377\342\342\342\377\337\337\337\377\337\337\337\377\342\342"
"\342\377\344\344\344\377\344\344\344\377\352\352\352\377\354\354\354\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360"
"\360\377\355\355\355\377\352\352\352\377\344\344\344\377\342\342\342\377"
"\342\342\342\377\334\334\334\377\332\332\332\377\335\335\335\377\335\335"
"\335\377\342\342\342\377\344\344\344\377\352\352\352\377\354\354\354\377"
"\360\360\360\377\357\357\357\377\354\354\354\377\354\354\354\377\354\354"
"\354\377\355\355\355\377\352\352\352\377\352\352\352\377\344\344\344\377"
"\344\344\344\377\340\340\340\377\340\340\340\377\340\340\340\377\340\340"
"\340\377\346\346\346\377\346\346\346\377\354\354\354\377\351\351\351\377"
"\354\354\354\377\352\352\352\377\352\352\352\377\352\352\352\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\346\346\346\377\346\346\346\377"
"\346\346\346\377\347\347\347\377\347\347\347\377\347\347\347\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\355\355\355\377\352\352\352\377"
"\352\352\352\377\347\347\347\377\347\347\347\377\344\344\344\377\344\344"
"\344\377\347\347\347\377\347\347\347\377\352\352\352\377\352\352\352\377"
"\355\355\355\377\357\357\357\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\355\355\355\377\344\344\344\377"
"\337\337\337\377\337\337\337\377\332\332\332\377\332\332\332\377\337\337"
"\337\377\337\337\337\377\344\344\344\377\352\352\352\377\357\357\357\377"
"\355\355\355\377\360\360\360\377\354\354\354\377\354\354\354\377\354\354"
"\354\377\354\354\354\377\354\354\354\377\352\352\352\377\352\352\352\377"
"\351\351\351\377\351\351\351\377\346\346\346\377\340\340\340\377\340\340"
"\340\377\340\340\340\377\346\346\346\377\351\351\351\377\351\351\351\377"
"\351\351\351\377\354\354\354\377\352\352\352\377\352\352\352\377\352\352"
"\352\377\352\352\352\377\352\352\352\377\352\352\352\377\354\354\354\377"
"\354\354\354\377\354\354\354\377\354\354\354\377\354\354\354\377\354\354"
"\354\377\357\357\357\377\357\357\357\377\360\360\360\377\362\362\362\377"
"\357\357\357\377\357\357\357\377\355\355\355\377\355\355\355\377\352\352"
"\352\377\352\352\352\377\355\355\355\377\355\355\355\377\357\357\357\377"
"\357\357\357\377\362\362\362\377\362\362\362\377\363\363\363\377\363\363"
"\363\377\365\365\365\377\365\365\365\377\360\360\360\377\354\354\354\377"
"\344\344\344\377\337\337\337\377\337\337\337\377\332\332\332\377\332\332"
"\332\377\337\337\337\377\337\337\337\377\344\344\344\377\352\352\352\377"
"\357\357\357\377\360\360\360\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\357\357\357\377"
"\357\357\357\377\354\354\354\377\354\354\354\377\346\346\346\377\346\346"
"\346\377\343\343\343\377\346\346\346\377\346\346\346\377\354\354\354\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\355\355\355\377\357\357"
"\357\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\360\360\360\377\357\357\357\377\357\357\357\377\352\352\352\377\355\355"
"\355\377\352\352\352\377\352\352\352\377\355\355\355\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\365\365\365\377\365\365\365\377\365\365\365\377\363\363\363\377"
"\355\355\355\377\352\352\352\377\344\344\344\377\337\337\337\377\332\332"
"\332\377\332\332\332\377\337\337\337\377\337\337\337\377\344\344\344\377"
"\355\355\355\377\362\362\362\377\360\360\360\377\363\363\363\377\360\360"
"\360\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360\360\377"
"\357\357\357\377\357\357\357\377\354\354\354\377\354\354\354\377\346\346"
"\346\377\346\346\346\377\346\346\346\377\346\346\346\377\354\354\354\377"
"\354\354\354\377\357\357\357\377\357\357\357\377\357\357\357\377\355\355"
"\355\377\357\357\357\377\355\355\355\377\357\357\357\377\362\362\362\377"
"\362\362\362\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363"
"\363\377\365\365\365\377\365\365\365\377\365\365\365\377\365\365\365\377"
"\365\365\365\377\365\365\365\377\363\363\363\377\360\360\360\377\357\357"
"\357\377\354\354\354\377\354\354\354\377\354\354\354\377\351\351\351\377"
"\362\362\362\377\363\363\363\377\366\366\366\377\370\370\370\377\370\370"
"\370\377\370\370\370\377\370\370\370\377\370\370\370\377\365\365\365\377"
"\363\363\363\377\355\355\355\377\352\352\352\377\344\344\344\377\337\337"
"\337\377\332\332\332\377\332\332\332\377\337\337\337\377\337\337\337\377"
"\344\344\344\377\355\355\355\377\362\362\362\377\360\360\360\377\365\365"
"\365\377\363\363\363\377\363\363\363\377\363\363\363\377\362\362\362\377"
"\362\362\362\377\360\360\360\377\360\360\360\377\354\354\354\377\354\354"
"\354\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377"
"\354\354\354\377\354\354\354\377\360\360\360\377\360\360\360\377\363\363"
"\363\377\357\357\357\377\362\362\362\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\366\366\366\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\363\363\363\377\365\365\365\377\365\365\365\377\365\365\365\377"
"\365\365\365\377\365\365\365\377\365\365\365\377\365\365\365\377\360\360"
"\360\377\360\360\360\377\357\357\357\377\354\354\354\377\351\351\351\377"
"\351\351\351\377\357\357\357\377\362\362\362\377\370\370\370\377\370\370"
"\370\377\370\370\370\377\370\370\370\377\370\370\370\377\370\370\370\377"
"\365\365\365\377\365\365\365\377\360\360\360\377\352\352\352\377\344\344"
"\344\377\337\337\337\377\332\332\332\377\332\332\332\377\337\337\337\377"
"\337\337\337\377\344\344\344\377\355\355\355\377\362\362\362\377\360\360"
"\360\377\365\365\365\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\362\362\362\377\362\362\362\377\360\360\360\377\360\360\360\377\354\354"
"\354\377\354\354\354\377\346\346\346\377\346\346\346\377\346\346\346\377"
"\346\346\346\377\354\354\354\377\354\354\354\377\360\360\360\377\360\360"
"\360\377\362\362\362\377\355\355\355\377\362\362\362\377\362\362\362\377"
"\362\362\362\377\366\366\366\377\366\366\366\377\363\363\363\377\365\365"
"\365\377\365\365\365\377\365\365\365\377\365\365\365\377\371\371\371\377"
"\371\371\371\377\371\371\371\377\371\371\371\377\365\365\365\377\365\365"
"\365\377\360\360\360\377\363\363\363\377\357\357\357\377\357\357\357\377"
"\354\354\354\377\357\357\357\377\357\357\357\377\360\360\360\377\365\365"
"\365\377\370\370\370\377\376\376\376\377\376\376\376\377\370\370\370\377"
"\370\370\370\377\365\365\365\377\363\363\363\377\360\360\360\377\352\352"
"\352\377\344\344\344\377\337\337\337\377\332\332\332\377\332\332\332\377"
"\337\337\337\377\337\337\337\377\344\344\344\377\355\355\355\377\362\362"
"\362\377\362\362\362\377\365\365\365\377\363\363\363\377\363\363\363\377"
"\363\363\363\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360"
"\360\377\354\354\354\377\354\354\354\377\346\346\346\377\346\346\346\377"
"\346\346\346\377\346\346\346\377\354\354\354\377\354\354\354\377\360\360"
"\360\377\360\360\360\377\357\357\357\377\355\355\355\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\362\362\362\377\366\366\366\377\362\362"
"\362\377\363\363\363\377\363\363\363\377\363\363\363\377\370\370\370\377"
"\370\370\370\377\370\370\370\377\370\370\370\377\371\371\371\377\365\365"
"\365\377\365\365\365\377\360\360\360\377\363\363\363\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360"
"\360\377\365\365\365\377\366\366\366\377\376\376\376\377\376\376\376\377"
"\370\370\370\377\370\370\370\377\365\365\365\377\360\360\360\377\355\355"
"\355\377\343\343\343\377\337\337\337\377\337\337\337\377\332\332\332\377"
"\332\332\332\377\337\337\337\377\337\337\337\377\344\344\344\377\355\355"
"\355\377\362\362\362\377\362\362\362\377\365\365\365\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\357\357\357\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\354\354\354\377\354\354\354\377\346\346\346\377"
"\346\346\346\377\346\346\346\377\346\346\346\377\354\354\354\377\354\354"
"\354\377\360\360\360\377\360\360\360\377\357\357\357\377\357\357\357\377"
"\362\362\362\377\362\362\362\377\362\362\362\377\362\362\362\377\366\366"
"\366\377\357\357\357\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\370\370\370\377\370\370\370\377\370\370\370\377\370\370\370\377\370\370"
"\370\377\363\363\363\377\363\363\363\377\360\360\360\377\360\360\360\377"
"\357\357\357\377\354\354\354\377\354\354\354\377\357\357\357\377\360\360"
"\360\377\360\360\360\377\365\365\365\377\365\365\365\377\376\376\376\377"
"\370\370\370\377\370\370\370\377\370\370\370\377\365\365\365\377\360\360"
"\360\377\355\355\355\377\343\343\343\377\337\337\337\377\335\335\335\377"
"\332\332\332\377\332\332\332\377\335\335\335\377\337\337\337\377\344\344"
"\344\377\355\355\355\377\362\362\362\377\362\362\362\377\363\363\363\377"
"\363\363\363\377\363\363\363\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\354\354\354\377\357\357\357\377\354\354\354\377\354\354\354\377"
"\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377\354\354"
"\354\377\354\354\354\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\355\355\355\377\355\355\355\377\362\362\362\377\362\362"
"\362\377\366\366\366\377\355\355\355\377\360\360\360\377\362\362\362\377"
"\362\362\362\377\362\362\362\377\366\366\366\377\370\370\370\377\370\370"
"\370\377\370\370\370\377\363\363\363\377\363\363\363\377\360\360\360\377"
"\357\357\357\377\354\354\354\377\354\354\354\377\354\354\354\377\354\354"
"\354\377\357\357\357\377\360\360\360\377\365\365\365\377\365\365\365\377"
"\371\371\371\377\370\370\370\377\370\370\370\377\366\366\366\377\362\362"
"\362\377\360\360\360\377\355\355\355\377\343\343\343\377\337\337\337\377"
"\335\335\335\377\332\332\332\377\332\332\332\377\335\335\335\377\335\335"
"\335\377\342\342\342\377\352\352\352\377\357\357\357\377\362\362\362\377"
"\363\363\363\377\360\360\360\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\354\354\354\377\357\357\357\377\354\354\354\377"
"\354\354\354\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346"
"\346\377\354\354\354\377\354\354\354\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\357\357\357\377\355\355\355\377\355\355\355\377\362\362"
"\362\377\362\362\362\377\363\363\363\377\352\352\352\377\355\355\355\377"
"\355\355\355\377\362\362\362\377\362\362\362\377\362\362\362\377\362\362"
"\362\377\363\363\363\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\357\357\357\377\357\357\357\377\351\351\351\377\351\351\351\377\346\346"
"\346\377\351\351\351\377\357\357\357\377\360\360\360\377\365\365\365\377"
"\365\365\365\377\365\365\365\377\370\370\370\377\363\363\363\377\363\363"
"\363\377\362\362\362\377\360\360\360\377\355\355\355\377\343\343\343\377"
"\337\337\337\377\335\335\335\377\327\327\327\377\327\327\327\377\335\335"
"\335\377\335\335\335\377\342\342\342\377\352\352\352\377\357\357\357\377"
"\357\357\357\377\363\363\363\377\360\360\360\377\360\360\360\377\360\360"
"\360\377\357\357\357\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\351\351\351\377\351\351\351\377\346\346\346\377\340\340\340\377\340\340"
"\340\377\346\346\346\377\351\351\351\377\351\351\351\377\357\357\357\377"
"\354\354\354\377\352\352\352\377\352\352\352\377\355\355\355\377\355\355"
"\355\377\362\362\362\377\362\362\362\377\360\360\360\377\355\355\355\377"
"\352\352\352\377\355\355\355\377\360\360\360\377\362\362\362\377\362\362"
"\362\377\362\362\362\377\363\363\363\377\363\363\363\377\363\363\363\377"
"\362\362\362\377\354\354\354\377\354\354\354\377\351\351\351\377\351\351"
"\351\377\346\346\346\377\346\346\346\377\354\354\354\377\357\357\357\377"
"\363\363\363\377\365\365\365\377\365\365\365\377\363\363\363\377\362\362"
"\362\377\362\362\362\377\355\355\355\377\357\357\357\377\354\354\354\377"
"\343\343\343\377\335\335\335\377\335\335\335\377\327\327\327\377\327\327"
"\327\377\335\335\335\377\335\335\335\377\342\342\342\377\352\352\352\377"
"\357\357\357\377\357\357\357\377\363\363\363\377\360\360\360\377\360\360"
"\360\377\360\360\360\377\357\357\357\377\357\357\357\377\357\357\357\377"
"\357\357\357\377\351\351\351\377\346\346\346\377\340\340\340\377\340\340"
"\340\377\340\340\340\377\340\340\340\377\346\346\346\377\351\351\351\377"
"\357\357\357\377\357\357\357\377\352\352\352\377\352\352\352\377\354\354"
"\354\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360\360\377"
"\352\352\352\377\355\355\355\377\355\355\355\377\355\355\355\377\355\355"
"\355\377\357\357\357\377\355\355\355\377\357\357\357\377\362\362\362\377"
"\357\357\357\377\362\362\362\377\354\354\354\377\354\354\354\377\346\346"
"\346\377\346\346\346\377\344\344\344\377\344\344\344\377\354\354\354\377"
"\357\357\357\377\363\363\363\377\360\360\360\377\360\360\360\377\363\363"
"\363\377\362\362\362\377\362\362\362\377\355\355\355\377\357\357\357\377"
"\354\354\354\377\340\340\340\377\335\335\335\377\335\335\335\377\327\327"
"\327\377\327\327\327\377\335\335\335\377\335\335\335\377\342\342\342\377"
"\352\352\352\377\357\357\357\377\357\357\357\377\363\363\363\377\357\357"
"\357\377\357\357\357\377\357\357\357\377\360\360\360\377\360\360\360\377"
"\357\357\357\377\357\357\357\377\351\351\351\377\346\346\346\377\340\340"
"\340\377\340\340\340\377\340\340\340\377\340\340\340\377\346\346\346\377"
"\351\351\351\377\357\357\357\377\354\354\354\377\355\355\355\377\355\355"
"\355\377\354\354\354\377\354\354\354\377\355\355\355\377\352\352\352\377"
"\352\352\352\377",
};
+922
View File
@@ -0,0 +1,922 @@
/* GIMP RGBA C-Source image dump (text_silk.c) */
static const struct {
unsigned int width;
unsigned int height;
unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */
unsigned char pixel_data[64 * 64 * 4 + 1];
} text_silk = {
64, 64, 4,
"\377\377\377\366\377\377\377\372\377\377\377\375\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\377\377\377\377\374\377\377"
"\377\366\377\377\377\365\377\377\377\364\377\377\377\366\377\377\377\370"
"\377\377\377\365\377\377\377\362\377\377\377\364\377\377\377\366\377\377"
"\377\370\377\377\377\372\377\377\377\363\377\377\377\354\377\377\377\350"
"\377\377\377\351\377\377\377\352\377\377\377\354\377\377\377\356\377\377"
"\377\361\377\377\377\366\377\377\377\372\377\377\377\375\377\377\377\375"
"\377\377\377\373\377\377\377\365\377\377\377\366\377\377\377\371\377\377"
"\377\372\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\366\377\377"
"\377\357\377\377\377\350\377\377\377\346\377\377\377\342\377\377\377\335"
"\377\377\377\346\377\377\377\351\377\377\377\351\377\377\377\357\377\377"
"\377\357\377\377\377\363\377\377\377\363\377\377\377\361\377\377\377\361"
"\377\377\377\362\377\377\377\357\377\377\377\365\377\377\377\372\377\377"
"\377\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\377\377\377"
"\377\375\377\377\377\370\377\377\377\365\377\377\377\364\377\377\377\367"
"\377\377\377\370\377\377\377\363\377\377\377\357\377\377\377\356\377\377"
"\377\360\377\377\377\364\377\377\377\370\377\377\377\365\377\377\377\355"
"\377\377\377\350\377\377\377\347\377\377\377\344\377\377\377\344\377\377"
"\377\352\377\377\377\357\377\377\377\362\377\377\377\370\377\377\377\374"
"\377\377\377\372\377\377\377\366\377\377\377\362\377\377\377\363\377\377"
"\377\363\377\377\377\363\377\377\377\365\377\377\377\371\377\377\377\375"
"\377\377\377\375\377\377\377\376\377\377\377\377\377\377\377\377\377\377"
"\377\373\377\377\377\363\377\377\377\352\377\377\377\347\377\377\377\346"
"\377\377\377\342\377\377\377\345\377\377\377\344\377\377\377\340\377\377"
"\377\344\377\377\377\351\377\377\377\355\377\377\377\356\377\377\377\357"
"\377\377\377\354\377\377\377\354\377\377\377\356\377\377\377\364\377\377"
"\377\371\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\376\377\377\377\374\377\377\377\373\377\377\377\372"
"\377\377\377\374\377\377\377\372\377\377\377\362\377\377\377\360\377\377"
"\377\356\377\377\377\357\377\377\377\366\377\377\377\367\377\377\377\361"
"\377\377\377\351\377\377\377\346\377\377\377\350\377\377\377\344\377\377"
"\377\340\377\377\377\347\377\377\377\360\377\377\377\361\377\377\377\365"
"\377\377\377\370\377\377\377\365\377\377\377\362\377\377\377\356\377\377"
"\377\355\377\377\377\355\377\377\377\354\377\377\377\356\377\377\377\360"
"\377\377\377\364\377\377\377\370\377\377\377\372\377\377\377\377\377\377"
"\377\377\377\377\377\372\377\377\377\364\377\377\377\352\377\377\377\342"
"\377\377\377\342\377\377\377\340\377\377\377\342\377\377\377\342\377\377"
"\377\333\377\377\377\327\377\377\377\336\377\377\377\345\377\377\377\352"
"\377\377\377\357\377\377\377\355\377\377\377\354\377\377\377\357\377\377"
"\377\364\377\377\377\371\377\377\377\374\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\372\377\377\377\366\377\377"
"\377\363\377\377\377\362\377\377\377\365\377\377\377\370\377\377\377\365"
"\377\377\377\357\377\377\377\352\377\377\377\351\377\377\377\355\377\377"
"\377\351\377\377\377\343\377\377\377\347\377\377\377\360\377\377\377\364"
"\377\377\377\366\377\377\377\365\377\377\377\363\377\377\377\360\377\377"
"\377\351\377\377\377\346\377\377\377\352\377\377\377\353\377\377\377\347"
"\377\377\377\352\377\377\377\361\377\377\377\365\377\377\377\370\377\377"
"\377\376\377\377\377\376\377\377\377\366\377\377\377\361\377\377\377\353"
"\377\377\377\336\377\377\377\332\377\377\377\334\377\377\377\335\377\377"
"\377\336\377\377\377\327\377\377\377\316\377\377\377\322\377\377\377\333"
"\377\377\377\344\377\377\377\357\377\377\377\357\377\377\377\357\377\377"
"\377\361\377\377\377\364\377\377\377\372\377\377\377\375\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\366\377\377"
"\377\365\377\377\377\365\377\377\377\370\377\377\377\374\377\377\377\374"
"\377\377\377\366\377\377\377\360\377\377\377\353\377\377\377\353\377\377"
"\377\361\377\377\377\356\377\377\377\353\377\377\377\357\377\377\377\365"
"\377\377\377\371\377\377\377\371\377\377\377\367\377\377\377\361\377\377"
"\377\354\377\377\377\351\377\377\377\351\377\377\377\352\377\377\377\350"
"\377\377\377\343\377\377\377\354\377\377\377\366\377\377\377\373\377\377"
"\377\374\377\377\377\375\377\377\377\374\377\377\377\363\377\377\377\351"
"\377\377\377\342\377\377\377\332\377\377\377\333\377\377\377\340\377\377"
"\377\341\377\377\377\340\377\377\377\326\377\377\377\312\377\377\377\317"
"\377\377\377\327\377\377\377\343\377\377\377\357\377\377\377\360\377\377"
"\377\361\377\377\377\357\377\377\377\364\377\377\377\372\377\377\377\376"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\372\377\377\377\371\377\377\377\372\377\377\377\374\377\377\377\377"
"\377\377\377\377\377\377\377\371\377\377\377\357\377\377\377\355\377\377"
"\377\360\377\377\377\365\377\377\377\365\377\377\377\362\377\377\377\365"
"\377\377\377\372\377\377\377\374\377\377\377\372\377\377\377\366\377\377"
"\377\361\377\377\377\360\377\377\377\356\377\377\377\356\377\377\377\353"
"\377\377\377\347\377\377\377\347\377\377\377\361\377\377\377\372\377\377"
"\377\377\377\377\377\377\377\377\377\373\377\377\377\365\377\377\377\355"
"\377\377\377\345\377\377\377\335\377\377\377\333\377\377\377\337\377\377"
"\377\344\377\377\377\347\377\377\377\343\377\377\377\330\377\377\377\317"
"\377\377\377\317\377\377\377\322\377\377\377\337\377\377\377\352\377\377"
"\377\354\377\377\377\356\377\377\377\364\377\377\377\367\377\377\377\372"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\376\377\377\377\376\377\377\377\377\377\377\377\377"
"\377\377\377\375\377\377\377\373\377\377\377\370\377\377\377\363\377\377"
"\377\361\377\377\377\363\377\377\377\366\377\377\377\367\377\377\377\365"
"\377\377\377\371\377\377\377\373\377\377\377\371\377\377\377\370\377\377"
"\377\364\377\377\377\360\377\377\377\361\377\377\377\357\377\377\377\356"
"\377\377\377\357\377\377\377\357\377\377\377\361\377\377\377\366\377\377"
"\377\372\377\377\377\375\377\377\377\377\377\377\377\370\377\377\377\361"
"\377\377\377\355\377\377\377\351\377\377\377\342\377\377\377\337\377\377"
"\377\340\377\377\377\345\377\377\377\350\377\377\377\343\377\377\377\334"
"\377\377\377\325\377\377\377\320\377\377\377\316\377\377\377\335\377\377"
"\377\351\377\377\377\356\377\377\377\361\377\377\377\370\377\377\377\372"
"\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\376\377\377\377\375\377\377\377\377"
"\377\377\377\377\377\377\377\372\377\377\377\365\377\377\377\363\377\377"
"\377\365\377\377\377\363\377\377\377\363\377\377\377\366\377\377\377\366"
"\377\377\377\370\377\377\377\374\377\377\377\372\377\377\377\364\377\377"
"\377\361\377\377\377\357\377\377\377\354\377\377\377\356\377\377\377\353"
"\377\377\377\355\377\377\377\362\377\377\377\367\377\377\377\373\377\377"
"\377\375\377\377\377\374\377\377\377\374\377\377\377\375\377\377\377\371"
"\377\377\377\363\377\377\377\356\377\377\377\350\377\377\377\343\377\377"
"\377\342\377\377\377\344\377\377\377\350\377\377\377\350\377\377\377\346"
"\377\377\377\340\377\377\377\333\377\377\377\330\377\377\377\331\377\377"
"\377\342\377\377\377\354\377\377\377\362\377\377\377\367\377\377\377\366"
"\377\377\377\366\377\377\377\373\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\376\377\377\377\372\377\377\377\374"
"\377\377\377\375\377\377\377\373\377\377\377\370\377\377\377\364\377\377"
"\377\361\377\377\377\365\377\377\377\365\377\377\377\365\377\377\377\367"
"\377\377\377\365\377\377\377\370\377\377\377\373\377\377\377\372\377\377"
"\377\366\377\377\377\357\377\377\377\351\377\377\377\351\377\377\377\354"
"\377\377\377\352\377\377\377\360\377\377\377\363\377\377\377\370\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\370\377\377\377\363\377\377\377\356\377\377\377\350\377\377"
"\377\344\377\377\377\342\377\377\377\343\377\377\377\352\377\377\377\354"
"\377\377\377\352\377\377\377\343\377\377\377\340\377\377\377\335\377\377"
"\377\340\377\377\377\346\377\377\377\356\377\377\377\362\377\377\377\367"
"\377\377\377\363\377\377\377\361\377\377\377\367\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\374\377\377\377\370\377\377\377\366"
"\377\377\377\372\377\377\377\372\377\377\377\367\377\377\377\367\377\377"
"\377\366\377\377\377\365\377\377\377\366\377\377\377\362\377\377\377\361"
"\377\377\377\364\377\377\377\364\377\377\377\370\377\377\377\372\377\377"
"\377\374\377\377\377\373\377\377\377\363\377\377\377\355\377\377\377\353"
"\377\377\377\352\377\377\377\354\377\377\377\364\377\377\377\367\377\377"
"\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\372\377\377\377\362\377\377\377\356\377\377"
"\377\350\377\377\377\346\377\377\377\342\377\377\377\342\377\377\377\353"
"\377\377\377\361\377\377\377\356\377\377\377\353\377\377\377\346\377\377"
"\377\337\377\377\377\341\377\377\377\351\377\377\377\361\377\377\377\362"
"\377\377\377\364\377\377\377\361\377\377\377\360\377\377\377\370\377\377"
"\377\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\372"
"\377\377\377\365\377\377\377\364\377\377\377\365\377\377\377\364\377\377"
"\377\364\377\377\377\364\377\377\377\364\377\377\377\361\377\377\377\352"
"\377\377\377\354\377\377\377\357\377\377\377\362\377\377\377\372\377\377"
"\377\376\377\377\377\375\377\377\377\373\377\377\377\365\377\377\377\361"
"\377\377\377\363\377\377\377\362\377\377\377\363\377\377\377\370\377\377"
"\377\373\377\377\377\376\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\363\377\377"
"\377\353\377\377\377\346\377\377\377\346\377\377\377\347\377\377\377\352"
"\377\377\377\356\377\377\377\361\377\377\377\356\377\377\377\357\377\377"
"\377\354\377\377\377\350\377\377\377\350\377\377\377\360\377\377\377\366"
"\377\377\377\363\377\377\377\362\377\377\377\361\377\377\377\364\377\377"
"\377\374\377\377\377\376\377\377\377\376\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\374\377\377"
"\377\377\377\377\377\375\377\377\377\374\377\377\377\375\377\377\377\376"
"\377\377\377\374\377\377\377\366\377\377\377\361\377\377\377\363\377\377"
"\377\366\377\377\377\365\377\377\377\363\377\377\377\361\377\377\377\355"
"\377\377\377\344\377\377\377\351\377\377\377\355\377\377\377\360\377\377"
"\377\372\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377\366"
"\377\377\377\367\377\377\377\370\377\377\377\371\377\377\377\371\377\377"
"\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377"
"\377\366\377\377\377\357\377\377\377\351\377\377\377\350\377\377\377\354"
"\377\377\377\360\377\377\377\361\377\377\377\363\377\377\377\357\377\377"
"\377\361\377\377\377\357\377\377\377\355\377\377\377\360\377\377\377\363"
"\377\377\377\365\377\377\377\365\377\377\377\364\377\377\377\370\377\377"
"\377\370\377\377\377\375\377\377\377\375\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377"
"\377\372\377\377\377\376\377\377\377\376\377\377\377\376\377\377\377\377"
"\377\377\377\376\377\377\377\372\377\377\377\365\377\377\377\362\377\377"
"\377\361\377\377\377\363\377\377\377\365\377\377\377\367\377\377\377\363"
"\377\377\377\353\377\377\377\341\377\377\377\345\377\377\377\356\377\377"
"\377\365\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\374"
"\377\377\377\367\377\377\377\371\377\377\377\372\377\377\377\375\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\375\377\377\377\370\377\377\377\363\377\377\377\357\377\377\377\356"
"\377\377\377\357\377\377\377\357\377\377\377\360\377\377\377\362\377\377"
"\377\357\377\377\377\361\377\377\377\356\377\377\377\355\377\377\377\365"
"\377\377\377\367\377\377\377\366\377\377\377\372\377\377\377\373\377\377"
"\377\376\377\377\377\374\377\377\377\376\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\374\377\377\377\371\377\377\377\375\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\374\377\377\377\370\377\377\377\364\377\377"
"\377\361\377\377\377\356\377\377\377\355\377\377\377\362\377\377\377\365"
"\377\377\377\357\377\377\377\353\377\377\377\344\377\377\377\344\377\377"
"\377\353\377\377\377\365\377\377\377\374\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\370\377\377\377\367\377\377\377\371\377\377"
"\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377"
"\377\372\377\377\377\371\377\377\377\370\377\377\377\364\377\377\377\362"
"\377\377\377\361\377\377\377\357\377\377\377\356\377\377\377\354\377\377"
"\377\357\377\377\377\357\377\377\377\361\377\377\377\361\377\377\377\361"
"\377\377\377\366\377\377\377\373\377\377\377\376\377\377\377\377\377\377"
"\377\377\377\377\377\375\377\377\377\374\377\377\377\376\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\376\377\377\377\376\377\377\377\374\377\377\377\376\377\377\377\377"
"\377\377\377\377\377\377\377\372\377\377\377\370\377\377\377\367\377\377"
"\377\365\377\377\377\362\377\377\377\356\377\377\377\355\377\377\377\356"
"\377\377\377\355\377\377\377\350\377\377\377\352\377\377\377\355\377\377"
"\377\354\377\377\377\355\377\377\377\363\377\377\377\374\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377\371\377\377"
"\377\372\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\374\377\377"
"\377\364\377\377\377\361\377\377\377\362\377\377\377\365\377\377\377\366"
"\377\377\377\364\377\377\377\361\377\377\377\356\377\377\377\355\377\377"
"\377\353\377\377\377\361\377\377\377\360\377\377\377\356\377\377\377\362"
"\377\377\377\363\377\377\377\367\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\372\377\377\377\365\377\377\377\372"
"\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\377\377\377"
"\377\377\377\377\377\376\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\372\377\377\377\365\377\377\377\366\377\377"
"\377\366\377\377\377\364\377\377\377\363\377\377\377\361\377\377\377\360"
"\377\377\377\357\377\377\377\351\377\377\377\350\377\377\377\354\377\377"
"\377\361\377\377\377\364\377\377\377\364\377\377\377\364\377\377\377\371"
"\377\377\377\373\377\377\377\373\377\377\377\373\377\377\377\370\377\377"
"\377\371\377\377\377\374\377\377\377\375\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377"
"\377\370\377\377\377\362\377\377\377\356\377\377\377\356\377\377\377\361"
"\377\377\377\365\377\377\377\364\377\377\377\361\377\377\377\360\377\377"
"\377\360\377\377\377\361\377\377\377\365\377\377\377\361\377\377\377\353"
"\377\377\377\357\377\377\377\365\377\377\377\372\377\377\377\376\377\377"
"\377\377\377\377\377\377\377\377\377\376\377\377\377\366\377\377\377\357"
"\377\377\377\365\377\377\377\372\377\377\377\373\377\377\377\373\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\376\377\377\377\374\377\377\377\367\377\377\377\363\377\377"
"\377\366\377\377\377\366\377\377\377\364\377\377\377\367\377\377\377\365"
"\377\377\377\362\377\377\377\363\377\377\377\353\377\377\377\353\377\377"
"\377\355\377\377\377\362\377\377\377\366\377\377\377\365\377\377\377\363"
"\377\377\377\363\377\377\377\365\377\377\377\363\377\377\377\366\377\377"
"\377\363\377\377\377\362\377\377\377\370\377\377\377\372\377\377\377\372"
"\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\375\377\377"
"\377\374\377\377\377\367\377\377\377\363\377\377\377\357\377\377\377\355"
"\377\377\377\362\377\377\377\366\377\377\377\367\377\377\377\364\377\377"
"\377\362\377\377\377\357\377\377\377\360\377\377\377\361\377\377\377\356"
"\377\377\377\347\377\377\377\350\377\377\377\357\377\377\377\366\377\377"
"\377\370\377\377\377\370\377\377\377\372\377\377\377\373\377\377\377\357"
"\377\377\377\351\377\377\377\356\377\377\377\364\377\377\377\370\377\377"
"\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\374\377\377\377\370\377\377"
"\377\365\377\377\377\364\377\377\377\362\377\377\377\362\377\377\377\365"
"\377\377\377\364\377\377\377\365\377\377\377\365\377\377\377\356\377\377"
"\377\353\377\377\377\356\377\377\377\364\377\377\377\366\377\377\377\365"
"\377\377\377\363\377\377\377\357\377\377\377\355\377\377\377\354\377\377"
"\377\353\377\377\377\352\377\377\377\353\377\377\377\362\377\377\377\370"
"\377\377\377\373\377\377\377\376\377\377\377\376\377\377\377\372\377\377"
"\377\374\377\377\377\375\377\377\377\372\377\377\377\366\377\377\377\362"
"\377\377\377\361\377\377\377\366\377\377\377\372\377\377\377\367\377\377"
"\377\364\377\377\377\357\377\377\377\352\377\377\377\355\377\377\377\352"
"\377\377\377\346\377\377\377\343\377\377\377\344\377\377\377\351\377\377"
"\377\355\377\377\377\355\377\377\377\356\377\377\377\362\377\377\377\364"
"\377\377\377\353\377\377\377\344\377\377\377\346\377\377\377\352\377\377"
"\377\357\377\377\377\371\377\377\377\376\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\374\377\377\377\372\377\377"
"\377\370\377\377\377\365\377\377\377\362\377\377\377\357\377\377\377\355"
"\377\377\377\355\377\377\377\354\377\377\377\362\377\377\377\365\377\377"
"\377\362\377\377\377\356\377\377\377\357\377\377\377\364\377\377\377\363"
"\377\377\377\362\377\377\377\362\377\377\377\356\377\377\377\356\377\377"
"\377\355\377\377\377\351\377\377\377\351\377\377\377\353\377\377\377\357"
"\377\377\377\370\377\377\377\373\377\377\377\374\377\377\377\375\377\377"
"\377\370\377\377\377\370\377\377\377\372\377\377\377\372\377\377\377\371"
"\377\377\377\367\377\377\377\366\377\377\377\370\377\377\377\370\377\377"
"\377\361\377\377\377\356\377\377\377\350\377\377\377\346\377\377\377\353"
"\377\377\377\347\377\377\377\337\377\377\377\342\377\377\377\346\377\377"
"\377\347\377\377\377\350\377\377\377\350\377\377\377\350\377\377\377\355"
"\377\377\377\361\377\377\377\351\377\377\377\340\377\377\377\340\377\377"
"\377\343\377\377\377\353\377\377\377\367\377\377\377\374\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\372\377\377\377\371\377\377"
"\377\370\377\377\377\372\377\377\377\372\377\377\377\363\377\377\377\356"
"\377\377\377\350\377\377\377\346\377\377\377\344\377\377\377\353\377\377"
"\377\363\377\377\377\363\377\377\377\356\377\377\377\355\377\377\377\361"
"\377\377\377\360\377\377\377\361\377\377\377\361\377\377\377\357\377\377"
"\377\360\377\377\377\361\377\377\377\360\377\377\377\355\377\377\377\353"
"\377\377\377\360\377\377\377\367\377\377\377\371\377\377\377\371\377\377"
"\377\370\377\377\377\365\377\377\377\366\377\377\377\370\377\377\377\372"
"\377\377\377\370\377\377\377\367\377\377\377\371\377\377\377\370\377\377"
"\377\365\377\377\377\355\377\377\377\344\377\377\377\337\377\377\377\341"
"\377\377\377\344\377\377\377\342\377\377\377\340\377\377\377\340\377\377"
"\377\342\377\377\377\342\377\377\377\346\377\377\377\347\377\377\377\346"
"\377\377\377\351\377\377\377\354\377\377\377\342\377\377\377\334\377\377"
"\377\337\377\377\377\344\377\377\377\360\377\377\377\370\377\377\377\371"
"\377\377\377\372\377\377\377\372\377\377\377\365\377\377\377\367\377\377"
"\377\370\377\377\377\371\377\377\377\375\377\377\377\374\377\377\377\365"
"\377\377\377\356\377\377\377\344\377\377\377\334\377\377\377\332\377\377"
"\377\342\377\377\377\354\377\377\377\354\377\377\377\350\377\377\377\350"
"\377\377\377\354\377\377\377\354\377\377\377\357\377\377\377\361\377\377"
"\377\361\377\377\377\363\377\377\377\363\377\377\377\362\377\377\377\360"
"\377\377\377\355\377\377\377\355\377\377\377\360\377\377\377\363\377\377"
"\377\365\377\377\377\363\377\377\377\365\377\377\377\367\377\377\377\367"
"\377\377\377\372\377\377\377\370\377\377\377\365\377\377\377\366\377\377"
"\377\363\377\377\377\357\377\377\377\350\377\377\377\335\377\377\377\326"
"\377\377\377\332\377\377\377\333\377\377\377\332\377\377\377\336\377\377"
"\377\333\377\377\377\340\377\377\377\347\377\377\377\352\377\377\377\347"
"\377\377\377\346\377\377\377\347\377\377\377\346\377\377\377\340\377\377"
"\377\336\377\377\377\337\377\377\377\350\377\377\377\363\377\377\377\371"
"\377\377\377\367\377\377\377\365\377\377\377\364\377\377\377\363\377\377"
"\377\366\377\377\377\366\377\377\377\367\377\377\377\373\377\377\377\373"
"\377\377\377\365\377\377\377\362\377\377\377\346\377\377\377\325\377\377"
"\377\322\377\377\377\332\377\377\377\346\377\377\377\347\377\377\377\345"
"\377\377\377\346\377\377\377\346\377\377\377\347\377\377\377\352\377\377"
"\377\353\377\377\377\360\377\377\377\365\377\377\377\365\377\377\377\365"
"\377\377\377\362\377\377\377\360\377\377\377\357\377\377\377\353\377\377"
"\377\357\377\377\377\364\377\377\377\366\377\377\377\371\377\377\377\371"
"\377\377\377\370\377\377\377\372\377\377\377\371\377\377\377\362\377\377"
"\377\362\377\377\377\357\377\377\377\351\377\377\377\344\377\377\377\330"
"\377\377\377\316\377\377\377\322\377\377\377\327\377\377\377\327\377\377"
"\377\326\377\377\377\325\377\377\377\335\377\377\377\350\377\377\377\354"
"\377\377\377\352\377\377\377\350\377\377\377\344\377\377\377\343\377\377"
"\377\340\377\377\377\344\377\377\377\346\377\377\377\356\377\377\377\366"
"\377\377\377\371\377\377\377\365\377\377\377\362\377\377\377\362\377\377"
"\377\363\377\377\377\364\377\377\377\364\377\377\377\365\377\377\377\370"
"\377\377\377\371\377\377\377\363\377\377\377\362\377\377\377\353\377\377"
"\377\336\377\377\377\325\377\377\377\330\377\377\377\343\377\377\377\344"
"\377\377\377\343\377\377\377\343\377\377\377\341\377\377\377\347\377\377"
"\377\354\377\377\377\356\377\377\377\363\377\377\377\366\377\377\377\367"
"\377\377\377\371\377\377\377\365\377\377\377\361\377\377\377\363\377\377"
"\377\355\377\377\377\356\377\377\377\364\377\377\377\372\377\377\377\374"
"\377\377\377\374\377\377\377\374\377\377\377\373\377\377\377\370\377\377"
"\377\363\377\377\377\364\377\377\377\360\377\377\377\350\377\377\377\340"
"\377\377\377\317\377\377\377\306\377\377\377\322\377\377\377\327\377\377"
"\377\325\377\377\377\324\377\377\377\326\377\377\377\334\377\377\377\344"
"\377\377\377\351\377\377\377\353\377\377\377\354\377\377\377\352\377\377"
"\377\344\377\377\377\347\377\377\377\351\377\377\377\354\377\377\377\360"
"\377\377\377\370\377\377\377\372\377\377\377\366\377\377\377\363\377\377"
"\377\361\377\377\377\364\377\377\377\370\377\377\377\370\377\377\377\371"
"\377\377\377\370\377\377\377\364\377\377\377\361\377\377\377\362\377\377"
"\377\355\377\377\377\344\377\377\377\333\377\377\377\327\377\377\377\335"
"\377\377\377\341\377\377\377\342\377\377\377\342\377\377\377\343\377\377"
"\377\352\377\377\377\360\377\377\377\364\377\377\377\366\377\377\377\370"
"\377\377\377\372\377\377\377\372\377\377\377\365\377\377\377\365\377\377"
"\377\365\377\377\377\356\377\377\377\355\377\377\377\363\377\377\377\372"
"\377\377\377\374\377\377\377\375\377\377\377\377\377\377\377\375\377\377"
"\377\373\377\377\377\367\377\377\377\365\377\377\377\361\377\377\377\346"
"\377\377\377\327\377\377\377\310\377\377\377\302\377\377\377\316\377\377"
"\377\326\377\377\377\325\377\377\377\332\377\377\377\341\377\377\377\342"
"\377\377\377\344\377\377\377\351\377\377\377\354\377\377\377\361\377\377"
"\377\361\377\377\377\353\377\377\377\357\377\377\377\356\377\377\377\356"
"\377\377\377\356\377\377\377\365\377\377\377\367\377\377\377\364\377\377"
"\377\364\377\377\377\364\377\377\377\366\377\377\377\373\377\377\377\372"
"\377\377\377\372\377\377\377\372\377\377\377\364\377\377\377\357\377\377"
"\377\356\377\377\377\347\377\377\377\335\377\377\377\333\377\377\377\325"
"\377\377\377\333\377\377\377\344\377\377\377\351\377\377\377\350\377\377"
"\377\351\377\377\377\355\377\377\377\362\377\377\377\365\377\377\377\367"
"\377\377\377\372\377\377\377\372\377\377\377\367\377\377\377\361\377\377"
"\377\365\377\377\377\366\377\377\377\362\377\377\377\356\377\377\377\363"
"\377\377\377\372\377\377\377\371\377\377\377\372\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\376\377\377\377\371\377\377\377\364"
"\377\377\377\347\377\377\377\322\377\377\377\307\377\377\377\303\377\377"
"\377\312\377\377\377\331\377\377\377\333\377\377\377\340\377\377\377\345"
"\377\377\377\347\377\377\377\350\377\377\377\353\377\377\377\357\377\377"
"\377\363\377\377\377\365\377\377\377\361\377\377\377\366\377\377\377\364"
"\377\377\377\363\377\377\377\364\377\377\377\367\377\377\377\370\377\377"
"\377\365\377\377\377\365\377\377\377\365\377\377\377\367\377\377\377\374"
"\377\377\377\373\377\377\377\374\377\377\377\374\377\377\377\366\377\377"
"\377\355\377\377\377\350\377\377\377\337\377\377\377\327\377\377\377\324"
"\377\377\377\317\377\377\377\333\377\377\377\347\377\377\377\351\377\377"
"\377\351\377\377\377\356\377\377\377\364\377\377\377\366\377\377\377\370"
"\377\377\377\372\377\377\377\372\377\377\377\370\377\377\377\366\377\377"
"\377\364\377\377\377\365\377\377\377\367\377\377\377\366\377\377\377\361"
"\377\377\377\361\377\377\377\366\377\377\377\367\377\377\377\370\377\377"
"\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373"
"\377\377\377\362\377\377\377\350\377\377\377\333\377\377\377\317\377\377"
"\377\307\377\377\377\305\377\377\377\322\377\377\377\335\377\377\377\343"
"\377\377\377\351\377\377\377\354\377\377\377\354\377\377\377\356\377\377"
"\377\363\377\377\377\367\377\377\377\372\377\377\377\372\377\377\377\374"
"\377\377\377\371\377\377\377\370\377\377\377\371\377\377\377\371\377\377"
"\377\372\377\377\377\371\377\377\377\367\377\377\377\365\377\377\377\366"
"\377\377\377\372\377\377\377\373\377\377\377\376\377\377\377\376\377\377"
"\377\364\377\377\377\355\377\377\377\347\377\377\377\337\377\377\377\335"
"\377\377\377\331\377\377\377\324\377\377\377\334\377\377\377\343\377\377"
"\377\346\377\377\377\354\377\377\377\360\377\377\377\364\377\377\377\366"
"\377\377\377\370\377\377\377\373\377\377\377\370\377\377\377\364\377\377"
"\377\365\377\377\377\367\377\377\377\365\377\377\377\366\377\377\377\365"
"\377\377\377\362\377\377\377\361\377\377\377\360\377\377\377\361\377\377"
"\377\366\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\373"
"\377\377\377\364\377\377\377\353\377\377\377\350\377\377\377\342\377\377"
"\377\325\377\377\377\320\377\377\377\314\377\377\377\315\377\377\377\332"
"\377\377\377\342\377\377\377\352\377\377\377\362\377\377\377\363\377\377"
"\377\362\377\377\377\365\377\377\377\370\377\377\377\372\377\377\377\376"
"\377\377\377\372\377\377\377\372\377\377\377\367\377\377\377\371\377\377"
"\377\374\377\377\377\373\377\377\377\373\377\377\377\372\377\377\377\366"
"\377\377\377\367\377\377\377\370\377\377\377\367\377\377\377\373\377\377"
"\377\373\377\377\377\365\377\377\377\354\377\377\377\347\377\377\377\345"
"\377\377\377\343\377\377\377\336\377\377\377\336\377\377\377\342\377\377"
"\377\344\377\377\377\353\377\377\377\361\377\377\377\361\377\377\377\361"
"\377\377\377\364\377\377\377\366\377\377\377\366\377\377\377\364\377\377"
"\377\364\377\377\377\366\377\377\377\370\377\377\377\367\377\377\377\366"
"\377\377\377\365\377\377\377\365\377\377\377\365\377\377\377\362\377\377"
"\377\356\377\377\377\363\377\377\377\374\377\377\377\374\377\377\377\372"
"\377\377\377\364\377\377\377\353\377\377\377\347\377\377\377\354\377\377"
"\377\351\377\377\377\341\377\377\377\337\377\377\377\332\377\377\377\324"
"\377\377\377\327\377\377\377\340\377\377\377\351\377\377\377\363\377\377"
"\377\371\377\377\377\370\377\377\377\367\377\377\377\366\377\377\377\366"
"\377\377\377\371\377\377\377\372\377\377\377\374\377\377\377\367\377\377"
"\377\370\377\377\377\373\377\377\377\374\377\377\377\377\377\377\377\377"
"\377\377\377\374\377\377\377\373\377\377\377\367\377\377\377\363\377\377"
"\377\366\377\377\377\365\377\377\377\360\377\377\377\347\377\377\377\344"
"\377\377\377\350\377\377\377\344\377\377\377\336\377\377\377\340\377\377"
"\377\347\377\377\377\350\377\377\377\357\377\377\377\362\377\377\377\363"
"\377\377\377\365\377\377\377\362\377\377\377\361\377\377\377\361\377\377"
"\377\362\377\377\377\365\377\377\377\367\377\377\377\367\377\377\377\370"
"\377\377\377\367\377\377\377\370\377\377\377\367\377\377\377\365\377\377"
"\377\367\377\377\377\365\377\377\377\363\377\377\377\370\377\377\377\367"
"\377\377\377\365\377\377\377\361\377\377\377\351\377\377\377\347\377\377"
"\377\353\377\377\377\355\377\377\377\354\377\377\377\355\377\377\377\347"
"\377\377\377\343\377\377\377\344\377\377\377\350\377\377\377\355\377\377"
"\377\364\377\377\377\372\377\377\377\372\377\377\377\371\377\377\377\370"
"\377\377\377\370\377\377\377\367\377\377\377\372\377\377\377\370\377\377"
"\377\364\377\377\377\362\377\377\377\370\377\377\377\374\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\370\377\377\377\363\377\377"
"\377\363\377\377\377\366\377\377\377\363\377\377\377\353\377\377\377\345"
"\377\377\377\342\377\377\377\346\377\377\377\350\377\377\377\345\377\377"
"\377\344\377\377\377\350\377\377\377\352\377\377\377\361\377\377\377\364"
"\377\377\377\364\377\377\377\365\377\377\377\357\377\377\377\351\377\377"
"\377\355\377\377\377\364\377\377\377\367\377\377\377\366\377\377\377\367"
"\377\377\377\371\377\377\377\370\377\377\377\371\377\377\377\370\377\377"
"\377\366\377\377\377\371\377\377\377\372\377\377\377\365\377\377\377\365"
"\377\377\377\364\377\377\377\357\377\377\377\356\377\377\377\353\377\377"
"\377\347\377\377\377\352\377\377\377\360\377\377\377\364\377\377\377\365"
"\377\377\377\363\377\377\377\363\377\377\377\360\377\377\377\357\377\377"
"\377\362\377\377\377\371\377\377\377\374\377\377\377\374\377\377\377\374"
"\377\377\377\372\377\377\377\371\377\377\377\371\377\377\377\370\377\377"
"\377\361\377\377\377\356\377\377\377\354\377\377\377\365\377\377\377\372"
"\377\377\377\374\377\377\377\377\377\377\377\371\377\377\377\361\377\377"
"\377\361\377\377\377\361\377\377\377\362\377\377\377\364\377\377\377\363"
"\377\377\377\355\377\377\377\350\377\377\377\346\377\377\377\350\377\377"
"\377\355\377\377\377\355\377\377\377\355\377\377\377\356\377\377\377\361"
"\377\377\377\360\377\377\377\355\377\377\377\353\377\377\377\351\377\377"
"\377\345\377\377\377\347\377\377\377\357\377\377\377\365\377\377\377\367"
"\377\377\377\366\377\377\377\371\377\377\377\371\377\377\377\374\377\377"
"\377\376\377\377\377\373\377\377\377\373\377\377\377\373\377\377\377\371"
"\377\377\377\372\377\377\377\370\377\377\377\361\377\377\377\356\377\377"
"\377\353\377\377\377\353\377\377\377\361\377\377\377\365\377\377\377\370"
"\377\377\377\371\377\377\377\372\377\377\377\374\377\377\377\367\377\377"
"\377\363\377\377\377\365\377\377\377\373\377\377\377\373\377\377\377\375"
"\377\377\377\375\377\377\377\374\377\377\377\374\377\377\377\374\377\377"
"\377\370\377\377\377\355\377\377\377\347\377\377\377\352\377\377\377\363"
"\377\377\377\365\377\377\377\371\377\377\377\372\377\377\377\363\377\377"
"\377\355\377\377\377\357\377\377\377\361\377\377\377\362\377\377\377\370"
"\377\377\377\375\377\377\377\366\377\377\377\356\377\377\377\351\377\377"
"\377\347\377\377\377\356\377\377\377\361\377\377\377\356\377\377\377\355"
"\377\377\377\354\377\377\377\352\377\377\377\351\377\377\377\343\377\377"
"\377\342\377\377\377\342\377\377\377\345\377\377\377\354\377\377\377\364"
"\377\377\377\367\377\377\377\366\377\377\377\370\377\377\377\372\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375"
"\377\377\377\375\377\377\377\377\377\377\377\374\377\377\377\366\377\377"
"\377\360\377\377\377\355\377\377\377\360\377\377\377\365\377\377\377\367"
"\377\377\377\372\377\377\377\374\377\377\377\375\377\377\377\375\377\377"
"\377\374\377\377\377\372\377\377\377\371\377\377\377\371\377\377\377\373"
"\377\377\377\375\377\377\377\374\377\377\377\375\377\377\377\377\377\377"
"\377\377\377\377\377\366\377\377\377\353\377\377\377\346\377\377\377\351"
"\377\377\377\357\377\377\377\361\377\377\377\367\377\377\377\370\377\377"
"\377\363\377\377\377\356\377\377\377\357\377\377\377\365\377\377\377\367"
"\377\377\377\374\377\377\377\377\377\377\377\374\377\377\377\366\377\377"
"\377\361\377\377\377\356\377\377\377\361\377\377\377\360\377\377\377\352"
"\377\377\377\353\377\377\377\352\377\377\377\352\377\377\377\354\377\377"
"\377\343\377\377\377\337\377\377\377\337\377\377\377\346\377\377\377\356"
"\377\377\377\364\377\377\377\366\377\377\377\367\377\377\377\371\377\377"
"\377\372\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377"
"\377\366\377\377\377\363\377\377\377\364\377\377\377\365\377\377\377\366"
"\377\377\377\370\377\377\377\375\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377\366"
"\377\377\377\371\377\377\377\375\377\377\377\374\377\377\377\373\377\377"
"\377\375\377\377\377\375\377\377\377\361\377\377\377\345\377\377\377\343"
"\377\377\377\350\377\377\377\355\377\377\377\357\377\377\377\363\377\377"
"\377\366\377\377\377\366\377\377\377\363\377\377\377\364\377\377\377\366"
"\377\377\377\370\377\377\377\374\377\377\377\377\377\377\377\377\377\377"
"\377\375\377\377\377\370\377\377\377\365\377\377\377\365\377\377\377\360"
"\377\377\377\354\377\377\377\356\377\377\377\356\377\377\377\354\377\377"
"\377\354\377\377\377\347\377\377\377\340\377\377\377\337\377\377\377\347"
"\377\377\377\354\377\377\377\361\377\377\377\362\377\377\377\361\377\377"
"\377\365\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\370\377\377\377\367\377\377\377\367\377\377\377\366"
"\377\377\377\371\377\377\377\374\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374"
"\377\377\377\367\377\377\377\365\377\377\377\371\377\377\377\373\377\377"
"\377\372\377\377\377\372\377\377\377\370\377\377\377\356\377\377\377\340"
"\377\377\377\340\377\377\377\344\377\377\377\350\377\377\377\355\377\377"
"\377\360\377\377\377\361\377\377\377\363\377\377\377\364\377\377\377\365"
"\377\377\377\370\377\377\377\372\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\375\377\377\377\370\377\377\377\367\377\377\377\366"
"\377\377\377\361\377\377\377\354\377\377\377\354\377\377\377\356\377\377"
"\377\353\377\377\377\347\377\377\377\346\377\377\377\342\377\377\377\345"
"\377\377\377\352\377\377\377\351\377\377\377\354\377\377\377\355\377\377"
"\377\354\377\377\377\364\377\377\377\374\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\374\377\377\377\374\377\377\377\367"
"\377\377\377\365\377\377\377\371\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\375\377\377\377\372\377\377\377\366\377\377\377\365\377\377"
"\377\366\377\377\377\370\377\377\377\367\377\377\377\365\377\377\377\356"
"\377\377\377\340\377\377\377\335\377\377\377\340\377\377\377\340\377\377"
"\377\346\377\377\377\352\377\377\377\350\377\377\377\354\377\377\377\361"
"\377\377\377\364\377\377\377\372\377\377\377\375\377\377\377\376\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\374\377\377\377\372"
"\377\377\377\372\377\377\377\363\377\377\377\353\377\377\377\354\377\377"
"\377\357\377\377\377\352\377\377\377\346\377\377\377\346\377\377\377\345"
"\377\377\377\346\377\377\377\347\377\377\377\351\377\377\377\351\377\377"
"\377\347\377\377\377\351\377\377\377\363\377\377\377\372\377\377\377\374"
"\377\377\377\372\377\377\377\372\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\373\377\377\377\370\377\377\377\371\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\375\377\377\377\372\377\377\377\370\377\377\377\366\377\377"
"\377\363\377\377\377\364\377\377\377\366\377\377\377\367\377\377\377\364"
"\377\377\377\355\377\377\377\341\377\377\377\334\377\377\377\335\377\377"
"\377\333\377\377\377\336\377\377\377\337\377\377\377\335\377\377\377\346"
"\377\377\377\360\377\377\377\366\377\377\377\373\377\377\377\374\377\377"
"\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\364\377\377\377\353\377\377"
"\377\355\377\377\377\360\377\377\377\351\377\377\377\347\377\377\377\350"
"\377\377\377\351\377\377\377\350\377\377\377\344\377\377\377\347\377\377"
"\377\352\377\377\377\350\377\377\377\350\377\377\377\354\377\377\377\360"
"\377\377\377\361\377\377\377\356\377\377\377\364\377\377\377\374\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\375\377\377\377\375\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\374\377\377\377\372\377\377\377\371\377\377\377\366\377\377"
"\377\362\377\377\377\363\377\377\377\365\377\377\377\370\377\377\377\370"
"\377\377\377\363\377\377\377\354\377\377\377\343\377\377\377\335\377\377"
"\377\332\377\377\377\330\377\377\377\327\377\377\377\327\377\377\377\332"
"\377\377\377\344\377\377\377\355\377\377\377\367\377\377\377\373\377\377"
"\377\371\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\371\377\377\377\360\377\377"
"\377\350\377\377\377\347\377\377\377\353\377\377\377\347\377\377\377\345"
"\377\377\377\352\377\377\377\356\377\377\377\357\377\377\377\353\377\377"
"\377\350\377\377\377\353\377\377\377\353\377\377\377\346\377\377\377\345"
"\377\377\377\350\377\377\377\352\377\377\377\351\377\377\377\357\377\377"
"\377\364\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\374"
"\377\377\377\374\377\377\377\373\377\377\377\371\377\377\377\365\377\377"
"\377\361\377\377\377\355\377\377\377\362\377\377\377\365\377\377\377\366"
"\377\377\377\367\377\377\377\364\377\377\377\354\377\377\377\343\377\377"
"\377\332\377\377\377\325\377\377\377\326\377\377\377\325\377\377\377\325"
"\377\377\377\333\377\377\377\342\377\377\377\350\377\377\377\366\377\377"
"\377\374\377\377\377\372\377\377\377\372\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\372\377\377\377\366\377\377\377\357\377\377"
"\377\354\377\377\377\352\377\377\377\350\377\377\377\352\377\377\377\350"
"\377\377\377\350\377\377\377\361\377\377\377\365\377\377\377\364\377\377"
"\377\364\377\377\377\355\377\377\377\352\377\377\377\350\377\377\377\345"
"\377\377\377\344\377\377\377\344\377\377\377\345\377\377\377\346\377\377"
"\377\350\377\377\377\354\377\377\377\370\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\375\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377\375"
"\377\377\377\372\377\377\377\371\377\377\377\370\377\377\377\367\377\377"
"\377\363\377\377\377\356\377\377\377\354\377\377\377\360\377\377\377\357"
"\377\377\377\357\377\377\377\362\377\377\377\363\377\377\377\344\377\377"
"\377\333\377\377\377\330\377\377\377\330\377\377\377\325\377\377\377\327"
"\377\377\377\335\377\377\377\337\377\377\377\346\377\377\377\356\377\377"
"\377\366\377\377\377\374\377\377\377\372\377\377\377\367\377\377\377\372"
"\377\377\377\375\377\377\377\372\377\377\377\363\377\377\377\352\377\377"
"\377\350\377\377\377\353\377\377\377\353\377\377\377\352\377\377\377\354"
"\377\377\377\354\377\377\377\360\377\377\377\370\377\377\377\372\377\377"
"\377\372\377\377\377\367\377\377\377\360\377\377\377\355\377\377\377\347"
"\377\377\377\342\377\377\377\341\377\377\377\340\377\377\377\340\377\377"
"\377\335\377\377\377\336\377\377\377\344\377\377\377\361\377\377\377\374"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\377\377"
"\377\372\377\377\377\372\377\377\377\372\377\377\377\374\377\377\377\377"
"\377\377\377\374\377\377\377\366\377\377\377\365\377\377\377\366\377\377"
"\377\367\377\377\377\363\377\377\377\356\377\377\377\355\377\377\377\352"
"\377\377\377\347\377\377\377\351\377\377\377\352\377\377\377\352\377\377"
"\377\341\377\377\377\325\377\377\377\325\377\377\377\333\377\377\377\327"
"\377\377\377\325\377\377\377\335\377\377\377\345\377\377\377\360\377\377"
"\377\370\377\377\377\374\377\377\377\375\377\377\377\370\377\377\377\364"
"\377\377\377\366\377\377\377\365\377\377\377\363\377\377\377\360\377\377"
"\377\346\377\377\377\345\377\377\377\347\377\377\377\352\377\377\377\354"
"\377\377\377\355\377\377\377\357\377\377\377\365\377\377\377\373\377\377"
"\377\373\377\377\377\375\377\377\377\370\377\377\377\362\377\377\377\362"
"\377\377\377\354\377\377\377\342\377\377\377\340\377\377\377\332\377\377"
"\377\325\377\377\377\325\377\377\377\330\377\377\377\337\377\377\377\352"
"\377\377\377\365\377\377\377\375\377\377\377\377\377\377\377\376\377\377"
"\377\372\377\377\377\367\377\377\377\367\377\377\377\365\377\377\377\366"
"\377\377\377\370\377\377\377\370\377\377\377\362\377\377\377\360\377\377"
"\377\362\377\377\377\363\377\377\377\355\377\377\377\347\377\377\377\347"
"\377\377\377\344\377\377\377\347\377\377\377\352\377\377\377\350\377\377"
"\377\346\377\377\377\343\377\377\377\332\377\377\377\323\377\377\377\325"
"\377\377\377\327\377\377\377\332\377\377\377\340\377\377\377\354\377\377"
"\377\371\377\377\377\375\377\377\377\377\377\377\377\376\377\377\377\370"
"\377\377\377\364\377\377\377\363\377\377\377\360\377\377\377\356\377\377"
"\377\352\377\377\377\345\377\377\377\350\377\377\377\350\377\377\377\354"
"\377\377\377\357\377\377\377\360\377\377\377\360\377\377\377\366\377\377"
"\377\374\377\377\377\376\377\377\377\377\377\377\377\370\377\377\377\365"
"\377\377\377\365\377\377\377\362\377\377\377\355\377\377\377\343\377\377"
"\377\321\377\377\377\307\377\377\377\314\377\377\377\325\377\377\377\332"
"\377\377\377\343\377\377\377\356\377\377\377\370\377\377\377\375\377\377"
"\377\375\377\377\377\371\377\377\377\364\377\377\377\362\377\377\377\360"
"\377\377\377\362\377\377\377\363\377\377\377\362\377\377\377\357\377\377"
"\377\354\377\377\377\351\377\377\377\352\377\377\377\347\377\377\377\340"
"\377\377\377\337\377\377\377\343\377\377\377\350\377\377\377\345\377\377"
"\377\343\377\377\377\344\377\377\377\337\377\377\377\337\377\377\377\333"
"\377\377\377\327\377\377\377\333\377\377\377\344\377\377\377\350\377\377"
"\377\361\377\377\377\372\377\377\377\374\377\377\377\377\377\377\377\377"
"\377\377\377\371\377\377\377\365\377\377\377\361\377\377\377\353\377\377"
"\377\353\377\377\377\347\377\377\377\347\377\377\377\355\377\377\377\353"
"\377\377\377\353\377\377\377\354\377\377\377\355\377\377\377\357\377\377"
"\377\365\377\377\377\372\377\377\377\376\377\377\377\376\377\377\377\370"
"\377\377\377\370\377\377\377\367\377\377\377\367\377\377\377\365\377\377"
"\377\346\377\377\377\321\377\377\377\312\377\377\377\311\377\377\377\312"
"\377\377\377\325\377\377\377\340\377\377\377\353\377\377\377\366\377\377"
"\377\371\377\377\377\370\377\377\377\366\377\377\377\363\377\377\377\363"
"\377\377\377\362\377\377\377\362\377\377\377\355\377\377\377\350\377\377"
"\377\347\377\377\377\350\377\377\377\345\377\377\377\341\377\377\377\334"
"\377\377\377\333\377\377\377\333\377\377\377\336\377\377\377\337\377\377"
"\377\332\377\377\377\337\377\377\377\340\377\377\377\336\377\377\377\343"
"\377\377\377\347\377\377\377\341\377\377\377\340\377\377\377\350\377\377"
"\377\355\377\377\377\366\377\377\377\372\377\377\377\375\377\377\377\377"
"\377\377\377\377\377\377\377\372\377\377\377\367\377\377\377\361\377\377"
"\377\355\377\377\377\354\377\377\377\350\377\377\377\350\377\377\377\355"
"\377\377\377\353\377\377\377\351\377\377\377\351\377\377\377\351\377\377"
"\377\356\377\377\377\362\377\377\377\371\377\377\377\376\377\377\377\375"
"\377\377\377\367\377\377\377\370\377\377\377\371\377\377\377\372\377\377"
"\377\367\377\377\377\353\377\377\377\334\377\377\377\325\377\377\377\317"
"\377\377\377\314\377\377\377\325\377\377\377\337\377\377\377\352\377\377"
"\377\363\377\377\377\367\377\377\377\365\377\377\377\365\377\377\377\366"
"\377\377\377\365\377\377\377\362\377\377\377\356\377\377\377\351\377\377"
"\377\344\377\377\377\343\377\377\377\346\377\377\377\346\377\377\377\334"
"\377\377\377\325\377\377\377\331\377\377\377\332\377\377\377\332\377\377"
"\377\330\377\377\377\322\377\377\377\330\377\377\377\335\377\377\377\336"
"\377\377\377\341\377\377\377\347\377\377\377\346\377\377\377\351\377\377"
"\377\357\377\377\377\365\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\371\377\377\377\366\377\377"
"\377\357\377\377\377\355\377\377\377\353\377\377\377\351\377\377\377\353"
"\377\377\377\355\377\377\377\353\377\377\377\351\377\377\377\353\377\377"
"\377\352\377\377\377\360\377\377\377\363\377\377\377\370\377\377\377\377"
"\377\377\377\374\377\377\377\366\377\377\377\367\377\377\377\370\377\377"
"\377\371\377\377\377\370\377\377\377\363\377\377\377\351\377\377\377\341"
"\377\377\377\332\377\377\377\324\377\377\377\330\377\377\377\337\377\377"
"\377\353\377\377\377\363\377\377\377\367\377\377\377\364\377\377\377\361"
"\377\377\377\361\377\377\377\361\377\377\377\356\377\377\377\350\377\377"
"\377\346\377\377\377\346\377\377\377\347\377\377\377\347\377\377\377\347"
"\377\377\377\340\377\377\377\337\377\377\377\342\377\377\377\337\377\377"
"\377\337\377\377\377\334\377\377\377\324\377\377\377\327\377\377\377\337"
"\377\377\377\344\377\377\377\344\377\377\377\350\377\377\377\353\377\377"
"\377\357\377\377\377\364\377\377\377\372\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373\377\377"
"\377\370\377\377\377\362\377\377\377\356\377\377\377\352\377\377\377\353"
"\377\377\377\357\377\377\377\361\377\377\377\361\377\377\377\355\377\377"
"\377\360\377\377\377\362\377\377\377\367\377\377\377\371\377\377\377\371"
"\377\377\377\371\377\377\377\370\377\377\377\366\377\377\377\370\377\377"
"\377\370\377\377\377\370\377\377\377\371\377\377\377\371\377\377\377\362"
"\377\377\377\354\377\377\377\343\377\377\377\327\377\377\377\331\377\377"
"\377\337\377\377\377\354\377\377\377\364\377\377\377\365\377\377\377\362"
"\377\377\377\360\377\377\377\354\377\377\377\356\377\377\377\355\377\377"
"\377\350\377\377\377\344\377\377\377\350\377\377\377\353\377\377\377\350"
"\377\377\377\350\377\377\377\351\377\377\377\347\377\377\377\347\377\377"
"\377\345\377\377\377\340\377\377\377\337\377\377\377\334\377\377\377\334"
"\377\377\377\342\377\377\377\352\377\377\377\353\377\377\377\361\377\377"
"\377\364\377\377\377\364\377\377\377\370\377\377\377\372\377\377\377\376"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\375\377\377\377\370\377\377\377\364\377\377\377\360\377\377\377\356"
"\377\377\377\356\377\377\377\361\377\377\377\365\377\377\377\370\377\377"
"\377\364\377\377\377\370\377\377\377\371\377\377\377\373\377\377\377\377"
"\377\377\377\373\377\377\377\365\377\377\377\365\377\377\377\365\377\377"
"\377\365\377\377\377\370\377\377\377\374\377\377\377\373\377\377\377\371"
"\377\377\377\364\377\377\377\356\377\377\377\352\377\377\377\343\377\377"
"\377\337\377\377\377\337\377\377\377\347\377\377\377\353\377\377\377\356"
"\377\377\377\360\377\377\377\362\377\377\377\361\377\377\377\356\377\377"
"\377\354\377\377\377\352\377\377\377\352\377\377\377\353\377\377\377\355"
"\377\377\377\352\377\377\377\357\377\377\377\362\377\377\377\355\377\377"
"\377\352\377\377\377\351\377\377\377\344\377\377\377\346\377\377\377\347"
"\377\377\377\345\377\377\377\350\377\377\377\361\377\377\377\360\377\377"
"\377\365\377\377\377\370\377\377\377\371\377\377\377\373\377\377\377\372"
"\377\377\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\373\377\377\377\370\377\377\377\365\377\377\377\364"
"\377\377\377\363\377\377\377\362\377\377\377\363\377\377\377\370\377\377"
"\377\374\377\377\377\375\377\377\377\377\377\377\377\375\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\370\377\377\377\370\377\377"
"\377\366\377\377\377\363\377\377\377\370\377\377\377\375\377\377\377\372"
"\377\377\377\365\377\377\377\361\377\377\377\352\377\377\377\352\377\377"
"\377\350\377\377\377\340\377\377\377\336\377\377\377\342\377\377\377\343"
"\377\377\377\353\377\377\377\360\377\377\377\362\377\377\377\364\377\377"
"\377\364\377\377\377\361\377\377\377\356\377\377\377\357\377\377\377\361"
"\377\377\377\356\377\377\377\354\377\377\377\364\377\377\377\370\377\377"
"\377\362\377\377\377\357\377\377\377\356\377\377\377\353\377\377\377\354"
"\377\377\377\356\377\377\377\362\377\377\377\363\377\377\377\366\377\377"
"\377\362\377\377\377\367\377\377\377\367\377\377\377\367\377\377\377\371"
"\377\377\377\367\377\377\377\371\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\376\377\377\377\372\377\377\377\370\377\377\377\371"
"\377\377\377\370\377\377\377\366\377\377\377\367\377\377\377\370\377\377"
"\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\377\377"
"\377\371\377\377\377\367\377\377\377\363\377\377\377\363\377\377\377\366"
"\377\377\377\363\377\377\377\361\377\377\377\356\377\377\377\346\377\377"
"\377\345\377\377\377\344\377\377\377\334\377\377\377\334\377\377\377\342"
"\377\377\377\347\377\377\377\361\377\377\377\365\377\377\377\366\377\377"
"\377\373\377\377\377\373\377\377\377\366\377\377\377\361\377\377\377\364"
"\377\377\377\370\377\377\377\364\377\377\377\357\377\377\377\365\377\377"
"\377\372\377\377\377\365\377\377\377\361\377\377\377\362\377\377\377\363"
"\377\377\377\364\377\377\377\362\377\377\377\365\377\377\377\370\377\377"
"\377\374\377\377\377\371\377\377\377\374\377\377\377\375\377\377\377\372"
"\377\377\377\371\377\377\377\373\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\376\377\377\377\372\377\377\377\371"
"\377\377\377\374\377\377\377\372\377\377\377\367\377\377\377\371\377\377"
"\377\375\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\375\377\377\377\370\377\377\377\364\377\377\377\361"
"\377\377\377\356\377\377\377\355\377\377\377\355\377\377\377\350\377\377"
"\377\342\377\377\377\342\377\377\377\337\377\377\377\331\377\377\377\331"
"\377\377\377\342\377\377\377\353\377\377\377\365\377\377\377\371\377\377"
"\377\374\377\377\377\377\377\377\377\373\377\377\377\365\377\377\377\364"
"\377\377\377\370\377\377\377\372\377\377\377\373\377\377\377\370\377\377"
"\377\370\377\377\377\372\377\377\377\371\377\377\377\371\377\377\377\371"
"\377\377\377\374\377\377\377\377\377\377\377\372\377\377\377\370\377\377"
"\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374"
"\377\377\377\371\377\377\377\372\377\377\377\373\377\377\377\370\377\377"
"\377\370\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377\365"
"\377\377\377\365\377\377\377\361\377\377\377\354\377\377\377\350\377\377"
"\377\342\377\377\377\337\377\377\377\343\377\377\377\335\377\377\377\330"
"\377\377\377\330\377\377\377\340\377\377\377\353\377\377\377\365\377\377"
"\377\373\377\377\377\373\377\377\377\373\377\377\377\372\377\377\377\370"
"\377\377\377\371\377\377\377\374\377\377\377\374\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\376\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\373\377\377\377\371\377\377\377\366\377\377"
"\377\366\377\377\377\365\377\377\377\367\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\373"
"\377\377\377\371\377\377\377\370\377\377\377\365\377\377\377\355\377\377"
"\377\347\377\377\377\347\377\377\377\347\377\377\377\350\377\377\377\346"
"\377\377\377\341\377\377\377\336\377\377\377\345\377\377\377\357\377\377"
"\377\367\377\377\377\371\377\377\377\371\377\377\377\371\377\377\377\370"
"\377\377\377\372\377\377\377\375\377\377\377\376\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\374\377\377\377\371\377\377"
"\377\362\377\377\377\362\377\377\377\361\377\377\377\365\377\377\377\376"
"\377\377\377\377\377\377\377\375\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\376\377\377\377\374\377\377\377\374\377\377\377\370\377\377"
"\377\364\377\377\377\361\377\377\377\362\377\377\377\361\377\377\377\356"
"\377\377\377\355\377\377\377\352\377\377\377\346\377\377\377\350\377\377"
"\377\360\377\377\377\366\377\377\377\367\377\377\377\366\377\377\377\370"
"\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377"
"\377\367\377\377\377\362\377\377\377\361\377\377\377\361\377\377\377\361"
"\377\377\377\366\377\377\377\371\377\377\377\373\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\375\377\377"
"\377\374\377\377\377\374\377\377\377\373\377\377\377\373\377\377\377\372"
"\377\377\377\367\377\377\377\363\377\377\377\362\377\377\377\362\377\377"
"\377\363\377\377\377\364\377\377\377\367\377\377\377\371\377\377\377\367"
"\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\372\377\377\377\372\377\377\377\365\377\377\377\360\377\377\377\362"
"\377\377\377\361\377\377\377\361\377\377\377\366\377\377\377\370\377\377"
"\377\372\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\376\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\372\377\377\377\367\377\377"
"\377\370\377\377\377\372\377\377\377\373\377\377\377\372\377\377\377\372"
"\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\372\377\377\377\363"
"\377\377\377\362\377\377\377\363\377\377\377\364\377\377\377\367\377\377"
"\377\363\377\377\377\361\377\377\377\372\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\374\377\377"
"\377\372\377\377\377\372\377\377\377\375\377\377\377\377\377\377\377\375"
"\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\376"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\371\377\377\377\364\377\377\377\367\377\377\377\366\377\377"
"\377\362\377\377\377\360\377\377\377\361\377\377\377\367\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\375\377\377\377\375\377\377\377\376\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\374\377\377\377\374\377\377\377\374\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\376"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\375\377\377\377\372\377\377\377\372\377\377"
"\377\364\377\377\377\355\377\377\377\355\377\377\377\363\377\377\377\372"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377"
"\377\374\377\377\377\374\377\377\377\373\377\377\377\372\377\377\377\374"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\375\377\377\377\375\377\377\377\376\377\377\377\376"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377"
"\377\367\377\377\377\363\377\377\377\361\377\377\377\360\377\377\377\365"
"\377\377\377\372\377\377\377\377\377\377\377\377\377\377\377\376\377\377"
"\377\371\377\377\377\366\377\377\377\367\377\377\377\364\377\377\377\364"
"\377\377\377\371\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\375\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\373\377\377\377\361\377\377\377\361\377\377\377\365\377\377\377\366"
"\377\377\377\370\377\377\377\372\377\377\377\373\377\377\377\375\377\377"
"\377\374\377\377\377\372\377\377\377\370\377\377\377\366\377\377\377\364"
"\377\377\377\364\377\377\377\366\377\377\377\375\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\377\377"
"\377\370\377\377\377\376\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\371\377\377\377\364\377\377\377\362\377\377\377\366"
"\377\377\377\370\377\377\377\370\377\377\377\370\377\377\377\371\377\377"
"\377\372\377\377\377\371\377\377\377\371\377\377\377\366\377\377\377\364"
"\377\377\377\364\377\377\377\366\377\377\377\370\377\377\377\373\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\375\377\377\377\373\377\377"
"\377\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\376\377\377\377\374\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\377\377"
"\377\372\377\377\377\373\377\377\377\377\377\377\377\377\377\377\377\376"
"\377\377\377\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\373\377\377\377\367\377\377\377\366\377\377\377\370"
"\377\377\377\373\377\377\377\372\377\377\377\365\377\377\377\364\377\377"
"\377\364\377\377\377\370\377\377\377\371\377\377\377\371\377\377\377\370"
"\377\377\377\366\377\377\377\363\377\377\377\366\377\377\377\373\377\377"
"\377\375\377\377\377\375\377\377\377\376\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\367\377\377\377\361\377\377"
"\377\362\377\377\377\366\377\377\377\366\377\377\377\372\377\377\377\376"
"\377\377\377\375\377\377\377\374\377\377\377\375\377\377\377\375\377\377"
"\377\374\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\372\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\374\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\375\377\377\377\372\377\377\377\366\377\377\377\367"
"\377\377\377\371\377\377\377\373\377\377\377\374\377\377\377\371\377\377"
"\377\364\377\377\377\361\377\377\377\362\377\377\377\361\377\377\377\363"
"\377\377\377\367\377\377\377\370\377\377\377\365\377\377\377\365\377\377"
"\377\372\377\377\377\376\377\377\377\375\377\377\377\374\377\377\377\374"
"\377\377\377\375\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\370\377\377\377\356\377\377"
"\377\353\377\377\377\351\377\377\377\347\377\377\377\351\377\377\377\362"
"\377\377\377\372\377\377\377\370\377\377\377\364\377\377\377\370\377\377"
"\377\375\377\377\377\372\377\377\377\372\377\377\377\376\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\376\377\377\377\375\377\377"
"\377\372\377\377\377\370\377\377\377\370\377\377\377\372\377\377\377\370"
"\377\377\377\365\377\377\377\366\377\377\377\370\377\377\377\374\377\377"
"\377\374\377\377\377\371\377\377\377\363\377\377\377\356\377\377\377\351"
"\377\377\377\354\377\377\377\360\377\377\377\362\377\377\377\363\377\377"
"\377\364\377\377\377\371\377\377\377\374\377\377\377\374\377\377\377\373"
"\377\377\377\372\377\377\377\371\377\377\377\376\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\364\377\377"
"\377\353\377\377\377\347\377\377\377\343\377\377\377\335\377\377\377\336"
"\377\377\377\351\377\377\377\361\377\377\377\361\377\377\377\361\377\377"
"\377\363\377\377\377\370\377\377\377\370\377\377\377\366\377\377\377\367"
"\377\377\377\374",
};
+206
View File
@@ -0,0 +1,206 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file vrml_aux.cpp
*/
#include "vrml_aux.h"
char SkipGetChar ( FILE* File )
{
char c;
bool re_parse;
if( (c = fgetc( File )) == EOF )
{
//DBG( printf( "EOF\n" ) );
return EOF;
}
//DBG( printf( "c %c 0x%02X\n", c, c ) );
do
{
re_parse = false;
if ((c == ' ') || (c == '\t') || (c == '{') || (c == '['))
{
//DBG( printf( "Skipping space \\t or { or [\n" ) );
do
{
if( (c = fgetc( File )) == EOF )
{
//DBG( printf( "EOF\n" ) );
return EOF;
}
}
while((c == ' ') || (c == '\t') || (c == '{') || (c == '['));
}
if ((c == '#') || (c == '\n') || (c == '\r') || (c == 0) || (c == ','))
{
if (c == '#')
{
//DBG( printf( "Skipping # \\n or \\r or 0, 0x%02X\n", c ) );
do
{
if( (c = fgetc( File )) == EOF )
{
//DBG( printf( "EOF\n" ) );
return EOF;
}
}
while((c != '\n') && (c != '\r') && (c != 0) && (c != ','));
}
else
{
if( (c = fgetc( File )) == EOF )
{
//DBG( printf( "EOF\n" ) );
return EOF;
}
}
re_parse = true;
}
}while(re_parse == true);
return c;
}
char* GetNextTag( FILE* File, char* tag )
{
char c = SkipGetChar( File );
if (c == EOF)
{
return NULL;
}
tag[0] = c;
tag[1] = 0;
//DBG( printf( "tag[0] %c\n", tag[0] ) );
if( (c != '}') && (c != ']') )
{
char *dst = &tag[1];
while (fscanf( File, "%c", dst))
{
if( (*dst == ' ') || (*dst == '[') || (*dst == '{') || (*dst == '\t') || (*dst == '\n')|| (*dst == '\r') )
{
*dst = 0;
break;
}
dst++;
}
//DBG( printf( "tag %s\n", tag ) );
c = SkipGetChar( File );
if (c != EOF)
{
// Puts again the read char in the buffer
ungetc( c, File );
}
}
return tag;
}
int read_NotImplemented( FILE* File, char closeChar)
{
char c;
//DBG( printf( "look for %c\n", closeChar) );
while( (c = fgetc( File )) != EOF )
{
if( c == '{' )
{
//DBG( printf( "{\n") );
read_NotImplemented( File, '}' );
} else if( c == '[' )
{
//DBG( printf( "[\n") );
read_NotImplemented( File, ']' );
} else if( c == closeChar )
{
//DBG( printf( "%c\n", closeChar) );
return 0;
}
}
DBG( printf( " NotImplemented failed\n" ) );
return -1;
}
int parseVertexList( FILE* File, std::vector< glm::vec3 > &dst_vector)
{
//DBG( printf( " parseVertexList\n" ) );
dst_vector.clear();
glm::vec3 vertex;
while( parseVertex ( File, vertex ) == 3 )
{
dst_vector.push_back( vertex );
}
return 0;
}
int parseVertex( FILE* File, glm::vec3 &dst_vertex )
{
float a,b,c;
int ret = fscanf( File, "%e %e %e", &a, &b, &c );
dst_vertex.x = a;
dst_vertex.y = b;
dst_vertex.z = c;
char s = SkipGetChar( File );
if (s != EOF)
{
// Puts again the read char in the buffer
ungetc( s, File );
}
//DBG( printf( "ret%d(%.9f,%.9f,%.9f)", ret, a,b,c) );
return ret;
}
int parseFloat( FILE* File, float *dst_float )
{
float value;
int ret = fscanf( File, "%e", &value );
*dst_float = value;
return ret;
}
+58
View File
@@ -0,0 +1,58 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file vrml_aux.h
*/
#ifndef _VRML_AUX_H
#define _VRML_AUX_H
#include <fctsys.h>
#include <common.h>
#include <macros.h>
#include <base_struct.h>
#include <gal/opengl/glm/glm.hpp>
#include <vector>
#include <kicad_string.h>
#include <info3d_visu.h>
#ifdef __WXMAC__
# ifdef __DARWIN__
# include <OpenGL/glu.h>
# else
# include <glu.h>
# endif
#else
# include <GL/glu.h>
#endif
#include <wx/glcanvas.h>
int read_NotImplemented( FILE* File, char closeChar);
char SkipGetChar ( FILE* File );
int parseVertexList( FILE* File, std::vector< glm::vec3 > &dst_vector);
int parseVertex( FILE* File, glm::vec3 &dst_vertex );
int parseFloat( FILE* File, float *dst_float );
char* GetNextTag( FILE* File, char* tag );
#endif
+444
View File
@@ -0,0 +1,444 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file vrml_v1_modelparser.cpp
*/
#include <fctsys.h>
#include <vector>
#include <macros.h>
#include <kicad_string.h>
#include <info3d_visu.h>
#include "3d_struct.h"
#include "modelparsers.h"
#include "vrml_aux.h"
VRML1_MODEL_PARSER::VRML1_MODEL_PARSER( S3D_MASTER* aMaster ) :
S3D_MODEL_PARSER( aMaster )
{
m_model = NULL;
m_file = NULL;
}
VRML1_MODEL_PARSER::~VRML1_MODEL_PARSER()
{
for( unsigned int idx = 0; idx < childs.size(); idx++ )
{
delete childs[idx];
}
}
void VRML1_MODEL_PARSER::Load( const wxString aFilename )
{
char text[128];
//DBG( printf( "Load %s\n", static_cast<const char*>(aFilename.mb_str()) ) );
m_file = wxFopen( aFilename, wxT( "rt" ) );
if( m_file == NULL )
{
return;
}
glShadeModel( GL_SMOOTH );
glEnable( GL_NORMALIZE );
float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
glScalef( vrmlunits_to_3Dunits, vrmlunits_to_3Dunits, vrmlunits_to_3Dunits );
glm::vec3 matScale( GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y, GetMaster()->m_MatScale.z );
glm::vec3 matRot( GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y, GetMaster()->m_MatRotation.z );
glm::vec3 matPos( GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y, GetMaster()->m_MatPosition.z );
#define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
//glPushMatrix();
glTranslatef( matPos.x * SCALE_3D_CONV, matPos.y * SCALE_3D_CONV, matPos.z * SCALE_3D_CONV );
glRotatef(-matRot.z, 0.0f, 0.0f, 1.0f );
glRotatef(-matRot.y, 0.0f, 1.0f, 0.0f );
glRotatef(-matRot.x, 1.0f, 0.0f, 0.0f );
glScalef( matScale.x, matScale.y, matScale.z );
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
SetLocaleTo_C_standard();
childs.clear();
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == '}' ) || ( *text == ']' ) )
{
continue;
}
if( strcmp( text, "Separator" ) == 0 )
{
m_model = new S3D_MESH();
childs.push_back( m_model );
read_separator();
}
}
fclose( m_file );
SetLocaleTo_Default(); // revert to the current locale
//DBG( printf( "chils size:%lu\n", childs.size() ) );
if( GetMaster()->IsOpenGlAllowed() )
{
for( unsigned int idx = 0; idx < childs.size(); idx++ )
{
childs[idx]->openGL_RenderAllChilds();
}
}
}
int VRML1_MODEL_PARSER::read_separator()
{
char text[128];
//DBG( printf( "Separator\n" ) );
while( GetNextTag( m_file, text) )
{
if( strcmp( text, "Material" ) == 0 )
{
readMaterial( );
} else if( strcmp( text, "Coordinate3" ) == 0 )
{
readCoordinate3();
} else if( strcmp( text, "IndexedFaceSet" ) == 0 )
{
readIndexedFaceSet();
} else if( strcmp( text, "Separator" ) == 0 )
{
S3D_MESH *parent = m_model;
S3D_MESH *new_mesh_model = new S3D_MESH();
m_model->childs.push_back( new_mesh_model );
m_model = new_mesh_model;
// recursive
read_separator();
m_model = parent;
}else if ( ( *text != '}' ) )
{
//DBG( printf( "read_NotImplemented %s\n", text ) );
read_NotImplemented( m_file, '}');
} else
{
break;
}
}
return 0;
}
int VRML1_MODEL_PARSER::readMaterial()
{
char text[128];
S3D_MATERIAL* material = NULL;
//DBG( printf( " readMaterial\n" ) );
wxString mat_name;
material = new S3D_MATERIAL( GetMaster(), mat_name );
GetMaster()->Insert( material );
m_model->m_Materials = material;
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
{
return 0;
}
if( strcmp( text, "ambientColor" ) == 0 )
{
readMaterial_ambientColor();
} else if( strcmp( text, "diffuseColor" ) == 0 )
{
readMaterial_diffuseColor( );
} else if( strcmp( text, "emissiveColor" ) == 0 )
{
readMaterial_emissiveColor( );
}else if( strcmp( text, "specularColor" ) == 0 )
{
readMaterial_specularColor( );
}else if( strcmp( text, "shininess" ) == 0 )
{
readMaterial_shininess( );
}else if( strcmp( text, "transparency" ) == 0 )
{
readMaterial_transparency( );
}
}
return -1;
}
int VRML1_MODEL_PARSER::readCoordinate3( )
{
char text[128];
//DBG( printf( " readCoordinate3\n" ) );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
{
return 0;
}
if( strcmp( text, "point" ) == 0 )
{
readCoordinate3_point( );
}
}
return -1;
}
int VRML1_MODEL_PARSER::readIndexedFaceSet( )
{
char text[128];
//DBG( printf( " readIndexedFaceSet\n" ) );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
{
return 0;
}
if( strcmp( text, "coordIndex" ) == 0 )
{
readIndexedFaceSet_coordIndex( );
} else if( strcmp( text, "materialIndex" ) == 0 )
{
readIndexedFaceSet_materialIndex( );
}
}
return -1;
}
int VRML1_MODEL_PARSER::readMaterial_ambientColor( )
{
//DBG( printf( " readMaterial_ambientColor\n" ) );
return parseVertexList( m_file, m_model->m_Materials->m_AmbientColor);
}
int VRML1_MODEL_PARSER::readMaterial_diffuseColor( )
{
//DBG( printf( " readMaterial_diffuseColor\n" ) );
return parseVertexList( m_file, m_model->m_Materials->m_DiffuseColor);
}
int VRML1_MODEL_PARSER::readMaterial_emissiveColor( )
{
//DBG( printf( " readMaterial_emissiveColor\n" ) );
int ret = parseVertexList( m_file, m_model->m_Materials->m_EmissiveColor);
if( GetMaster()->m_use_modelfile_emissiveColor == false)
{
m_model->m_Materials->m_EmissiveColor.clear();
}
return ret;
}
int VRML1_MODEL_PARSER::readMaterial_specularColor()
{
//DBG( printf( " readMaterial_specularColor\n" ) );
int ret = parseVertexList( m_file, m_model->m_Materials->m_SpecularColor );
if( GetMaster()->m_use_modelfile_specularColor == false)
{
m_model->m_Materials->m_SpecularColor.clear();
}
return ret;
}
int VRML1_MODEL_PARSER::readMaterial_shininess( )
{
//DBG( printf( " readMaterial_shininess\n" ) );
m_model->m_Materials->m_Shininess.clear();
float shininess_value;
while( fscanf( m_file, "%f,", &shininess_value ) )
{
// VRML value is normalized and openGL expects a value 0 - 128
shininess_value = shininess_value * 128.0f;
m_model->m_Materials->m_Shininess.push_back( shininess_value );
}
if( GetMaster()->m_use_modelfile_shininess == false )
{
m_model->m_Materials->m_Shininess.clear();
}
//DBG( printf( " m_Shininess.size: %ld\n", m_model->m_Materials->m_Shininess.size() ) );
return 0;
}
int VRML1_MODEL_PARSER::readMaterial_transparency()
{
//DBG( printf( " readMaterial_transparency\n" ) );
m_model->m_Materials->m_Transparency.clear();
float tmp;
while( fscanf (m_file, "%f,", &tmp) )
{
m_model->m_Materials->m_Transparency.push_back( tmp );
}
if( GetMaster()->m_use_modelfile_transparency == false )
{
m_model->m_Materials->m_Transparency.clear();
}
//DBG( printf( " m_Transparency.size: %ld\n", m_model->m_Materials->m_Transparency.size() ) );
return 0;
}
int VRML1_MODEL_PARSER::readCoordinate3_point()
{
//DBG( printf( " readCoordinate3_point\n" ) );
if( parseVertexList( m_file, m_model->m_Point ) == 0 )
{
return 0;
}
return -1;
}
int VRML1_MODEL_PARSER::readIndexedFaceSet_coordIndex()
{
//DBG( printf( " readIndexedFaceSet_coordIndex\n" ) );
m_model->m_CoordIndex.clear();
glm::ivec3 coord;
int dummy; // should be -1
while( fscanf( m_file, "%d,%d,%d,%d,", &coord[0], &coord[1], &coord[2], &dummy ) )
{
std::vector<int> coord_list;
coord_list.resize( 3 );
coord_list[0] = coord[0];
coord_list[1] = coord[1];
coord_list[2] = coord[2];
if( (coord[0] == coord[1]) ||
(coord[0] == coord[2]) ||
(coord[2] == coord[1]) )
{
//DBG( printf( " invalid coordIndex at index %lu (%d, %d, %d, %d)\n", m_model->m_CoordIndex.size()+1,coord[0], coord[1], coord[2], dummy ) );
}
if (dummy != -1)
{
//DBG( printf( " Error at index %lu, -1 Expected, got %d\n", m_model->m_CoordIndex.size()+1, dummy ) );
}
m_model->m_CoordIndex.push_back( coord_list );
}
//DBG( printf( " m_CoordIndex.size: %ld\n", m_model->m_CoordIndex.size() ) );
return 0;
}
int VRML1_MODEL_PARSER::readIndexedFaceSet_materialIndex()
{
//DBG( printf( " readIndexedFaceSet_materialIndex\n" ) );
m_model->m_MaterialIndex.clear();
int index;
while( fscanf( m_file, "%d,", &index ) )
{
m_model->m_MaterialIndex.push_back( index );
}
//DBG( printf( " m_MaterialIndex.size: %ld\n", m_model->m_MaterialIndex.size() ) );
return 0;
}
+766
View File
@@ -0,0 +1,766 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Mario Luzeiro <mrluzeiro@gmail.com>
* Copyright (C) 2013 Tuomas Vaherkoski <tuomasvaherkoski@gmail.com>
* Copyright (C) 2012 Jean-Pierre Charras, jp.charras@wanadoo.fr
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file vrml_v2_modelparser.cpp
*/
#include <fctsys.h>
#include <vector>
#include <macros.h>
#include <kicad_string.h>
#include <info3d_visu.h>
#include "3d_struct.h"
#include "modelparsers.h"
#include "vrml_aux.h"
VRML2_MODEL_PARSER::VRML2_MODEL_PARSER( S3D_MASTER* aMaster ) :
S3D_MODEL_PARSER( aMaster )
{
m_model = NULL;
}
VRML2_MODEL_PARSER::~VRML2_MODEL_PARSER()
{
for(unsigned int idx = 0; idx < childs.size(); idx++)
{
delete childs[idx];
}
}
void VRML2_MODEL_PARSER::Load( const wxString aFilename )
{
char text[128];
//DBG( printf( "Load %s\n", static_cast<const char*>(aFilename.mb_str()) ) );
m_file = wxFopen( aFilename, wxT( "rt" ) );
if( m_file == NULL )
{
return;
}
glShadeModel(GL_SMOOTH);
glEnable(GL_NORMALIZE);
float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
glScalef( vrmlunits_to_3Dunits, vrmlunits_to_3Dunits, vrmlunits_to_3Dunits );
glm::vec3 matScale( GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y, GetMaster()->m_MatScale.z );
glm::vec3 matRot( GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y, GetMaster()->m_MatRotation.z );
glm::vec3 matPos( GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y, GetMaster()->m_MatPosition.z );
#define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
glTranslatef( matPos.x * SCALE_3D_CONV, matPos.y * SCALE_3D_CONV, matPos.z * SCALE_3D_CONV );
glRotatef(-matRot.z, 0.0f, 0.0f, 1.0f );
glRotatef(-matRot.y, 0.0f, 1.0f, 0.0f );
glRotatef(-matRot.x, 1.0f, 0.0f, 0.0f );
glScalef( matScale.x, matScale.y, matScale.z );
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
SetLocaleTo_C_standard();
childs.clear();
while( GetNextTag( m_file, text ) )
{
if( ( text == NULL ) || ( *text == '}' ) || ( *text == ']' ) )
{
continue;
}
if( strcmp( text, "Transform" ) == 0 )
{
m_model = new S3D_MESH();
childs.push_back( m_model );
read_Transform();
} else if( strcmp( text, "DEF" ) == 0 )
{
m_model = new S3D_MESH();
childs.push_back( m_model );
read_DEF();
}
}
fclose( m_file );
SetLocaleTo_Default(); // revert to the current locale
//DBG( printf( "chils size:%lu\n", childs.size() ) );
if( GetMaster()->IsOpenGlAllowed() )
{
for( unsigned int idx = 0; idx < childs.size(); idx++ )
{
childs[idx]->openGL_RenderAllChilds();
}
}
}
int VRML2_MODEL_PARSER::read_Transform()
{
char text[128];
//DBG( printf( "Transform\n" ) );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
{
//DBG( printf( " } Exit Transform\n" ) );
break;
}
if( strcmp( text, "translation" ) == 0 )
{
parseVertex( m_file, m_model->m_translation );
} else if( strcmp( text, "rotation" ) == 0 )
{
fscanf( m_file, "%f %f %f %f", &m_model->m_rotation[0], &m_model->m_rotation[1], &m_model->m_rotation[2], &m_model->m_rotation[3]);
m_model->m_rotation[3] = m_model->m_rotation[3] * 180.0f / 3.14f; // !TODO: use constants or functions
} else if( strcmp( text, "scale" ) == 0 )
{
parseVertex( m_file, m_model->m_scale );
} else if( strcmp( text, "scaleOrientation" ) == 0 )
{
fscanf( m_file, "%f %f %f %f", &m_model->m_scaleOrientation[0], &m_model->m_scaleOrientation[1], &m_model->m_scaleOrientation[2], &m_model->m_scaleOrientation[3]);
} else if( strcmp( text, "center" ) == 0 )
{
parseVertex( m_file, m_model->m_center );
} else if( strcmp( text, "children" ) == 0 )
{
// skip
} else if( strcmp( text, "Switch" ) == 0 )
{
// skip
} else if( strcmp( text, "whichChoice" ) == 0 )
{
int dummy;
fscanf( m_file, "%d", &dummy );
} else if( strcmp( text, "choice" ) == 0 )
{
// skip
} else if( strcmp( text, "Group" ) == 0 )
{
// skip
} else if( strcmp( text, "Shape" ) == 0 )
{
S3D_MESH *parent = m_model;
S3D_MESH *new_mesh_model = new S3D_MESH();
m_model->childs.push_back( new_mesh_model );
m_model = new_mesh_model;
read_Shape();
m_model = parent;
} else if( strcmp( text, "DEF" ) == 0 )
{
read_DEF();
} else
{
DBG( printf( " %s NotImplemented\n", text ) );
read_NotImplemented( m_file, '}' );
}
}
return 0;
}
int VRML2_MODEL_PARSER::read_DEF()
{
char text[128];
GetNextTag( m_file, text);
//DBG( printf( "DEF %s ", text ) );
while( GetNextTag( m_file, text ) )
{
if( ( text == NULL ) || ( *text == ']' ) )
{
//DBG( printf( " skiping %c\n", *text) );
continue;
}
if( ( *text == '}' ) )
{
//DBG( printf( " } Exit DEF\n") );
return 0;
}
if( strcmp( text, "Transform" ) == 0 )
{
return read_Transform ();
} else if( strcmp( text, "children" ) == 0 )
{
// skip
} else if( strcmp( text, "Switch" ) == 0 )
{
// skip
} else if( strcmp( text, "whichChoice" ) == 0 )
{
// skip
} else if( strcmp( text, "choice" ) == 0 )
{
// skip
}else if( strcmp( text, "Shape" ) == 0 )
{
S3D_MESH *parent = m_model;
S3D_MESH *new_mesh_model = new S3D_MESH();
m_model->childs.push_back( new_mesh_model );
m_model = new_mesh_model;
read_Shape();
m_model = parent;
}
}
DBG( printf( " DEF failed\n" ) );
return -1;
}
int VRML2_MODEL_PARSER::read_Shape()
{
char text[128];
//DBG( printf( " Shape\n") );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
{
//DBG( printf( " } Exit Shape\n") );
return 0;
}
if( strcmp( text, "appearance" ) == 0 )
{
//skip
} else if( strcmp( text, "Appearance" ) == 0 )
{
read_Appearance();
} else if( strcmp( text, "geometry" ) == 0 )
{
//skip
} else if( strcmp( text, "IndexedFaceSet" ) == 0 )
{
read_IndexedFaceSet();
} else
{
DBG( printf( " %s NotImplemented\n", text ) );
read_NotImplemented( m_file, '}' );
}
}
DBG( printf( " Shape failed\n") );
return -1;
}
int VRML2_MODEL_PARSER::read_Appearance()
{
char text[128];
//DBG( printf( " Appearance\n") );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
{
return 0;
}
if( strcmp( text, "material" ) == 0 )
{
read_material();
}
}
DBG( printf( " Appearance failed\n") );
return -1;
}
int VRML2_MODEL_PARSER::read_material()
{
S3D_MATERIAL* material = NULL;
char text[128];
//DBG( printf( " material ") );
if( GetNextTag( m_file, text ) )
{
if( strcmp( text, "Material" ) == 0 )
{
wxString mat_name;
material = new S3D_MATERIAL( GetMaster(), mat_name );
GetMaster()->Insert( material );
m_model->m_Materials = material;
if( strcmp( text, "Material" ) == 0 )
{
return read_Material();
}
} else if( strcmp( text, "DEF" ) == 0 )
{
//DBG( printf( "DEF") );
if( GetNextTag( m_file, text ) )
{
//DBG( printf( "%s", text ) );
wxString mat_name;
mat_name = FROM_UTF8( text );
material = new S3D_MATERIAL( GetMaster(), mat_name );
GetMaster()->Insert( material );
m_model->m_Materials = material;
if( GetNextTag( m_file, text ) )
{
if( strcmp( text, "Material" ) == 0 )
{
return read_Material();
}
}
}
} else if( strcmp( text, "USE" ) == 0 )
{
//DBG( printf( "USE") );
if( GetNextTag( m_file, text ) )
{
//DBG( printf( "%s\n", text ) );
wxString mat_name;
mat_name = FROM_UTF8( text );
for( material = GetMaster()->m_Materials; material; material = material->Next() )
{
if( material->m_Name == mat_name )
{
m_model->m_Materials = material;
return 0;
}
}
DBG( printf( " read_material error: material not found\n" ) );
}
}
}
DBG( printf( " failed material\n") );
return -1;
}
int VRML2_MODEL_PARSER::read_Material()
{
char text[128];
glm::vec3 vertex;
//DBG( printf( " Material\n") );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
{
return 0;
}
if( strcmp( text, "diffuseColor" ) == 0 )
{
//DBG( printf( " diffuseColor") );
parseVertex ( m_file, vertex);
//DBG( printf( "\n") );
m_model->m_Materials->m_DiffuseColor.push_back( vertex );
} else if( strcmp( text, "emissiveColor" ) == 0 )
{
//DBG( printf( " emissiveColor") );
parseVertex ( m_file, vertex);
//DBG( printf( "\n") );
if( GetMaster()->m_use_modelfile_emissiveColor == true )
{
m_model->m_Materials->m_EmissiveColor.push_back( vertex );
}
} else if( strcmp( text, "specularColor" ) == 0 )
{
//DBG( printf( " specularColor") );
parseVertex ( m_file, vertex);
//DBG( printf( "\n") );
if( GetMaster()->m_use_modelfile_specularColor == true )
{
m_model->m_Materials->m_SpecularColor.push_back( vertex );
}
} else if( strcmp( text, "ambientIntensity" ) == 0 )
{
float ambientIntensity;
parseFloat( m_file, &ambientIntensity );
//DBG( printf( " ambientIntensity %f\n", ambientIntensity) );
if( GetMaster()->m_use_modelfile_ambientIntensity == true )
{
m_model->m_Materials->m_AmbientColor.push_back( glm::vec3( ambientIntensity, ambientIntensity, ambientIntensity ) );
}
} else if( strcmp( text, "transparency" ) == 0 )
{
float transparency;
parseFloat( m_file, &transparency );
//DBG( printf( " transparency %f\n", transparency) );
if( GetMaster()->m_use_modelfile_transparency == true )
{
m_model->m_Materials->m_Transparency.push_back( transparency );
}
} else if( strcmp( text, "shininess" ) == 0 )
{
float shininess;
parseFloat( m_file, &shininess );
//DBG( printf( " shininess %f\n", shininess) );
// VRML value is normalized and openGL expects a value 0 - 128
if( GetMaster()->m_use_modelfile_shininess == true )
{
shininess = shininess * 128.0f;
m_model->m_Materials->m_Shininess.push_back( shininess );
}
}
}
DBG( printf( " Material failed\n") );
return -1;
}
int VRML2_MODEL_PARSER::read_IndexedFaceSet()
{
char text[128];
//DBG( printf( " IndexedFaceSet\n") );
m_normalPerVertex = false;
colorPerVertex = false;
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
{
//DBG( printf( " } Exit IndexedFaceSet\n") );
return 0;
}
if( strcmp( text, "normalPerVertex" ) == 0 )
{
if( GetNextTag( m_file, text ) )
{
if( strcmp( text, "TRUE" ) == 0 )
{
//DBG( printf( " m_normalPerVertex TRUE\n") );
m_normalPerVertex = true;
}
}
} else if( strcmp( text, "colorPerVertex" ) == 0 )
{
GetNextTag( m_file, text );
if( strcmp( text, "TRUE" ) )
{
//DBG( printf( " colorPerVertex = true\n") );
colorPerVertex = true;
} else
{
colorPerVertex = false;
}
} else if( strcmp( text, "Coordinate" ) == 0 )
{
read_Coordinate();
} else if( strcmp( text, "Normal" ) == 0 )
{
read_Normal();
} else if( strcmp( text, "normalIndex" ) == 0 )
{
read_NormalIndex();
} else if( strcmp( text, "Color" ) == 0 )
{
read_Color();
} else if( strcmp( text, "coordIndex" ) == 0 )
{
read_coordIndex();
} else if( strcmp( text, "colorIndex" ) == 0 )
{
read_colorIndex();
}
}
DBG( printf( " IndexedFaceSet failed %s\n", text) );
return -1;
}
int VRML2_MODEL_PARSER::read_colorIndex()
{
//DBG( printf( " read_colorIndex\n" ) );
m_model->m_MaterialIndex.clear();
if( colorPerVertex == true )
{
int index;
int first_index;
while( fscanf( m_file, "%d, ", &index ) )
{
if( index == -1 )
{
// it only implemented color per face, so it will store as the first in the list
m_model->m_MaterialIndex.push_back( first_index );
} else
{
first_index = index;
}
}
} else
{
int index;
while( fscanf( m_file, "%d,", &index ) )
{
m_model->m_MaterialIndex.push_back( index );
}
}
//DBG( printf( " m_MaterialIndex.size: %ld\n", m_model->m_MaterialIndex.size() ) );
return 0;
}
int VRML2_MODEL_PARSER::read_NormalIndex()
{
//DBG( printf( " read_NormalIndex\n" ) );
m_model->m_NormalIndex.clear();
glm::ivec3 coord;
int dummy; // should be -1
std::vector<int> coord_list;
coord_list.clear();
while( fscanf (m_file, "%d, ", &dummy ) == 1 )
{
if( dummy == -1 )
{
m_model->m_NormalIndex.push_back( coord_list );
//DBG( printf( " size: %lu ", coord_list.size()) );
coord_list.clear();
} else
{
coord_list.push_back( dummy );
//DBG( printf( "%d ", dummy) );
}
}
//DBG( printf( " m_NormalIndex.size: %ld\n", m_model->m_NormalIndex.size() ) );
return 0;
}
int VRML2_MODEL_PARSER::read_coordIndex()
{
//DBG( printf( " read_coordIndex\n" ) );
m_model->m_CoordIndex.clear();
glm::ivec3 coord;
int dummy; // should be -1
std::vector<int> coord_list;
coord_list.clear();
while( fscanf (m_file, "%d, ", &dummy ) == 1 )
{
if( dummy == -1 )
{
m_model->m_CoordIndex.push_back( coord_list );
//DBG( printf( " size: %lu ", coord_list.size()) );
coord_list.clear();
} else
{
coord_list.push_back( dummy );
//DBG( printf( "%d ", dummy) );
}
}
//DBG( printf( " m_CoordIndex.size: %ld\n", m_model->m_CoordIndex.size() ) );
return 0;
}
int VRML2_MODEL_PARSER::read_Color()
{
char text[128];
//DBG( printf( " read_Color\n") );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
{
//DBG( printf( " m_DiffuseColor.size: %ld\n", m_model->m_Materials->m_DiffuseColor.size() ) );
return 0;
}
if( strcmp( text, "color" ) == 0 )
{
parseVertexList( m_file, m_model->m_Materials->m_DiffuseColor );
}
}
//DBG( printf( " read_Color failed\n") );
return -1;
}
int VRML2_MODEL_PARSER::read_Normal()
{
char text[128];
//DBG( printf( " Normal\n") );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
{
//DBG( printf( " m_PerFaceNormalsNormalized.size: %lu\n", m_model->m_PerFaceNormalsNormalized.size() ) );
return 0;
}
if( strcmp( text, "vector" ) == 0 )
{
if(m_normalPerVertex == false )
{
parseVertexList( m_file, m_model->m_PerFaceNormalsNormalized );
} else
{
parseVertexList( m_file, m_model->m_PerVertexNormalsNormalized );
//DBG( printf( " m_PerVertexNormalsNormalized.size: %lu\n", m_model->m_PerVertexNormalsNormalized.size() ) );
}
}
}
return -1;
}
int VRML2_MODEL_PARSER::read_Coordinate()
{
char text[128];
//DBG( printf( " Coordinate\n") );
while( GetNextTag( m_file, text ) )
{
if ( ( text == NULL ) || ( *text == ']' ) )
{
continue;
}
if ( ( *text == '}' ) )
{
//DBG( printf( " m_Point.size: %lu\n", m_model->m_Point.size() ) );
return 0;
}
if( strcmp( text, "point" ) == 0 )
{
parseVertexList( m_file, m_model->m_Point);
}
}
return -1;
}
+35 -510
View File
@@ -37,23 +37,34 @@
#include "3d_struct.h"
#include "modelparsers.h"
// separator chars
static const char* sep_chars = " \t\n\r";
VRML_MODEL_PARSER::VRML_MODEL_PARSER( S3D_MASTER* aMaster ) :
S3D_MODEL_PARSER( aMaster )
{}
{
vrml1_parser = new VRML1_MODEL_PARSER( aMaster );
vrml2_parser = new VRML2_MODEL_PARSER( aMaster );
}
VRML_MODEL_PARSER::~VRML_MODEL_PARSER()
{}
{
if( vrml1_parser )
{
delete vrml1_parser;
}
if( vrml2_parser )
{
delete vrml2_parser;
}
}
void VRML_MODEL_PARSER::Load( const wxString aFilename )
{
char line[1024], * text;
char line[12];
FILE* file;
int LineNum = 0;
//DBG( printf( "Load %s", static_cast<const char*>(aFilename.mb_str()) ) );
file = wxFopen( aFilename, wxT( "rt" ) );
@@ -62,515 +73,29 @@ void VRML_MODEL_PARSER::Load( const wxString aFilename )
return;
}
// Switch the locale to standard C (needed to print floating point numbers like 1.3)
SetLocaleTo_C_standard();
while( GetLine( file, line, &LineNum, 512 ) )
if( fgets( line, 11, file ) == NULL )
{
text = strtok( line, sep_chars );
if ( text == NULL )
continue;
if( stricmp( text, "DEF" ) == 0 || stricmp( text, "Transform" ) == 0 || stricmp( text, "Group" ) == 0 )
{
while( GetLine( file, line, &LineNum, 512 ) )
{
text = strtok( line, sep_chars );
if( text == NULL )
continue;
if( *text == '}' )
break;
if( stricmp( text, "children" ) == 0 )
{
readChildren( file, &LineNum );
}
}
}
fclose( file );
return;
}
fclose( file );
SetLocaleTo_Default(); // revert to the current locale
}
int VRML_MODEL_PARSER::readMaterial( FILE* file, int* LineNum )
{
char line[512], * text, * command;
wxString mat_name;
S3D_MATERIAL* material = NULL;
command = strtok( NULL, sep_chars );
text = strtok( NULL, sep_chars );
mat_name = FROM_UTF8( text );
if( stricmp( command, "USE" ) == 0 )
if( stricmp( line, "#VRML V2.0" ) == 0)
{
for( material = GetMaster()->m_Materials; material; material = material->Next() )
{
if( material->m_Name == mat_name )
{
material->SetMaterial();
return 1;
}
}
//DBG( printf( "About to parser a #VRML V2.0 file\n" ) );
vrml2_parser->Load( aFilename );
return;
}
else if( stricmp( line, "#VRML V1.0" ) == 0)
{
//DBG( printf( "About to parser a #VRML V1.0 file\n" ) );
vrml1_parser->Load( aFilename );
DBG( printf( "ReadMaterial error: material not found\n" ) );
return 0;
return;
}
if( stricmp( command, "DEF" ) == 0 || stricmp( command,"Transform" ) == 0 || stricmp( command, "Material") == 0)
{
material = new S3D_MATERIAL( GetMaster(), mat_name );
GetMaster()->Insert( material );
while( GetLine( file, line, LineNum, 512 ) )
{
text = strtok( line, sep_chars );
if( text == NULL )
continue;
if( text[0] == '}' )
{
material->SetMaterial();
return 0;
}
if( stricmp( text, "diffuseColor" ) == 0 )
{
text = strtok( NULL, sep_chars );
material->m_DiffuseColor.x = atof( text );
text = strtok( NULL, sep_chars );
material->m_DiffuseColor.y = atof( text );
text = strtok( NULL, sep_chars );
material->m_DiffuseColor.z = atof( text );
}
else if( stricmp( text, "emissiveColor" ) == 0 )
{
text = strtok( NULL, sep_chars );
material->m_EmissiveColor.x = atof( text );
text = strtok( NULL, sep_chars );
material->m_EmissiveColor.y = atof( text );
text = strtok( NULL, sep_chars );
material->m_EmissiveColor.z = atof( text );
}
else if( strnicmp( text, "specularColor", 13 ) == 0 )
{
text = strtok( NULL, sep_chars );
material->m_SpecularColor.x = atof( text );
text = strtok( NULL, sep_chars );
material->m_SpecularColor.y = atof( text );
text = strtok( NULL, sep_chars );
material->m_SpecularColor.z = atof( text );
}
else if( strnicmp( text, "ambientIntensity", 16 ) == 0 )
{
text = strtok( NULL, sep_chars );
material->m_AmbientIntensity = atof( text );
}
else if( strnicmp( text, "transparency", 12 ) == 0 )
{
text = strtok( NULL, sep_chars );
material->m_Transparency = atof( text );
}
else if( strnicmp( text, "shininess", 9 ) == 0 )
{
text = strtok( NULL, sep_chars );
material->m_Shininess = atof( text );
}
}
}
return -1;
}
int VRML_MODEL_PARSER::readChildren( FILE* file, int* LineNum )
{
char line[1024], * text;
while( GetLine( file, line, LineNum, 512 ) )
{
text = strtok( line, sep_chars );
if( *text == '[' )
continue;
if( *text == ']' )
return 0;
if( *text == ',' )
continue;
if( stricmp( text, "Shape" ) == 0 )
{
readShape( file, LineNum );
}
else
{
DBG( printf( "ReadChildren error line %d <%s> \n", *LineNum, text ) );
break;
}
}
return 1;
}
int VRML_MODEL_PARSER::readShape( FILE* file, int* LineNum )
{
char line[1024], * text;
int err = 1;
while( GetLine( file, line, LineNum, 512 ) )
{
text = strtok( line, sep_chars );
if( *text == '}' )
{
err = 0;
break;
}
if( *text == '{' )
{
continue;
}
if( stricmp( text, "appearance" ) == 0 )
{
readAppearance( file, LineNum );
}
else if( stricmp( text, "geometry" ) == 0 )
{
readGeometry( file, LineNum );
}
else
{
DBG( printf( "ReadShape error line %d <%s> \n", *LineNum, text ) );
break;
}
}
return err;
}
int VRML_MODEL_PARSER::readAppearance( FILE* file, int* LineNum )
{
char line[1024], * text;
int err = 1;
while( GetLine( file, line, LineNum, 512 ) )
{
text = strtok( line, sep_chars );
if( *text == '}' )
{
err = 0;
break;
}
if( *text == '{' )
{
continue;
}
if( stricmp( text, "material" ) == 0 )
{
readMaterial( file, LineNum );
}
else
{
DBG( printf( "ReadAppearance error line %d <%s> \n", *LineNum, text ) );
break;
}
}
return err;
}
void VRML_MODEL_PARSER::readCoordsList( FILE* file, char* text_buffer,
std::vector< double >& aList, int* LineNum )
{
unsigned int ii = 0, jj = 0;
char* text;
bool HasData = false;
bool StartData = false;
bool EndNode = false;
char string_num[512];
text = text_buffer;
while( !EndNode )
{
if( *text == 0 ) // Needs data !
{
text = text_buffer;
GetLine( file, text_buffer, LineNum, 512 );
}
while( !EndNode && *text )
{
switch( *text )
{
case '[':
StartData = true;
jj = 0;
string_num[jj] = 0;
break;
case '}':
EndNode = true;
break;
case ']':
case '\t':
case ' ':
case ',':
jj = 0;
if( !StartData || !HasData )
break;
aList.push_back( atof( string_num ) );
string_num[jj] = 0;
ii++;
HasData = false;
if( *text == ']' )
{
StartData = false;
}
break;
default:
if( !StartData )
break;
if( jj >= sizeof( string_num ) )
break;
string_num[jj] = *text;
jj++;
string_num[jj] = 0;
HasData = true;
break;
}
text++;
}
}
}
int VRML_MODEL_PARSER::readGeometry( FILE* file, int* LineNum )
{
char line[1024], buffer[1024], * text;
int err = 1;
std::vector< double > points;
std::vector< double > list;
double vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
while( GetLine( file, line, LineNum, 512 ) )
{
strcpy( buffer, line );
text = strtok( buffer, sep_chars );
if( text == NULL )
continue;
if( *text == '}' )
{
err = 0;
break;
}
if( stricmp( text, "creaseAngle" ) == 0 )
{
continue;
}
if( *text == '{' )
{
continue;
}
if( stricmp( text, "normalPerVertex" ) == 0 )
{
text = strtok( NULL, " ,\t\n\r" );
if( text && stricmp( text, "true" ) == 0 )
{
}
else
{
}
continue;
}
if( stricmp( text, "colorPerVertex" ) == 0 )
{
text = strtok( NULL, " ,\t\n\r" );
if( text && stricmp( text, "true" ) == 0 )
{
}
else
{
}
continue;
}
if( stricmp( text, "normal" ) == 0 )
{
readCoordsList( file, line, list, LineNum );
list.clear();
continue;
}
if( stricmp( text, "normalIndex" ) == 0 )
{
while( GetLine( file, line, LineNum, 512 ) )
{
text = strtok( line, " ,\t\n\r" );
while( text )
{
if( *text == ']' )
break;
text = strtok( NULL, " ,\t\n\r" );
}
if( text && (*text == ']') )
break;
}
continue;
}
if( stricmp( text, "color" ) == 0 )
{
readCoordsList( file, line, list, LineNum );
list.clear();
continue;
}
if( stricmp( text, "solid" ) == 0 )
{
// ignore solid
continue;
}
if( stricmp( text, "colorIndex" ) == 0 )
{
while( GetLine( file, line, LineNum, 512 ) )
{
text = strtok( line, " ,\t\n\r" );
while( text )
{
if( *text == ']' )
break;
text = strtok( NULL, " ,\t\n\r" );
}
if( text && (*text == ']') )
break;
}
continue;
}
if( stricmp( text, "coord" ) == 0 )
{
readCoordsList( file, line, points, LineNum );
}
else if( stricmp( text, "coordIndex" ) == 0 )
{
if( points.size() < 3 || points.size() % 3 != 0 )
{
wxLogError( wxT( "3D geometry read error <%s> at line %d." ),
GetChars( FROM_UTF8( text ) ), *LineNum );
err = 1;
break;
}
std::vector< int > coordIndex;
std::vector< S3D_VERTEX > vertices;
while( GetLine( file, line, LineNum, 512 ) )
{
int jj;
text = strtok( line, " ,\t\n\r" );
while( text )
{
if( *text == ']' )
break;
jj = atoi( text );
if( jj < 0 )
{
for( jj = 0; jj < (int) coordIndex.size(); jj++ )
{
int kk = coordIndex[jj] * 3;
if( (kk < 0) || ((kk + 3) > (int)points.size()) )
{
wxLogError( wxT( "3D geometry index read error <%s> at line %d." ),
GetChars( FROM_UTF8( text ) ), *LineNum );
err = 1;
break;
}
S3D_VERTEX vertex;
vertex.x = points[kk];
vertex.y = points[kk + 1];
vertex.z = points[kk + 2];
vertices.push_back( vertex );
}
if( GetMaster()->IsOpenGlAllowed() )
{
GetMaster()->ObjectCoordsTo3DUnits( vertices );
TransfertToGLlist( vertices, vrmlunits_to_3Dunits );
}
vertices.clear();
coordIndex.clear();
}
else
{
coordIndex.push_back( jj );
}
text = strtok( NULL, " ,\t\n\r" );
}
if( text && (*text == ']') )
break;
}
}
else
{
wxLogError( wxT( "3D geometry read error <%s> at line %d." ),
GetChars( FROM_UTF8( text ) ), *LineNum );
err = 1;
break;
}
}
return err;
DBG( printf( "Unknown VRML file format: %s\n", line ) );
}
+163 -54
View File
@@ -66,6 +66,36 @@ void X3D_MODEL_PARSER::Load( const wxString aFilename )
return;
}
glShadeModel(GL_SMOOTH);
glEnable(GL_NORMALIZE);
float vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB;
glScalef( vrmlunits_to_3Dunits, vrmlunits_to_3Dunits, vrmlunits_to_3Dunits );
glm::vec3 matScale( GetMaster()->m_MatScale.x, GetMaster()->m_MatScale.y,
GetMaster()->m_MatScale.z );
glm::vec3 matRot( GetMaster()->m_MatRotation.x, GetMaster()->m_MatRotation.y,
GetMaster()->m_MatRotation.z );
glm::vec3 matPos( GetMaster()->m_MatPosition.x, GetMaster()->m_MatPosition.y,
GetMaster()->m_MatPosition.z );
#define SCALE_3D_CONV ((IU_PER_MILS * 1000.0f) / UNITS3D_TO_UNITSPCB)
glTranslatef( matPos.x * SCALE_3D_CONV, matPos.y * SCALE_3D_CONV, matPos.z * SCALE_3D_CONV );
glRotatef(-matRot.z, 0.0f, 0.0f, 1.0f );
glRotatef(-matRot.y, 0.0f, 1.0f, 0.0f );
glRotatef(-matRot.x, 1.0f, 0.0f, 0.0f );
glScalef( matScale.x, matScale.y, matScale.z );
// Switch the locale to standard C (needed to print floating point numbers)
LOCALE_IO toggle;
childs.clear();
// Shapes are inside of Transform nodes
// Transform node contains information about
// transition, scale and rotation of the shape
@@ -76,12 +106,25 @@ void X3D_MODEL_PARSER::Load( const wxString aFilename )
node_it != transforms.end();
node_it++ )
{
m_model = new S3D_MESH();
childs.push_back( m_model );
readTransform( *node_it );
}
//DBG( printf( "chils size:%lu\n", childs.size() ) );
if( GetMaster()->IsOpenGlAllowed() )
{
for( unsigned int idx = 0; idx < childs.size(); idx++ )
{
childs[idx]->openGL_RenderAllChilds();
}
}
}
wxString X3D_MODEL_PARSER::VRML_representation()
wxString X3D_MODEL_PARSER::VRML2_representation()
{
wxString output;
@@ -188,6 +231,8 @@ void X3D_MODEL_PARSER::readTransform( wxXmlNode* aTransformNode )
void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
{
glm::vec3 color;
PROPERTY_MAP properties;
GetNodeProperties( aMatNode, properties );
@@ -199,30 +244,42 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
S3D_MATERIAL* material = new S3D_MATERIAL( GetMaster(), properties[ wxT( "DEF" ) ] );
GetMaster()->Insert( material );
m_model->m_Materials = material;
if( !parseDoubleTriplet( properties[ wxT( "diffuseColor" ) ],
material->m_DiffuseColor ) )
color ) )
{
DBG( printf("diffuseColor parsing error") );
}
else
{
m_model->m_Materials->m_DiffuseColor.push_back( color );
}
if( !parseDoubleTriplet( properties[ wxT( "specularColor" ) ],
material->m_SpecularColor ) )
if( !parseDoubleTriplet( properties[ wxT( "specularColor" ) ], color ) )
{
DBG( printf("specularColor parsing error") );
}
else
{
m_model->m_Materials->m_SpecularColor.push_back( color );
}
if( !parseDoubleTriplet( properties[ wxT( "emissiveColor" ) ],
material->m_EmissiveColor ) )
if( !parseDoubleTriplet( properties[ wxT( "emissiveColor" ) ], color ) )
{
DBG( printf("emissiveColor parsing error") );
}
else
{
m_model->m_Materials->m_EmissiveColor.push_back( color );
}
wxStringTokenizer values;
values.SetString( properties[ wxT( "ambientIntensity" ) ] );
if( values.GetNextToken().ToDouble( &amb ) )
{
material->m_AmbientIntensity = amb;
m_model->m_Materials->m_AmbientColor.push_back( glm::vec3( amb, amb, amb ) );
}
else
{
@@ -233,7 +290,9 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
if( values.GetNextToken().ToDouble( &shine ) )
{
material->m_Shininess = shine;
// VRML value is normalized and openGL expects a value 0 - 128
shine = shine * 128.0f;
m_model->m_Materials->m_Shininess.push_back( shine );
}
else
{
@@ -244,15 +303,13 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
if( values.GetNextToken().ToDouble( &transp ) )
{
material->m_Transparency = transp;
m_model->m_Materials->m_Transparency.push_back( transp );
}
else
{
DBG( printf( "trans error") );
}
material->SetMaterial();
// VRML
wxString vrml_material;
PROPERTY_MAP::const_iterator p = ++properties.begin(); // skip DEF
@@ -278,32 +335,33 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode )
wxString vrml_material;
vrml_material.Append( wxString::Format( wxT( "specularColor %f %f %f\n" ),
material->m_SpecularColor.x,
material->m_SpecularColor.y,
material->m_SpecularColor.z ) );
material->m_SpecularColor[0].x,
material->m_SpecularColor[0].y,
material->m_SpecularColor[0].z ) );
vrml_material.Append( wxString::Format( wxT( "diffuseColor %f %f %f\n" ),
material->m_DiffuseColor.x,
material->m_DiffuseColor.y,
material->m_DiffuseColor.z ) );
material->m_DiffuseColor[0].x,
material->m_DiffuseColor[0].y,
material->m_DiffuseColor[0].z ) );
vrml_material.Append( wxString::Format( wxT( "emissiveColor %f %f %f\n" ),
material->m_EmissiveColor.x,
material->m_EmissiveColor.y,
material->m_EmissiveColor.z ) );
material->m_EmissiveColor[0].x,
material->m_EmissiveColor[0].y,
material->m_EmissiveColor[0].z ) );
vrml_material.Append( wxString::Format( wxT( "ambientIntensity %f\n"),
material->m_AmbientIntensity ) );
material->m_AmbientColor[0].x ) );
vrml_material.Append( wxString::Format( wxT( "shininess %f\n"),
material->m_Shininess ) );
material->m_Shininess[0] ) );
vrml_material.Append( wxString::Format( wxT( "transparency %f\n"),
material->m_Transparency ) );
material->m_Transparency[0] ) );
vrml_materials.push_back( vrml_material );
material->SetMaterial();
m_model->m_Materials = material;
return;
}
}
@@ -318,9 +376,17 @@ bool X3D_MODEL_PARSER::parseDoubleTriplet( const wxString& aData,
{
wxStringTokenizer tokens(aData);
return tokens.GetNextToken().ToDouble( &aResult.x ) &&
tokens.GetNextToken().ToDouble( &aResult.y ) &&
tokens.GetNextToken().ToDouble( &aResult.z );
double x,y,z;
bool ret = tokens.GetNextToken().ToDouble( &x ) &&
tokens.GetNextToken().ToDouble( &y ) &&
tokens.GetNextToken().ToDouble( &z );
aResult.x = x;
aResult.y = y;
aResult.z = z;
return ret;
}
@@ -373,16 +439,20 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
double angle = 0.0;
wxStringTokenizer tokens(aTransformProps[ wxT( "rotation" ) ]);
if( !(tokens.GetNextToken().ToDouble( &rotation.x ) &&
tokens.GetNextToken().ToDouble( &rotation.y ) &&
tokens.GetNextToken().ToDouble( &rotation.z ) &&
double x,y,z;
if( !(tokens.GetNextToken().ToDouble( &x ) &&
tokens.GetNextToken().ToDouble( &y ) &&
tokens.GetNextToken().ToDouble( &z ) &&
tokens.GetNextToken().ToDouble( &angle ) ) )
{
DBG( printf("rotation read error") );
}
double vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits *
UNITS3D_TO_UNITSPCB;
else
{
rotation.x = x;
rotation.y = y;
rotation.z = z;
}
/* Step 2: Read all coordinate points
* ---------------------------- */
@@ -439,7 +509,7 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
point.y += translation.y;
point.z += translation.z;
triplets.push_back(point);
m_model->m_Point.push_back( point );
// VRML
vrml_pointlist.Append( wxString::Format( wxT( "%f %f %f\n" ), point.x, point.y, point.z ) );
@@ -447,18 +517,71 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
vrml_points.push_back( vrml_pointlist );
/* Step 3: Read all color points
* ---------------------------- */
std::vector< double > color_points;
NODE_LIST color;
GetChildsByName( aFaceNode, wxT( "Color" ), color);
// Some models lack color information, need to handle this safely
if( !color.empty() )
{
PROPERTY_MAP color_properties;
// IndexedFaceSet has one Coordinate child node
GetNodeProperties( color[0], color_properties );
// Save points to vector as doubles
wxStringTokenizer colorpoint_tokens( color_properties[ wxT("color") ] );
double color_point = 0.0;
while( colorpoint_tokens.HasMoreTokens() )
{
if( colorpoint_tokens.GetNextToken().ToDouble( &color_point ) )
{
color_points.push_back( color_point );
}
else
{
wxLogError( wxT( "Error converting to double" ) );
}
}
if( color_points.size() % 3 != 0 )
{
DBG( printf( "Number of points is incorrect" ) );
return;
}
/* Create 3D face color from 3 color points
*/
m_model->m_Materials->m_DiffuseColor.clear();
for( unsigned id = 0; id < color_points.size() / 3; id++ )
{
m_model->m_MaterialIndex.push_back( id );
int color_triplet_indx = id * 3;
glm::vec3 colorface( color_points[ color_triplet_indx + 0 ],
color_points[ color_triplet_indx + 1 ],
color_points[ color_triplet_indx + 2 ] );
m_model->m_Materials->m_DiffuseColor.push_back( colorface );
}
}
/* -- Read coordinate indexes -- */
PROPERTY_MAP faceset_properties;
GetNodeProperties( aFaceNode, faceset_properties );
std::vector< S3D_VERTEX > vertices;
std::vector< int > coordIndex;
wxString coordIndex_str = faceset_properties[ wxT( "coordIndex" ) ];
wxStringTokenizer index_tokens( coordIndex_str );
wxString vrml_coord_indx_list;
std::vector<int> coord_list;
coord_list.clear();
while( index_tokens.HasMoreTokens() )
{
long index = 0;
@@ -470,28 +593,14 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode,
{
/* Step 4: Apply geometry to Master object
* --------------------------------------- */
std::vector<int>::const_iterator id;
m_model->m_CoordIndex.push_back( coord_list );
for( id = coordIndex.begin();
id != coordIndex.end();
id++ )
{
vertices.push_back( triplets.at( *id ) );
}
if( GetMaster()->IsOpenGlAllowed() )
{
GetMaster()->ObjectCoordsTo3DUnits( vertices );
TransfertToGLlist( vertices, vrmlunits_to_3Dunits );
}
vertices.clear();
coordIndex.clear();
coord_list.clear();
vrml_coord_indx_list.Append( wxT( "-1\n" ) );
}
else
{
coordIndex.push_back( index );
coord_list.push_back( index );
vrml_coord_indx_list.Append( wxString::Format( wxT( "%u " ), index ) );
}
}
@@ -0,0 +1,5 @@
#!/bin/bash
pandoc -f markdown_mmd -t html interactive_router.mmd > interactive_router.html
pandoc -f markdown_mmd -t latex interactive_router.mmd > tmp.tex
pdflatex interactive_router.tex
@@ -0,0 +1,73 @@
# Interactive Router #
The Interactive Router lets you quickly and efficient route your PCBs by shoving off or walking around items on the PCB that collide with the trace you are currently drawing.
Following modes are supported:
- **Shove**, attempting to push and shove all items colliding with the currently routed track.
- **Walk around**, trying to avoid obstacles by hugging/walking around them.
- **Highlight collisions** which highlights all violating objects with a nice, shiny green color and shows violating clearance regions.
## Setting up ##
Before using the Interactive Router, please set up these two things:
- Clearance settings. To set the clearances, open the *Design Rules* dialog and make sure at least the default clearance
value looks sensible.
- Enable OpenGL mode by selecting *View->Switch canvas to OpenGL* menu option or pressing **F11**.
![Screenshot](pictures/opengl_menu.png)
## Laying out tracks ##
To activate the router tool press the *Interactive Router* button ![Interactive Router Button](pictures/route_icon.png) or the **X** key.
The cursor will turn into a cross and the tool name, will appear in the status bar.
To start a track, click on any item (a pad, track or a via) or press the **X** key again hovering the mouse over that item.
The new track will use the net of the starting item. Clicking or pressing **X** on empty PCB space starts a track with no net assigned.
Move the mouse to define shape of the track. The router will try to follow mouse trail, hugging unmovable obstacles
(such as pads) and shoving colliding traces/vias, depending on the mode. Retreating mouse cursor will cause the shoved items to spring back
to their former locations.
Clicking on a pad/track/via in the same net finishes routing. Clicking in empty space fixes the segments routed so far and continues routing the trace.
In order to stop routing and undo all changes (shoved items, etc.), simply press **Esc**.
Pressing **V** or selecting *Place Through Via* from the context menu while routing a track attaches a via at the end of the trace being routed.
Pressing **V** again disables via placement. Clicking in any spot establishes the via and continues routing.
Pressing **/** or selecting *Switch Track Posture* from the context menu toggles the direction of the initial track segment between straight or diagonal.
**Note**: By default, the router snaps to centers/axes of the items. Snapping can be disabled by holding **Shift** while routing or selecting items.
## Setting track widths and via sizes ##
There are several ways to pre-select a track width/via size or to change it during routing:
- Use standard Kicad shortcuts.
- Press **W** or select *Custom Track Width* from the context menu to type in a custom width/via size.
- Pick a predefined width from the *Select Track Width* sub-menu of the context menu.
- Select *Use the starting track width* in the *Select Track Width* menu to pick the width from the start item (or the traces already connected to it).
## Dragging ##
The router can drag track segments, corners and vias. To drag an item, click on it with **Ctrl** key pressed, hover the mouse and press **G** or select *Drag Track/Via* from the context menu.
Finish dragging by clicking again or abort by pressing *Esc*.
## Options ##
The router behavior be configured by pressing *E* or selecting *Routing Options* from the context menu. It opens a window like the one below:
![Screenshot](pictures/router_options.png)
The options are:
- **Mode** - select how the router handles DRC violation (shoving, walking around, etc.)
- **Shove vias** - when disabled, vias are treated as un-movable objects and hugged instead of shoved.
- **Jump over obstacles** - when enabled, the router tries to move colliding traces behind solid obstacles (e.g. pads) instead of "reflecting" back the collision
- **Remove redundant tracks** - removes loops while routing (e.g. if the new track ensures same connectivity as an already existing one, the old track is removed). Loop removal works locally (only between the start and end of the currently routed trace).
- **Automatic neckdown** - when enabled, the router tries to break out pads/vias in a clean way, avoiding acute angles and jagged breakout traces.
- **Smooth dragged segments** - when enabled, the router attempts to merge several jagged segments into a single straight one (dragging mode).
- **Allow DRC violations** (*Highlight collisions* mode only) - allows to establish a track even if is violating the DRC rules.
- **Optimizer effort** - defines how much time the router shall spend optimizing the routed/shoved traces. More effort means cleaner routing (but slower), less effort means faster routing but somewhat jagged traces.
Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

-11
View File
@@ -1,11 +0,0 @@
So, finally we've got an integrated interactive, push-and-sometimes-shove router, although with a very limited user interface:
- Edit->Interactive router launches the tool,
- while routing: 'V' key places a via,
- '+' and '-' keys cycle through available layers,
- '/' key switches track posture.
Via/track dimensions are taken from the netclasses.
There are no other options available for the time being - promise to add them soon :)
Tom
+4
View File
@@ -60,6 +60,8 @@ PCBNew
*) Paste (module ...) from clipboard into module editor.
Dick's Final TODO List:
======================
*) Get licensing cleaned up.
@@ -75,3 +77,5 @@ Dick's Final TODO List:
* Clear all/some? retained strings on project change.
* Clear the FP_LIB_TABLE when the last KIWAY_PLAYER using it is closed.
Fix export gencad
+1 -1
View File
@@ -355,7 +355,7 @@ void BITMAPCONV_INFO::OuputOnePolygon( KPolygon & aPolygon )
case PCBNEW_LEGACY_EMP:
{
LAYER_NUM layer = SILKSCREEN_N_FRONT;
LAYER_NUM layer = F_SilkS;
int width = 1;
fprintf( m_Outfile, "DP %d %d %d %d %d %d %d\n",
0, 0, 0, 0,
+2
View File
@@ -228,6 +228,7 @@ set( COMMON_SRCS
math/math_util.cpp
tool/tool_action.cpp
tool/tool_base.cpp
tool/tool_manager.cpp
tool/tool_dispatcher.cpp
@@ -250,6 +251,7 @@ set( PCB_COMMON_SRCS
eda_text.cpp
class_page_info.cpp
pcbcommon.cpp
lset.cpp
footprint_info.cpp
../pcbnew/basepcbframe.cpp
../pcbnew/class_board.cpp
+4
View File
@@ -71,6 +71,10 @@ void BLOCK_SELECTOR::SetMessageBlock( EDA_DRAW_FRAME* frame )
msg = _( "Block Drag" );
break;
case BLOCK_DRAG_ITEM: // Drag
msg = _( "Drag item" );
break;
case BLOCK_COPY: // Copy
msg = _( "Block Copy" );
break;
+1 -1
View File
@@ -6,7 +6,7 @@
#endif
#ifndef KICAD_BUILD_VERSION
# define KICAD_BUILD_VERSION "(2014-jan-25)"
# define KICAD_BUILD_VERSION "(2014-jul-16 BZR unknown)"
#endif
/**
+30 -13
View File
@@ -12,15 +12,21 @@
* in Eeschema, Pcbnew and GerbView
*/
/* Initial colors values: optimized for Pcbnew, but are also Ok for Eeschema
/* Initial colors values: optimized for Pcbnew 64 layers.
* The table is not actually used by Eeschema.
* these values are superseded by config reading
*/
static const EDA_COLOR_T default_layer_color[LAYERSCOLORSBUFFERSIZE] =
{
GREEN, BLUE, LIGHTGRAY, BROWN,
RED, MAGENTA, LIGHTGRAY, MAGENTA,
DARKGRAY, BLUE, GREEN, CYAN,
LIGHTRED, LIGHTMAGENTA, YELLOW, RED,
static const EDA_COLOR_T default_layer_color[] = {
RED, YELLOW, LIGHTMAGENTA, LIGHTRED,
CYAN, GREEN, BLUE, DARKGRAY,
MAGENTA, LIGHTGRAY, MAGENTA, RED,
BROWN, LIGHTGRAY, BLUE, GREEN,
RED, YELLOW, LIGHTMAGENTA, LIGHTRED,
CYAN, GREEN, BLUE, DARKGRAY,
MAGENTA, LIGHTGRAY, MAGENTA, RED,
BROWN, LIGHTGRAY, BLUE, GREEN,
BLUE, MAGENTA,
LIGHTCYAN, RED,
MAGENTA, CYAN,
@@ -34,8 +40,8 @@ static const EDA_COLOR_T default_layer_color[LAYERSCOLORSBUFFERSIZE] =
DARKGRAY
};
static const EDA_COLOR_T default_items_color[LAYERSCOLORSBUFFERSIZE] =
{
static const EDA_COLOR_T default_items_color[] = {
LIGHTGRAY, // unused
CYAN, // VIA_MICROVIA_VISIBLE
BROWN, // VIA_BBLIND_VISIBLE
@@ -56,13 +62,24 @@ static const EDA_COLOR_T default_items_color[LAYERSCOLORSBUFFERSIZE] =
LIGHTGRAY, LIGHTGRAY, LIGHTGRAY
};
COLORS_DESIGN_SETTINGS::COLORS_DESIGN_SETTINGS()
{
for( unsigned ii = 0; ii < DIM(m_LayersColors); ii++ )
m_LayersColors[ii] = default_layer_color[ii];
for( unsigned src = 0, dst = 0; dst < DIM(m_LayersColors); ++dst )
{
m_LayersColors[dst] = default_layer_color[src++];
for( unsigned ii = 0; ii < DIM(m_ItemsColors); ii++ )
m_ItemsColors[ii] = default_items_color[ii];
if( src >= DIM( default_layer_color ) )
src = 0; // wrap the source.
}
for( unsigned src = 0, dst = 0; dst < DIM(m_ItemsColors); ++dst )
{
m_ItemsColors[dst] = default_items_color[src++];
if( src >= DIM( default_items_color ) )
src = 0;
}
}
+5 -10
View File
@@ -13,19 +13,11 @@
LAYER_SELECTOR::LAYER_SELECTOR()
{
m_layerorder = true;
m_layerhotkeys = true;
m_hotkeys = NULL;
}
bool LAYER_SELECTOR::SetLayersOrdered( bool value )
{
m_layerorder = value;
return m_layerorder;
}
bool LAYER_SELECTOR::SetLayersHotkeys( bool value )
{
m_layerhotkeys = value;
@@ -120,12 +112,15 @@ int LAYER_BOX_SELECTOR::SetLayerSelection( LAYER_NUM layer )
return -1;
}
void LAYER_BOX_SELECTOR::ResyncBitmapOnly()
{
LAYER_NUM elements = GetCount();
for( LAYER_NUM i = FIRST_LAYER; i < elements; ++i )
int elements = GetCount();
for( LAYER_NUM i = 0; i < elements; ++i )
{
wxBitmap layerbmp( 14, 14 );
SetBitmapLayer( layerbmp, i );
}
}
+82 -23
View File
@@ -15,6 +15,22 @@
#include <build_version.h>
GERBER_PLOTTER::GERBER_PLOTTER()
{
workFile = 0;
finalFile = 0;
currentAperture = apertures.end();
// number of digits after the point (number of digits of the mantissa
// Be carefull: the Gerber coordinates are stored in an integer
// so 6 digits (inches) or 5 digits (mm) is a good value
// To avoid overflow, 7 digits (inches) or 6 digits is a max.
// with lower values than 6 digits (inches) or 5 digits (mm),
// Creating self-intersecting polygons from non-intersecting polygons
// happen easily.
m_gerberUnitInch = false;
m_gerberUnitFmt = 6;
}
void GERBER_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil,
double aScale, bool aMirror )
@@ -23,27 +39,43 @@ void GERBER_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil,
wxASSERT( aMirror == false );
m_plotMirror = false;
plotOffset = aOffset;
wxASSERT( aScale == 1 );
plotScale = 1;
wxASSERT( aScale == 1 ); // aScale parameter is not used in Gerber
plotScale = 1; // Plot scale is *always* 1.0
m_IUsPerDecimil = aIusPerDecimil;
iuPerDeviceUnit = 1.0 / aIusPerDecimil;
/* We don't handle the filmbox, and it's more useful to keep the
* origin at the origin */
// gives now a default value to iuPerDeviceUnit (because the units of the caller is now known)
// which could be modified later by calling SetGerberCoordinatesFormat()
iuPerDeviceUnit = pow( 10.0, m_gerberUnitFmt ) / ( m_IUsPerDecimil * 10000.0 );
// We don't handle the filmbox, and it's more useful to keep the
// origin at the origin
paperSize.x = 0;
paperSize.y = 0;
SetDefaultLineWidth( 100 * aIusPerDecimil ); // Arbitrary default
}
void GERBER_PLOTTER::SetGerberCoordinatesFormat( int aResolution, bool aUseInches )
{
m_gerberUnitInch = aUseInches;
m_gerberUnitFmt = aResolution;
iuPerDeviceUnit = pow( 10.0, m_gerberUnitFmt ) / ( m_IUsPerDecimil * 10000.0 );
if( ! m_gerberUnitInch )
iuPerDeviceUnit *= 25.4; // gerber output in mm
}
/**
* Emit a D-Code record, using proper conversions
* to format a leading zero omitted gerber coordinate
* (for 4 decimal positions, see header generation in start_plot
* (for n decimal positions, see header generation in start_plot
*/
void GERBER_PLOTTER::emitDcode( const DPOINT& pt, int dcode )
{
fprintf( outputFile, "X%dY%dD%02d*\n",
int( pt.x ), int( pt.y ), dcode );
KiROUND( pt.x ), KiROUND( pt.y ), dcode );
}
/**
@@ -67,19 +99,38 @@ bool GERBER_PLOTTER::StartPlot()
if( outputFile == NULL )
return false;
/* Set coordinate format to 3.4 absolute, leading zero omitted */
fputs( "%FSLAX34Y34*%\n", outputFile );
fputs( "G04 Gerber Fmt 3.4, Leading zero omitted, Abs format*\n", outputFile );
if( ! m_attribFunction.IsEmpty() )
{
fprintf( outputFile, "%%TF.FileFunction,%s*%%\n",
TO_UTF8( m_attribFunction ) );
}
// Set coordinate format to 3.6 or 4.5 absolute, leading zero omitted
// the number of digits for the integer part of coordintes is needed
// in gerber format, but is not very important when omitting leading zeros
// It is fixed here to 3 (inch) or 4 (mm), but is not actually used
int leadingDigitCount = m_gerberUnitInch ? 3 : 4;
fprintf( outputFile, "%%FSLAX%d%dY%d%d*%%\n",
leadingDigitCount, m_gerberUnitFmt,
leadingDigitCount, m_gerberUnitFmt );
fprintf( outputFile,
"G04 Gerber Fmt %d.%d, Leading zero omitted, Abs format (unit %s)*\n",
leadingDigitCount, m_gerberUnitFmt,
m_gerberUnitInch ? "inch" : "mm" );
wxString Title = creator + wxT( " " ) + GetBuildVersion();
fprintf( outputFile, "G04 (created by %s) date %s*\n",
fprintf( outputFile, "G04 Created by KiCad (%s) date %s*\n",
TO_UTF8( Title ), TO_UTF8( DateAndTime() ) );
/* Mass parameter: unit = INCHES */
fputs( "%MOIN*%\n", outputFile );
/* Mass parameter: unit = INCHES/MM */
if( m_gerberUnitInch )
fputs( "%MOIN*%\n", outputFile );
else
fputs( "%MOMM*%\n", outputFile );
/* Specify linear interpol (G01), unit = INCH (G70), abs format (G90) */
fputs( "G01*\nG70*\nG90*\n", outputFile );
/* Specify linear interpol (G01) */
fputs( "G01*\n", outputFile );
fputs( "G04 APERTURE LIST*\n", outputFile );
/* Select the default aperture */
SetCurrentLineWidth( -1 );
@@ -185,7 +236,7 @@ void GERBER_PLOTTER::selectAperture( const wxSize& size,
{
// Pick an existing aperture or create a new one
currentAperture = getAperture( size, type );
fprintf( outputFile, "G54D%d*\n", currentAperture->DCode );
fprintf( outputFile, "D%d*\n", currentAperture->DCode );
}
}
@@ -202,8 +253,13 @@ void GERBER_PLOTTER::writeApertureList()
for( std::vector<APERTURE>::iterator tool = apertures.begin();
tool != apertures.end(); tool++ )
{
const double fscale = 0.0001f * plotScale
* iuPerDeviceUnit ;
// apertude sizes are in inch or mm, regardless the
// coordinates format
double fscale = 0.0001 * plotScale / m_IUsPerDecimil; // inches
if(! m_gerberUnitInch )
fscale *= 25.4; // size in mm
char* text = cbuf + sprintf( cbuf, "%%ADD%d", tool->DCode );
/* Please note: the Gerber specs for mass parameters say that
@@ -303,30 +359,33 @@ void GERBER_PLOTTER::Arc( const wxPoint& aCenter, double aStAngle, double aEndAn
DPOINT devEnd = userToDeviceCoordinates( end );
DPOINT devCenter = userToDeviceCoordinates( aCenter )
- userToDeviceCoordinates( start );
fprintf( outputFile, "G75*\n" ); // Multiquadrant mode
if( aStAngle < aEndAngle )
fprintf( outputFile, "G03" );
else
fprintf( outputFile, "G02" );
fprintf( outputFile, "X%dY%dI%dJ%dD01*\n", int( devEnd.x ), int( devEnd.y ),
int( devCenter.x ), int( devCenter.y ) );
fprintf( outputFile, "X%dY%dI%dJ%dD01*\n",
KiROUND( devEnd.x ), KiROUND( devEnd.y ),
KiROUND( devCenter.x ), KiROUND( devCenter.y ) );
fprintf( outputFile, "G74*\nG01*\n" ); // Back to single quadrant and linear interp.
}
/**
* Gerber polygon: they can (and *should*) be filled with the
* appropriate G36/G37 sequence (raster fills are deprecated)
* appropriate G36/G37 sequence
*/
void GERBER_PLOTTER::PlotPoly( const std::vector< wxPoint >& aCornerList,
void GERBER_PLOTTER:: PlotPoly( const std::vector< wxPoint >& aCornerList,
FILL_T aFill, int aWidth )
{
if( aCornerList.size() <= 1 )
return;
// Gerber format does not know filled polygons with thick outline
// Thereore, to plot a filled polygon with outline having a thickness,
// Therefore, to plot a filled polygon with outline having a thickness,
// one should plot outline as thick segments
SetCurrentLineWidth( aWidth );
+3 -2
View File
@@ -79,6 +79,8 @@ void PDF_PLOTTER::SetViewport( const wxPoint& aOffset, double aIusPerDecimil,
// The CTM is set to 1 user unit per decimil
iuPerDeviceUnit = 1.0 / aIusPerDecimil;
SetDefaultLineWidth( 100 / iuPerDeviceUnit ); // arbitrary default
/* The paper size in this engined is handled page by page
Look in the StartPage function */
}
@@ -511,7 +513,6 @@ void PDF_PLOTTER::StartPage()
paperSize = pageInfo.GetSizeMils();
paperSize.x *= 10.0 / iuPerDeviceUnit;
paperSize.y *= 10.0 / iuPerDeviceUnit;
SetDefaultLineWidth( 100 / iuPerDeviceUnit ); // arbitrary default
// Open the content stream; the page object will go later
pageStreamHandle = startPdfStream();
@@ -723,7 +724,7 @@ bool PDF_PLOTTER::EndPlot()
"<< /Size %lu /Root %d 0 R /Info %d 0 R >>\n"
"startxref\n"
"%ld\n" // The offset we saved before
"%%EOF\n",
"%%%%EOF\n",
(unsigned long) xrefTable.size(), catalogHandle, infoDictHandle, xref_start );
fclose( outputFile );
+7 -7
View File
@@ -420,14 +420,14 @@ void SVG_PLOTTER::PlotPoly( const std::vector<wxPoint>& aCornerList,
switch( aFill )
{
case NO_FILL:
fprintf( outputFile, "<polyline fill=\"none;\"\n" );
break;
case NO_FILL:
fprintf( outputFile, "<polyline fill=\"none;\"\n" );
break;
case FILLED_WITH_BG_BODYCOLOR:
case FILLED_SHAPE:
fprintf( outputFile, "<polyline style=\"fill-rule:evenodd;\"\n" );
break;
case FILLED_WITH_BG_BODYCOLOR:
case FILLED_SHAPE:
fprintf( outputFile, "<polyline style=\"fill-rule:evenodd;\"\n" );
break;
}
DPOINT pos = userToDeviceCoordinates( aCornerList[0] );
+19 -19
View File
@@ -47,7 +47,7 @@ void wxConfigSaveParams( wxConfigBase* aCfg,
BOOST_FOREACH( const PARAM_CFG_BASE& param, aList )
{
if( param.m_Group )
if( !!param.m_Group )
aCfg->SetPath( param.m_Group );
else
aCfg->SetPath( aGroup );
@@ -57,7 +57,7 @@ void wxConfigSaveParams( wxConfigBase* aCfg,
if( param.m_Type == PARAM_COMMAND_ERASE ) // Erase all data
{
if( param.m_Ident )
if( !!param.m_Ident )
aCfg->DeleteGroup( param.m_Ident );
}
else
@@ -75,7 +75,7 @@ void wxConfigLoadParams( wxConfigBase* aCfg,
BOOST_FOREACH( const PARAM_CFG_BASE& param, aList )
{
if( param.m_Group )
if( !!param.m_Group )
aCfg->SetPath( param.m_Group );
else
aCfg->SetPath( aGroup );
@@ -99,7 +99,7 @@ void wxConfigSaveSetups( wxConfigBase* aCfg, const PARAM_CFG_ARRAY& aList )
if( param.m_Type == PARAM_COMMAND_ERASE ) // Erase all data
{
if( param.m_Ident )
if( !!param.m_Ident )
aCfg->DeleteGroup( param.m_Ident );
}
else
@@ -137,7 +137,7 @@ void ConfigBaseWriteDouble( wxConfigBase* aConfig, const wxString& aKey, double
}
PARAM_CFG_BASE::PARAM_CFG_BASE( const wxChar* ident, const paramcfg_id type,
PARAM_CFG_BASE::PARAM_CFG_BASE( const wxString& ident, const paramcfg_id type,
const wxChar* group )
{
m_Ident = ident;
@@ -147,7 +147,7 @@ PARAM_CFG_BASE::PARAM_CFG_BASE( const wxChar* ident, const paramcfg_id type,
}
PARAM_CFG_INT::PARAM_CFG_INT( const wxChar* ident, int* ptparam,
PARAM_CFG_INT::PARAM_CFG_INT( const wxString& ident, int* ptparam,
int default_val, int min, int max,
const wxChar* group ) :
PARAM_CFG_BASE( ident, PARAM_INT, group )
@@ -159,7 +159,7 @@ PARAM_CFG_INT::PARAM_CFG_INT( const wxChar* ident, int* ptparam,
}
PARAM_CFG_INT::PARAM_CFG_INT( bool Insetup, const wxChar* ident, int* ptparam,
PARAM_CFG_INT::PARAM_CFG_INT( bool Insetup, const wxString& ident, int* ptparam,
int default_val, int min, int max,
const wxChar* group ) :
PARAM_CFG_BASE( ident, PARAM_INT, group )
@@ -195,7 +195,7 @@ void PARAM_CFG_INT::SaveParam( wxConfigBase* aConfig ) const
}
PARAM_CFG_INT_WITH_SCALE::PARAM_CFG_INT_WITH_SCALE( const wxChar* ident, int* ptparam,
PARAM_CFG_INT_WITH_SCALE::PARAM_CFG_INT_WITH_SCALE( const wxString& ident, int* ptparam,
int default_val, int min, int max,
const wxChar* group, double aBiu2cfgunit ) :
PARAM_CFG_INT( ident, ptparam, default_val, min, max, group )
@@ -206,7 +206,7 @@ PARAM_CFG_INT_WITH_SCALE::PARAM_CFG_INT_WITH_SCALE( const wxChar* ident, int* pt
PARAM_CFG_INT_WITH_SCALE::PARAM_CFG_INT_WITH_SCALE( bool Insetup,
const wxChar* ident, int* ptparam,
const wxString& ident, int* ptparam,
int default_val, int min, int max,
const wxChar* group, double aBiu2cfgunit ) :
PARAM_CFG_INT( Insetup, ident, ptparam, default_val, min, max, group )
@@ -246,7 +246,7 @@ void PARAM_CFG_INT_WITH_SCALE::SaveParam( wxConfigBase* aConfig ) const
}
PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( const wxChar* ident, EDA_COLOR_T* ptparam,
PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( const wxString& ident, EDA_COLOR_T* ptparam,
EDA_COLOR_T default_val,
const wxChar* group ) :
PARAM_CFG_BASE( ident, PARAM_SETCOLOR, group )
@@ -257,7 +257,7 @@ PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( const wxChar* ident, EDA_COLOR_T* ptpara
PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( bool Insetup,
const wxChar* ident,
const wxString& ident,
EDA_COLOR_T* ptparam,
EDA_COLOR_T default_val,
const wxChar* group ) :
@@ -291,7 +291,7 @@ void PARAM_CFG_SETCOLOR::SaveParam( wxConfigBase* aConfig ) const
}
PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE( const wxChar* ident, double* ptparam,
PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE( const wxString& ident, double* ptparam,
double default_val, double min, double max,
const wxChar* group ) :
PARAM_CFG_BASE( ident, PARAM_DOUBLE, group )
@@ -304,7 +304,7 @@ PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE( const wxChar* ident, double* ptparam,
PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE( bool Insetup,
const wxChar* ident,
const wxString& ident,
double* ptparam,
double default_val,
double min,
@@ -348,7 +348,7 @@ void PARAM_CFG_DOUBLE::SaveParam( wxConfigBase* aConfig ) const
}
PARAM_CFG_BOOL::PARAM_CFG_BOOL( const wxChar* ident, bool* ptparam,
PARAM_CFG_BOOL::PARAM_CFG_BOOL( const wxString& ident, bool* ptparam,
int default_val, const wxChar* group ) :
PARAM_CFG_BASE( ident, PARAM_BOOL, group )
{
@@ -358,7 +358,7 @@ PARAM_CFG_BOOL::PARAM_CFG_BOOL( const wxChar* ident, bool* ptparam,
PARAM_CFG_BOOL::PARAM_CFG_BOOL( bool Insetup,
const wxChar* ident,
const wxString& ident,
bool* ptparam,
int default_val,
const wxChar* group ) :
@@ -390,7 +390,7 @@ void PARAM_CFG_BOOL::SaveParam( wxConfigBase* aConfig ) const
}
PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( const wxChar* ident,
PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( const wxString& ident,
wxString* ptparam,
const wxChar* group ) :
PARAM_CFG_BASE( ident, PARAM_WXSTRING, group )
@@ -399,7 +399,7 @@ PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( const wxChar* ident,
}
PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( bool Insetup, const wxChar* ident,
PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( bool Insetup, const wxString& ident,
wxString* ptparam,
const wxString& default_val,
const wxChar* group ) :
@@ -407,7 +407,7 @@ PARAM_CFG_WXSTRING::PARAM_CFG_WXSTRING( bool Insetup, const wxChar* ident,
{
m_Pt_param = ptparam;
m_Setup = Insetup;
m_default = default_val;
m_default = default_val;
}
@@ -429,7 +429,7 @@ void PARAM_CFG_WXSTRING::SaveParam( wxConfigBase* aConfig ) const
}
PARAM_CFG_FILENAME::PARAM_CFG_FILENAME( const wxChar* ident,
PARAM_CFG_FILENAME::PARAM_CFG_FILENAME( const wxString& ident,
wxString* ptparam,
const wxChar* group ) :
PARAM_CFG_BASE( ident, PARAM_FILENAME, group )
+2 -1
View File
@@ -109,7 +109,8 @@ bool DrawPageOnClipboard( EDA_DRAW_FRAME* aFrame )
dc.SetClippingRegion( DrawArea );
}
aFrame->PrintPage( &dc, FULL_LAYERS, false );
const LSET allLayersMask = LSET().set();
aFrame->PrintPage( &dc, allLayersMask, false );
screen->m_IsPrinting = false;
aFrame->GetCanvas()->SetClipBox( tmp );
wxMetafile* mf = dc.Close();
+137 -19
View File
@@ -117,8 +117,12 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent,
m_LastGridSizeId = 0;
m_DrawGrid = true; // hide/Show grid. default = show
m_GridColor = DARKGRAY; // Grid color
m_showPageLimits = false;
m_drawBgColor = BLACK; // the background color of the draw canvas:
// BLACK for Pcbnew, BLACK or WHITE for eeschema
m_snapToGrid = true;
m_MsgFrameHeight = EDA_MSG_PANEL::GetRequiredHeight();
m_movingCursorWithKeyboard = false;
m_auimgr.SetFlags(wxAUI_MGR_DEFAULT|wxAUI_MGR_LIVE_RESIZE);
@@ -327,7 +331,7 @@ void EDA_DRAW_FRAME::ToolOnRightClick( wxCommandEvent& event )
}
void EDA_DRAW_FRAME::PrintPage( wxDC* aDC,LAYER_MSK aPrintMask, bool aPrintMirrorMode, void* aData )
void EDA_DRAW_FRAME::PrintPage( wxDC* aDC, LSET aPrintMask, bool aPrintMirrorMode, void* aData )
{
wxMessageBox( wxT("EDA_DRAW_FRAME::PrintPage() error") );
}
@@ -713,17 +717,18 @@ bool EDA_DRAW_FRAME::HandleBlockBegin( wxDC* aDC, int aKey, const wxPoint& aPosi
case BLOCK_IDLE:
break;
case BLOCK_MOVE: /* Move */
case BLOCK_DRAG: /* Drag */
case BLOCK_COPY: /* Copy */
case BLOCK_DELETE: /* Delete */
case BLOCK_SAVE: /* Save */
case BLOCK_ROTATE: /* Rotate 90 deg */
case BLOCK_FLIP: /* Flip */
case BLOCK_ZOOM: /* Window Zoom */
case BLOCK_MOVE: // Move
case BLOCK_DRAG: // Drag (block defined)
case BLOCK_DRAG_ITEM: // Drag from a drag item command
case BLOCK_COPY: // Copy
case BLOCK_DELETE: // Delete
case BLOCK_SAVE: // Save
case BLOCK_ROTATE: // Rotate 90 deg
case BLOCK_FLIP: // Flip
case BLOCK_ZOOM: // Window Zoom
case BLOCK_MIRROR_X:
case BLOCK_MIRROR_Y: /* mirror */
case BLOCK_PRESELECT_MOVE: /* Move with preselection list*/
case BLOCK_MIRROR_Y: // mirror
case BLOCK_PRESELECT_MOVE: // Move with preselection list
Block->InitData( m_canvas, aPosition );
break;
@@ -732,7 +737,7 @@ bool EDA_DRAW_FRAME::HandleBlockBegin( wxDC* aDC, int aKey, const wxPoint& aPosi
Block->SetLastCursorPosition( wxPoint( 0, 0 ) );
InitBlockPasteInfos();
if( Block->GetCount() == 0 ) /* No data to paste */
if( Block->GetCount() == 0 ) // No data to paste
{
DisplayError( this, wxT( "No Block to paste" ), 20 );
GetScreen()->m_BlockLocate.SetCommand( BLOCK_IDLE );
@@ -767,10 +772,7 @@ bool EDA_DRAW_FRAME::HandleBlockBegin( wxDC* aDC, int aKey, const wxPoint& aPosi
}
// See comment in classpcb.cpp near line 66
//static const double MAX_AXIS = 1518500251;
// However I am not seeing a problem with this size yet:
// I am not seeing a problem with this size yet:
static const double MAX_AXIS = INT_MAX - 100;
#define VIRT_MIN (-MAX_AXIS/2.0) ///< min X or Y coordinate in virtual space
@@ -1029,10 +1031,10 @@ void EDA_DRAW_FRAME::UseGalCanvas( bool aEnable )
m_auimgr.GetPane( wxT( "DrawFrameGal" ) ).Show( aEnable );
m_auimgr.Update();
SetGalCanvasActive( aEnable );
// Reset current tool on switch();
SetToolID( ID_NO_TOOL_SELECTED, wxCURSOR_DEFAULT, wxEmptyString );
if( aEnable )
GetGalCanvas()->SetFocus();
m_galCanvasActive = aEnable;
}
//-----< BASE_SCREEN API moved here >--------------------------------------------
@@ -1110,3 +1112,119 @@ void EDA_DRAW_FRAME::SetScrollCenterPosition( const wxPoint& aPoint )
}
//-----</BASE_SCREEN API moved here >--------------------------------------------
void EDA_DRAW_FRAME::RefreshCrossHair( const wxPoint &aOldPos,
const wxPoint &aEvtPos,
wxDC* aDC )
{
wxPoint newpos = GetCrossHairPosition();
// Redraw the crosshair if it moved
if( aOldPos != newpos )
{
SetCrossHairPosition( aOldPos, false );
m_canvas->CrossHairOff( aDC );
SetCrossHairPosition( newpos, false );
m_canvas->CrossHairOn( aDC );
if( m_canvas->IsMouseCaptured() )
{
#ifdef USE_WX_OVERLAY
wxDCOverlay oDC( m_overlay, (wxWindowDC*)aDC );
oDC.Clear();
m_canvas->CallMouseCapture( aDC, aEvtPos, false );
#else
m_canvas->CallMouseCapture( aDC, aEvtPos, true );
#endif
}
#ifdef USE_WX_OVERLAY
else
{
m_overlay.Reset();
}
#endif
}
}
void EDA_DRAW_FRAME::GeneralControlKeyMovement( int aHotKey, wxPoint *aPos,
bool aSnapToGrid )
{
// If requested snap the current position to the grid
if( aSnapToGrid )
*aPos = GetNearestGridPosition( *aPos );
switch( aHotKey )
{
// All these keys have almost the same treatment
case GR_KB_CTRL | WXK_NUMPAD8: case GR_KB_CTRL | WXK_UP:
case GR_KB_CTRL | WXK_NUMPAD2: case GR_KB_CTRL | WXK_DOWN:
case GR_KB_CTRL | WXK_NUMPAD4: case GR_KB_CTRL | WXK_LEFT:
case GR_KB_CTRL | WXK_NUMPAD6: case GR_KB_CTRL | WXK_RIGHT:
case WXK_NUMPAD8: case WXK_UP: case WXK_NUMPAD2: case WXK_DOWN:
case WXK_NUMPAD4: case WXK_LEFT: case WXK_NUMPAD6: case WXK_RIGHT:
{
/* Here's a tricky part: when doing cursor key movement, the
* 'previous' point should be taken from memory, *not* from the
* freshly computed position in the event. Otherwise you can't do
* sub-pixel movement. The m_movingCursorWithKeyboard oneshot 'eats'
* the automatic motion event generated by cursor warping */
wxRealPoint gridSize = GetScreen()->GetGridSize();
*aPos = GetCrossHairPosition();
// Bonus: ^key moves faster (x10)
switch( aHotKey )
{
case GR_KB_CTRL|WXK_NUMPAD8:
case GR_KB_CTRL|WXK_UP:
aPos->y -= KiROUND( 10 * gridSize.y );
break;
case GR_KB_CTRL|WXK_NUMPAD2:
case GR_KB_CTRL|WXK_DOWN:
aPos->y += KiROUND( 10 * gridSize.y );
break;
case GR_KB_CTRL|WXK_NUMPAD4:
case GR_KB_CTRL|WXK_LEFT:
aPos->x -= KiROUND( 10 * gridSize.x );
break;
case GR_KB_CTRL|WXK_NUMPAD6:
case GR_KB_CTRL|WXK_RIGHT:
aPos->x += KiROUND( 10 * gridSize.x );
break;
case WXK_NUMPAD8:
case WXK_UP:
aPos->y -= KiROUND( gridSize.y );
break;
case WXK_NUMPAD2:
case WXK_DOWN:
aPos->y += KiROUND( gridSize.y );
break;
case WXK_NUMPAD4:
case WXK_LEFT:
aPos->x -= KiROUND( gridSize.x );
break;
case WXK_NUMPAD6:
case WXK_RIGHT:
aPos->x += KiROUND( gridSize.x );
break;
default: /* Can't happen since we entered the statement */
break;
}
m_canvas->MoveCursor( *aPos );
m_movingCursorWithKeyboard = true;
}
break;
default:
break;
}
}
+26 -14
View File
@@ -103,7 +103,7 @@ EDA_DRAW_PANEL::EDA_DRAW_PANEL( EDA_DRAW_FRAME* parent, int id,
m_scrollIncrementX = std::min( size.x / 8, 10 );
m_scrollIncrementY = std::min( size.y / 8, 10 );
SetBackgroundColour( MakeColour( g_DrawBgColor ) );
SetBackgroundColour( MakeColour( parent->GetDrawBgColor() ) );
#if KICAD_USE_BUFFERED_DC || KICAD_USE_BUFFERED_PAINTDC
SetBackgroundStyle( wxBG_STYLE_CUSTOM );
@@ -114,7 +114,7 @@ EDA_DRAW_PANEL::EDA_DRAW_PANEL( EDA_DRAW_FRAME* parent, int id,
m_ClipBox.SetY( 0 );
m_canStartBlock = -1; // Command block can start if >= 0
m_abortRequest = false;
m_enableMiddleButtonPan = false;
m_enableMiddleButtonPan = true;
m_enableZoomNoCenter = false;
m_panScrollbarLimits = false;
m_enableAutoPan = true;
@@ -128,7 +128,7 @@ EDA_DRAW_PANEL::EDA_DRAW_PANEL( EDA_DRAW_FRAME* parent, int id,
if( cfg )
{
cfg->Read( ENBL_MIDDLE_BUTT_PAN_KEY, &m_enableMiddleButtonPan, false );
cfg->Read( ENBL_MIDDLE_BUTT_PAN_KEY, &m_enableMiddleButtonPan, true );
cfg->Read( ENBL_ZOOM_NO_CENTER_KEY, &m_enableZoomNoCenter, false );
cfg->Read( MIDDLE_BUTT_PAN_LIMITED_KEY, &m_panScrollbarLimits, false );
cfg->Read( ENBL_AUTO_PAN_KEY, &m_enableAutoPan, true );
@@ -389,12 +389,10 @@ void EDA_DRAW_PANEL::OnActivate( wxActivateEvent& event )
void EDA_DRAW_PANEL::OnScroll( wxScrollWinEvent& event )
{
int id = event.GetEventType();
int dir;
int x, y;
int ppux, ppuy;
int csizeX, csizeY;
int unitsX, unitsY;
int maxX, maxY;
GetViewStart( &x, &y );
GetScrollPixelsPerUnit( &ppux, &ppuy );
@@ -410,10 +408,18 @@ void EDA_DRAW_PANEL::OnScroll( wxScrollWinEvent& event )
unitsX /= ppux;
unitsY /= ppuy;
maxX = unitsX - csizeX;
maxY = unitsY - csizeY;
int dir = event.GetOrientation(); // wxHORIZONTAL or wxVERTICAL
dir = event.GetOrientation(); // wxHORIZONTAL or wxVERTICAL
// On windows and on wxWidgets >= 2.9.5 and < 3.1,
// there is a bug in mousewheel event which always generates 2 scroll events
// (should be the case only for the default mousewheel event)
// with id = wxEVT_SCROLLWIN_LINEUP or wxEVT_SCROLLWIN_LINEDOWN
// so we skip these events.
// Note they are here just in case, because they are not actually used
// in Kicad
#if wxCHECK_VERSION( 3, 1, 0 ) || !wxCHECK_VERSION( 2, 9, 5 ) || !defined (__WINDOWS__)
int maxX = unitsX - csizeX;
int maxY = unitsY - csizeY;
if( id == wxEVT_SCROLLWIN_LINEUP )
{
@@ -448,7 +454,9 @@ void EDA_DRAW_PANEL::OnScroll( wxScrollWinEvent& event )
y = maxY;
}
}
else if( id == wxEVT_SCROLLWIN_THUMBTRACK )
else
#endif
if( id == wxEVT_SCROLLWIN_THUMBTRACK )
{
if( dir == wxHORIZONTAL )
x = event.GetPosition();
@@ -528,9 +536,11 @@ void EDA_DRAW_PANEL::EraseScreen( wxDC* DC )
{
GRSetDrawMode( DC, GR_COPY );
EDA_COLOR_T bgColor = GetParent()->GetDrawBgColor();
GRSFilledRect( NULL, DC, m_ClipBox.GetX(), m_ClipBox.GetY(),
m_ClipBox.GetRight(), m_ClipBox.GetBottom(),
0, g_DrawBgColor, g_DrawBgColor );
0, bgColor, bgColor );
// Set to one (1) to draw bounding box validate bounding box calculation.
#if DEBUG_SHOW_CLIP_RECT
@@ -583,10 +593,12 @@ void EDA_DRAW_PANEL::ReDraw( wxDC* DC, bool erasebg )
if( Screen == NULL )
return;
if( ( g_DrawBgColor != WHITE ) && ( g_DrawBgColor != BLACK ) )
g_DrawBgColor = BLACK;
EDA_COLOR_T bgColor = GetParent()->GetDrawBgColor();
if( g_DrawBgColor == WHITE )
if( ( bgColor != WHITE ) && ( bgColor != BLACK ) )
bgColor = BLACK;
if( bgColor == WHITE )
{
g_XorMode = GR_NXOR;
g_GhostColor = BLACK;
@@ -599,7 +611,7 @@ void EDA_DRAW_PANEL::ReDraw( wxDC* DC, bool erasebg )
GRResetPenAndBrush( DC );
DC->SetBackground( g_DrawBgColor == BLACK ? *wxBLACK_BRUSH : *wxWHITE_BRUSH );
DC->SetBackground( bgColor == BLACK ? *wxBLACK_BRUSH : *wxWHITE_BRUSH );
DC->SetBackgroundMode( wxSOLID );
if( erasebg )
+88 -36
View File
@@ -41,6 +41,8 @@
#include <tool/tool_dispatcher.h>
#include <tool/tool_manager.h>
#include <boost/foreach.hpp>
#ifdef __WXDEBUG__
#include <profile.h>
#endif /* __WXDEBUG__ */
@@ -50,8 +52,9 @@ EDA_DRAW_PANEL_GAL::EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWin
GalType aGalType ) :
wxWindow( aParentWindow, aWindowId, aPosition, aSize )
{
m_parent = aParentWindow;
m_gal = NULL;
m_currentGal = GAL_TYPE_NONE;
m_backend = GAL_TYPE_NONE;
m_view = NULL;
m_painter = NULL;
m_eventDispatcher = NULL;
@@ -67,33 +70,28 @@ EDA_DRAW_PANEL_GAL::EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWin
m_viewControls = new KIGFX::WX_VIEW_CONTROLS( m_view, this );
Connect( wxEVT_SIZE, wxSizeEventHandler( EDA_DRAW_PANEL_GAL::onSize ), NULL, this );
Connect( wxEVT_SIZE, wxSizeEventHandler( EDA_DRAW_PANEL_GAL::onSize ), NULL, this );
Connect( wxEVT_ENTER_WINDOW, wxEventHandler( EDA_DRAW_PANEL_GAL::onEnter ), NULL, this );
/* Generic events for the Tool Dispatcher */
Connect( wxEVT_MOTION, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_LEFT_UP, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_LEFT_DOWN, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_LEFT_DCLICK, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_RIGHT_UP, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_RIGHT_DOWN, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_RIGHT_DCLICK, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_MIDDLE_UP, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_MIDDLE_DOWN, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_MIDDLE_DCLICK, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_MOUSEWHEEL, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_CHAR_HOOK, wxEventHandler( EDA_DRAW_PANEL_GAL::skipEvent ) );
Connect( wxEVT_CHAR, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_ENTER_WINDOW, wxEventHandler( EDA_DRAW_PANEL_GAL::onEnter ), NULL, this );
Connect( KIGFX::WX_VIEW_CONTROLS::EVT_REFRESH_MOUSE,
wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
const wxEventType events[] =
{
wxEVT_LEFT_UP, wxEVT_LEFT_DOWN, wxEVT_LEFT_DCLICK,
wxEVT_RIGHT_UP, wxEVT_RIGHT_DOWN, wxEVT_RIGHT_DCLICK,
wxEVT_MIDDLE_UP, wxEVT_MIDDLE_DOWN, wxEVT_MIDDLE_DCLICK,
wxEVT_MOTION, wxEVT_MOUSEWHEEL, wxEVT_CHAR, KIGFX::WX_VIEW_CONTROLS::EVT_REFRESH_MOUSE
};
BOOST_FOREACH( wxEventType eventType, events )
{
Connect( eventType, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ),
NULL, m_eventDispatcher );
}
// Set up timer that prevents too frequent redraw commands
m_refreshTimer.SetOwner( this );
m_pendingRefresh = false;
m_drawing = false;
Connect( wxEVT_TIMER, wxTimerEventHandler( EDA_DRAW_PANEL_GAL::onRefreshTimer ), NULL, this );
this->SetFocus();
}
@@ -160,7 +158,7 @@ void EDA_DRAW_PANEL_GAL::onRefreshTimer( wxTimerEvent& aEvent )
}
void EDA_DRAW_PANEL_GAL::Refresh( bool eraseBackground, const wxRect* rect )
void EDA_DRAW_PANEL_GAL::Refresh( bool aEraseBackground, const wxRect* aRect )
{
if( m_pendingRefresh )
return;
@@ -183,6 +181,50 @@ void EDA_DRAW_PANEL_GAL::Refresh( bool eraseBackground, const wxRect* rect )
}
void EDA_DRAW_PANEL_GAL::SetEventDispatcher( TOOL_DISPATCHER* aEventDispatcher )
{
m_eventDispatcher = aEventDispatcher;
#if wxCHECK_VERSION( 3, 0, 0 )
if( m_eventDispatcher )
{
m_parent->Connect( wxEVT_TOOL,
wxCommandEventHandler( TOOL_DISPATCHER::DispatchWxCommand ),
NULL, m_eventDispatcher );
}
else
{
// While loops are used to be sure, that we are removing all event handlers
while( m_parent->Disconnect( wxEVT_TOOL,
wxCommandEventHandler( TOOL_DISPATCHER::DispatchWxCommand ),
NULL, m_eventDispatcher ) );
}
#else
if( m_eventDispatcher )
{
m_parent->Connect( wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler( TOOL_DISPATCHER::DispatchWxCommand ),
NULL, m_eventDispatcher );
m_parent->Connect( wxEVT_COMMAND_TOOL_CLICKED,
wxCommandEventHandler( TOOL_DISPATCHER::DispatchWxCommand ),
NULL, m_eventDispatcher );
}
else
{
// While loops are used to be sure, that we are removing all event handlers
while( m_parent->Disconnect( wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler( TOOL_DISPATCHER::DispatchWxCommand ),
NULL, m_eventDispatcher ) );
while( m_parent->Disconnect( wxEVT_COMMAND_TOOL_CLICKED,
wxCommandEventHandler( TOOL_DISPATCHER::DispatchWxCommand ),
NULL, m_eventDispatcher ) );
}
#endif
}
void EDA_DRAW_PANEL_GAL::StartDrawing()
{
m_pendingRefresh = false;
@@ -201,10 +243,32 @@ void EDA_DRAW_PANEL_GAL::StopDrawing()
}
void EDA_DRAW_PANEL_GAL::SetHighContrastLayer( LAYER_ID aLayer )
{
// Set display settings for high contrast mode
KIGFX::RENDER_SETTINGS* rSettings = m_view->GetPainter()->GetSettings();
SetTopLayer( aLayer );
rSettings->ClearActiveLayers();
rSettings->SetActiveLayer( aLayer );
m_view->UpdateAllLayersColor();
}
void EDA_DRAW_PANEL_GAL::SetTopLayer( LAYER_ID aLayer )
{
m_view->ClearTopLayers();
m_view->SetTopLayer( aLayer );
m_view->UpdateAllLayersOrder();
}
void EDA_DRAW_PANEL_GAL::SwitchBackend( GalType aGalType )
{
// Do not do anything if the currently used GAL is correct
if( aGalType == m_currentGal && m_gal != NULL )
if( aGalType == m_backend && m_gal != NULL )
return;
// Prevent refreshing canvas during backend switch
@@ -235,21 +299,16 @@ void EDA_DRAW_PANEL_GAL::SwitchBackend( GalType aGalType )
if( m_view )
m_view->SetGAL( m_gal );
m_currentGal = aGalType;
m_backend = aGalType;
}
void EDA_DRAW_PANEL_GAL::onEvent( wxEvent& aEvent )
{
if( !m_eventDispatcher )
{
aEvent.Skip();
return;
}
else
{
m_eventDispatcher->DispatchWxEvent( aEvent );
}
Refresh();
}
@@ -260,10 +319,3 @@ void EDA_DRAW_PANEL_GAL::onEnter( wxEvent& aEvent )
// Getting focus is necessary in order to receive key events properly
SetFocus();
}
void EDA_DRAW_PANEL_GAL::skipEvent( wxEvent& aEvent )
{
// This is necessary for CHAR_HOOK event to generate KEY_UP and KEY_DOWN events
aEvent.Skip();
}
+17 -1
View File
@@ -36,6 +36,8 @@
//#define STANDALONE 1 // enable this for stand alone testing.
#define FMT_CLIPBOARD _( "clipboard" )
//-----<DSNLEXER>-------------------------------------------------------------
@@ -89,7 +91,7 @@ DSNLEXER::DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount,
keywordCount( aKeywordCount )
{
STRING_LINE_READER* stringReader = new STRING_LINE_READER( aClipboardTxt, aSource.IsEmpty() ?
wxString( _( "clipboard" ) ) : aSource );
wxString( FMT_CLIPBOARD ) : aSource );
PushReader( stringReader );
init();
}
@@ -107,6 +109,20 @@ DSNLEXER::DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount,
}
static const KEYWORD empty_keywords[1] = {};
DSNLEXER::DSNLEXER( const std::string& aSExpression, const wxString& aSource ) :
iOwnReaders( true ),
keywords( empty_keywords ),
keywordCount( 0 )
{
STRING_LINE_READER* stringReader = new STRING_LINE_READER( aSExpression, aSource.IsEmpty() ?
wxString( FMT_CLIPBOARD ) : aSource );
PushReader( stringReader );
init();
}
DSNLEXER::~DSNLEXER()
{
if( iOwnReaders )
+3
View File
@@ -55,6 +55,9 @@ void CAIRO_COMPOSITOR::Resize( unsigned int aWidth, unsigned int aHeight )
{
clean();
assert( aWidth > 0 );
assert( aHeight > 0 );
m_width = aWidth;
m_height = aHeight;
+16
View File
@@ -75,6 +75,9 @@ CAIRO_GAL::CAIRO_GAL( wxWindow* aParent, wxEvtHandler* aMouseListener,
SetSize( aParent->GetSize() );
screenSize = VECTOR2I( aParent->GetSize() );
cursorPixels = NULL;
cursorPixelsSaved = NULL;
initCursor();
// Grid color settings are different in Cairo and OpenGL
@@ -808,6 +811,13 @@ void CAIRO_GAL::ClearTarget( RENDER_TARGET aTarget )
}
void CAIRO_GAL::SetCursorSize( unsigned int aCursorSize )
{
GAL::SetCursorSize( aCursorSize );
initCursor();
}
void CAIRO_GAL::DrawCursor( const VECTOR2D& aCursorPosition )
{
// Now we should only store the position of the mouse cursor
@@ -890,6 +900,12 @@ void CAIRO_GAL::skipMouseEvent( wxMouseEvent& aEvent )
void CAIRO_GAL::initCursor()
{
if( cursorPixels )
delete cursorPixels;
if( cursorPixelsSaved )
delete cursorPixelsSaved;
cursorPixels = new wxBitmap( cursorSize, cursorSize );
cursorPixelsSaved = new wxBitmap( cursorSize, cursorSize );
+4 -7
View File
@@ -134,9 +134,6 @@ void GAL::DrawGrid()
// Draw the grid
// For the drawing the start points, end points and increments have
// to be calculated in world coordinates
gridOffset = VECTOR2D( (long) gridOrigin.x % (long) gridSize.x,
(long) gridOrigin.y % (long) gridSize.y );
VECTOR2D worldStartPoint = screenWorldMatrix * VECTOR2D( 0.0, 0.0 );
VECTOR2D worldEndPoint = screenWorldMatrix * VECTOR2D( screenSize );
@@ -160,10 +157,10 @@ void GAL::DrawGrid()
assert( gridEndY >= gridStartY );
// Correct the index, else some lines are not correctly painted
gridStartX -= ( gridOrigin.x / gridSize.x ) + 1;
gridStartY -= ( gridOrigin.y / gridSize.y ) + 1;
gridEndX += ( gridOrigin.x / gridSize.x ) + 1;
gridEndY += ( gridOrigin.y / gridSize.y ) + 1;
gridStartX -= abs( gridOrigin.x / gridSize.x ) + 1;
gridStartY -= abs( gridOrigin.y / gridSize.y ) + 1;
gridEndX += abs( gridOrigin.x / gridSize.x ) + 1;
gridEndY += abs( gridOrigin.y / gridSize.y ) + 1;
// Draw the grid behind all other layers
SetLayerDepth( depthRange.y * 0.75 );
+23 -28
View File
@@ -35,7 +35,7 @@
using namespace KIGFX;
OPENGL_COMPOSITOR::OPENGL_COMPOSITOR() :
m_initialized( false ), m_current( 0 )
m_initialized( false ), m_current( 0 ), m_currentFbo( DIRECT_RENDERING )
{
}
@@ -52,9 +52,6 @@ void OPENGL_COMPOSITOR::Initialize()
if( m_initialized )
return;
// Get the maximum number of buffers
glGetIntegerv( GL_MAX_COLOR_ATTACHMENTS, (GLint*) &m_maxBuffers );
// We need framebuffer objects for drawing the screen contents
// Generate framebuffer and a depth buffer
glGenFramebuffersEXT( 1, &m_framebuffer );
@@ -68,15 +65,13 @@ void OPENGL_COMPOSITOR::Initialize()
// Use here a size of 24 bits for the depth buffer, 8 bits for the stencil buffer
// this is required later for anti-aliasing
glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_STENCIL, m_width, m_height );
glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, m_width, m_height );
glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER_EXT, m_depthBuffer );
glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT,
GL_RENDERBUFFER_EXT, m_depthBuffer );
GL_RENDERBUFFER_EXT, m_depthBuffer );
// Unbind the framebuffer, so by default all the rendering goes directly to the display
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, DIRECT_RENDERING );
m_currentFbo = 0;
m_currentFbo = DIRECT_RENDERING;
m_initialized = true;
}
@@ -96,7 +91,12 @@ unsigned int OPENGL_COMPOSITOR::CreateBuffer()
{
wxASSERT( m_initialized );
if( usedBuffers() >= m_maxBuffers )
unsigned int maxBuffers;
// Get the maximum number of buffers
glGetIntegerv( GL_MAX_COLOR_ATTACHMENTS, (GLint*) &maxBuffers );
if( usedBuffers() >= maxBuffers )
{
DisplayError( NULL, wxT( "Cannot create more framebuffers. OpenGL rendering "
"backend requires at least 3 framebuffers. You may try to update/change "
@@ -114,7 +114,7 @@ unsigned int OPENGL_COMPOSITOR::CreateBuffer()
// Set texture parameters
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, m_width, m_height, 0, GL_RGBA,
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, m_width, m_height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, NULL );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
@@ -122,7 +122,8 @@ unsigned int OPENGL_COMPOSITOR::CreateBuffer()
// Bind the texture to the specific attachment point, clear and rebind the screen
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_framebuffer );
m_currentFbo = m_framebuffer;
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, attachmentPoint, GL_TEXTURE_2D, textureTarget, 0 );
glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, attachmentPoint,
GL_TEXTURE_2D, textureTarget, 0 );
// Check the status, exit if the framebuffer can't be created
GLenum status = glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT );
@@ -132,7 +133,7 @@ unsigned int OPENGL_COMPOSITOR::CreateBuffer()
switch( status )
{
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
DisplayError( NULL, wxT( "Cannot create the framebuffer." ) );
DisplayError( NULL,wxT( "Cannot create the framebuffer." ) );
break;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
@@ -141,7 +142,7 @@ unsigned int OPENGL_COMPOSITOR::CreateBuffer()
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
DisplayError( NULL, wxT( "The framebuffer does not have at least "
"one image attached to it." ) );
"one image attached to it." ) );
break;
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
@@ -150,12 +151,12 @@ unsigned int OPENGL_COMPOSITOR::CreateBuffer()
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
DisplayError( NULL, wxT( "The combination of internal formats of the attached images "
"violates an implementation-dependent set of restrictions." ) );
"violates an implementation-dependent set of restrictions." ) );
break;
case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT:
DisplayError( NULL, wxT( "GL_RENDERBUFFER_SAMPLES is not the same "
"for all attached renderbuffers" ) );
"for all attached renderbuffers" ) );
break;
case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT:
@@ -192,7 +193,6 @@ void OPENGL_COMPOSITOR::SetBuffer( unsigned int aBufferHandle )
// Change the rendering destination to the selected attachment point
if( aBufferHandle == DIRECT_RENDERING )
{
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, DIRECT_RENDERING );
m_currentFbo = DIRECT_RENDERING;
}
else if( m_currentFbo != m_framebuffer )
@@ -221,12 +221,7 @@ void OPENGL_COMPOSITOR::ClearBuffer()
void OPENGL_COMPOSITOR::DrawBuffer( unsigned int aBufferHandle )
{
wxASSERT( m_initialized );
if( aBufferHandle == 0 || aBufferHandle > usedBuffers() )
{
DisplayError( NULL, wxT( "Wrong framebuffer handle" ) );
return;
}
wxASSERT( aBufferHandle != 0 && aBufferHandle <= usedBuffers() );
// Switch to the main framebuffer and blit the scene
glBindFramebufferEXT( GL_FRAMEBUFFER, DIRECT_RENDERING );
@@ -274,8 +269,8 @@ void OPENGL_COMPOSITOR::clean()
{
wxASSERT( m_initialized );
glDeleteFramebuffersEXT( 1, &m_framebuffer );
glDeleteRenderbuffersEXT( 1, &m_depthBuffer );
glBindFramebufferEXT( GL_FRAMEBUFFER, DIRECT_RENDERING );
m_currentFbo = DIRECT_RENDERING;
OPENGL_BUFFERS::const_iterator it;
@@ -286,8 +281,8 @@ void OPENGL_COMPOSITOR::clean()
m_buffers.clear();
glDeleteFramebuffersEXT( 1, &m_framebuffer );
glDeleteRenderbuffersEXT( 1, &m_depthBuffer );
m_initialized = false;
}
GLuint OPENGL_COMPOSITOR::m_currentFbo = DIRECT_RENDERING;
+14 -13
View File
@@ -45,6 +45,8 @@ void InitTesselatorCallbacks( GLUtesselator* aTesselator );
const int glAttributes[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0 };
wxGLContext* OPENGL_GAL::glContext = NULL;
OPENGL_GAL::OPENGL_GAL( wxWindow* aParent, wxEvtHandler* aMouseListener,
wxEvtHandler* aPaintListener, const wxString& aName ) :
wxGLCanvas( aParent, wxID_ANY, (int*) glAttributes, wxDefaultPosition, wxDefaultSize,
@@ -54,7 +56,9 @@ OPENGL_GAL::OPENGL_GAL( wxWindow* aParent, wxEvtHandler* aMouseListener,
overlayManager( false )
{
// Create the OpenGL-Context
glContext = new wxGLContext( this );
if( glContext == NULL )
glContext = new wxGLContext( this );
parentWindow = aParent;
mouseListener = aMouseListener;
paintListener = aPaintListener;
@@ -113,8 +117,6 @@ OPENGL_GAL::~OPENGL_GAL()
gluDeleteTess( tesselator );
ClearCache();
delete glContext;
}
@@ -128,17 +130,16 @@ void OPENGL_GAL::BeginDrawing()
if( !isGlewInitialized )
initGlew();
// Set up the view port
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glViewport( 0, 0, (GLsizei) screenSize.x, (GLsizei) screenSize.y );
// Create the screen transformation
glOrtho( 0, (GLint) screenSize.x, 0, (GLsizei) screenSize.y, -depthRange.x, -depthRange.y );
if( !isFramebufferInitialized )
{
// Set up the view port
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glViewport( 0, 0, (GLsizei) screenSize.x, (GLsizei) screenSize.y );
// Create the screen transformation
glOrtho( 0, (GLint) screenSize.x, 0, (GLsizei) screenSize.y,
-depthRange.x, -depthRange.y );
// Prepare rendering target buffers
compositor.Initialize();
mainBuffer = compositor.CreateBuffer();
@@ -967,7 +968,7 @@ void OPENGL_GAL::initGlew()
exit( 1 );
}
// Vertex buffer have to be supported
// Vertex buffer has to be supported
if( !GLEW_ARB_vertex_buffer_object )
{
DisplayError( parentWindow, wxT( "Vertex buffer objects are not supported!" ) );
+5 -2
View File
@@ -31,7 +31,8 @@
#include <gal/opengl/cached_container.h>
#include <gal/opengl/noncached_container.h>
#include <gal/opengl/shader.h>
#include <wx/log.h>
#include <cstdlib>
#include <cstring>
using namespace KIGFX;
@@ -45,9 +46,11 @@ VERTEX_CONTAINER* VERTEX_CONTAINER::MakeContainer( bool aCached )
VERTEX_CONTAINER::VERTEX_CONTAINER( unsigned int aSize ) :
m_freeSpace( aSize ), m_currentSize( aSize ), m_initialSize( aSize ), m_failed( false )
m_freeSpace( aSize ), m_currentSize( aSize ), m_initialSize( aSize ),
m_failed( false ), m_dirty( true )
{
m_vertices = static_cast<VERTEX*>( malloc( aSize * sizeof( VERTEX ) ) );
memset( m_vertices, 0x00, aSize * sizeof( VERTEX ) );
}
+5 -1
View File
@@ -40,7 +40,8 @@ STROKE_FONT::STROKE_FONT( GAL* aGal ) :
m_gal( aGal ),
m_bold( false ),
m_italic( false ),
m_mirrored( false )
m_mirrored( false ),
m_overbar( false )
{
// Default values
m_glyphSize = VECTOR2D( 10.0, 10.0 );
@@ -149,6 +150,9 @@ BOX2D STROKE_FONT::computeBoundingBox( const GLYPH& aGLYPH, const VECTOR2D& aGLY
void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRotationAngle )
{
if( aText.empty() )
return;
// Context needs to be saved before any transformations
m_gal->Save();
+4 -7
View File
@@ -47,9 +47,6 @@ static const bool NOT_FILLED = false;
// For draw mode = XOR GR_XOR or GR_NXOR by background color
GR_DRAWMODE g_XorMode = GR_NXOR;
// Background color of the design frame
EDA_COLOR_T g_DrawBgColor = WHITE;
static void ClipAndDrawPoly( EDA_RECT * ClipBox, wxDC * DC, wxPoint Points[],
int n );
@@ -81,7 +78,7 @@ static wxDC* s_DC_lastDC = NULL;
/***
* Utility for the line clipping code, returns the boundary code of
* a point. Bit allocation is arbitrary
* a point. Bit allocation is arbitrary
*/
static inline int clipOutCode( const EDA_RECT *aClipBox, int x, int y )
{
@@ -124,7 +121,7 @@ static bool clipLine( const EDA_RECT *aClipBox, int &x1, int &y1, int &x2, int &
// Fast reject
if( outcode1 & outcode2 )
return true;
// Choose a side to clip
int thisoutcode, x, y;
if( outcode1 )
@@ -140,12 +137,12 @@ static bool clipLine( const EDA_RECT *aClipBox, int &x1, int &y1, int &x2, int &
{
y = aClipBox->GetBottom();
x = x1 + (x2 - x1) * int64_t(y - y1) / (y2 - y1);
}
}
else if( thisoutcode & 2 ) // Clip the top
{
y = aClipBox->GetY();
x = x1 + (x2 - x1) * int64_t(y - y1) / (y2 - y1);
}
}
else if( thisoutcode & 8 ) // Clip the right
{
x = aClipBox->GetRight();
-23
View File
@@ -31,12 +31,6 @@
#include <pgm_base.h>
#include <common.h>
#include <gr_basic.h>
static const wxChar showPageLimitsKey[] = wxT( "ShowPageLimits" );
static const wxChar backgroundColorKey[] = wxT( "BackgroundColor" );
/// Initialize aDst SEARCH_STACK with KIFACE (DSO) specific settings.
/// A non-member function so it an be moved easily, plus it's nobody's business.
@@ -97,24 +91,7 @@ static void setSearchPaths( SEARCH_STACK* aDst, KIWAY::FACE_T aId )
bool KIFACE_I::start_common( int aCtlBits )
{
m_start_flags = aCtlBits;
m_bm.Init();
m_bm.m_config->Read( showPageLimitsKey, &g_ShowPageLimits );
// FIXME OSX Mountain Lion (10.8)
// Seems that Read doesn't found anything and ColorFromInt
// Asserts - I'm unable to reproduce on 10.7
int draw_bg_color = BLACK; // Default for all apps but Eeschema
if( m_id == KIWAY::FACE_SCH )
draw_bg_color = WHITE; // Default for Eeschema
m_bm.m_config->Read( backgroundColorKey, &draw_bg_color );
g_DrawBgColor = ColorFromInt( draw_bg_color );
setSearchPaths( &m_bm.m_search, m_id );
return true;
+2 -2
View File
@@ -74,7 +74,7 @@ void KIWAY::player_destroy_handler( wxWindowDestroyEvent& event )
}
}
// event.Skip(); skip to who, the wxApp? I'm the top window.
event.Skip(); // skip to who, the wxApp? I'm the top window.
}
@@ -157,7 +157,7 @@ KIFACE* KIWAY::KiFACE( FACE_T aFaceId, bool doLoad )
void* addr = NULL;
if( !dso.Load( dname, wxDL_VERBATIM | wxDL_NOW ) )
if( !dso.Load( dname, wxDL_VERBATIM | wxDL_NOW | wxDL_GLOBAL ) )
{
// Failure: error reporting UI was done via wxLogSysError().
// No further reporting required here.
+654
View File
@@ -0,0 +1,654 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdarg.h>
#include <assert.h>
#include <layers_id_colors_and_visibility.h>
#include <class_board.h>
LSET::LSET( const LAYER_ID* aArray, unsigned aCount ) :
BASE_SET()
{
for( unsigned i=0; i<aCount; ++i )
set( aArray[i] );
}
LSET::LSET( unsigned aIdCount, LAYER_ID aFirst, ... ) :
BASE_SET()
{
// The constructor, without the mandatory aFirst argument, could have been confused
// by the compiler with the LSET( LAYER_ID ). With aFirst, that ambiguity is not
// present. Therefore aIdCount must always be >=1.
wxASSERT_MSG( aIdCount > 0, wxT( "aIdCount must be >= 1" ) );
set( aFirst );
if( --aIdCount )
{
va_list ap;
va_start( ap, aFirst );
for( unsigned i=0; i<aIdCount; ++i )
{
LAYER_ID id = (LAYER_ID) va_arg( ap, int );
// printf( "%s: id:%d LAYER_ID_COUNT:%d\n", __func__, id, LAYER_ID_COUNT );
assert( unsigned( id ) < LAYER_ID_COUNT );
set( id );
}
va_end( ap );
}
}
const wxChar* LSET::Name( LAYER_ID aLayerId )
{
const wxChar* txt;
// using a switch to explicitly show the mapping more clearly
switch( aLayerId )
{
case F_Cu: txt = wxT( "F.Cu" ); break;
case In1_Cu: txt = wxT( "In1.Cu" ); break;
case In2_Cu: txt = wxT( "In2.Cu" ); break;
case In3_Cu: txt = wxT( "In3.Cu" ); break;
case In4_Cu: txt = wxT( "In4.Cu" ); break;
case In5_Cu: txt = wxT( "In5.Cu" ); break;
case In6_Cu: txt = wxT( "In6.Cu" ); break;
case In7_Cu: txt = wxT( "In7.Cu" ); break;
case In8_Cu: txt = wxT( "In8.Cu" ); break;
case In9_Cu: txt = wxT( "In9.Cu" ); break;
case In10_Cu: txt = wxT( "In10.Cu" ); break;
case In11_Cu: txt = wxT( "In11.Cu" ); break;
case In12_Cu: txt = wxT( "In12.Cu" ); break;
case In13_Cu: txt = wxT( "In13.Cu" ); break;
case In14_Cu: txt = wxT( "In14.Cu" ); break;
case In15_Cu: txt = wxT( "In15.Cu" ); break;
case In16_Cu: txt = wxT( "In16.Cu" ); break;
case In17_Cu: txt = wxT( "In17.Cu" ); break;
case In18_Cu: txt = wxT( "In18.Cu" ); break;
case In19_Cu: txt = wxT( "In19.Cu" ); break;
case In20_Cu: txt = wxT( "In20.Cu" ); break;
case In21_Cu: txt = wxT( "In21.Cu" ); break;
case In22_Cu: txt = wxT( "In22.Cu" ); break;
case In23_Cu: txt = wxT( "In23.Cu" ); break;
case In24_Cu: txt = wxT( "In24.Cu" ); break;
case In25_Cu: txt = wxT( "In25.Cu" ); break;
case In26_Cu: txt = wxT( "In26.Cu" ); break;
case In27_Cu: txt = wxT( "In27.Cu" ); break;
case In28_Cu: txt = wxT( "In28.Cu" ); break;
case In29_Cu: txt = wxT( "In29.Cu" ); break;
case In30_Cu: txt = wxT( "In30.Cu" ); break;
case B_Cu: txt = wxT( "B.Cu" ); break;
// Technicals
case B_Adhes: txt = wxT( "B.Adhes" ); break;
case F_Adhes: txt = wxT( "F.Adhes" ); break;
case B_Paste: txt = wxT( "B.Paste" ); break;
case F_Paste: txt = wxT( "F.Paste" ); break;
case B_SilkS: txt = wxT( "B.SilkS" ); break;
case F_SilkS: txt = wxT( "F.SilkS" ); break;
case B_Mask: txt = wxT( "B.Mask" ); break;
case F_Mask: txt = wxT( "F.Mask" ); break;
// Users
case Dwgs_User: txt = wxT( "Dwgs.User" ); break;
case Cmts_User: txt = wxT( "Cmts.User" ); break;
case Eco1_User: txt = wxT( "Eco1.User" ); break;
case Eco2_User: txt = wxT( "Eco2.User" ); break;
case Edge_Cuts: txt = wxT( "Edge.Cuts" ); break;
case Margin: txt = wxT( "Margin" ); break;
// Footprint
case F_CrtYd: txt = wxT( "F.CrtYd" ); break;
case B_CrtYd: txt = wxT( "B.CrtYd" ); break;
case F_Fab: txt = wxT( "F.Fab" ); break;
case B_Fab: txt = wxT( "B.Fab" ); break;
default:
wxASSERT_MSG( 0, wxT( "aLayerId out of range" ) );
txt = wxT( "BAD INDEX!" ); break;
}
return txt;
}
LSEQ LSET::CuStack() const
{
// desired sequence
static const LAYER_ID sequence[] = {
F_Cu,
In1_Cu,
In2_Cu,
In3_Cu,
In4_Cu,
In5_Cu,
In6_Cu,
In7_Cu,
In8_Cu,
In9_Cu,
In10_Cu,
In11_Cu,
In12_Cu,
In13_Cu,
In14_Cu,
In15_Cu,
In16_Cu,
In17_Cu,
In18_Cu,
In19_Cu,
In20_Cu,
In21_Cu,
In22_Cu,
In23_Cu,
In24_Cu,
In25_Cu,
In26_Cu,
In27_Cu,
In28_Cu,
In29_Cu,
In30_Cu,
B_Cu, // 31
};
return Seq( sequence, DIM( sequence ) );
}
LSEQ LSET::Technicals( LSET aSetToOmit ) const
{
// desired sequence
static const LAYER_ID sequence[] = {
B_Adhes,
F_Adhes,
B_Paste,
F_Paste,
B_SilkS,
F_SilkS,
B_Mask,
F_Mask,
B_CrtYd,
F_CrtYd,
B_Fab,
F_Fab,
};
LSET subset = ~aSetToOmit & *this;
return subset.Seq( sequence, DIM( sequence ) );
}
LSEQ LSET::Users() const
{
// desired
static const LAYER_ID sequence[] = {
Dwgs_User,
Cmts_User,
Eco1_User,
Eco2_User,
Edge_Cuts,
Margin,
};
return Seq( sequence, DIM( sequence ) );
}
std::string LSET::FmtBin() const
{
std::string ret;
int bit_count = size();
for( int bit=0; bit<bit_count; ++bit )
{
if( bit )
{
if( !( bit % 8 ) )
ret += '|';
else if( !( bit % 4 ) )
ret += '_';
}
ret += (*this)[bit] ? '1' : '0';
}
// reverse of string
return std::string( ret.rbegin(), ret.rend() );
}
std::string LSET::FmtHex() const
{
std::string ret;
static const char hex[] = "0123456789abcdef";
int nibble_count = ( size() + 3 ) / 4;
for( int nibble=0; nibble<nibble_count; ++nibble )
{
unsigned ndx = 0;
// test 4 consecutive bits and set ndx to 0-15:
for( int nibble_bit=0; nibble_bit<4; ++nibble_bit )
{
if( (*this)[nibble_bit + nibble*4] )
ndx |= (1 << nibble_bit);
}
if( nibble && !( nibble % 8 ) )
ret += '_';
assert( ndx < DIM( hex ) );
ret += hex[ndx];
}
// reverse of string
return std::string( ret.rbegin(), ret.rend() );
}
int LSET::ParseHex( const char* aStart, int aCount )
{
LSET tmp;
const char* rstart = aStart + aCount - 1;
const char* rend = aStart - 1;
const int bitcount = size();
int nibble_ndx = 0;
while( rstart > rend )
{
int cc = *rstart--;
if( cc == '_' )
continue;
int nibble;
if( cc >= '0' && cc <= '9' )
nibble = cc - '0';
else if( cc >= 'a' && cc <= 'f' )
nibble = cc - 'a' + 10;
else if( cc >= 'A' && cc <= 'F' )
nibble = cc - 'A' + 10;
else
break;
int bit = nibble_ndx * 4;
for( int ndx=0; bit<bitcount && ndx<4; ++bit, ++ndx )
if( nibble & (1<<ndx) )
tmp.set( bit );
if( bit >= bitcount )
break;
++nibble_ndx;
}
int byte_count = aStart + aCount - 1 - rstart;
assert( byte_count >= 0 );
if( byte_count > 0 )
*this = tmp;
return byte_count;
}
LSEQ LSET::Seq( const LAYER_ID* aWishListSequence, unsigned aCount ) const
{
LSEQ ret;
#if defined(DEBUG) && 0
LSET dup_detector;
for( unsigned i=0; i<aCount; ++i )
{
LAYER_ID id = aWishListSequence[i];
if( test( id ) )
{
wxASSERT_MSG( !dup_detector[id], wxT( "Duplicate in aWishListSequence" ) );
dup_detector[id] = true;
ret.push_back( id );
}
}
#else
for( unsigned i=0; i<aCount; ++i )
{
LAYER_ID id = aWishListSequence[i];
if( test( id ) )
ret.push_back( id );
}
#endif
return ret;
}
LSEQ LSET::Seq() const
{
LSEQ ret;
for( unsigned i=0; i<size(); ++i )
{
if( test(i) )
ret.push_back( LAYER_ID( i ) );
}
return ret;
}
LAYER_ID FlipLayer( LAYER_ID aLayerId )
{
switch( aLayerId )
{
case B_Cu: return F_Cu;
case F_Cu: return B_Cu;
case B_SilkS: return F_SilkS;
case F_SilkS: return B_SilkS;
case B_Adhes: return F_Adhes;
case F_Adhes: return B_Adhes;
case B_Mask: return F_Mask;
case F_Mask: return B_Mask;
case B_Paste: return F_Paste;
case F_Paste: return B_Paste;
case B_CrtYd: return F_CrtYd;
case F_CrtYd: return B_CrtYd;
case B_Fab: return F_Fab;
case F_Fab: return B_Fab;
// No change for the other layers
default:
return aLayerId;
}
}
LSET FlipLayerMask( LSET aMask )
{
// layers on physical outside of a board:
const static LSET and_mask( 16, // !! update count
B_Cu, F_Cu,
B_SilkS, F_SilkS,
B_Adhes, F_Adhes,
B_Mask, F_Mask,
B_Paste, F_Paste,
B_Adhes, F_Adhes,
B_CrtYd, F_CrtYd,
B_Fab, F_Fab
);
LSET newMask = aMask & ~and_mask;
if( aMask[B_Cu] )
newMask.set( F_Cu );
if( aMask[F_Cu] )
newMask.set( B_Cu );
if( aMask[B_SilkS] )
newMask.set( F_SilkS );
if( aMask[F_SilkS] )
newMask.set( B_SilkS );
if( aMask[B_Adhes] )
newMask.set( F_Adhes );
if( aMask[F_Adhes] )
newMask.set( B_Adhes );
if( aMask[B_Mask] )
newMask.set( F_Mask );
if( aMask[F_Mask] )
newMask.set( B_Mask );
if( aMask[B_Paste] )
newMask.set( F_Paste );
if( aMask[F_Paste] )
newMask.set( B_Paste );
if( aMask[B_Adhes] )
newMask.set( F_Adhes );
if( aMask[F_Adhes] )
newMask.set( B_Adhes );
if( aMask[B_CrtYd] )
newMask.set( F_CrtYd );
if( aMask[F_CrtYd] )
newMask.set( B_CrtYd );
if( aMask[B_Fab] )
newMask.set( F_Fab );
if( aMask[F_Fab] )
newMask.set( B_Fab );
return newMask;
}
LAYER_ID LSET::ExtractLayer() const
{
unsigned set_count = count();
if( !set_count )
return UNSELECTED_LAYER;
else if( set_count > 1 )
return UNDEFINED_LAYER;
for( unsigned i=0; i < size(); ++i )
{
if( test( i ) )
return LAYER_ID( i );
}
wxASSERT( 0 ); // set_count was verified as 1 above, what did you break?
return UNDEFINED_LAYER;
}
LSET LSET::InternalCuMask()
{
static const LAYER_ID cu_internals[] = {
In1_Cu,
In2_Cu,
In3_Cu,
In4_Cu,
In5_Cu,
In6_Cu,
In7_Cu,
In8_Cu,
In9_Cu,
In10_Cu,
In11_Cu,
In12_Cu,
In13_Cu,
In14_Cu,
In15_Cu,
In16_Cu,
In17_Cu,
In18_Cu,
In19_Cu,
In20_Cu,
In21_Cu,
In22_Cu,
In23_Cu,
In24_Cu,
In25_Cu,
In26_Cu,
In27_Cu,
In28_Cu,
In29_Cu,
In30_Cu,
};
static const LSET saved( cu_internals, DIM( cu_internals ) );
return saved;
}
LSET LSET::AllCuMask( int aCuLayerCount )
{
// retain all in static as the full set, which is a common case.
static const LSET all = InternalCuMask().set( F_Cu ).set( B_Cu );
if( aCuLayerCount == MAX_CU_LAYERS )
return all;
// subtract out some Cu layers not wanted in the mask.
LSET ret = all;
int clear_count = MAX_CU_LAYERS - aCuLayerCount;
clear_count = Clamp( 0, clear_count, MAX_CU_LAYERS - 2 );
for( LAYER_NUM elem=In30_Cu; clear_count; --elem, --clear_count )
{
ret.set( elem, false );
}
return ret;
}
LSET LSET::AllNonCuMask()
{
static const LSET saved = LSET().set() & ~AllCuMask();
return saved;
}
LSET LSET::AllLayersMask()
{
static const LSET saved = LSET().set();
return saved;
}
LSET LSET::BackTechMask()
{
// (SILKSCREEN_LAYER_BACK | SOLDERMASK_LAYER_BACK | ADHESIVE_LAYER_BACK | SOLDERPASTE_LAYER_BACK)
static const LSET saved( 6, B_SilkS, B_Mask, B_Adhes, B_Paste, B_CrtYd, B_Fab );
return saved;
}
LSET LSET::FrontTechMask()
{
// (SILKSCREEN_LAYER_FRONT | SOLDERMASK_LAYER_FRONT | ADHESIVE_LAYER_FRONT | SOLDERPASTE_LAYER_FRONT)
static const LSET saved( 6, F_SilkS, F_Mask, F_Adhes, F_Paste, F_CrtYd, F_Fab );
return saved;
}
LSET LSET::AllTechMask()
{
static const LSET saved = BackTechMask() | FrontTechMask();
return saved;
}
LSET LSET::UserMask()
{
static const LSET saved( 6,
Dwgs_User,
Cmts_User,
Eco1_User,
Eco2_User,
Edge_Cuts,
Margin
);
return saved;
}
LSET LSET::FrontMask()
{
static const LSET saved = FrontTechMask().set( F_Cu );
return saved;
}
LSET LSET::BackMask()
{
static const LSET saved = BackTechMask().set( B_Cu );
return saved;
}
LSEQ LSET::UIOrder() const
{
LAYER_ID order[LAYER_ID_COUNT];
// Assmuming that the LAYER_ID order is according to preferred UI order, as of
// today this is true. When that becomes not true, its easy to change the order
// in here to compensate.
for( unsigned i=0; i<DIM(order); ++i )
order[i] = LAYER_ID( i );
return Seq( order, DIM( order ) );
}
LAYER_ID ToLAYER_ID( int aLayer )
{
wxASSERT( unsigned( aLayer ) < LAYER_ID_COUNT );
return LAYER_ID( aLayer );
}
+1
View File
@@ -38,6 +38,7 @@ RENDER_SETTINGS::RENDER_SETTINGS()
m_highlightEnabled = false;
m_hiContrastEnabled = false;
m_hiContrastFactor = 0.2;
m_highlightNetcode = -1;
m_outlineWidth = 1;
m_worksheetLineWidth = 100000;
+2 -1
View File
@@ -1,6 +1,7 @@
drillshape
excludeedgelayer
false
gerberprecision
hpglpendiameter
hpglpennumber
hpglpenoverlay
@@ -15,7 +16,6 @@ padsonsilk
pcbplotparams
plotframeref
plotinvisibletext
plotothertext
plotreference
plotvalue
psa4output
@@ -27,3 +27,4 @@ true
useauxorigin
usegerberextensions
viasonmask
usegerberattributes
+16 -135
View File
@@ -43,16 +43,6 @@
class MODULE;
/* Look up Table for conversion copper layer count -> general copper layer
* mask: */
LAYER_MSK g_TabAllCopperLayerMask[NB_COPPER_LAYERS] = {
0x0001, 0x8001, 0x8003, 0x8007,
0x800F, 0x801F, 0x803F, 0x807F,
0x80FF, 0x81FF, 0x83FF, 0x87FF,
0x8FFF, 0x9FFF, 0xCFFF, 0xFFFF
};
DISPLAY_OPTIONS DisplayOpt; // Display options for board items
int g_AnchorColor = BLUE;
@@ -71,124 +61,20 @@ int g_PadCMPColor = RED;
*/
DLIST<TRACK> g_CurrentTrackList;
LAYER_NUM FlipLayer( LAYER_NUM oldlayer )
void AccumulateDescription( wxString &aDesc, const wxString &aItem )
{
switch( oldlayer )
{
case LAYER_N_BACK:
return LAYER_N_FRONT;
case LAYER_N_FRONT:
return LAYER_N_BACK;
case SILKSCREEN_N_BACK:
return SILKSCREEN_N_FRONT;
case SILKSCREEN_N_FRONT:
return SILKSCREEN_N_BACK;
case ADHESIVE_N_BACK:
return ADHESIVE_N_FRONT;
case ADHESIVE_N_FRONT:
return ADHESIVE_N_BACK;
case SOLDERMASK_N_BACK:
return SOLDERMASK_N_FRONT;
case SOLDERMASK_N_FRONT:
return SOLDERMASK_N_BACK;
case SOLDERPASTE_N_BACK:
return SOLDERPASTE_N_FRONT;
case SOLDERPASTE_N_FRONT:
return SOLDERPASTE_N_BACK;
// No change for the other layers
default:
return oldlayer;
}
if( !aDesc.IsEmpty() )
aDesc << wxT(", ");
aDesc << aItem;
}
LAYER_MSK FlipLayerMask( LAYER_MSK aMask )
{
LAYER_MSK newMask;
newMask = aMask & ~(LAYER_BACK | LAYER_FRONT |
SILKSCREEN_LAYER_BACK | SILKSCREEN_LAYER_FRONT |
ADHESIVE_LAYER_BACK | ADHESIVE_LAYER_FRONT |
SOLDERMASK_LAYER_BACK | SOLDERMASK_LAYER_FRONT |
SOLDERPASTE_LAYER_BACK | SOLDERPASTE_LAYER_FRONT |
ADHESIVE_LAYER_BACK | ADHESIVE_LAYER_FRONT);
if( aMask & LAYER_BACK )
newMask |= LAYER_FRONT;
if( aMask & LAYER_FRONT )
newMask |= LAYER_BACK;
if( aMask & SILKSCREEN_LAYER_BACK )
newMask |= SILKSCREEN_LAYER_FRONT;
if( aMask & SILKSCREEN_LAYER_FRONT )
newMask |= SILKSCREEN_LAYER_BACK;
if( aMask & ADHESIVE_LAYER_BACK )
newMask |= ADHESIVE_LAYER_FRONT;
if( aMask & ADHESIVE_LAYER_FRONT )
newMask |= ADHESIVE_LAYER_BACK;
if( aMask & SOLDERMASK_LAYER_BACK )
newMask |= SOLDERMASK_LAYER_FRONT;
if( aMask & SOLDERMASK_LAYER_FRONT )
newMask |= SOLDERMASK_LAYER_BACK;
if( aMask & SOLDERPASTE_LAYER_BACK )
newMask |= SOLDERPASTE_LAYER_FRONT;
if( aMask & SOLDERPASTE_LAYER_FRONT )
newMask |= SOLDERPASTE_LAYER_BACK;
if( aMask & ADHESIVE_LAYER_BACK )
newMask |= ADHESIVE_LAYER_FRONT;
if( aMask & ADHESIVE_LAYER_FRONT )
newMask |= ADHESIVE_LAYER_BACK;
return newMask;
}
LAYER_NUM ExtractLayer( LAYER_MSK aMask )
{
if( aMask == NO_LAYERS )
return UNSELECTED_LAYER;
LAYER_NUM candidate = UNDEFINED_LAYER;
// Scan all the layers and take note of the first set; if other are
// then found return UNDEFINED_LAYER
for( LAYER_NUM i = FIRST_LAYER; i < NB_LAYERS; ++i )
{
if( aMask & GetLayerMask( i ) )
{
if( candidate == UNDEFINED_LAYER )
candidate = i;
else
return UNDEFINED_LAYER;
}
}
return candidate;
}
wxString LayerMaskDescribe( const BOARD *aBoard, LAYER_MSK aMask )
wxString LayerMaskDescribe( const BOARD *aBoard, LSET aMask )
{
// Try the single or no- layer case (easy)
LAYER_NUM layer = ExtractLayer( aMask );
switch( layer )
LAYER_ID layer = aMask.ExtractLayer();
switch( (int) layer )
{
case UNSELECTED_LAYER:
return _( "No layers" );
@@ -203,24 +89,19 @@ wxString LayerMaskDescribe( const BOARD *aBoard, LAYER_MSK aMask )
// Try to be smart and useful, starting with outer copper
// (which are more important than internal ones)
wxString layerInfo;
if( aMask & LAYER_FRONT )
AccumulateDescription( layerInfo, aBoard->GetLayerName( LAYER_N_FRONT ) );
if( aMask & LAYER_BACK )
AccumulateDescription( layerInfo, aBoard->GetLayerName( LAYER_N_BACK ) );
if( aMask & INTERNAL_CU_LAYERS )
if( aMask[F_Cu] )
AccumulateDescription( layerInfo, aBoard->GetLayerName( F_Cu ) );
if( aMask[B_Cu] )
AccumulateDescription( layerInfo, aBoard->GetLayerName( B_Cu ) );
if( ( aMask & LSET::InternalCuMask() ).any() )
AccumulateDescription( layerInfo, _("Internal" ) );
if( aMask & ALL_NO_CU_LAYERS )
if( ( aMask & LSET::AllNonCuMask() ).any() )
AccumulateDescription( layerInfo, _("Non-copper" ) );
return layerInfo;
}
void AccumulateDescription( wxString &aDesc, const wxString &aItem )
{
if( !aDesc.IsEmpty() )
aDesc << wxT(", ");
aDesc << aItem;
}
+1 -1
View File
@@ -5,7 +5,7 @@
#if !wxCHECK_VERSION( 3, 0, 0 )
#if !wxCHECK_VERSION( 2, 9, 0 )
// implement missing wx2.8 function until >= wx3.0 pervades.
static wxString wxJoin(const wxArrayString& arr, const wxChar sep,
+1 -1
View File
@@ -190,7 +190,7 @@ static void formatNode( OUTPUTFORMATTER* out, int aNestLevel, int aCtl,
out->Print( aNestLevel, "(%s%s", out->Quotes( aKey ).c_str(), ctl & CTL_OMIT_NL ? "" : "\n" );
if( aTree.data().size() ) // only xml typically uses "data()", not sexpr.
if( aTree.data().size() ) // sexpr format does not use data()
{
out->Print( 0, " %s%s",
out->Quotes( aTree.data() ).c_str(),
+2 -1
View File
@@ -315,10 +315,11 @@ char* STRING_LINE_READER::ReadLine() throw( IO_ERROR )
}
INPUTSTREAM_LINE_READER::INPUTSTREAM_LINE_READER( wxInputStream* aStream ) :
INPUTSTREAM_LINE_READER::INPUTSTREAM_LINE_READER( wxInputStream* aStream, const wxString& aSource ) :
LINE_READER( LINE_READER_LINE_DEFAULT_MAX ),
m_stream( aStream )
{
source = aSource;
}
-1
View File
@@ -37,7 +37,6 @@
#include <typeinfo>
#include <macros.h>
#include <fctsys.h>
#include <wx/dynlib.h>
#include <wx/filename.h>
#include <wx/stdpaths.h>
#include <wx/snglinst.h>
+26 -29
View File
@@ -44,8 +44,6 @@ ACTION_MANAGER::~ACTION_MANAGER()
void ACTION_MANAGER::RegisterAction( TOOL_ACTION* aAction )
{
// Check if the TOOL_ACTION was not registered before
assert( aAction->GetId() == -1 );
// TOOL_ACTIONs are supposed to be named [appName.]toolName.actionName (with dots between)
// action name without specifying at least toolName is not valid
assert( aAction->GetName().find( '.', 0 ) != std::string::npos );
@@ -54,15 +52,23 @@ void ACTION_MANAGER::RegisterAction( TOOL_ACTION* aAction )
assert( m_actionNameIndex.find( aAction->m_name ) == m_actionNameIndex.end() );
assert( m_actionIdIndex.find( aAction->m_id ) == m_actionIdIndex.end() );
aAction->setId( MakeActionId( aAction->m_name ) );
if( aAction->m_id == -1 )
aAction->m_id = MakeActionId( aAction->m_name );
m_actionNameIndex[aAction->m_name] = aAction;
m_actionIdIndex[aAction->m_id] = aAction;
#ifndef NDEBUG
// Check if there are two global actions assigned to the same hotkey
if( aAction->GetScope() == AS_GLOBAL )
{
BOOST_FOREACH( const TOOL_ACTION* action, m_actionHotKeys[aAction->m_currentHotKey] )
assert( action->GetScope() != AS_GLOBAL );
}
#endif /* not NDEBUG */
if( aAction->HasHotKey() )
m_actionHotKeys[aAction->m_currentHotKey].push_back( aAction );
aAction->setActionMgr( this );
}
@@ -71,10 +77,6 @@ void ACTION_MANAGER::UnregisterAction( TOOL_ACTION* aAction )
m_actionNameIndex.erase( aAction->m_name );
m_actionIdIndex.erase( aAction->m_id );
// Indicate that the ACTION_MANAGER no longer care about the object
aAction->setActionMgr( NULL );
aAction->setId( -1 );
if( aAction->HasHotKey() )
{
std::list<TOOL_ACTION*>& actions = m_actionHotKeys[aAction->m_currentHotKey];
@@ -96,24 +98,14 @@ int ACTION_MANAGER::MakeActionId( const std::string& aActionName )
}
bool ACTION_MANAGER::RunAction( const std::string& aActionName ) const
TOOL_ACTION* ACTION_MANAGER::FindAction( const std::string& aActionName ) const
{
std::map<std::string, TOOL_ACTION*>::const_iterator it = m_actionNameIndex.find( aActionName );
if( it == m_actionNameIndex.end() )
return false; // no action with given name found
if( it != m_actionNameIndex.end() )
return it->second;
RunAction( it->second );
return true;
}
void ACTION_MANAGER::RunAction( const TOOL_ACTION* aAction ) const
{
TOOL_EVENT event = aAction->MakeEvent();
m_toolMgr->ProcessEvent( event );
return NULL;
}
@@ -160,6 +152,8 @@ bool ACTION_MANAGER::RunHotKey( int aHotKey ) const
if( tool )
{
// Choose the action that goes to the tool with highest priority
// (i.e. is on the top of active tools stack)
priority = m_toolMgr->GetPriority( tool->GetId() );
if( priority >= 0 && priority > highestPriority )
@@ -170,13 +164,16 @@ bool ACTION_MANAGER::RunHotKey( int aHotKey ) const
}
}
if( !global && !context ) // currently there is no valid action to run
return false;
if( context )
RunAction( context );
{
m_toolMgr->RunAction( *context, true );
return true;
}
else if( global )
RunAction( global );
{
m_toolMgr->RunAction( *global, true );
return true;
}
return true;
return false;
}
+46 -4
View File
@@ -71,6 +71,47 @@ CONTEXT_MENU::CONTEXT_MENU( const CONTEXT_MENU& aMenu ) :
}
CONTEXT_MENU& CONTEXT_MENU::operator=( const CONTEXT_MENU& aMenu )
{
Clear();
m_titleSet = aMenu.m_titleSet;
m_selected = aMenu.m_selected;
m_tool = aMenu.m_tool;
m_toolActions = aMenu.m_toolActions;
m_customHandler = aMenu.m_customHandler;
// Copy all the menu entries
for( unsigned i = 0; i < aMenu.GetMenuItemCount(); ++i )
{
wxMenuItem* item = aMenu.FindItemByPosition( i );
if( item->IsSubMenu() )
{
#ifdef DEBUG
// Submenus of a CONTEXT_MENU are supposed to be CONTEXT_MENUs as well
assert( dynamic_cast<CONTEXT_MENU*>( item->GetSubMenu() ) );
#endif
CONTEXT_MENU* menu = new CONTEXT_MENU( static_cast<const CONTEXT_MENU&>( *item->GetSubMenu() ) );
AppendSubMenu( menu, item->GetItemLabel(), wxEmptyString );
}
else
{
wxMenuItem* newItem = new wxMenuItem( this, item->GetId(), item->GetItemLabel(),
wxEmptyString, item->GetKind() );
Append( newItem );
copyItem( item, newItem );
}
}
setupEvents();
return *this;
}
void CONTEXT_MENU::setupEvents()
{
Connect( wxEVT_MENU_HIGHLIGHT, wxEventHandler( CONTEXT_MENU::onMenuEvent ), NULL, this );
@@ -144,11 +185,12 @@ void CONTEXT_MENU::Clear()
{
m_titleSet = false;
// Remove all the entries from context menu
for( unsigned i = 0; i < GetMenuItemCount(); ++i )
Destroy( FindItemByPosition( 0 ) );
GetMenuItems().DeleteContents( true );
GetMenuItems().Clear();
m_toolActions.clear();
GetMenuItems().DeleteContents( false ); // restore the default so destructor does not go wild
assert( GetMenuItemCount() == 0 );
}
+47
View File
@@ -0,0 +1,47 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 CERN
* @author Maciej Suminski <maciej.suminski@cern.ch>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <tool/tool_action.h>
std::string TOOL_ACTION::GetToolName() const
{
int dotCount = std::count( m_name.begin(), m_name.end(), '.' );
switch( dotCount )
{
case 0:
assert( false ); // Invalid action name format
return "";
case 1:
return m_name;
case 2:
return m_name.substr( 0, m_name.rfind( '.' ) );
default:
assert( false ); // TODO not implemented
return "";
}
}
+46 -27
View File
@@ -85,11 +85,35 @@ struct TOOL_DISPATCHER::BUTTON_STATE
dragging = false;
pressed = false;
}
///> Checks the current state of the button.
bool GetState() const
{
wxMouseState mouseState = wxGetMouseState();
switch( button )
{
case BUT_LEFT:
return mouseState.LeftIsDown();
case BUT_MIDDLE:
return mouseState.MiddleIsDown();
case BUT_RIGHT:
return mouseState.RightIsDown();
default:
assert( false );
break;
}
return false;
}
};
TOOL_DISPATCHER::TOOL_DISPATCHER( TOOL_MANAGER* aToolMgr, PCB_BASE_FRAME* aEditFrame ) :
m_toolMgr( aToolMgr ), m_editFrame( aEditFrame )
TOOL_DISPATCHER::TOOL_DISPATCHER( TOOL_MANAGER* aToolMgr ) :
m_toolMgr( aToolMgr )
{
m_buttons.push_back( new BUTTON_STATE( BUT_LEFT, wxEVT_LEFT_DOWN,
wxEVT_LEFT_UP, wxEVT_LEFT_DCLICK ) );
@@ -118,7 +142,7 @@ void TOOL_DISPATCHER::ResetState()
KIGFX::VIEW* TOOL_DISPATCHER::getView()
{
return m_editFrame->GetGalCanvas()->GetView();
return static_cast<PCB_BASE_FRAME*>( m_toolMgr->GetEditFrame() )->GetGalCanvas()->GetView();
}
@@ -129,9 +153,21 @@ bool TOOL_DISPATCHER::handleMouseButton( wxEvent& aEvent, int aIndex, bool aMoti
boost::optional<TOOL_EVENT> evt;
bool isClick = false;
bool up = type == st->upEvent;
bool down = type == st->downEvent;
// bool up = type == st->upEvent;
// bool down = type == st->downEvent;
bool up = false, down = false;
bool dblClick = type == st->dblClickEvent;
bool state = st->GetState();
if( !dblClick )
{
// Sometimes the dispatcher does not receive mouse button up event, so it stays
// in the dragging mode even if the mouse button is not held anymore
if( st->pressed && !state )
up = true;
else if( !st->pressed && state )
down = true;
}
int mods = decodeModifiers<wxMouseEvent>( static_cast<wxMouseEvent*>( &aEvent ) );
int args = st->button | mods;
@@ -229,7 +265,7 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
{
motion = true;
m_lastMousePos = pos;
m_editFrame->UpdateStatusBar();
static_cast<PCB_BASE_FRAME*>( m_toolMgr->GetEditFrame() )->UpdateStatusBar();
}
for( unsigned int i = 0; i < m_buttons.size(); i++ )
@@ -245,7 +281,7 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
// TODO That's a big ugly workaround, somehow DRAWPANEL_GAL loses focus
// after second LMB click and currently I have no means to do better debugging
if( type == wxEVT_LEFT_UP )
m_editFrame->GetGalCanvas()->SetFocus();
static_cast<PCB_BASE_FRAME*>( m_toolMgr->GetEditFrame() )->GetGalCanvas()->SetFocus();
#endif /* __APPLE__ */
}
@@ -288,27 +324,10 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
void TOOL_DISPATCHER::DispatchWxCommand( wxCommandEvent& aEvent )
{
boost::optional<TOOL_EVENT> evt;
switch( aEvent.GetId() )
{
case ID_ZOOM_IN: // toolbar button "Zoom In"
evt = COMMON_ACTIONS::zoomInCenter.MakeEvent();
break;
case ID_ZOOM_OUT: // toolbar button "Zoom In"
evt = COMMON_ACTIONS::zoomOutCenter.MakeEvent();
break;
case ID_ZOOM_PAGE: // toolbar button "Fit on Screen"
evt = COMMON_ACTIONS::zoomFitScreen.MakeEvent();
break;
default:
aEvent.Skip();
break;
}
boost::optional<TOOL_EVENT> evt = COMMON_ACTIONS::TranslateLegacyId( aEvent.GetId() );
if( evt )
m_toolMgr->ProcessEvent( *evt );
else
aEvent.Skip();
}
+1
View File
@@ -92,6 +92,7 @@ const std::string TOOL_EVENT::Format() const
{ TA_CONTEXT_MENU_CHOICE, "context-menu-choice" },
{ TA_UNDO_REDO, "undo-redo" },
{ TA_ACTION, "action" },
{ TA_ACTIVATE, "activate" },
{ 0, "" }
};
+243 -76
View File
@@ -25,6 +25,8 @@
#include <map>
#include <deque>
#include <stack>
#include <algorithm>
#include <boost/foreach.hpp>
#include <boost/scoped_ptr.hpp>
@@ -32,8 +34,10 @@
#include <boost/range/adaptor/map.hpp>
#include <wx/event.h>
#include <wx/clipbrd.h>
#include <view/view.h>
#include <view/view_controls.h>
#include <tool/tool_base.h>
#include <tool/tool_interactive.h>
@@ -51,6 +55,32 @@ using boost::optional;
/// Struct describing the current execution state of a TOOL
struct TOOL_MANAGER::TOOL_STATE
{
TOOL_STATE( TOOL_BASE* aTool ) :
theTool( aTool )
{
clear();
}
TOOL_STATE( const TOOL_STATE& aState )
{
theTool = aState.theTool;
idle = aState.idle;
pendingWait = aState.pendingWait;
pendingContextMenu = aState.pendingContextMenu;
contextMenu = aState.contextMenu;
contextMenuTrigger = aState.contextMenuTrigger;
cofunc = aState.cofunc;
wakeupEvent = aState.wakeupEvent;
waitEvents = aState.waitEvents;
transitions = aState.transitions;
// do not copy stateStack
}
~TOOL_STATE()
{
assert( stateStack.empty() );
}
/// The tool itself
TOOL_BASE* theTool;
@@ -83,6 +113,21 @@ struct TOOL_MANAGER::TOOL_STATE
/// upon the event reception
std::vector<TRANSITION> transitions;
void operator=( const TOOL_STATE& aState )
{
theTool = aState.theTool;
idle = aState.idle;
pendingWait = aState.pendingWait;
pendingContextMenu = aState.pendingContextMenu;
contextMenu = aState.contextMenu;
contextMenuTrigger = aState.contextMenuTrigger;
cofunc = aState.cofunc;
wakeupEvent = aState.wakeupEvent;
waitEvents = aState.waitEvents;
transitions = aState.transitions;
// do not copy stateStack
}
bool operator==( const TOOL_MANAGER::TOOL_STATE& aRhs ) const
{
return aRhs.theTool == this->theTool;
@@ -92,6 +137,60 @@ struct TOOL_MANAGER::TOOL_STATE
{
return aRhs.theTool != this->theTool;
}
/**
* Function Push()
* Stores the current state of the tool on stack. Stacks are stored internally and are not
* shared between different TOOL_STATE objects.
*/
void Push()
{
stateStack.push( new TOOL_STATE( *this ) );
clear();
}
/**
* Function Pop()
* Restores state of the tool from stack. Stacks are stored internally and are not
* shared between different TOOL_STATE objects.
* @return True if state was restored, false if the stack was empty.
*/
bool Pop()
{
delete cofunc;
if( !stateStack.empty() )
{
*this = *stateStack.top();
delete stateStack.top();
stateStack.pop();
return true;
}
else
{
cofunc = NULL;
return false;
}
}
private:
///> Stack preserving previous states of a TOOL.
std::stack<TOOL_STATE*> stateStack;
///> Restores the initial state.
void clear()
{
idle = true;
pendingWait = false;
pendingContextMenu = false;
cofunc = NULL;
contextMenu = NULL;
contextMenuTrigger = CMENU_OFF;
transitions.clear();
}
};
@@ -99,6 +198,11 @@ TOOL_MANAGER::TOOL_MANAGER() :
m_model( NULL ), m_view( NULL ), m_viewControls( NULL ), m_editFrame( NULL )
{
m_actionMgr = new ACTION_MANAGER( this );
// Register known actions
std::list<TOOL_ACTION*>& actionList = GetActionList();
BOOST_FOREACH( TOOL_ACTION* action, actionList )
RegisterAction( action );
}
@@ -113,7 +217,6 @@ TOOL_MANAGER::~TOOL_MANAGER()
delete it->first; // delete the tool itself
}
m_toolState.clear();
delete m_actionMgr;
}
@@ -124,18 +227,15 @@ void TOOL_MANAGER::RegisterTool( TOOL_BASE* aTool )
wxT( "Adding two tools with the same name may result in unexpected behaviour.") );
wxASSERT_MSG( m_toolIdIndex.find( aTool->GetId() ) == m_toolIdIndex.end(),
wxT( "Adding two tools with the same ID may result in unexpected behaviour.") );
wxASSERT_MSG( m_toolTypes.find( typeid( *aTool ).name() ) == m_toolTypes.end(),
wxT( "Adding two tools of the same type may result in unexpected behaviour.") );
TOOL_STATE* st = new TOOL_STATE;
st->theTool = aTool;
st->pendingWait = false;
st->pendingContextMenu = false;
st->cofunc = NULL;
st->contextMenuTrigger = CMENU_OFF;
TOOL_STATE* st = new TOOL_STATE( aTool );
m_toolState[aTool] = st;
m_toolNameIndex[aTool->GetName()] = st;
m_toolIdIndex[aTool->GetId()] = st;
m_toolTypes[typeid( *aTool ).name()] = st->theTool;
aTool->m_toolMgr = this;
@@ -150,6 +250,7 @@ void TOOL_MANAGER::RegisterTool( TOOL_BASE* aTool )
m_toolState.erase( aTool );
m_toolNameIndex.erase( aTool->GetName() );
m_toolIdIndex.erase( aTool->GetId() );
m_toolTypes.erase( typeid( *aTool ).name() );
delete st;
delete aTool;
@@ -191,15 +292,40 @@ void TOOL_MANAGER::UnregisterAction( TOOL_ACTION* aAction )
}
bool TOOL_MANAGER::RunAction( const std::string& aActionName )
bool TOOL_MANAGER::RunAction( const std::string& aActionName, bool aNow )
{
return m_actionMgr->RunAction( aActionName );
TOOL_ACTION* action = m_actionMgr->FindAction( aActionName );
if( action )
{
if( aNow )
{
TOOL_EVENT event = action->MakeEvent();
ProcessEvent( event );
}
else
{
PostEvent( action->MakeEvent() );
}
return true;
}
return false;
}
void TOOL_MANAGER::RunAction( const TOOL_ACTION& aAction )
void TOOL_MANAGER::RunAction( const TOOL_ACTION& aAction, bool aNow )
{
m_actionMgr->RunAction( &aAction );
if( aNow )
{
TOOL_EVENT event = aAction.MakeEvent();
ProcessEvent( event );
}
else
{
PostEvent( aAction.MakeEvent() );
}
}
@@ -207,7 +333,7 @@ bool TOOL_MANAGER::invokeTool( TOOL_BASE* aTool )
{
wxASSERT( aTool != NULL );
TOOL_EVENT evt( TC_COMMAND, TA_ACTION, aTool->GetName() );
TOOL_EVENT evt( TC_COMMAND, TA_ACTIVATE, aTool->GetName() );
ProcessEvent( evt );
return true;
@@ -325,6 +451,8 @@ optional<TOOL_EVENT> TOOL_MANAGER::ScheduleWait( TOOL_BASE* aTool,
{
TOOL_STATE* st = m_toolState[aTool];
assert( !st->pendingWait ); // everything collapses on two Yield() in a row
// indicate to the manager that we are going to sleep and we shall be
// woken up when an event matching aConditions arrive
st->pendingWait = true;
@@ -349,8 +477,8 @@ void TOOL_MANAGER::dispatchInternal( TOOL_EVENT& aEvent )
{
if( st->waitEvents.Matches( aEvent ) )
{
// By default, already processed events are not passed further
m_passEvent = false;
// By default, only messages are passed further
m_passEvent = ( aEvent.m_category == TC_MESSAGE );
// got matching event? clear wait list and wake up the coroutine
st->wakeupEvent = aEvent;
@@ -370,35 +498,31 @@ void TOOL_MANAGER::dispatchInternal( TOOL_EVENT& aEvent )
BOOST_FOREACH( TOOL_STATE* st, m_toolState | boost::adaptors::map_values )
{
// the tool scheduled next state(s) by calling Go()
if( !st->pendingWait )
// no state handler in progress - check if there are any transitions (defined by
// Go() method that match the event.
if( !st->pendingWait && !st->transitions.empty() )
{
// no state handler in progress - check if there are any transitions (defined by
// Go() method that match the event.
if( st->transitions.size() )
BOOST_FOREACH( TRANSITION& tr, st->transitions )
{
BOOST_FOREACH( TRANSITION& tr, st->transitions )
if( tr.first.Matches( aEvent ) )
{
if( tr.first.Matches( aEvent ) )
{
// as the state changes, the transition table has to be set up again
st->transitions.clear();
// if there is already a context, then store it
if( st->cofunc )
st->Push();
// no tool context allocated yet? Create one.
if( !st->cofunc )
st->cofunc = new COROUTINE<int, TOOL_EVENT&>( tr.second );
else
st->cofunc->SetEntry( tr.second );
// as the state changes, the transition table has to be set up again
st->transitions.clear();
// got match? Run the handler.
st->cofunc->Call( aEvent );
st->cofunc = new COROUTINE<int, TOOL_EVENT&>( tr.second );
if( !st->cofunc->Running() )
finishTool( st ); // The couroutine has finished immediately?
// got match? Run the handler.
st->cofunc->Call( aEvent );
// there is no point in further checking, as transitions got cleared
break;
}
if( !st->cofunc->Running() )
finishTool( st ); // The couroutine has finished immediately?
// there is no point in further checking, as transitions got cleared
break;
}
}
}
@@ -412,12 +536,7 @@ bool TOOL_MANAGER::dispatchStandardEvents( TOOL_EVENT& aEvent )
{
// Check if there is a hotkey associated
if( m_actionMgr->RunHotKey( aEvent.Modifier() | aEvent.KeyCode() ) )
return false; // hotkey event was handled so it does not go any further
}
else if( aEvent.Category() == TC_COMMAND ) // it may be a tool activation event
{
dispatchActivation( aEvent );
// do not return false, as the event has to go on to the destined tool
return false; // hotkey event was handled so it does not go any further
}
return true;
@@ -426,12 +545,13 @@ bool TOOL_MANAGER::dispatchStandardEvents( TOOL_EVENT& aEvent )
bool TOOL_MANAGER::dispatchActivation( TOOL_EVENT& aEvent )
{
// Look for the tool that has the same name as parameter in the processed command TOOL_EVENT
BOOST_FOREACH( TOOL_STATE* st, m_toolState | boost::adaptors::map_values )
if( aEvent.IsActivate() )
{
if( st->theTool->GetName() == aEvent.m_commandStr )
std::map<std::string, TOOL_STATE*>::iterator tool = m_toolNameIndex.find( *aEvent.m_commandStr );
if( tool != m_toolNameIndex.end() )
{
runTool( st->theTool );
runTool( tool->second->theTool );
return true;
}
}
@@ -440,36 +560,8 @@ bool TOOL_MANAGER::dispatchActivation( TOOL_EVENT& aEvent )
}
void TOOL_MANAGER::finishTool( TOOL_STATE* aState )
void TOOL_MANAGER::dispatchContextMenu( TOOL_EVENT& aEvent )
{
std::deque<TOOL_ID>::iterator it, itEnd;
// Find the tool and deactivate it
for( it = m_activeTools.begin(), itEnd = m_activeTools.end(); it != itEnd; ++it )
{
if( aState == m_toolIdIndex[*it] )
{
m_activeTools.erase( it );
break;
}
}
delete aState->cofunc;
aState->cofunc = NULL;
}
bool TOOL_MANAGER::ProcessEvent( TOOL_EVENT& aEvent )
{
// wxLogDebug( "event: %s", aEvent.Format().c_str() );
// Early dispatch of events destined for the TOOL_MANAGER
if( !dispatchStandardEvents( aEvent ) )
return false;
dispatchInternal( aEvent );
// popup menu handling
BOOST_FOREACH( TOOL_ID toolId, m_activeTools )
{
TOOL_STATE* st = m_toolIdIndex[toolId];
@@ -487,6 +579,10 @@ bool TOOL_MANAGER::ProcessEvent( TOOL_EVENT& aEvent )
if( st->contextMenuTrigger == CMENU_NOW )
st->contextMenuTrigger = CMENU_OFF;
// Temporarily store the cursor position, so the tools could execute actions
// using the point where the user has invoked a context menu
m_viewControls->ForceCursorPosition( true, m_viewControls->GetCursorPosition() );
boost::scoped_ptr<CONTEXT_MENU> menu( new CONTEXT_MENU( *st->contextMenu ) );
GetEditFrame()->PopupMenu( menu.get() );
@@ -497,9 +593,45 @@ bool TOOL_MANAGER::ProcessEvent( TOOL_EVENT& aEvent )
dispatchInternal( evt );
}
m_viewControls->ForceCursorPosition( false );
break;
}
}
}
void TOOL_MANAGER::finishTool( TOOL_STATE* aState )
{
if( !aState->Pop() ) // if there are no other contexts saved on the stack
{
// find the tool and deactivate it
std::deque<TOOL_ID>::iterator tool = std::find( m_activeTools.begin(), m_activeTools.end(),
aState->theTool->GetId() );
if( tool != m_activeTools.end() )
m_activeTools.erase( tool );
}
}
bool TOOL_MANAGER::ProcessEvent( TOOL_EVENT& aEvent )
{
// Early dispatch of events destined for the TOOL_MANAGER
if( !dispatchStandardEvents( aEvent ) )
return false;
dispatchInternal( aEvent );
dispatchActivation( aEvent );
dispatchContextMenu( aEvent );
// Dispatch queue
while( !m_eventQueue.empty() )
{
TOOL_EVENT event = m_eventQueue.front();
m_eventQueue.pop_front();
ProcessEvent( event );
}
if( m_view->IsDirty() )
{
@@ -521,6 +653,41 @@ void TOOL_MANAGER::ScheduleContextMenu( TOOL_BASE* aTool, CONTEXT_MENU* aMenu,
}
bool TOOL_MANAGER::SaveClipboard( const std::string& aText )
{
if( wxTheClipboard->Open() )
{
wxTheClipboard->SetData( new wxTextDataObject( wxString( aText.c_str(), wxConvUTF8 ) ) );
wxTheClipboard->Close();
return true;
}
return false;
}
std::string TOOL_MANAGER::GetClipboard() const
{
std::string result;
if( wxTheClipboard->Open() )
{
if( wxTheClipboard->IsSupported( wxDF_TEXT ) )
{
wxTextDataObject data;
wxTheClipboard->GetData( data );
result = data.GetText().mb_str();
}
wxTheClipboard->Close();
}
return result;
}
TOOL_ID TOOL_MANAGER::MakeToolId( const std::string& aToolName )
{
static int currentId;
+31 -31
View File
@@ -153,7 +153,7 @@ void VIEW::SetRequired( int aLayerId, int aRequiredId, bool aRequired )
}
// stupid C++... python lamda would do this in one line
// stupid C++... python lambda would do this in one line
template <class Container>
struct queryVisitor
{
@@ -252,9 +252,7 @@ void VIEW::SetGAL( GAL* aGal )
clearGroupCache();
// every target has to be refreshed
MarkTargetDirty( TARGET_CACHED );
MarkTargetDirty( TARGET_NONCACHED );
MarkTargetDirty( TARGET_OVERLAY );
MarkDirty();
// force the new GAL to display the current viewport.
SetCenter( m_center );
@@ -274,12 +272,15 @@ BOX2D VIEW::GetViewport() const
}
void VIEW::SetViewport( const BOX2D& aViewport, bool aKeepAspect )
void VIEW::SetViewport( const BOX2D& aViewport )
{
VECTOR2D ssize = ToWorld( m_gal->GetScreenPixelSize(), false );
wxASSERT( ssize.x > 0 && ssize.y > 0 );
VECTOR2D centre = aViewport.Centre();
VECTOR2D vsize = aViewport.GetSize();
double zoom = 1.0 / std::min( fabs( vsize.x / ssize.x ), fabs( vsize.y / ssize.y ) );
double zoom = 1.0 / std::max( fabs( vsize.x / ssize.x ), fabs( vsize.y / ssize.y ) );
SetCenter( centre );
SetScale( GetScale() * zoom );
@@ -305,7 +306,7 @@ void VIEW::SetScale( double aScale, const VECTOR2D& aAnchor )
m_scale = aScale;
// Redraw everything after the viewport has changed
MarkTargetDirty( TARGET_CACHED );
MarkDirty();
}
@@ -317,7 +318,7 @@ void VIEW::SetCenter( const VECTOR2D& aCenter )
m_gal->ComputeWorldScreenMatrix();
// Redraw everything after the viewport has changed
MarkTargetDirty( TARGET_CACHED );
MarkDirty();
}
@@ -574,7 +575,7 @@ struct VIEW::drawItem
}
VIEW* view;
int layer, layersCount, layers[VIEW_MAX_LAYERS];
int layer, layers[VIEW_MAX_LAYERS];
};
@@ -734,9 +735,7 @@ void VIEW::ClearTargets()
m_gal->ClearTarget( TARGET_NONCACHED );
m_gal->ClearTarget( TARGET_CACHED );
MarkTargetDirty( TARGET_NONCACHED );
MarkTargetDirty( TARGET_CACHED );
MarkTargetDirty( TARGET_OVERLAY );
MarkDirty();
}
if( IsTargetDirty( TARGET_OVERLAY ) )
@@ -855,7 +854,7 @@ void VIEW::sortLayers()
sort( m_orderedLayers.begin(), m_orderedLayers.end(), compareRenderingOrder );
MarkTargetDirty( TARGET_CACHED );
MarkDirty();
}
@@ -1020,33 +1019,34 @@ void VIEW::UpdateItems()
m_needsUpdate.clear();
}
struct VIEW::extentsVisitor {
BOX2I extents;
bool first;
extentsVisitor()
{
first = true;
}
struct VIEW::extentsVisitor
{
BOX2I extents;
bool first;
extentsVisitor()
{
first = true;
}
bool operator()( VIEW_ITEM* aItem )
{
if( first )
extents = aItem->ViewBBox();
else
extents.Merge ( aItem->ViewBBox() );
return false;
}
};
bool operator()( VIEW_ITEM* aItem )
{
if(first)
extents = aItem->ViewBBox();
else
extents.Merge ( aItem->ViewBBox() );
return false;
}
};
const BOX2I VIEW::CalculateExtents()
{
extentsVisitor v;
BOX2I fullScene;
fullScene.SetMaximum();
BOOST_FOREACH( VIEW_LAYER* l, m_orderedLayers )
{
l->items->Query( fullScene, v );
+1 -1
View File
@@ -240,7 +240,7 @@ void WX_VIEW_CONTROLS::onTimer( wxTimerEvent& aEvent )
#if wxCHECK_VERSION( 3, 0, 0 )
moveEvent.SetControlDown( wxGetKeyState( WXK_CONTROL ) );
moveEvent.SetShiftDown( wxGetKeyState( WXK_SHIFT ) );
moveEvent.SetAltDown( wxGetKeyState( WXK_ALT) );
moveEvent.SetAltDown( wxGetKeyState( WXK_ALT ) );
#else
// wx <3.0 do not have accessors, but the fields are exposed
moveEvent.m_controlDown = wxGetKeyState( WXK_CONTROL );
+2 -2
View File
@@ -83,12 +83,12 @@ void EDA_DRAW_FRAME::DrawWorkSheet( wxDC* aDC, BASE_SCREEN* aScreen, int aLineWi
wxSize pageSize = pageInfo.GetSizeMils();
// if not printing, draw the page limits:
if( !aScreen->m_IsPrinting && g_ShowPageLimits )
if( !aScreen->m_IsPrinting && m_showPageLimits )
{
GRSetDrawMode( aDC, GR_COPY );
GRRect( m_canvas->GetClipBox(), aDC, 0, 0,
pageSize.x * aScalar, pageSize.y * aScalar, aLineWidth,
g_DrawBgColor == WHITE ? LIGHTGRAY : DARKDARKGRAY );
m_drawBgColor == WHITE ? LIGHTGRAY : DARKDARKGRAY );
}
TITLE_BLOCK t_block = GetTitleBlock();
+17 -13
View File
@@ -25,7 +25,7 @@
* @file autosel.cpp
*/
/* Routines for automatic selection of modules. */
// Routines for automatic selection of modules.
#include <fctsys.h>
#include <common.h>
@@ -40,7 +40,10 @@
#include <cvpcb_mainframe.h>
#include <cvstruct.h>
#define QUOTE '\''
#define QUOTE '\''
#define FMT_TITLE_LIB_LOAD_ERROR _( "Library Load Error" )
class FOOTPRINT_ALIAS
{
@@ -93,7 +96,7 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event )
if( m_netlist.IsEmpty() )
return;
/* Find equivalents in all available files. */
// Find equivalents in all available files.
for( ii = 0; ii < m_AliasLibNames.GetCount(); ii++ )
{
fn = m_AliasLibNames[ii];
@@ -107,6 +110,7 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event )
{
fn.SetExt( fn.GetExt() + wxT( "." ) + FootprintAliasFileExtension );
}
tmp = search.FindValidPath( fn.GetFullPath() );
if( !tmp )
@@ -114,7 +118,7 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event )
msg.Printf( _( "Footprint alias library file '%s' could not be found in the "
"default search paths." ),
GetChars( fn.GetFullName() ) );
wxMessageBox( msg, titleLibLoadError, wxOK | wxICON_ERROR );
wxMessageBox( msg, FMT_TITLE_LIB_LOAD_ERROR, wxOK | wxICON_ERROR );
continue;
}
@@ -122,8 +126,8 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event )
if( file == NULL )
{
msg.Printf( _( "Error opening alias library <%s>." ), GetChars( tmp ) );
wxMessageBox( msg, titleLibLoadError, wxOK | wxICON_ERROR );
msg.Printf( _( "Error opening alias library '%s'." ), GetChars( tmp ) );
wxMessageBox( msg, FMT_TITLE_LIB_LOAD_ERROR, wxOK | wxICON_ERROR );
continue;
}
@@ -153,7 +157,7 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event )
fclose( file );
}
/* Display the number of footprint aliases. */
// Display the number of footprint aliases.
msg.Printf( _( "%d footprint aliases found." ), aliases.size() );
SetStatusText( msg, 0 );
@@ -165,7 +169,7 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event )
component = m_netlist.GetComponent( kk );
bool found = false;
m_ListCmp->SetSelection( ii++, true );
m_compListBox->SetSelection( ii++, true );
if( !component->GetFPID().empty() )
continue;
@@ -176,8 +180,8 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event )
if( alias.m_Name.CmpNoCase( component->GetValue() ) != 0 )
continue;
/* filter alias so one can use multiple aliases (for polar and nonpolar caps for
* example) */
// filter alias so one can use multiple aliases (for polar and
// nonpolar caps for example)
const FOOTPRINT_INFO *module = m_footprints.GetModuleInfo( alias.m_FootprintName );
if( module )
@@ -207,11 +211,11 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event )
}
/* obviously the last chance: there's only one filter matching one footprint */
// obviously the last chance: there's only one filter matching one footprint
if( !found && 1 == component->GetFootprintFilters().GetCount() )
{
/* we do not need to analyse wildcards: single footprint do not contain them */
/* and if there are wildcards it just will not match any */
// we do not need to analyse wildcards: single footprint do not
// contain them and if there are wildcards it just will not match any
const FOOTPRINT_INFO* module = m_footprints.GetModuleInfo( component->GetFootprintFilters()[0] );
if( module )
+12 -47
View File
@@ -327,17 +327,19 @@ void DISPLAY_FOOTPRINTS_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
void DISPLAY_FOOTPRINTS_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aHotKey )
{
wxRealPoint gridSize;
wxPoint oldpos;
PCB_SCREEN* screen = GetScreen();
wxPoint pos = aPosition;
// Filter out the 'fake' mouse motion after a keyboard movement
if( !aHotKey && m_movingCursorWithKeyboard )
{
m_movingCursorWithKeyboard = false;
return;
}
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
cmd.SetEventObject( this );
pos = GetNearestGridPosition( pos );
oldpos = GetCrossHairPosition();
gridSize = screen->GetGridSize();
wxPoint pos = aPosition;
wxPoint oldpos = GetCrossHairPosition();
GeneralControlKeyMovement( aHotKey, &pos, true );
switch( aHotKey )
{
@@ -367,49 +369,12 @@ void DISPLAY_FOOTPRINTS_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPositi
break;
case ' ':
screen->m_O_Curseur = GetCrossHairPosition();
break;
case WXK_NUMPAD8: /* cursor moved up */
case WXK_UP:
pos.y -= KiROUND( gridSize.y );
m_canvas->MoveCursor( pos );
break;
case WXK_NUMPAD2: /* cursor moved down */
case WXK_DOWN:
pos.y += KiROUND( gridSize.y );
m_canvas->MoveCursor( pos );
break;
case WXK_NUMPAD4: /* cursor moved left */
case WXK_LEFT:
pos.x -= KiROUND( gridSize.x );
m_canvas->MoveCursor( pos );
break;
case WXK_NUMPAD6: /* cursor moved right */
case WXK_RIGHT:
pos.x += KiROUND( gridSize.x );
m_canvas->MoveCursor( pos );
GetScreen()->m_O_Curseur = GetCrossHairPosition();
break;
}
SetCrossHairPosition( pos );
if( oldpos != GetCrossHairPosition() )
{
pos = GetCrossHairPosition();
SetCrossHairPosition( oldpos );
m_canvas->CrossHairOff( aDC );
SetCrossHairPosition( pos );
m_canvas->CrossHairOn( aDC );
if( m_canvas->IsMouseCaptured() )
{
m_canvas->CallMouseCapture( aDC, aPosition, 0 );
}
}
RefreshCrossHair( oldpos, aPosition, aDC );
UpdateStatusBar(); /* Display new cursor coordinates */
}
@@ -516,7 +481,7 @@ void DISPLAY_FOOTPRINTS_FRAME::InitDisplay()
CVPCB_MAINFRAME* parentframe = (CVPCB_MAINFRAME *) GetParent();
wxString footprintName = parentframe->m_FootprintList->GetSelectedFootprint();
wxString footprintName = parentframe->m_footprintListBox->GetSelectedFootprint();
if( !footprintName.IsEmpty() )
{
+6 -4
View File
@@ -60,11 +60,13 @@ int FOOTPRINTS_LISTBOX::GetCount()
void FOOTPRINTS_LISTBOX::SetString( unsigned linecount, const wxString& text )
{
if( linecount >= m_footprintList.Count() )
linecount = m_footprintList.Count() - 1;
if( linecount >= 0 )
unsigned count = m_footprintList.Count();
if( count > 0 )
{
if( linecount >= count )
linecount = count - 1;
m_footprintList[linecount] = text;
}
}
+6 -4
View File
@@ -60,11 +60,13 @@ int LIBRARY_LISTBOX::GetCount()
void LIBRARY_LISTBOX::SetString( unsigned linecount, const wxString& text )
{
if( linecount >= m_libraryList.Count() )
linecount = m_libraryList.Count() - 1;
if( linecount >= 0 )
unsigned count = m_libraryList.Count();
if( count > 0 )
{
if( linecount >= count )
linecount = count - 1;
m_libraryList[linecount] = text;
}
}
+69 -69
View File
@@ -108,9 +108,9 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) :
wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, CVPCB_MAINFRAME_NAME )
{
m_FrameName = CVPCB_MAINFRAME_NAME;
m_ListCmp = NULL;
m_FootprintList = NULL;
m_LibraryList = NULL;
m_compListBox = NULL;
m_footprintListBox = NULL;
m_libListBox = NULL;
m_mainToolBar = NULL;
m_modified = false;
m_isEESchemaNetlist = false;
@@ -175,18 +175,18 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) :
m_auimgr.AddPane( m_mainToolBar,
wxAuiPaneInfo( horiz ).Name( wxT( "m_mainToolBar" ) ).Top() );
if( m_ListCmp )
m_auimgr.AddPane( m_ListCmp,
wxAuiPaneInfo( horiz ).Name( wxT( "m_ListCmp" ) ).CentrePane() );
if( m_compListBox )
m_auimgr.AddPane( m_compListBox,
wxAuiPaneInfo( horiz ).Name( wxT( "m_compListBox" ) ).CentrePane() );
if( m_LibraryList)
m_auimgr.AddPane( m_LibraryList,
wxAuiPaneInfo( info ).Name( wxT( "m_LibraryList" ) ).
if( m_libListBox)
m_auimgr.AddPane( m_libListBox,
wxAuiPaneInfo( info ).Name( wxT( "m_libListBox" ) ).
Left().BestSize( (int) ( m_FrameSize.x * 0.20 ), m_FrameSize.y ) );
if( m_FootprintList )
m_auimgr.AddPane( m_FootprintList,
wxAuiPaneInfo( info ).Name( wxT( "m_FootprintList" ) ).
if( m_footprintListBox )
m_auimgr.AddPane( m_footprintListBox,
wxAuiPaneInfo( info ).Name( wxT( "m_footprintListBox" ) ).
Right().BestSize( (int) ( m_FrameSize.x * 0.30 ), m_FrameSize.y ) );
m_auimgr.Update();
@@ -302,21 +302,21 @@ void CVPCB_MAINFRAME::ChangeFocus( bool aMoveRight )
if( aMoveRight )
{
if( hasFocus == m_LibraryList )
m_ListCmp->SetFocus();
else if( hasFocus == m_ListCmp )
m_FootprintList->SetFocus();
else if( hasFocus == m_FootprintList )
m_LibraryList->SetFocus();
if( hasFocus == m_libListBox )
m_compListBox->SetFocus();
else if( hasFocus == m_compListBox )
m_footprintListBox->SetFocus();
else if( hasFocus == m_footprintListBox )
m_libListBox->SetFocus();
}
else
{
if( hasFocus == m_LibraryList )
m_FootprintList->SetFocus();
else if( hasFocus == m_ListCmp )
m_LibraryList->SetFocus();
else if( hasFocus == m_FootprintList )
m_ListCmp->SetFocus();
if( hasFocus == m_libListBox )
m_footprintListBox->SetFocus();
else if( hasFocus == m_compListBox )
m_libListBox->SetFocus();
else if( hasFocus == m_footprintListBox )
m_compListBox->SetFocus();
}
}
@@ -326,7 +326,7 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event )
if( m_netlist.IsEmpty() )
return;
long selection = m_ListCmp->GetFirstSelected();
long selection = m_compListBox->GetFirstSelected();
if( selection < 0 )
selection = -1; // We will start to 0 for the first search , if no item selected
@@ -335,8 +335,8 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event )
{
if( m_netlist.GetComponent( jj )->GetFPID().empty() )
{
m_ListCmp->SetSelection( wxNOT_FOUND, false ); // Remove all selections
m_ListCmp->SetSelection( jj );
m_compListBox->SetSelection( wxNOT_FOUND, false ); // Remove all selections
m_compListBox->SetSelection( jj );
SendMessageToEESCHEMA();
return;
}
@@ -349,20 +349,20 @@ void CVPCB_MAINFRAME::ToPreviousNA( wxCommandEvent& event )
if( m_netlist.IsEmpty() )
return;
int selection = m_ListCmp->GetFirstSelected();
int selection = m_compListBox->GetFirstSelected();
if( selection < 0 )
selection = m_ListCmp->GetCount();
selection = m_compListBox->GetCount();
else
while( m_ListCmp->GetNextSelected( selection ) >= 0 )
selection = m_ListCmp->GetNextSelected( selection );
while( m_compListBox->GetNextSelected( selection ) >= 0 )
selection = m_compListBox->GetNextSelected( selection );
for( int kk = selection-1; kk >= 0; kk-- )
{
if( m_netlist.GetComponent( kk )->GetFPID().empty() )
{
m_ListCmp->SetSelection( wxNOT_FOUND, false ); // Remove all selections
m_ListCmp->SetSelection( kk );
m_compListBox->SetSelection( wxNOT_FOUND, false ); // Remove all selections
m_compListBox->SetSelection( kk );
SendMessageToEESCHEMA();
return;
}
@@ -392,7 +392,7 @@ void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event )
if( IsOK( this, _( "Delete selections" ) ) )
{
m_skipComponentSelect = true;
m_ListCmp->SetSelection( 0 );
m_compListBox->SetSelection( 0 );
for( unsigned i = 0; i < m_netlist.GetCount(); i++ )
{
@@ -403,7 +403,7 @@ void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event )
}
m_skipComponentSelect = false;
m_ListCmp->SetSelection( 0 );
m_compListBox->SetSelection( 0 );
m_undefinedComponentCnt = m_netlist.GetCount();
}
@@ -562,8 +562,8 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
filter |= FOOTPRINTS_LISTBOX::BY_LIBRARY;
component = GetSelectedComponent();
libraryName = m_LibraryList->GetSelectedLibrary();
m_FootprintList->SetFootprints( m_footprints, libraryName, component, filter );
libraryName = m_libListBox->GetSelectedLibrary();
m_footprintListBox->SetFootprints( m_footprints, libraryName, component, filter );
// Tell AuiMgr that objects are changed !
if( m_auimgr.GetManagedWindow() ) // Be sure Aui Manager is initialized
@@ -578,23 +578,23 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
// but only if the selection is made from the component list or the library list.
// If the selection is made from the footprint list, do not change the current
// selected footprint.
if( FindFocus() == m_ListCmp || FindFocus() == m_LibraryList )
if( FindFocus() == m_compListBox || FindFocus() == m_libListBox )
{
wxString module = FROM_UTF8( component->GetFPID().Format().c_str() );
bool found = false;
for( int ii = 0; ii < m_FootprintList->GetCount(); ii++ )
for( int ii = 0; ii < m_footprintListBox->GetCount(); ii++ )
{
wxString footprintName;
wxString msg = m_FootprintList->OnGetItemText( ii, 0 );
wxString msg = m_footprintListBox->OnGetItemText( ii, 0 );
msg.Trim( true );
msg.Trim( false );
footprintName = msg.AfterFirst( wxChar( ' ' ) );
if( module.Cmp( footprintName ) == 0 )
{
m_FootprintList->SetSelection( ii, true );
m_footprintListBox->SetSelection( ii, true );
found = true;
break;
}
@@ -602,10 +602,10 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event )
if( !found )
{
int ii = m_FootprintList->GetSelection();
int ii = m_footprintListBox->GetSelection();
if ( ii >= 0 )
m_FootprintList->SetSelection( ii, false );
m_footprintListBox->SetSelection( ii, false );
if( GetFpViewerFrame() )
{
@@ -638,7 +638,7 @@ void CVPCB_MAINFRAME::DisplayStatus()
wxString msg;
COMPONENT* component;
if( wxWindow::FindFocus() == m_ListCmp || wxWindow::FindFocus() == m_LibraryList )
if( wxWindow::FindFocus() == m_compListBox || wxWindow::FindFocus() == m_libListBox )
{
msg.Printf( _( "Components: %d, unassigned: %d" ), (int) m_netlist.GetCount(),
m_undefinedComponentCnt );
@@ -665,7 +665,7 @@ void CVPCB_MAINFRAME::DisplayStatus()
}
else
{
wxString footprintName = m_FootprintList->GetSelectedFootprint();
wxString footprintName = m_footprintListBox->GetSelectedFootprint();
FOOTPRINT_INFO* module = m_footprints.GetModuleInfo( footprintName );
@@ -681,7 +681,7 @@ void CVPCB_MAINFRAME::DisplayStatus()
msg.Empty();
if( m_FootprintList )
if( m_footprintListBox )
{
if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_FILTERED_LIST ) )
msg = _( "key words" );
@@ -707,7 +707,7 @@ void CVPCB_MAINFRAME::DisplayStatus()
else
msg = _( "Filtered by " ) + msg;
msg << wxT( ": " ) << m_FootprintList->GetCount();
msg << wxT( ": " ) << m_footprintListBox->GetCount();
SetStatusText( msg, 2 );
}
@@ -762,7 +762,7 @@ void CVPCB_MAINFRAME::SendMessageToEESCHEMA()
if( m_netlist.IsEmpty() )
return;
int selection = m_ListCmp->GetSelection();
int selection = m_compListBox->GetSelection();
if ( selection < 0 )
selection = 0;
@@ -914,17 +914,17 @@ void CVPCB_MAINFRAME::BuildFOOTPRINTS_LISTBOX()
{
wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
if( m_FootprintList == NULL )
if( m_footprintListBox == NULL )
{
m_FootprintList = new FOOTPRINTS_LISTBOX( this, ID_CVPCB_FOOTPRINT_LIST,
m_footprintListBox = new FOOTPRINTS_LISTBOX( this, ID_CVPCB_FOOTPRINT_LIST,
wxDefaultPosition, wxDefaultSize );
m_FootprintList->SetFont( wxFont( guiFont.GetPointSize(),
m_footprintListBox->SetFont( wxFont( guiFont.GetPointSize(),
wxFONTFAMILY_MODERN,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL ) );
}
m_FootprintList->SetFootprints( m_footprints, wxEmptyString, NULL,
m_footprintListBox->SetFootprints( m_footprints, wxEmptyString, NULL,
FOOTPRINTS_LISTBOX::UNFILTERED );
DisplayStatus();
}
@@ -936,34 +936,34 @@ void CVPCB_MAINFRAME::BuildCmpListBox()
COMPONENT* component;
wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
if( m_ListCmp == NULL )
if( m_compListBox == NULL )
{
m_ListCmp = new COMPONENTS_LISTBOX( this, ID_CVPCB_COMPONENT_LIST,
m_compListBox = new COMPONENTS_LISTBOX( this, ID_CVPCB_COMPONENT_LIST,
wxDefaultPosition, wxDefaultSize );
m_ListCmp->SetFont( wxFont( guiFont.GetPointSize(),
m_compListBox->SetFont( wxFont( guiFont.GetPointSize(),
wxFONTFAMILY_MODERN,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL ) );
}
m_ListCmp->m_ComponentList.Clear();
m_compListBox->m_ComponentList.Clear();
for( unsigned i = 0; i < m_netlist.GetCount(); i++ )
{
component = m_netlist.GetComponent( i );
msg.Printf( CMP_FORMAT, m_ListCmp->GetCount() + 1,
msg.Printf( CMP_FORMAT, m_compListBox->GetCount() + 1,
GetChars( component->GetReference() ),
GetChars( component->GetValue() ),
GetChars( FROM_UTF8( component->GetFPID().Format().c_str() ) ) );
m_ListCmp->m_ComponentList.Add( msg );
m_compListBox->m_ComponentList.Add( msg );
}
if( m_ListCmp->m_ComponentList.Count() )
if( m_compListBox->m_ComponentList.Count() )
{
m_ListCmp->SetItemCount( m_ListCmp->m_ComponentList.Count() );
m_ListCmp->SetSelection( 0, true );
m_ListCmp->RefreshItems( 0L, m_ListCmp->m_ComponentList.Count()-1 );
m_compListBox->SetItemCount( m_compListBox->m_ComponentList.Count() );
m_compListBox->SetSelection( 0, true );
m_compListBox->RefreshItems( 0L, m_compListBox->m_ComponentList.Count()-1 );
#if defined (__WXGTK__ )
// @bug On GTK and wxWidgets 2.8.x, this will assert in debug builds because the
@@ -971,9 +971,9 @@ void CVPCB_MAINFRAME::BuildCmpListBox()
// ellipsizing long strings down to a few characters. It still doesn't set
// the scroll bars correctly (too short) but it's better than any of the
// other alternatives. If someone knows how to fix this, please do.
m_ListCmp->SetColumnWidth( -1, wxLIST_AUTOSIZE );
m_compListBox->SetColumnWidth( -1, wxLIST_AUTOSIZE );
#else
m_ListCmp->SetColumnWidth( 0, wxLIST_AUTOSIZE );
m_compListBox->SetColumnWidth( 0, wxLIST_AUTOSIZE );
#endif
}
}
@@ -983,11 +983,11 @@ void CVPCB_MAINFRAME::BuildLIBRARY_LISTBOX()
{
wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
if( m_LibraryList == NULL )
if( m_libListBox == NULL )
{
m_LibraryList = new LIBRARY_LISTBOX( this, ID_CVPCB_LIBRARY_LIST,
m_libListBox = new LIBRARY_LISTBOX( this, ID_CVPCB_LIBRARY_LIST,
wxDefaultPosition, wxDefaultSize );
m_LibraryList->SetFont( wxFont( guiFont.GetPointSize(),
m_libListBox->SetFont( wxFont( guiFont.GetPointSize(),
wxFONTFAMILY_MODERN,
wxFONTSTYLE_NORMAL,
wxFONTWEIGHT_NORMAL ) );
@@ -1004,14 +1004,14 @@ void CVPCB_MAINFRAME::BuildLIBRARY_LISTBOX()
for( unsigned ii = 0; ii < libNickNames.size(); ii++ )
libNames.Add( libNickNames[ii] );
m_LibraryList->SetLibraryList( libNames );
m_libListBox->SetLibraryList( libNames );
}
}
COMPONENT* CVPCB_MAINFRAME::GetSelectedComponent()
{
int selection = m_ListCmp->GetSelection();
int selection = m_compListBox->GetSelection();
if( selection >= 0 && selection < (int) m_netlist.GetCount() )
return m_netlist.GetComponent( selection );
-4
View File
@@ -56,8 +56,6 @@ const wxString FootprintAliasFileExtension( wxT( "equ" ) );
// Wildcard for schematic retroannotation (import footprint names in schematic):
const wxString FootprintAliasFileWildcard( _( "KiCad footprint alias files (*.equ)|*.equ" ) );
const wxString titleLibLoadError( _( "Library Load Error" ) );
#if 0 // add this logic to OpenProjectFiles()
@@ -294,8 +292,6 @@ bool IFACE::OnKifaceStart( PGM_BASE* aProgram, int aCtlBits )
// SetFootprintLibTablePath();
*/
g_DrawBgColor = BLACK;
try
{
// The global table is not related to a specific project. All projects
-1
View File
@@ -21,6 +21,5 @@ extern const wxString RetroFileExtension;
extern const wxString FootprintAliasFileWildcard;
extern const wxString titleLibLoadError;
#endif /* __CVPCB_H__ */
+3 -3
View File
@@ -60,9 +60,9 @@ class CVPCB_MAINFRAME : public KIWAY_PLAYER
public:
bool m_KeepCvpcbOpen;
FOOTPRINTS_LISTBOX* m_FootprintList;
LIBRARY_LISTBOX* m_LibraryList;
COMPONENTS_LISTBOX* m_ListCmp;
FOOTPRINTS_LISTBOX* m_footprintListBox;
LIBRARY_LISTBOX* m_libListBox;
COMPONENTS_LISTBOX* m_compListBox;
wxAuiToolBar* m_mainToolBar;
wxFileName m_NetlistFileName;
wxArrayString m_ModuleLibNames;
+32 -15
View File
@@ -28,6 +28,7 @@
*/
#include <fctsys.h>
#include <kiway.h>
#include <common.h>
#include <confirm.h>
#include <build_version.h>
@@ -49,23 +50,22 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName )
COMPONENT* component;
bool hasFootprint = false;
int componentIndex;
wxString description;
if( m_netlist.IsEmpty() )
return;
// If no component is selected, select the first one
if( m_ListCmp->GetFirstSelected() < 0 )
if( m_compListBox->GetFirstSelected() < 0 )
{
componentIndex = 0;
m_ListCmp->SetSelection( componentIndex, true );
m_compListBox->SetSelection( componentIndex, true );
}
// iterate over the selection
while( m_ListCmp->GetFirstSelected() != -1 )
while( m_compListBox->GetFirstSelected() != -1 )
{
// Get the component for the current iteration
componentIndex = m_ListCmp->GetFirstSelected();
componentIndex = m_compListBox->GetFirstSelected();
component = m_netlist.GetComponent( componentIndex );
if( component == NULL )
@@ -86,7 +86,7 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName )
component->SetFPID( fpid );
// create the new component description
description.Printf( CMP_FORMAT, componentIndex + 1,
wxString description = wxString::Format( CMP_FORMAT, componentIndex + 1,
GetChars( component->GetReference() ),
GetChars( component->GetValue() ),
GetChars( FROM_UTF8( component->GetFPID().Format().c_str() ) ) );
@@ -101,18 +101,18 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName )
}
// Set the new description and deselect the processed component
m_ListCmp->SetString( componentIndex, description );
m_ListCmp->SetSelection( componentIndex, false );
m_compListBox->SetString( componentIndex, description );
m_compListBox->SetSelection( componentIndex, false );
}
// Mark this "session" as modified
m_modified = true;
// select the next component, if there is one
if( componentIndex < (m_ListCmp->GetCount() - 1) )
if( componentIndex < (m_compListBox->GetCount() - 1) )
componentIndex++;
m_ListCmp->SetSelection( componentIndex, true );
m_compListBox->SetSelection( componentIndex, true );
// update the statusbar
DisplayStatus();
@@ -166,7 +166,7 @@ bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles()
ReadSchematicNetlist();
if( m_ListCmp == NULL )
if( m_compListBox == NULL )
return false;
LoadProjectFile( m_NetlistFileName.GetFullPath() );
@@ -175,7 +175,7 @@ bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles()
BuildFOOTPRINTS_LISTBOX();
BuildLIBRARY_LISTBOX();
m_ListCmp->Clear();
m_compListBox->Clear();
m_undefinedComponentCnt = 0;
if( m_netlist.AnyFootprintsLinked() )
@@ -295,12 +295,12 @@ bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles()
{
COMPONENT* component = m_netlist.GetComponent( i );
msg.Printf( CMP_FORMAT, m_ListCmp->GetCount() + 1,
msg.Printf( CMP_FORMAT, m_compListBox->GetCount() + 1,
GetChars( component->GetReference() ),
GetChars( component->GetValue() ),
GetChars( FROM_UTF8( component->GetFPID().Format().c_str() ) ) );
m_ListCmp->AppendLine( msg );
m_compListBox->AppendLine( msg );
if( component->GetFPID().empty() )
{
@@ -310,7 +310,7 @@ bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles()
}
if( !m_netlist.IsEmpty() )
m_ListCmp->SetSelection( 0, true );
m_compListBox->SetSelection( 0, true );
DisplayStatus();
@@ -344,6 +344,11 @@ int CVPCB_MAINFRAME::SaveCmpLinkFile( const wxString& aFullFileName )
if( !fn.HasExt() )
fn.SetExt( ComponentFileExtension );
#if 0 // RHH 6-Jul-14: We did not auto generate the
// footprint table. And the dialog which does suppport editing does the saving.
// Besides, this is not the place to do this, it belies the name of this
// function.
// Save the project specific footprint library table.
if( !Prj().PcbFootprintLibs()->IsEmpty( false ) )
{
@@ -369,6 +374,8 @@ int CVPCB_MAINFRAME::SaveCmpLinkFile( const wxString& aFullFileName )
}
}
}
#endif
}
if( !IsWritable( fn.GetFullPath() ) )
@@ -381,6 +388,16 @@ int CVPCB_MAINFRAME::SaveCmpLinkFile( const wxString& aFullFileName )
}
wxString msg = wxString::Format( _("File %s saved"), GetChars( fn.GetFullPath() ) );
// Perhaps this replaces all of the above someday.
{
STRING_FORMATTER sf;
m_netlist.FormatBackAnnotation( &sf );
Kiway().ExpressMail( FRAME_SCH, MAIL_BACKANNOTATE_FOOTPRINTS, sf.GetString() );
}
SetStatusText( msg );
return 1;
}
+31 -32
View File
@@ -7,12 +7,11 @@ LIBS:linear
LIBS:regul
LIBS:interface
LIBS:special
LIBS:complex_hierarchy-cache
EELAYER 24 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 2 3
Sheet 3 3
Title ""
Date "1 apr 2010"
Rev ""
@@ -152,7 +151,7 @@ U 1 1 4B617B88
P 9150 5350
AR Path="/4B3A1333/4B617B88" Ref="R26" Part="1"
AR Path="/4B3A13A4/4B617B88" Ref="R28" Part="1"
F 0 "R28" V 9230 5350 50 0000 C CNN
F 0 "R26" V 9230 5350 50 0000 C CNN
F 1 "220K" V 9150 5350 50 0000 C CNN
F 2 "" H 9150 5350 60 0001 C CNN
F 3 "" H 9150 5350 60 0001 C CNN
@@ -173,7 +172,7 @@ U 1 1 4B616B96
P 9450 4700
AR Path="/4B3A1333/4B616B96" Ref="R25" Part="1"
AR Path="/4B3A13A4/4B616B96" Ref="R27" Part="1"
F 0 "R27" V 9530 4700 50 0000 C CNN
F 0 "R25" V 9530 4700 50 0000 C CNN
F 1 "47" V 9450 4700 50 0000 C CNN
F 2 "" H 9450 4700 60 0001 C CNN
F 3 "" H 9450 4700 60 0001 C CNN
@@ -186,7 +185,7 @@ U 1 1 4B616AFA
P 8200 4600
AR Path="/4B3A1333/4B616AFA" Ref="D8" Part="1"
AR Path="/4B3A13A4/4B616AFA" Ref="D9" Part="1"
F 0 "D9" H 8200 4700 40 0000 C CNN
F 0 "D8" H 8200 4700 40 0000 C CNN
F 1 "1N4148" H 8200 4500 40 0000 C CNN
F 2 "" H 8200 4600 60 0001 C CNN
F 3 "" H 8200 4600 60 0001 C CNN
@@ -228,7 +227,7 @@ U 1 1 4B61688C
P 8100 5250
AR Path="/4B3A1333/4B61688C" Ref="R10" Part="1"
AR Path="/4B3A13A4/4B61688C" Ref="R20" Part="1"
F 0 "R20" V 8180 5250 50 0000 C CNN
F 0 "R10" V 8180 5250 50 0000 C CNN
F 1 "5,6K" V 8100 5250 50 0000 C CNN
F 2 "" H 8100 5250 60 0001 C CNN
F 3 "" H 8100 5250 60 0001 C CNN
@@ -270,7 +269,7 @@ U 1 1 4B4F3641
P 2850 2250
AR Path="/4B3A1333/4B4F3641" Ref="C12" Part="1"
AR Path="/4B3A13A4/4B4F3641" Ref="C14" Part="1"
F 0 "C14" H 2900 2350 50 0000 L CNN
F 0 "C12" H 2900 2350 50 0000 L CNN
F 1 "150nF" H 2900 2150 50 0000 L CNN
F 2 "" H 2850 2250 60 0001 C CNN
F 3 "" H 2850 2250 60 0001 C CNN
@@ -283,7 +282,7 @@ U 1 1 4B4F363E
P 2500 2000
AR Path="/4B3A1333/4B4F363E" Ref="R23" Part="1"
AR Path="/4B3A13A4/4B4F363E" Ref="R24" Part="1"
F 0 "R24" V 2580 2000 50 0000 C CNN
F 0 "R23" V 2580 2000 50 0000 C CNN
F 1 "1K" V 2500 2000 50 0000 C CNN
F 2 "" H 2500 2000 60 0001 C CNN
F 3 "" H 2500 2000 60 0001 C CNN
@@ -336,7 +335,7 @@ U 1 1 4B3A137D
P 8500 4250
AR Path="/4B3A13A4/4B3A137D" Ref="Q6" Part="1"
AR Path="/4B3A1333/4B3A137D" Ref="Q2" Part="1"
F 0 "Q6" H 8500 4100 50 0000 R CNN
F 0 "Q2" H 8500 4100 50 0000 R CNN
F 1 "MPAS42" H 8500 4400 50 0000 R CNN
F 2 "" H 8500 4250 60 0001 C CNN
F 3 "" H 8500 4250 60 0001 C CNN
@@ -357,7 +356,7 @@ U 1 1 4B3A137C
P 8500 4900
AR Path="/4B3A13A4/4B3A137C" Ref="Q7" Part="1"
AR Path="/4B3A1333/4B3A137C" Ref="Q3" Part="1"
F 0 "Q7" H 8500 4750 60 0000 R CNN
F 0 "Q3" H 8500 4750 60 0000 R CNN
F 1 "MPAS92" H 8500 5050 60 0000 R CNN
F 2 "" H 8500 4900 60 0001 C CNN
F 3 "" H 8500 4900 60 0001 C CNN
@@ -378,7 +377,7 @@ U 1 1 4B3A137B
P 7900 4600
AR Path="/4B3A13A4/4B3A137B" Ref="D7" Part="1"
AR Path="/4B3A1333/4B3A137B" Ref="D4" Part="1"
F 0 "D7" H 7900 4700 40 0000 C CNN
F 0 "D4" H 7900 4700 40 0000 C CNN
F 1 "1N4148" H 7900 4500 40 0000 C CNN
F 2 "" H 7900 4600 60 0001 C CNN
F 3 "" H 7900 4600 60 0001 C CNN
@@ -420,7 +419,7 @@ U 1 1 4B3A1379
P 7800 5100
AR Path="/4B3A13A4/4B3A1379" Ref="Q8" Part="1"
AR Path="/4B3A1333/4B3A1379" Ref="Q4" Part="1"
F 0 "Q8" H 7800 4950 50 0000 R CNN
F 0 "Q4" H 7800 4950 50 0000 R CNN
F 1 "MPAS42" H 7800 5250 50 0000 R CNN
F 2 "" H 7800 5100 60 0001 C CNN
F 3 "" H 7800 5100 60 0001 C CNN
@@ -462,7 +461,7 @@ U 1 1 4B3A1377
P 7650 3600
AR Path="/4B3A13A4/4B3A1377" Ref="D6" Part="1"
AR Path="/4B3A1333/4B3A1377" Ref="D3" Part="1"
F 0 "D6" H 7650 3700 40 0000 C CNN
F 0 "D3" H 7650 3700 40 0000 C CNN
F 1 "1N4148" H 7650 3500 40 0000 C CNN
F 2 "" H 7650 3600 60 0001 C CNN
F 3 "" H 7650 3600 60 0001 C CNN
@@ -483,7 +482,7 @@ U 1 1 4B3A1376
P 8200 3300
AR Path="/4B3A13A4/4B3A1376" Ref="R13" Part="1"
AR Path="/4B3A1333/4B3A1376" Ref="R3" Part="1"
F 0 "R13" V 8280 3300 50 0000 C CNN
F 0 "R3" V 8280 3300 50 0000 C CNN
F 1 "470" V 8200 3300 50 0000 C CNN
F 2 "" H 8200 3300 60 0001 C CNN
F 3 "" H 8200 3300 60 0001 C CNN
@@ -504,7 +503,7 @@ U 1 1 4B3A1375
P 7650 3150
AR Path="/4B3A13A4/4B3A1375" Ref="D5" Part="1"
AR Path="/4B3A1333/4B3A1375" Ref="D2" Part="1"
F 0 "D5" H 7650 3250 40 0000 C CNN
F 0 "D2" H 7650 3250 40 0000 C CNN
F 1 "1N4148" H 7650 3050 40 0000 C CNN
F 2 "" H 7650 3150 60 0001 C CNN
F 3 "" H 7650 3150 60 0001 C CNN
@@ -525,7 +524,7 @@ U 1 1 4B3A1374
P 7650 4150
AR Path="/4B3A13A4/4B3A1374" Ref="R14" Part="1"
AR Path="/4B3A1333/4B3A1374" Ref="R4" Part="1"
F 0 "R14" V 7730 4150 50 0000 C CNN
F 0 "R4" V 7730 4150 50 0000 C CNN
F 1 "220K" V 7650 4150 50 0000 C CNN
F 2 "" H 7650 4150 60 0001 C CNN
F 3 "" H 7650 4150 60 0001 C CNN
@@ -567,7 +566,7 @@ U 1 1 4B3A1371
P 7250 5100
AR Path="/4B3A13A4/4B3A1371" Ref="R18" Part="1"
AR Path="/4B3A1333/4B3A1371" Ref="R8" Part="1"
F 0 "R18" V 7330 5100 50 0000 C CNN
F 0 "R8" V 7330 5100 50 0000 C CNN
F 1 "1K" V 7250 5100 50 0000 C CNN
F 2 "" H 7250 5100 60 0001 C CNN
F 3 "" H 7250 5100 60 0001 C CNN
@@ -588,7 +587,7 @@ U 1 1 4B3A1370
P 8900 5350
AR Path="/4B3A13A4/4B3A1370" Ref="R22" Part="1"
AR Path="/4B3A1333/4B3A1370" Ref="R12" Part="1"
F 0 "R22" V 8980 5350 50 0000 C CNN
F 0 "R12" V 8980 5350 50 0000 C CNN
F 1 "220K" V 8900 5350 50 0000 C CNN
F 2 "" H 8900 5350 60 0001 C CNN
F 3 "" H 8900 5350 60 0001 C CNN
@@ -630,7 +629,7 @@ U 1 1 4B3A136D
P 7400 5400
AR Path="/4B3A13A4/4B3A136D" Ref="R19" Part="1"
AR Path="/4B3A1333/4B3A136D" Ref="R9" Part="1"
F 0 "R19" V 7480 5400 50 0000 C CNN
F 0 "R9" V 7480 5400 50 0000 C CNN
F 1 "1K" V 7400 5400 50 0000 C CNN
F 2 "" H 7400 5400 60 0001 C CNN
F 3 "" H 7400 5400 60 0001 C CNN
@@ -651,7 +650,7 @@ U 1 1 4B3A136C
P 10750 4700
AR Path="/4B3A13A4/4B3A136C" Ref="P5" Part="1"
AR Path="/4B3A1333/4B3A136C" Ref="P3" Part="1"
F 0 "P5" V 10700 4700 40 0000 C CNN
F 0 "P3" V 10700 4700 40 0000 C CNN
F 1 "CONN_2" V 10800 4700 40 0000 C CNN
F 2 "" H 10750 4700 60 0001 C CNN
F 3 "" H 10750 4700 60 0001 C CNN
@@ -666,7 +665,7 @@ U 1 1 4B3A136B
P 3400 2000
AR Path="/4B3A13A4/4B3A136B" Ref="R16" Part="1"
AR Path="/4B3A1333/4B3A136B" Ref="R6" Part="1"
F 0 "R16" V 3480 2000 50 0000 C CNN
F 0 "R6" V 3480 2000 50 0000 C CNN
F 1 "22K" V 3400 2000 50 0000 C CNN
F 2 "" H 3400 2000 60 0001 C CNN
F 3 "" H 3400 2000 60 0001 C CNN
@@ -729,7 +728,7 @@ U 1 1 4B3A1368
P 6400 5400
AR Path="/4B3A13A4/4B3A1368" Ref="U4" Part="1"
AR Path="/4B3A1333/4B3A1368" Ref="U3" Part="1"
F 0 "U4" H 6450 5600 60 0000 C CNN
F 0 "U3" H 6450 5600 60 0000 C CNN
F 1 "LM358N" H 6550 5200 50 0000 C CNN
F 2 "" H 6400 5400 60 0001 C CNN
F 3 "" H 6400 5400 60 0001 C CNN
@@ -742,7 +741,7 @@ U 1 1 4B3A1367
P 1400 2100
AR Path="/4B3A13A4/4B3A1367" Ref="P6" Part="1"
AR Path="/4B3A1333/4B3A1367" Ref="P4" Part="1"
F 0 "P6" V 1350 2100 40 0000 C CNN
F 0 "P4" V 1350 2100 40 0000 C CNN
F 1 "CONN_2" V 1450 2100 40 0000 C CNN
F 2 "" H 1400 2100 60 0001 C CNN
F 3 "" H 1400 2100 60 0001 C CNN
@@ -763,7 +762,7 @@ U 1 1 4B3A1366
P 4100 2450
AR Path="/4B3A13A4/4B3A1366" Ref="C7" Part="1"
AR Path="/4B3A1333/4B3A1366" Ref="C4" Part="1"
F 0 "C7" H 4150 2550 50 0000 L CNN
F 0 "C4" H 4150 2550 50 0000 L CNN
F 1 "4,7nF" H 4150 2350 50 0000 L CNN
F 2 "" H 4100 2450 60 0001 C CNN
F 3 "" H 4100 2450 60 0001 C CNN
@@ -776,7 +775,7 @@ U 1 1 4B3A1365
P 8100 5750
AR Path="/4B3A13A4/4B3A1365" Ref="C8" Part="1"
AR Path="/4B3A1333/4B3A1365" Ref="C5" Part="1"
F 0 "C8" H 8150 5850 50 0000 L CNN
F 0 "C5" H 8150 5850 50 0000 L CNN
F 1 "820pF" H 8150 5650 50 0000 L CNN
F 2 "" H 8100 5750 60 0001 C CNN
F 3 "" H 8100 5750 60 0001 C CNN
@@ -789,7 +788,7 @@ U 1 1 4B3A1364
P 9450 4450
AR Path="/4B3A13A4/4B3A1364" Ref="R15" Part="1"
AR Path="/4B3A1333/4B3A1364" Ref="R5" Part="1"
F 0 "R15" V 9530 4450 50 0000 C CNN
F 0 "R5" V 9530 4450 50 0000 C CNN
F 1 "47" V 9450 4450 50 0000 C CNN
F 2 "" H 9450 4450 60 0001 C CNN
F 3 "" H 9450 4450 60 0001 C CNN
@@ -815,7 +814,7 @@ U 1 1 4B3A1362
P 5150 6400
AR Path="/4B3A13A4/4B3A1362" Ref="R21" Part="1"
AR Path="/4B3A1333/4B3A1362" Ref="R11" Part="1"
F 0 "R21" V 5230 6400 50 0000 C CNN
F 0 "R11" V 5230 6400 50 0000 C CNN
F 1 "4,7K" V 5150 6400 50 0000 C CNN
F 2 "" H 5150 6400 60 0001 C CNN
F 3 "" H 5150 6400 60 0001 C CNN
@@ -857,7 +856,7 @@ U 1 1 4B3A1360
P 8100 3850
AR Path="/4B3A13A4/4B3A1360" Ref="Q5" Part="1"
AR Path="/4B3A1333/4B3A1360" Ref="Q1" Part="1"
F 0 "Q5" H 8100 3700 60 0000 R CNN
F 0 "Q1" H 8100 3700 60 0000 R CNN
F 1 "MPAS92" H 8100 4000 60 0000 R CNN
F 2 "" H 8100 3850 60 0001 C CNN
F 3 "" H 8100 3850 60 0001 C CNN
@@ -917,7 +916,7 @@ U 2 1 4B3A135C
P 4850 2400
AR Path="/4B3A13A4/4B3A135C" Ref="U4" Part="2"
AR Path="/4B3A1333/4B3A135C" Ref="U3" Part="2"
F 0 "U4" H 4900 2600 60 0000 C CNN
F 0 "U3" H 4900 2600 60 0000 C CNN
F 1 "LM358N" H 5000 2200 50 0000 C CNN
F 2 "" H 4850 2400 60 0001 C CNN
F 3 "" H 4850 2400 60 0001 C CNN
@@ -951,7 +950,7 @@ U 1 1 4B3A1359
P 4000 2000
AR Path="/4B3A13A4/4B3A1359" Ref="R17" Part="1"
AR Path="/4B3A1333/4B3A1359" Ref="R7" Part="1"
F 0 "R17" V 4080 2000 50 0000 C CNN
F 0 "R7" V 4080 2000 50 0000 C CNN
F 1 "22K" V 4000 2000 50 0000 C CNN
F 2 "" H 4000 2000 60 0001 C CNN
F 3 "" H 4000 2000 60 0001 C CNN
@@ -972,7 +971,7 @@ U 1 1 4B3A1358
P 4350 1600
AR Path="/4B3A13A4/4B3A1358" Ref="C6" Part="1"
AR Path="/4B3A1333/4B3A1358" Ref="C3" Part="1"
F 0 "C6" H 4400 1700 50 0000 L CNN
F 0 "C3" H 4400 1700 50 0000 L CNN
F 1 "15nF" H 4400 1500 50 0000 L CNN
F 2 "" H 4350 1600 60 0001 C CNN
F 3 "" H 4350 1600 60 0001 C CNN
@@ -987,7 +986,7 @@ U 1 1 4B3A1357
P 5850 6400
AR Path="/4B3A13A4/4B3A1357" Ref="RV2" Part="1"
AR Path="/4B3A1333/4B3A1357" Ref="RV1" Part="1"
F 0 "RV2" H 5850 6300 50 0000 C CNN
F 0 "RV1" H 5850 6300 50 0000 C CNN
F 1 "4,7K" H 5850 6400 50 0000 C CNN
F 2 "" H 5850 6400 60 0001 C CNN
F 3 "" H 5850 6400 60 0001 C CNN
@@ -1,9 +1,9 @@
(kicad_pcb (version 3) (host pcbnew "(2014-01-22 BZR 4630)-product")
(kicad_pcb (version 4) (host pcbnew "(2014-07-02 BZR 4969)-product")
(general
(links 112)
(no_connects 0)
(area 84.538458 51.714399 192.321543 131.927601)
(area 84.619458 51.714399 192.240543 131.927601)
(thickness 1.6002)
(drawings 6)
(tracks 360)
@@ -18,16 +18,19 @@
)
(layers
(15 Composant power)
(0 Cuivre signal)
(18 B.Paste user)
(19 F.Paste user)
(20 B.SilkS user)
(21 F.SilkS user)
(22 B.Mask user)
(23 F.Mask user)
(24 Dwgs.User user)
(28 Edge.Cuts user)
(0 Composant power)
(31 Cuivre signal)
(34 B.Paste user)
(35 F.Paste user)
(36 B.SilkS user)
(37 F.SilkS user)
(38 B.Mask user)
(39 F.Mask user)
(40 Dwgs.User user)
(41 Cmts.User user)
(42 Eco1.User user)
(43 Eco2.User user)
(44 Edge.Cuts user)
)
(setup
@@ -55,17 +58,18 @@
(pad_size 2.286 2.286)
(pad_drill 0.8128)
(pad_to_mask_clearance 0.254)
(aux_axis_origin 0 0)
(aux_axis_origin 83.5 138)
(visible_elements 7FFFFFFF)
(pcbplotparams
(layerselection 3178497)
(usegerberextensions true)
(excludeedgelayer true)
(layerselection 0x000fc_80000001)
(usegerberextensions false)
(usegerberattributes true)
(excludeedgelayer false)
(linewidth 0.150000)
(plotframeref false)
(viasonmask false)
(mode 1)
(useauxorigin false)
(useauxorigin true)
(hpglpennumber 1)
(hpglpenspeed 20)
(hpglpendiameter 15)
@@ -74,13 +78,12 @@
(psa4output false)
(plotreference true)
(plotvalue true)
(plotothertext true)
(plotinvisibletext false)
(padsonsilk false)
(subtractmaskfromsilk false)
(outputformat 1)
(mirror false)
(drillshape 1)
(drillshape 0)
(scaleselection 1)
(outputdirectory ""))
)
@@ -144,7 +147,6 @@
(via_drill 0.635)
(uvia_dia 0.508)
(uvia_drill 0.2032)
(add_net "")
(add_net +12V)
(add_net /ampli_ht_horizontal/PIEZO_IN)
(add_net /ampli_ht_horizontal/PIEZO_OUT)
@@ -2312,366 +2314,366 @@
(gr_line (start 188.595 51.816) (end 188.595 131.826) (angle 90) (layer Edge.Cuts) (width 0.2032))
(gr_line (start 88.265 51.816) (end 188.595 51.816) (angle 90) (layer Edge.Cuts) (width 0.2032))
(segment (start 91.6686 87.249) (end 98.298 87.249) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 99.695 88.646) (end 107.315 88.646) (width 0.6096) (layer Cuivre) (net 1) (status 400))
(segment (start 98.298 87.249) (end 99.695 88.646) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 91.6686 85.4837) (end 91.6686 81.8134) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 100.838 76.962) (end 109.27842 76.962) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 99.568 78.232) (end 100.838 76.962) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 95.25 78.232) (end 99.568 78.232) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 91.6686 81.8134) (end 95.25 78.232) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 123.825 68.326) (end 123.825 63.74892) (width 0.6096) (layer Cuivre) (net 1) (status 800))
(segment (start 136.78916 63.74892) (end 139.83208 60.706) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 122.4915 63.74892) (end 123.825 63.74892) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 123.825 63.74892) (end 136.78916 63.74892) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 117.91442 68.326) (end 122.4915 63.74892) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 141.605 60.706) (end 139.83208 60.706) (width 0.6096) (layer Cuivre) (net 1) (status 800))
(segment (start 116.205 68.326) (end 117.91442 68.326) (width 0.6096) (layer Cuivre) (net 1) (status 800))
(segment (start 116.205 68.326) (end 116.205 70.03542) (width 0.6096) (layer Cuivre) (net 1) (status 800))
(segment (start 116.205 70.03542) (end 109.27842 76.962) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 91.6686 112.75314) (end 91.6686 87.249) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 91.6686 87.249) (end 91.6686 85.4837) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 92.64904 113.73358) (end 91.6686 112.75314) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 94.68866 113.73358) (end 92.64904 113.73358) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 97.54108 116.586) (end 94.68866 113.73358) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 107.315 116.586) (end 97.54108 116.586) (width 0.6096) (layer Cuivre) (net 1) (status 800))
(segment (start 113.411 126.492) (end 114.681 126.492) (width 0.6096) (layer Composant) (net 2))
(segment (start 114.935 126.238) (end 114.935 124.206) (width 0.6096) (layer Composant) (net 2) (status 400))
(segment (start 114.681 126.492) (end 114.935 126.238) (width 0.6096) (layer Composant) (net 2))
(segment (start 105.41 126.492) (end 104.775 125.857) (width 0.6096) (layer Composant) (net 2))
(segment (start 113.411 126.492) (end 105.41 126.492) (width 0.6096) (layer Composant) (net 2))
(segment (start 128.905 76.581) (end 128.143 76.581) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 123.317 77.724) (end 122.555 78.486) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 127 77.724) (end 123.317 77.724) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 128.143 76.581) (end 127 77.724) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 114.935 102.108) (end 114.935 102.362) (width 0.6096) (layer Composant) (net 2))
(segment (start 104.775 109.601) (end 104.775 125.857) (width 0.6096) (layer Composant) (net 2))
(segment (start 114.935 96.266) (end 114.935 102.108) (width 0.6096) (layer Composant) (net 2) (status 800))
(segment (start 114.935 102.362) (end 112.776 104.521) (width 0.6096) (layer Composant) (net 2))
(segment (start 112.776 104.521) (end 107.061 104.521) (width 0.6096) (layer Composant) (net 2))
(segment (start 107.061 104.521) (end 104.775 106.807) (width 0.6096) (layer Composant) (net 2))
(segment (start 104.775 106.807) (end 104.775 109.601) (width 0.6096) (layer Composant) (net 2))
(segment (start 114.935 96.266) (end 114.935 95.123) (width 0.6096) (layer Cuivre) (net 2) (status 800))
(segment (start 114.935 95.123) (end 117.602 92.456) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 117.602 92.456) (end 120.015 92.456) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 120.015 92.456) (end 122.555 89.916) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 122.555 89.916) (end 122.555 78.486) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 153.035 66.421) (end 153.035 64.516) (width 0.6096) (layer Cuivre) (net 2) (status 400))
(segment (start 152.4 67.056) (end 153.035 66.421) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 140.97 67.056) (end 152.4 67.056) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 131.445 76.581) (end 140.97 67.056) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 128.905 76.581) (end 131.445 76.581) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 153.035 64.516) (end 158.75 64.516) (width 0.6096) (layer Cuivre) (net 2) (status 800))
(segment (start 97.54108 116.586) (end 94.68866 113.73358) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 94.68866 113.73358) (end 92.64904 113.73358) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 92.64904 113.73358) (end 91.6686 112.75314) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 91.6686 87.249) (end 91.6686 85.4837) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 91.6686 112.75314) (end 91.6686 87.249) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 116.205 70.03542) (end 109.27842 76.962) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 116.205 68.326) (end 116.205 70.03542) (width 0.6096) (layer Cuivre) (net 1) (status 800))
(segment (start 116.205 68.326) (end 117.91442 68.326) (width 0.6096) (layer Cuivre) (net 1) (status 800))
(segment (start 141.605 60.706) (end 139.83208 60.706) (width 0.6096) (layer Cuivre) (net 1) (status 800))
(segment (start 117.91442 68.326) (end 122.4915 63.74892) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 123.825 63.74892) (end 136.78916 63.74892) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 122.4915 63.74892) (end 123.825 63.74892) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 136.78916 63.74892) (end 139.83208 60.706) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 123.825 68.326) (end 123.825 63.74892) (width 0.6096) (layer Cuivre) (net 1) (status 800))
(segment (start 91.6686 81.8134) (end 95.25 78.232) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 95.25 78.232) (end 99.568 78.232) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 99.568 78.232) (end 100.838 76.962) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 100.838 76.962) (end 109.27842 76.962) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 91.6686 85.4837) (end 91.6686 81.8134) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 98.298 87.249) (end 99.695 88.646) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 99.695 88.646) (end 107.315 88.646) (width 0.6096) (layer Cuivre) (net 1) (status 400))
(segment (start 91.6686 87.249) (end 98.298 87.249) (width 0.6096) (layer Cuivre) (net 1))
(segment (start 158.75 64.516) (end 160.02 63.246) (width 0.6096) (layer Cuivre) (net 2) (status 400))
(segment (start 98.92792 68.326) (end 97.65792 69.596) (width 0.6096) (layer Cuivre) (net 3))
(segment (start 103.505 68.326) (end 98.92792 68.326) (width 0.6096) (layer Cuivre) (net 3) (status 800))
(segment (start 153.035 64.516) (end 158.75 64.516) (width 0.6096) (layer Cuivre) (net 2) (status 800))
(segment (start 128.905 76.581) (end 131.445 76.581) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 131.445 76.581) (end 140.97 67.056) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 140.97 67.056) (end 152.4 67.056) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 152.4 67.056) (end 153.035 66.421) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 153.035 66.421) (end 153.035 64.516) (width 0.6096) (layer Cuivre) (net 2) (status 400))
(segment (start 122.555 89.916) (end 122.555 78.486) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 120.015 92.456) (end 122.555 89.916) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 117.602 92.456) (end 120.015 92.456) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 114.935 95.123) (end 117.602 92.456) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 114.935 96.266) (end 114.935 95.123) (width 0.6096) (layer Cuivre) (net 2) (status 800))
(segment (start 104.775 106.807) (end 104.775 109.601) (width 0.6096) (layer Composant) (net 2))
(segment (start 107.061 104.521) (end 104.775 106.807) (width 0.6096) (layer Composant) (net 2))
(segment (start 112.776 104.521) (end 107.061 104.521) (width 0.6096) (layer Composant) (net 2))
(segment (start 114.935 102.362) (end 112.776 104.521) (width 0.6096) (layer Composant) (net 2))
(segment (start 114.935 96.266) (end 114.935 102.108) (width 0.6096) (layer Composant) (net 2) (status 800))
(segment (start 104.775 109.601) (end 104.775 125.857) (width 0.6096) (layer Composant) (net 2))
(segment (start 114.935 102.108) (end 114.935 102.362) (width 0.6096) (layer Composant) (net 2))
(segment (start 128.143 76.581) (end 127 77.724) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 127 77.724) (end 123.317 77.724) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 123.317 77.724) (end 122.555 78.486) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 128.905 76.581) (end 128.143 76.581) (width 0.6096) (layer Cuivre) (net 2))
(segment (start 113.411 126.492) (end 105.41 126.492) (width 0.6096) (layer Composant) (net 2))
(segment (start 105.41 126.492) (end 104.775 125.857) (width 0.6096) (layer Composant) (net 2))
(segment (start 114.681 126.492) (end 114.935 126.238) (width 0.6096) (layer Composant) (net 2))
(segment (start 114.935 126.238) (end 114.935 124.206) (width 0.6096) (layer Composant) (net 2) (status 400))
(segment (start 113.411 126.492) (end 114.681 126.492) (width 0.6096) (layer Composant) (net 2))
(segment (start 95.885 69.596) (end 97.65792 69.596) (width 0.6096) (layer Cuivre) (net 3) (status 800))
(segment (start 100.965 80.518) (end 102.743 78.74) (width 0.4318) (layer Cuivre) (net 4) (status 400))
(segment (start 95.885 83.185) (end 98.552 80.518) (width 0.4318) (layer Cuivre) (net 4))
(segment (start 98.552 80.518) (end 100.965 80.518) (width 0.4318) (layer Cuivre) (net 4))
(segment (start 103.505 68.326) (end 98.92792 68.326) (width 0.6096) (layer Cuivre) (net 3) (status 800))
(segment (start 98.92792 68.326) (end 97.65792 69.596) (width 0.6096) (layer Cuivre) (net 3))
(segment (start 95.885 84.836) (end 95.885 83.185) (width 0.4318) (layer Cuivre) (net 4) (status 800))
(segment (start 173.355 97.536) (end 173.355 100.076) (width 0.4318) (layer Cuivre) (net 5) (status 800))
(segment (start 173.355 100.076) (end 182.245 100.076) (width 0.4318) (layer Cuivre) (net 5) (status 400))
(segment (start 98.552 80.518) (end 100.965 80.518) (width 0.4318) (layer Cuivre) (net 4))
(segment (start 95.885 83.185) (end 98.552 80.518) (width 0.4318) (layer Cuivre) (net 4))
(segment (start 100.965 80.518) (end 102.743 78.74) (width 0.4318) (layer Cuivre) (net 4) (status 400))
(segment (start 173.355 97.536) (end 173.355 91.186) (width 0.4318) (layer Cuivre) (net 5) (status C00))
(segment (start 156.845 92.456) (end 154.305 94.996) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 154.305 94.996) (end 146.685 94.996) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 156.845 89.916) (end 161.29 89.916) (width 0.4318) (layer Cuivre) (net 6) (status C00))
(segment (start 118.618 99.187) (end 116.586 99.187) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 135.89 92.71) (end 123.698 92.71) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 120.523 95.885) (end 120.523 98.552) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 123.698 92.71) (end 120.523 95.885) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 119.888 99.187) (end 120.523 98.552) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 118.618 99.187) (end 119.888 99.187) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 105.7275 102.0445) (end 113.7285 102.0445) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 105.7275 102.0445) (end 103.69804 100.01504) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 98.48596 100.01504) (end 103.69804 100.01504) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 116.586 99.187) (end 116.078 99.695) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 113.7285 102.0445) (end 116.078 99.695) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 98.425 100.076) (end 98.48596 100.01504) (width 0.4318) (layer Cuivre) (net 6) (status 800))
(segment (start 135.89 92.71) (end 135.89 91.186) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 143.51 91.821) (end 146.685 94.996) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 143.51 89.281) (end 143.51 91.821) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 142.24 88.011) (end 143.51 89.281) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 139.065 88.011) (end 142.24 88.011) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 135.89 91.186) (end 139.065 88.011) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 173.355 100.076) (end 182.245 100.076) (width 0.4318) (layer Cuivre) (net 5) (status 400))
(segment (start 173.355 97.536) (end 173.355 100.076) (width 0.4318) (layer Cuivre) (net 5) (status 800))
(segment (start 156.845 89.916) (end 156.845 92.456) (width 0.4318) (layer Cuivre) (net 6) (status 800))
(segment (start 109.855 88.646) (end 112.395 88.646) (width 0.4318) (layer Cuivre) (net 7) (status C00))
(segment (start 118.745 81.026) (end 118.745 81.661) (width 0.4318) (layer Cuivre) (net 7) (status 800))
(segment (start 118.745 81.661) (end 116.84 83.566) (width 0.4318) (layer Cuivre) (net 7))
(segment (start 116.078 90.678) (end 114.427 90.678) (width 0.4318) (layer Cuivre) (net 7))
(segment (start 112.395 88.646) (end 112.395 96.266) (width 0.4318) (layer Cuivre) (net 7) (status C00))
(segment (start 114.427 90.678) (end 112.395 88.646) (width 0.4318) (layer Cuivre) (net 7) (status 400))
(segment (start 116.84 83.566) (end 116.84 89.916) (width 0.4318) (layer Cuivre) (net 7))
(segment (start 135.89 91.186) (end 139.065 88.011) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 139.065 88.011) (end 142.24 88.011) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 142.24 88.011) (end 143.51 89.281) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 143.51 89.281) (end 143.51 91.821) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 143.51 91.821) (end 146.685 94.996) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 135.89 92.71) (end 135.89 91.186) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 98.425 100.076) (end 98.48596 100.01504) (width 0.4318) (layer Cuivre) (net 6) (status 800))
(segment (start 113.7285 102.0445) (end 116.078 99.695) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 116.586 99.187) (end 116.078 99.695) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 98.48596 100.01504) (end 103.69804 100.01504) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 105.7275 102.0445) (end 103.69804 100.01504) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 105.7275 102.0445) (end 113.7285 102.0445) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 118.618 99.187) (end 119.888 99.187) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 119.888 99.187) (end 120.523 98.552) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 123.698 92.71) (end 120.523 95.885) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 120.523 95.885) (end 120.523 98.552) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 135.89 92.71) (end 123.698 92.71) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 118.618 99.187) (end 116.586 99.187) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 156.845 89.916) (end 161.29 89.916) (width 0.4318) (layer Cuivre) (net 6) (status C00))
(segment (start 154.305 94.996) (end 146.685 94.996) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 156.845 92.456) (end 154.305 94.996) (width 0.4318) (layer Cuivre) (net 6))
(segment (start 116.84 89.916) (end 116.078 90.678) (width 0.4318) (layer Cuivre) (net 7))
(segment (start 95.758 107.061) (end 102.235 107.061) (width 0.4318) (layer Cuivre) (net 8) (status 400))
(segment (start 94.615 108.204) (end 95.758 107.061) (width 0.4318) (layer Cuivre) (net 8))
(segment (start 116.84 83.566) (end 116.84 89.916) (width 0.4318) (layer Cuivre) (net 7))
(segment (start 114.427 90.678) (end 112.395 88.646) (width 0.4318) (layer Cuivre) (net 7) (status 400))
(segment (start 112.395 88.646) (end 112.395 96.266) (width 0.4318) (layer Cuivre) (net 7) (status C00))
(segment (start 116.078 90.678) (end 114.427 90.678) (width 0.4318) (layer Cuivre) (net 7))
(segment (start 118.745 81.661) (end 116.84 83.566) (width 0.4318) (layer Cuivre) (net 7))
(segment (start 118.745 81.026) (end 118.745 81.661) (width 0.4318) (layer Cuivre) (net 7) (status 800))
(segment (start 109.855 88.646) (end 112.395 88.646) (width 0.4318) (layer Cuivre) (net 7) (status C00))
(segment (start 94.615 111.506) (end 94.615 108.204) (width 0.4318) (layer Cuivre) (net 8) (status 800))
(segment (start 173.355 122.936) (end 173.355 119.126) (width 0.4318) (layer Cuivre) (net 9) (status C00))
(segment (start 94.615 108.204) (end 95.758 107.061) (width 0.4318) (layer Cuivre) (net 8))
(segment (start 95.758 107.061) (end 102.235 107.061) (width 0.4318) (layer Cuivre) (net 8) (status 400))
(segment (start 173.355 122.936) (end 182.245 122.936) (width 0.4318) (layer Cuivre) (net 9) (status C00))
(segment (start 133.35 118.364) (end 134.112 118.364) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 142.875 117.221) (end 146.05 120.396) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 142.875 115.316) (end 142.875 117.221) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 141.605 114.046) (end 142.875 115.316) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 138.43 114.046) (end 141.605 114.046) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 134.112 118.364) (end 138.43 114.046) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 152.4 120.396) (end 146.05 120.396) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 152.4 120.396) (end 156.21 116.586) (width 0.4318) (layer Cuivre) (net 10) (status 400))
(segment (start 160.02 116.586) (end 156.21 116.586) (width 0.4318) (layer Cuivre) (net 10) (status C00))
(segment (start 98.425 125.476) (end 99.695 125.476) (width 0.4318) (layer Cuivre) (net 10) (status 800))
(segment (start 105.029 125.222) (end 105.029 127.254) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 101.092 124.079) (end 103.886 124.079) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 103.886 124.079) (end 105.029 125.222) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 99.695 125.476) (end 101.092 124.079) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 124.0155 125.9205) (end 118.0465 125.9205) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 115.189 128.778) (end 106.553 128.778) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 106.553 128.778) (end 105.029 127.254) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 118.0465 125.9205) (end 117.221 126.746) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 131.572 118.364) (end 133.35 118.364) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 124.0155 125.9205) (end 131.572 118.364) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 173.355 122.936) (end 173.355 119.126) (width 0.4318) (layer Cuivre) (net 9) (status C00))
(segment (start 117.221 126.746) (end 115.189 128.778) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 116.713 112.522) (end 116.713 113.792) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 116.713 121.158) (end 112.395 121.158) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 118.618 119.253) (end 116.713 121.158) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 118.618 115.697) (end 118.618 119.253) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 116.713 113.792) (end 118.618 115.697) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 112.395 121.158) (end 112.395 116.586) (width 0.4318) (layer Cuivre) (net 11) (status 400))
(segment (start 117.983 110.236) (end 116.713 111.506) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 112.395 116.586) (end 109.855 116.586) (width 0.4318) (layer Cuivre) (net 11) (status C00))
(segment (start 116.713 111.506) (end 116.713 112.522) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 118.745 110.236) (end 117.983 110.236) (width 0.4318) (layer Cuivre) (net 11) (status 800))
(segment (start 124.0155 125.9205) (end 131.572 118.364) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 131.572 118.364) (end 133.35 118.364) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 118.0465 125.9205) (end 117.221 126.746) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 106.553 128.778) (end 105.029 127.254) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 115.189 128.778) (end 106.553 128.778) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 124.0155 125.9205) (end 118.0465 125.9205) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 99.695 125.476) (end 101.092 124.079) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 103.886 124.079) (end 105.029 125.222) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 101.092 124.079) (end 103.886 124.079) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 105.029 125.222) (end 105.029 127.254) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 98.425 125.476) (end 99.695 125.476) (width 0.4318) (layer Cuivre) (net 10) (status 800))
(segment (start 160.02 116.586) (end 156.21 116.586) (width 0.4318) (layer Cuivre) (net 10) (status C00))
(segment (start 152.4 120.396) (end 156.21 116.586) (width 0.4318) (layer Cuivre) (net 10) (status 400))
(segment (start 152.4 120.396) (end 146.05 120.396) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 134.112 118.364) (end 138.43 114.046) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 138.43 114.046) (end 141.605 114.046) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 141.605 114.046) (end 142.875 115.316) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 142.875 115.316) (end 142.875 117.221) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 142.875 117.221) (end 146.05 120.396) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 133.35 118.364) (end 134.112 118.364) (width 0.4318) (layer Cuivre) (net 10))
(segment (start 112.395 124.206) (end 112.395 121.158) (width 0.4318) (layer Cuivre) (net 11) (status 800))
(segment (start 150.495 70.231) (end 151.765 68.961) (width 0.6096) (layer Cuivre) (net 12))
(segment (start 150.495 72.136) (end 150.495 70.231) (width 0.6096) (layer Cuivre) (net 12) (status 800))
(segment (start 151.765 68.961) (end 156.21 68.961) (width 0.6096) (layer Cuivre) (net 12))
(segment (start 123.698 70.866) (end 123.825 70.866) (width 0.6096) (layer Cuivre) (net 12) (status 800))
(segment (start 123.825 70.866) (end 125.73 68.961) (width 0.6096) (layer Cuivre) (net 12))
(segment (start 156.21 68.961) (end 160.02 72.771) (width 0.6096) (layer Cuivre) (net 12))
(segment (start 118.745 110.236) (end 117.983 110.236) (width 0.4318) (layer Cuivre) (net 11) (status 800))
(segment (start 116.713 111.506) (end 116.713 112.522) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 112.395 116.586) (end 109.855 116.586) (width 0.4318) (layer Cuivre) (net 11) (status C00))
(segment (start 117.983 110.236) (end 116.713 111.506) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 112.395 121.158) (end 112.395 116.586) (width 0.4318) (layer Cuivre) (net 11) (status 400))
(segment (start 116.713 113.792) (end 118.618 115.697) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 118.618 115.697) (end 118.618 119.253) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 118.618 119.253) (end 116.713 121.158) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 116.713 121.158) (end 112.395 121.158) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 116.713 112.522) (end 116.713 113.792) (width 0.4318) (layer Cuivre) (net 11))
(segment (start 160.02 72.771) (end 160.02 78.486) (width 0.6096) (layer Cuivre) (net 12) (status 400))
(segment (start 122.555 60.706) (end 121.76506 60.706) (width 0.6096) (layer Cuivre) (net 13) (status 800))
(segment (start 124.8537 57.61736) (end 160.74136 57.61736) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 132.715 79.756) (end 135.76046 82.80146) (width 0.6096) (layer Cuivre) (net 13) (status 800))
(segment (start 164.465 77.851) (end 159.385 82.931) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 143.383 108.966) (end 146.685 108.966) (width 0.6096) (layer Cuivre) (net 13) (status 400))
(segment (start 140.843 106.426) (end 143.383 108.966) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 145.415 86.106) (end 147.955 83.566) (width 0.6096) (layer Composant) (net 13) (status 800))
(segment (start 135.255 106.426) (end 140.716 106.426) (width 0.6096) (layer Cuivre) (net 13) (status 800))
(segment (start 160.74136 57.61736) (end 164.465 61.341) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 140.716 106.426) (end 140.843 106.426) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 135.76046 82.80146) (end 142.11046 82.80146) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 121.76506 60.706) (end 124.8537 57.61736) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 146.685 108.966) (end 150.93696 113.21542) (width 0.6096) (layer Cuivre) (net 13) (status 800))
(segment (start 151.765 115.316) (end 151.765 114.04854) (width 0.6096) (layer Cuivre) (net 13) (status 800))
(segment (start 151.765 114.04854) (end 150.93696 113.21542) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 117.16258 56.896) (end 95.885 56.896) (width 0.6096) (layer Cuivre) (net 13) (status 400))
(segment (start 120.97258 60.706) (end 117.16258 56.896) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 159.385 82.931) (end 152.4 82.931) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 149.225 86.106) (end 145.415 86.106) (width 0.6096) (layer Cuivre) (net 13) (status 400))
(segment (start 164.465 61.341) (end 164.465 77.851) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 151.765 88.646) (end 149.225 86.106) (width 0.6096) (layer Cuivre) (net 13) (status 800))
(segment (start 142.11046 82.80146) (end 145.415 86.106) (width 0.6096) (layer Cuivre) (net 13) (status 400))
(segment (start 151.765 108.966) (end 146.685 108.966) (width 0.6096) (layer Composant) (net 13) (status 400))
(segment (start 147.955 83.566) (end 151.765 83.566) (width 0.6096) (layer Composant) (net 13))
(segment (start 151.765 83.566) (end 154.305 86.106) (width 0.6096) (layer Composant) (net 13))
(segment (start 154.305 86.106) (end 154.305 106.426) (width 0.6096) (layer Composant) (net 13))
(segment (start 121.76506 60.706) (end 120.97258 60.706) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 154.305 106.426) (end 151.765 108.966) (width 0.6096) (layer Composant) (net 13))
(segment (start 156.21 68.961) (end 160.02 72.771) (width 0.6096) (layer Cuivre) (net 12))
(segment (start 123.825 70.866) (end 125.73 68.961) (width 0.6096) (layer Cuivre) (net 12))
(segment (start 123.698 70.866) (end 123.825 70.866) (width 0.6096) (layer Cuivre) (net 12) (status 800))
(segment (start 151.765 68.961) (end 156.21 68.961) (width 0.6096) (layer Cuivre) (net 12))
(segment (start 150.495 72.136) (end 150.495 70.231) (width 0.6096) (layer Cuivre) (net 12) (status 800))
(segment (start 150.495 70.231) (end 151.765 68.961) (width 0.6096) (layer Cuivre) (net 12))
(segment (start 152.4 82.931) (end 149.225 86.106) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 147.955 70.231) (end 147.955 72.136) (width 0.4318) (layer Cuivre) (net 14) (status 400))
(segment (start 142.24 68.961) (end 146.685 68.961) (width 0.4318) (layer Cuivre) (net 14))
(segment (start 146.685 68.961) (end 147.955 70.231) (width 0.4318) (layer Cuivre) (net 14))
(segment (start 139.7 77.216) (end 139.7 71.501) (width 0.4318) (layer Cuivre) (net 14) (status 800))
(segment (start 154.305 106.426) (end 151.765 108.966) (width 0.6096) (layer Composant) (net 13))
(segment (start 121.76506 60.706) (end 120.97258 60.706) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 154.305 86.106) (end 154.305 106.426) (width 0.6096) (layer Composant) (net 13))
(segment (start 151.765 83.566) (end 154.305 86.106) (width 0.6096) (layer Composant) (net 13))
(segment (start 147.955 83.566) (end 151.765 83.566) (width 0.6096) (layer Composant) (net 13))
(segment (start 151.765 108.966) (end 146.685 108.966) (width 0.6096) (layer Composant) (net 13) (status 400))
(segment (start 142.11046 82.80146) (end 145.415 86.106) (width 0.6096) (layer Cuivre) (net 13) (status 400))
(segment (start 151.765 88.646) (end 149.225 86.106) (width 0.6096) (layer Cuivre) (net 13) (status 800))
(segment (start 164.465 61.341) (end 164.465 77.851) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 149.225 86.106) (end 145.415 86.106) (width 0.6096) (layer Cuivre) (net 13) (status 400))
(segment (start 159.385 82.931) (end 152.4 82.931) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 120.97258 60.706) (end 117.16258 56.896) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 117.16258 56.896) (end 95.885 56.896) (width 0.6096) (layer Cuivre) (net 13) (status 400))
(segment (start 151.765 114.04854) (end 150.93696 113.21542) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 151.765 115.316) (end 151.765 114.04854) (width 0.6096) (layer Cuivre) (net 13) (status 800))
(segment (start 146.685 108.966) (end 150.93696 113.21542) (width 0.6096) (layer Cuivre) (net 13) (status 800))
(segment (start 121.76506 60.706) (end 124.8537 57.61736) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 135.76046 82.80146) (end 142.11046 82.80146) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 140.716 106.426) (end 140.843 106.426) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 160.74136 57.61736) (end 164.465 61.341) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 135.255 106.426) (end 140.716 106.426) (width 0.6096) (layer Cuivre) (net 13) (status 800))
(segment (start 145.415 86.106) (end 147.955 83.566) (width 0.6096) (layer Composant) (net 13) (status 800))
(segment (start 140.843 106.426) (end 143.383 108.966) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 143.383 108.966) (end 146.685 108.966) (width 0.6096) (layer Cuivre) (net 13) (status 400))
(segment (start 164.465 77.851) (end 159.385 82.931) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 132.715 79.756) (end 135.76046 82.80146) (width 0.6096) (layer Cuivre) (net 13) (status 800))
(segment (start 124.8537 57.61736) (end 160.74136 57.61736) (width 0.6096) (layer Cuivre) (net 13))
(segment (start 122.555 60.706) (end 121.76506 60.706) (width 0.6096) (layer Cuivre) (net 13) (status 800))
(segment (start 139.7 71.501) (end 142.24 68.961) (width 0.4318) (layer Cuivre) (net 14))
(segment (start 153.035 72.136) (end 153.035 75.311) (width 0.4318) (layer Cuivre) (net 15) (status 800))
(segment (start 139.7 77.216) (end 139.7 71.501) (width 0.4318) (layer Cuivre) (net 14) (status 800))
(segment (start 146.685 68.961) (end 147.955 70.231) (width 0.4318) (layer Cuivre) (net 14))
(segment (start 142.24 68.961) (end 146.685 68.961) (width 0.4318) (layer Cuivre) (net 14))
(segment (start 147.955 70.231) (end 147.955 72.136) (width 0.4318) (layer Cuivre) (net 14) (status 400))
(segment (start 153.035 75.311) (end 154.94 77.216) (width 0.4318) (layer Cuivre) (net 15) (status 400))
(segment (start 106.172 107.061) (end 109.855 107.061) (width 0.4318) (layer Cuivre) (net 16) (status 400))
(segment (start 102.235 110.236) (end 102.997 110.236) (width 0.4318) (layer Cuivre) (net 16) (status 800))
(segment (start 109.855 107.061) (end 113.665 107.061) (width 0.4318) (layer Cuivre) (net 16) (status C00))
(segment (start 153.035 72.136) (end 153.035 75.311) (width 0.4318) (layer Cuivre) (net 15) (status 800))
(segment (start 102.997 110.236) (end 106.172 107.061) (width 0.4318) (layer Cuivre) (net 16))
(segment (start 102.235 82.296) (end 106.807 82.296) (width 0.4318) (layer Cuivre) (net 17) (status 800))
(segment (start 110.363 78.74) (end 113.411 78.74) (width 0.4318) (layer Cuivre) (net 17) (status 800))
(segment (start 113.411 78.74) (end 113.665 78.486) (width 0.4318) (layer Cuivre) (net 17) (status 400))
(segment (start 109.855 107.061) (end 113.665 107.061) (width 0.4318) (layer Cuivre) (net 16) (status C00))
(segment (start 102.235 110.236) (end 102.997 110.236) (width 0.4318) (layer Cuivre) (net 16) (status 800))
(segment (start 106.172 107.061) (end 109.855 107.061) (width 0.4318) (layer Cuivre) (net 16) (status 400))
(segment (start 106.807 82.296) (end 110.363 78.74) (width 0.4318) (layer Cuivre) (net 17) (status 400))
(segment (start 113.665 110.236) (end 109.855 110.236) (width 0.4318) (layer Cuivre) (net 18) (status C00))
(segment (start 104.775 110.236) (end 109.855 110.236) (width 0.4318) (layer Cuivre) (net 18) (status 400))
(segment (start 113.411 78.74) (end 113.665 78.486) (width 0.4318) (layer Cuivre) (net 17) (status 400))
(segment (start 110.363 78.74) (end 113.411 78.74) (width 0.4318) (layer Cuivre) (net 17) (status 800))
(segment (start 102.235 82.296) (end 106.807 82.296) (width 0.4318) (layer Cuivre) (net 17) (status 800))
(segment (start 102.235 112.776) (end 104.775 110.236) (width 0.4318) (layer Cuivre) (net 18) (status 800))
(segment (start 109.855 112.776) (end 113.665 112.776) (width 0.4318) (layer Cuivre) (net 19) (status C00))
(segment (start 114.935 114.046) (end 114.935 116.586) (width 0.4318) (layer Cuivre) (net 19) (status 400))
(segment (start 104.775 110.236) (end 109.855 110.236) (width 0.4318) (layer Cuivre) (net 18) (status 400))
(segment (start 113.665 110.236) (end 109.855 110.236) (width 0.4318) (layer Cuivre) (net 18) (status C00))
(segment (start 113.665 112.776) (end 114.935 114.046) (width 0.4318) (layer Cuivre) (net 19) (status 800))
(segment (start 136.779 127.381) (end 136.779 128.651) (width 0.4318) (layer Cuivre) (net 20) (status 800))
(segment (start 114.935 114.046) (end 114.935 116.586) (width 0.4318) (layer Cuivre) (net 19) (status 400))
(segment (start 109.855 112.776) (end 113.665 112.776) (width 0.4318) (layer Cuivre) (net 19) (status C00))
(segment (start 136.779 128.651) (end 138.176 130.048) (width 0.4318) (layer Cuivre) (net 20) (status 400))
(segment (start 109.855 82.296) (end 109.855 81.661) (width 0.4318) (layer Cuivre) (net 21) (status 800))
(segment (start 109.855 84.836) (end 109.855 82.296) (width 0.4318) (layer Cuivre) (net 21) (status C00))
(segment (start 110.49 81.026) (end 113.665 81.026) (width 0.4318) (layer Cuivre) (net 21) (status 400))
(segment (start 136.779 127.381) (end 136.779 128.651) (width 0.4318) (layer Cuivre) (net 20) (status 800))
(segment (start 109.855 81.661) (end 110.49 81.026) (width 0.4318) (layer Cuivre) (net 21))
(segment (start 113.665 85.471) (end 114.935 86.741) (width 0.4318) (layer Cuivre) (net 22))
(segment (start 114.935 86.741) (end 114.935 88.646) (width 0.4318) (layer Cuivre) (net 22) (status 400))
(segment (start 113.03 84.836) (end 111.252 86.614) (width 0.4318) (layer Cuivre) (net 22))
(segment (start 113.665 84.836) (end 113.665 85.471) (width 0.4318) (layer Cuivre) (net 22) (status 800))
(segment (start 111.252 86.614) (end 104.013 86.614) (width 0.4318) (layer Cuivre) (net 22))
(segment (start 113.665 84.836) (end 113.03 84.836) (width 0.4318) (layer Cuivre) (net 22) (status 800))
(segment (start 110.49 81.026) (end 113.665 81.026) (width 0.4318) (layer Cuivre) (net 21) (status 400))
(segment (start 109.855 84.836) (end 109.855 82.296) (width 0.4318) (layer Cuivre) (net 21) (status C00))
(segment (start 109.855 82.296) (end 109.855 81.661) (width 0.4318) (layer Cuivre) (net 21) (status 800))
(segment (start 104.013 86.614) (end 102.235 84.836) (width 0.4318) (layer Cuivre) (net 22) (status 400))
(segment (start 135.255 101.346) (end 138.049 104.14) (width 0.4318) (layer Cuivre) (net 23) (status 400))
(segment (start 113.665 84.836) (end 113.03 84.836) (width 0.4318) (layer Cuivre) (net 22) (status 800))
(segment (start 111.252 86.614) (end 104.013 86.614) (width 0.4318) (layer Cuivre) (net 22))
(segment (start 113.665 84.836) (end 113.665 85.471) (width 0.4318) (layer Cuivre) (net 22) (status 800))
(segment (start 113.03 84.836) (end 111.252 86.614) (width 0.4318) (layer Cuivre) (net 22))
(segment (start 114.935 86.741) (end 114.935 88.646) (width 0.4318) (layer Cuivre) (net 22) (status 400))
(segment (start 113.665 85.471) (end 114.935 86.741) (width 0.4318) (layer Cuivre) (net 22))
(segment (start 133.985 101.346) (end 135.255 101.346) (width 0.4318) (layer Cuivre) (net 23) (status 800))
(segment (start 127.635 106.426) (end 128.83642 106.426) (width 0.4318) (layer Cuivre) (net 24) (status 800))
(segment (start 131.37642 108.966) (end 128.83642 106.426) (width 0.4318) (layer Cuivre) (net 24))
(segment (start 135.255 101.346) (end 138.049 104.14) (width 0.4318) (layer Cuivre) (net 23) (status 400))
(segment (start 135.255 108.966) (end 131.37642 108.966) (width 0.4318) (layer Cuivre) (net 24) (status 800))
(segment (start 127.635 110.16742) (end 130.175 112.70742) (width 0.4318) (layer Cuivre) (net 25))
(segment (start 127.635 108.966) (end 127.635 110.16742) (width 0.4318) (layer Cuivre) (net 25) (status 800))
(segment (start 122.555 115.316) (end 122.555 115.24742) (width 0.4318) (layer Cuivre) (net 25) (status 800))
(segment (start 130.175 112.70742) (end 130.175 114.046) (width 0.4318) (layer Cuivre) (net 25) (status 400))
(segment (start 131.37642 108.966) (end 128.83642 106.426) (width 0.4318) (layer Cuivre) (net 24))
(segment (start 127.635 106.426) (end 128.83642 106.426) (width 0.4318) (layer Cuivre) (net 24) (status 800))
(segment (start 122.555 115.24742) (end 127.635 110.16742) (width 0.4318) (layer Cuivre) (net 25))
(segment (start 144.78 122.301) (end 144.78 123.571) (width 0.4318) (layer Cuivre) (net 26) (status 400))
(segment (start 140.97 118.491) (end 144.78 122.301) (width 0.4318) (layer Cuivre) (net 26))
(segment (start 130.175 112.70742) (end 130.175 114.046) (width 0.4318) (layer Cuivre) (net 25) (status 400))
(segment (start 122.555 115.316) (end 122.555 115.24742) (width 0.4318) (layer Cuivre) (net 25) (status 800))
(segment (start 127.635 108.966) (end 127.635 110.16742) (width 0.4318) (layer Cuivre) (net 25) (status 800))
(segment (start 127.635 110.16742) (end 130.175 112.70742) (width 0.4318) (layer Cuivre) (net 25))
(segment (start 140.97 115.951) (end 140.97 118.491) (width 0.4318) (layer Cuivre) (net 26) (status 800))
(segment (start 140.97 123.571) (end 140.97 123.952) (width 0.4318) (layer Cuivre) (net 27) (status 800))
(segment (start 140.97 123.952) (end 144.399 127.381) (width 0.4318) (layer Cuivre) (net 27) (status 400))
(segment (start 133.985 124.206) (end 137.795 124.206) (width 0.4318) (layer Cuivre) (net 27) (status 800))
(segment (start 138.43 123.571) (end 140.97 123.571) (width 0.4318) (layer Cuivre) (net 27) (status 400))
(segment (start 137.795 124.206) (end 138.43 123.571) (width 0.4318) (layer Cuivre) (net 27))
(segment (start 144.399 127.381) (end 144.78 127.381) (width 0.4318) (layer Cuivre) (net 27) (status 800))
(segment (start 144.78 127.381) (end 145.415 128.016) (width 0.4318) (layer Cuivre) (net 27))
(segment (start 145.415 128.016) (end 149.225 128.016) (width 0.4318) (layer Cuivre) (net 27))
(segment (start 149.225 128.016) (end 150.495 126.746) (width 0.4318) (layer Cuivre) (net 27))
(segment (start 140.97 118.491) (end 144.78 122.301) (width 0.4318) (layer Cuivre) (net 26))
(segment (start 144.78 122.301) (end 144.78 123.571) (width 0.4318) (layer Cuivre) (net 26) (status 400))
(segment (start 150.495 126.746) (end 150.495 125.476) (width 0.4318) (layer Cuivre) (net 27) (status 400))
(segment (start 149.225 128.016) (end 150.495 126.746) (width 0.4318) (layer Cuivre) (net 27))
(segment (start 145.415 128.016) (end 149.225 128.016) (width 0.4318) (layer Cuivre) (net 27))
(segment (start 144.78 127.381) (end 145.415 128.016) (width 0.4318) (layer Cuivre) (net 27))
(segment (start 144.399 127.381) (end 144.78 127.381) (width 0.4318) (layer Cuivre) (net 27) (status 800))
(segment (start 137.795 124.206) (end 138.43 123.571) (width 0.4318) (layer Cuivre) (net 27))
(segment (start 138.43 123.571) (end 140.97 123.571) (width 0.4318) (layer Cuivre) (net 27) (status 400))
(segment (start 133.985 124.206) (end 137.795 124.206) (width 0.4318) (layer Cuivre) (net 27) (status 800))
(segment (start 140.97 123.952) (end 144.399 127.381) (width 0.4318) (layer Cuivre) (net 27) (status 400))
(segment (start 140.97 123.571) (end 140.97 123.952) (width 0.4318) (layer Cuivre) (net 27) (status 800))
(segment (start 125.095 79.756) (end 125.095 82.296) (width 0.4318) (layer Cuivre) (net 28) (status C00))
(segment (start 137.795 81.026) (end 137.795 79.756) (width 0.4318) (layer Cuivre) (net 29) (status 800))
(segment (start 131.445 77.851) (end 130.175 79.121) (width 0.4318) (layer Cuivre) (net 29))
(segment (start 132.715 82.296) (end 132.08 82.296) (width 0.4318) (layer Cuivre) (net 29) (status 800))
(segment (start 132.08 82.296) (end 130.175 84.201) (width 0.4318) (layer Cuivre) (net 29))
(segment (start 130.175 79.121) (end 130.175 79.756) (width 0.4318) (layer Cuivre) (net 29))
(segment (start 130.175 79.756) (end 132.715 82.296) (width 0.4318) (layer Cuivre) (net 29) (status 400))
(segment (start 137.795 79.756) (end 135.89 77.851) (width 0.4318) (layer Cuivre) (net 29))
(segment (start 135.89 77.851) (end 131.445 77.851) (width 0.4318) (layer Cuivre) (net 29))
(segment (start 130.175 84.201) (end 130.175 87.376) (width 0.4318) (layer Cuivre) (net 29) (status 400))
(segment (start 141.605 91.821) (end 145.415 95.631) (width 0.4318) (layer Cuivre) (net 30))
(segment (start 141.605 89.916) (end 141.605 91.821) (width 0.4318) (layer Cuivre) (net 30) (status 800))
(segment (start 135.89 77.851) (end 131.445 77.851) (width 0.4318) (layer Cuivre) (net 29))
(segment (start 137.795 79.756) (end 135.89 77.851) (width 0.4318) (layer Cuivre) (net 29))
(segment (start 130.175 79.756) (end 132.715 82.296) (width 0.4318) (layer Cuivre) (net 29) (status 400))
(segment (start 130.175 79.121) (end 130.175 79.756) (width 0.4318) (layer Cuivre) (net 29))
(segment (start 132.08 82.296) (end 130.175 84.201) (width 0.4318) (layer Cuivre) (net 29))
(segment (start 132.715 82.296) (end 132.08 82.296) (width 0.4318) (layer Cuivre) (net 29) (status 800))
(segment (start 131.445 77.851) (end 130.175 79.121) (width 0.4318) (layer Cuivre) (net 29))
(segment (start 137.795 81.026) (end 137.795 79.756) (width 0.4318) (layer Cuivre) (net 29) (status 800))
(segment (start 145.415 95.631) (end 145.415 97.536) (width 0.4318) (layer Cuivre) (net 30) (status 400))
(segment (start 134.53364 99.35464) (end 132.715 97.536) (width 0.4318) (layer Cuivre) (net 31) (status 400))
(segment (start 139.85494 99.35464) (end 134.53364 99.35464) (width 0.4318) (layer Cuivre) (net 31))
(segment (start 150.495 100.711) (end 150.495 101.346) (width 0.4318) (layer Cuivre) (net 31) (status 800))
(segment (start 144.145 101.346) (end 141.605 101.346) (width 0.4318) (layer Cuivre) (net 31) (status 400))
(segment (start 145.415 102.616) (end 144.145 101.346) (width 0.4318) (layer Cuivre) (net 31))
(segment (start 149.225 102.616) (end 145.415 102.616) (width 0.4318) (layer Cuivre) (net 31))
(segment (start 150.495 101.346) (end 149.225 102.616) (width 0.4318) (layer Cuivre) (net 31))
(segment (start 141.605 97.536) (end 141.605 101.346) (width 0.4318) (layer Cuivre) (net 31) (status C00))
(segment (start 141.67358 97.536) (end 139.85494 99.35464) (width 0.4318) (layer Cuivre) (net 31))
(segment (start 141.605 89.916) (end 141.605 91.821) (width 0.4318) (layer Cuivre) (net 30) (status 800))
(segment (start 141.605 91.821) (end 145.415 95.631) (width 0.4318) (layer Cuivre) (net 30))
(segment (start 141.605 97.536) (end 141.67358 97.536) (width 0.4318) (layer Cuivre) (net 31) (status 800))
(segment (start 138.43 112.141) (end 136.525 114.046) (width 0.4318) (layer Cuivre) (net 32))
(segment (start 144.145 112.141) (end 138.43 112.141) (width 0.4318) (layer Cuivre) (net 32))
(segment (start 144.78 112.776) (end 144.145 112.141) (width 0.4318) (layer Cuivre) (net 32))
(segment (start 149.225 115.316) (end 147.32 113.411) (width 0.4318) (layer Cuivre) (net 32) (status 800))
(segment (start 147.32 113.411) (end 144.78 113.411) (width 0.4318) (layer Cuivre) (net 32))
(segment (start 136.525 114.046) (end 132.715 114.046) (width 0.4318) (layer Cuivre) (net 32) (status 400))
(segment (start 144.78 115.951) (end 144.78 113.411) (width 0.4318) (layer Cuivre) (net 32) (status 800))
(segment (start 141.67358 97.536) (end 139.85494 99.35464) (width 0.4318) (layer Cuivre) (net 31))
(segment (start 141.605 97.536) (end 141.605 101.346) (width 0.4318) (layer Cuivre) (net 31) (status C00))
(segment (start 150.495 101.346) (end 149.225 102.616) (width 0.4318) (layer Cuivre) (net 31))
(segment (start 149.225 102.616) (end 145.415 102.616) (width 0.4318) (layer Cuivre) (net 31))
(segment (start 145.415 102.616) (end 144.145 101.346) (width 0.4318) (layer Cuivre) (net 31))
(segment (start 144.145 101.346) (end 141.605 101.346) (width 0.4318) (layer Cuivre) (net 31) (status 400))
(segment (start 150.495 100.711) (end 150.495 101.346) (width 0.4318) (layer Cuivre) (net 31) (status 800))
(segment (start 139.85494 99.35464) (end 134.53364 99.35464) (width 0.4318) (layer Cuivre) (net 31))
(segment (start 134.53364 99.35464) (end 132.715 97.536) (width 0.4318) (layer Cuivre) (net 31) (status 400))
(segment (start 144.78 113.411) (end 144.78 112.776) (width 0.4318) (layer Cuivre) (net 32))
(segment (start 145.415 88.646) (end 144.78 88.011) (width 0.4318) (layer Cuivre) (net 33))
(segment (start 144.78 88.011) (end 143.51 88.011) (width 0.4318) (layer Cuivre) (net 33))
(segment (start 143.51 88.011) (end 139.7 84.201) (width 0.4318) (layer Cuivre) (net 33))
(segment (start 138.43 84.201) (end 138.37666 84.14766) (width 0.4318) (layer Cuivre) (net 33))
(segment (start 139.7 84.201) (end 138.43 84.201) (width 0.4318) (layer Cuivre) (net 33))
(segment (start 138.37666 84.14766) (end 135.94334 84.14766) (width 0.4318) (layer Cuivre) (net 33))
(segment (start 135.94334 84.14766) (end 132.715 87.376) (width 0.4318) (layer Cuivre) (net 33) (status 400))
(segment (start 145.415 89.916) (end 145.415 88.646) (width 0.4318) (layer Cuivre) (net 33) (status 800))
(segment (start 144.78 115.951) (end 144.78 113.411) (width 0.4318) (layer Cuivre) (net 32) (status 800))
(segment (start 136.525 114.046) (end 132.715 114.046) (width 0.4318) (layer Cuivre) (net 32) (status 400))
(segment (start 147.32 113.411) (end 144.78 113.411) (width 0.4318) (layer Cuivre) (net 32))
(segment (start 149.225 115.316) (end 147.32 113.411) (width 0.4318) (layer Cuivre) (net 32) (status 800))
(segment (start 144.78 112.776) (end 144.145 112.141) (width 0.4318) (layer Cuivre) (net 32))
(segment (start 144.145 112.141) (end 138.43 112.141) (width 0.4318) (layer Cuivre) (net 32))
(segment (start 138.43 112.141) (end 136.525 114.046) (width 0.4318) (layer Cuivre) (net 32))
(segment (start 145.415 88.646) (end 149.225 88.646) (width 0.4318) (layer Cuivre) (net 33) (status 400))
(segment (start 130.175 116.586) (end 130.514 116.586) (width 0.4) (layer Cuivre) (net 34))
(segment (start 136.031 112) (end 139.065 108.966) (width 0.4) (layer Cuivre) (net 34) (tstamp 52E36988))
(segment (start 132.7 112) (end 136.031 112) (width 0.4) (layer Cuivre) (net 34) (tstamp 52E36987))
(segment (start 131.44787 113.25213) (end 132.7 112) (width 0.4) (layer Cuivre) (net 34) (tstamp 52E36985))
(segment (start 131.44787 115.65213) (end 131.44787 113.25213) (width 0.4) (layer Cuivre) (net 34) (tstamp 52E36982))
(segment (start 145.415 89.916) (end 145.415 88.646) (width 0.4318) (layer Cuivre) (net 33) (status 800))
(segment (start 135.94334 84.14766) (end 132.715 87.376) (width 0.4318) (layer Cuivre) (net 33) (status 400))
(segment (start 138.37666 84.14766) (end 135.94334 84.14766) (width 0.4318) (layer Cuivre) (net 33))
(segment (start 139.7 84.201) (end 138.43 84.201) (width 0.4318) (layer Cuivre) (net 33))
(segment (start 138.43 84.201) (end 138.37666 84.14766) (width 0.4318) (layer Cuivre) (net 33))
(segment (start 143.51 88.011) (end 139.7 84.201) (width 0.4318) (layer Cuivre) (net 33))
(segment (start 144.78 88.011) (end 143.51 88.011) (width 0.4318) (layer Cuivre) (net 33))
(segment (start 145.415 88.646) (end 144.78 88.011) (width 0.4318) (layer Cuivre) (net 33))
(segment (start 130.514 116.586) (end 131.44787 115.65213) (width 0.4) (layer Cuivre) (net 34) (tstamp 52E3697F))
(segment (start 160.02 124.206) (end 160.02 121.031) (width 0.4318) (layer Cuivre) (net 35) (status 800))
(segment (start 161.925 119.126) (end 165.735 119.126) (width 0.4318) (layer Cuivre) (net 35) (status 400))
(segment (start 160.02 121.031) (end 161.925 119.126) (width 0.4318) (layer Cuivre) (net 35))
(segment (start 165.735 119.126) (end 165.735 115.951) (width 0.4318) (layer Cuivre) (net 35) (status 800))
(segment (start 161.925 114.046) (end 156.21 114.046) (width 0.4318) (layer Cuivre) (net 35))
(segment (start 156.21 114.046) (end 152.4 117.856) (width 0.4318) (layer Cuivre) (net 35))
(segment (start 152.4 117.856) (end 149.225 117.856) (width 0.4318) (layer Cuivre) (net 35) (status 400))
(segment (start 165.735 115.951) (end 163.83 114.046) (width 0.4318) (layer Cuivre) (net 35))
(segment (start 131.44787 115.65213) (end 131.44787 113.25213) (width 0.4) (layer Cuivre) (net 34) (tstamp 52E36982))
(segment (start 131.44787 113.25213) (end 132.7 112) (width 0.4) (layer Cuivre) (net 34) (tstamp 52E36985))
(segment (start 132.7 112) (end 136.031 112) (width 0.4) (layer Cuivre) (net 34) (tstamp 52E36987))
(segment (start 136.031 112) (end 139.065 108.966) (width 0.4) (layer Cuivre) (net 34) (tstamp 52E36988))
(segment (start 130.175 116.586) (end 130.514 116.586) (width 0.4) (layer Cuivre) (net 34))
(segment (start 163.83 114.046) (end 161.925 114.046) (width 0.4318) (layer Cuivre) (net 35))
(segment (start 156.21 124.206) (end 156.21 126.111) (width 0.4318) (layer Cuivre) (net 36) (status 800))
(segment (start 163.195 126.111) (end 165.735 122.936) (width 0.4318) (layer Cuivre) (net 36) (status 400))
(segment (start 162.56 126.746) (end 163.195 126.111) (width 0.4318) (layer Cuivre) (net 36))
(segment (start 156.845 126.746) (end 162.56 126.746) (width 0.4318) (layer Cuivre) (net 36))
(segment (start 156.21 126.111) (end 156.845 126.746) (width 0.4318) (layer Cuivre) (net 36))
(segment (start 150.495 122.936) (end 154.94 122.936) (width 0.4318) (layer Cuivre) (net 36) (status 800))
(segment (start 165.735 115.951) (end 163.83 114.046) (width 0.4318) (layer Cuivre) (net 35))
(segment (start 152.4 117.856) (end 149.225 117.856) (width 0.4318) (layer Cuivre) (net 35) (status 400))
(segment (start 156.21 114.046) (end 152.4 117.856) (width 0.4318) (layer Cuivre) (net 35))
(segment (start 161.925 114.046) (end 156.21 114.046) (width 0.4318) (layer Cuivre) (net 35))
(segment (start 165.735 119.126) (end 165.735 115.951) (width 0.4318) (layer Cuivre) (net 35) (status 800))
(segment (start 160.02 121.031) (end 161.925 119.126) (width 0.4318) (layer Cuivre) (net 35))
(segment (start 161.925 119.126) (end 165.735 119.126) (width 0.4318) (layer Cuivre) (net 35) (status 400))
(segment (start 160.02 124.206) (end 160.02 121.031) (width 0.4318) (layer Cuivre) (net 35) (status 800))
(segment (start 154.94 122.936) (end 156.21 124.206) (width 0.4318) (layer Cuivre) (net 36) (status 400))
(segment (start 130.175 124.206) (end 131.445 124.206) (width 0.4318) (layer Cuivre) (net 37) (status 400))
(segment (start 150.495 122.936) (end 154.94 122.936) (width 0.4318) (layer Cuivre) (net 36) (status 800))
(segment (start 156.21 126.111) (end 156.845 126.746) (width 0.4318) (layer Cuivre) (net 36))
(segment (start 156.845 126.746) (end 162.56 126.746) (width 0.4318) (layer Cuivre) (net 36))
(segment (start 162.56 126.746) (end 163.195 126.111) (width 0.4318) (layer Cuivre) (net 36))
(segment (start 163.195 126.111) (end 165.735 122.936) (width 0.4318) (layer Cuivre) (net 36) (status 400))
(segment (start 156.21 124.206) (end 156.21 126.111) (width 0.4318) (layer Cuivre) (net 36) (status 800))
(segment (start 126.365 128.016) (end 130.175 124.206) (width 0.4318) (layer Cuivre) (net 37) (status 800))
(segment (start 134.112 120.142) (end 132.715 121.539) (width 0.4318) (layer Cuivre) (net 38))
(segment (start 132.715 121.539) (end 132.715 125.476) (width 0.4318) (layer Cuivre) (net 38))
(segment (start 134.493 120.142) (end 134.112 120.142) (width 0.4318) (layer Cuivre) (net 38) (status 800))
(segment (start 130.175 124.206) (end 131.445 124.206) (width 0.4318) (layer Cuivre) (net 37) (status 400))
(segment (start 132.715 125.476) (end 131.445 126.746) (width 0.4318) (layer Cuivre) (net 38) (status 400))
(segment (start 137.795 87.122) (end 137.795 86.106) (width 0.4318) (layer Cuivre) (net 39) (status 400))
(segment (start 135.001 89.916) (end 137.795 87.122) (width 0.4318) (layer Cuivre) (net 39))
(segment (start 134.493 120.142) (end 134.112 120.142) (width 0.4318) (layer Cuivre) (net 38) (status 800))
(segment (start 132.715 121.539) (end 132.715 125.476) (width 0.4318) (layer Cuivre) (net 38))
(segment (start 134.112 120.142) (end 132.715 121.539) (width 0.4318) (layer Cuivre) (net 38))
(segment (start 130.175 89.916) (end 135.001 89.916) (width 0.4318) (layer Cuivre) (net 39) (status 800))
(segment (start 161.29 97.536) (end 161.29 95.631) (width 0.4318) (layer Cuivre) (net 40) (status 800))
(segment (start 161.29 95.631) (end 165.735 91.186) (width 0.4318) (layer Cuivre) (net 40) (status 400))
(segment (start 165.735 91.186) (end 165.735 88.011) (width 0.4318) (layer Cuivre) (net 40) (status 800))
(segment (start 154.305 89.916) (end 154.305 87.376) (width 0.4318) (layer Cuivre) (net 40))
(segment (start 154.305 87.376) (end 155.575 86.106) (width 0.4318) (layer Cuivre) (net 40))
(segment (start 155.575 86.106) (end 160.655 86.106) (width 0.4318) (layer Cuivre) (net 40))
(segment (start 149.225 91.186) (end 153.035 91.186) (width 0.4318) (layer Cuivre) (net 40) (status 800))
(segment (start 154.305 89.916) (end 153.035 91.186) (width 0.4318) (layer Cuivre) (net 40))
(segment (start 165.735 88.011) (end 163.83 86.106) (width 0.4318) (layer Cuivre) (net 40))
(segment (start 135.001 89.916) (end 137.795 87.122) (width 0.4318) (layer Cuivre) (net 39))
(segment (start 137.795 87.122) (end 137.795 86.106) (width 0.4318) (layer Cuivre) (net 39) (status 400))
(segment (start 163.83 86.106) (end 160.655 86.106) (width 0.4318) (layer Cuivre) (net 40))
(segment (start 165.735 97.536) (end 165.735 98.806) (width 0.4318) (layer Cuivre) (net 41) (status 800))
(segment (start 164.465 100.076) (end 161.925 100.076) (width 0.4318) (layer Cuivre) (net 41))
(segment (start 165.735 98.806) (end 164.465 100.076) (width 0.4318) (layer Cuivre) (net 41))
(segment (start 150.495 98.171) (end 156.21 98.171) (width 0.4318) (layer Cuivre) (net 41) (status 800))
(segment (start 156.21 98.171) (end 156.845 97.536) (width 0.4318) (layer Cuivre) (net 41) (status 400))
(segment (start 156.845 98.806) (end 158.115 100.076) (width 0.4318) (layer Cuivre) (net 41))
(segment (start 158.115 100.076) (end 161.925 100.076) (width 0.4318) (layer Cuivre) (net 41))
(segment (start 165.735 88.011) (end 163.83 86.106) (width 0.4318) (layer Cuivre) (net 40))
(segment (start 154.305 89.916) (end 153.035 91.186) (width 0.4318) (layer Cuivre) (net 40))
(segment (start 149.225 91.186) (end 153.035 91.186) (width 0.4318) (layer Cuivre) (net 40) (status 800))
(segment (start 155.575 86.106) (end 160.655 86.106) (width 0.4318) (layer Cuivre) (net 40))
(segment (start 154.305 87.376) (end 155.575 86.106) (width 0.4318) (layer Cuivre) (net 40))
(segment (start 154.305 89.916) (end 154.305 87.376) (width 0.4318) (layer Cuivre) (net 40))
(segment (start 165.735 91.186) (end 165.735 88.011) (width 0.4318) (layer Cuivre) (net 40) (status 800))
(segment (start 161.29 95.631) (end 165.735 91.186) (width 0.4318) (layer Cuivre) (net 40) (status 400))
(segment (start 161.29 97.536) (end 161.29 95.631) (width 0.4318) (layer Cuivre) (net 40) (status 800))
(segment (start 156.845 97.536) (end 156.845 98.806) (width 0.4318) (layer Cuivre) (net 41) (status 800))
(segment (start 126.365 97.536) (end 125.603 98.298) (width 0.4318) (layer Cuivre) (net 42))
(segment (start 125.603 98.298) (end 125.603 101.346) (width 0.4318) (layer Cuivre) (net 42) (status 400))
(segment (start 158.115 100.076) (end 161.925 100.076) (width 0.4318) (layer Cuivre) (net 41))
(segment (start 156.845 98.806) (end 158.115 100.076) (width 0.4318) (layer Cuivre) (net 41))
(segment (start 156.21 98.171) (end 156.845 97.536) (width 0.4318) (layer Cuivre) (net 41) (status 400))
(segment (start 150.495 98.171) (end 156.21 98.171) (width 0.4318) (layer Cuivre) (net 41) (status 800))
(segment (start 165.735 98.806) (end 164.465 100.076) (width 0.4318) (layer Cuivre) (net 41))
(segment (start 164.465 100.076) (end 161.925 100.076) (width 0.4318) (layer Cuivre) (net 41))
(segment (start 165.735 97.536) (end 165.735 98.806) (width 0.4318) (layer Cuivre) (net 41) (status 800))
(segment (start 130.175 97.536) (end 126.365 97.536) (width 0.4318) (layer Cuivre) (net 42) (status 800))
(segment (start 126.619 103.632) (end 130.175 100.076) (width 0.4318) (layer Cuivre) (net 43) (status 400))
(segment (start 123.19 96.647) (end 123.19 102.362) (width 0.4318) (layer Cuivre) (net 43))
(segment (start 123.19 102.362) (end 124.46 103.632) (width 0.4318) (layer Cuivre) (net 43))
(segment (start 124.841 94.996) (end 123.19 96.647) (width 0.4318) (layer Cuivre) (net 43))
(segment (start 126.111 94.996) (end 124.841 94.996) (width 0.4318) (layer Cuivre) (net 43) (status 800))
(segment (start 125.603 98.298) (end 125.603 101.346) (width 0.4318) (layer Cuivre) (net 42) (status 400))
(segment (start 126.365 97.536) (end 125.603 98.298) (width 0.4318) (layer Cuivre) (net 42))
(segment (start 124.46 103.632) (end 126.619 103.632) (width 0.4318) (layer Cuivre) (net 43))
(segment (start 102.87 126.746) (end 101.6 128.016) (width 0.4318) (layer Cuivre) (net 44) (status 800))
(segment (start 93.345 125.476) (end 95.885 128.016) (width 0.4318) (layer Cuivre) (net 44) (status 800))
(segment (start 126.111 94.996) (end 124.841 94.996) (width 0.4318) (layer Cuivre) (net 43) (status 800))
(segment (start 124.841 94.996) (end 123.19 96.647) (width 0.4318) (layer Cuivre) (net 43))
(segment (start 123.19 102.362) (end 124.46 103.632) (width 0.4318) (layer Cuivre) (net 43))
(segment (start 123.19 96.647) (end 123.19 102.362) (width 0.4318) (layer Cuivre) (net 43))
(segment (start 126.619 103.632) (end 130.175 100.076) (width 0.4318) (layer Cuivre) (net 43) (status 400))
(segment (start 95.885 128.016) (end 101.6 128.016) (width 0.4318) (layer Cuivre) (net 44))
(segment (start 118.491 97.028) (end 118.491 94.996) (width 0.4318) (layer Cuivre) (net 45) (status 400))
(segment (start 114.046 99.06) (end 114.935 99.06) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 108.839 99.06) (end 114.046 99.06) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 116.967 98.171) (end 115.824 98.171) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 116.967 98.171) (end 117.348 98.171) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 117.348 98.171) (end 118.491 97.028) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 107.315 97.536) (end 108.839 99.06) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 114.935 99.06) (end 115.824 98.171) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 107.315 96.266) (end 107.315 97.536) (width 0.4318) (layer Cuivre) (net 45) (status 800))
(segment (start 93.345 125.476) (end 95.885 128.016) (width 0.4318) (layer Cuivre) (net 44) (status 800))
(segment (start 102.87 126.746) (end 101.6 128.016) (width 0.4318) (layer Cuivre) (net 44) (status 800))
(segment (start 115.824 98.171) (end 114.935 99.06) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 95.885 102.616) (end 102.235 102.616) (width 0.4318) (layer Cuivre) (net 46) (status 400))
(segment (start 107.315 96.266) (end 107.315 97.536) (width 0.4318) (layer Cuivre) (net 45) (status 800))
(segment (start 114.935 99.06) (end 115.824 98.171) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 107.315 97.536) (end 108.839 99.06) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 117.348 98.171) (end 118.491 97.028) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 116.967 98.171) (end 117.348 98.171) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 116.967 98.171) (end 115.824 98.171) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 108.839 99.06) (end 114.046 99.06) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 114.046 99.06) (end 114.935 99.06) (width 0.4318) (layer Cuivre) (net 45))
(segment (start 118.491 97.028) (end 118.491 94.996) (width 0.4318) (layer Cuivre) (net 45) (status 400))
(segment (start 93.345 100.076) (end 95.885 102.616) (width 0.4318) (layer Cuivre) (net 46) (status 800))
(segment (start 126.873 121.666) (end 126.873 120.142) (width 0.4318) (layer Cuivre) (net 47) (status 400))
(segment (start 123.444 125.095) (end 126.873 121.666) (width 0.4318) (layer Cuivre) (net 47))
(segment (start 107.315 125.476) (end 107.315 124.206) (width 0.4318) (layer Cuivre) (net 47) (status 400))
(segment (start 115.57 126.873) (end 108.712 126.873) (width 0.4318) (layer Cuivre) (net 47))
(segment (start 117.348 125.095) (end 123.444 125.095) (width 0.4318) (layer Cuivre) (net 47))
(segment (start 108.712 126.873) (end 107.315 125.476) (width 0.4318) (layer Cuivre) (net 47))
(segment (start 116.5225 125.9205) (end 117.348 125.095) (width 0.4318) (layer Cuivre) (net 47))
(segment (start 95.885 102.616) (end 102.235 102.616) (width 0.4318) (layer Cuivre) (net 46) (status 400))
(segment (start 116.5225 125.9205) (end 115.57 126.873) (width 0.4318) (layer Cuivre) (net 47))
(segment (start 109.093 121.539) (end 109.855 122.301) (width 0.4318) (layer Cuivre) (net 48))
(segment (start 102.108 122.936) (end 103.505 121.539) (width 0.4318) (layer Cuivre) (net 48))
(segment (start 95.885 122.936) (end 102.108 122.936) (width 0.4318) (layer Cuivre) (net 48) (status 800))
(segment (start 109.855 122.301) (end 109.855 124.206) (width 0.4318) (layer Cuivre) (net 48) (status 400))
(segment (start 116.5225 125.9205) (end 117.348 125.095) (width 0.4318) (layer Cuivre) (net 47))
(segment (start 108.712 126.873) (end 107.315 125.476) (width 0.4318) (layer Cuivre) (net 47))
(segment (start 117.348 125.095) (end 123.444 125.095) (width 0.4318) (layer Cuivre) (net 47))
(segment (start 115.57 126.873) (end 108.712 126.873) (width 0.4318) (layer Cuivre) (net 47))
(segment (start 107.315 125.476) (end 107.315 124.206) (width 0.4318) (layer Cuivre) (net 47) (status 400))
(segment (start 123.444 125.095) (end 126.873 121.666) (width 0.4318) (layer Cuivre) (net 47))
(segment (start 126.873 121.666) (end 126.873 120.142) (width 0.4318) (layer Cuivre) (net 47) (status 400))
(segment (start 103.505 121.539) (end 109.093 121.539) (width 0.4318) (layer Cuivre) (net 48))
(segment (start 105.283 93.726) (end 106.172 92.837) (width 0.4318) (layer Cuivre) (net 49))
(segment (start 106.172 92.837) (end 109.093 92.837) (width 0.4318) (layer Cuivre) (net 49))
(segment (start 105.283 96.647) (end 105.283 93.726) (width 0.4318) (layer Cuivre) (net 49))
(segment (start 95.885 97.536) (end 104.394 97.536) (width 0.4318) (layer Cuivre) (net 49) (status 800))
(segment (start 109.855 93.599) (end 109.855 96.266) (width 0.4318) (layer Cuivre) (net 49) (status 400))
(segment (start 109.093 92.837) (end 109.855 93.599) (width 0.4318) (layer Cuivre) (net 49))
(segment (start 109.855 122.301) (end 109.855 124.206) (width 0.4318) (layer Cuivre) (net 48) (status 400))
(segment (start 95.885 122.936) (end 102.108 122.936) (width 0.4318) (layer Cuivre) (net 48) (status 800))
(segment (start 102.108 122.936) (end 103.505 121.539) (width 0.4318) (layer Cuivre) (net 48))
(segment (start 109.093 121.539) (end 109.855 122.301) (width 0.4318) (layer Cuivre) (net 48))
(segment (start 104.394 97.536) (end 105.283 96.647) (width 0.4318) (layer Cuivre) (net 49))
(segment (start 139.7 64.516) (end 145.415 64.516) (width 0.6096) (layer Cuivre) (net 50) (status 400))
(segment (start 133.35 70.866) (end 139.7 64.516) (width 0.6096) (layer Cuivre) (net 50))
(segment (start 117.475 74.676) (end 125.73 74.676) (width 0.6096) (layer Cuivre) (net 50) (status 800))
(segment (start 126.365 74.041) (end 126.365 70.866) (width 0.6096) (layer Cuivre) (net 50) (status 400))
(segment (start 125.73 74.676) (end 126.365 74.041) (width 0.6096) (layer Cuivre) (net 50))
(segment (start 109.093 92.837) (end 109.855 93.599) (width 0.4318) (layer Cuivre) (net 49))
(segment (start 109.855 93.599) (end 109.855 96.266) (width 0.4318) (layer Cuivre) (net 49) (status 400))
(segment (start 95.885 97.536) (end 104.394 97.536) (width 0.4318) (layer Cuivre) (net 49) (status 800))
(segment (start 105.283 96.647) (end 105.283 93.726) (width 0.4318) (layer Cuivre) (net 49))
(segment (start 106.172 92.837) (end 109.093 92.837) (width 0.4318) (layer Cuivre) (net 49))
(segment (start 105.283 93.726) (end 106.172 92.837) (width 0.4318) (layer Cuivre) (net 49))
(segment (start 126.365 70.866) (end 133.35 70.866) (width 0.6096) (layer Cuivre) (net 50) (status 800))
(segment (start 125.73 74.676) (end 126.365 74.041) (width 0.6096) (layer Cuivre) (net 50))
(segment (start 126.365 74.041) (end 126.365 70.866) (width 0.6096) (layer Cuivre) (net 50) (status 400))
(segment (start 117.475 74.676) (end 125.73 74.676) (width 0.6096) (layer Cuivre) (net 50) (status 800))
(segment (start 133.35 70.866) (end 139.7 64.516) (width 0.6096) (layer Cuivre) (net 50))
(segment (start 139.7 64.516) (end 145.415 64.516) (width 0.6096) (layer Cuivre) (net 50) (status 400))
(zone (net 12) (net_name GND) (layer Cuivre) (tstamp 4AE6D930) (hatch edge 0.508)
(connect_pads (clearance 0.508))
@@ -7,7 +7,6 @@ LIBS:linear
LIBS:regul
LIBS:interface
LIBS:special
LIBS:complex_hierarchy-cache
EELAYER 24 0
EELAYER END
$Descr A4 11693 8268
+23 -11
View File
@@ -1,18 +1,21 @@
EESchema-LIBRARY Version 2.3 Date: 02/12/2009 10:37:56
EESchema-LIBRARY Version 2.3
#encoding utf-8
#
# C
#
DEF C C 0 10 N Y 1 F N
F0 "C" 50 100 50 H V L CNN
F1 "C" 50 -100 50 H V L CNN
F0 "C" 0 100 40 H V L CNN
F1 "C" 6 -85 40 H V L CNN
F2 "" 38 -150 30 H V C CNN
F3 "" 0 100 30 H V C CNN
$FPLIST
SM*
C?
C1-1
$ENDFPLIST
DRAW
P 2 0 1 10 -100 -30 100 -30 N
P 2 0 1 10 -100 30 100 30 N
P 2 0 1 20 -80 -30 80 -30 N
P 2 0 1 20 -80 30 80 30 N
X ~ 1 0 200 170 D 40 40 1 1 P
X ~ 2 0 -200 170 U 40 40 1 1 P
ENDDRAW
@@ -23,6 +26,8 @@ ENDDEF
DEF CONN_2 P 0 40 Y N 1 F N
F0 "P" -50 0 40 V V C CNN
F1 "CONN_2" 50 0 40 V V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
S -100 150 100 -150 0 1 0 N
X P1 1 -350 100 250 R 60 60 1 1 P I
@@ -36,6 +41,7 @@ DEF ECC81 U 0 0 Y Y 3 L N
F0 "U" 130 310 50 H V C CNN
F1 "ECC81" 350 -300 50 H V C CNN
F2 "VALVE-NOVAL_P" 270 -400 50 H I C CNN
F3 "" 0 0 60 H V C CNN
ALIAS ECC83
DRAW
P 2 1 0 0 -100 -200 -100 -300 N
@@ -77,6 +83,8 @@ ENDDEF
DEF ~GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 0 30 H I C CNN
F1 "GND" 0 -70 30 H I C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 4 0 1 0 -50 0 0 -50 50 0 -50 0 N
X GND 1 0 0 0 U 30 30 1 1 W N
@@ -86,25 +94,29 @@ ENDDEF
# PWR_FLAG
#
DEF PWR_FLAG #FLG 0 0 N N 1 F P
F0 "#FLG" 0 270 30 H I C CNN
F1 "PWR_FLAG" 0 230 30 H V C CNN
F0 "#FLG" 0 95 30 H I C CNN
F1 "PWR_FLAG" 0 180 30 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
X pwr 1 0 0 0 U 20 20 0 0 w
P 3 0 1 0 0 0 0 100 0 100 N
P 5 0 1 0 0 100 -100 150 0 200 100 150 0 100 N
P 6 0 1 0 0 0 0 50 -75 100 0 150 75 100 0 50 N
ENDDRAW
ENDDEF
#
# R
#
DEF R R 0 0 N Y 1 F N
F0 "R" 80 0 50 V V C CNN
F1 "R" 0 0 50 V V C CNN
F0 "R" 80 0 40 V V C CNN
F1 "R" 7 1 40 V V C CNN
F2 "" -70 0 30 V V C CNN
F3 "" 0 0 30 H V C CNN
$FPLIST
R?
SM0603
SM0805
R?-*
SM1206
$ENDFPLIST
DRAW
S -40 150 40 -150 0 1 12 N
+258 -344
View File
@@ -1,12 +1,12 @@
(kicad_pcb (version 3) (host pcbnew "(2013-01-12 BZR 3902)-testing")
(kicad_pcb (version 4) (host pcbnew "(2014-07-02 BZR 4969)-product")
(general
(links 20)
(no_connects 0)
(area 121.8946 89.916 170.8404 135.9154)
(area 123.761499 90.741499 168.338501 132.778501)
(thickness 1.6002)
(drawings 4)
(tracks 75)
(tracks 57)
(zones 0)
(modules 15)
(nets 10)
@@ -14,21 +14,19 @@
(page A4)
(layers
(15 Composant signal)
(0 Cuivre signal)
(16 Dessous.Adhes user)
(17 Dessus.Adhes user)
(18 Dessous.Pate user)
(19 Dessus.Pate user)
(20 Dessous.SilkS user)
(21 Dessus.SilkS user)
(22 Dessous.Masque user)
(23 Dessus.Masque user)
(24 Dessin.User user)
(25 Cmts.User user)
(26 Eco1.User user)
(27 Eco2.User user)
(28 Contours.Ci user)
(0 Composant signal)
(31 Cuivre signal)
(34 B.Paste user)
(35 F.Paste user)
(36 B.SilkS user)
(37 F.SilkS user)
(38 B.Mask user)
(39 F.Mask user)
(40 Dwgs.User user)
(41 Cmts.User user)
(42 Eco1.User user)
(43 Eco2.User user)
(44 Edge.Cuts user)
)
(setup
@@ -57,12 +55,13 @@
(pad_drill 1.9304)
(pad_to_mask_clearance 0.254)
(aux_axis_origin 0 0)
(visible_elements FFFFFFBF)
(visible_elements 7FFFFFFF)
(pcbplotparams
(layerselection 3178497)
(usegerberextensions true)
(layerselection 0x000f0_80000001)
(usegerberextensions false)
(usegerberattributes true)
(excludeedgelayer true)
(linewidth 60)
(linewidth 0.150000)
(plotframeref false)
(viasonmask false)
(mode 1)
@@ -75,27 +74,26 @@
(psa4output false)
(plotreference true)
(plotvalue true)
(plotothertext true)
(plotinvisibletext false)
(padsonsilk false)
(subtractmaskfromsilk false)
(outputformat 1)
(mirror false)
(drillshape 1)
(drillshape 0)
(scaleselection 1)
(outputdirectory ""))
)
(net 0 "")
(net 1 GND)
(net 2 N-000001)
(net 3 N-000002)
(net 4 N-000004)
(net 5 N-000005)
(net 6 N-000006)
(net 7 N-000007)
(net 8 N-000008)
(net 9 N-000009)
(net 2 "Net-(C1-Pad1)")
(net 3 "Net-(C2-Pad1)")
(net 4 "Net-(C2-Pad2)")
(net 5 "Net-(P1-Pad2)")
(net 6 "Net-(P4-Pad1)")
(net 7 "Net-(P4-Pad2)")
(net 8 "Net-(R1-Pad1)")
(net 9 "Net-(R2-Pad1)")
(net_class Default "Ceci est la Netclass par défaut"
(clearance 0.381)
@@ -104,16 +102,16 @@
(via_drill 0.635)
(uvia_dia 0.508)
(uvia_drill 0.127)
(add_net "")
(add_net GND)
(add_net N-000001)
(add_net N-000002)
(add_net N-000004)
(add_net N-000005)
(add_net N-000006)
(add_net N-000007)
(add_net N-000008)
(add_net N-000009)
(add_net "Net-(C1-Pad1)")
(add_net "Net-(C2-Pad1)")
(add_net "Net-(C2-Pad2)")
(add_net "Net-(P1-Pad2)")
(add_net "Net-(P4-Pad1)")
(add_net "Net-(P4-Pad2)")
(add_net "Net-(R1-Pad1)")
(add_net "Net-(R2-Pad1)")
)
(module 1pin (layer Composant) (tedit 200000) (tstamp 454CC09B)
@@ -121,16 +119,14 @@
(descr "module 1 pin (ou trou mecanique de percage)")
(tags DEV)
(path 1pin)
(fp_text reference 1PIN (at 0 -3.048) (layer Dessus.SilkS)
(fp_text reference 1PIN (at 0 -3.048) (layer F.SilkS)
(effects (font (size 1.016 1.016) (thickness 0.254)))
)
(fp_text value P*** (at 0 2.794) (layer Dessus.SilkS) hide
(fp_text value P*** (at 0 2.794) (layer F.SilkS) hide
(effects (font (size 1.016 1.016) (thickness 0.254)))
)
(fp_circle (center 0 0) (end 0 -2.286) (layer Dessus.SilkS) (width 0.381))
(pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048)
(layers *.Cu *.Mask Dessus.SilkS)
)
(fp_circle (center 0 0) (end 0 -2.286) (layer F.SilkS) (width 0.381))
(pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048) (layers *.Cu *.Mask F.SilkS))
)
(module 1pin (layer Composant) (tedit 200000) (tstamp 454CC096)
@@ -138,16 +134,14 @@
(descr "module 1 pin (ou trou mecanique de percage)")
(tags DEV)
(path 1pin)
(fp_text reference 1PIN (at 0 -3.048) (layer Dessus.SilkS)
(fp_text reference 1PIN (at 0 -3.048) (layer F.SilkS)
(effects (font (size 1.016 1.016) (thickness 0.254)))
)
(fp_text value P*** (at 0 2.794) (layer Dessus.SilkS) hide
(fp_text value P*** (at 0 2.794) (layer F.SilkS) hide
(effects (font (size 1.016 1.016) (thickness 0.254)))
)
(fp_circle (center 0 0) (end 0 -2.286) (layer Dessus.SilkS) (width 0.381))
(pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048)
(layers *.Cu *.Mask Dessus.SilkS)
)
(fp_circle (center 0 0) (end 0 -2.286) (layer F.SilkS) (width 0.381))
(pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048) (layers *.Cu *.Mask F.SilkS))
)
(module 1pin (layer Composant) (tedit 200000) (tstamp 454CC090)
@@ -155,16 +149,14 @@
(descr "module 1 pin (ou trou mecanique de percage)")
(tags DEV)
(path 1pin)
(fp_text reference 1PIN (at 0 -3.048) (layer Dessus.SilkS)
(fp_text reference 1PIN (at 0 -3.048) (layer F.SilkS)
(effects (font (size 1.016 1.016) (thickness 0.254)))
)
(fp_text value P*** (at 0 2.794) (layer Dessus.SilkS) hide
(fp_text value P*** (at 0 2.794) (layer F.SilkS) hide
(effects (font (size 1.016 1.016) (thickness 0.254)))
)
(fp_circle (center 0 0) (end 0 -2.286) (layer Dessus.SilkS) (width 0.381))
(pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048)
(layers *.Cu *.Mask Dessus.SilkS)
)
(fp_circle (center 0 0) (end 0 -2.286) (layer F.SilkS) (width 0.381))
(pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048) (layers *.Cu *.Mask F.SilkS))
)
(module 1pin (layer Composant) (tedit 200000) (tstamp 454CC08A)
@@ -172,64 +164,44 @@
(descr "module 1 pin (ou trou mecanique de percage)")
(tags DEV)
(path 1pin)
(fp_text reference 1PIN (at 0 -3.048) (layer Dessus.SilkS)
(fp_text reference 1PIN (at 0 -3.048) (layer F.SilkS)
(effects (font (size 1.016 1.016) (thickness 0.254)))
)
(fp_text value P*** (at 0 2.794) (layer Dessus.SilkS) hide
(fp_text value P*** (at 0 2.794) (layer F.SilkS) hide
(effects (font (size 1.016 1.016) (thickness 0.254)))
)
(fp_circle (center 0 0) (end 0 -2.286) (layer Dessus.SilkS) (width 0.381))
(pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048)
(layers *.Cu *.Mask Dessus.SilkS)
)
(fp_circle (center 0 0) (end 0 -2.286) (layer F.SilkS) (width 0.381))
(pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048) (layers *.Cu *.Mask F.SilkS))
)
(module ECC-83-1 (layer Composant) (tedit 454CBC05) (tstamp 48B4F266)
(at 149.225 113.665)
(path /48B4F266)
(fp_text reference U1 (at 1.27 -11.43) (layer Dessus.SilkS)
(effects (font (size 1.524 1.524) (thickness 0.3048)))
(fp_text reference U1 (at 1.27 -11.43) (layer F.SilkS)
(effects (font (thickness 0.3048)))
)
(fp_text value ECC81_83 (at 0 11.43) (layer Dessus.SilkS)
(effects (font (size 1.524 1.524) (thickness 0.3048)))
)
(fp_circle (center 0 0) (end 10.16 1.27) (layer Dessus.SilkS) (width 0.381))
(pad 1 thru_hole circle (at 3.4544 4.75488) (size 2.032 2.032) (drill 1.016)
(layers *.Cu *.Mask Dessus.SilkS)
(net 2 N-000001)
)
(pad 2 thru_hole circle (at 5.60832 1.8288) (size 2.032 2.032) (drill 1.016)
(layers *.Cu *.Mask Dessus.SilkS)
(net 4 N-000004)
)
(pad 3 thru_hole circle (at 5.60832 -1.8288) (size 2.032 2.032) (drill 1.016)
(layers *.Cu *.Mask Dessus.SilkS)
(net 5 N-000005)
)
(pad 4 thru_hole circle (at 3.4544 -4.75488) (size 2.032 2.032) (drill 1.016)
(layers *.Cu *.Mask Dessus.SilkS)
(net 7 N-000007)
)
(pad 5 thru_hole circle (at 0 -5.8928) (size 2.032 2.032) (drill 1.016)
(layers *.Cu *.Mask Dessus.SilkS)
(net 7 N-000007)
)
(pad 6 thru_hole circle (at -3.4544 -4.75488) (size 2.032 2.032) (drill 1.016)
(layers *.Cu *.Mask Dessus.SilkS)
(net 8 N-000008)
)
(pad 7 thru_hole circle (at -5.60832 -1.8288) (size 2.032 2.032) (drill 1.016)
(layers *.Cu *.Mask Dessus.SilkS)
(net 2 N-000001)
)
(pad 8 thru_hole circle (at -5.60832 1.78816) (size 2.032 2.032) (drill 1.016)
(layers *.Cu *.Mask Dessus.SilkS)
(net 9 N-000009)
)
(pad 9 thru_hole circle (at -3.4544 4.75488) (size 2.032 2.032) (drill 1.016)
(layers *.Cu *.Mask Dessus.SilkS)
(net 3 N-000002)
(fp_text value ECC83 (at 0 11.43) (layer F.SilkS)
(effects (font (thickness 0.3048)))
)
(fp_circle (center 0 0) (end 10.16 1.27) (layer F.SilkS) (width 0.381))
(pad 1 thru_hole circle (at 3.4544 4.75488) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 8 "Net-(R1-Pad1)"))
(pad 2 thru_hole circle (at 5.60832 1.8288) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 5 "Net-(P1-Pad2)"))
(pad 3 thru_hole circle (at 5.60832 -1.8288) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 9 "Net-(R2-Pad1)"))
(pad 4 thru_hole circle (at 3.4544 -4.75488) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 6 "Net-(P4-Pad1)"))
(pad 5 thru_hole circle (at 0 -5.8928) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 6 "Net-(P4-Pad1)"))
(pad 6 thru_hole circle (at -3.4544 -4.75488) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 2 "Net-(C1-Pad1)"))
(pad 7 thru_hole circle (at -5.60832 -1.8288) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 8 "Net-(R1-Pad1)"))
(pad 8 thru_hole circle (at -5.60832 1.78816) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 4 "Net-(C2-Pad2)"))
(pad 9 thru_hole circle (at -3.4544 4.75488) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 7 "Net-(P4-Pad2)"))
(model valves/ecc83.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
@@ -243,28 +215,24 @@
(tags R)
(path /4549F39D)
(autoplace_cost180 10)
(fp_text reference R2 (at 0 0 180) (layer Dessus.SilkS)
(fp_text reference R2 (at 0 0 180) (layer F.SilkS)
(effects (font (size 1.397 1.27) (thickness 0.2032)))
)
(fp_text value 1.5K (at 0 0 180) (layer Dessus.SilkS) hide
(fp_text value 1.5K (at 0 0 180) (layer F.SilkS) hide
(effects (font (size 1.397 1.27) (thickness 0.2032)))
)
(fp_line (start -3.81 0) (end -3.302 0) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.81 0) (end 3.302 0) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.302 0) (end 3.302 -1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.302 1.016) (end 3.302 1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.302 1.016) (end 3.302 0) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer Dessus.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -3.81 0 180) (size 1.397 1.397) (drill 0.8128)
(layers *.Cu *.Mask Dessus.SilkS)
(net 5 N-000005)
)
(pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128)
(layers *.Cu *.Mask Dessus.SilkS)
(net 1 GND)
)
(fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 9 "Net-(R2-Pad1)"))
(pad 2 thru_hole circle (at 3.81 0 180) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(model discret/resistor.wrl
(at (xyz 0 0 0))
(scale (xyz 0.3 0.3 0.3))
@@ -278,28 +246,24 @@
(tags R)
(path /4549F3A2)
(autoplace_cost180 10)
(fp_text reference R4 (at 0 0 270) (layer Dessus.SilkS)
(fp_text reference R4 (at 0 0 270) (layer F.SilkS)
(effects (font (size 1.397 1.27) (thickness 0.2032)))
)
(fp_text value 47K (at 0 0 270) (layer Dessus.SilkS) hide
(fp_text value 47K (at 0 0 270) (layer F.SilkS) hide
(effects (font (size 1.397 1.27) (thickness 0.2032)))
)
(fp_line (start -3.81 0) (end -3.302 0) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.81 0) (end 3.302 0) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.302 0) (end 3.302 -1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.302 1.016) (end 3.302 1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.302 1.016) (end 3.302 0) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer Dessus.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128)
(layers *.Cu *.Mask Dessus.SilkS)
(net 4 N-000004)
)
(pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128)
(layers *.Cu *.Mask Dessus.SilkS)
(net 1 GND)
)
(fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 5 "Net-(P1-Pad2)"))
(pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(model discret/resistor.wrl
(at (xyz 0 0 0))
(scale (xyz 0.3 0.3 0.3))
@@ -313,28 +277,24 @@
(tags R)
(path /4549F3AD)
(autoplace_cost180 10)
(fp_text reference R3 (at 0 0 90) (layer Dessus.SilkS)
(fp_text reference R3 (at 0 0 90) (layer F.SilkS)
(effects (font (size 1.397 1.27) (thickness 0.2032)))
)
(fp_text value 100K (at 0 0 90) (layer Dessus.SilkS) hide
(fp_text value 100K (at 0 0 90) (layer F.SilkS) hide
(effects (font (size 1.397 1.27) (thickness 0.2032)))
)
(fp_line (start -3.81 0) (end -3.302 0) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.81 0) (end 3.302 0) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.302 0) (end 3.302 -1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.302 1.016) (end 3.302 1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.302 1.016) (end 3.302 0) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer Dessus.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -3.81 0 90) (size 1.397 1.397) (drill 0.8128)
(layers *.Cu *.Mask Dessus.SilkS)
(net 6 N-000006)
)
(pad 2 thru_hole circle (at 3.81 0 90) (size 1.397 1.397) (drill 0.8128)
(layers *.Cu *.Mask Dessus.SilkS)
(net 1 GND)
)
(fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -3.81 0 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 3 "Net-(C2-Pad1)"))
(pad 2 thru_hole circle (at 3.81 0 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(model discret/resistor.wrl
(at (xyz 0 0 0))
(scale (xyz 0.3 0.3 0.3))
@@ -348,28 +308,24 @@
(tags R)
(path /4549F38A)
(autoplace_cost180 10)
(fp_text reference R1 (at 0 0 270) (layer Dessus.SilkS)
(fp_text reference R1 (at 0 0 270) (layer F.SilkS)
(effects (font (size 1.397 1.27) (thickness 0.2032)))
)
(fp_text value 1.5K (at 0 0 270) (layer Dessus.SilkS) hide
(fp_text value 1.5K (at 0 0 270) (layer F.SilkS) hide
(effects (font (size 1.397 1.27) (thickness 0.2032)))
)
(fp_line (start -3.81 0) (end -3.302 0) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.81 0) (end 3.302 0) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.302 0) (end 3.302 -1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.302 1.016) (end 3.302 1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.302 1.016) (end 3.302 0) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer Dessus.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128)
(layers *.Cu *.Mask Dessus.SilkS)
(net 2 N-000001)
)
(pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128)
(layers *.Cu *.Mask Dessus.SilkS)
(net 9 N-000009)
)
(fp_line (start -3.81 0) (end -3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.81 0) (end 3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.302 0) (end 3.302 -1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.302 -1.016) (end -3.302 -1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 -1.016) (end -3.302 1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 1.016) (end 3.302 1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 8 "Net-(R1-Pad1)"))
(pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 4 "Net-(C2-Pad2)"))
(model discret/resistor.wrl
(at (xyz 0 0 0))
(scale (xyz 0.3 0.3 0.3))
@@ -382,21 +338,17 @@
(descr "Condensateur polarise")
(tags CP)
(path /4549F4BE)
(fp_text reference C1 (at 0 2.54 90) (layer Dessus.SilkS)
(fp_text reference C1 (at 0 2.54 90) (layer F.SilkS)
(effects (font (size 1.27 1.27) (thickness 0.254)))
)
(fp_text value 10uF (at 0 -2.54 90) (layer Dessus.SilkS)
(fp_text value 10uF (at 0 -2.54 90) (layer F.SilkS)
(effects (font (size 1.27 1.27) (thickness 0.254)))
)
(fp_circle (center 0 0) (end 4.826 -2.794) (layer Dessus.SilkS) (width 0.3048))
(pad 1 thru_hole rect (at -2.54 0 90) (size 1.778 1.778) (drill 1.016)
(layers *.Cu *.Mask Dessus.SilkS)
(net 8 N-000008)
)
(pad 2 thru_hole circle (at 2.54 0 90) (size 1.778 1.778) (drill 1.016)
(layers *.Cu *.Mask Dessus.SilkS)
(net 1 GND)
)
(fp_circle (center 0 0) (end 4.826 -2.794) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole rect (at -2.54 0 90) (size 1.778 1.778) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 2 "Net-(C1-Pad1)"))
(pad 2 thru_hole circle (at 2.54 0 90) (size 1.778 1.778) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(model discret/c_vert_c2v10.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
@@ -409,25 +361,21 @@
(descr "Condensateur = 2 pas")
(tags C)
(path /4549F3BE)
(fp_text reference C2 (at 0 0 90) (layer Dessus.SilkS)
(fp_text reference C2 (at 0 0 90) (layer F.SilkS)
(effects (font (size 1.016 1.016) (thickness 0.2032)))
)
(fp_text value 680nF (at 0 0 90) (layer Dessus.SilkS) hide
(fp_text value 680nF (at 0 0 90) (layer F.SilkS) hide
(effects (font (size 1.016 1.016) (thickness 0.2032)))
)
(fp_line (start -3.556 -1.016) (end 3.556 -1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.556 -1.016) (end 3.556 1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 3.556 1.016) (end -3.556 1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.556 1.016) (end -3.556 -1.016) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -3.556 -0.508) (end -3.048 -1.016) (layer Dessus.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -2.54 0 90) (size 1.397 1.397) (drill 0.8128)
(layers *.Cu *.Mask Dessus.SilkS)
(net 6 N-000006)
)
(pad 2 thru_hole circle (at 2.54 0 90) (size 1.397 1.397) (drill 0.8128)
(layers *.Cu *.Mask Dessus.SilkS)
(net 9 N-000009)
)
(fp_line (start -3.556 -1.016) (end 3.556 -1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.556 -1.016) (end 3.556 1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start 3.556 1.016) (end -3.556 1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.556 1.016) (end -3.556 -1.016) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.556 -0.508) (end -3.048 -1.016) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -2.54 0 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 3 "Net-(C2-Pad1)"))
(pad 2 thru_hole circle (at 2.54 0 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 4 "Net-(C2-Pad2)"))
(model discret/capa_2pas_5x5mm.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
@@ -440,25 +388,21 @@
(descr "Bornier d'alimentation 2 pins")
(tags DEV)
(path /4549F4A5)
(fp_text reference P3 (at 0 -5.08 90) (layer Dessus.SilkS)
(effects (font (size 1.524 1.524) (thickness 0.3048)))
(fp_text reference P3 (at 0 -5.08 90) (layer F.SilkS)
(effects (font (thickness 0.3048)))
)
(fp_text value POWER (at 0 5.08 90) (layer Dessus.SilkS)
(effects (font (size 1.524 1.524) (thickness 0.3048)))
)
(fp_line (start 5.08 2.54) (end -5.08 2.54) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 5.08 3.81) (end 5.08 -3.81) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 5.08 -3.81) (end -5.08 -3.81) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -5.08 -3.81) (end -5.08 3.81) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -5.08 3.81) (end 5.08 3.81) (layer Dessus.SilkS) (width 0.3048))
(pad 1 thru_hole rect (at -2.54 0 90) (size 2.54 2.54) (drill 1.524)
(layers *.Cu *.Mask Dessus.SilkS)
(net 8 N-000008)
)
(pad 2 thru_hole circle (at 2.54 0 90) (size 2.54 2.54) (drill 1.524)
(layers *.Cu *.Mask Dessus.SilkS)
(net 1 GND)
(fp_text value POWER (at 0 5.08 90) (layer F.SilkS)
(effects (font (thickness 0.3048)))
)
(fp_line (start 5.08 2.54) (end -5.08 2.54) (layer F.SilkS) (width 0.3048))
(fp_line (start 5.08 3.81) (end 5.08 -3.81) (layer F.SilkS) (width 0.3048))
(fp_line (start 5.08 -3.81) (end -5.08 -3.81) (layer F.SilkS) (width 0.3048))
(fp_line (start -5.08 -3.81) (end -5.08 3.81) (layer F.SilkS) (width 0.3048))
(fp_line (start -5.08 3.81) (end 5.08 3.81) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole rect (at -2.54 0 90) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)
(net 2 "Net-(C1-Pad1)"))
(pad 2 thru_hole circle (at 2.54 0 90) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(model device/bornier_2.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
@@ -471,25 +415,21 @@
(descr "Bornier d'alimentation 2 pins")
(tags DEV)
(path /4549F464)
(fp_text reference P1 (at 0 -5.08 270) (layer Dessus.SilkS)
(effects (font (size 1.524 1.524) (thickness 0.3048)))
(fp_text reference P1 (at 0 -5.08 270) (layer F.SilkS)
(effects (font (thickness 0.3048)))
)
(fp_text value IN (at 0 5.08 270) (layer Dessus.SilkS)
(effects (font (size 1.524 1.524) (thickness 0.3048)))
)
(fp_line (start 5.08 2.54) (end -5.08 2.54) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 5.08 3.81) (end 5.08 -3.81) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 5.08 -3.81) (end -5.08 -3.81) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -5.08 -3.81) (end -5.08 3.81) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -5.08 3.81) (end 5.08 3.81) (layer Dessus.SilkS) (width 0.3048))
(pad 1 thru_hole rect (at -2.54 0 270) (size 2.54 2.54) (drill 1.524)
(layers *.Cu *.Mask Dessus.SilkS)
(net 1 GND)
)
(pad 2 thru_hole circle (at 2.54 0 270) (size 2.54 2.54) (drill 1.524)
(layers *.Cu *.Mask Dessus.SilkS)
(net 4 N-000004)
(fp_text value IN (at 0 5.08 270) (layer F.SilkS)
(effects (font (thickness 0.3048)))
)
(fp_line (start 5.08 2.54) (end -5.08 2.54) (layer F.SilkS) (width 0.3048))
(fp_line (start 5.08 3.81) (end 5.08 -3.81) (layer F.SilkS) (width 0.3048))
(fp_line (start 5.08 -3.81) (end -5.08 -3.81) (layer F.SilkS) (width 0.3048))
(fp_line (start -5.08 -3.81) (end -5.08 3.81) (layer F.SilkS) (width 0.3048))
(fp_line (start -5.08 3.81) (end 5.08 3.81) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole rect (at -2.54 0 270) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(pad 2 thru_hole circle (at 2.54 0 270) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)
(net 5 "Net-(P1-Pad2)"))
(model device/bornier_2.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
@@ -502,25 +442,21 @@
(descr "Bornier d'alimentation 2 pins")
(tags DEV)
(path /4549F46C)
(fp_text reference P2 (at 0 -5.08 90) (layer Dessus.SilkS)
(effects (font (size 1.524 1.524) (thickness 0.3048)))
(fp_text reference P2 (at 0 -5.08 90) (layer F.SilkS)
(effects (font (thickness 0.3048)))
)
(fp_text value OUT (at 0 5.08 90) (layer Dessus.SilkS)
(effects (font (size 1.524 1.524) (thickness 0.3048)))
)
(fp_line (start 5.08 2.54) (end -5.08 2.54) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 5.08 3.81) (end 5.08 -3.81) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 5.08 -3.81) (end -5.08 -3.81) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -5.08 -3.81) (end -5.08 3.81) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -5.08 3.81) (end 5.08 3.81) (layer Dessus.SilkS) (width 0.3048))
(pad 1 thru_hole rect (at -2.54 0 90) (size 2.54 2.54) (drill 1.524)
(layers *.Cu *.Mask Dessus.SilkS)
(net 6 N-000006)
)
(pad 2 thru_hole circle (at 2.54 0 90) (size 2.54 2.54) (drill 1.524)
(layers *.Cu *.Mask Dessus.SilkS)
(net 1 GND)
(fp_text value OUT (at 0 5.08 90) (layer F.SilkS)
(effects (font (thickness 0.3048)))
)
(fp_line (start 5.08 2.54) (end -5.08 2.54) (layer F.SilkS) (width 0.3048))
(fp_line (start 5.08 3.81) (end 5.08 -3.81) (layer F.SilkS) (width 0.3048))
(fp_line (start 5.08 -3.81) (end -5.08 -3.81) (layer F.SilkS) (width 0.3048))
(fp_line (start -5.08 -3.81) (end -5.08 3.81) (layer F.SilkS) (width 0.3048))
(fp_line (start -5.08 3.81) (end 5.08 3.81) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole rect (at -2.54 0 90) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)
(net 3 "Net-(C2-Pad1)"))
(pad 2 thru_hole circle (at 2.54 0 90) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(model device/bornier_2.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
@@ -533,25 +469,21 @@
(descr "Bornier d'alimentation 2 pins")
(tags DEV)
(path /456A8ACC)
(fp_text reference P4 (at 0 -5.08 180) (layer Dessus.SilkS)
(effects (font (size 1.524 1.524) (thickness 0.3048)))
(fp_text reference P4 (at 0 -5.08 180) (layer F.SilkS)
(effects (font (thickness 0.3048)))
)
(fp_text value CONN_2 (at 0 5.08 180) (layer Dessus.SilkS)
(effects (font (size 1.524 1.524) (thickness 0.3048)))
)
(fp_line (start 5.08 2.54) (end -5.08 2.54) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 5.08 3.81) (end 5.08 -3.81) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start 5.08 -3.81) (end -5.08 -3.81) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -5.08 -3.81) (end -5.08 3.81) (layer Dessus.SilkS) (width 0.3048))
(fp_line (start -5.08 3.81) (end 5.08 3.81) (layer Dessus.SilkS) (width 0.3048))
(pad 1 thru_hole rect (at -2.54 0 180) (size 2.54 2.54) (drill 1.524)
(layers *.Cu *.Mask Dessus.SilkS)
(net 7 N-000007)
)
(pad 2 thru_hole circle (at 2.54 0 180) (size 2.54 2.54) (drill 1.524)
(layers *.Cu *.Mask Dessus.SilkS)
(net 3 N-000002)
(fp_text value CONN_2 (at 0 5.08 180) (layer F.SilkS)
(effects (font (thickness 0.3048)))
)
(fp_line (start 5.08 2.54) (end -5.08 2.54) (layer F.SilkS) (width 0.3048))
(fp_line (start 5.08 3.81) (end 5.08 -3.81) (layer F.SilkS) (width 0.3048))
(fp_line (start 5.08 -3.81) (end -5.08 -3.81) (layer F.SilkS) (width 0.3048))
(fp_line (start -5.08 -3.81) (end -5.08 3.81) (layer F.SilkS) (width 0.3048))
(fp_line (start -5.08 3.81) (end 5.08 3.81) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole rect (at -2.54 0 180) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)
(net 6 "Net-(P4-Pad1)"))
(pad 2 thru_hole circle (at 2.54 0 180) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)
(net 7 "Net-(P4-Pad2)"))
(model device/bornier_2.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
@@ -559,86 +491,68 @@
)
)
(gr_line (start 123.825 132.715) (end 168.275 132.715) (angle 90) (layer Contours.Ci) (width 0.127))
(gr_line (start 168.275 90.805) (end 123.825 90.805) (angle 90) (layer Contours.Ci) (width 0.127))
(gr_line (start 168.275 90.805) (end 168.275 132.715) (angle 90) (layer Contours.Ci) (width 0.127))
(gr_line (start 123.825 90.805) (end 123.825 132.715) (angle 90) (layer Contours.Ci) (width 0.127))
(gr_line (start 123.825 132.715) (end 168.275 132.715) (angle 90) (layer Edge.Cuts) (width 0.127))
(gr_line (start 168.275 90.805) (end 123.825 90.805) (angle 90) (layer Edge.Cuts) (width 0.127))
(gr_line (start 168.275 90.805) (end 168.275 132.715) (angle 90) (layer Edge.Cuts) (width 0.127))
(gr_line (start 123.825 90.805) (end 123.825 132.715) (angle 90) (layer Edge.Cuts) (width 0.127))
(segment (start 148.59 95.25) (end 160.02 95.25) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 146.05 95.25) (end 148.59 95.25) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 142.24 95.25) (end 146.05 95.25) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 164.465 125.095) (end 164.465 124.46) (width 0.8636) (layer Cuivre) (net 1) (status 800))
(segment (start 164.465 124.46) (end 167.005 121.92) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 167.005 109.22) (end 167.005 121.92) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 128.27 114.3) (end 125.73 112.60582) (width 0.8636) (layer Cuivre) (net 1) (status 800))
(segment (start 130.81 114.3) (end 132.08 115.57) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 132.08 115.57) (end 132.08 116.84) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 132.08 116.84) (end 133.985 118.745) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 128.27 114.3) (end 130.81 114.3) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 146.05 97.79) (end 146.05 95.25) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 133.985 95.885) (end 138.43 95.885) (width 0.8636) (layer Cuivre) (net 1) (status 400))
(segment (start 129.54 100.33) (end 133.985 95.885) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 139.065 95.25) (end 142.24 95.25) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 138.43 95.885) (end 139.065 95.25) (width 0.8636) (layer Cuivre) (net 1) (status 800))
(segment (start 165.735 107.95) (end 167.005 109.22) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 164.465 107.95) (end 165.735 107.95) (width 0.8636) (layer Cuivre) (net 1) (status 800))
(segment (start 126.365 100.33) (end 125.73 100.965) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 128.27 100.33) (end 126.365 100.33) (width 0.8636) (layer Cuivre) (net 1) (status 800))
(segment (start 125.73 100.965) (end 125.73 112.60582) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 128.27 100.33) (end 129.54 100.33) (width 0.8636) (layer Cuivre) (net 1) (status 800))
(segment (start 164.465 99.695) (end 164.465 107.95) (width 0.8636) (layer Cuivre) (net 1) (status 400))
(segment (start 160.02 95.25) (end 164.465 99.695) (width 0.8636) (layer Cuivre) (net 1))
(segment (start 153.289 131.826) (end 154.94 130.175) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 140.716 131.826) (end 153.289 131.826) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 143.61668 111.8362) (end 141.6812 111.8362) (width 0.8636) (layer Cuivre) (net 2) (status 800))
(segment (start 141.6812 111.8362) (end 137.795 107.95) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 154.94 121.31548) (end 154.94 120.68048) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 154.94 120.68048) (end 152.6794 118.41988) (width 0.8636) (layer Cuivre) (net 2) (status 400))
(segment (start 136.398 121.92) (end 135.509 121.031) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 135.509 121.031) (end 135.509 117.729) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 135.509 117.729) (end 133.985 116.205) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 136.525 121.92) (end 136.398 121.92) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 136.525 121.92) (end 139.065 124.46) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 139.065 124.46) (end 139.065 130.175) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 139.065 130.175) (end 140.335 131.445) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 135.89 107.95) (end 135.255 107.95) (width 0.8636) (layer Cuivre) (net 2) (status 800))
(segment (start 133.985 109.22) (end 133.985 116.205) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 135.255 107.95) (end 133.985 109.22) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 135.89 107.95) (end 137.795 107.95) (width 0.8636) (layer Cuivre) (net 2) (status 800))
(segment (start 140.335 131.445) (end 140.716 131.826) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 154.94 121.31548) (end 154.94 121.31548) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 154.94 130.175) (end 154.94 121.31548) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 145.7706 129.1844) (end 145.415 129.54) (width 0.8636) (layer Cuivre) (net 3) (status 400))
(segment (start 145.7706 118.41988) (end 145.7706 129.1844) (width 0.8636) (layer Cuivre) (net 3) (status 800))
(segment (start 159.385 117.475) (end 164.465 117.475) (width 0.8636) (layer Cuivre) (net 4) (status 400))
(segment (start 154.83332 115.4938) (end 157.4038 115.4938) (width 0.8636) (layer Cuivre) (net 4) (status 800))
(segment (start 164.465 117.475) (end 164.465 113.03) (width 0.8636) (layer Cuivre) (net 4) (status C00))
(segment (start 157.4038 115.4938) (end 159.385 117.475) (width 0.8636) (layer Cuivre) (net 4))
(segment (start 154.83332 111.8362) (end 154.83332 111.23168) (width 0.8636) (layer Cuivre) (net 5) (status 800))
(segment (start 159.385 106.68) (end 159.385 99.695) (width 0.8636) (layer Cuivre) (net 5))
(segment (start 154.83332 111.23168) (end 159.385 106.68) (width 0.8636) (layer Cuivre) (net 5))
(segment (start 157.48 97.79) (end 159.385 99.695) (width 0.8636) (layer Cuivre) (net 5))
(segment (start 153.67 97.79) (end 157.48 97.79) (width 0.8636) (layer Cuivre) (net 5) (status 800))
(segment (start 137.16 125.095) (end 133.985 125.095) (width 0.8636) (layer Cuivre) (net 6))
(segment (start 133.985 126.365) (end 133.985 125.095) (width 0.8636) (layer Cuivre) (net 6))
(segment (start 133.985 125.095) (end 128.27 119.38) (width 0.8636) (layer Cuivre) (net 6))
(segment (start 149.86 128.905) (end 150.495 129.54) (width 0.8636) (layer Cuivre) (net 7) (status 400))
(segment (start 149.86 111.125) (end 149.86 128.905) (width 0.8636) (layer Cuivre) (net 7))
(segment (start 149.225 110.49) (end 149.86 111.125) (width 0.8636) (layer Cuivre) (net 7))
(segment (start 149.225 107.7722) (end 151.54148 107.7722) (width 0.8636) (layer Cuivre) (net 7) (status 800))
(segment (start 151.54148 107.7722) (end 152.6794 108.91012) (width 0.8636) (layer Cuivre) (net 7) (status 400))
(segment (start 149.225 107.7722) (end 149.225 110.49) (width 0.8636) (layer Cuivre) (net 7) (status 800))
(segment (start 136.525 100.965) (end 135.255 102.235) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 138.43 100.965) (end 136.525 100.965) (width 0.8636) (layer Cuivre) (net 8) (status 800))
(segment (start 145.7706 103.8606) (end 142.875 100.965) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 142.875 100.965) (end 138.43 100.965) (width 0.8636) (layer Cuivre) (net 8) (status 400))
(segment (start 145.7706 108.91012) (end 145.7706 103.8606) (width 0.8636) (layer Cuivre) (net 8) (status 800))
(segment (start 132.08 105.41) (end 135.255 102.235) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 128.27 105.41) (end 132.08 105.41) (width 0.8636) (layer Cuivre) (net 8) (status 800))
(segment (start 137.16 120.015) (end 137.16 115.57) (width 0.8636) (layer Cuivre) (net 9))
(segment (start 135.89 115.57) (end 137.16 115.57) (width 0.8636) (layer Cuivre) (net 9))
(segment (start 137.16 115.57) (end 143.49984 115.57) (width 0.8636) (layer Cuivre) (net 9))
(segment (start 143.49984 115.57) (end 143.61668 115.45316) (width 0.8636) (layer Cuivre) (net 9))
(segment (start 136.525 100.965) (end 135.255 102.235) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 138.43 100.965) (end 136.525 100.965) (width 0.8636) (layer Cuivre) (net 2) (status 800))
(segment (start 145.7706 103.8606) (end 142.875 100.965) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 142.875 100.965) (end 138.43 100.965) (width 0.8636) (layer Cuivre) (net 2) (status 400))
(segment (start 145.7706 108.91012) (end 145.7706 103.8606) (width 0.8636) (layer Cuivre) (net 2) (status 800))
(segment (start 132.08 105.41) (end 135.255 102.235) (width 0.8636) (layer Cuivre) (net 2))
(segment (start 128.27 105.41) (end 132.08 105.41) (width 0.8636) (layer Cuivre) (net 2) (status 800))
(segment (start 137.16 125.095) (end 133.985 125.095) (width 0.8636) (layer Cuivre) (net 3))
(segment (start 133.985 126.365) (end 133.985 125.095) (width 0.8636) (layer Cuivre) (net 3))
(segment (start 133.985 125.095) (end 128.27 119.38) (width 0.8636) (layer Cuivre) (net 3))
(segment (start 137.16 120.015) (end 137.16 115.57) (width 0.8636) (layer Cuivre) (net 4))
(segment (start 135.89 115.57) (end 137.16 115.57) (width 0.8636) (layer Cuivre) (net 4))
(segment (start 137.16 115.57) (end 143.49984 115.57) (width 0.8636) (layer Cuivre) (net 4))
(segment (start 143.49984 115.57) (end 143.61668 115.45316) (width 0.8636) (layer Cuivre) (net 4))
(segment (start 159.385 117.475) (end 164.465 117.475) (width 0.8636) (layer Cuivre) (net 5) (status 400))
(segment (start 154.83332 115.4938) (end 157.4038 115.4938) (width 0.8636) (layer Cuivre) (net 5) (status 800))
(segment (start 164.465 117.475) (end 164.465 113.03) (width 0.8636) (layer Cuivre) (net 5) (status C00))
(segment (start 157.4038 115.4938) (end 159.385 117.475) (width 0.8636) (layer Cuivre) (net 5))
(segment (start 149.86 128.905) (end 150.495 129.54) (width 0.8636) (layer Cuivre) (net 6) (status 400))
(segment (start 149.86 111.125) (end 149.86 128.905) (width 0.8636) (layer Cuivre) (net 6))
(segment (start 149.225 110.49) (end 149.86 111.125) (width 0.8636) (layer Cuivre) (net 6))
(segment (start 149.225 107.7722) (end 151.54148 107.7722) (width 0.8636) (layer Cuivre) (net 6) (status 800))
(segment (start 151.54148 107.7722) (end 152.6794 108.91012) (width 0.8636) (layer Cuivre) (net 6) (status 400))
(segment (start 149.225 107.7722) (end 149.225 110.49) (width 0.8636) (layer Cuivre) (net 6) (status 800))
(segment (start 145.7706 129.1844) (end 145.415 129.54) (width 0.8636) (layer Cuivre) (net 7) (status 400))
(segment (start 145.7706 118.41988) (end 145.7706 129.1844) (width 0.8636) (layer Cuivre) (net 7) (status 800))
(segment (start 153.289 131.826) (end 154.94 130.175) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 140.716 131.826) (end 153.289 131.826) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 143.61668 111.8362) (end 141.6812 111.8362) (width 0.8636) (layer Cuivre) (net 8) (status 800))
(segment (start 141.6812 111.8362) (end 137.795 107.95) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 154.94 121.31548) (end 154.94 120.68048) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 154.94 120.68048) (end 152.6794 118.41988) (width 0.8636) (layer Cuivre) (net 8) (status 400))
(segment (start 136.398 121.92) (end 135.509 121.031) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 135.509 121.031) (end 135.509 117.729) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 135.509 117.729) (end 133.985 116.205) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 136.525 121.92) (end 136.398 121.92) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 136.525 121.92) (end 139.065 124.46) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 139.065 124.46) (end 139.065 130.175) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 139.065 130.175) (end 140.335 131.445) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 135.89 107.95) (end 135.255 107.95) (width 0.8636) (layer Cuivre) (net 8) (status 800))
(segment (start 133.985 109.22) (end 133.985 116.205) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 135.255 107.95) (end 133.985 109.22) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 135.89 107.95) (end 137.795 107.95) (width 0.8636) (layer Cuivre) (net 8) (status 800))
(segment (start 140.335 131.445) (end 140.716 131.826) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 154.94 121.31548) (end 154.94 121.31548) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 154.94 130.175) (end 154.94 121.31548) (width 0.8636) (layer Cuivre) (net 8))
(segment (start 154.83332 111.8362) (end 154.83332 111.23168) (width 0.8636) (layer Cuivre) (net 9) (status 800))
(segment (start 159.385 106.68) (end 159.385 99.695) (width 0.8636) (layer Cuivre) (net 9))
(segment (start 154.83332 111.23168) (end 159.385 106.68) (width 0.8636) (layer Cuivre) (net 9))
(segment (start 157.48 97.79) (end 159.385 99.695) (width 0.8636) (layer Cuivre) (net 9))
(segment (start 153.67 97.79) (end 157.48 97.79) (width 0.8636) (layer Cuivre) (net 9) (status 800))
(zone (net 1) (net_name GND) (layer Cuivre) (tstamp 4EED97A2) (hatch edge 0.508)
(connect_pads (clearance 0.635))
+160 -129
View File
@@ -1,129 +1,160 @@
# EESchema Netlist Version 1.1 created 27/8/2008-06:26:11
(
( /48B4F266 VALVE-NOVAL_P U1 ECC81_83 {Lib=ECC81_83}
( 1 N-000001 )
( 2 N-000004 )
( 3 N-000005 )
( 4 N-000007 )
( 5 N-000007 )
( 6 N-000008 )
( 7 N-000001 )
( 8 N-000009 )
( 9 N-000002 )
)
( /456A8ACC $noname P4 CONN_2 {Lib=CONN_2}
( 1 N-000007 )
( 2 N-000002 )
)
( /4549F4BE $noname C1 10uF {Lib=C}
( 1 N-000008 )
( 2 GND )
)
( /4549F4A5 $noname P3 POWER {Lib=CONN_2}
( 1 N-000008 )
( 2 GND )
)
( /4549F46C $noname P2 OUT {Lib=CONN_2}
( 1 N-000006 )
( 2 GND )
)
( /4549F464 $noname P1 IN {Lib=CONN_2}
( 1 GND )
( 2 N-000004 )
)
( /4549F3BE $noname C2 680nF {Lib=C}
( 1 N-000006 )
( 2 N-000009 )
)
( /4549F3AD $noname R3 100K {Lib=R}
( 1 N-000006 )
( 2 GND )
)
( /4549F3A2 $noname R4 47K {Lib=R}
( 1 N-000004 )
( 2 GND )
)
( /4549F39D $noname R2 1.5K {Lib=R}
( 1 N-000005 )
( 2 GND )
)
( /4549F38A $noname R1 1.5K {Lib=R}
( 1 N-000001 )
( 2 N-000009 )
)
)
*
{ Allowed footprints by component:
$component C1
SM*
C?
C1-1
$endlist
$component C2
SM*
C?
C1-1
$endlist
$component R3
R?
SM0603
SM0805
$endlist
$component R4
R?
SM0603
SM0805
$endlist
$component R2
R?
SM0603
SM0805
$endlist
$component R1
R?
SM0603
SM0805
$endlist
$endfootprintlist
}
{ Pin List by Nets
Net 1 ""
R1 1
U1 7
U1 1
Net 2 ""
P4 2
U1 9
Net 3 "GND"
R2 2
R4 2
R3 2
P1 1
P2 2
P3 2
C1 2
Net 4 ""
P1 2
R4 1
U1 2
Net 5 ""
R2 1
U1 3
Net 6 ""
P2 1
R3 1
C2 1
Net 7 ""
P4 1
U1 4
U1 5
Net 8 ""
P3 1
U1 6
C1 1
Net 9 ""
U1 8
C2 2
R1 2
}
#End
(export (version D)
(design
(source F:/kicad-launchpad/testing/demos/ecc83/ecc83-pp.sch)
(date "04/07/2014 20:15:10")
(tool "Eeschema (2014-07-02 BZR 4969)-product"))
(components
(comp (ref U1)
(value ECC83)
(footprint VALVE-NOVAL_P)
(libsource (lib valves) (part ECC83))
(sheetpath (names /) (tstamps /))
(tstamp 48B4F266))
(comp (ref P4)
(value CONN_2)
(libsource (lib conn) (part CONN_2))
(sheetpath (names /) (tstamps /))
(tstamp 456A8ACC))
(comp (ref C1)
(value 10uF)
(libsource (lib device) (part C))
(sheetpath (names /) (tstamps /))
(tstamp 4549F4BE))
(comp (ref P3)
(value POWER)
(libsource (lib conn) (part CONN_2))
(sheetpath (names /) (tstamps /))
(tstamp 4549F4A5))
(comp (ref P2)
(value OUT)
(libsource (lib conn) (part CONN_2))
(sheetpath (names /) (tstamps /))
(tstamp 4549F46C))
(comp (ref P1)
(value IN)
(libsource (lib conn) (part CONN_2))
(sheetpath (names /) (tstamps /))
(tstamp 4549F464))
(comp (ref C2)
(value 680nF)
(libsource (lib device) (part C))
(sheetpath (names /) (tstamps /))
(tstamp 4549F3BE))
(comp (ref R3)
(value 100K)
(libsource (lib device) (part R))
(sheetpath (names /) (tstamps /))
(tstamp 4549F3AD))
(comp (ref R4)
(value 47K)
(libsource (lib device) (part R))
(sheetpath (names /) (tstamps /))
(tstamp 4549F3A2))
(comp (ref R2)
(value 1.5K)
(libsource (lib device) (part R))
(sheetpath (names /) (tstamps /))
(tstamp 4549F39D))
(comp (ref R1)
(value 1.5K)
(libsource (lib device) (part R))
(sheetpath (names /) (tstamps /))
(tstamp 4549F38A)))
(libparts
(libpart (lib device) (part C)
(description "Condensateur non polarise")
(footprints
(fp SM*)
(fp C?)
(fp C1-1))
(fields
(field (name Reference) C)
(field (name Value) C))
(pins
(pin (num 1) (name ~) (type passive))
(pin (num 2) (name ~) (type passive))))
(libpart (lib device) (part R)
(description Resistance)
(footprints
(fp R?)
(fp SM0603)
(fp SM0805)
(fp R?-*)
(fp SM1206))
(fields
(field (name Reference) R)
(field (name Value) R))
(pins
(pin (num 1) (name ~) (type passive))
(pin (num 2) (name ~) (type passive))))
(libpart (lib conn) (part CONN_2)
(description "Symbole general de connecteur")
(fields
(field (name Reference) P)
(field (name Value) CONN_2))
(pins
(pin (num 1) (name P1) (type passive))
(pin (num 2) (name PM) (type passive))))
(libpart (lib valves) (part ECC81)
(aliases
(alias ECC83))
(fields
(field (name Reference) U)
(field (name Value) ECC81)
(field (name Footprint) VALVE-NOVAL_P))
(pins
(pin (num 1) (name A) (type output))
(pin (num 2) (name G) (type input))
(pin (num 3) (name K) (type BiDi))
(pin (num 4) (name F1) (type power_in))
(pin (num 5) (name F1) (type power_in))
(pin (num 6) (name A) (type output))
(pin (num 7) (name G) (type input))
(pin (num 8) (name K) (type BiDi))
(pin (num 9) (name F2) (type power_in)))))
(libraries
(library (logical device)
(uri f:\kicad\share\library\device.lib))
(library (logical conn)
(uri f:\kicad\share\library\conn.lib))
(library (logical valves)
(uri f:\kicad\share\library\valves.lib)))
(nets
(net (code 1) (name "Net-(C1-Pad1)")
(node (ref U1) (pin 6))
(node (ref C1) (pin 1))
(node (ref P3) (pin 1)))
(net (code 2) (name "Net-(R2-Pad1)")
(node (ref R2) (pin 1))
(node (ref U1) (pin 3)))
(net (code 3) (name "Net-(C2-Pad2)")
(node (ref U1) (pin 8))
(node (ref R1) (pin 2))
(node (ref C2) (pin 2)))
(net (code 4) (name "Net-(C2-Pad1)")
(node (ref C2) (pin 1))
(node (ref R3) (pin 1))
(node (ref P2) (pin 1)))
(net (code 5) (name "Net-(P4-Pad2)")
(node (ref U1) (pin 9))
(node (ref P4) (pin 2)))
(net (code 6) (name "Net-(P1-Pad2)")
(node (ref U1) (pin 2))
(node (ref P1) (pin 2))
(node (ref R4) (pin 1)))
(net (code 7) (name "Net-(R1-Pad1)")
(node (ref R1) (pin 1))
(node (ref U1) (pin 1))
(node (ref U1) (pin 7)))
(net (code 8) (name GND)
(node (ref R3) (pin 2))
(node (ref C1) (pin 2))
(node (ref P1) (pin 1))
(node (ref P2) (pin 2))
(node (ref P3) (pin 2))
(node (ref R4) (pin 2))
(node (ref R2) (pin 2)))
(net (code 9) (name "Net-(P4-Pad1)")
(node (ref U1) (pin 4))
(node (ref U1) (pin 5))
(node (ref P4) (pin 1)))))
+137 -67
View File
@@ -1,11 +1,36 @@
EESchema Schematic File Version 2
LIBS:power,device,conn,valves,linear,regul,74xx,cmos4000,adc-dac,memory,xilinx,special,microcontrollers,microchip,analog_switches,motorola,intel,audio,interface,digital-audio,philips,display,cypress,siliconi,contrib,.\ecc83-pp.cache
EELAYER 23 0
LIBS:power
LIBS:device
LIBS:conn
LIBS:valves
LIBS:linear
LIBS:regul
LIBS:74xx
LIBS:cmos4000
LIBS:adc-dac
LIBS:memory
LIBS:xilinx
LIBS:special
LIBS:microcontrollers
LIBS:microchip
LIBS:analog_switches
LIBS:motorola
LIBS:intel
LIBS:audio
LIBS:interface
LIBS:digital-audio
LIBS:philips
LIBS:display
LIBS:cypress
LIBS:siliconi
LIBS:contrib
EELAYER 24 0
EELAYER END
$Descr A4 11700 8267
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title "ECC Push-Pull"
Date "11 dec 2006"
Date "vendredi 04 juillet 2014"
Rev "0.1"
Comp ""
Comment1 ""
@@ -19,32 +44,29 @@ Wire Wire Line
5750 3850 5750 4050
Connection ~ 4450 4500
Wire Wire Line
4450 5400 4450 4450
4450 4450 4450 5400
Wire Wire Line
4450 4450 4650 4450
Wire Wire Line
9850 6350 9950 6350
1800 6650 1900 6650
Wire Wire Line
9950 6350 9950 6150
1900 6650 1900 6450
Wire Wire Line
4150 5300 4150 5000
4150 5000 4150 5300
Wire Wire Line
6950 5150 6950 5000
Wire Wire Line
4150 4800 4450 4800
Connection ~ 4450 4800
Wire Wire Line
6950 4350 6950 4050
Connection ~ 6950 4250
6950 4150 6950 4050
Wire Wire Line
4850 4850 4850 5400
Wire Wire Line
6300 3900 6300 4000
Wire Wire Line
6950 3850 5750 3850
5750 3850 6950 3850
Connection ~ 6700 3850
Wire Wire Line
6700 4250 6950 4250
Wire Wire Line
6150 4450 6150 3900
Connection ~ 6150 3900
@@ -56,17 +78,17 @@ Wire Wire Line
Wire Wire Line
6700 4800 6700 5400
Wire Wire Line
10050 6150 10050 6350
2000 6450 2000 6650
Wire Wire Line
10050 6250 9850 6250
Connection ~ 10050 6250
2000 6550 1800 6550
Connection ~ 2000 6550
Wire Wire Line
4100 5250 4150 5250
Connection ~ 4150 5250
Wire Wire Line
9850 6250 9850 6150
1800 6550 1800 6450
Wire Wire Line
6300 3900 4950 3900
4950 3900 6300 3900
Wire Wire Line
4950 3900 4950 4050
Wire Wire Line
@@ -76,20 +98,22 @@ Wire Wire Line
$Comp
L ECC83 U1
U 3 1 48B4F266
P 9950 5700
F 0 "U1" H 10080 6010 50 0000 C C
F 1 "ECC81_83" H 10300 5400 50 0000 C C
F 2 "VALVE-NOVAL_P" H 10220 5300 50 0001 C C
3 9950 5700
P 1900 6000
F 0 "U1" H 2030 6310 50 0000 C CNN
F 1 "ECC83" H 2250 5700 50 0000 C CNN
F 2 "VALVE-NOVAL_P" H 2170 5600 50 0001 C CNN
F 3 "" H 1900 6000 60 0001 C CNN
3 1900 6000
1 0 0 -1
$EndComp
$Comp
L ECC83 U1
U 2 1 48B4F263
P 4950 4450
F 0 "U1" H 5080 4760 50 0000 C C
F 1 "ECC83" H 5150 4100 50 0000 C C
F 2 "VALVE-NOVAL_P" H 5220 4050 50 0001 C C
F 0 "U1" H 5080 4760 50 0000 C CNN
F 1 "ECC83" H 5150 4100 50 0000 C CNN
F 2 "VALVE-NOVAL_P" H 5220 4050 50 0001 C CNN
F 3 "" H 4950 4450 60 0001 C CNN
2 4950 4450
1 0 0 -1
$EndComp
@@ -97,9 +121,10 @@ $Comp
L ECC83 U1
U 1 1 48B4F256
P 5750 4450
F 0 "U1" H 5880 4760 50 0000 C C
F 1 "ECC83" H 5500 4150 50 0000 C C
F 2 "VALVE-NOVAL_P" H 6020 4050 50 0001 C C
F 0 "U1" H 5880 4760 50 0000 C CNN
F 1 "ECC83" H 5500 4150 50 0000 C CNN
F 2 "VALVE-NOVAL_P" H 6020 4050 50 0001 C CNN
F 3 "" H 5750 4450 60 0001 C CNN
1 5750 4450
-1 0 0 -1
$EndComp
@@ -107,8 +132,10 @@ $Comp
L GND #PWR01
U 1 1 457DBAF8
P 6950 5150
F 0 "#PWR01" H 6950 5150 30 0001 C C
F 1 "GND" H 6950 5080 30 0001 C C
F 0 "#PWR01" H 6950 5150 30 0001 C CNN
F 1 "GND" H 6950 5080 30 0001 C CNN
F 2 "" H 6950 5150 60 0001 C CNN
F 3 "" H 6950 5150 60 0001 C CNN
1 6950 5150
1 0 0 -1
$EndComp
@@ -116,8 +143,10 @@ $Comp
L GND #PWR02
U 1 1 457DBAF5
P 6700 5900
F 0 "#PWR02" H 6700 5900 30 0001 C C
F 1 "GND" H 6700 5830 30 0001 C C
F 0 "#PWR02" H 6700 5900 30 0001 C CNN
F 1 "GND" H 6700 5830 30 0001 C CNN
F 2 "" H 6700 5900 60 0001 C CNN
F 3 "" H 6700 5900 60 0001 C CNN
1 6700 5900
1 0 0 -1
$EndComp
@@ -125,8 +154,10 @@ $Comp
L GND #PWR03
U 1 1 457DBAF1
P 4850 5900
F 0 "#PWR03" H 4850 5900 30 0001 C C
F 1 "GND" H 4850 5830 30 0001 C C
F 0 "#PWR03" H 4850 5900 30 0001 C CNN
F 1 "GND" H 4850 5830 30 0001 C CNN
F 2 "" H 4850 5900 60 0001 C CNN
F 3 "" H 4850 5900 60 0001 C CNN
1 4850 5900
1 0 0 -1
$EndComp
@@ -134,8 +165,10 @@ $Comp
L GND #PWR04
U 1 1 457DBAEF
P 4450 5900
F 0 "#PWR04" H 4450 5900 30 0001 C C
F 1 "GND" H 4450 5830 30 0001 C C
F 0 "#PWR04" H 4450 5900 30 0001 C CNN
F 1 "GND" H 4450 5830 30 0001 C CNN
F 2 "" H 4450 5900 60 0001 C CNN
F 3 "" H 4450 5900 60 0001 C CNN
1 4450 5900
1 0 0 -1
$EndComp
@@ -143,26 +176,32 @@ $Comp
L PWR_FLAG #FLG05
U 1 1 457DBAC0
P 4100 5250
F 0 "#FLG05" H 4100 5520 30 0001 C C
F 1 "PWR_FLAG" H 4100 5480 30 0000 C C
F 0 "#FLG05" H 4100 5520 30 0001 C CNN
F 1 "PWR_FLAG" H 4100 5480 30 0000 C CNN
F 2 "" H 4100 5250 60 0001 C CNN
F 3 "" H 4100 5250 60 0001 C CNN
1 4100 5250
0 -1 -1 0
$EndComp
$Comp
L CONN_2 P4
U 1 1 456A8ACC
P 9950 6700
F 0 "P4" V 9900 6700 40 0000 C C
F 1 "CONN_2" V 10000 6700 40 0000 C C
1 9950 6700
P 1900 7000
F 0 "P4" V 1850 7000 40 0000 C CNN
F 1 "CONN_2" V 1950 7000 40 0000 C CNN
F 2 "" H 1900 7000 60 0001 C CNN
F 3 "" H 1900 7000 60 0001 C CNN
1 1900 7000
0 1 1 0
$EndComp
$Comp
L C C1
U 1 1 4549F4BE
P 6700 4050
F 0 "C1" H 6750 4150 50 0000 L C
F 1 "10uF" H 6450 4150 50 0000 L C
F 0 "C1" H 6750 4150 50 0000 L CNN
F 1 "10uF" H 6450 4150 50 0000 L CNN
F 2 "" H 6700 4050 60 0001 C CNN
F 3 "" H 6700 4050 60 0001 C CNN
1 6700 4050
1 0 0 -1
$EndComp
@@ -170,26 +209,32 @@ $Comp
L GND #PWR06
U 1 1 4549F4B9
P 4150 5300
F 0 "#PWR06" H 4150 5300 30 0001 C C
F 1 "GND" H 4150 5230 30 0001 C C
F 0 "#PWR06" H 4150 5300 30 0001 C CNN
F 1 "GND" H 4150 5230 30 0001 C CNN
F 2 "" H 4150 5300 60 0001 C CNN
F 3 "" H 4150 5300 60 0001 C CNN
1 4150 5300
1 0 0 -1
$EndComp
$Comp
L GND #PWR07
U 1 1 4549F4B3
P 6950 4350
F 0 "#PWR07" H 6950 4350 30 0001 C C
F 1 "GND" H 6950 4280 30 0001 C C
1 6950 4350
P 6950 4150
F 0 "#PWR07" H 6950 4150 30 0001 C CNN
F 1 "GND" H 6950 4080 30 0001 C CNN
F 2 "" H 6950 4150 60 0001 C CNN
F 3 "" H 6950 4150 60 0001 C CNN
1 6950 4150
1 0 0 -1
$EndComp
$Comp
L CONN_2 P3
U 1 1 4549F4A5
P 7300 3950
F 0 "P3" V 7250 3950 40 0000 C C
F 1 "POWER" V 7350 3950 40 0000 C C
F 0 "P3" V 7250 3950 40 0000 C CNN
F 1 "POWER" V 7350 3950 40 0000 C CNN
F 2 "" H 7300 3950 60 0001 C CNN
F 3 "" H 7300 3950 60 0001 C CNN
1 7300 3950
1 0 0 -1
$EndComp
@@ -197,8 +242,10 @@ $Comp
L CONN_2 P2
U 1 1 4549F46C
P 7300 4900
F 0 "P2" V 7250 4900 40 0000 C C
F 1 "OUT" V 7350 4900 40 0000 C C
F 0 "P2" V 7250 4900 40 0000 C CNN
F 1 "OUT" V 7350 4900 40 0000 C CNN
F 2 "" H 7300 4900 60 0001 C CNN
F 3 "" H 7300 4900 60 0001 C CNN
1 7300 4900
1 0 0 -1
$EndComp
@@ -206,8 +253,10 @@ $Comp
L CONN_2 P1
U 1 1 4549F464
P 3800 4900
F 0 "P1" V 3750 4900 40 0000 C C
F 1 "IN" V 3850 4900 40 0000 C C
F 0 "P1" V 3750 4900 40 0000 C CNN
F 1 "IN" V 3850 4900 40 0000 C CNN
F 2 "" H 3800 4900 60 0001 C CNN
F 3 "" H 3800 4900 60 0001 C CNN
1 3800 4900
-1 0 0 1
$EndComp
@@ -215,8 +264,10 @@ $Comp
L C C2
U 1 1 4549F3BE
P 6500 4800
F 0 "C2" H 6550 4900 50 0000 L C
F 1 "680nF" H 6550 4700 50 0000 L C
F 0 "C2" H 6550 4900 50 0000 L CNN
F 1 "680nF" H 6550 4700 50 0000 L CNN
F 2 "" H 6500 4800 60 0001 C CNN
F 3 "" H 6500 4800 60 0001 C CNN
1 6500 4800
0 1 1 0
$EndComp
@@ -224,8 +275,10 @@ $Comp
L R R3
U 1 1 4549F3AD
P 6700 5650
F 0 "R3" V 6780 5650 50 0000 C C
F 1 "100K" V 6700 5650 50 0000 C C
F 0 "R3" V 6780 5650 50 0000 C CNN
F 1 "100K" V 6700 5650 50 0000 C CNN
F 2 "" H 6700 5650 60 0001 C CNN
F 3 "" H 6700 5650 60 0001 C CNN
1 6700 5650
1 0 0 -1
$EndComp
@@ -233,8 +286,10 @@ $Comp
L R R4
U 1 1 4549F3A2
P 4450 5650
F 0 "R4" V 4530 5650 50 0000 C C
F 1 "47K" V 4450 5650 50 0000 C C
F 0 "R4" V 4530 5650 50 0000 C CNN
F 1 "47K" V 4450 5650 50 0000 C CNN
F 2 "" H 4450 5650 60 0001 C CNN
F 3 "" H 4450 5650 60 0001 C CNN
1 4450 5650
1 0 0 -1
$EndComp
@@ -242,8 +297,10 @@ $Comp
L R R2
U 1 1 4549F39D
P 4850 5650
F 0 "R2" V 4930 5650 50 0000 C C
F 1 "1.5K" V 4850 5650 50 0000 C C
F 0 "R2" V 4930 5650 50 0000 C CNN
F 1 "1.5K" V 4850 5650 50 0000 C CNN
F 2 "" H 4850 5650 60 0001 C CNN
F 3 "" H 4850 5650 60 0001 C CNN
1 4850 5650
1 0 0 -1
$EndComp
@@ -251,9 +308,22 @@ $Comp
L R R1
U 1 1 4549F38A
P 6300 4250
F 0 "R1" V 6380 4250 50 0000 C C
F 1 "1.5K" V 6300 4250 50 0000 C C
F 0 "R1" V 6380 4250 50 0000 C CNN
F 1 "1.5K" V 6300 4250 50 0000 C CNN
F 2 "" H 6300 4250 60 0001 C CNN
F 3 "" H 6300 4250 60 0001 C CNN
1 6300 4250
1 0 0 -1
$EndComp
$Comp
L GND #PWR08
U 1 1 53B6F370
P 6700 4250
F 0 "#PWR08" H 6700 4250 30 0001 C CNN
F 1 "GND" H 6700 4180 30 0001 C CNN
F 2 "" H 6700 4250 60 0001 C CNN
F 3 "" H 6700 4250 60 0001 C CNN
1 6700 4250
1 0 0 -1
$EndComp
$EndSCHEMATC
+22 -11
View File
@@ -1,18 +1,21 @@
EESchema-LIBRARY Version 2.3 Date: 30/12/2010 18:27:52
EESchema-LIBRARY Version 2.3
#encoding utf-8
#
# C
#
DEF C C 0 10 N Y 1 F N
F0 "C" 50 100 50 H V L CNN
F1 "C" 50 -100 50 H V L CNN
F0 "C" 0 100 40 H V L CNN
F1 "C" 6 -85 40 H V L CNN
F2 "" 38 -150 30 H V C CNN
F3 "" 0 100 30 H V C CNN
$FPLIST
SM*
C?
C1-1
$ENDFPLIST
DRAW
P 2 0 1 10 -100 -30 100 -30 N
P 2 0 1 10 -100 30 100 30 N
P 2 0 1 20 -80 -30 80 -30 N
P 2 0 1 20 -80 30 80 30 N
X ~ 1 0 200 170 D 40 40 1 1 P
X ~ 2 0 -200 170 U 40 40 1 1 P
ENDDRAW
@@ -23,6 +26,8 @@ ENDDEF
DEF CONN_2 P 0 40 Y N 1 F N
F0 "P" -50 0 40 V V C CNN
F1 "CONN_2" 50 0 40 V V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
S -100 150 100 -150 0 1 0 N
X P1 1 -350 100 250 R 60 60 1 1 P I
@@ -36,6 +41,7 @@ DEF ECC81 U 0 0 Y Y 3 L N
F0 "U" 130 310 50 H V C CNN
F1 "ECC81" 350 -300 50 H V C CNN
F2 "VALVE-NOVAL_P" 270 -400 50 H I C CNN
F3 "" 0 0 60 H V C CNN
ALIAS ECC83
DRAW
P 2 1 0 0 -100 -200 -100 -300 N
@@ -77,6 +83,8 @@ ENDDEF
DEF ~GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 0 30 H I C CNN
F1 "GND" 0 -70 30 H I C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 4 0 1 0 -50 0 0 -50 50 0 -50 0 N
X GND 1 0 0 0 U 30 30 1 1 W N
@@ -86,20 +94,23 @@ ENDDEF
# PWR_FLAG
#
DEF PWR_FLAG #FLG 0 0 N N 1 F P
F0 "#FLG" 0 270 30 H I C CNN
F1 "PWR_FLAG" 0 230 30 H V C CNN
F0 "#FLG" 0 95 30 H I C CNN
F1 "PWR_FLAG" 0 180 30 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
X pwr 1 0 0 0 U 20 20 0 0 w
P 3 0 1 0 0 0 0 100 0 100 N
P 5 0 1 0 0 100 -100 150 0 200 100 150 0 100 N
P 6 0 1 0 0 0 0 50 -75 100 0 150 75 100 0 50 N
ENDDRAW
ENDDEF
#
# R
#
DEF R R 0 0 N Y 1 F N
F0 "R" 80 0 50 V V C CNN
F1 "R" 0 0 50 V V C CNN
F0 "R" 80 0 40 V V C CNN
F1 "R" 7 1 40 V V C CNN
F2 "" -70 0 30 V V C CNN
F3 "" 0 0 30 H V C CNN
$FPLIST
R?
SM0603
+225 -231
View File
@@ -1,12 +1,12 @@
(kicad_pcb (version 3) (host pcbnew "(2014-05-16 BZR 4868)-product")
(kicad_pcb (version 4) (host pcbnew "(2014-07-02 BZR 4969)-product")
(general
(links 20)
(no_connects 0)
(area 118.759514 89.3318 168.465501 133.6802)
(area 119.824499 90.614499 168.465501 132.905501)
(thickness 1.6002)
(drawings 4)
(tracks 63)
(tracks 47)
(zones 0)
(modules 15)
(nets 10)
@@ -14,21 +14,21 @@
(page A4)
(layers
(15 Dessus signal)
(0 Dessous signal)
(16 B.Adhes user)
(17 F.Adhes user)
(18 B.Paste user)
(19 F.Paste user)
(20 B.SilkS user)
(21 F.SilkS user)
(22 B.Mask user)
(23 F.Mask user)
(24 Dwgs.User user)
(25 Cmts.User user)
(26 Eco1.User user)
(27 Eco2.User user)
(28 Edge.Cuts user)
(0 Dessus signal)
(31 Dessous signal)
(32 B.Adhes user)
(33 F.Adhes user)
(34 B.Paste user)
(35 F.Paste user)
(36 B.SilkS user)
(37 F.SilkS user)
(38 B.Mask user)
(39 F.Mask user)
(40 Dwgs.User user)
(41 Cmts.User user)
(42 Eco1.User user)
(43 Eco2.User user)
(44 Edge.Cuts user)
)
(setup
@@ -62,9 +62,9 @@
(pad_drill 1.9304)
(pad_to_mask_clearance 0.254)
(aux_axis_origin 0 0)
(visible_elements FFFFFFBF)
(visible_elements 7FFFF7FF)
(pcbplotparams
(layerselection 3178497)
(layerselection 0x00030_80000001)
(usegerberextensions true)
(excludeedgelayer true)
(linewidth 0.150000)
@@ -80,7 +80,6 @@
(psa4output false)
(plotreference true)
(plotvalue true)
(plotothertext true)
(plotinvisibletext false)
(padsonsilk false)
(subtractmaskfromsilk false)
@@ -93,14 +92,14 @@
(net 0 "")
(net 1 GND)
(net 2 N-000001)
(net 3 N-000002)
(net 4 N-000003)
(net 5 N-000004)
(net 6 N-000005)
(net 7 N-000006)
(net 8 N-000007)
(net 9 N-000008)
(net 2 "Net-(C1-Pad1)")
(net 3 "Net-(C2-Pad1)")
(net 4 "Net-(C2-Pad2)")
(net 5 "Net-(P1-Pad2)")
(net 6 "Net-(P4-Pad1)")
(net 7 "Net-(P4-Pad2)")
(net 8 "Net-(R1-Pad1)")
(net 9 "Net-(R2-Pad1)")
(net_class Default "Ceci est la Netclass par défaut"
(clearance 0.508)
@@ -110,20 +109,22 @@
(uvia_dia 0.508)
(uvia_drill 0.127)
(add_net GND)
(add_net N-000001)
(add_net N-000002)
(add_net N-000003)
(add_net N-000004)
(add_net N-000005)
(add_net N-000006)
(add_net N-000007)
(add_net N-000008)
(add_net "Net-(C1-Pad1)")
(add_net "Net-(C2-Pad1)")
(add_net "Net-(C2-Pad2)")
(add_net "Net-(P1-Pad2)")
(add_net "Net-(P4-Pad1)")
(add_net "Net-(P4-Pad2)")
(add_net "Net-(R1-Pad1)")
(add_net "Net-(R2-Pad1)")
)
(module C2V10 (layer Dessus) (tedit 41854742) (tstamp 4549F4BE)
(at 131.445 99.06 90)
(descr "Condensateur polarise")
(tags CP)
(path /4549F4BE)
(fp_text reference C1 (at 0 2.54 90) (layer F.SilkS)
(effects (font (size 1.27 1.27) (thickness 0.254)))
)
@@ -132,7 +133,7 @@
)
(fp_circle (center 0 0) (end 4.826 -2.794) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole rect (at -2.54 0 90) (size 1.778 1.778) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 7 N-000006))
(net 2 "Net-(C1-Pad1)"))
(pad 2 thru_hole circle (at 2.54 0 90) (size 1.778 1.778) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(model discret/c_vert_c2v10.wrl
@@ -146,6 +147,7 @@
(at 140.97 125.095 270)
(descr "Resitance 3 pas")
(tags R)
(path /4549F38A)
(autoplace_cost180 10)
(fp_text reference R1 (at 0 0 270) (layer F.SilkS)
(effects (font (size 1.397 1.27) (thickness 0.2032)))
@@ -162,9 +164,9 @@
(fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 5 N-000004))
(net 8 "Net-(R1-Pad1)"))
(pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 9 N-000008))
(net 4 "Net-(C2-Pad2)"))
(model discret/resistor.wrl
(at (xyz 0 0 0))
(scale (xyz 0.3 0.3 0.3))
@@ -176,6 +178,7 @@
(at 124.46 118.745 270)
(descr "Resitance 3 pas")
(tags R)
(path /4549F3AD)
(autoplace_cost180 10)
(fp_text reference R3 (at 0 0 270) (layer F.SilkS)
(effects (font (size 1.397 1.27) (thickness 0.2032)))
@@ -192,7 +195,7 @@
(fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 4 N-000003))
(net 3 "Net-(C2-Pad1)"))
(pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(model discret/resistor.wrl
@@ -206,6 +209,7 @@
(at 165.1 120.015 270)
(descr "Resitance 3 pas")
(tags R)
(path /4549F3A2)
(autoplace_cost180 10)
(fp_text reference R4 (at 0 0 270) (layer F.SilkS)
(effects (font (size 1.397 1.27) (thickness 0.2032)))
@@ -222,7 +226,7 @@
(fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 8 N-000007))
(net 5 "Net-(P1-Pad2)"))
(pad 2 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(model discret/resistor.wrl
@@ -236,6 +240,7 @@
(at 165.1 103.505 90)
(descr "Resitance 3 pas")
(tags R)
(path /4549F39D)
(autoplace_cost180 10)
(fp_text reference R2 (at 0 0 90) (layer F.SilkS)
(effects (font (size 1.397 1.27) (thickness 0.2032)))
@@ -252,7 +257,7 @@
(fp_line (start 3.302 1.016) (end 3.302 0) (layer F.SilkS) (width 0.3048))
(fp_line (start -3.302 -0.508) (end -2.794 -1.016) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole circle (at -3.81 0 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 6 N-000005))
(net 9 "Net-(R2-Pad1)"))
(pad 2 thru_hole circle (at 3.81 0 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(model discret/resistor.wrl
@@ -322,6 +327,7 @@
(at 131.445 118.745 270)
(descr "Condensateur polarise")
(tags CP)
(path /4549F3BE)
(fp_text reference C2 (at 1.27 1.27 270) (layer F.SilkS)
(effects (font (thickness 0.3048)))
)
@@ -340,9 +346,9 @@
(fp_line (start -5.08 -2.54) (end -5.08 2.54) (layer F.SilkS) (width 0.3048))
(fp_line (start -6.35 2.54) (end -6.35 -2.54) (layer F.SilkS) (width 0.3048))
(pad 1 thru_hole rect (at -10.16 0 270) (size 1.778 1.778) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 4 N-000003))
(net 3 "Net-(C2-Pad1)"))
(pad 2 thru_hole circle (at 10.16 0 270) (size 1.778 1.778) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)
(net 9 N-000008))
(net 4 "Net-(C2-Pad2)"))
(model discret/c_pol.wrl
(at (xyz 0 0 0))
(scale (xyz 0.8 0.8 0.8))
@@ -351,7 +357,8 @@
)
(module ECC-83-2 (layer Dessus) (tedit 46F8A1CF) (tstamp 454A08DD)
(at 193.675 101.4984)
(at 149.3 109.2)
(path /48B4F266)
(fp_text reference U1 (at 0 -11.43) (layer F.SilkS)
(effects (font (thickness 0.3048)))
)
@@ -360,23 +367,23 @@
)
(fp_circle (center 0 0) (end 10.16 1.27) (layer F.SilkS) (width 0.381))
(pad 1 thru_hole oval (at 3.4544 4.75488 306) (size 2.032 3.048) (drill oval 1.016 2.032) (layers *.Cu *.Mask F.SilkS)
(net 5 N-000004))
(net 8 "Net-(R1-Pad1)"))
(pad 2 thru_hole oval (at 5.60832 1.8288 342) (size 2.032 3.048) (drill oval 1.016 2.032) (layers *.Cu *.Mask F.SilkS)
(net 8 N-000007))
(net 5 "Net-(P1-Pad2)"))
(pad 3 thru_hole oval (at 5.60832 -1.8288 18) (size 2.032 3.048) (drill oval 1.016 2.032) (layers *.Cu *.Mask F.SilkS)
(net 6 N-000005))
(net 9 "Net-(R2-Pad1)"))
(pad 4 thru_hole oval (at 3.4544 -4.75488 54) (size 2.032 3.048) (drill oval 1.016 2.032) (layers *.Cu *.Mask F.SilkS)
(net 2 N-000001))
(net 6 "Net-(P4-Pad1)"))
(pad 5 thru_hole oval (at 0 -5.8928 90) (size 2.032 3.048) (drill oval 1.016 2.032) (layers *.Cu *.Mask F.SilkS)
(net 2 N-000001))
(net 6 "Net-(P4-Pad1)"))
(pad 6 thru_hole oval (at -3.4544 -4.75488 306) (size 2.032 3.048) (drill oval 1.016 2.032) (layers *.Cu *.Mask F.SilkS)
(net 7 N-000006))
(net 2 "Net-(C1-Pad1)"))
(pad 7 thru_hole oval (at -5.60832 -1.8288 342) (size 2.032 3.048) (drill oval 1.016 2.032) (layers *.Cu *.Mask F.SilkS)
(net 5 N-000004))
(net 8 "Net-(R1-Pad1)"))
(pad 8 thru_hole oval (at -5.60832 1.78816 18) (size 2.032 3.048) (drill oval 1.016 2.032) (layers *.Cu *.Mask F.SilkS)
(net 9 N-000008))
(net 4 "Net-(C2-Pad2)"))
(pad 9 thru_hole oval (at -3.4544 4.75488 54) (size 2.032 3.048) (drill oval 1.016 2.032) (layers *.Cu *.Mask F.SilkS)
(net 3 N-000002))
(net 7 "Net-(P4-Pad2)"))
(pad 10 thru_hole circle (at 0 0) (size 4.50088 4.50088) (drill 3.0988) (layers *.Cu *.Mask F.SilkS))
(model valves/ecc83.wrl
(at (xyz 0 0 0))
@@ -389,6 +396,7 @@
(at 149.225 128.905 180)
(descr "Connecteurs 2 pins")
(tags "CONN DEV")
(path /456A8ACC)
(fp_text reference P4 (at 0 -1.905 180) (layer F.SilkS)
(effects (font (size 0.762 0.762) (thickness 0.1524)))
)
@@ -400,9 +408,9 @@
(fp_line (start 2.54 -1.27) (end 2.54 1.27) (layer F.SilkS) (width 0.1524))
(fp_line (start 2.54 1.27) (end -2.54 1.27) (layer F.SilkS) (width 0.1524))
(pad 1 thru_hole rect (at -1.27 0 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 2 N-000001))
(net 6 "Net-(P4-Pad1)"))
(pad 2 thru_hole circle (at 1.27 0 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 3 N-000002))
(net 7 "Net-(P4-Pad2)"))
(model pin_array/pins_array_2x1.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
@@ -414,6 +422,7 @@
(at 123.19 109.855 90)
(descr "Connecteurs 2 pins")
(tags "CONN DEV")
(path /4549F46C)
(fp_text reference P2 (at 0 -1.905 90) (layer F.SilkS)
(effects (font (size 0.762 0.762) (thickness 0.1524)))
)
@@ -425,7 +434,7 @@
(fp_line (start 2.54 -1.27) (end 2.54 1.27) (layer F.SilkS) (width 0.1524))
(fp_line (start 2.54 1.27) (end -2.54 1.27) (layer F.SilkS) (width 0.1524))
(pad 1 thru_hole rect (at -1.27 0 90) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 4 N-000003))
(net 3 "Net-(C2-Pad1)"))
(pad 2 thru_hole circle (at 1.27 0 90) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(model pin_array/pins_array_2x1.wrl
@@ -439,6 +448,7 @@
(at 165.1 111.76 270)
(descr "Connecteurs 2 pins")
(tags "CONN DEV")
(path /4549F464)
(fp_text reference P1 (at 0 -1.905 270) (layer F.SilkS)
(effects (font (size 0.762 0.762) (thickness 0.1524)))
)
@@ -452,7 +462,7 @@
(pad 1 thru_hole rect (at -1.27 0 270) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(pad 2 thru_hole circle (at 1.27 0 270) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 8 N-000007))
(net 5 "Net-(P1-Pad2)"))
(model pin_array/pins_array_2x1.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
@@ -464,6 +474,7 @@
(at 123.19 101.6 90)
(descr "Connecteurs 2 pins")
(tags "CONN DEV")
(path /4549F4A5)
(fp_text reference P3 (at 0 -1.905 90) (layer F.SilkS)
(effects (font (size 0.762 0.762) (thickness 0.1524)))
)
@@ -475,7 +486,7 @@
(fp_line (start 2.54 -1.27) (end 2.54 1.27) (layer F.SilkS) (width 0.1524))
(fp_line (start 2.54 1.27) (end -2.54 1.27) (layer F.SilkS) (width 0.1524))
(pad 1 thru_hole rect (at -1.27 0 90) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 7 N-000006))
(net 2 "Net-(C1-Pad1)"))
(pad 2 thru_hole circle (at 1.27 0 90) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)
(net 1 GND))
(model pin_array/pins_array_2x1.wrl
@@ -490,74 +501,58 @@
(gr_line (start 168.275 90.805) (end 168.275 132.715) (angle 90) (layer Edge.Cuts) (width 0.381))
(gr_line (start 120.015 90.805) (end 120.015 132.715) (angle 90) (layer Edge.Cuts) (width 0.381))
(segment (start 124.46 122.555) (end 121.285 119.38) (width 0.8636) (layer Dessous) (net 1))
(segment (start 121.285 119.38) (end 121.285 118.745) (width 0.8636) (layer Dessous) (net 1))
(segment (start 167.005 101.6) (end 167.005 110.49) (width 0.8636) (layer Dessous) (net 1))
(segment (start 167.005 101.6) (end 165.1 99.695) (width 0.8636) (layer Dessous) (net 1))
(segment (start 165.1 123.825) (end 165.354 123.825) (width 0.8636) (layer Dessous) (net 1))
(segment (start 165.354 123.825) (end 167.005 122.174) (width 0.8636) (layer Dessous) (net 1))
(segment (start 121.285 108.585) (end 123.19 108.585) (width 0.8636) (layer Dessous) (net 1) (status 400))
(segment (start 123.19 100.33) (end 121.285 100.33) (width 0.8636) (layer Dessous) (net 1) (status 800))
(segment (start 167.005 110.49) (end 167.005 122.174) (width 0.8636) (layer Dessous) (net 1))
(segment (start 161.925 96.52) (end 165.1 99.695) (width 0.8636) (layer Dessous) (net 1) (status 400))
(segment (start 131.445 96.52) (end 161.925 96.52) (width 0.8636) (layer Dessous) (net 1) (status 800))
(segment (start 127 96.52) (end 131.445 96.52) (width 0.8636) (layer Dessous) (net 1) (status 400))
(segment (start 123.19 100.33) (end 127 96.52) (width 0.8636) (layer Dessous) (net 1) (status 800))
(segment (start 121.285 100.33) (end 121.285 108.585) (width 0.8636) (layer Dessous) (net 1))
(segment (start 121.285 108.585) (end 121.285 118.745) (width 0.8636) (layer Dessous) (net 1))
(segment (start 165.1 110.49) (end 167.005 110.49) (width 0.8636) (layer Dessous) (net 1) (status 800))
(segment (start 152.6794 110.8456) (end 149.86 113.665) (width 0.8636) (layer Dessous) (net 2))
(segment (start 149.86 115.697) (end 150.495 116.332) (width 0.8636) (layer Dessous) (net 2))
(segment (start 149.86 113.665) (end 149.86 115.697) (width 0.8636) (layer Dessous) (net 2))
(segment (start 149.225 103.3272) (end 151.54148 103.3272) (width 0.8636) (layer Dessous) (net 2))
(segment (start 151.54148 103.3272) (end 152.6794 104.46512) (width 0.8636) (layer Dessous) (net 2) (status 400))
(segment (start 152.6794 104.46512) (end 152.6794 110.8456) (width 0.8636) (layer Dessous) (net 2) (status 800))
(segment (start 150.495 128.905) (end 150.495 116.332) (width 0.8636) (layer Dessous) (net 2) (status 800))
(segment (start 147.955 128.905) (end 147.955 116.15928) (width 0.8636) (layer Dessous) (net 3) (status 800))
(segment (start 147.955 116.15928) (end 145.7706 113.97488) (width 0.8636) (layer Dessous) (net 3) (status 400))
(segment (start 124.46 114.935) (end 123.825 114.935) (width 0.8636) (layer Dessous) (net 4))
(segment (start 123.19 114.3) (end 123.19 111.125) (width 0.8636) (layer Dessous) (net 4))
(segment (start 123.825 114.935) (end 123.19 114.3) (width 0.8636) (layer Dessous) (net 4))
(segment (start 131.445 108.585) (end 128.905 111.125) (width 0.8636) (layer Dessous) (net 4) (status 800))
(segment (start 128.905 111.125) (end 123.19 111.125) (width 0.8636) (layer Dessous) (net 4) (status 400))
(segment (start 153.67 131.445) (end 154.94 130.175) (width 0.8636) (layer Dessous) (net 5))
(segment (start 130.175 131.445) (end 153.67 131.445) (width 0.8636) (layer Dessous) (net 5))
(segment (start 128.905 130.175) (end 130.175 131.445) (width 0.8636) (layer Dessous) (net 5))
(segment (start 128.905 127) (end 128.905 130.175) (width 0.8636) (layer Dessous) (net 5))
(segment (start 154.94 130.175) (end 154.94 116.23548) (width 0.8636) (layer Dessous) (net 5))
(segment (start 154.94 116.23548) (end 152.6794 113.97488) (width 0.8636) (layer Dessous) (net 5) (status 400))
(segment (start 140.97 121.285) (end 140.97 123.825) (width 0.8636) (layer Dessous) (net 5) (status 800))
(segment (start 142.1638 107.3912) (end 140.97 108.585) (width 0.8636) (layer Dessous) (net 5))
(segment (start 140.97 108.585) (end 140.97 121.285) (width 0.8636) (layer Dessous) (net 5) (status 400))
(segment (start 143.61668 107.3912) (end 142.1638 107.3912) (width 0.8636) (layer Dessous) (net 5) (status 800))
(segment (start 130.175 125.73) (end 128.905 127) (width 0.8636) (layer Dessous) (net 5))
(segment (start 139.065 125.73) (end 130.175 125.73) (width 0.8636) (layer Dessous) (net 5))
(segment (start 140.97 123.825) (end 139.065 125.73) (width 0.8636) (layer Dessous) (net 5))
(segment (start 154.83332 107.3912) (end 165.0238 107.3912) (width 0.8636) (layer Dessous) (net 6) (status 800))
(segment (start 165.0238 107.3912) (end 165.1 107.315) (width 0.8636) (layer Dessous) (net 6) (status 400))
(segment (start 190.2206 96.74352) (end 181.84622 96.74352) (width 0.8636) (layer Dessous) (net 7))
(segment (start 125.73 101.6) (end 131.445 101.6) (width 0.8636) (layer Dessous) (net 7) (status 400))
(segment (start 123.19 102.87) (end 124.46 102.87) (width 0.8636) (layer Dessous) (net 7) (status 800))
(segment (start 142.90548 101.6) (end 145.7706 104.46512) (width 0.8636) (layer Dessous) (net 7) (status 400))
(segment (start 131.445 101.6) (end 142.90548 101.6) (width 0.8636) (layer Dessous) (net 7) (status 800))
(segment (start 124.46 102.87) (end 125.73 101.6) (width 0.8636) (layer Dessous) (net 7))
(segment (start 161.925 113.03) (end 165.1 113.03) (width 0.8636) (layer Dessous) (net 8) (status 400))
(segment (start 159.9438 111.0488) (end 161.925 113.03) (width 0.8636) (layer Dessous) (net 8))
(segment (start 165.1 113.03) (end 165.1 116.205) (width 0.8636) (layer Dessous) (net 8) (status C00))
(segment (start 154.83332 111.0488) (end 159.9438 111.0488) (width 0.8636) (layer Dessous) (net 8) (status 800))
(segment (start 142.875 116.205) (end 143.51 116.84) (width 0.8636) (layer Dessous) (net 9))
(segment (start 142.875 112.395) (end 142.875 116.205) (width 0.8636) (layer Dessous) (net 9))
(segment (start 143.61668 111.65332) (end 142.875 112.395) (width 0.8636) (layer Dessous) (net 9))
(segment (start 140.97 128.905) (end 142.24 128.905) (width 0.8636) (layer Dessous) (net 9) (status 800))
(segment (start 142.24 128.905) (end 143.51 127.635) (width 0.8636) (layer Dessous) (net 9))
(segment (start 143.51 127.635) (end 143.51 116.84) (width 0.8636) (layer Dessous) (net 9))
(segment (start 143.61668 111.00816) (end 143.61668 111.65332) (width 0.8636) (layer Dessous) (net 9) (status 800))
(segment (start 131.445 128.905) (end 140.97 128.905) (width 0.8636) (layer Dessous) (net 9) (status C00))
(segment (start 124.46 102.87) (end 125.73 101.6) (width 0.8636) (layer Dessous) (net 2))
(segment (start 131.445 101.6) (end 142.90548 101.6) (width 0.8636) (layer Dessous) (net 2) (status 800))
(segment (start 142.90548 101.6) (end 145.7706 104.46512) (width 0.8636) (layer Dessous) (net 2) (status 400))
(segment (start 123.19 102.87) (end 124.46 102.87) (width 0.8636) (layer Dessous) (net 2) (status 800))
(segment (start 125.73 101.6) (end 131.445 101.6) (width 0.8636) (layer Dessous) (net 2) (status 400))
(segment (start 128.905 111.125) (end 123.19 111.125) (width 0.8636) (layer Dessous) (net 3) (status 400))
(segment (start 131.445 108.585) (end 128.905 111.125) (width 0.8636) (layer Dessous) (net 3) (status 800))
(segment (start 123.825 114.935) (end 123.19 114.3) (width 0.8636) (layer Dessous) (net 3))
(segment (start 123.19 114.3) (end 123.19 111.125) (width 0.8636) (layer Dessous) (net 3))
(segment (start 124.46 114.935) (end 123.825 114.935) (width 0.8636) (layer Dessous) (net 3))
(segment (start 131.445 128.905) (end 140.97 128.905) (width 0.8636) (layer Dessous) (net 4) (status C00))
(segment (start 143.61668 111.00816) (end 143.61668 111.65332) (width 0.8636) (layer Dessous) (net 4) (status 800))
(segment (start 143.51 127.635) (end 143.51 116.84) (width 0.8636) (layer Dessous) (net 4))
(segment (start 142.24 128.905) (end 143.51 127.635) (width 0.8636) (layer Dessous) (net 4))
(segment (start 140.97 128.905) (end 142.24 128.905) (width 0.8636) (layer Dessous) (net 4) (status 800))
(segment (start 143.61668 111.65332) (end 142.875 112.395) (width 0.8636) (layer Dessous) (net 4))
(segment (start 142.875 112.395) (end 142.875 116.205) (width 0.8636) (layer Dessous) (net 4))
(segment (start 142.875 116.205) (end 143.51 116.84) (width 0.8636) (layer Dessous) (net 4))
(segment (start 154.83332 111.0488) (end 159.9438 111.0488) (width 0.8636) (layer Dessous) (net 5) (status 800))
(segment (start 165.1 113.03) (end 165.1 116.205) (width 0.8636) (layer Dessous) (net 5) (status C00))
(segment (start 159.9438 111.0488) (end 161.925 113.03) (width 0.8636) (layer Dessous) (net 5))
(segment (start 161.925 113.03) (end 165.1 113.03) (width 0.8636) (layer Dessous) (net 5) (status 400))
(segment (start 150.495 128.905) (end 150.495 116.332) (width 0.8636) (layer Dessous) (net 6) (status 800))
(segment (start 152.6794 104.46512) (end 152.6794 110.8456) (width 0.8636) (layer Dessous) (net 6) (status 800))
(segment (start 151.54148 103.3272) (end 152.6794 104.46512) (width 0.8636) (layer Dessous) (net 6) (status 400))
(segment (start 149.225 103.3272) (end 151.54148 103.3272) (width 0.8636) (layer Dessous) (net 6))
(segment (start 149.86 113.665) (end 149.86 115.697) (width 0.8636) (layer Dessous) (net 6))
(segment (start 149.86 115.697) (end 150.495 116.332) (width 0.8636) (layer Dessous) (net 6))
(segment (start 152.6794 110.8456) (end 149.86 113.665) (width 0.8636) (layer Dessous) (net 6))
(segment (start 147.955 116.15928) (end 145.7706 113.97488) (width 0.8636) (layer Dessous) (net 7) (status 400))
(segment (start 147.955 128.905) (end 147.955 116.15928) (width 0.8636) (layer Dessous) (net 7) (status 800))
(segment (start 140.97 123.825) (end 139.065 125.73) (width 0.8636) (layer Dessous) (net 8))
(segment (start 139.065 125.73) (end 130.175 125.73) (width 0.8636) (layer Dessous) (net 8))
(segment (start 130.175 125.73) (end 128.905 127) (width 0.8636) (layer Dessous) (net 8))
(segment (start 143.61668 107.3912) (end 142.1638 107.3912) (width 0.8636) (layer Dessous) (net 8) (status 800))
(segment (start 140.97 108.585) (end 140.97 121.285) (width 0.8636) (layer Dessous) (net 8) (status 400))
(segment (start 142.1638 107.3912) (end 140.97 108.585) (width 0.8636) (layer Dessous) (net 8))
(segment (start 140.97 121.285) (end 140.97 123.825) (width 0.8636) (layer Dessous) (net 8) (status 800))
(segment (start 154.94 116.23548) (end 152.6794 113.97488) (width 0.8636) (layer Dessous) (net 8) (status 400))
(segment (start 154.94 130.175) (end 154.94 116.23548) (width 0.8636) (layer Dessous) (net 8))
(segment (start 128.905 127) (end 128.905 130.175) (width 0.8636) (layer Dessous) (net 8))
(segment (start 128.905 130.175) (end 130.175 131.445) (width 0.8636) (layer Dessous) (net 8))
(segment (start 130.175 131.445) (end 153.67 131.445) (width 0.8636) (layer Dessous) (net 8))
(segment (start 153.67 131.445) (end 154.94 130.175) (width 0.8636) (layer Dessous) (net 8))
(segment (start 165.0238 107.3912) (end 165.1 107.315) (width 0.8636) (layer Dessous) (net 9) (status 400))
(segment (start 154.83332 107.3912) (end 165.0238 107.3912) (width 0.8636) (layer Dessous) (net 9) (status 800))
(zone (net 1) (net_name GND) (layer Dessous) (tstamp 4EED96A1) (hatch edge 0.508)
(connect_pads (clearance 0.635))
(min_thickness 0.254)
(fill (arc_segments 16) (thermal_gap 0.254) (thermal_bridge_width 0.50038))
(fill yes (arc_segments 16) (thermal_gap 0.254) (thermal_bridge_width 0.50038))
(polygon
(pts
(xy 167.64 132.08) (xy 167.64 91.44) (xy 120.65 91.44) (xy 120.65 132.08)
@@ -565,115 +560,114 @@
)
(filled_polygon
(pts
(xy 167.3225 127.81026) (xy 166.68496 127.17272) (xy 166.18966 126.96444) (xy 166.18966 123.95962) (xy 166.15664 123.5329)
(xy 166.05504 123.28144) (xy 165.89248 123.20524) (xy 165.71976 123.37796) (xy 165.71976 123.03252) (xy 165.64356 122.86996)
(xy 165.23462 122.73534) (xy 164.8079 122.76836) (xy 164.55644 122.86996) (xy 164.48024 123.03252) (xy 165.1 123.65228)
(xy 165.71976 123.03252) (xy 165.71976 123.37796) (xy 165.27272 123.825) (xy 165.89248 124.44476) (xy 166.05504 124.36856)
(xy 166.18966 123.95962) (xy 166.18966 126.96444) (xy 165.71976 126.76886) (xy 165.71976 124.61748) (xy 165.1 123.99772)
(xy 164.92728 124.17044) (xy 164.92728 123.825) (xy 164.30752 123.20524) (xy 164.14496 123.28144) (xy 164.01034 123.69038)
(xy 164.04336 124.1171) (xy 164.14496 124.36856) (xy 164.30752 124.44476) (xy 164.92728 123.825) (xy 164.92728 124.17044)
(xy 164.48024 124.61748) (xy 164.55644 124.78004) (xy 164.96538 124.91466) (xy 165.3921 124.88164) (xy 165.64356 124.78004)
(xy 165.71976 124.61748) (xy 165.71976 126.76886) (xy 165.6588 126.746) (xy 164.54628 126.746) (xy 163.52012 127.17018)
(xy 162.73272 127.95504) (xy 162.306 128.9812) (xy 162.306 130.09372) (xy 162.73018 131.11988) (xy 163.37026 131.7625)
(xy 155.03906 131.7625) (xy 155.78328 131.01828) (xy 156.04236 130.6322) (xy 156.13126 130.175) (xy 156.1338 130.175)
(xy 156.1338 116.23548) (xy 156.04236 115.77828) (xy 155.78328 115.3922) (xy 155.78328 115.38966) (xy 154.74188 114.3508)
(xy 154.79522 114.26698) (xy 154.90444 113.58118) (xy 154.8384 113.30686) (xy 155.1432 113.284) (xy 155.76296 112.96904)
(xy 156.21254 112.44326) (xy 156.27604 112.2426) (xy 159.45104 112.2426) (xy 161.08172 113.87328) (xy 161.4678 114.13236)
(xy 161.925 114.2238) (xy 163.9062 114.2238) (xy 163.9062 115.33378) (xy 163.86302 115.37696) (xy 163.6395 115.9129)
(xy 163.6395 116.49456) (xy 163.86048 117.0305) (xy 164.27196 117.44198) (xy 164.8079 117.6655) (xy 165.38956 117.6655)
(xy 165.9255 117.44452) (xy 166.33698 117.03304) (xy 166.5605 116.4971) (xy 166.5605 115.91544) (xy 166.33952 115.3795)
(xy 166.2938 115.33378) (xy 166.2938 113.98758) (xy 166.39032 113.89106) (xy 166.62146 113.33226) (xy 166.62146 112.72774)
(xy 166.39032 112.16894) (xy 165.96106 111.73968) (xy 165.6969 111.63046) (xy 165.7858 111.63046) (xy 165.93566 111.63046)
(xy 166.07536 111.57458) (xy 166.18204 111.4679) (xy 166.24046 111.3282) (xy 166.243 110.7059) (xy 166.243 110.2741)
(xy 166.24046 109.6518) (xy 166.18204 109.5121) (xy 166.07536 109.40542) (xy 165.93566 109.34954) (xy 165.7858 109.34954)
(xy 165.3159 109.347) (xy 165.22192 109.44098) (xy 165.22192 110.36808) (xy 166.14902 110.36808) (xy 166.243 110.2741)
(xy 166.243 110.7059) (xy 166.14902 110.61192) (xy 165.34892 110.61192) (xy 165.22192 110.61192) (xy 164.97808 110.61192)
(xy 164.97808 110.36808) (xy 164.97808 109.44098) (xy 164.8841 109.347) (xy 164.4142 109.34954) (xy 164.26434 109.34954)
(xy 164.12464 109.40542) (xy 164.01796 109.5121) (xy 163.95954 109.6518) (xy 163.957 110.2741) (xy 164.05098 110.36808)
(xy 164.97808 110.36808) (xy 164.97808 110.61192) (xy 164.85108 110.61192) (xy 164.05098 110.61192) (xy 163.957 110.7059)
(xy 163.95954 111.3282) (xy 164.01796 111.4679) (xy 164.12464 111.57458) (xy 164.26434 111.63046) (xy 164.4142 111.63046)
(xy 164.50056 111.63046) (xy 164.23894 111.73968) (xy 164.14242 111.8362) (xy 162.41776 111.8362) (xy 160.78708 110.20552)
(xy 160.401 109.94644) (xy 159.9438 109.855) (xy 156.6164 109.855) (xy 156.4005 109.42574) (xy 156.1592 109.22)
(xy 156.4005 109.0168) (xy 156.61894 108.585) (xy 164.3507 108.585) (xy 164.8079 108.7755) (xy 165.38956 108.7755)
(xy 165.9255 108.55452) (xy 166.33698 108.14304) (xy 166.5605 107.6071) (xy 166.5605 107.02544) (xy 166.33952 106.4895)
(xy 166.18966 106.33964) (xy 166.18966 99.82962) (xy 166.15664 99.4029) (xy 166.05504 99.15144) (xy 165.89248 99.07524)
(xy 165.71976 99.24796) (xy 165.71976 98.90252) (xy 165.64356 98.73996) (xy 165.23462 98.60534) (xy 164.8079 98.63836)
(xy 164.55644 98.73996) (xy 164.48024 98.90252) (xy 165.1 99.52228) (xy 165.71976 98.90252) (xy 165.71976 99.24796)
(xy 165.27272 99.695) (xy 165.89248 100.31476) (xy 166.05504 100.23856) (xy 166.18966 99.82962) (xy 166.18966 106.33964)
(xy 165.92804 106.07802) (xy 165.71976 105.98912) (xy 165.71976 100.48748) (xy 165.1 99.86772) (xy 164.92728 100.04044)
(xy 164.92728 99.695) (xy 164.30752 99.07524) (xy 164.14496 99.15144) (xy 164.01034 99.56038) (xy 164.04336 99.9871)
(xy 164.14496 100.23856) (xy 164.30752 100.31476) (xy 164.92728 99.695) (xy 164.92728 100.04044) (xy 164.48024 100.48748)
(xy 164.55644 100.65004) (xy 164.96538 100.78466) (xy 165.3921 100.75164) (xy 165.64356 100.65004) (xy 165.71976 100.48748)
(xy 165.71976 105.98912) (xy 165.3921 105.8545) (xy 164.81044 105.8545) (xy 164.2745 106.07548) (xy 164.15258 106.1974)
(xy 156.27858 106.1974) (xy 156.21508 105.99928) (xy 155.7655 105.47096) (xy 155.14574 105.156) (xy 154.8384 105.1306)
(xy 154.90444 104.86136) (xy 154.79776 104.17556) (xy 154.43454 103.58374) (xy 153.8732 103.1748) (xy 152.97912 102.52456)
(xy 152.30348 102.362) (xy 152.21966 102.37216) (xy 151.99868 102.22484) (xy 151.54148 102.1334) (xy 151.05126 102.1334)
(xy 150.76678 101.84892) (xy 150.12416 101.58222) (xy 149.43074 101.58222) (xy 148.32838 101.58222) (xy 147.68576 101.84638)
(xy 147.19554 102.3366) (xy 147.07616 102.61854) (xy 146.83486 102.47122) (xy 146.14906 102.362) (xy 145.50898 102.5144)
(xy 143.74876 100.75672) (xy 143.36268 100.49764) (xy 142.90548 100.4062) (xy 133.02996 100.4062) (xy 132.97916 100.28174)
(xy 132.7658 100.06838) (xy 132.72262 100.04806) (xy 132.72262 96.70034) (xy 132.69468 96.19742) (xy 132.55752 95.86468)
(xy 132.37464 95.76308) (xy 132.20192 95.9358) (xy 132.20192 95.59036) (xy 132.10032 95.40748) (xy 131.62534 95.24238)
(xy 131.12242 95.27032) (xy 130.78968 95.40748) (xy 130.68808 95.59036) (xy 131.445 96.34728) (xy 132.20192 95.59036)
(xy 132.20192 95.9358) (xy 131.61772 96.52) (xy 132.37464 97.27692) (xy 132.55752 97.17532) (xy 132.72262 96.70034)
(xy 132.72262 100.04806) (xy 132.4864 99.95154) (xy 132.20192 99.95154) (xy 132.20192 97.44964) (xy 131.445 96.69272)
(xy 131.27228 96.86544) (xy 131.27228 96.52) (xy 130.51536 95.76308) (xy 130.33248 95.86468) (xy 130.16738 96.33966)
(xy 130.19532 96.84258) (xy 130.33248 97.17532) (xy 130.51536 97.27692) (xy 131.27228 96.52) (xy 131.27228 96.86544)
(xy 130.68808 97.44964) (xy 130.78968 97.63252) (xy 131.26466 97.79762) (xy 131.76758 97.76968) (xy 132.10032 97.63252)
(xy 132.20192 97.44964) (xy 132.20192 99.95154) (xy 132.18414 99.95154) (xy 130.40614 99.95154) (xy 130.12674 100.06584)
(xy 129.91338 100.2792) (xy 129.86004 100.4062) (xy 125.73 100.4062) (xy 125.2728 100.49764) (xy 124.88672 100.75672)
(xy 124.34316 101.29774) (xy 124.34316 100.47986) (xy 124.31522 100.02774) (xy 124.19838 99.75088) (xy 124.0282 99.66452)
(xy 123.85548 99.83724) (xy 123.85548 99.4918) (xy 123.76912 99.32162) (xy 123.33986 99.17684) (xy 122.88774 99.20478)
(xy 122.61088 99.32162) (xy 122.52452 99.4918) (xy 123.19 100.15728) (xy 123.85548 99.4918) (xy 123.85548 99.83724)
(xy 123.36272 100.33) (xy 124.0282 100.99548) (xy 124.19838 100.90912) (xy 124.34316 100.47986) (xy 124.34316 101.29774)
(xy 124.23648 101.40442) (xy 124.1044 101.34854) (xy 123.80214 101.34854) (xy 123.74372 101.34854) (xy 123.76912 101.33838)
(xy 123.85548 101.1682) (xy 123.19 100.50272) (xy 123.01728 100.67544) (xy 123.01728 100.33) (xy 122.3518 99.66452)
(xy 122.18162 99.75088) (xy 122.03684 100.18014) (xy 122.06478 100.63226) (xy 122.18162 100.90912) (xy 122.3518 100.99548)
(xy 123.01728 100.33) (xy 123.01728 100.67544) (xy 122.52452 101.1682) (xy 122.61088 101.33838) (xy 122.63882 101.34854)
(xy 122.27814 101.34854) (xy 121.99874 101.46284) (xy 121.78538 101.6762) (xy 121.66854 101.9556) (xy 121.66854 102.25786)
(xy 121.66854 103.78186) (xy 121.78284 104.06126) (xy 121.9962 104.27462) (xy 122.2756 104.39146) (xy 122.57786 104.39146)
(xy 124.10186 104.39146) (xy 124.38126 104.27716) (xy 124.59462 104.0638) (xy 124.60478 104.03332) (xy 124.9172 103.97236)
(xy 125.30328 103.71328) (xy 126.22276 102.7938) (xy 129.8575 102.7938) (xy 129.91084 102.91826) (xy 130.1242 103.13162)
(xy 130.4036 103.24846) (xy 130.70586 103.24846) (xy 132.48386 103.24846) (xy 132.76326 103.13416) (xy 132.97662 102.9208)
(xy 133.02742 102.7938) (xy 142.41018 102.7938) (xy 143.70558 104.08666) (xy 143.65478 104.17302) (xy 143.54556 104.85882)
(xy 143.60906 105.1306) (xy 143.3068 105.156) (xy 142.68704 105.47096) (xy 142.23746 105.99674) (xy 142.17142 106.1974)
(xy 142.1638 106.1974) (xy 141.7066 106.28884) (xy 141.31798 106.54792) (xy 140.12672 107.74172) (xy 139.86764 108.1278)
(xy 139.7762 108.585) (xy 139.7762 120.41378) (xy 139.73302 120.45696) (xy 139.5095 120.9929) (xy 139.5095 121.57456)
(xy 139.73048 122.1105) (xy 139.7762 122.15622) (xy 139.7762 123.3297) (xy 138.5697 124.5362) (xy 133.09346 124.5362)
(xy 133.09346 109.6264) (xy 133.09346 109.32414) (xy 133.09346 107.54614) (xy 132.97916 107.26674) (xy 132.7658 107.05338)
(xy 132.4864 106.93654) (xy 132.18414 106.93654) (xy 130.40614 106.93654) (xy 130.12674 107.05084) (xy 129.91338 107.2642)
(xy 129.79654 107.5436) (xy 129.79654 107.84586) (xy 129.79654 108.5469) (xy 128.41224 109.9312) (xy 124.59462 109.9312)
(xy 124.3838 109.72038) (xy 124.34316 109.7026) (xy 124.34316 108.73486) (xy 124.31522 108.28274) (xy 124.19838 108.00588)
(xy 124.0282 107.91952) (xy 123.85548 108.09224) (xy 123.85548 107.7468) (xy 123.76912 107.57662) (xy 123.33986 107.43184)
(xy 122.88774 107.45978) (xy 122.61088 107.57662) (xy 122.52452 107.7468) (xy 123.19 108.41228) (xy 123.85548 107.7468)
(xy 123.85548 108.09224) (xy 123.36272 108.585) (xy 124.0282 109.25048) (xy 124.19838 109.16412) (xy 124.34316 108.73486)
(xy 124.34316 109.7026) (xy 124.1044 109.60354) (xy 123.80214 109.60354) (xy 123.74372 109.60354) (xy 123.76912 109.59338)
(xy 123.85548 109.4232) (xy 123.19 108.75772) (xy 123.01728 108.93044) (xy 123.01728 108.585) (xy 122.3518 107.91952)
(xy 122.18162 108.00588) (xy 122.03684 108.43514) (xy 122.06478 108.88726) (xy 122.18162 109.16412) (xy 122.3518 109.25048)
(xy 123.01728 108.585) (xy 123.01728 108.93044) (xy 122.52452 109.4232) (xy 122.61088 109.59338) (xy 122.63882 109.60354)
(xy 122.27814 109.60354) (xy 121.99874 109.71784) (xy 121.78538 109.9312) (xy 121.66854 110.2106) (xy 121.66854 110.51286)
(xy 121.66854 112.03686) (xy 121.78284 112.31626) (xy 121.9962 112.52962) (xy 121.9962 114.3) (xy 122.08764 114.7572)
(xy 122.34672 115.14328) (xy 122.97918 115.77828) (xy 122.98172 115.77828) (xy 123.3678 116.03736) (xy 123.52782 116.06784)
(xy 123.63196 116.17198) (xy 124.1679 116.3955) (xy 124.74956 116.3955) (xy 125.2855 116.17452) (xy 125.69698 115.76304)
(xy 125.9205 115.2271) (xy 125.9205 114.64544) (xy 125.69952 114.1095) (xy 125.28804 113.69802) (xy 124.7521 113.4745)
(xy 124.3838 113.4745) (xy 124.3838 112.52962) (xy 124.59462 112.3188) (xy 128.905 112.3188) (xy 129.3622 112.22736)
(xy 129.74828 111.96828) (xy 131.4831 110.23346) (xy 132.48386 110.23346) (xy 132.76326 110.11916) (xy 132.97662 109.9058)
(xy 133.09346 109.6264) (xy 133.09346 124.5362) (xy 130.175 124.5362) (xy 129.7178 124.62764) (xy 129.33172 124.88672)
(xy 128.06172 126.15672) (xy 127.80264 126.5428) (xy 127.7112 127) (xy 127.7112 130.175) (xy 127.80264 130.6322)
(xy 128.06172 131.01828) (xy 128.80594 131.7625) (xy 124.9172 131.7625) (xy 125.55728 131.12496) (xy 125.984 130.0988)
(xy 125.984 128.98628) (xy 125.55982 127.96012) (xy 125.54966 127.94742) (xy 125.54966 122.68962) (xy 125.51664 122.2629)
(xy 125.41504 122.01144) (xy 125.25248 121.93524) (xy 125.07976 122.10796) (xy 125.07976 121.76252) (xy 125.00356 121.59996)
(xy 124.59462 121.46534) (xy 124.1679 121.49836) (xy 123.91644 121.59996) (xy 123.84024 121.76252) (xy 124.46 122.38228)
(xy 125.07976 121.76252) (xy 125.07976 122.10796) (xy 124.63272 122.555) (xy 125.25248 123.17476) (xy 125.41504 123.09856)
(xy 125.54966 122.68962) (xy 125.54966 127.94742) (xy 125.07976 127.47752) (xy 125.07976 123.34748) (xy 124.46 122.72772)
(xy 124.28728 122.90044) (xy 124.28728 122.555) (xy 123.66752 121.93524) (xy 123.50496 122.01144) (xy 123.37034 122.42038)
(xy 123.40336 122.8471) (xy 123.50496 123.09856) (xy 123.66752 123.17476) (xy 124.28728 122.555) (xy 124.28728 122.90044)
(xy 123.84024 123.34748) (xy 123.91644 123.51004) (xy 124.32538 123.64466) (xy 124.7521 123.61164) (xy 125.00356 123.51004)
(xy 125.07976 123.34748) (xy 125.07976 127.47752) (xy 124.77496 127.17272) (xy 123.7488 126.746) (xy 122.63628 126.746)
(xy 121.61012 127.17018) (xy 120.9675 127.81026) (xy 120.9675 95.7072) (xy 121.60504 96.34728) (xy 122.6312 96.774)
(xy 123.74372 96.774) (xy 124.76988 96.34982) (xy 125.55728 95.56496) (xy 125.984 94.5388) (xy 125.984 93.42628)
(xy 125.55982 92.40012) (xy 124.9172 91.7575) (xy 163.37026 91.7575) (xy 162.73272 92.39504) (xy 162.306 93.4212)
(xy 162.306 94.53372) (xy 162.73018 95.55988) (xy 163.51504 96.34728) (xy 164.5412 96.774) (xy 165.65372 96.774)
(xy 166.67988 96.34982) (xy 167.3225 95.7072) (xy 167.3225 127.81026)
(xy 167.3225 127.811617) (xy 166.68474 127.172743) (xy 166.192271 126.968252) (xy 166.192271 123.96054) (xy 166.160996 123.532229)
(xy 166.057258 123.281783) (xy 165.892676 123.206541) (xy 165.718459 123.380758) (xy 165.718459 123.032324) (xy 165.643217 122.867742)
(xy 165.23554 122.732729) (xy 164.807229 122.764004) (xy 164.556783 122.867742) (xy 164.481541 123.032324) (xy 165.1 123.650783)
(xy 165.718459 123.032324) (xy 165.718459 123.380758) (xy 165.274217 123.825) (xy 165.892676 124.443459) (xy 166.057258 124.368217)
(xy 166.192271 123.96054) (xy 166.192271 126.968252) (xy 165.718459 126.771508) (xy 165.718459 124.617676) (xy 165.1 123.999217)
(xy 164.925783 124.173434) (xy 164.925783 123.825) (xy 164.307324 123.206541) (xy 164.142742 123.281783) (xy 164.007729 123.68946)
(xy 164.039004 124.117771) (xy 164.142742 124.368217) (xy 164.307324 124.443459) (xy 164.925783 123.825) (xy 164.925783 124.173434)
(xy 164.481541 124.617676) (xy 164.556783 124.782258) (xy 164.96446 124.917271) (xy 165.392771 124.885996) (xy 165.643217 124.782258)
(xy 165.718459 124.617676) (xy 165.718459 126.771508) (xy 165.658199 126.746486) (xy 164.546677 126.745516) (xy 163.519394 127.169981)
(xy 162.732743 127.95526) (xy 162.306486 128.981801) (xy 162.305516 130.093323) (xy 162.729981 131.120606) (xy 163.370755 131.7625)
(xy 155.040788 131.7625) (xy 155.784144 131.019144) (xy 156.042927 130.631848) (xy 156.042927 130.631847) (xy 156.1338 130.175)
(xy 156.1338 116.23548) (xy 156.042927 115.778633) (xy 156.042927 115.778632) (xy 155.784144 115.391336) (xy 154.780713 114.387905)
(xy 154.957722 113.908101) (xy 154.934257 113.3109) (xy 155.544695 113.13874) (xy 156.089502 112.709248) (xy 156.350837 112.2426)
(xy 159.449312 112.2426) (xy 161.080856 113.874144) (xy 161.468153 114.132927) (xy 161.925 114.2238) (xy 163.9062 114.2238)
(xy 163.9062 115.333059) (xy 163.86257 115.376613) (xy 163.639754 115.913214) (xy 163.639247 116.494237) (xy 163.861126 117.031226)
(xy 164.271613 117.44243) (xy 164.808214 117.665246) (xy 165.389237 117.665753) (xy 165.926226 117.443874) (xy 166.33743 117.033387)
(xy 166.560246 116.496786) (xy 166.560753 115.915763) (xy 166.338874 115.378774) (xy 166.2938 115.333621) (xy 166.2938 113.991665)
(xy 166.391231 113.894404) (xy 166.623735 113.334472) (xy 166.624264 112.728188) (xy 166.392738 112.167851) (xy 165.964404 111.738769)
(xy 165.709683 111.633) (xy 165.786214 111.633) (xy 165.937785 111.633) (xy 166.077819 111.574996) (xy 166.184996 111.46782)
(xy 166.243 111.327786) (xy 166.243 110.70844) (xy 166.243 110.27156) (xy 166.243 109.652214) (xy 166.184996 109.51218)
(xy 166.077819 109.405004) (xy 165.937785 109.347) (xy 165.786214 109.347) (xy 165.31844 109.347) (xy 165.22319 109.44225)
(xy 165.22319 110.36681) (xy 166.14775 110.36681) (xy 166.243 110.27156) (xy 166.243 110.70844) (xy 166.14775 110.61319)
(xy 165.22319 110.61319) (xy 165.22319 110.63319) (xy 164.97681 110.63319) (xy 164.97681 110.61319) (xy 164.97681 110.36681)
(xy 164.97681 109.44225) (xy 164.88156 109.347) (xy 164.413786 109.347) (xy 164.262215 109.347) (xy 164.122181 109.405004)
(xy 164.015004 109.51218) (xy 163.957 109.652214) (xy 163.957 110.27156) (xy 164.05225 110.36681) (xy 164.97681 110.36681)
(xy 164.97681 110.61319) (xy 164.05225 110.61319) (xy 163.957 110.70844) (xy 163.957 111.327786) (xy 164.015004 111.46782)
(xy 164.122181 111.574996) (xy 164.262215 111.633) (xy 164.413786 111.633) (xy 164.490184 111.633) (xy 164.237851 111.737262)
(xy 164.13874 111.8362) (xy 162.419488 111.8362) (xy 160.787944 110.204656) (xy 160.400648 109.945873) (xy 159.9438 109.855)
(xy 156.708227 109.855) (xy 156.66335 109.695875) (xy 156.272432 109.2) (xy 156.66335 108.704125) (xy 156.696946 108.585)
(xy 164.35005 108.585) (xy 164.808214 108.775246) (xy 165.389237 108.775753) (xy 165.926226 108.553874) (xy 166.33743 108.143387)
(xy 166.560246 107.606786) (xy 166.560753 107.025763) (xy 166.338874 106.488774) (xy 166.192271 106.341914) (xy 166.192271 99.83054)
(xy 166.160996 99.402229) (xy 166.057258 99.151783) (xy 165.892676 99.076541) (xy 165.718459 99.250758) (xy 165.718459 98.902324)
(xy 165.643217 98.737742) (xy 165.23554 98.602729) (xy 164.807229 98.634004) (xy 164.556783 98.737742) (xy 164.481541 98.902324)
(xy 165.1 99.520783) (xy 165.718459 98.902324) (xy 165.718459 99.250758) (xy 165.274217 99.695) (xy 165.892676 100.313459)
(xy 166.057258 100.238217) (xy 166.192271 99.83054) (xy 166.192271 106.341914) (xy 165.928387 106.07757) (xy 165.718459 105.9904)
(xy 165.718459 100.487676) (xy 165.1 99.869217) (xy 164.925783 100.043434) (xy 164.925783 99.695) (xy 164.307324 99.076541)
(xy 164.142742 99.151783) (xy 164.007729 99.55946) (xy 164.039004 99.987771) (xy 164.142742 100.238217) (xy 164.307324 100.313459)
(xy 164.925783 99.695) (xy 164.925783 100.043434) (xy 164.481541 100.487676) (xy 164.556783 100.652258) (xy 164.96446 100.787271)
(xy 165.392771 100.755996) (xy 165.643217 100.652258) (xy 165.718459 100.487676) (xy 165.718459 105.9904) (xy 165.391786 105.854754)
(xy 164.810763 105.854247) (xy 164.273774 106.076126) (xy 164.152288 106.1974) (xy 156.373238 106.1974) (xy 156.089502 105.690752)
(xy 155.544695 105.26126) (xy 154.934257 105.089099) (xy 154.957722 104.491899) (xy 154.717607 103.841037) (xy 154.246695 103.331607)
(xy 153.352271 102.681769) (xy 152.722255 102.391327) (xy 152.218734 102.371543) (xy 152.218733 102.371543) (xy 151.998328 102.224273)
(xy 151.54148 102.1334) (xy 151.165771 102.1334) (xy 151.110021 102.049964) (xy 150.533196 101.664542) (xy 149.852785 101.5292)
(xy 148.747215 101.5292) (xy 148.066804 101.664542) (xy 147.489979 102.049964) (xy 147.13985 102.573968) (xy 146.570951 102.364091)
(xy 145.877744 102.391328) (xy 145.540546 102.546778) (xy 143.749624 100.755856) (xy 143.362328 100.497073) (xy 142.90548 100.4062)
(xy 133.03253 100.4062) (xy 132.979992 100.279362) (xy 132.765638 100.065008) (xy 132.727151 100.049066) (xy 132.727151 96.701126)
(xy 132.698867 96.196681) (xy 132.560239 95.862003) (xy 132.375891 95.763326) (xy 132.201674 95.937543) (xy 132.201674 95.589109)
(xy 132.102997 95.404761) (xy 131.626126 95.237849) (xy 131.121681 95.266133) (xy 130.787003 95.404761) (xy 130.688326 95.589109)
(xy 131.445 96.345783) (xy 132.201674 95.589109) (xy 132.201674 95.937543) (xy 131.619217 96.52) (xy 132.375891 97.276674)
(xy 132.560239 97.177997) (xy 132.727151 96.701126) (xy 132.727151 100.049066) (xy 132.485571 99.949) (xy 132.201674 99.949)
(xy 132.201674 97.450891) (xy 131.445 96.694217) (xy 131.270783 96.868434) (xy 131.270783 96.52) (xy 130.514109 95.763326)
(xy 130.329761 95.862003) (xy 130.162849 96.338874) (xy 130.191133 96.843319) (xy 130.329761 97.177997) (xy 130.514109 97.276674)
(xy 131.270783 96.52) (xy 131.270783 96.868434) (xy 130.688326 97.450891) (xy 130.787003 97.635239) (xy 131.263874 97.802151)
(xy 131.768319 97.773867) (xy 132.102997 97.635239) (xy 132.201674 97.450891) (xy 132.201674 99.949) (xy 132.182429 99.949)
(xy 130.404429 99.949) (xy 130.124362 100.065008) (xy 129.910008 100.279362) (xy 129.857469 100.4062) (xy 125.73 100.4062)
(xy 125.273152 100.497073) (xy 124.885856 100.755856) (xy 124.345603 101.296108) (xy 124.345603 100.480745) (xy 124.315325 100.02704)
(xy 124.19995 99.7485) (xy 124.028783 99.665433) (xy 123.854567 99.839649) (xy 123.854567 99.491217) (xy 123.7715 99.32005)
(xy 123.340745 99.174397) (xy 122.88704 99.204675) (xy 122.6085 99.32005) (xy 122.525433 99.491217) (xy 123.19 100.155783)
(xy 123.854567 99.491217) (xy 123.854567 99.839649) (xy 123.364217 100.33) (xy 124.028783 100.994567) (xy 124.19995 100.9115)
(xy 124.345603 100.480745) (xy 124.345603 101.296108) (xy 124.239435 101.402276) (xy 124.103571 101.346) (xy 123.800429 101.346)
(xy 123.756894 101.346) (xy 123.7715 101.33995) (xy 123.854567 101.168783) (xy 123.19 100.504217) (xy 123.015783 100.678433)
(xy 123.015783 100.33) (xy 122.351217 99.665433) (xy 122.18005 99.7485) (xy 122.034397 100.179255) (xy 122.064675 100.63296)
(xy 122.18005 100.9115) (xy 122.351217 100.994567) (xy 123.015783 100.33) (xy 123.015783 100.678433) (xy 122.525433 101.168783)
(xy 122.6085 101.33995) (xy 122.626392 101.346) (xy 122.276429 101.346) (xy 121.996362 101.462008) (xy 121.782008 101.676362)
(xy 121.666 101.956429) (xy 121.666 102.259571) (xy 121.666 103.783571) (xy 121.782008 104.063638) (xy 121.996362 104.277992)
(xy 122.276429 104.394) (xy 122.579571 104.394) (xy 124.103571 104.394) (xy 124.383638 104.277992) (xy 124.597992 104.063638)
(xy 124.610309 104.033901) (xy 124.916847 103.972927) (xy 124.916848 103.972927) (xy 125.304144 103.714144) (xy 126.224488 102.7938)
(xy 129.857469 102.7938) (xy 129.910008 102.920638) (xy 130.124362 103.134992) (xy 130.404429 103.251) (xy 130.707571 103.251)
(xy 132.485571 103.251) (xy 132.765638 103.134992) (xy 132.979992 102.920638) (xy 133.03253 102.7938) (xy 142.410992 102.7938)
(xy 143.768082 104.15089) (xy 143.642278 104.4919) (xy 143.665741 105.089099) (xy 143.055305 105.261261) (xy 142.510498 105.690752)
(xy 142.226761 106.1974) (xy 142.1638 106.1974) (xy 141.706952 106.288273) (xy 141.319656 106.547056) (xy 140.125856 107.740856)
(xy 139.867073 108.128152) (xy 139.7762 108.585) (xy 139.7762 120.413059) (xy 139.73257 120.456613) (xy 139.509754 120.993214)
(xy 139.509247 121.574237) (xy 139.731126 122.111226) (xy 139.7762 122.156378) (xy 139.7762 123.330512) (xy 138.570512 124.5362)
(xy 133.096 124.5362) (xy 133.096 109.625571) (xy 133.096 109.322429) (xy 133.096 107.544429) (xy 132.979992 107.264362)
(xy 132.765638 107.050008) (xy 132.485571 106.934) (xy 132.182429 106.934) (xy 130.404429 106.934) (xy 130.124362 107.050008)
(xy 129.910008 107.264362) (xy 129.794 107.544429) (xy 129.794 107.847571) (xy 129.794 108.547712) (xy 128.410512 109.9312)
(xy 124.59783 109.9312) (xy 124.383638 109.717008) (xy 124.345603 109.701253) (xy 124.345603 108.735745) (xy 124.315325 108.28204)
(xy 124.19995 108.0035) (xy 124.028783 107.920433) (xy 123.854567 108.094649) (xy 123.854567 107.746217) (xy 123.7715 107.57505)
(xy 123.340745 107.429397) (xy 122.88704 107.459675) (xy 122.6085 107.57505) (xy 122.525433 107.746217) (xy 123.19 108.410783)
(xy 123.854567 107.746217) (xy 123.854567 108.094649) (xy 123.364217 108.585) (xy 124.028783 109.249567) (xy 124.19995 109.1665)
(xy 124.345603 108.735745) (xy 124.345603 109.701253) (xy 124.103571 109.601) (xy 123.800429 109.601) (xy 123.756894 109.601)
(xy 123.7715 109.59495) (xy 123.854567 109.423783) (xy 123.19 108.759217) (xy 123.015783 108.933433) (xy 123.015783 108.585)
(xy 122.351217 107.920433) (xy 122.18005 108.0035) (xy 122.034397 108.434255) (xy 122.064675 108.88796) (xy 122.18005 109.1665)
(xy 122.351217 109.249567) (xy 123.015783 108.585) (xy 123.015783 108.933433) (xy 122.525433 109.423783) (xy 122.6085 109.59495)
(xy 122.626392 109.601) (xy 122.276429 109.601) (xy 121.996362 109.717008) (xy 121.782008 109.931362) (xy 121.666 110.211429)
(xy 121.666 110.514571) (xy 121.666 112.038571) (xy 121.782008 112.318638) (xy 121.9962 112.53283) (xy 121.9962 114.3)
(xy 122.087073 114.756848) (xy 122.345856 115.144144) (xy 122.980856 115.779144) (xy 123.368153 116.037927) (xy 123.529353 116.069991)
(xy 123.631613 116.17243) (xy 124.168214 116.395246) (xy 124.749237 116.395753) (xy 125.286226 116.173874) (xy 125.69743 115.763387)
(xy 125.920246 115.226786) (xy 125.920753 114.645763) (xy 125.698874 114.108774) (xy 125.288387 113.69757) (xy 124.751786 113.474754)
(xy 124.3838 113.474432) (xy 124.3838 112.53283) (xy 124.59783 112.3188) (xy 128.905 112.3188) (xy 129.361847 112.227927)
(xy 129.361848 112.227927) (xy 129.749144 111.969144) (xy 131.482288 110.236) (xy 132.485571 110.236) (xy 132.765638 110.119992)
(xy 132.979992 109.905638) (xy 133.096 109.625571) (xy 133.096 124.5362) (xy 130.175 124.5362) (xy 129.718152 124.627073)
(xy 129.330856 124.885856) (xy 128.060856 126.155856) (xy 127.802073 126.543152) (xy 127.7112 127) (xy 127.7112 130.175)
(xy 127.802073 130.631848) (xy 128.060856 131.019144) (xy 128.804212 131.7625) (xy 124.918382 131.7625) (xy 125.557257 131.12474)
(xy 125.983514 130.098199) (xy 125.984484 128.986677) (xy 125.560019 127.959394) (xy 125.552271 127.951632) (xy 125.552271 122.69054)
(xy 125.520996 122.262229) (xy 125.417258 122.011783) (xy 125.252676 121.936541) (xy 125.078459 122.110758) (xy 125.078459 121.762324)
(xy 125.003217 121.597742) (xy 124.59554 121.462729) (xy 124.167229 121.494004) (xy 123.916783 121.597742) (xy 123.841541 121.762324)
(xy 124.46 122.380783) (xy 125.078459 121.762324) (xy 125.078459 122.110758) (xy 124.634217 122.555) (xy 125.252676 123.173459)
(xy 125.417258 123.098217) (xy 125.552271 122.69054) (xy 125.552271 127.951632) (xy 125.078459 127.476992) (xy 125.078459 123.347676)
(xy 124.46 122.729217) (xy 124.285783 122.903434) (xy 124.285783 122.555) (xy 123.667324 121.936541) (xy 123.502742 122.011783)
(xy 123.367729 122.41946) (xy 123.399004 122.847771) (xy 123.502742 123.098217) (xy 123.667324 123.173459) (xy 124.285783 122.555)
(xy 124.285783 122.903434) (xy 123.841541 123.347676) (xy 123.916783 123.512258) (xy 124.32446 123.647271) (xy 124.752771 123.615996)
(xy 125.003217 123.512258) (xy 125.078459 123.347676) (xy 125.078459 127.476992) (xy 124.77474 127.172743) (xy 123.748199 126.746486)
(xy 122.636677 126.745516) (xy 121.609394 127.169981) (xy 120.9675 127.810755) (xy 120.9675 95.708382) (xy 121.60526 96.347257)
(xy 122.631801 96.773514) (xy 123.743323 96.774484) (xy 124.770606 96.350019) (xy 125.557257 95.56474) (xy 125.983514 94.538199)
(xy 125.984484 93.426677) (xy 125.560019 92.399394) (xy 124.919244 91.7575) (xy 163.371617 91.7575) (xy 162.732743 92.39526)
(xy 162.306486 93.421801) (xy 162.305516 94.533323) (xy 162.729981 95.560606) (xy 163.51526 96.347257) (xy 164.541801 96.773514)
(xy 165.653323 96.774484) (xy 166.680606 96.350019) (xy 167.3225 95.709244) (xy 167.3225 127.811617)
)
)
)
+20 -64
View File
@@ -1,5 +1,5 @@
update=11/12/2006-20:37:39
last_client=pcbnew
update=04/07/2014 20:10:13
last_client=kicad
[general]
version=1
RootSch=ecc83-pp.sch
@@ -65,65 +65,21 @@ LibName24=siliconi
LibName25=contrib
[pcbnew]
version=1
PadDrlX=760
PadDimH=1100
PadDimV=550
PadForm=1
PadMask=14745599
ViaDiam=450
ViaDril=250
Isol=60
Countlayer=2
Lpiste=340
RouteTo=15
RouteBo=0
TypeVia=3
Segm45=1
Racc45=1
Unite=0
SegFill=1
SegAffG=0
NewAffG=1
PadFill=1
PadAffG=1
PadSNum=1
ModAffC=0
ModAffT=0
PcbAffT=0
SgPcb45=1
TxtPcbV=800
TxtPcbH=600
TxtModV=600
TxtModH=600
TxtModW=120
HPGLnum=1
HPGdiam=15
HPGLSpd=20
HPGLrec=2
HPGLorg=0
GERBmin=15
VEgarde=100
DrawLar=150
EdgeLar=150
TxtLar=120
MSegLar=150
ForPlot=1
WpenSer=10
UserGrX=0,01
UserGrY=0,01
UserGrU=1
DivGrPc=1
TimeOut=600
MaxLnkS=3
ShowRat=0
ShowMRa=1
[pcbnew/libraries]
LibDir=
LibName1=supports
LibName2=valves
LibName3=connect
LibName4=discret
LibName5=pin_array
LibName6=divers
LibName7=libcms
LibName8=display
PageLayoutDescrFile=
LastNetListRead=ecc83-pp_v2.net
UseCmpFile=0
PadDrill=1.9304
PadDrillOvalY=1.9304
PadSizeH=2.794
PadSizeV=1.397
PcbTextSizeV=2.032
PcbTextSizeH=1.524
PcbTextThickness=0.3048
ModuleTextSizeV=1.524
ModuleTextSizeH=1.524
ModuleTextSizeThickness=0.3048
SolderMaskClearance=0.254
SolderMaskMinWidth=0
DrawSegmentWidth=0.381
BoardOutlineThickness=0.381
ModuleOutlineThickness=0.381
+119 -56
View File
@@ -1,8 +1,34 @@
EESchema Schematic File Version 2
LIBS:power,device,valves,conn,linear,regul,74xx,cmos4000,adc-dac,memory,xilinx,special,microcontrollers,microchip,analog_switches,motorola,intel,audio,interface,digital-audio,philips,display,cypress,siliconi,contrib
EELAYER 23 0
LIBS:power
LIBS:device
LIBS:valves
LIBS:conn
LIBS:linear
LIBS:regul
LIBS:74xx
LIBS:cmos4000
LIBS:adc-dac
LIBS:memory
LIBS:xilinx
LIBS:special
LIBS:microcontrollers
LIBS:microchip
LIBS:analog_switches
LIBS:motorola
LIBS:intel
LIBS:audio
LIBS:interface
LIBS:digital-audio
LIBS:philips
LIBS:display
LIBS:cypress
LIBS:siliconi
LIBS:contrib
LIBS:ecc83-pp_v2-cache
EELAYER 24 0
EELAYER END
$Descr A4 11700 8267
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title "ECC Push-Pull"
Date "11 dec 2006"
@@ -23,9 +49,9 @@ Wire Wire Line
Wire Wire Line
4450 4450 4650 4450
Wire Wire Line
9850 6350 9950 6350
1900 6750 2000 6750
Wire Wire Line
9950 6350 9950 6150
2000 6750 2000 6550
Wire Wire Line
4150 5300 4150 5000
Wire Wire Line
@@ -56,15 +82,15 @@ Wire Wire Line
Wire Wire Line
6700 4800 6700 5400
Wire Wire Line
10050 6150 10050 6350
2100 6550 2100 6750
Wire Wire Line
10050 6250 9850 6250
Connection ~ 10050 6250
2100 6650 1900 6650
Connection ~ 2100 6650
Wire Wire Line
4100 5250 4150 5250
Connection ~ 4150 5250
Wire Wire Line
9850 6250 9850 6150
1900 6650 1900 6550
Wire Wire Line
6300 3900 4950 3900
Wire Wire Line
@@ -76,20 +102,22 @@ Wire Wire Line
$Comp
L ECC83 U1
U 3 1 48B4F266
P 9950 5700
F 0 "U1" H 10080 6010 50 0000 C C
F 1 "ECC81_83" H 10300 5400 50 0000 C C
F 2 "VALVE-NOVAL_P" H 10220 5300 50 0001 C C
3 9950 5700
P 2000 6100
F 0 "U1" H 2130 6410 50 0000 C CNN
F 1 "ECC83" H 2350 5800 50 0000 C CNN
F 2 "ECC-83-1" H 2450 5650 50 0000 C CNN
F 3 "" H 2000 6100 60 0001 C CNN
3 2000 6100
1 0 0 -1
$EndComp
$Comp
L ECC83 U1
U 2 1 48B4F263
P 4950 4450
F 0 "U1" H 5080 4760 50 0000 C C
F 1 "ECC83" H 5150 4100 50 0000 C C
F 2 "VALVE-NOVAL_P" H 5220 4050 50 0001 C C
F 0 "U1" H 5080 4760 50 0000 C CNN
F 1 "ECC83" H 5150 4100 50 0000 C CNN
F 2 "ECC-83-1" H 5150 4000 50 0000 C CNN
F 3 "" H 4950 4450 60 0001 C CNN
2 4950 4450
1 0 0 -1
$EndComp
@@ -97,9 +125,10 @@ $Comp
L ECC83 U1
U 1 1 48B4F256
P 5750 4450
F 0 "U1" H 5880 4760 50 0000 C C
F 1 "ECC83" H 5500 4150 50 0000 C C
F 2 "VALVE-NOVAL_P" H 6020 4050 50 0001 C C
F 0 "U1" H 5880 4760 50 0000 C CNN
F 1 "ECC83" H 5500 4150 50 0000 C CNN
F 2 "ECC-83-1" H 5750 3950 50 0000 C CNN
F 3 "" H 5750 4450 60 0001 C CNN
1 5750 4450
-1 0 0 -1
$EndComp
@@ -107,8 +136,10 @@ $Comp
L GND #PWR01
U 1 1 457DBAF8
P 6950 5150
F 0 "#PWR01" H 6950 5150 30 0001 C C
F 1 "GND" H 6950 5080 30 0001 C C
F 0 "#PWR01" H 6950 5150 30 0001 C CNN
F 1 "GND" H 6950 5080 30 0001 C CNN
F 2 "" H 6950 5150 60 0001 C CNN
F 3 "" H 6950 5150 60 0001 C CNN
1 6950 5150
1 0 0 -1
$EndComp
@@ -116,8 +147,10 @@ $Comp
L GND #PWR02
U 1 1 457DBAF5
P 6700 5900
F 0 "#PWR02" H 6700 5900 30 0001 C C
F 1 "GND" H 6700 5830 30 0001 C C
F 0 "#PWR02" H 6700 5900 30 0001 C CNN
F 1 "GND" H 6700 5830 30 0001 C CNN
F 2 "" H 6700 5900 60 0001 C CNN
F 3 "" H 6700 5900 60 0001 C CNN
1 6700 5900
1 0 0 -1
$EndComp
@@ -125,8 +158,10 @@ $Comp
L GND #PWR03
U 1 1 457DBAF1
P 4850 5900
F 0 "#PWR03" H 4850 5900 30 0001 C C
F 1 "GND" H 4850 5830 30 0001 C C
F 0 "#PWR03" H 4850 5900 30 0001 C CNN
F 1 "GND" H 4850 5830 30 0001 C CNN
F 2 "" H 4850 5900 60 0001 C CNN
F 3 "" H 4850 5900 60 0001 C CNN
1 4850 5900
1 0 0 -1
$EndComp
@@ -134,8 +169,10 @@ $Comp
L GND #PWR04
U 1 1 457DBAEF
P 4450 5900
F 0 "#PWR04" H 4450 5900 30 0001 C C
F 1 "GND" H 4450 5830 30 0001 C C
F 0 "#PWR04" H 4450 5900 30 0001 C CNN
F 1 "GND" H 4450 5830 30 0001 C CNN
F 2 "" H 4450 5900 60 0001 C CNN
F 3 "" H 4450 5900 60 0001 C CNN
1 4450 5900
1 0 0 -1
$EndComp
@@ -143,26 +180,32 @@ $Comp
L PWR_FLAG #FLG05
U 1 1 457DBAC0
P 4100 5250
F 0 "#FLG05" H 4100 5520 30 0001 C C
F 1 "PWR_FLAG" H 4100 5480 30 0000 C C
F 0 "#FLG05" H 4100 5520 30 0001 C CNN
F 1 "PWR_FLAG" H 4100 5480 30 0000 C CNN
F 2 "" H 4100 5250 60 0001 C CNN
F 3 "" H 4100 5250 60 0001 C CNN
1 4100 5250
0 -1 -1 0
$EndComp
$Comp
L CONN_2 P4
U 1 1 456A8ACC
P 9950 6700
F 0 "P4" V 9900 6700 40 0000 C C
F 1 "CONN_2" V 10000 6700 40 0000 C C
1 9950 6700
P 2000 7100
F 0 "P4" V 1950 7100 40 0000 C CNN
F 1 "CONN_2" V 2050 7100 40 0000 C CNN
F 2 "BORNIER2" V 2150 7100 60 0000 C CNN
F 3 "" H 2000 7100 60 0001 C CNN
1 2000 7100
0 1 1 0
$EndComp
$Comp
L C C1
U 1 1 4549F4BE
P 6700 4050
F 0 "C1" H 6750 4150 50 0000 L C
F 1 "10uF" H 6450 4150 50 0000 L C
F 0 "C1" H 6750 4150 50 0000 L CNN
F 1 "10uF" H 6450 4150 50 0000 L CNN
F 2 "C2V10" H 6700 4050 60 0000 C CNN
F 3 "" H 6700 4050 60 0001 C CNN
1 6700 4050
1 0 0 -1
$EndComp
@@ -170,8 +213,10 @@ $Comp
L GND #PWR06
U 1 1 4549F4B9
P 4150 5300
F 0 "#PWR06" H 4150 5300 30 0001 C C
F 1 "GND" H 4150 5230 30 0001 C C
F 0 "#PWR06" H 4150 5300 30 0001 C CNN
F 1 "GND" H 4150 5230 30 0001 C CNN
F 2 "" H 4150 5300 60 0001 C CNN
F 3 "" H 4150 5300 60 0001 C CNN
1 4150 5300
1 0 0 -1
$EndComp
@@ -179,8 +224,10 @@ $Comp
L GND #PWR07
U 1 1 4549F4B3
P 6950 4350
F 0 "#PWR07" H 6950 4350 30 0001 C C
F 1 "GND" H 6950 4280 30 0001 C C
F 0 "#PWR07" H 6950 4350 30 0001 C CNN
F 1 "GND" H 6950 4280 30 0001 C CNN
F 2 "" H 6950 4350 60 0001 C CNN
F 3 "" H 6950 4350 60 0001 C CNN
1 6950 4350
1 0 0 -1
$EndComp
@@ -188,8 +235,10 @@ $Comp
L CONN_2 P3
U 1 1 4549F4A5
P 7300 3950
F 0 "P3" V 7250 3950 40 0000 C C
F 1 "POWER" V 7350 3950 40 0000 C C
F 0 "P3" V 7250 3950 40 0000 C CNN
F 1 "POWER" V 7350 3950 40 0000 C CNN
F 2 "BORNIER2" H 7300 4150 60 0000 C CNN
F 3 "" H 7300 3950 60 0001 C CNN
1 7300 3950
1 0 0 -1
$EndComp
@@ -197,8 +246,10 @@ $Comp
L CONN_2 P2
U 1 1 4549F46C
P 7300 4900
F 0 "P2" V 7250 4900 40 0000 C C
F 1 "OUT" V 7350 4900 40 0000 C C
F 0 "P2" V 7250 4900 40 0000 C CNN
F 1 "OUT" V 7350 4900 40 0000 C CNN
F 2 "BORNIER2" H 7300 5100 60 0000 C CNN
F 3 "" H 7300 4900 60 0001 C CNN
1 7300 4900
1 0 0 -1
$EndComp
@@ -206,8 +257,10 @@ $Comp
L CONN_2 P1
U 1 1 4549F464
P 3800 4900
F 0 "P1" V 3750 4900 40 0000 C C
F 1 "IN" V 3850 4900 40 0000 C C
F 0 "P1" V 3750 4900 40 0000 C CNN
F 1 "IN" V 3850 4900 40 0000 C CNN
F 2 "BORNIER2" H 3750 4700 60 0000 C CNN
F 3 "" H 3800 4900 60 0001 C CNN
1 3800 4900
-1 0 0 1
$EndComp
@@ -215,8 +268,10 @@ $Comp
L C C2
U 1 1 4549F3BE
P 6500 4800
F 0 "C2" H 6550 4900 50 0000 L C
F 1 "680nF" H 6550 4700 50 0000 L C
F 0 "C2" H 6550 4900 50 0000 L CNN
F 1 "680nF" H 6550 4700 50 0000 L CNN
F 2 "CP8" H 6400 4900 60 0000 C CNN
F 3 "" H 6500 4800 60 0001 C CNN
1 6500 4800
0 1 1 0
$EndComp
@@ -224,8 +279,10 @@ $Comp
L R R3
U 1 1 4549F3AD
P 6700 5650
F 0 "R3" V 6780 5650 50 0000 C C
F 1 "100K" V 6700 5650 50 0000 C C
F 0 "R3" V 6780 5650 50 0000 C CNN
F 1 "100K" V 6700 5650 50 0000 C CNN
F 2 "R3" H 6700 5650 60 0000 C CNN
F 3 "" H 6700 5650 60 0001 C CNN
1 6700 5650
1 0 0 -1
$EndComp
@@ -233,8 +290,10 @@ $Comp
L R R4
U 1 1 4549F3A2
P 4450 5650
F 0 "R4" V 4530 5650 50 0000 C C
F 1 "47K" V 4450 5650 50 0000 C C
F 0 "R4" V 4530 5650 50 0000 C CNN
F 1 "47K" V 4450 5650 50 0000 C CNN
F 2 "R3" V 4350 5650 60 0000 C CNN
F 3 "" H 4450 5650 60 0001 C CNN
1 4450 5650
1 0 0 -1
$EndComp
@@ -242,8 +301,10 @@ $Comp
L R R2
U 1 1 4549F39D
P 4850 5650
F 0 "R2" V 4930 5650 50 0000 C C
F 1 "1.5K" V 4850 5650 50 0000 C C
F 0 "R2" V 4930 5650 50 0000 C CNN
F 1 "1.5K" V 4850 5650 50 0000 C CNN
F 2 "R3" V 4756 5656 60 0000 C CNN
F 3 "" H 4850 5650 60 0001 C CNN
1 4850 5650
1 0 0 -1
$EndComp
@@ -251,8 +312,10 @@ $Comp
L R R1
U 1 1 4549F38A
P 6300 4250
F 0 "R1" V 6380 4250 50 0000 C C
F 1 "1.5K" V 6300 4250 50 0000 C C
F 0 "R1" V 6380 4250 50 0000 C CNN
F 1 "1.5K" V 6300 4250 50 0000 C CNN
F 2 "R3" H 6400 4150 60 0000 C CNN
F 3 "" H 6300 4250 60 0001 C CNN
1 6300 4250
1 0 0 -1
$EndComp
+54 -22
View File
@@ -1,10 +1,13 @@
EESchema-LIBRARY Version 2.3 Date: 09/02/2010 21:35:02
EESchema-LIBRARY Version 2.3
#encoding utf-8
#
# A_1KVA
#
DEF A_1KVA EA 0 10 N Y 1 F N
F0 "EA" -90 200 40 H V C CNN
F1 "A_1KVA" 0 130 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
C -20 10 31 0 1 0 N
@@ -24,6 +27,8 @@ ENDDEF
DEF C_3x1.5mm2 EC 0 10 N Y 1 F N
F0 "EC" -170 130 40 H V C CNN
F1 "C_3x1.5mm2" 0 -100 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
C -30 50 10 0 1 0 F
@@ -42,6 +47,8 @@ ENDDEF
DEF C_3x2.5mm2 EC 0 10 N Y 1 F N
F0 "EC" -170 130 40 H V C CNN
F1 "C_3x2.5mm2" 0 -100 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
C -30 50 10 0 1 0 F
@@ -60,6 +67,8 @@ ENDDEF
DEF C_3x6mm2 EC 0 10 N Y 1 F N
F0 "EC" -170 130 40 H V C CNN
F1 "C_3x6mm2" 0 -100 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
C -30 50 10 0 1 0 F
@@ -78,6 +87,8 @@ ENDDEF
DEF D_06A ED 0 10 N Y 1 F N
F0 "ED" -160 120 40 H V C CNN
F1 "D_06A" -100 -80 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
P 3 0 1 0 -100 0 60 100 60 100 N
@@ -93,6 +104,8 @@ ENDDEF
DEF D_10A ED 0 10 N Y 1 F N
F0 "ED" -160 120 40 H V C CNN
F1 "D_10A" -100 -80 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
P 3 0 1 0 -100 0 60 100 60 100 N
@@ -108,6 +121,8 @@ ENDDEF
DEF D_16A ED 0 10 N Y 1 F N
F0 "ED" -160 120 40 H V C CNN
F1 "D_16A" -100 -80 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
P 3 0 1 0 -100 0 60 100 60 100 N
@@ -123,6 +138,8 @@ ENDDEF
DEF D_32A ED 0 10 N Y 1 F N
F0 "ED" -160 120 40 H V C CNN
F1 "D_32A" -100 -80 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
P 3 0 1 0 -100 0 60 100 60 100 N
@@ -138,8 +155,10 @@ ENDDEF
DEF G_Th_3KVA EG 0 10 N Y 1 F N
F0 "EG" -160 120 40 H V C CNN
F1 "G_Th_3KVA" 0 -120 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
T 0 0 0 70 0 0 0 G Normal 1 C C
T 0 0 0 70 0 0 0 G Normal 0 C C
P 2 0 0 0 200 -200 200 -200 N
C 0 0 84 0 1 0 N
X ~ 1 200 0 118 L 10 40 1 1 w
@@ -151,6 +170,8 @@ ENDDEF
DEF I_25A_LUM EI 0 10 N Y 1 F N
F0 "EI" -160 120 40 H V C CNN
F1 "I_25A_LUM" 0 -100 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
C 0 0 36 0 1 0 N
@@ -167,8 +188,10 @@ ENDDEF
DEF J_40A_30mA EJ 0 10 N Y 1 F N
F0 "EJ" -210 180 40 H V C CNN
F1 "J_40A_30mA" -20 -120 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
T 0 120 200 20 0 0 0 OFS Normal 1 C C
T 0 120 200 20 0 0 0 OFS Normal 0 C C
P 2 0 0 0 200 -200 200 -200 N
P 5 0 0 0 120 20 120 -20 120 -20 120 -20 120 -20 N
A -120 60 20 1799 1 0 1 0 N -140 60 -100 60
@@ -190,6 +213,8 @@ ENDDEF
DEF O_600VA EO 0 10 N Y 1 F N
F0 "EO" -70 120 40 H V C CNN
F1 "O_600VA" -40 -150 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
C -20 0 31 0 1 0 N
@@ -228,6 +253,8 @@ ENDDEF
DEF O_900VA EO 0 10 N Y 1 F N
F0 "EO" -70 120 40 H V C CNN
F1 "O_900VA" -40 -150 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
C -20 0 31 0 1 0 N
@@ -266,6 +293,8 @@ ENDDEF
DEF P_10A EP 0 10 N Y 1 F N
F0 "EP" -160 120 40 H V C CNN
F1 "P_10A" -80 -140 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
A 0 0 80 891 -891 0 0 0 N 1 80 1 -80
P 2 0 0 0 200 -200 200 -200 N
@@ -278,8 +307,10 @@ ENDDEF
DEF Q_25A_2F2O EQ 0 10 N Y 1 F N
F0 "EQ" -160 120 40 H V C CNN
F1 "Q_25A_2F2O" 0 -140 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
T 0 90 150 20 0 0 0 O+F Normal 1 C C
T 0 90 150 20 0 0 0 O+F Normal 0 C C
S -100 -30 100 -70 0 0 0 N
P 2 0 0 0 200 -200 200 -200 N
P 3 0 0 0 0 60 0 -60 0 -60 N
@@ -302,6 +333,8 @@ ENDDEF
DEF Q_2A_12O_40KV EQ 0 10 N Y 1 F N
F0 "EQ" -160 120 40 H V C CNN
F1 "Q_2A_12O_40KV" 0 -730 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
S -100 -580 100 -620 0 0 0 N
P 2 0 0 0 200 -200 200 -200 N
@@ -353,9 +386,11 @@ ENDDEF
DEF R_16A_30mA ER 0 10 N Y 1 F N
F0 "ER" -210 180 40 H V C CNN
F1 "R_16A_30mA" 0 -200 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
T 0 20 -100 50 0 0 0 M Normal 1 C C
T 0 120 200 20 0 0 0 OF Normal 1 C C
T 0 20 -100 50 0 0 0 M Normal 0 C C
T 0 120 200 20 0 0 0 OF Normal 0 C C
P 2 0 0 0 200 -200 200 -200 N
P 2 0 0 0 400 -200 400 -200 N
P 3 0 0 0 20 -50 20 50 20 50 N
@@ -382,8 +417,10 @@ ENDDEF
DEF S_63A ES 0 10 N Y 1 F N
F0 "ES" -210 180 40 H V C CNN
F1 "S_63A" 0 -110 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
T 0 120 200 20 0 0 0 OFS Normal 1 C C
T 0 120 200 20 0 0 0 OFS Normal 0 C C
P 2 0 0 0 200 -200 200 -200 N
P 2 0 0 0 400 -200 400 -200 N
P 3 0 0 0 -150 0 -100 0 -100 0 N
@@ -408,8 +445,10 @@ ENDDEF
DEF V_A10A EV 0 10 N Y 1 F N
F0 "EV" -160 120 40 H V C CNN
F1 "V_A10A" -60 -140 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
T 0 0 0 70 0 0 0 A Normal 1 C C
T 0 0 0 70 0 0 0 A Normal 0 C C
P 2 0 0 0 200 -200 200 -200 N
C 0 0 84 0 1 0 N
P 3 0 1 0 -100 0 -80 0 -80 0 N
@@ -418,26 +457,15 @@ X ~ 2 200 0 118 L 10 40 1 1 w
ENDDRAW
ENDDEF
#
# V_F50Hz
#
DEF V_F50Hz EV 0 10 N Y 1 F N
F0 "EV" -160 120 40 H V C CNN
F1 "V_F50Hz" -40 -140 40 H V C CNN
DRAW
T 0 0 0 50 0 0 0 Hz Normal 1 C C
P 2 0 0 0 200 -200 200 -200 N
C 0 0 84 0 1 0 N
X ~ 1 200 0 118 L 10 40 1 1 W
ENDDRAW
ENDDEF
#
# V_U400V
#
DEF V_U400V EV 0 10 N Y 1 F N
F0 "EV" -160 120 40 H V C CNN
F1 "V_U400V" -60 -140 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
T 0 0 0 70 0 0 0 V Normal 1 C C
T 0 0 0 70 0 0 0 V Normal 0 C C
P 2 0 0 0 200 -200 200 -200 N
C 0 0 84 0 1 0 N
X ~ 1 200 0 118 L 10 40 1 1 W
@@ -449,6 +477,8 @@ ENDDEF
DEF W_15KA EW 0 10 N Y 1 F N
F0 "EW" -160 120 40 H V C CNN
F1 "W_15KA" -50 -210 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
S -120 60 120 -60 0 1 0 N
@@ -467,6 +497,8 @@ ENDDEF
DEF Y_ELC EY 0 10 N Y 1 F N
F0 "EY" -10 120 40 H V C CNN
F1 "Y_ELC" 60 -120 40 H V C CNN
F2 "" 0 0 60 H V C CNN
F3 "" 0 0 60 H V C CNN
DRAW
P 2 0 0 0 200 -200 200 -200 N
P 3 0 0 0 -50 10 -50 -10 -50 -10 N

Some files were not shown because too many files have changed in this diff Show More