Compare commits

...

112 Commits

Author SHA1 Message Date
Daniel Rojas
7aa2a693e1 Update changelog
Use version from v0.4.1 master branch.
Fix missing link to v0.4.1 (L8) so it's not forgotten.
2024-07-13 14:09:11 +02:00
Daniel Rojas
1da0b0fc56 Continue work on BOM handling (WIP) 2024-04-26 09:38:55 +02:00
Daniel Rojas
cc18c62f3e Remove unnecessary casting of int to float
https://github.com/wireviz/WireViz/pull/251#discussion_r1359000766
2024-04-16 15:18:04 +02:00
Daniel Rojas
9e72905895 Remove duplicate category attribute
Removed from `Connector` class since it is already defined in the `Component` superclass.
2024-04-16 15:01:17 +02:00
Daniel Rojas
4adad9d33a Remove unused && in GitHub workflow 2024-04-16 14:56:58 +02:00
Daniel Rojas
78f2c4a7af Remove unused attribute 2024-04-16 14:52:53 +02:00
Daniel Rojas
3539b2f8fb Move parse_number_and_unit() and NumberAndUnit definition to wv_utils.py 2024-04-16 14:51:28 +02:00
KV
49556bd81e Split out class AdditionalBomItem from AdditionalComponent
https://github.com/wireviz/WireViz/pull/251#discussion_r1359055105

No output changed for any examples/tutorial/tests input.
2023-10-28 03:39:28 +02:00
KV
98e8f7f7ca Rename fill_partnumbers() to __post_init__()
https://github.com/wireviz/WireViz/pull/251#discussion_r1358992408
2023-10-20 23:30:11 +02:00
KV
8cd76eb605 Add PN string in gv_additional_component_table() 2023-10-11 23:31:20 +02:00
KV
4238a8aef5 Avoid wrong function name in warnings 2023-10-10 22:30:38 +02:00
KV
ca7b134e1e Handle also int colors in colon separated string
Bug: 0x112233:0x445566 in YAML input didn't convert such colors
to #112233:#445566 and the strings where just passed as uppercase
to the .gv file. Hence Graphviz printed warnings about unknown
colors and used black as color instead.

Add test for int as string. Re-ordered if statements to give an
exception when a color has an unknown type.
2023-09-16 17:12:45 +02:00
KV
f122278b07 Include "tests" folders in the build tool groups
Allow absent "prefix" in group entries to simplify the code
2023-09-12 19:58:36 +02:00
KV
8e2debb1fa Change BOM output file extension from .bom.tsv to .tsv
Complementary changes to the commit with the same title
earlier in the same PR. Avoid refering to the old filenames.
2023-09-12 19:58:36 +02:00
KV
af338f620c Change version string to comply with PEP440
It seems "-dev" (normalized to ".dev") should only be directly followed
by a number for different deveopment releases of the same version.
See full description: https://peps.python.org/pep-0440/
2023-09-12 19:58:36 +02:00
Daniel Rojas
0b173700fa Apply black 2023-09-12 19:58:35 +02:00
Daniel Rojas
5183fdaee4 Add placeholder for add.comp. PN info 2023-09-12 19:58:35 +02:00
Daniel Rojas
e2e04f725e Thicken additional component table 2023-09-12 19:58:35 +02:00
Daniel Rojas
1e4e63ec27 Implement note for additional components 2023-09-12 19:58:35 +02:00
Daniel Rojas
00d5271f0c Implement additional parameters dict for components 2023-09-12 19:58:35 +02:00
Daniel Rojas
8c1d2773a3 Fix zero-size cell for simple connectors without type 2023-09-12 19:58:35 +02:00
Daniel Rojas
477a3f7706 Update interim version number 2023-09-12 19:58:35 +02:00
Daniel Rojas
310e5968ef Fix PyLance problems 2023-09-12 19:58:35 +02:00
Daniel Rojas
271fb13a07 Add .vscode/ to .gitignore 2023-09-12 19:58:34 +02:00
Daniel Rojas
162fe443d1 Add suggestions from #186 2023-09-12 19:58:34 +02:00
Daniel Rojas
c3b07cf3dd Add suggestions from #246 2023-09-12 19:58:34 +02:00
Daniel Rojas
fc06491b8c Disable CLI BOM output 2023-09-12 19:58:34 +02:00
Daniel Rojas
c7dcac4893 Fix additional component BOM table layout 2023-09-12 19:58:34 +02:00
Daniel Rojas
1f8d8b3f8d Improve conductor table rendering 2023-09-12 19:58:34 +02:00
Daniel Rojas
238bc2585e Implement bundle part number rendering 2023-09-12 19:58:34 +02:00
Daniel Rojas
35f751e05f Add TODOs 2023-09-12 19:58:33 +02:00
Daniel Rojas
8c9a8c1cb3 Add bundles' wires' part number info to BOM 2023-09-12 19:58:33 +02:00
Daniel Rojas
7d49f50984 Fix BOM output in TSV and HTML 2023-09-12 19:58:33 +02:00
Daniel Rojas
af230a4a5c Include part number info in BOM table 2023-09-12 19:58:33 +02:00
Daniel Rojas
3b048ba77f Resume work on BOM 2023-09-12 19:58:33 +02:00
Daniel Rojas
91b02fcf10 Comment out BOM modes (WIP) and BOM bubbles 2023-09-12 19:58:33 +02:00
Daniel Rojas
4b6f791bdc Add TODO for empty connector pin tables 2023-09-12 19:58:33 +02:00
Daniel Rojas
d8a6da373f WIP: BOM modes 2023-09-12 19:58:33 +02:00
Daniel Rojas
b03dfc7030 Add test file for node and title bgcolors 2023-09-12 19:58:32 +02:00
Daniel Rojas
c21f81a2cc Fix node background color rendering 2023-09-12 19:58:32 +02:00
Daniel Rojas
634cdd5265 Fix color cell implementation 2023-09-12 19:58:32 +02:00
Daniel Rojas
1b6030c1a3 Implement multiple colors for components, improve multicolor table rendering 2023-09-12 19:58:32 +02:00
Daniel Rojas
2fc132bdb9 Allow multiple colors for components 2023-09-12 19:58:32 +02:00
Daniel Rojas
2ede4f5a08 Update test files 2023-09-12 19:58:32 +02:00
Daniel Rojas
6d33edd395 Add some test files to tests/ directory 2023-09-12 19:58:32 +02:00
Daniel Rojas
44d5966bf8 Implement pin color output
Small issue: GraphViz warning
```
Warning: table size too small for content
```
2023-09-12 19:58:32 +02:00
Daniel Rojas
6f79064802 Optimize BOM bubble geometry 2023-09-12 19:58:32 +02:00
Daniel Rojas
b4cd8a77f0 Fix line breaks in code 2023-09-12 19:58:31 +02:00
Daniel Rojas
728741e9ff Fix gauge conversion 2023-09-12 19:58:31 +02:00
Daniel Rojas
4a9a4c8d46 Add BOM bubble to additional component list (WIP) 2023-09-12 19:58:31 +02:00
Daniel Rojas
c7537f000a Stop recursive nesting of additional components 2023-09-12 19:58:31 +02:00
Daniel Rojas
b15658b926 Implement BOM bubbles 2023-09-12 19:58:31 +02:00
Daniel Rojas
df1e972b17 Change BOM output file extension from .bom.tsv to .tsv 2023-09-12 19:58:31 +02:00
Daniel Rojas
63046346f4 Rename Options.color_mode to .color_output_mod for consistency 2023-09-12 19:58:31 +02:00
Daniel Rojas
1d99889175 Sort BOM by category, assign BOM IDs 2023-09-12 19:58:31 +02:00
Daniel Rojas
d549c1e460 Add tabulate to dependency list (might remove later if not needed) 2023-09-12 19:58:30 +02:00
Daniel Rojas
c33c64971e Adapt tutorial08.yml (remove unit field) 2023-09-12 19:58:30 +02:00
Daniel Rojas
b787c41225 Add qty test file 2023-09-12 19:58:30 +02:00
Daniel Rojas
b2e5c467c3 Compute qty's of additional components (WIP) 2023-09-12 19:58:30 +02:00
Daniel Rojas
7902ba6aa6 Make pin_objects and wire_objects dictionaries 2023-09-12 19:58:30 +02:00
Daniel Rojas
8b9d997054 Implement BOM population (missing: qty multipliers) 2023-09-12 19:53:49 +02:00
Daniel Rojas
4db8c165ca Clarify wireviz.parse() input types 2023-09-12 19:53:48 +02:00
Daniel Rojas
df06e00ae3 Restructure and update .gitignore 2023-09-12 19:53:48 +02:00
Daniel Rojas
6ba3f66fb3 Add pyan to devtools.txt 2023-09-12 19:44:22 +02:00
Daniel Rojas
fb91be402a Rename modules, adjust imports, move build_examples.py 2023-09-12 19:44:21 +02:00
Daniel Rojas
7111a3375f Deprecate Python 3.7, add Python 3.10 2023-09-12 19:41:23 +02:00
Daniel Rojas
f2bc5d79f2 Define CLI epilog str in single statement 2023-09-12 19:41:23 +02:00
Daniel Rojas
5c4c6d831e Change description to type in additional BOM item YAML 2023-09-12 19:41:23 +02:00
Daniel Rojas
fe016d63ce Prepare harness.populate_bom() 2023-09-12 19:41:23 +02:00
Daniel Rojas
5c18001188 Improve BOM generation (TODO: wires from a bundle) 2023-09-12 19:41:22 +02:00
Daniel Rojas
b60db7902b do not add autogenerated designators to BOM 2023-09-12 19:41:22 +02:00
Daniel Rojas
a4f6c6ad7a Include nested additional components in BOM 2023-09-12 19:41:22 +02:00
Daniel Rojas
8ae4dc37a2 Clean up 2023-09-12 19:41:22 +02:00
Daniel Rojas
36ffa969f4 Improve subclassing of components, prepare for BOM refactoring 2023-09-12 19:41:22 +02:00
Daniel Rojas
ef2b406c78 Remove unused line 2023-09-12 19:41:22 +02:00
Daniel Rojas
842e174bb9 Apply dot tweaks last 2023-09-12 19:41:22 +02:00
Daniel Rojas
96a3a87f9e Make variable name more expressive 2023-09-12 19:41:21 +02:00
Daniel Rojas
cc0bd76e99 Break longer lines not caught by black
because they were unbroken strings or comments
2023-09-12 19:41:21 +02:00
Daniel Rojas
95cc1be647 Make green color darker 2023-09-12 19:37:11 +02:00
Daniel Rojas
22cd25871c Re-sort wv_colors.py 2023-09-12 19:37:11 +02:00
Daniel Rojas
e95f4bd53b Use color objects in WireViz 2023-09-12 19:37:11 +02:00
Daniel Rojas
1b31a6f044 Implement color objects 2023-09-12 19:37:11 +02:00
Daniel Rojas
03518abdcd Add cleanup.sh (maybe move/delete later? or add commit hook?) 2023-09-12 19:37:11 +02:00
Daniel Rojas
8200e891d0 Streamline assignment of ports to simple connectors 2023-09-12 19:37:11 +02:00
Daniel Rojas
94f9d96197 Add sample use to devtools.txt 2023-09-12 19:37:11 +02:00
Daniel Rojas
ebd271d54c Run autoflake -i --remove-all-unused-imports 2023-09-12 19:37:10 +02:00
Daniel Rojas
21bfebb9b4 Run autoflake -i 2023-09-12 19:37:10 +02:00
Daniel Rojas
9b40858d56 Add devtools.txt 2023-09-12 19:37:10 +02:00
Daniel Rojas
fc820079fc Make mates object-oriented 2023-09-12 19:37:10 +02:00
Daniel Rojas
9e6d327c15 Alphabetize HTML tags, improve bgcolor rendering 2023-09-12 19:37:10 +02:00
Daniel Rojas
d9513865e2 Make connecting things more object-oriented 2023-09-12 19:37:10 +02:00
Daniel Rojas
8aaee0c85a Outsource gv_edge_wire() 2023-09-12 19:37:09 +02:00
Daniel Rojas
266eb659bb Reactivate cable edge generation 2023-09-12 19:37:09 +02:00
Daniel Rojas
84dd10a2dc Fix and simplify bgcolor logic 2023-09-12 19:37:09 +02:00
Daniel Rojas
31c5e1aad9 Make setting HTML tag attributes easier through kwargs 2023-09-12 19:37:09 +02:00
Daniel Rojas
587b359fa0 Outsource set_dot_basics() and apply_dot_tweaks() 2023-09-12 19:37:09 +02:00
Daniel Rojas
2f03dcd1a3 Add TODOs 2023-09-12 19:37:09 +02:00
Daniel Rojas
064c7fd7c8 Outsource gv_pin_table(), simplify padding 2023-09-12 19:37:09 +02:00
Daniel Rojas
0078a18953 Remove old stuff, slightly simplify code 2023-09-12 19:37:08 +02:00
Daniel Rojas
d65222953e More WIP 2023-09-12 19:37:08 +02:00
Daniel Rojas
f46bce6867 WIP 2023-09-12 19:37:08 +02:00
Daniel Rojas
1f8dd49eb9 Implement HTML indentation 2023-09-12 19:37:08 +02:00
Daniel Rojas
d348ebe4ce WIP: refactor cable node generation 2023-09-12 19:37:08 +02:00
Daniel Rojas
7134b6841f Generate gauge string inside Cable object 2023-09-12 19:37:08 +02:00
Daniel Rojas
98e594cf96 Rebuild demos 2023-09-12 19:37:08 +02:00
Daniel Rojas
60b2f6caa9 Further refactor connector node generation 2023-09-12 19:37:07 +02:00
Daniel Rojas
046a1c2ea6 Refactor connector node generation 2023-09-12 19:37:07 +02:00
Daniel Rojas
f7359ff9b1 WIP 2023-09-12 19:37:06 +02:00
Daniel Rojas
82b5cb710f Add temporary loop to demo01
for debugging purposes
2023-09-12 19:37:06 +02:00
Daniel Rojas
1435d9c607 Add metadata.title to demo01.yml
to avoid diffs later when calling via CLI
2023-09-12 19:37:06 +02:00
Daniel Rojas
e034fb3519 Rebuild all examples before refactoring
no diff should ocurr as a result of the refactoring
2023-09-12 19:37:06 +02:00
Daniel Rojas
18782444b1 Make prefix for autogenerated component names configurable
`edotor.net` does not seem to like leading underscores, which makes GraphViz debugging difficult.
2023-09-12 19:37:05 +02:00
107 changed files with 10238 additions and 3455 deletions

4
.gitattributes vendored
View File

@ -2,8 +2,8 @@ docs/* linguist-documentation
examples/* linguist-documentation examples/* linguist-documentation
tutorial/* linguist-documentation tutorial/* linguist-documentation
**/*.bom.tsv linguist-generated **/*.tsv linguist-generated
**/*.bom.csv linguist-generated **/*.csv linguist-generated
**/*.gv linguist-generated **/*.gv linguist-generated
**/*.html linguist-generated **/*.html linguist-generated
**/*.png linguist-generated **/*.png linguist-generated

View File

@ -8,7 +8,7 @@ jobs:
strategy: strategy:
max-parallel: 4 max-parallel: 4
matrix: matrix:
python-version: [3.7, 3.8] python-version: ["3.8", "3.10"]
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }} - name: Set up Python ${{ matrix.python-version }}
@ -22,7 +22,7 @@ jobs:
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install . pip install .
- name: Create Examples - name: Create Examples
run: PYTHONPATH=$(pwd)/src:$PYTHONPATH cd src/wireviz/ && python build_examples.py run: PYTHONPATH=$(pwd)/src:$PYTHONPATH python src/wireviz/tools/build_examples.py
- name: Upload examples, demos, and tutorials - name: Upload examples, demos, and tutorials
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v2
with: with:

28
.gitignore vendored
View File

@ -1,15 +1,21 @@
# OS-specific files
.DS_Store .DS_Store
desktop.ini
Thumbs.db
# Development aids
.idea/ .idea/
.eggs .vscode/
__pycache__ temp/
.*.swp
*.egg-info
*.pyc
build
data
dist
venv/ venv/
.venv/ .venv/
desktop.ini
thumbs.db # Build/compile/release artifacts
temp/ build/
dist/
*.egg-info
*.pyc
# Other temporary files
__pycache__
.*.swp

5
cleanup.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/zsh
autoflake -i --remove-all-unused-imports src/wireviz/*.py
isort src/wireviz/*py
black src/wireviz/*.py

12
devtools.txt Normal file
View File

@ -0,0 +1,12 @@
# The following tools have proven useful during development
# Feel free to install while inside the WireViz virtualenv, using:
# pip install -r devtools.txt
# Code formatting
black # black src/wireviz/*.py
isort # isort src/wireviz/*py
# Development aids
pudb # import pudb; pudb.set_trace()
autoflake # autoflake -i --remove-all-unused-imports src/wireviz/*.py
pyan # pyan3 src/wireviz/*.py -uncge --html > temp/pyan.html

View File

@ -1,18 +1,51 @@
# Change Log # Change Log
## [0.4](https://github.com/formatc1702/WireViz/tree/v0.4) (20XX-XX-XX) ## [0.5](https://github.com/wireviz/WireViz/tree/v0.5) (20XX-XX-XX)
TODO
## [0.4.1](https://github.com/wireviz/WireViz/tree/v0.4.1) (2024-07-13)
### Improvements to help reported issues
- Print Python & OS versions when raising unexpected OSError related to #346 & #392 (bugfixes below)
- Explain unexpeced top-level type ([#342](https://github.com/wireviz/WireViz/issues/342), [#383](https://github.com/wireviz/WireViz/pull/383))
- Add non-empty label to reduce over-sized loops ([#286](https://github.com/wireviz/WireViz/issues/286), [#381](https://github.com/wireviz/WireViz/pull/381))
- Improve placeholder name consistency ([#377](https://github.com/wireviz/WireViz/issues/377), [#380](https://github.com/wireviz/WireViz/pull/380))
- Add work-around for Graphviz SVG bug ([#175](https://github.com/wireviz/WireViz/issues/175), [#371](https://github.com/wireviz/WireViz/pull/371))
### Bugfixes
- Avoid ResourceWarning: unclosed file ([#309 (comment)](https://github.com/wireviz/WireViz/pull/309#issuecomment-2170988381), [#395](https://github.com/wireviz/WireViz/pull/395))
- Catch ValueError and OSError(errno=None) ([#318 (review)](https://github.com/wireviz/WireViz/pull/318#pullrequestreview-1457016602), [#391](https://github.com/wireviz/WireViz/issues/391), [#392](https://github.com/wireviz/WireViz/pull/392))
- Add minor missing doc entry ([#186 (comment)](https://github.com/wireviz/WireViz/pull/186#issuecomment-2139037434), [#186 (comment)](https://github.com/wireviz/WireViz/pull/186#issuecomment-2155032522))
- Avoid Graphviz error when hiding all pins ([#257](https://github.com/wireviz/WireViz/issues/257), [#375](https://github.com/wireviz/WireViz/pull/375))
- Avoid decimal point and trailing zero for integer BOM quantities ([#340](https://github.com/wireviz/WireViz/issues/340), [#374](https://github.com/wireviz/WireViz/pull/374))
- Update project URL references ([#316 (comment)](https://github.com/wireviz/WireViz/issues/316#issuecomment-1568748914), [#364](https://github.com/wireviz/WireViz/pull/364))
- Add missing import of embed_svg_images ([#363](https://github.com/wireviz/WireViz/pull/363))
- Use correct default title ([#360](https://github.com/wireviz/WireViz/issues/360), [#361](https://github.com/wireviz/WireViz/pull/361))
- Fix bugs in mate processing ([#355](https://github.com/wireviz/WireViz/issues/355), [#358](https://github.com/wireviz/WireViz/pull/358))
- Include missing files in published package ([#345](https://github.com/wireviz/WireViz/issues/345), [#347](https://github.com/wireviz/WireViz/pull/347))
- Catch OSError(errno=EINVAL) ([#344](https://github.com/wireviz/WireViz/issues/344), [#346](https://github.com/wireviz/WireViz/pull/346))
## [0.4](https://github.com/wireviz/WireViz/tree/v0.4) (2024-05-12)
### Backward-incompatible changes ### Backward-incompatible changes
- New syntax for autogenerated components ([#184](https://github.com/wireviz/WireViz/issues/184), [#186](https://github.com/wireviz/WireViz/pull/186)) - New syntax for autogenerated components ([#184](https://github.com/wireviz/WireViz/issues/184), [#186](https://github.com/wireviz/WireViz/pull/186))
- New command line interface ([#244](https://github.com/wireviz/WireViz/pull/244)) - Components that are not referenced in any connection set will not be rendered. Instead, a warning will be output in the console. ([#328](https://github.com/wireviz/WireViz/issues/328), [#332](https://github.com/wireviz/WireViz/pull/332))
- New command line interface ([#244](https://github.com/wireviz/WireViz/pull/244)). Run `wireviz --help` for details
- The path specified with the `-o`/`--output-dir` option no longer includes the filename (without extension) of the generated files. Use the `-O`/`--output-name` option to specify a different filename for the generated files.
- The `.gv` file is no longer included as a default output format (only as an intermediate file during processing) unless specified with the new `-f` option described below.
### New features ### New features
- Allow mates between connectors ([#134](https://github.com/wireviz/WireViz/issues/134), [#186](https://github.com/wireviz/WireViz/pull/186)) - Allow mates between connectors ([#134](https://github.com/wireviz/WireViz/issues/134), [#186](https://github.com/wireviz/WireViz/pull/186))
- Improve technical drawing output ([#74](https://github.com/wireviz/WireViz/pull/74), [#32](https://github.com/wireviz/WireViz/issues/32), [#239](https://github.com/wireviz/WireViz/pull/239)) - Improve technical drawing output ([#74](https://github.com/wireviz/WireViz/pull/74), [#32](https://github.com/wireviz/WireViz/issues/32), [#239](https://github.com/wireviz/WireViz/pull/239))
- Embed images in SVG output ([#189](https://github.com/wireviz/WireViz/pull/189)) - Embed images in SVG output ([#189](https://github.com/wireviz/WireViz/pull/189))
- Add ability to choose output formats using the `-f`/`--format` command line option ([#60](https://github.com/wireviz/WireViz/issues/60))
- Add option to multiply additional component quantity by number of unpopulated positions on connector ([#298](https://github.com/wireviz/WireViz/pull/298))
### Misc. fixes ### Misc. fixes
- Use `isort` and `black` for cleaner code and easier merging ([#248](https://github.com/wireviz/WireViz/pull/248)) - Use `isort` and `black` for cleaner code and easier merging ([#248](https://github.com/wireviz/WireViz/pull/248))
@ -21,93 +54,89 @@
- Minor adjustments ([#256](https://github.com/wireviz/WireViz/pull/256)) - Minor adjustments ([#256](https://github.com/wireviz/WireViz/pull/256))
## [0.3.2](https://github.com/formatc1702/WireViz/tree/v0.3.2) (2021-11-27) ## [0.3.2](https://github.com/wireviz/WireViz/tree/v0.3.2) (2021-11-27)
### Hotfix ### Hotfix
- Adjust GraphViz generation code for compatibility with v0.18 of the `graphviz` Python package ([#258](https://github.com/formatc1702/WireViz/issues/258), [#261](https://github.com/formatc1702/WireViz/pull/261)) - Adjust GraphViz generation code for compatibility with v0.18 of the `graphviz` Python package ([#258](https://github.com/wireviz/WireViz/issues/258), [#261](https://github.com/wireviz/WireViz/pull/261))
## [0.3.1](https://github.com/formatc1702/WireViz/tree/v0.3.1) (2021-10-25) ## [0.3.1](https://github.com/wireviz/WireViz/tree/v0.3.1) (2021-10-25)
### Hotfix ### Hotfix
- Assign generic harness title when using WireViz as a module and not specifying an output file name ([#253](https://github.com/formatc1702/WireViz/issues/253), [#254](https://github.com/formatc1702/WireViz/pull/254)) - Assign generic harness title when using WireViz as a module and not specifying an output file name ([#253](https://github.com/wireviz/WireViz/issues/253), [#254](https://github.com/wireviz/WireViz/pull/254))
## [0.3](https://github.com/formatc1702/WireViz/tree/v0.3) (2021-10-11) ## [0.3](https://github.com/wireviz/WireViz/tree/v0.3) (2021-10-11)
### New features ### New features
- Allow referencing a cable's/bundle's wires by color or by label ([#70](https://github.com/formatc1702/WireViz/issues/70), [#169](https://github.com/formatc1702/WireViz/issues/169), [#193](https://github.com/formatc1702/WireViz/issues/193), [#194](https://github.com/formatc1702/WireViz/pull/194)) - Allow referencing a cable's/bundle's wires by color or by label ([#70](https://github.com/wireviz/WireViz/issues/70), [#169](https://github.com/wireviz/WireViz/issues/169), [#193](https://github.com/wireviz/WireViz/issues/193), [#194](https://github.com/wireviz/WireViz/pull/194))
- Allow additional BOM items within components ([#50](https://github.com/formatc1702/WireViz/issues/50), [#115](https://github.com/formatc1702/WireViz/pull/115)) - Allow additional BOM items within components ([#50](https://github.com/wireviz/WireViz/issues/50), [#115](https://github.com/wireviz/WireViz/pull/115))
- Add support for length units in cables and wires ([#7](https://github.com/formatc1702/WireViz/issues/7), [#196](https://github.com/formatc1702/WireViz/pull/196) (with work from [#161](https://github.com/formatc1702/WireViz/pull/161), [#162](https://github.com/formatc1702/WireViz/pull/162), [#171](https://github.com/formatc1702/WireViz/pull/171)), [#198](https://github.com/formatc1702/WireViz/pull/198), [#205](https://github.com/formatc1702/WireViz/issues/205). [#206](https://github.com/formatc1702/WireViz/pull/206)) - Add support for length units in cables and wires ([#7](https://github.com/wireviz/WireViz/issues/7), [#196](https://github.com/wireviz/WireViz/pull/196) (with work from [#161](https://github.com/wireviz/WireViz/pull/161), [#162](https://github.com/wireviz/WireViz/pull/162), [#171](https://github.com/wireviz/WireViz/pull/171)), [#198](https://github.com/wireviz/WireViz/pull/198), [#205](https://github.com/wireviz/WireViz/issues/205). [#206](https://github.com/wireviz/WireViz/pull/206))
- Add option to define connector pin colors ([#53](https://github.com/formatc1702/WireViz/issues/53), [#141](https://github.com/formatc1702/WireViz/pull/141)) - Add option to define connector pin colors ([#53](https://github.com/wireviz/WireViz/issues/53), [#141](https://github.com/wireviz/WireViz/pull/141))
- Remove HTML links from the input attributes ([#164](https://github.com/formatc1702/WireViz/pull/164)) - Remove HTML links from the input attributes ([#164](https://github.com/wireviz/WireViz/pull/164))
- Add harness metadata section ([#158](https://github.com/formatc1702/WireViz/issues/158), [#214](https://github.com/formatc1702/WireViz/pull/214)) - Add harness metadata section ([#158](https://github.com/wireviz/WireViz/issues/158), [#214](https://github.com/wireviz/WireViz/pull/214))
- Add support for supplier and supplier part number information ([#240](https://github.com/formatc1702/WireViz/issues/240), [#241](https://github.com/formatc1702/WireViz/pull/241/)) - Add support for supplier and supplier part number information ([#240](https://github.com/wireviz/WireViz/issues/240), [#241](https://github.com/wireviz/WireViz/pull/241/))
- Add graph rendering options (colors, font, color name display style, ...) ([#158](https://github.com/formatc1702/WireViz/issues/158), [#214](https://github.com/formatc1702/WireViz/pull/214)) - Add graph rendering options (background colors, fontname, color name display style, ...) ([#158](https://github.com/wireviz/WireViz/issues/158), [#214](https://github.com/wireviz/WireViz/pull/214))
- Add support for supplier and supplier part number information ([#240](https://github.com/formatc1702/WireViz/issues/240), [#241](https://github.com/formatc1702/WireViz/pull/241/)) - Add support for background colors for cables and connectors, as well as for some individual cells ([#210](https://github.com/wireviz/WireViz/issues/210), [#219](https://github.com/wireviz/WireViz/pull/219))
- Add graph rendering options (colors, font, color name display style, ...) ([#158](https://github.com/formatc1702/WireViz/issues/158), [#214](https://github.com/formatc1702/WireViz/pull/214)) - Add optional tweaking of the .gv output ([#215](https://github.com/wireviz/WireViz/pull/215)) (experimental)
- Add support for background colors for cables and connectors, as well as for some individual cells ([#210](https://github.com/formatc1702/WireViz/issues/210), [#219](https://github.com/formatc1702/WireViz/pull/219))
- Add optional tweaking of the .gv output ([#215](https://github.com/formatc1702/WireViz/pull/215)) (experimental)
### Misc. fixes ### Misc. fixes
- Remove case-sensitivity issues with pin names and labels ([#160](https://github.com/formatc1702/WireViz/issues/160), [#229](https://github.com/formatc1702/WireViz/pull/229)) - Remove case-sensitivity issues with pin names and labels ([#160](https://github.com/wireviz/WireViz/issues/160), [#229](https://github.com/wireviz/WireViz/pull/229))
- Improve type hinting ([#156](https://github.com/formatc1702/WireViz/issues/156), [#163](https://github.com/formatc1702/WireViz/pull/163)) - Improve type hinting ([#156](https://github.com/wireviz/WireViz/issues/156), [#163](https://github.com/wireviz/WireViz/pull/163))
- Move BOM management and HTML functions to separate modules ([#151](https://github.com/formatc1702/WireViz/issues/151), [#192](https://github.com/formatc1702/WireViz/pull/192)) - Move BOM management and HTML functions to separate modules ([#151](https://github.com/wireviz/WireViz/issues/151), [#192](https://github.com/wireviz/WireViz/pull/192))
- Simplify BOM code ([#197](https://github.com/formatc1702/WireViz/pull/197)) - Simplify BOM code ([#197](https://github.com/wireviz/WireViz/pull/197))
- Bug fixes ([#218](https://github.com/formatc1702/WireViz/pull/218), [#221](https://github.com/formatc1702/WireViz/pull/221)) - Bug fixes ([#218](https://github.com/wireviz/WireViz/pull/218), [#221](https://github.com/wireviz/WireViz/pull/221))
### Known issues ### Known issues
- Including images in the harness may lead to issues in the following cases: ([#189](https://github.com/formatc1702/WireViz/pull/189), [#220](https://github.com/formatc1702/WireViz/issues/220)) - Including images in the harness may lead to issues in the following cases: ([#189](https://github.com/wireviz/WireViz/pull/189), [#220](https://github.com/wireviz/WireViz/issues/220))
- When using the `-o`/`--output_file` CLI option, specifying an output path in a different directory from the input file - When using the `-o`/`--output_file` CLI option, specifying an output path in a different directory from the input file
- When using the `--prepend-file` CLI option, specifying a prepend file in a different directory from the mail input file - When using the `--prepend-file` CLI option, specifying a prepend file in a different directory from the mail input file
## [0.2](https://github.com/formatc1702/WireViz/tree/v0.2) (2020-10-17)
## [0.2](https://github.com/wireviz/WireViz/tree/v0.2) (2020-10-17)
### Backward incompatible changes ### Backward incompatible changes
- Change names of connector attributes ([#77](https://github.com/formatc1702/WireViz/issues/77), [#105](https://github.com/formatc1702/WireViz/pull/105)) - Change names of connector attributes ([#77](https://github.com/wireviz/WireViz/issues/77), [#105](https://github.com/wireviz/WireViz/pull/105))
- `pinnumbers` is now `pins` - `pinnumbers` is now `pins`
- `pinout` is now `pinlabels` - `pinout` is now `pinlabels`
- Remove ferrules as a separate connector type ([#78](https://github.com/formatc1702/WireViz/issues/78), [#102](https://github.com/formatc1702/WireViz/pull/102)) - Remove ferrules as a separate connector type ([#78](https://github.com/wireviz/WireViz/issues/78), [#102](https://github.com/wireviz/WireViz/pull/102))
- Simple connectors like ferrules are now defined using the `style: simple` attribute - Simple connectors like ferrules are now defined using the `style: simple` attribute
- Change the way loops are defined ([#79](https://github.com/formatc1702/WireViz/issues/79), [#75](https://github.com/formatc1702/WireViz/pull/75)) - Change the way loops are defined ([#79](https://github.com/wireviz/WireViz/issues/79), [#75](https://github.com/wireviz/WireViz/pull/75))
- Wires looping between two pins of the same connector are now handled via the connector's `loops` attribute. - Wires looping between two pins of the same connector are now handled via the connector's `loops` attribute.
See the [syntax description](syntax.md) for details. See the [syntax description](syntax.md) for details.
### New features ### New features
- Add bidirectional AWG/mm2 conversion ([#40](https://github.com/formatc1702/WireViz/issues/40), [#41](https://github.com/formatc1702/WireViz/pull/41)) - Add bidirectional AWG/mm2 conversion ([#40](https://github.com/wireviz/WireViz/issues/40), [#41](https://github.com/wireviz/WireViz/pull/41))
- Add support for part numbers ([#11](https://github.com/formatc1702/WireViz/pull/11), [#114](https://github.com/formatc1702/WireViz/issues/114), [#121](https://github.com/formatc1702/WireViz/pull/121)) - Add support for part numbers ([#11](https://github.com/wireviz/WireViz/pull/11), [#114](https://github.com/wireviz/WireViz/issues/114), [#121](https://github.com/wireviz/WireViz/pull/121))
- Add support for multicolored wires ([#12](https://github.com/formatc1702/WireViz/issues/12), [#17](https://github.com/formatc1702/WireViz/pull/17), [#96](https://github.com/formatc1702/WireViz/pull/96), [#131](https://github.com/formatc1702/WireViz/issues/131), [#132](https://github.com/formatc1702/WireViz/pull/132)) - Add support for multicolored wires ([#12](https://github.com/wireviz/WireViz/issues/12), [#17](https://github.com/wireviz/WireViz/pull/17), [#96](https://github.com/wireviz/WireViz/pull/96), [#131](https://github.com/wireviz/WireViz/issues/131), [#132](https://github.com/wireviz/WireViz/pull/132))
- Add support for images ([#27](https://github.com/formatc1702/WireViz/issues/27), [#153](https://github.com/formatc1702/WireViz/pull/153)) - Add support for images ([#27](https://github.com/wireviz/WireViz/issues/27), [#153](https://github.com/wireviz/WireViz/pull/153))
- Add ability to export data directly to other programs ([#55](https://github.com/formatc1702/WireViz/pull/55)) - Add ability to export data directly to other programs ([#55](https://github.com/wireviz/WireViz/pull/55))
- Add support for line breaks in various fields ([#49](https://github.com/formatc1702/WireViz/issues/49), [#64](https://github.com/formatc1702/WireViz/pull/64)) - Add support for line breaks in various fields ([#49](https://github.com/wireviz/WireViz/issues/49), [#64](https://github.com/wireviz/WireViz/pull/64))
- Allow using connector pin names to define connections ([#72](https://github.com/formatc1702/WireViz/issues/72), [#139](https://github.com/formatc1702/WireViz/issues/139), [#140](https://github.com/formatc1702/WireViz/pull/140)) - Allow using connector pin names to define connections ([#72](https://github.com/wireviz/WireViz/issues/72), [#139](https://github.com/wireviz/WireViz/issues/139), [#140](https://github.com/wireviz/WireViz/pull/140))
- Make defining connection sets easier and more flexible ([#67](https://github.com/formatc1702/WireViz/issues/67), [#75](https://github.com/formatc1702/WireViz/pull/75)) - Make defining connection sets easier and more flexible ([#67](https://github.com/wireviz/WireViz/issues/67), [#75](https://github.com/wireviz/WireViz/pull/75))
- Add new command line options ([#167](https://github.com/formatc1702/WireViz/issues/167), [#173](https://github.com/formatc1702/WireViz/pull/173)) - Add new command line options ([#167](https://github.com/wireviz/WireViz/issues/167), [#173](https://github.com/wireviz/WireViz/pull/173))
- Add new features to `build_examples.py` ([#118](https://github.com/formatc1702/WireViz/pull/118)) - Add new features to `build_examples.py` ([#118](https://github.com/wireviz/WireViz/pull/118))
- Add new colors ([#103](https://github.com/formatc1702/WireViz/pull/103), [#113](https://github.com/formatc1702/WireViz/pull/113), [#144](https://github.com/formatc1702/WireViz/issues/144), [#145](https://github.com/formatc1702/WireViz/pull/145)) - Add new colors ([#103](https://github.com/wireviz/WireViz/pull/103), [#113](https://github.com/wireviz/WireViz/pull/113), [#144](https://github.com/wireviz/WireViz/issues/144), [#145](https://github.com/wireviz/WireViz/pull/145))
- Improve documentation ([#107](https://github.com/formatc1702/WireViz/issues/107), [#111](https://github.com/formatc1702/WireViz/pull/111)) - Improve documentation ([#107](https://github.com/wireviz/WireViz/issues/107), [#111](https://github.com/wireviz/WireViz/pull/111))
### Misc. fixes ### Misc. fixes
- Improve BOM generation - Improve BOM generation
- Add various input sanity checks - Add various input sanity checks
- Improve HTML output ([#66](https://github.com/formatc1702/WireViz/issues/66), [#136](https://github.com/formatc1702/WireViz/pull/136), [#95](https://github.com/formatc1702/WireViz/pull/95), [#177](https://github.com/formatc1702/WireViz/pull/177)) - Improve HTML output ([#66](https://github.com/wireviz/WireViz/issues/66), [#136](https://github.com/wireviz/WireViz/pull/136), [#95](https://github.com/wireviz/WireViz/pull/95), [#177](https://github.com/wireviz/WireViz/pull/177))
- Fix node rendering bug ([#69](https://github.com/formatc1702/WireViz/issues/69), [#104](https://github.com/formatc1702/WireViz/pull/104)) - Fix node rendering bug ([#69](https://github.com/wireviz/WireViz/issues/69), [#104](https://github.com/wireviz/WireViz/pull/104))
- Improve shield rendering ([#125](https://github.com/formatc1702/WireViz/issues/125), [#126](https://github.com/formatc1702/WireViz/pull/126)) - Improve shield rendering ([#125](https://github.com/wireviz/WireViz/issues/125), [#126](https://github.com/wireviz/WireViz/pull/126))
- Add GitHub Linguist overrides ([#146](https://github.com/formatc1702/WireViz/issues/146), [#154](https://github.com/formatc1702/WireViz/pull/154)) - Add GitHub Linguist overrides ([#146](https://github.com/wireviz/WireViz/issues/146), [#154](https://github.com/wireviz/WireViz/pull/154))
## [0.1](https://github.com/formatc1702/WireViz/tree/v0.1) (2020-06-29) ## [0.1](https://github.com/wireviz/WireViz/tree/v0.1) (2020-06-29)
- Initial release - Initial release

View File

@ -74,13 +74,13 @@ Output file:
![Sample output diagram](../examples/demo01.png) ![Sample output diagram](../examples/demo01.png)
[Bill of Materials](../examples/demo01.bom.tsv) (auto-generated) [Bill of Materials](../examples/demo01.tsv) (auto-generated)
### Demo 02 ### Demo 02
![](../examples/demo02.png) ![](../examples/demo02.png)
[Source](../examples/demo02.yml) - [Bill of Materials](../examples/demo02.bom.tsv) [Source](../examples/demo02.yml) - [Bill of Materials](../examples/demo02.tsv)
### Syntax, tutorial and example gallery ### Syntax, tutorial and example gallery
@ -133,7 +133,7 @@ Depending on the options specified, this will output some or all of the followin
mywire.gv GraphViz output mywire.gv GraphViz output
mywire.svg Wiring diagram as vector image mywire.svg Wiring diagram as vector image
mywire.png Wiring diagram as raster image mywire.png Wiring diagram as raster image
mywire.bom.tsv BOM (bill of materials) as tab-separated text file mywire.tsv BOM (bill of materials) as tab-separated text file
mywire.html HTML page with wiring diagram and BOM embedded mywire.html HTML page with wiring diagram and BOM embedded
``` ```

View File

@ -26,7 +26,7 @@ Possible group names:
- `tutorial` to process`tutorial/{readme.md,tutorial*.*}` - `tutorial` to process`tutorial/{readme.md,tutorial*.*}`
- `demos` to process`examples/demo*.*` - `demos` to process`examples/demo*.*`
Affected filetypes: `.gv`, `.bom.tsv`, `.png`, `.svg`, `.html` Affected filetypes: `.gv`, `.tsv`, `.png`, `.svg`, `.html`
## Usage hints ## Usage hints

2
examples/demo01.gv generated
View File

@ -60,6 +60,8 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ffffff:#000000"]
X1:p7r:e -- X1:p8r:e
X2 [label=< X2 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>

106
examples/demo01.html generated
View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>demo01</title> <title>demo01</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>demo01</h1> <h1>demo01</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="833pt" height="291pt" <svg width="833pt" height="291pt"
@ -18,6 +41,7 @@
<g id="node1" class="node"> <g id="node1" class="node">
<title>X1</title> <title>X1</title>
<polygon fill="#ffffff" stroke="black" points="139,-253 0,-253 0,0 139,0 139,-253"/> <polygon fill="#ffffff" stroke="black" points="139,-253 0,-253 0,0 139,0 139,-253"/>
<polygon fill="#ffffff" stroke="transparent" points="0,0 0,-253 139,-253 139,0 0,0"/>
<polygon fill="none" stroke="black" points="0.5,-229.5 0.5,-252.5 139.5,-252.5 139.5,-229.5 0.5,-229.5"/> <polygon fill="none" stroke="black" points="0.5,-229.5 0.5,-252.5 139.5,-252.5 139.5,-229.5 0.5,-229.5"/>
<text text-anchor="start" x="61" y="-237.3" font-family="arial" font-size="14.00">X1</text> <text text-anchor="start" x="61" y="-237.3" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="0.5,-206.5 0.5,-229.5 48.5,-229.5 48.5,-206.5 0.5,-206.5"/> <polygon fill="none" stroke="black" points="0.5,-206.5 0.5,-229.5 48.5,-229.5 48.5,-206.5 0.5,-206.5"/>
@ -63,6 +87,13 @@
<polygon fill="none" stroke="black" points="82.5,0.5 82.5,-22.5 139.5,-22.5 139.5,0.5 82.5,0.5"/> <polygon fill="none" stroke="black" points="82.5,0.5 82.5,-22.5 139.5,-22.5 139.5,0.5 82.5,0.5"/>
<text text-anchor="start" x="107" y="-7.3" font-family="arial" font-size="14.00">9</text> <text text-anchor="start" x="107" y="-7.3" font-family="arial" font-size="14.00">9</text>
</g> </g>
<!-- X1&#45;&#45;X1 -->
<g id="edge1" class="edge">
<title>X1:e&#45;&#45;X1:e</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M139.95,-54.55C192,-66.5 298,-66.5 296,-45 298,-23.5 192,-23.5 139.95,-35.45"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M139.5,-56.5C192,-68.5 298,-68.5 298,-45 298,-21.5 192,-21.5 139.5,-33.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M139.05,-58.45C192,-70.5 298,-70.5 300,-45 298,-19.5 192,-19.5 139.05,-31.55"/>
</g>
<!-- W1 --> <!-- W1 -->
<g id="node3" class="node"> <g id="node3" class="node">
<title>W1</title> <title>W1</title>
@ -103,28 +134,28 @@
<text text-anchor="start" x="315.5" y="-89.3" font-family="arial" font-size="14.00"> </text> <text text-anchor="start" x="315.5" y="-89.3" font-family="arial" font-size="14.00"> </text>
</g> </g>
<!-- X1&#45;&#45;W1 --> <!-- X1&#45;&#45;W1 -->
<g id="edge1" class="edge"> <g id="edge2" class="edge">
<title>X1:e&#45;&#45;W1:w</title> <title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-100.5C217.18,-102.68 208.81,-195.68 283,-193.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-100.5C217.18,-102.68 208.81,-195.68 283,-193.5"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M139,-102.5C215.19,-102.5 206.81,-195.5 283,-195.5"/> <path fill="none" stroke="#ffffff" stroke-width="2" d="M139,-102.5C215.19,-102.5 206.81,-195.5 283,-195.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-104.5C213.19,-102.32 204.82,-195.32 283,-197.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-104.5C213.19,-102.32 204.82,-195.32 283,-197.5"/>
</g> </g>
<!-- X1&#45;&#45;W1 --> <!-- X1&#45;&#45;W1 -->
<g id="edge3" class="edge"> <g id="edge4" class="edge">
<title>X1:e&#45;&#45;W1:w</title> <title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-170.5C202.76,-170.52 218.75,-168.52 283,-168.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-170.5C202.76,-170.52 218.75,-168.52 283,-168.5"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M139,-172.5C203.01,-172.5 218.99,-170.5 283,-170.5"/> <path fill="none" stroke="#895956" stroke-width="2" d="M139,-172.5C203.01,-172.5 218.99,-170.5 283,-170.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-174.5C203.25,-174.48 219.24,-172.48 283,-172.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-174.5C203.25,-174.48 219.24,-172.48 283,-172.5"/>
</g> </g>
<!-- X1&#45;&#45;W1 --> <!-- X1&#45;&#45;W1 -->
<g id="edge5" class="edge"> <g id="edge6" class="edge">
<title>X1:e&#45;&#45;W1:w</title> <title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-147.5C202.54,-147.56 218.49,-143.56 283,-143.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-147.5C202.54,-147.56 218.49,-143.56 283,-143.5"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M139,-149.5C203.02,-149.5 218.98,-145.5 283,-145.5"/> <path fill="none" stroke="#00ff00" stroke-width="2" d="M139,-149.5C203.02,-149.5 218.98,-145.5 283,-145.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-151.5C203.51,-151.44 219.46,-147.44 283,-147.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-151.5C203.51,-151.44 219.46,-147.44 283,-147.5"/>
</g> </g>
<!-- X1&#45;&#45;W1 --> <!-- X1&#45;&#45;W1 -->
<g id="edge7" class="edge"> <g id="edge8" class="edge">
<title>X1:e&#45;&#45;W1:w</title> <title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-102.5C203,-102.5 219,-103.5 283,-103.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-102.5C203,-102.5 219,-103.5 283,-103.5"/>
</g> </g>
@ -132,6 +163,7 @@
<g id="node2" class="node"> <g id="node2" class="node">
<title>X2</title> <title>X2</title>
<polygon fill="#ffffff" stroke="black" points="825,-254 638,-254 638,-139 825,-139 825,-254"/> <polygon fill="#ffffff" stroke="black" points="825,-254 638,-254 638,-139 825,-139 825,-254"/>
<polygon fill="#ffffff" stroke="transparent" points="638,-139 638,-254 825,-254 825,-139 638,-139"/>
<polygon fill="none" stroke="black" points="638.5,-230.5 638.5,-253.5 825.5,-253.5 825.5,-230.5 638.5,-230.5"/> <polygon fill="none" stroke="black" points="638.5,-230.5 638.5,-253.5 825.5,-253.5 825.5,-230.5 638.5,-230.5"/>
<text text-anchor="start" x="723" y="-238.3" font-family="arial" font-size="14.00">X2</text> <text text-anchor="start" x="723" y="-238.3" font-family="arial" font-size="14.00">X2</text>
<polygon fill="none" stroke="black" points="638.5,-207.5 638.5,-230.5 734.5,-230.5 734.5,-207.5 638.5,-207.5"/> <polygon fill="none" stroke="black" points="638.5,-207.5 638.5,-230.5 734.5,-230.5 734.5,-207.5 638.5,-207.5"/>
@ -154,21 +186,21 @@
<text text-anchor="start" x="764" y="-146.3" font-family="arial" font-size="14.00">TX</text> <text text-anchor="start" x="764" y="-146.3" font-family="arial" font-size="14.00">TX</text>
</g> </g>
<!-- W1&#45;&#45;X2 --> <!-- W1&#45;&#45;X2 -->
<g id="edge2" class="edge"> <g id="edge3" class="edge">
<title>W1:e&#45;&#45;X2:w</title> <title>W1:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M494,-193.5C558,-193.5 574,-193.5 638,-193.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M494,-193.5C558,-193.5 574,-193.5 638,-193.5"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M494,-195.5C558,-195.5 574,-195.5 638,-195.5"/> <path fill="none" stroke="#ffffff" stroke-width="2" d="M494,-195.5C558,-195.5 574,-195.5 638,-195.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M494,-197.5C558,-197.5 574,-197.5 638,-197.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M494,-197.5C558,-197.5 574,-197.5 638,-197.5"/>
</g> </g>
<!-- W1&#45;&#45;X2 --> <!-- W1&#45;&#45;X2 -->
<g id="edge4" class="edge"> <g id="edge5" class="edge">
<title>W1:e&#45;&#45;X2:w</title> <title>W1:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M494,-168.5C557.04,-169.36 571.68,-148.36 638,-147.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M494,-168.5C557.04,-169.36 571.68,-148.36 638,-147.5"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M494,-170.5C558.68,-170.5 573.32,-149.5 638,-149.5"/> <path fill="none" stroke="#895956" stroke-width="2" d="M494,-170.5C558.68,-170.5 573.32,-149.5 638,-149.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M494,-172.5C560.32,-171.64 574.96,-150.64 638,-151.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M494,-172.5C560.32,-171.64 574.96,-150.64 638,-151.5"/>
</g> </g>
<!-- W1&#45;&#45;X2 --> <!-- W1&#45;&#45;X2 -->
<g id="edge6" class="edge"> <g id="edge7" class="edge">
<title>W1:e&#45;&#45;X2:w</title> <title>W1:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M494,-143.5C560.9,-144.59 574.67,-171.59 638,-170.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M494,-143.5C560.9,-144.59 574.67,-171.59 638,-170.5"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M494,-145.5C559.12,-145.5 572.88,-172.5 638,-172.5"/> <path fill="none" stroke="#00ff00" stroke-width="2" d="M494,-145.5C559.12,-145.5 572.88,-172.5 638,-172.5"/>
@ -176,35 +208,47 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Cable, 3 x 0.25 mm&sup2; shielded</td> <td class="bom_col_description">Cable, 3 x 0.25 mm² shielded</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td> <td class="bom_col_qty">0.2</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Connector, D-Sub, female, 9 pins</td> <td class="bom_col_description">Connector, D-Sub, female, 9 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1</td> <td class="bom_col_designators">X1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 3 pins</td> <td class="bom_col_description">Connector, Molex KK 254, female, 3 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X2</td> <td class="bom_col_designators">X2</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

BIN
examples/demo01.png generated

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 63 KiB

25
examples/demo01.svg generated
View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="833pt" height="291pt" <svg width="833pt" height="291pt"
@ -12,6 +12,7 @@
<g id="node1" class="node"> <g id="node1" class="node">
<title>X1</title> <title>X1</title>
<polygon fill="#ffffff" stroke="black" points="139,-253 0,-253 0,0 139,0 139,-253"/> <polygon fill="#ffffff" stroke="black" points="139,-253 0,-253 0,0 139,0 139,-253"/>
<polygon fill="#ffffff" stroke="transparent" points="0,0 0,-253 139,-253 139,0 0,0"/>
<polygon fill="none" stroke="black" points="0.5,-229.5 0.5,-252.5 139.5,-252.5 139.5,-229.5 0.5,-229.5"/> <polygon fill="none" stroke="black" points="0.5,-229.5 0.5,-252.5 139.5,-252.5 139.5,-229.5 0.5,-229.5"/>
<text text-anchor="start" x="61" y="-237.3" font-family="arial" font-size="14.00">X1</text> <text text-anchor="start" x="61" y="-237.3" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="0.5,-206.5 0.5,-229.5 48.5,-229.5 48.5,-206.5 0.5,-206.5"/> <polygon fill="none" stroke="black" points="0.5,-206.5 0.5,-229.5 48.5,-229.5 48.5,-206.5 0.5,-206.5"/>
@ -57,6 +58,13 @@
<polygon fill="none" stroke="black" points="82.5,0.5 82.5,-22.5 139.5,-22.5 139.5,0.5 82.5,0.5"/> <polygon fill="none" stroke="black" points="82.5,0.5 82.5,-22.5 139.5,-22.5 139.5,0.5 82.5,0.5"/>
<text text-anchor="start" x="107" y="-7.3" font-family="arial" font-size="14.00">9</text> <text text-anchor="start" x="107" y="-7.3" font-family="arial" font-size="14.00">9</text>
</g> </g>
<!-- X1&#45;&#45;X1 -->
<g id="edge1" class="edge">
<title>X1:e&#45;&#45;X1:e</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M139.95,-54.55C192,-66.5 298,-66.5 296,-45 298,-23.5 192,-23.5 139.95,-35.45"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M139.5,-56.5C192,-68.5 298,-68.5 298,-45 298,-21.5 192,-21.5 139.5,-33.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M139.05,-58.45C192,-70.5 298,-70.5 300,-45 298,-19.5 192,-19.5 139.05,-31.55"/>
</g>
<!-- W1 --> <!-- W1 -->
<g id="node3" class="node"> <g id="node3" class="node">
<title>W1</title> <title>W1</title>
@ -97,28 +105,28 @@
<text text-anchor="start" x="315.5" y="-89.3" font-family="arial" font-size="14.00"> </text> <text text-anchor="start" x="315.5" y="-89.3" font-family="arial" font-size="14.00"> </text>
</g> </g>
<!-- X1&#45;&#45;W1 --> <!-- X1&#45;&#45;W1 -->
<g id="edge1" class="edge"> <g id="edge2" class="edge">
<title>X1:e&#45;&#45;W1:w</title> <title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-100.5C217.18,-102.68 208.81,-195.68 283,-193.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-100.5C217.18,-102.68 208.81,-195.68 283,-193.5"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M139,-102.5C215.19,-102.5 206.81,-195.5 283,-195.5"/> <path fill="none" stroke="#ffffff" stroke-width="2" d="M139,-102.5C215.19,-102.5 206.81,-195.5 283,-195.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-104.5C213.19,-102.32 204.82,-195.32 283,-197.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-104.5C213.19,-102.32 204.82,-195.32 283,-197.5"/>
</g> </g>
<!-- X1&#45;&#45;W1 --> <!-- X1&#45;&#45;W1 -->
<g id="edge3" class="edge"> <g id="edge4" class="edge">
<title>X1:e&#45;&#45;W1:w</title> <title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-170.5C202.76,-170.52 218.75,-168.52 283,-168.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-170.5C202.76,-170.52 218.75,-168.52 283,-168.5"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M139,-172.5C203.01,-172.5 218.99,-170.5 283,-170.5"/> <path fill="none" stroke="#895956" stroke-width="2" d="M139,-172.5C203.01,-172.5 218.99,-170.5 283,-170.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-174.5C203.25,-174.48 219.24,-172.48 283,-172.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-174.5C203.25,-174.48 219.24,-172.48 283,-172.5"/>
</g> </g>
<!-- X1&#45;&#45;W1 --> <!-- X1&#45;&#45;W1 -->
<g id="edge5" class="edge"> <g id="edge6" class="edge">
<title>X1:e&#45;&#45;W1:w</title> <title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-147.5C202.54,-147.56 218.49,-143.56 283,-143.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-147.5C202.54,-147.56 218.49,-143.56 283,-143.5"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M139,-149.5C203.02,-149.5 218.98,-145.5 283,-145.5"/> <path fill="none" stroke="#00ff00" stroke-width="2" d="M139,-149.5C203.02,-149.5 218.98,-145.5 283,-145.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-151.5C203.51,-151.44 219.46,-147.44 283,-147.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-151.5C203.51,-151.44 219.46,-147.44 283,-147.5"/>
</g> </g>
<!-- X1&#45;&#45;W1 --> <!-- X1&#45;&#45;W1 -->
<g id="edge7" class="edge"> <g id="edge8" class="edge">
<title>X1:e&#45;&#45;W1:w</title> <title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-102.5C203,-102.5 219,-103.5 283,-103.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M139,-102.5C203,-102.5 219,-103.5 283,-103.5"/>
</g> </g>
@ -126,6 +134,7 @@
<g id="node2" class="node"> <g id="node2" class="node">
<title>X2</title> <title>X2</title>
<polygon fill="#ffffff" stroke="black" points="825,-254 638,-254 638,-139 825,-139 825,-254"/> <polygon fill="#ffffff" stroke="black" points="825,-254 638,-254 638,-139 825,-139 825,-254"/>
<polygon fill="#ffffff" stroke="transparent" points="638,-139 638,-254 825,-254 825,-139 638,-139"/>
<polygon fill="none" stroke="black" points="638.5,-230.5 638.5,-253.5 825.5,-253.5 825.5,-230.5 638.5,-230.5"/> <polygon fill="none" stroke="black" points="638.5,-230.5 638.5,-253.5 825.5,-253.5 825.5,-230.5 638.5,-230.5"/>
<text text-anchor="start" x="723" y="-238.3" font-family="arial" font-size="14.00">X2</text> <text text-anchor="start" x="723" y="-238.3" font-family="arial" font-size="14.00">X2</text>
<polygon fill="none" stroke="black" points="638.5,-207.5 638.5,-230.5 734.5,-230.5 734.5,-207.5 638.5,-207.5"/> <polygon fill="none" stroke="black" points="638.5,-207.5 638.5,-230.5 734.5,-230.5 734.5,-207.5 638.5,-207.5"/>
@ -148,21 +157,21 @@
<text text-anchor="start" x="764" y="-146.3" font-family="arial" font-size="14.00">TX</text> <text text-anchor="start" x="764" y="-146.3" font-family="arial" font-size="14.00">TX</text>
</g> </g>
<!-- W1&#45;&#45;X2 --> <!-- W1&#45;&#45;X2 -->
<g id="edge2" class="edge"> <g id="edge3" class="edge">
<title>W1:e&#45;&#45;X2:w</title> <title>W1:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M494,-193.5C558,-193.5 574,-193.5 638,-193.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M494,-193.5C558,-193.5 574,-193.5 638,-193.5"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M494,-195.5C558,-195.5 574,-195.5 638,-195.5"/> <path fill="none" stroke="#ffffff" stroke-width="2" d="M494,-195.5C558,-195.5 574,-195.5 638,-195.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M494,-197.5C558,-197.5 574,-197.5 638,-197.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M494,-197.5C558,-197.5 574,-197.5 638,-197.5"/>
</g> </g>
<!-- W1&#45;&#45;X2 --> <!-- W1&#45;&#45;X2 -->
<g id="edge4" class="edge"> <g id="edge5" class="edge">
<title>W1:e&#45;&#45;X2:w</title> <title>W1:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M494,-168.5C557.04,-169.36 571.68,-148.36 638,-147.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M494,-168.5C557.04,-169.36 571.68,-148.36 638,-147.5"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M494,-170.5C558.68,-170.5 573.32,-149.5 638,-149.5"/> <path fill="none" stroke="#895956" stroke-width="2" d="M494,-170.5C558.68,-170.5 573.32,-149.5 638,-149.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M494,-172.5C560.32,-171.64 574.96,-150.64 638,-151.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M494,-172.5C560.32,-171.64 574.96,-150.64 638,-151.5"/>
</g> </g>
<!-- W1&#45;&#45;X2 --> <!-- W1&#45;&#45;X2 -->
<g id="edge6" class="edge"> <g id="edge7" class="edge">
<title>W1:e&#45;&#45;X2:w</title> <title>W1:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M494,-143.5C560.9,-144.59 574.67,-171.59 638,-170.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M494,-143.5C560.9,-144.59 574.67,-171.59 638,-170.5"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M494,-145.5C559.12,-145.5 572.88,-172.5 638,-172.5"/> <path fill="none" stroke="#00ff00" stroke-width="2" d="M494,-145.5C559.12,-145.5 572.88,-172.5 638,-172.5"/>

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,8 +1,13 @@
metadata:
title: demo01
connectors: connectors:
X1: X1:
type: D-Sub type: D-Sub
subtype: female subtype: female
pinlabels: [DCD, RX, TX, DTR, GND, DSR, RTS, CTS, RI] pinlabels: [DCD, RX, TX, DTR, GND, DSR, RTS, CTS, RI]
loops:
- [7,8]
X2: X2:
type: Molex KK 254 type: Molex KK 254
subtype: female subtype: female

8
examples/demo02.gv generated
View File

@ -168,7 +168,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_1 [label=< AUTOGENERATED_F_1 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -180,7 +180,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_2 [label=< AUTOGENERATED_F_2 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -487,10 +487,10 @@ graph {
</table> </table>
> fillcolor="#FFFFFF" shape=box style="filled,dashed"] > fillcolor="#FFFFFF" shape=box style="filled,dashed"]
edge [color="#000000:#000000:#000000"] edge [color="#000000:#000000:#000000"]
_ferrule_crimp_1:e -- W4:w1:w AUTOGENERATED_F_1:e -- W4:w1:w
W4:w1:e -- X4:p1l:w W4:w1:e -- X4:p1l:w
edge [color="#000000:#ff0000:#000000"] edge [color="#000000:#ff0000:#000000"]
_ferrule_crimp_2:e -- W4:w2:w AUTOGENERATED_F_2:e -- W4:w2:w
W4:w2:e -- X4:p2l:w W4:w2:e -- X4:p2l:w
W4 [label=< W4 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">

448
examples/demo02.html generated
View File

@ -1,13 +1,194 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"><head> <html>
<head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>demo02</title> <title>WireViz Demo 2</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
<h1>demo02</h1> body {
<h2>Diagram</h2> font-family: arial;
<!-- XML and DOCTYPE declarations from SVG file removed --> background-color: #ffffff;
<!-- Generated by graphviz version 2.49.0 (20210828.1703) }
table, td, th, #frame {
border: 0.35mm solid black; /* line weight based on DIN 15 */
}
table {
padding: 0;
border-bottom: 0;
border-right: 0;
border-spacing: 0mm;
}
td, th {
border-top: 0;
border-left: 0;
overflow: hidden;
/* display: inline-block; */
white-space: nowrap;
font-size: 2.8mm;
}
/* Canvas size based on DIN 823 / DIN 6771 / EN ISO 5457 */
#frame {
position: relative;
}
.A4, .sheetsize_default { /* portrait */
width: 180mm;
height: 277mm;
}
.A3 { /* landscape */
width: 390mm;
height: 277mm;
}
.A2 { /* landscape */
width: 564mm;
height: 400mm;
}
#diagram {
position: relative;
top: 0;
left: 0;
max-width: 100%;
height: calc(100% - 13 * 4.25mm);
/* TODO: auto-adapt to height of title block + BOM table;
BOM table might be above (A4) or to the left (A3 and larger) of the title block */
text-align: center;
vertical-align: middle;
}
#diagram svg, #diagram img {
max-width: 95%;
max-height: 100%;
position: relative;
top: 50%;
transform: translateY(-50%);
}
#titleblock {
position: absolute;
bottom: 0mm;
right: -0mm;
}
#titleblock table {
width: 180mm;
height: 38.25mm;
}
#titleblock tr, #bom tr {
height: 4.25mm;
}
.A4 #bom { /* BOM on top of title block */
position: absolute;
bottom: 38.25mm;
right: 0;
}
.A3 #bom, .A2 #bom { /* BOM to the left of title block */
position: absolute;
bottom: 0mm;
left: 0mm;
}
#bom table {
width:180mm;
}
#bom th, td {
text-align: left;
}
#bom .bom_col_id {
text-align: center;
}
#bom .bom_col_qty {
text-align: right;
}
.name {
width: 16mm;
}
.date {
width: 10mm;
}
.revno {
text-align: center;
width: 6mm;
}
.changelog {
width: 22mm;
}
.process {
width: 18mm;
}
.title {
width: 82mm;
font-size: 5.6mm;
text-align: center;
white-space: normal;
}
.company {
font-size: 4mm;
text-align: center;
white-space: normal;
}
.partno {
font-size: 4mm;
text-align: center;
white-space: normal;
}
.sheetno {
width: 12.75mm;
text-align: center;
}
</style>
<style type="text/css" media="print">
@page {
size: auto;
margin: 0;
}
/* TODO: auto-adjust based on portrait (larger margin on left) or landscape (larger margin on top) */
#page {
margin: 10mm;
margin-left: 20mm;
}
</style>
</head>
<body>
<div id="page">
<div id="frame" class="A3">
<div id="diagram">
<div id="description">
<!-- %description% -->
</div>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="882pt" height="767pt" <svg width="882pt" height="767pt"
@ -18,6 +199,7 @@
<g id="node1" class="node"> <g id="node1" class="node">
<title>X1</title> <title>X1</title>
<polygon fill="#ffffff" stroke="black" points="189.5,-517.5 2.5,-517.5 2.5,-287.5 189.5,-287.5 189.5,-517.5"/> <polygon fill="#ffffff" stroke="black" points="189.5,-517.5 2.5,-517.5 2.5,-287.5 189.5,-287.5 189.5,-517.5"/>
<polygon fill="#ffffff" stroke="transparent" points="2.5,-287.5 2.5,-517.5 189.5,-517.5 189.5,-287.5 2.5,-287.5"/>
<polygon fill="none" stroke="black" points="3,-494.5 3,-517.5 190,-517.5 190,-494.5 3,-494.5"/> <polygon fill="none" stroke="black" points="3,-494.5 3,-517.5 190,-517.5 190,-494.5 3,-494.5"/>
<text text-anchor="start" x="87.5" y="-502.3" font-family="arial" font-size="14.00">X1</text> <text text-anchor="start" x="87.5" y="-502.3" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="3,-471.5 3,-494.5 99,-494.5 99,-471.5 3,-471.5"/> <polygon fill="none" stroke="black" points="3,-471.5 3,-494.5 99,-494.5 99,-471.5 3,-471.5"/>
@ -264,6 +446,7 @@
<g id="node2" class="node"> <g id="node2" class="node">
<title>X2</title> <title>X2</title>
<polygon fill="#ffffff" stroke="black" points="874,-726.5 687,-726.5 687,-588.5 874,-588.5 874,-726.5"/> <polygon fill="#ffffff" stroke="black" points="874,-726.5 687,-726.5 687,-588.5 874,-588.5 874,-726.5"/>
<polygon fill="#ffffff" stroke="transparent" points="687,-588.5 687,-726.5 874,-726.5 874,-588.5 687,-588.5"/>
<polygon fill="none" stroke="black" points="687.5,-703.5 687.5,-726.5 874.5,-726.5 874.5,-703.5 687.5,-703.5"/> <polygon fill="none" stroke="black" points="687.5,-703.5 687.5,-726.5 874.5,-726.5 874.5,-703.5 687.5,-703.5"/>
<text text-anchor="start" x="772" y="-711.3" font-family="arial" font-size="14.00">X2</text> <text text-anchor="start" x="772" y="-711.3" font-family="arial" font-size="14.00">X2</text>
<polygon fill="none" stroke="black" points="687.5,-680.5 687.5,-703.5 783.5,-703.5 783.5,-680.5 687.5,-680.5"/> <polygon fill="none" stroke="black" points="687.5,-680.5 687.5,-703.5 783.5,-703.5 783.5,-680.5 687.5,-680.5"/>
@ -293,6 +476,7 @@
<g id="node3" class="node"> <g id="node3" class="node">
<title>X3</title> <title>X3</title>
<polygon fill="#ffffff" stroke="black" points="874,-518.5 687,-518.5 687,-380.5 874,-380.5 874,-518.5"/> <polygon fill="#ffffff" stroke="black" points="874,-518.5 687,-518.5 687,-380.5 874,-380.5 874,-518.5"/>
<polygon fill="#ffffff" stroke="transparent" points="687,-380.5 687,-518.5 874,-518.5 874,-380.5 687,-380.5"/>
<polygon fill="none" stroke="black" points="687.5,-495.5 687.5,-518.5 874.5,-518.5 874.5,-495.5 687.5,-495.5"/> <polygon fill="none" stroke="black" points="687.5,-495.5 687.5,-518.5 874.5,-518.5 874.5,-495.5 687.5,-495.5"/>
<text text-anchor="start" x="772" y="-503.3" font-family="arial" font-size="14.00">X3</text> <text text-anchor="start" x="772" y="-503.3" font-family="arial" font-size="14.00">X3</text>
<polygon fill="none" stroke="black" points="687.5,-472.5 687.5,-495.5 783.5,-495.5 783.5,-472.5 687.5,-472.5"/> <polygon fill="none" stroke="black" points="687.5,-472.5 687.5,-495.5 783.5,-495.5 783.5,-472.5 687.5,-472.5"/>
@ -322,6 +506,7 @@
<g id="node4" class="node"> <g id="node4" class="node">
<title>X4</title> <title>X4</title>
<polygon fill="#ffffff" stroke="black" points="874,-322 687,-322 687,-161 874,-161 874,-322"/> <polygon fill="#ffffff" stroke="black" points="874,-322 687,-322 687,-161 874,-161 874,-322"/>
<polygon fill="#ffffff" stroke="transparent" points="687,-161 687,-322 874,-322 874,-161 687,-161"/>
<polygon fill="none" stroke="black" points="687.5,-298.5 687.5,-321.5 874.5,-321.5 874.5,-298.5 687.5,-298.5"/> <polygon fill="none" stroke="black" points="687.5,-298.5 687.5,-321.5 874.5,-321.5 874.5,-298.5 687.5,-298.5"/>
<text text-anchor="start" x="772" y="-306.3" font-family="arial" font-size="14.00">X4</text> <text text-anchor="start" x="772" y="-306.3" font-family="arial" font-size="14.00">X4</text>
<polygon fill="none" stroke="black" points="687.5,-275.5 687.5,-298.5 783.5,-298.5 783.5,-275.5 687.5,-275.5"/> <polygon fill="none" stroke="black" points="687.5,-275.5 687.5,-298.5 783.5,-298.5 783.5,-275.5 687.5,-275.5"/>
@ -351,10 +536,11 @@
<polygon fill="none" stroke="black" points="767.5,-160.5 767.5,-183.5 874.5,-183.5 874.5,-160.5 767.5,-160.5"/> <polygon fill="none" stroke="black" points="767.5,-160.5 767.5,-183.5 874.5,-183.5 874.5,-160.5 767.5,-160.5"/>
<text text-anchor="start" x="806.5" y="-168.3" font-family="arial" font-size="14.00">SCK</text> <text text-anchor="start" x="806.5" y="-168.3" font-family="arial" font-size="14.00">SCK</text>
</g> </g>
<!-- _ferrule_crimp_1 --> <!-- AUTOGENERATED_F_1 -->
<g id="node5" class="node"> <g id="node5" class="node">
<title>_ferrule_crimp_1</title> <title>AUTOGENERATED_F_1</title>
<polygon fill="#ffffff" stroke="black" points="192,-70 0,-70 0,-47 192,-47 192,-70"/> <polygon fill="#ffffff" stroke="black" points="192,-70 0,-70 0,-47 192,-47 192,-70"/>
<polygon fill="#ffffff" stroke="transparent" points="0,-47 0,-70 192,-70 192,-47 0,-47"/>
<polygon fill="none" stroke="black" points="0,-46.5 0,-69.5 89,-69.5 89,-46.5 0,-46.5"/> <polygon fill="none" stroke="black" points="0,-46.5 0,-69.5 89,-69.5 89,-46.5 0,-46.5"/>
<text text-anchor="start" x="4" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
<polygon fill="none" stroke="black" points="89,-46.5 89,-69.5 157,-69.5 157,-46.5 89,-46.5"/> <polygon fill="none" stroke="black" points="89,-46.5 89,-69.5 157,-69.5 157,-46.5 89,-46.5"/>
@ -389,17 +575,18 @@
<polygon fill="#000000" stroke="transparent" points="340.5,-19.5 340.5,-21.5 539.5,-21.5 539.5,-19.5 340.5,-19.5"/> <polygon fill="#000000" stroke="transparent" points="340.5,-19.5 340.5,-21.5 539.5,-21.5 539.5,-19.5 340.5,-19.5"/>
<text text-anchor="start" x="351" y="-6.3" font-family="arial" font-size="14.00"> </text> <text text-anchor="start" x="351" y="-6.3" font-family="arial" font-size="14.00"> </text>
</g> </g>
<!-- _ferrule_crimp_1&#45;&#45;W4 --> <!-- AUTOGENERATED_F_1&#45;&#45;W4 -->
<g id="edge25" class="edge"> <g id="edge25" class="edge">
<title>_ferrule_crimp_1:e&#45;&#45;W4:w</title> <title>AUTOGENERATED_F_1:e&#45;&#45;W4:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M192,-56.5C256.61,-56.85 272.63,-45.85 339.5,-45.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M192,-56.5C256.61,-56.85 272.63,-45.85 339.5,-45.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M192,-58.5C257.74,-58.5 273.76,-47.5 339.5,-47.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M192,-58.5C257.74,-58.5 273.76,-47.5 339.5,-47.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M192,-60.5C258.87,-60.15 274.89,-49.15 339.5,-49.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M192,-60.5C258.87,-60.15 274.89,-49.15 339.5,-49.5"/>
</g> </g>
<!-- _ferrule_crimp_2 --> <!-- AUTOGENERATED_F_2 -->
<g id="node6" class="node"> <g id="node6" class="node">
<title>_ferrule_crimp_2</title> <title>AUTOGENERATED_F_2</title>
<polygon fill="#ffffff" stroke="black" points="192,-23 0,-23 0,0 192,0 192,-23"/> <polygon fill="#ffffff" stroke="black" points="192,-23 0,-23 0,0 192,0 192,-23"/>
<polygon fill="#ffffff" stroke="transparent" points="0,0 0,-23 192,-23 192,0 0,0"/>
<polygon fill="none" stroke="black" points="0,0.5 0,-22.5 89,-22.5 89,0.5 0,0.5"/> <polygon fill="none" stroke="black" points="0,0.5 0,-22.5 89,-22.5 89,0.5 0,0.5"/>
<text text-anchor="start" x="4" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
<polygon fill="none" stroke="black" points="89,0.5 89,-22.5 157,-22.5 157,0.5 89,0.5"/> <polygon fill="none" stroke="black" points="89,0.5 89,-22.5 157,-22.5 157,0.5 89,0.5"/>
@ -409,9 +596,9 @@
<polygon fill="#ffff00" stroke="transparent" points="184,0.5 184,-22.5 192,-22.5 192,0.5 184,0.5"/> <polygon fill="#ffff00" stroke="transparent" points="184,0.5 184,-22.5 192,-22.5 192,0.5 184,0.5"/>
<polygon fill="none" stroke="black" points="184,0.5 184,-22.5 192,-22.5 192,0.5 184,0.5"/> <polygon fill="none" stroke="black" points="184,0.5 184,-22.5 192,-22.5 192,0.5 184,0.5"/>
</g> </g>
<!-- _ferrule_crimp_2&#45;&#45;W4 --> <!-- AUTOGENERATED_F_2&#45;&#45;W4 -->
<g id="edge27" class="edge"> <g id="edge27" class="edge">
<title>_ferrule_crimp_2:e&#45;&#45;W4:w</title> <title>AUTOGENERATED_F_2:e&#45;&#45;W4:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M192,-9.5C258.87,-9.85 274.89,-20.85 339.5,-20.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M192,-9.5C258.87,-9.85 274.89,-20.85 339.5,-20.5"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M192,-11.5C257.74,-11.5 273.76,-22.5 339.5,-22.5"/> <path fill="none" stroke="#ff0000" stroke-width="2" d="M192,-11.5C257.74,-11.5 273.76,-22.5 339.5,-22.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M192,-13.5C256.61,-13.15 272.63,-24.15 339.5,-24.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M192,-13.5C256.61,-13.15 272.63,-24.15 339.5,-24.5"/>
@ -516,98 +703,193 @@
</g> </g>
</g> </g>
</svg> </svg>
<h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="notes">
<!-- %notes% -->
</div>
</div>
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <td class="bom_col_id">12</td>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <td class="bom_col_description">Wire, 0.14 mm², YE</td>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <td class="bom_col_qty">0.6</td>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <td class="bom_col_unit">m</td>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <td class="bom_col_designators">W1, W2</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">11</td>
<td style="border:1px solid #000000; padding: 4px">Cable, 2 x 0.25 mm&sup2;</td> <td class="bom_col_description">Wire, 0.14 mm², VT</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.3</td> <td class="bom_col_qty">0.3</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W4</td> <td class="bom_col_designators">W3</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">10</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Crimp ferrule, 0.25 mm&sup2;, YE</td> <td class="bom_col_description">Wire, 0.14 mm², RD</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td> <td class="bom_col_qty">0.6</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_designators">W1, W2</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">9</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 4 pins</td> <td class="bom_col_description">Wire, 0.14 mm², OG</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td> <td class="bom_col_qty">0.3</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">X2, X3</td> <td class="bom_col_designators">W3</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">4</td> <td class="bom_col_id">8</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 5 pins</td> <td class="bom_col_description">Wire, 0.14 mm², GN</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">0.6</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">X4</td> <td class="bom_col_designators">W1, W2</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">5</td> <td class="bom_col_id">7</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 8 pins</td> <td class="bom_col_description">Wire, 0.14 mm², BU</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">0.3</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">X1</td> <td class="bom_col_designators">W3</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">6</td> <td class="bom_col_id">6</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm&sup2;, BK</td> <td class="bom_col_description">Wire, 0.14 mm², BK</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.9</td> <td class="bom_col_qty">0.9</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3</td> <td class="bom_col_designators">W1, W2, W3</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">7</td> <td class="bom_col_id">5</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm&sup2;, BU</td> <td class="bom_col_description">Connector, Molex KK 254, female, 8 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.3</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">W3</td> <td class="bom_col_designators">X1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">8</td> <td class="bom_col_id">4</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm&sup2;, GN</td> <td class="bom_col_description">Connector, Molex KK 254, female, 5 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.6</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">W1, W2</td> <td class="bom_col_designators">X4</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">9</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm&sup2;, OG</td> <td class="bom_col_description">Connector, Molex KK 254, female, 4 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.3</td> <td class="bom_col_qty">2</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">W3</td> <td class="bom_col_designators">X2, X3</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">10</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm&sup2;, RD</td> <td class="bom_col_description">Connector, Crimp ferrule, 0.25 mm², YE</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.6</td> <td class="bom_col_qty">2</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">W1, W2</td> <td class="bom_col_designators"></td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">11</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm&sup2;, VT</td> <td class="bom_col_description">Cable, 2 x 0.25 mm²</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.3</td> <td class="bom_col_qty">0.3</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W3</td> <td class="bom_col_designators">W4</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">12</td> <th class="bom_col_id">Id</th>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm&sup2;, YE</td> <th class="bom_col_description">Description</th>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.6</td> <th class="bom_col_qty">Qty</th>
<td style="border:1px solid #000000; padding: 4px">m</td> <th class="bom_col_unit">Unit</th>
<td style="border:1px solid #000000; padding: 4px">W1, W2</td> <th class="bom_col_designators">Designators</th>
</tr> </tr>
</table> </table>
</body></html>
</div>
<div id="titleblock">
<table>
<tr>
<td class="revno"><!-- %revisions_8% --></td>
<td class="changelog"><!-- %revisions_8_changelog% --></td>
<td class="date"><!-- %revisions_8_date% --></td>
<td class="name"><!-- %revisions_8_name% --></td>
<td class="process"></td>
<td class="date">Date</td>
<td class="name">Name</td>
<td class="title" colspan="3" rowspan="5">WireViz Demo 2</td>
</tr>
<tr>
<td class="revno"><!-- %revisions_7% --></td>
<td><!-- %revisions_7_changelog% --></td>
<td><!-- %revisions_7_date% --></td>
<td><!-- %revisions_7_name% --></td>
<td>Created</td>
<td>2020-05-20</td>
<td>D. Rojas</td>
</tr>
<tr>
<td class="revno"><!-- %revisions_6% --></td>
<td><!-- %revisions_6_changelog% --></td>
<td><!-- %revisions_6_date% --></td>
<td><!-- %revisions_6_name% --></td>
<td>Approved</td>
<td>2020-05-20</td>
<td>D. Rojas</td>
</tr>
<tr>
<td class="revno"><!-- %revisions_5% --></td>
<td><!-- %revisions_5_changelog% --></td>
<td><!-- %revisions_5_date% --></td>
<td><!-- %revisions_5_name% --></td>
<td><!-- %authors_3% --></td>
<td><!-- %authors_3_date% --></td>
<td><!-- %authors_3_name% --></td>
</tr>
<tr>
<td class="revno"><!-- %revisions_4% --></td>
<td><!-- %revisions_4_changelog% --></td>
<td><!-- %revisions_4_date% --></td>
<td><!-- %revisions_4_name% --></td>
<td colspan="2"></td>
<td></td>
</tr>
<tr>
<td class="revno"><!-- %revisions_3% --></td>
<td><!-- %revisions_3_changelog% --></td>
<td><!-- %revisions_3_date% --></td>
<td><!-- %revisions_3_name% --></td>
<td class="company" colspan="3" rowspan="3"><!-- %company% --></td>
<td class="partno" colspan="2" rowspan="3">WV-DEMO-02</td>
<td class="sheetno" rowspan="2">Sheet<br />1</td>
</tr>
<tr>
<td class="revno"><!-- %revisions_2% --></td>
<td><!-- %revisions_2_changelog% --></td>
<td><!-- %revisions_2_date% --></td>
<td><!-- %revisions_2_name% --></td>
</tr>
<tr>
<td class="revno">A</td>
<td>WireViz 0.2 release</td>
<td>2020-10-17</td>
<td>D. Rojas</td>
<td class="sheetno">of 1</td>
</tr>
<tr>
<td>Rev</td>
<td>Changelog</td>
<td>Date</td>
<td>Name</td>
<td colspan="3"></td>
<td></td>
<td colspan="2"></td>
</tr>
</table>
</div> <!-- /titleblock -->
</div> <!-- /frame -->
</div> <!-- /page -->
</body>
</html>

BIN
examples/demo02.png generated

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

After

Width:  |  Height:  |  Size: 185 KiB

24
examples/demo02.svg generated
View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="882pt" height="767pt" <svg width="882pt" height="767pt"
@ -12,6 +12,7 @@
<g id="node1" class="node"> <g id="node1" class="node">
<title>X1</title> <title>X1</title>
<polygon fill="#ffffff" stroke="black" points="189.5,-517.5 2.5,-517.5 2.5,-287.5 189.5,-287.5 189.5,-517.5"/> <polygon fill="#ffffff" stroke="black" points="189.5,-517.5 2.5,-517.5 2.5,-287.5 189.5,-287.5 189.5,-517.5"/>
<polygon fill="#ffffff" stroke="transparent" points="2.5,-287.5 2.5,-517.5 189.5,-517.5 189.5,-287.5 2.5,-287.5"/>
<polygon fill="none" stroke="black" points="3,-494.5 3,-517.5 190,-517.5 190,-494.5 3,-494.5"/> <polygon fill="none" stroke="black" points="3,-494.5 3,-517.5 190,-517.5 190,-494.5 3,-494.5"/>
<text text-anchor="start" x="87.5" y="-502.3" font-family="arial" font-size="14.00">X1</text> <text text-anchor="start" x="87.5" y="-502.3" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="3,-471.5 3,-494.5 99,-494.5 99,-471.5 3,-471.5"/> <polygon fill="none" stroke="black" points="3,-471.5 3,-494.5 99,-494.5 99,-471.5 3,-471.5"/>
@ -258,6 +259,7 @@
<g id="node2" class="node"> <g id="node2" class="node">
<title>X2</title> <title>X2</title>
<polygon fill="#ffffff" stroke="black" points="874,-726.5 687,-726.5 687,-588.5 874,-588.5 874,-726.5"/> <polygon fill="#ffffff" stroke="black" points="874,-726.5 687,-726.5 687,-588.5 874,-588.5 874,-726.5"/>
<polygon fill="#ffffff" stroke="transparent" points="687,-588.5 687,-726.5 874,-726.5 874,-588.5 687,-588.5"/>
<polygon fill="none" stroke="black" points="687.5,-703.5 687.5,-726.5 874.5,-726.5 874.5,-703.5 687.5,-703.5"/> <polygon fill="none" stroke="black" points="687.5,-703.5 687.5,-726.5 874.5,-726.5 874.5,-703.5 687.5,-703.5"/>
<text text-anchor="start" x="772" y="-711.3" font-family="arial" font-size="14.00">X2</text> <text text-anchor="start" x="772" y="-711.3" font-family="arial" font-size="14.00">X2</text>
<polygon fill="none" stroke="black" points="687.5,-680.5 687.5,-703.5 783.5,-703.5 783.5,-680.5 687.5,-680.5"/> <polygon fill="none" stroke="black" points="687.5,-680.5 687.5,-703.5 783.5,-703.5 783.5,-680.5 687.5,-680.5"/>
@ -287,6 +289,7 @@
<g id="node3" class="node"> <g id="node3" class="node">
<title>X3</title> <title>X3</title>
<polygon fill="#ffffff" stroke="black" points="874,-518.5 687,-518.5 687,-380.5 874,-380.5 874,-518.5"/> <polygon fill="#ffffff" stroke="black" points="874,-518.5 687,-518.5 687,-380.5 874,-380.5 874,-518.5"/>
<polygon fill="#ffffff" stroke="transparent" points="687,-380.5 687,-518.5 874,-518.5 874,-380.5 687,-380.5"/>
<polygon fill="none" stroke="black" points="687.5,-495.5 687.5,-518.5 874.5,-518.5 874.5,-495.5 687.5,-495.5"/> <polygon fill="none" stroke="black" points="687.5,-495.5 687.5,-518.5 874.5,-518.5 874.5,-495.5 687.5,-495.5"/>
<text text-anchor="start" x="772" y="-503.3" font-family="arial" font-size="14.00">X3</text> <text text-anchor="start" x="772" y="-503.3" font-family="arial" font-size="14.00">X3</text>
<polygon fill="none" stroke="black" points="687.5,-472.5 687.5,-495.5 783.5,-495.5 783.5,-472.5 687.5,-472.5"/> <polygon fill="none" stroke="black" points="687.5,-472.5 687.5,-495.5 783.5,-495.5 783.5,-472.5 687.5,-472.5"/>
@ -316,6 +319,7 @@
<g id="node4" class="node"> <g id="node4" class="node">
<title>X4</title> <title>X4</title>
<polygon fill="#ffffff" stroke="black" points="874,-322 687,-322 687,-161 874,-161 874,-322"/> <polygon fill="#ffffff" stroke="black" points="874,-322 687,-322 687,-161 874,-161 874,-322"/>
<polygon fill="#ffffff" stroke="transparent" points="687,-161 687,-322 874,-322 874,-161 687,-161"/>
<polygon fill="none" stroke="black" points="687.5,-298.5 687.5,-321.5 874.5,-321.5 874.5,-298.5 687.5,-298.5"/> <polygon fill="none" stroke="black" points="687.5,-298.5 687.5,-321.5 874.5,-321.5 874.5,-298.5 687.5,-298.5"/>
<text text-anchor="start" x="772" y="-306.3" font-family="arial" font-size="14.00">X4</text> <text text-anchor="start" x="772" y="-306.3" font-family="arial" font-size="14.00">X4</text>
<polygon fill="none" stroke="black" points="687.5,-275.5 687.5,-298.5 783.5,-298.5 783.5,-275.5 687.5,-275.5"/> <polygon fill="none" stroke="black" points="687.5,-275.5 687.5,-298.5 783.5,-298.5 783.5,-275.5 687.5,-275.5"/>
@ -345,10 +349,11 @@
<polygon fill="none" stroke="black" points="767.5,-160.5 767.5,-183.5 874.5,-183.5 874.5,-160.5 767.5,-160.5"/> <polygon fill="none" stroke="black" points="767.5,-160.5 767.5,-183.5 874.5,-183.5 874.5,-160.5 767.5,-160.5"/>
<text text-anchor="start" x="806.5" y="-168.3" font-family="arial" font-size="14.00">SCK</text> <text text-anchor="start" x="806.5" y="-168.3" font-family="arial" font-size="14.00">SCK</text>
</g> </g>
<!-- _ferrule_crimp_1 --> <!-- AUTOGENERATED_F_1 -->
<g id="node5" class="node"> <g id="node5" class="node">
<title>_ferrule_crimp_1</title> <title>AUTOGENERATED_F_1</title>
<polygon fill="#ffffff" stroke="black" points="192,-70 0,-70 0,-47 192,-47 192,-70"/> <polygon fill="#ffffff" stroke="black" points="192,-70 0,-70 0,-47 192,-47 192,-70"/>
<polygon fill="#ffffff" stroke="transparent" points="0,-47 0,-70 192,-70 192,-47 0,-47"/>
<polygon fill="none" stroke="black" points="0,-46.5 0,-69.5 89,-69.5 89,-46.5 0,-46.5"/> <polygon fill="none" stroke="black" points="0,-46.5 0,-69.5 89,-69.5 89,-46.5 0,-46.5"/>
<text text-anchor="start" x="4" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
<polygon fill="none" stroke="black" points="89,-46.5 89,-69.5 157,-69.5 157,-46.5 89,-46.5"/> <polygon fill="none" stroke="black" points="89,-46.5 89,-69.5 157,-69.5 157,-46.5 89,-46.5"/>
@ -383,17 +388,18 @@
<polygon fill="#000000" stroke="transparent" points="340.5,-19.5 340.5,-21.5 539.5,-21.5 539.5,-19.5 340.5,-19.5"/> <polygon fill="#000000" stroke="transparent" points="340.5,-19.5 340.5,-21.5 539.5,-21.5 539.5,-19.5 340.5,-19.5"/>
<text text-anchor="start" x="351" y="-6.3" font-family="arial" font-size="14.00"> </text> <text text-anchor="start" x="351" y="-6.3" font-family="arial" font-size="14.00"> </text>
</g> </g>
<!-- _ferrule_crimp_1&#45;&#45;W4 --> <!-- AUTOGENERATED_F_1&#45;&#45;W4 -->
<g id="edge25" class="edge"> <g id="edge25" class="edge">
<title>_ferrule_crimp_1:e&#45;&#45;W4:w</title> <title>AUTOGENERATED_F_1:e&#45;&#45;W4:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M192,-56.5C256.61,-56.85 272.63,-45.85 339.5,-45.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M192,-56.5C256.61,-56.85 272.63,-45.85 339.5,-45.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M192,-58.5C257.74,-58.5 273.76,-47.5 339.5,-47.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M192,-58.5C257.74,-58.5 273.76,-47.5 339.5,-47.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M192,-60.5C258.87,-60.15 274.89,-49.15 339.5,-49.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M192,-60.5C258.87,-60.15 274.89,-49.15 339.5,-49.5"/>
</g> </g>
<!-- _ferrule_crimp_2 --> <!-- AUTOGENERATED_F_2 -->
<g id="node6" class="node"> <g id="node6" class="node">
<title>_ferrule_crimp_2</title> <title>AUTOGENERATED_F_2</title>
<polygon fill="#ffffff" stroke="black" points="192,-23 0,-23 0,0 192,0 192,-23"/> <polygon fill="#ffffff" stroke="black" points="192,-23 0,-23 0,0 192,0 192,-23"/>
<polygon fill="#ffffff" stroke="transparent" points="0,0 0,-23 192,-23 192,0 0,0"/>
<polygon fill="none" stroke="black" points="0,0.5 0,-22.5 89,-22.5 89,0.5 0,0.5"/> <polygon fill="none" stroke="black" points="0,0.5 0,-22.5 89,-22.5 89,0.5 0,0.5"/>
<text text-anchor="start" x="4" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
<polygon fill="none" stroke="black" points="89,0.5 89,-22.5 157,-22.5 157,0.5 89,0.5"/> <polygon fill="none" stroke="black" points="89,0.5 89,-22.5 157,-22.5 157,0.5 89,0.5"/>
@ -403,9 +409,9 @@
<polygon fill="#ffff00" stroke="transparent" points="184,0.5 184,-22.5 192,-22.5 192,0.5 184,0.5"/> <polygon fill="#ffff00" stroke="transparent" points="184,0.5 184,-22.5 192,-22.5 192,0.5 184,0.5"/>
<polygon fill="none" stroke="black" points="184,0.5 184,-22.5 192,-22.5 192,0.5 184,0.5"/> <polygon fill="none" stroke="black" points="184,0.5 184,-22.5 192,-22.5 192,0.5 184,0.5"/>
</g> </g>
<!-- _ferrule_crimp_2&#45;&#45;W4 --> <!-- AUTOGENERATED_F_2&#45;&#45;W4 -->
<g id="edge27" class="edge"> <g id="edge27" class="edge">
<title>_ferrule_crimp_2:e&#45;&#45;W4:w</title> <title>AUTOGENERATED_F_2:e&#45;&#45;W4:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M192,-9.5C258.87,-9.85 274.89,-20.85 339.5,-20.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M192,-9.5C258.87,-9.85 274.89,-20.85 339.5,-20.5"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M192,-11.5C257.74,-11.5 273.76,-22.5 339.5,-22.5"/> <path fill="none" stroke="#ff0000" stroke-width="2" d="M192,-11.5C257.74,-11.5 273.76,-22.5 339.5,-22.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M192,-13.5C256.61,-13.15 272.63,-24.15 339.5,-24.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M192,-13.5C256.61,-13.15 272.63,-24.15 339.5,-24.5"/>

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 41 KiB

73
examples/ex01.html generated
View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex01</title> <title>ex01</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex01</h1> <h1>ex01</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="943pt" height="232pt" <svg width="943pt" height="232pt"
@ -182,28 +205,40 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Cable, Serial, 4 x 0.25 mm&sup2; shielded</td> <td class="bom_col_description">Cable, Serial, 4 x 0.25 mm² shielded</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td> <td class="bom_col_qty">0.2</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 4 pins</td> <td class="bom_col_description">Connector, Molex KK 254, female, 4 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td> <td class="bom_col_qty">2</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1, X2</td> <td class="bom_col_designators">X1, X2</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

2
examples/ex01.svg generated
View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="943pt" height="232pt" <svg width="943pt" height="232pt"

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

93
examples/ex02.html generated
View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex02</title> <title>ex02</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex02</h1> <h1>ex02</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="881pt" height="458pt" <svg width="881pt" height="458pt"
@ -265,42 +288,54 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Cable, 2 x 0.25 mm&sup2;</td> <td class="bom_col_description">Cable, 2 x 0.25 mm²</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.4</td> <td class="bom_col_qty">0.4</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2</td> <td class="bom_col_designators">W1, W2</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Cable, 2 x 20 AWG</td> <td class="bom_col_description">Cable, 2 x 20 AWG</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td> <td class="bom_col_qty">0.2</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W3</td> <td class="bom_col_designators">W3</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex Micro-Fit, female, 2 pins</td> <td class="bom_col_description">Connector, Molex Micro-Fit, female, 2 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">3</td> <td class="bom_col_qty">3</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X2, X3, X4</td> <td class="bom_col_designators">X2, X3, X4</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">4</td> <td class="bom_col_id">4</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex Micro-Fit, male, 2 pins</td> <td class="bom_col_description">Connector, Molex Micro-Fit, male, 2 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1</td> <td class="bom_col_designators">X1</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

2
examples/ex02.svg generated
View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="881pt" height="458pt" <svg width="881pt" height="458pt"

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

93
examples/ex03.html generated
View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex03</title> <title>ex03</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex03</h1> <h1>ex03</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="873pt" height="332pt" <svg width="873pt" height="332pt"
@ -235,42 +258,54 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex Micro-Fit, female, 2 pins</td> <td class="bom_col_description">Connector, Molex Micro-Fit, female, 2 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">3</td> <td class="bom_col_qty">3</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X2, X3, X4</td> <td class="bom_col_designators">X2, X3, X4</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex Micro-Fit, male, 2 pins</td> <td class="bom_col_description">Connector, Molex Micro-Fit, male, 2 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1</td> <td class="bom_col_designators">X1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, BK</td> <td class="bom_col_description">Wire, 0.25 mm², BK</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.6</td> <td class="bom_col_qty">0.6</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">4</td> <td class="bom_col_id">4</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, RD</td> <td class="bom_col_description">Wire, 0.25 mm², RD</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.6</td> <td class="bom_col_qty">0.6</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

2
examples/ex03.svg generated
View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="873pt" height="332pt" <svg width="873pt" height="332pt"

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

48
examples/ex04.gv generated
View File

@ -4,7 +4,7 @@ graph {
graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2]
node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0]
edge [fontname=arial style=bold] edge [fontname=arial style=bold]
_ferrule_crimp_1 [label=< AUTOGENERATED_F_1 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -13,7 +13,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_2 [label=< AUTOGENERATED_F_2 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -22,7 +22,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_3 [label=< AUTOGENERATED_F_3 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -31,7 +31,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_4 [label=< AUTOGENERATED_F_4 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -40,7 +40,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_5 [label=< AUTOGENERATED_F_5 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -49,7 +49,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_6 [label=< AUTOGENERATED_F_6 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -58,7 +58,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_7 [label=< AUTOGENERATED_F_7 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -67,7 +67,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_8 [label=< AUTOGENERATED_F_8 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -76,7 +76,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_9 [label=< AUTOGENERATED_F_9 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -85,7 +85,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_10 [label=< AUTOGENERATED_F_10 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -94,7 +94,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_11 [label=< AUTOGENERATED_F_11 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -103,7 +103,7 @@ graph {
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
_ferrule_crimp_12 [label=< AUTOGENERATED_F_12 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
@ -113,23 +113,23 @@ graph {
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#895956:#000000"] edge [color="#000000:#895956:#000000"]
_ferrule_crimp_1:e -- W1:w1:w AUTOGENERATED_F_1:e -- W1:w1:w
W1:w1:e -- _ferrule_crimp_7:w W1:w1:e -- AUTOGENERATED_F_7:w
edge [color="#000000:#ff0000:#000000"] edge [color="#000000:#ff0000:#000000"]
_ferrule_crimp_2:e -- W1:w2:w AUTOGENERATED_F_2:e -- W1:w2:w
W1:w2:e -- _ferrule_crimp_8:w W1:w2:e -- AUTOGENERATED_F_8:w
edge [color="#000000:#ff8000:#000000"] edge [color="#000000:#ff8000:#000000"]
_ferrule_crimp_3:e -- W1:w3:w AUTOGENERATED_F_3:e -- W1:w3:w
W1:w3:e -- _ferrule_crimp_9:w W1:w3:e -- AUTOGENERATED_F_9:w
edge [color="#000000:#ffff00:#000000"] edge [color="#000000:#ffff00:#000000"]
_ferrule_crimp_4:e -- W1:w4:w AUTOGENERATED_F_4:e -- W1:w4:w
W1:w4:e -- _ferrule_crimp_10:w W1:w4:e -- AUTOGENERATED_F_10:w
edge [color="#000000:#00ff00:#000000"] edge [color="#000000:#00ff00:#000000"]
_ferrule_crimp_5:e -- W1:w5:w AUTOGENERATED_F_5:e -- W1:w5:w
W1:w5:e -- _ferrule_crimp_11:w W1:w5:e -- AUTOGENERATED_F_11:w
edge [color="#000000:#0066ff:#000000"] edge [color="#000000:#0066ff:#000000"]
_ferrule_crimp_6:e -- W1:w6:w AUTOGENERATED_F_6:e -- W1:w6:w
W1:w6:e -- _ferrule_crimp_12:w W1:w6:e -- AUTOGENERATED_F_12:w
W1 [label=< W1 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>

219
examples/ex04.html generated
View File

@ -3,20 +3,43 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex04</title> <title>ex04</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex04</h1> <h1>ex04</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="673pt" height="287pt" <svg width="673pt" height="287pt"
viewBox="0.00 0.00 673.00 286.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> viewBox="0.00 0.00 673.00 286.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 282.5)"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 282.5)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-282.5 669,-282.5 669,4 -4,4"/> <polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-282.5 669,-282.5 669,4 -4,4"/>
<!-- _ferrule_crimp_1 --> <!-- AUTOGENERATED_F_1 -->
<g id="node1" class="node"> <g id="node1" class="node">
<title>_ferrule_crimp_1</title> <title>AUTOGENERATED_F_1</title>
<polygon fill="#ffffff" stroke="black" points="89,-258 0,-258 0,-235 89,-235 89,-258"/> <polygon fill="#ffffff" stroke="black" points="89,-258 0,-258 0,-235 89,-235 89,-258"/>
<polygon fill="none" stroke="black" points="0.5,-234.5 0.5,-257.5 89.5,-257.5 89.5,-234.5 0.5,-234.5"/> <polygon fill="none" stroke="black" points="0.5,-234.5 0.5,-257.5 89.5,-257.5 89.5,-234.5 0.5,-234.5"/>
<text text-anchor="start" x="4.5" y="-242.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-242.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
@ -60,226 +83,238 @@
<polygon fill="#000000" stroke="transparent" points="233.5,-63.5 233.5,-65.5 432.5,-65.5 432.5,-63.5 233.5,-63.5"/> <polygon fill="#000000" stroke="transparent" points="233.5,-63.5 233.5,-65.5 432.5,-65.5 432.5,-63.5 233.5,-63.5"/>
<text text-anchor="start" x="256.5" y="-50.3" font-family="arial" font-size="14.00"> </text> <text text-anchor="start" x="256.5" y="-50.3" font-family="arial" font-size="14.00"> </text>
</g> </g>
<!-- _ferrule_crimp_1&#45;&#45;W1 --> <!-- AUTOGENERATED_F_1&#45;&#45;W1 -->
<g id="edge1" class="edge"> <g id="edge1" class="edge">
<title>_ferrule_crimp_1:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-244.5C155.53,-246.25 162.51,-191.25 233,-189.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-244.5C155.53,-246.25 162.51,-191.25 233,-189.5"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M89,-246.5C157.51,-246.5 164.49,-191.5 233,-191.5"/> <path fill="none" stroke="#895956" stroke-width="2" d="M89,-246.5C157.51,-246.5 164.49,-191.5 233,-191.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-248.5C159.49,-246.75 166.47,-191.75 233,-193.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-248.5C159.49,-246.75 166.47,-191.75 233,-193.5"/>
</g> </g>
<!-- _ferrule_crimp_2 --> <!-- AUTOGENERATED_F_2 -->
<g id="node2" class="node"> <g id="node2" class="node">
<title>_ferrule_crimp_2</title> <title>AUTOGENERATED_F_2</title>
<polygon fill="#ffffff" stroke="black" points="89,-211 0,-211 0,-188 89,-188 89,-211"/> <polygon fill="#ffffff" stroke="black" points="89,-211 0,-211 0,-188 89,-188 89,-211"/>
<polygon fill="none" stroke="black" points="0.5,-187.5 0.5,-210.5 89.5,-210.5 89.5,-187.5 0.5,-187.5"/> <polygon fill="none" stroke="black" points="0.5,-187.5 0.5,-210.5 89.5,-210.5 89.5,-187.5 0.5,-187.5"/>
<text text-anchor="start" x="4.5" y="-195.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-195.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_2&#45;&#45;W1 --> <!-- AUTOGENERATED_F_2&#45;&#45;W1 -->
<g id="edge3" class="edge"> <g id="edge3" class="edge">
<title>_ferrule_crimp_2:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_2:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-197.5C152.79,-198.78 165.47,-165.78 233,-164.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-197.5C152.79,-198.78 165.47,-165.78 233,-164.5"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M89,-199.5C154.66,-199.5 167.34,-166.5 233,-166.5"/> <path fill="none" stroke="#ff0000" stroke-width="2" d="M89,-199.5C154.66,-199.5 167.34,-166.5 233,-166.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-201.5C156.53,-200.22 169.21,-167.22 233,-168.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-201.5C156.53,-200.22 169.21,-167.22 233,-168.5"/>
</g> </g>
<!-- _ferrule_crimp_3 --> <!-- AUTOGENERATED_F_3 -->
<g id="node3" class="node"> <g id="node3" class="node">
<title>_ferrule_crimp_3</title> <title>AUTOGENERATED_F_3</title>
<polygon fill="#ffffff" stroke="black" points="89,-164 0,-164 0,-141 89,-141 89,-164"/> <polygon fill="#ffffff" stroke="black" points="89,-164 0,-164 0,-141 89,-141 89,-164"/>
<polygon fill="none" stroke="black" points="0.5,-140.5 0.5,-163.5 89.5,-163.5 89.5,-140.5 0.5,-140.5"/> <polygon fill="none" stroke="black" points="0.5,-140.5 0.5,-163.5 89.5,-163.5 89.5,-140.5 0.5,-140.5"/>
<text text-anchor="start" x="4.5" y="-148.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-148.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_3&#45;&#45;W1 --> <!-- AUTOGENERATED_F_3&#45;&#45;W1 -->
<g id="edge5" class="edge"> <g id="edge5" class="edge">
<title>_ferrule_crimp_3:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_3:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-150.5C152.04,-150.86 167.66,-139.86 233,-139.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-150.5C152.04,-150.86 167.66,-139.86 233,-139.5"/>
<path fill="none" stroke="#ff8000" stroke-width="2" d="M89,-152.5C153.19,-152.5 168.81,-141.5 233,-141.5"/> <path fill="none" stroke="#ff8000" stroke-width="2" d="M89,-152.5C153.19,-152.5 168.81,-141.5 233,-141.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-154.5C154.34,-154.14 169.96,-143.14 233,-143.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-154.5C154.34,-154.14 169.96,-143.14 233,-143.5"/>
</g> </g>
<!-- _ferrule_crimp_4 --> <!-- AUTOGENERATED_F_4 -->
<g id="node4" class="node"> <g id="node4" class="node">
<title>_ferrule_crimp_4</title> <title>AUTOGENERATED_F_4</title>
<polygon fill="#ffffff" stroke="black" points="89,-117 0,-117 0,-94 89,-94 89,-117"/> <polygon fill="#ffffff" stroke="black" points="89,-117 0,-117 0,-94 89,-94 89,-117"/>
<polygon fill="none" stroke="black" points="0.5,-93.5 0.5,-116.5 89.5,-116.5 89.5,-93.5 0.5,-93.5"/> <polygon fill="none" stroke="black" points="0.5,-93.5 0.5,-116.5 89.5,-116.5 89.5,-93.5 0.5,-93.5"/>
<text text-anchor="start" x="4.5" y="-101.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-101.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_4&#45;&#45;W1 --> <!-- AUTOGENERATED_F_4&#45;&#45;W1 -->
<g id="edge7" class="edge"> <g id="edge7" class="edge">
<title>_ferrule_crimp_4:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_4:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-103.5C154.34,-103.86 169.96,-114.86 233,-114.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-103.5C154.34,-103.86 169.96,-114.86 233,-114.5"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M89,-105.5C153.19,-105.5 168.81,-116.5 233,-116.5"/> <path fill="none" stroke="#ffff00" stroke-width="2" d="M89,-105.5C153.19,-105.5 168.81,-116.5 233,-116.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-107.5C152.04,-107.14 167.66,-118.14 233,-118.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-107.5C152.04,-107.14 167.66,-118.14 233,-118.5"/>
</g> </g>
<!-- _ferrule_crimp_5 --> <!-- AUTOGENERATED_F_5 -->
<g id="node5" class="node"> <g id="node5" class="node">
<title>_ferrule_crimp_5</title> <title>AUTOGENERATED_F_5</title>
<polygon fill="#ffffff" stroke="black" points="89,-70 0,-70 0,-47 89,-47 89,-70"/> <polygon fill="#ffffff" stroke="black" points="89,-70 0,-70 0,-47 89,-47 89,-70"/>
<polygon fill="none" stroke="black" points="0.5,-46.5 0.5,-69.5 89.5,-69.5 89.5,-46.5 0.5,-46.5"/> <polygon fill="none" stroke="black" points="0.5,-46.5 0.5,-69.5 89.5,-69.5 89.5,-46.5 0.5,-46.5"/>
<text text-anchor="start" x="4.5" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_5&#45;&#45;W1 --> <!-- AUTOGENERATED_F_5&#45;&#45;W1 -->
<g id="edge9" class="edge"> <g id="edge9" class="edge">
<title>_ferrule_crimp_5:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_5:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-56.5C156.53,-57.78 169.21,-90.78 233,-89.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-56.5C156.53,-57.78 169.21,-90.78 233,-89.5"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M89,-58.5C154.66,-58.5 167.34,-91.5 233,-91.5"/> <path fill="none" stroke="#00ff00" stroke-width="2" d="M89,-58.5C154.66,-58.5 167.34,-91.5 233,-91.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-60.5C152.79,-59.22 165.47,-92.22 233,-93.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-60.5C152.79,-59.22 165.47,-92.22 233,-93.5"/>
</g> </g>
<!-- _ferrule_crimp_6 --> <!-- AUTOGENERATED_F_6 -->
<g id="node6" class="node"> <g id="node6" class="node">
<title>_ferrule_crimp_6</title> <title>AUTOGENERATED_F_6</title>
<polygon fill="#ffffff" stroke="black" points="89,-23 0,-23 0,0 89,0 89,-23"/> <polygon fill="#ffffff" stroke="black" points="89,-23 0,-23 0,0 89,0 89,-23"/>
<polygon fill="none" stroke="black" points="0.5,0.5 0.5,-22.5 89.5,-22.5 89.5,0.5 0.5,0.5"/> <polygon fill="none" stroke="black" points="0.5,0.5 0.5,-22.5 89.5,-22.5 89.5,0.5 0.5,0.5"/>
<text text-anchor="start" x="4.5" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_6&#45;&#45;W1 --> <!-- AUTOGENERATED_F_6&#45;&#45;W1 -->
<g id="edge11" class="edge"> <g id="edge11" class="edge">
<title>_ferrule_crimp_6:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_6:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-9.5C159.49,-11.25 166.47,-66.25 233,-64.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-9.5C159.49,-11.25 166.47,-66.25 233,-64.5"/>
<path fill="none" stroke="#0066ff" stroke-width="2" d="M89,-11.5C157.51,-11.5 164.49,-66.5 233,-66.5"/> <path fill="none" stroke="#0066ff" stroke-width="2" d="M89,-11.5C157.51,-11.5 164.49,-66.5 233,-66.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-13.5C155.53,-11.75 162.51,-66.75 233,-68.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-13.5C155.53,-11.75 162.51,-66.75 233,-68.5"/>
</g> </g>
<!-- _ferrule_crimp_7 --> <!-- AUTOGENERATED_F_7 -->
<g id="node7" class="node"> <g id="node7" class="node">
<title>_ferrule_crimp_7</title> <title>AUTOGENERATED_F_7</title>
<polygon fill="#ffffff" stroke="black" points="665,-258 576,-258 576,-235 665,-235 665,-258"/> <polygon fill="#ffffff" stroke="black" points="665,-258 576,-258 576,-235 665,-235 665,-258"/>
<polygon fill="none" stroke="black" points="576.5,-234.5 576.5,-257.5 665.5,-257.5 665.5,-234.5 576.5,-234.5"/> <polygon fill="none" stroke="black" points="576.5,-234.5 576.5,-257.5 665.5,-257.5 665.5,-234.5 576.5,-234.5"/>
<text text-anchor="start" x="580.5" y="-242.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="580.5" y="-242.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_8 --> <!-- AUTOGENERATED_F_8 -->
<g id="node8" class="node"> <g id="node8" class="node">
<title>_ferrule_crimp_8</title> <title>AUTOGENERATED_F_8</title>
<polygon fill="#ffffff" stroke="black" points="665,-211 576,-211 576,-188 665,-188 665,-211"/> <polygon fill="#ffffff" stroke="black" points="665,-211 576,-211 576,-188 665,-188 665,-211"/>
<polygon fill="none" stroke="black" points="576.5,-187.5 576.5,-210.5 665.5,-210.5 665.5,-187.5 576.5,-187.5"/> <polygon fill="none" stroke="black" points="576.5,-187.5 576.5,-210.5 665.5,-210.5 665.5,-187.5 576.5,-187.5"/>
<text text-anchor="start" x="580.5" y="-195.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="580.5" y="-195.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_9 --> <!-- AUTOGENERATED_F_9 -->
<g id="node9" class="node"> <g id="node9" class="node">
<title>_ferrule_crimp_9</title> <title>AUTOGENERATED_F_9</title>
<polygon fill="#ffffff" stroke="black" points="665,-164 576,-164 576,-141 665,-141 665,-164"/> <polygon fill="#ffffff" stroke="black" points="665,-164 576,-164 576,-141 665,-141 665,-164"/>
<polygon fill="none" stroke="black" points="576.5,-140.5 576.5,-163.5 665.5,-163.5 665.5,-140.5 576.5,-140.5"/> <polygon fill="none" stroke="black" points="576.5,-140.5 576.5,-163.5 665.5,-163.5 665.5,-140.5 576.5,-140.5"/>
<text text-anchor="start" x="580.5" y="-148.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="580.5" y="-148.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_10 --> <!-- AUTOGENERATED_F_10 -->
<g id="node10" class="node"> <g id="node10" class="node">
<title>_ferrule_crimp_10</title> <title>AUTOGENERATED_F_10</title>
<polygon fill="#ffffff" stroke="black" points="665,-117 576,-117 576,-94 665,-94 665,-117"/> <polygon fill="#ffffff" stroke="black" points="665,-117 576,-117 576,-94 665,-94 665,-117"/>
<polygon fill="none" stroke="black" points="576.5,-93.5 576.5,-116.5 665.5,-116.5 665.5,-93.5 576.5,-93.5"/> <polygon fill="none" stroke="black" points="576.5,-93.5 576.5,-116.5 665.5,-116.5 665.5,-93.5 576.5,-93.5"/>
<text text-anchor="start" x="580.5" y="-101.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="580.5" y="-101.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_11 --> <!-- AUTOGENERATED_F_11 -->
<g id="node11" class="node"> <g id="node11" class="node">
<title>_ferrule_crimp_11</title> <title>AUTOGENERATED_F_11</title>
<polygon fill="#ffffff" stroke="black" points="665,-70 576,-70 576,-47 665,-47 665,-70"/> <polygon fill="#ffffff" stroke="black" points="665,-70 576,-70 576,-47 665,-47 665,-70"/>
<polygon fill="none" stroke="black" points="576.5,-46.5 576.5,-69.5 665.5,-69.5 665.5,-46.5 576.5,-46.5"/> <polygon fill="none" stroke="black" points="576.5,-46.5 576.5,-69.5 665.5,-69.5 665.5,-46.5 576.5,-46.5"/>
<text text-anchor="start" x="580.5" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="580.5" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_12 --> <!-- AUTOGENERATED_F_12 -->
<g id="node12" class="node"> <g id="node12" class="node">
<title>_ferrule_crimp_12</title> <title>AUTOGENERATED_F_12</title>
<polygon fill="#ffffff" stroke="black" points="665,-23 576,-23 576,0 665,0 665,-23"/> <polygon fill="#ffffff" stroke="black" points="665,-23 576,-23 576,0 665,0 665,-23"/>
<polygon fill="none" stroke="black" points="576.5,0.5 576.5,-22.5 665.5,-22.5 665.5,0.5 576.5,0.5"/> <polygon fill="none" stroke="black" points="576.5,0.5 576.5,-22.5 665.5,-22.5 665.5,0.5 576.5,0.5"/>
<text text-anchor="start" x="580.5" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="580.5" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- W1&#45;&#45;_ferrule_crimp_7 --> <!-- W1&#45;&#45;AUTOGENERATED_F_7 -->
<g id="edge2" class="edge"> <g id="edge2" class="edge">
<title>W1:e&#45;&#45;_ferrule_crimp_7:w</title> <title>W1:e&#45;&#45;AUTOGENERATED_F_7:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-189.5C502.49,-191.25 509.47,-246.25 576,-244.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-189.5C502.49,-191.25 509.47,-246.25 576,-244.5"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M432,-191.5C500.51,-191.5 507.49,-246.5 576,-246.5"/> <path fill="none" stroke="#895956" stroke-width="2" d="M432,-191.5C500.51,-191.5 507.49,-246.5 576,-246.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-193.5C498.53,-191.75 505.51,-246.75 576,-248.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-193.5C498.53,-191.75 505.51,-246.75 576,-248.5"/>
</g> </g>
<!-- W1&#45;&#45;_ferrule_crimp_8 --> <!-- W1&#45;&#45;AUTOGENERATED_F_8 -->
<g id="edge4" class="edge"> <g id="edge4" class="edge">
<title>W1:e&#45;&#45;_ferrule_crimp_8:w</title> <title>W1:e&#45;&#45;AUTOGENERATED_F_8:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-164.5C499.53,-165.78 512.21,-198.78 576,-197.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-164.5C499.53,-165.78 512.21,-198.78 576,-197.5"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M432,-166.5C497.66,-166.5 510.34,-199.5 576,-199.5"/> <path fill="none" stroke="#ff0000" stroke-width="2" d="M432,-166.5C497.66,-166.5 510.34,-199.5 576,-199.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-168.5C495.79,-167.22 508.47,-200.22 576,-201.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-168.5C495.79,-167.22 508.47,-200.22 576,-201.5"/>
</g> </g>
<!-- W1&#45;&#45;_ferrule_crimp_9 --> <!-- W1&#45;&#45;AUTOGENERATED_F_9 -->
<g id="edge6" class="edge"> <g id="edge6" class="edge">
<title>W1:e&#45;&#45;_ferrule_crimp_9:w</title> <title>W1:e&#45;&#45;AUTOGENERATED_F_9:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-139.5C497.34,-139.86 512.96,-150.86 576,-150.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-139.5C497.34,-139.86 512.96,-150.86 576,-150.5"/>
<path fill="none" stroke="#ff8000" stroke-width="2" d="M432,-141.5C496.19,-141.5 511.81,-152.5 576,-152.5"/> <path fill="none" stroke="#ff8000" stroke-width="2" d="M432,-141.5C496.19,-141.5 511.81,-152.5 576,-152.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-143.5C495.04,-143.14 510.66,-154.14 576,-154.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-143.5C495.04,-143.14 510.66,-154.14 576,-154.5"/>
</g> </g>
<!-- W1&#45;&#45;_ferrule_crimp_10 --> <!-- W1&#45;&#45;AUTOGENERATED_F_10 -->
<g id="edge8" class="edge"> <g id="edge8" class="edge">
<title>W1:e&#45;&#45;_ferrule_crimp_10:w</title> <title>W1:e&#45;&#45;AUTOGENERATED_F_10:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-114.5C495.04,-114.86 510.66,-103.86 576,-103.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-114.5C495.04,-114.86 510.66,-103.86 576,-103.5"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M432,-116.5C496.19,-116.5 511.81,-105.5 576,-105.5"/> <path fill="none" stroke="#ffff00" stroke-width="2" d="M432,-116.5C496.19,-116.5 511.81,-105.5 576,-105.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-118.5C497.34,-118.14 512.96,-107.14 576,-107.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-118.5C497.34,-118.14 512.96,-107.14 576,-107.5"/>
</g> </g>
<!-- W1&#45;&#45;_ferrule_crimp_11 --> <!-- W1&#45;&#45;AUTOGENERATED_F_11 -->
<g id="edge10" class="edge"> <g id="edge10" class="edge">
<title>W1:e&#45;&#45;_ferrule_crimp_11:w</title> <title>W1:e&#45;&#45;AUTOGENERATED_F_11:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-89.5C495.79,-90.78 508.47,-57.78 576,-56.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-89.5C495.79,-90.78 508.47,-57.78 576,-56.5"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M432,-91.5C497.66,-91.5 510.34,-58.5 576,-58.5"/> <path fill="none" stroke="#00ff00" stroke-width="2" d="M432,-91.5C497.66,-91.5 510.34,-58.5 576,-58.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-93.5C499.53,-92.22 512.21,-59.22 576,-60.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-93.5C499.53,-92.22 512.21,-59.22 576,-60.5"/>
</g> </g>
<!-- W1&#45;&#45;_ferrule_crimp_12 --> <!-- W1&#45;&#45;AUTOGENERATED_F_12 -->
<g id="edge12" class="edge"> <g id="edge12" class="edge">
<title>W1:e&#45;&#45;_ferrule_crimp_12:w</title> <title>W1:e&#45;&#45;AUTOGENERATED_F_12:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-64.5C498.53,-66.25 505.51,-11.25 576,-9.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-64.5C498.53,-66.25 505.51,-11.25 576,-9.5"/>
<path fill="none" stroke="#0066ff" stroke-width="2" d="M432,-66.5C500.51,-66.5 507.49,-11.5 576,-11.5"/> <path fill="none" stroke="#0066ff" stroke-width="2" d="M432,-66.5C500.51,-66.5 507.49,-11.5 576,-11.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-68.5C502.49,-66.75 509.47,-11.75 576,-13.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-68.5C502.49,-66.75 509.47,-11.75 576,-13.5"/>
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Crimp ferrule</td> <td class="bom_col_description">Connector, Crimp ferrule</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">12</td> <td class="bom_col_qty">12</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_designators"></td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, BN</td> <td class="bom_col_description">Wire, 0.25 mm², BN</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td> <td class="bom_col_qty">0.2</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, BU</td> <td class="bom_col_description">Wire, 0.25 mm², BU</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td> <td class="bom_col_qty">0.2</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">4</td> <td class="bom_col_id">4</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, GN</td> <td class="bom_col_description">Wire, 0.25 mm², GN</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td> <td class="bom_col_qty">0.2</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">5</td> <td class="bom_col_id">5</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, OG</td> <td class="bom_col_description">Wire, 0.25 mm², OG</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td> <td class="bom_col_qty">0.2</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">6</td> <td class="bom_col_id">6</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, RD</td> <td class="bom_col_description">Wire, 0.25 mm², RD</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td> <td class="bom_col_qty">0.2</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">7</td> <td class="bom_col_id">7</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, YE</td> <td class="bom_col_description">Wire, 0.25 mm², YE</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td> <td class="bom_col_qty">0.2</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

98
examples/ex04.svg generated
View File

@ -1,16 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="673pt" height="287pt" <svg width="673pt" height="287pt"
viewBox="0.00 0.00 673.00 286.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> viewBox="0.00 0.00 673.00 286.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 282.5)"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 282.5)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-282.5 669,-282.5 669,4 -4,4"/> <polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-282.5 669,-282.5 669,4 -4,4"/>
<!-- _ferrule_crimp_1 --> <!-- AUTOGENERATED_F_1 -->
<g id="node1" class="node"> <g id="node1" class="node">
<title>_ferrule_crimp_1</title> <title>AUTOGENERATED_F_1</title>
<polygon fill="#ffffff" stroke="black" points="89,-258 0,-258 0,-235 89,-235 89,-258"/> <polygon fill="#ffffff" stroke="black" points="89,-258 0,-258 0,-235 89,-235 89,-258"/>
<polygon fill="none" stroke="black" points="0.5,-234.5 0.5,-257.5 89.5,-257.5 89.5,-234.5 0.5,-234.5"/> <polygon fill="none" stroke="black" points="0.5,-234.5 0.5,-257.5 89.5,-257.5 89.5,-234.5 0.5,-234.5"/>
<text text-anchor="start" x="4.5" y="-242.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-242.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
@ -54,163 +54,163 @@
<polygon fill="#000000" stroke="transparent" points="233.5,-63.5 233.5,-65.5 432.5,-65.5 432.5,-63.5 233.5,-63.5"/> <polygon fill="#000000" stroke="transparent" points="233.5,-63.5 233.5,-65.5 432.5,-65.5 432.5,-63.5 233.5,-63.5"/>
<text text-anchor="start" x="256.5" y="-50.3" font-family="arial" font-size="14.00"> </text> <text text-anchor="start" x="256.5" y="-50.3" font-family="arial" font-size="14.00"> </text>
</g> </g>
<!-- _ferrule_crimp_1&#45;&#45;W1 --> <!-- AUTOGENERATED_F_1&#45;&#45;W1 -->
<g id="edge1" class="edge"> <g id="edge1" class="edge">
<title>_ferrule_crimp_1:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-244.5C155.53,-246.25 162.51,-191.25 233,-189.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-244.5C155.53,-246.25 162.51,-191.25 233,-189.5"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M89,-246.5C157.51,-246.5 164.49,-191.5 233,-191.5"/> <path fill="none" stroke="#895956" stroke-width="2" d="M89,-246.5C157.51,-246.5 164.49,-191.5 233,-191.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-248.5C159.49,-246.75 166.47,-191.75 233,-193.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-248.5C159.49,-246.75 166.47,-191.75 233,-193.5"/>
</g> </g>
<!-- _ferrule_crimp_2 --> <!-- AUTOGENERATED_F_2 -->
<g id="node2" class="node"> <g id="node2" class="node">
<title>_ferrule_crimp_2</title> <title>AUTOGENERATED_F_2</title>
<polygon fill="#ffffff" stroke="black" points="89,-211 0,-211 0,-188 89,-188 89,-211"/> <polygon fill="#ffffff" stroke="black" points="89,-211 0,-211 0,-188 89,-188 89,-211"/>
<polygon fill="none" stroke="black" points="0.5,-187.5 0.5,-210.5 89.5,-210.5 89.5,-187.5 0.5,-187.5"/> <polygon fill="none" stroke="black" points="0.5,-187.5 0.5,-210.5 89.5,-210.5 89.5,-187.5 0.5,-187.5"/>
<text text-anchor="start" x="4.5" y="-195.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-195.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_2&#45;&#45;W1 --> <!-- AUTOGENERATED_F_2&#45;&#45;W1 -->
<g id="edge3" class="edge"> <g id="edge3" class="edge">
<title>_ferrule_crimp_2:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_2:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-197.5C152.79,-198.78 165.47,-165.78 233,-164.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-197.5C152.79,-198.78 165.47,-165.78 233,-164.5"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M89,-199.5C154.66,-199.5 167.34,-166.5 233,-166.5"/> <path fill="none" stroke="#ff0000" stroke-width="2" d="M89,-199.5C154.66,-199.5 167.34,-166.5 233,-166.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-201.5C156.53,-200.22 169.21,-167.22 233,-168.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-201.5C156.53,-200.22 169.21,-167.22 233,-168.5"/>
</g> </g>
<!-- _ferrule_crimp_3 --> <!-- AUTOGENERATED_F_3 -->
<g id="node3" class="node"> <g id="node3" class="node">
<title>_ferrule_crimp_3</title> <title>AUTOGENERATED_F_3</title>
<polygon fill="#ffffff" stroke="black" points="89,-164 0,-164 0,-141 89,-141 89,-164"/> <polygon fill="#ffffff" stroke="black" points="89,-164 0,-164 0,-141 89,-141 89,-164"/>
<polygon fill="none" stroke="black" points="0.5,-140.5 0.5,-163.5 89.5,-163.5 89.5,-140.5 0.5,-140.5"/> <polygon fill="none" stroke="black" points="0.5,-140.5 0.5,-163.5 89.5,-163.5 89.5,-140.5 0.5,-140.5"/>
<text text-anchor="start" x="4.5" y="-148.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-148.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_3&#45;&#45;W1 --> <!-- AUTOGENERATED_F_3&#45;&#45;W1 -->
<g id="edge5" class="edge"> <g id="edge5" class="edge">
<title>_ferrule_crimp_3:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_3:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-150.5C152.04,-150.86 167.66,-139.86 233,-139.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-150.5C152.04,-150.86 167.66,-139.86 233,-139.5"/>
<path fill="none" stroke="#ff8000" stroke-width="2" d="M89,-152.5C153.19,-152.5 168.81,-141.5 233,-141.5"/> <path fill="none" stroke="#ff8000" stroke-width="2" d="M89,-152.5C153.19,-152.5 168.81,-141.5 233,-141.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-154.5C154.34,-154.14 169.96,-143.14 233,-143.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-154.5C154.34,-154.14 169.96,-143.14 233,-143.5"/>
</g> </g>
<!-- _ferrule_crimp_4 --> <!-- AUTOGENERATED_F_4 -->
<g id="node4" class="node"> <g id="node4" class="node">
<title>_ferrule_crimp_4</title> <title>AUTOGENERATED_F_4</title>
<polygon fill="#ffffff" stroke="black" points="89,-117 0,-117 0,-94 89,-94 89,-117"/> <polygon fill="#ffffff" stroke="black" points="89,-117 0,-117 0,-94 89,-94 89,-117"/>
<polygon fill="none" stroke="black" points="0.5,-93.5 0.5,-116.5 89.5,-116.5 89.5,-93.5 0.5,-93.5"/> <polygon fill="none" stroke="black" points="0.5,-93.5 0.5,-116.5 89.5,-116.5 89.5,-93.5 0.5,-93.5"/>
<text text-anchor="start" x="4.5" y="-101.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-101.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_4&#45;&#45;W1 --> <!-- AUTOGENERATED_F_4&#45;&#45;W1 -->
<g id="edge7" class="edge"> <g id="edge7" class="edge">
<title>_ferrule_crimp_4:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_4:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-103.5C154.34,-103.86 169.96,-114.86 233,-114.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-103.5C154.34,-103.86 169.96,-114.86 233,-114.5"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M89,-105.5C153.19,-105.5 168.81,-116.5 233,-116.5"/> <path fill="none" stroke="#ffff00" stroke-width="2" d="M89,-105.5C153.19,-105.5 168.81,-116.5 233,-116.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-107.5C152.04,-107.14 167.66,-118.14 233,-118.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-107.5C152.04,-107.14 167.66,-118.14 233,-118.5"/>
</g> </g>
<!-- _ferrule_crimp_5 --> <!-- AUTOGENERATED_F_5 -->
<g id="node5" class="node"> <g id="node5" class="node">
<title>_ferrule_crimp_5</title> <title>AUTOGENERATED_F_5</title>
<polygon fill="#ffffff" stroke="black" points="89,-70 0,-70 0,-47 89,-47 89,-70"/> <polygon fill="#ffffff" stroke="black" points="89,-70 0,-70 0,-47 89,-47 89,-70"/>
<polygon fill="none" stroke="black" points="0.5,-46.5 0.5,-69.5 89.5,-69.5 89.5,-46.5 0.5,-46.5"/> <polygon fill="none" stroke="black" points="0.5,-46.5 0.5,-69.5 89.5,-69.5 89.5,-46.5 0.5,-46.5"/>
<text text-anchor="start" x="4.5" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_5&#45;&#45;W1 --> <!-- AUTOGENERATED_F_5&#45;&#45;W1 -->
<g id="edge9" class="edge"> <g id="edge9" class="edge">
<title>_ferrule_crimp_5:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_5:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-56.5C156.53,-57.78 169.21,-90.78 233,-89.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-56.5C156.53,-57.78 169.21,-90.78 233,-89.5"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M89,-58.5C154.66,-58.5 167.34,-91.5 233,-91.5"/> <path fill="none" stroke="#00ff00" stroke-width="2" d="M89,-58.5C154.66,-58.5 167.34,-91.5 233,-91.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-60.5C152.79,-59.22 165.47,-92.22 233,-93.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-60.5C152.79,-59.22 165.47,-92.22 233,-93.5"/>
</g> </g>
<!-- _ferrule_crimp_6 --> <!-- AUTOGENERATED_F_6 -->
<g id="node6" class="node"> <g id="node6" class="node">
<title>_ferrule_crimp_6</title> <title>AUTOGENERATED_F_6</title>
<polygon fill="#ffffff" stroke="black" points="89,-23 0,-23 0,0 89,0 89,-23"/> <polygon fill="#ffffff" stroke="black" points="89,-23 0,-23 0,0 89,0 89,-23"/>
<polygon fill="none" stroke="black" points="0.5,0.5 0.5,-22.5 89.5,-22.5 89.5,0.5 0.5,0.5"/> <polygon fill="none" stroke="black" points="0.5,0.5 0.5,-22.5 89.5,-22.5 89.5,0.5 0.5,0.5"/>
<text text-anchor="start" x="4.5" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_6&#45;&#45;W1 --> <!-- AUTOGENERATED_F_6&#45;&#45;W1 -->
<g id="edge11" class="edge"> <g id="edge11" class="edge">
<title>_ferrule_crimp_6:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_6:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-9.5C159.49,-11.25 166.47,-66.25 233,-64.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-9.5C159.49,-11.25 166.47,-66.25 233,-64.5"/>
<path fill="none" stroke="#0066ff" stroke-width="2" d="M89,-11.5C157.51,-11.5 164.49,-66.5 233,-66.5"/> <path fill="none" stroke="#0066ff" stroke-width="2" d="M89,-11.5C157.51,-11.5 164.49,-66.5 233,-66.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M89,-13.5C155.53,-11.75 162.51,-66.75 233,-68.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M89,-13.5C155.53,-11.75 162.51,-66.75 233,-68.5"/>
</g> </g>
<!-- _ferrule_crimp_7 --> <!-- AUTOGENERATED_F_7 -->
<g id="node7" class="node"> <g id="node7" class="node">
<title>_ferrule_crimp_7</title> <title>AUTOGENERATED_F_7</title>
<polygon fill="#ffffff" stroke="black" points="665,-258 576,-258 576,-235 665,-235 665,-258"/> <polygon fill="#ffffff" stroke="black" points="665,-258 576,-258 576,-235 665,-235 665,-258"/>
<polygon fill="none" stroke="black" points="576.5,-234.5 576.5,-257.5 665.5,-257.5 665.5,-234.5 576.5,-234.5"/> <polygon fill="none" stroke="black" points="576.5,-234.5 576.5,-257.5 665.5,-257.5 665.5,-234.5 576.5,-234.5"/>
<text text-anchor="start" x="580.5" y="-242.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="580.5" y="-242.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_8 --> <!-- AUTOGENERATED_F_8 -->
<g id="node8" class="node"> <g id="node8" class="node">
<title>_ferrule_crimp_8</title> <title>AUTOGENERATED_F_8</title>
<polygon fill="#ffffff" stroke="black" points="665,-211 576,-211 576,-188 665,-188 665,-211"/> <polygon fill="#ffffff" stroke="black" points="665,-211 576,-211 576,-188 665,-188 665,-211"/>
<polygon fill="none" stroke="black" points="576.5,-187.5 576.5,-210.5 665.5,-210.5 665.5,-187.5 576.5,-187.5"/> <polygon fill="none" stroke="black" points="576.5,-187.5 576.5,-210.5 665.5,-210.5 665.5,-187.5 576.5,-187.5"/>
<text text-anchor="start" x="580.5" y="-195.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="580.5" y="-195.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_9 --> <!-- AUTOGENERATED_F_9 -->
<g id="node9" class="node"> <g id="node9" class="node">
<title>_ferrule_crimp_9</title> <title>AUTOGENERATED_F_9</title>
<polygon fill="#ffffff" stroke="black" points="665,-164 576,-164 576,-141 665,-141 665,-164"/> <polygon fill="#ffffff" stroke="black" points="665,-164 576,-164 576,-141 665,-141 665,-164"/>
<polygon fill="none" stroke="black" points="576.5,-140.5 576.5,-163.5 665.5,-163.5 665.5,-140.5 576.5,-140.5"/> <polygon fill="none" stroke="black" points="576.5,-140.5 576.5,-163.5 665.5,-163.5 665.5,-140.5 576.5,-140.5"/>
<text text-anchor="start" x="580.5" y="-148.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="580.5" y="-148.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_10 --> <!-- AUTOGENERATED_F_10 -->
<g id="node10" class="node"> <g id="node10" class="node">
<title>_ferrule_crimp_10</title> <title>AUTOGENERATED_F_10</title>
<polygon fill="#ffffff" stroke="black" points="665,-117 576,-117 576,-94 665,-94 665,-117"/> <polygon fill="#ffffff" stroke="black" points="665,-117 576,-117 576,-94 665,-94 665,-117"/>
<polygon fill="none" stroke="black" points="576.5,-93.5 576.5,-116.5 665.5,-116.5 665.5,-93.5 576.5,-93.5"/> <polygon fill="none" stroke="black" points="576.5,-93.5 576.5,-116.5 665.5,-116.5 665.5,-93.5 576.5,-93.5"/>
<text text-anchor="start" x="580.5" y="-101.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="580.5" y="-101.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_11 --> <!-- AUTOGENERATED_F_11 -->
<g id="node11" class="node"> <g id="node11" class="node">
<title>_ferrule_crimp_11</title> <title>AUTOGENERATED_F_11</title>
<polygon fill="#ffffff" stroke="black" points="665,-70 576,-70 576,-47 665,-47 665,-70"/> <polygon fill="#ffffff" stroke="black" points="665,-70 576,-70 576,-47 665,-47 665,-70"/>
<polygon fill="none" stroke="black" points="576.5,-46.5 576.5,-69.5 665.5,-69.5 665.5,-46.5 576.5,-46.5"/> <polygon fill="none" stroke="black" points="576.5,-46.5 576.5,-69.5 665.5,-69.5 665.5,-46.5 576.5,-46.5"/>
<text text-anchor="start" x="580.5" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="580.5" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- _ferrule_crimp_12 --> <!-- AUTOGENERATED_F_12 -->
<g id="node12" class="node"> <g id="node12" class="node">
<title>_ferrule_crimp_12</title> <title>AUTOGENERATED_F_12</title>
<polygon fill="#ffffff" stroke="black" points="665,-23 576,-23 576,0 665,0 665,-23"/> <polygon fill="#ffffff" stroke="black" points="665,-23 576,-23 576,0 665,0 665,-23"/>
<polygon fill="none" stroke="black" points="576.5,0.5 576.5,-22.5 665.5,-22.5 665.5,0.5 576.5,0.5"/> <polygon fill="none" stroke="black" points="576.5,0.5 576.5,-22.5 665.5,-22.5 665.5,0.5 576.5,0.5"/>
<text text-anchor="start" x="580.5" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="580.5" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
</g> </g>
<!-- W1&#45;&#45;_ferrule_crimp_7 --> <!-- W1&#45;&#45;AUTOGENERATED_F_7 -->
<g id="edge2" class="edge"> <g id="edge2" class="edge">
<title>W1:e&#45;&#45;_ferrule_crimp_7:w</title> <title>W1:e&#45;&#45;AUTOGENERATED_F_7:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-189.5C502.49,-191.25 509.47,-246.25 576,-244.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-189.5C502.49,-191.25 509.47,-246.25 576,-244.5"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M432,-191.5C500.51,-191.5 507.49,-246.5 576,-246.5"/> <path fill="none" stroke="#895956" stroke-width="2" d="M432,-191.5C500.51,-191.5 507.49,-246.5 576,-246.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-193.5C498.53,-191.75 505.51,-246.75 576,-248.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-193.5C498.53,-191.75 505.51,-246.75 576,-248.5"/>
</g> </g>
<!-- W1&#45;&#45;_ferrule_crimp_8 --> <!-- W1&#45;&#45;AUTOGENERATED_F_8 -->
<g id="edge4" class="edge"> <g id="edge4" class="edge">
<title>W1:e&#45;&#45;_ferrule_crimp_8:w</title> <title>W1:e&#45;&#45;AUTOGENERATED_F_8:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-164.5C499.53,-165.78 512.21,-198.78 576,-197.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-164.5C499.53,-165.78 512.21,-198.78 576,-197.5"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M432,-166.5C497.66,-166.5 510.34,-199.5 576,-199.5"/> <path fill="none" stroke="#ff0000" stroke-width="2" d="M432,-166.5C497.66,-166.5 510.34,-199.5 576,-199.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-168.5C495.79,-167.22 508.47,-200.22 576,-201.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-168.5C495.79,-167.22 508.47,-200.22 576,-201.5"/>
</g> </g>
<!-- W1&#45;&#45;_ferrule_crimp_9 --> <!-- W1&#45;&#45;AUTOGENERATED_F_9 -->
<g id="edge6" class="edge"> <g id="edge6" class="edge">
<title>W1:e&#45;&#45;_ferrule_crimp_9:w</title> <title>W1:e&#45;&#45;AUTOGENERATED_F_9:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-139.5C497.34,-139.86 512.96,-150.86 576,-150.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-139.5C497.34,-139.86 512.96,-150.86 576,-150.5"/>
<path fill="none" stroke="#ff8000" stroke-width="2" d="M432,-141.5C496.19,-141.5 511.81,-152.5 576,-152.5"/> <path fill="none" stroke="#ff8000" stroke-width="2" d="M432,-141.5C496.19,-141.5 511.81,-152.5 576,-152.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-143.5C495.04,-143.14 510.66,-154.14 576,-154.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-143.5C495.04,-143.14 510.66,-154.14 576,-154.5"/>
</g> </g>
<!-- W1&#45;&#45;_ferrule_crimp_10 --> <!-- W1&#45;&#45;AUTOGENERATED_F_10 -->
<g id="edge8" class="edge"> <g id="edge8" class="edge">
<title>W1:e&#45;&#45;_ferrule_crimp_10:w</title> <title>W1:e&#45;&#45;AUTOGENERATED_F_10:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-114.5C495.04,-114.86 510.66,-103.86 576,-103.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-114.5C495.04,-114.86 510.66,-103.86 576,-103.5"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M432,-116.5C496.19,-116.5 511.81,-105.5 576,-105.5"/> <path fill="none" stroke="#ffff00" stroke-width="2" d="M432,-116.5C496.19,-116.5 511.81,-105.5 576,-105.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-118.5C497.34,-118.14 512.96,-107.14 576,-107.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-118.5C497.34,-118.14 512.96,-107.14 576,-107.5"/>
</g> </g>
<!-- W1&#45;&#45;_ferrule_crimp_11 --> <!-- W1&#45;&#45;AUTOGENERATED_F_11 -->
<g id="edge10" class="edge"> <g id="edge10" class="edge">
<title>W1:e&#45;&#45;_ferrule_crimp_11:w</title> <title>W1:e&#45;&#45;AUTOGENERATED_F_11:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-89.5C495.79,-90.78 508.47,-57.78 576,-56.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-89.5C495.79,-90.78 508.47,-57.78 576,-56.5"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M432,-91.5C497.66,-91.5 510.34,-58.5 576,-58.5"/> <path fill="none" stroke="#00ff00" stroke-width="2" d="M432,-91.5C497.66,-91.5 510.34,-58.5 576,-58.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-93.5C499.53,-92.22 512.21,-59.22 576,-60.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-93.5C499.53,-92.22 512.21,-59.22 576,-60.5"/>
</g> </g>
<!-- W1&#45;&#45;_ferrule_crimp_12 --> <!-- W1&#45;&#45;AUTOGENERATED_F_12 -->
<g id="edge12" class="edge"> <g id="edge12" class="edge">
<title>W1:e&#45;&#45;_ferrule_crimp_12:w</title> <title>W1:e&#45;&#45;AUTOGENERATED_F_12:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-64.5C498.53,-66.25 505.51,-11.25 576,-9.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-64.5C498.53,-66.25 505.51,-11.25 576,-9.5"/>
<path fill="none" stroke="#0066ff" stroke-width="2" d="M432,-66.5C500.51,-66.5 507.49,-11.5 576,-11.5"/> <path fill="none" stroke="#0066ff" stroke-width="2" d="M432,-66.5C500.51,-66.5 507.49,-11.5 576,-11.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M432,-68.5C502.49,-66.75 509.47,-11.75 576,-13.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M432,-68.5C502.49,-66.75 509.47,-11.75 576,-13.5"/>

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

103
examples/ex05.html generated
View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex05</title> <title>ex05</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex05</h1> <h1>ex05</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="1535pt" height="192pt" <svg width="1535pt" height="192pt"
@ -305,49 +328,61 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Connector, <a href="https://www.molex.com/molex/products/family/kk_254_rpc_connector_system">Molex KK 254</a>, female, 4 pins</td> <td class="bom_col_description">Connector, <a href="https://www.molex.com/molex/products/family/kk_254_rpc_connector_system">Molex KK 254</a>, female, 4 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">3</td> <td class="bom_col_qty">3</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1, X2, X3</td> <td class="bom_col_designators">X1, X2, X3</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Wire, I2C, 0.25 mm&sup2;, PK</td> <td class="bom_col_description">Wire, I2C, 0.25 mm², PK</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.4</td> <td class="bom_col_qty">0.4</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2</td> <td class="bom_col_designators">W1, W2</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Wire, I2C, 0.25 mm&sup2;, TQ</td> <td class="bom_col_description">Wire, I2C, 0.25 mm², TQ</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.4</td> <td class="bom_col_qty">0.4</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2</td> <td class="bom_col_designators">W1, W2</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">4</td> <td class="bom_col_id">4</td>
<td style="border:1px solid #000000; padding: 4px">Wire, I2C, 0.25 mm&sup2;, VT</td> <td class="bom_col_description">Wire, I2C, 0.25 mm², VT</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.4</td> <td class="bom_col_qty">0.4</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2</td> <td class="bom_col_designators">W1, W2</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">5</td> <td class="bom_col_id">5</td>
<td style="border:1px solid #000000; padding: 4px">Wire, I2C, 0.25 mm&sup2;, YE</td> <td class="bom_col_description">Wire, I2C, 0.25 mm², YE</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.4</td> <td class="bom_col_qty">0.4</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2</td> <td class="bom_col_designators">W1, W2</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

2
examples/ex05.svg generated
View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="1535pt" height="192pt" <svg width="1535pt" height="192pt"

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

103
examples/ex06.html generated
View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex06</title> <title>ex06</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex06</h1> <h1>ex06</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="865pt" height="1024pt" <svg width="865pt" height="1024pt"
@ -665,49 +688,61 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 4 pins</td> <td class="bom_col_description">Connector, Molex KK 254, female, 4 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">6</td> <td class="bom_col_qty">6</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1, X2, X3, X4, X5, X6</td> <td class="bom_col_designators">X1, X2, X3, X4, X5, X6</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, PK</td> <td class="bom_col_description">Wire, 0.25 mm², PK</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1.0</td> <td class="bom_col_qty">1.0</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3, W4, W5</td> <td class="bom_col_designators">W1, W2, W3, W4, W5</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, TQ</td> <td class="bom_col_description">Wire, 0.25 mm², TQ</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1.0</td> <td class="bom_col_qty">1.0</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3, W4, W5</td> <td class="bom_col_designators">W1, W2, W3, W4, W5</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">4</td> <td class="bom_col_id">4</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, VT</td> <td class="bom_col_description">Wire, 0.25 mm², VT</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1.0</td> <td class="bom_col_qty">1.0</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3, W4, W5</td> <td class="bom_col_designators">W1, W2, W3, W4, W5</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">5</td> <td class="bom_col_id">5</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, YE</td> <td class="bom_col_description">Wire, 0.25 mm², YE</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1.0</td> <td class="bom_col_qty">1.0</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3, W4, W5</td> <td class="bom_col_designators">W1, W2, W3, W4, W5</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

2
examples/ex06.svg generated
View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="865pt" height="1024pt" <svg width="865pt" height="1024pt"

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

83
examples/ex07.html generated
View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex07</title> <title>ex07</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex07</h1> <h1>ex07</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="858pt" height="153pt" <svg width="858pt" height="153pt"
@ -109,35 +132,47 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Cable, 2 x 20 AWG</td> <td class="bom_col_description">Cable, 2 x 20 AWG</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">C1</td> <td class="bom_col_designators">C1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Connector, D-Sub, female, 9 pins</td> <td class="bom_col_description">Connector, D-Sub, female, 9 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X2</td> <td class="bom_col_designators">X2</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Connector, TE 776164-1, female, 35 pins</td> <td class="bom_col_description">Connector, TE 776164-1, female, 35 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1</td> <td class="bom_col_designators">X1</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

2
examples/ex07.svg generated
View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="858pt" height="153pt" <svg width="858pt" height="153pt"

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

4
examples/ex08.gv generated
View File

@ -35,7 +35,7 @@ graph {
</td></tr> </td></tr>
<tr><td> <tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left" sides="TLR"><img scale="false" src="resources/stereo-phone-plug-TRS.png"/></td> <td balign="left" sides="TLR"><img scale="false" src="/Users/daniel/Projects/WireViz/examples/resources/stereo-phone-plug-TRS.png"/></td>
</tr></table> </tr></table>
</td></tr> </td></tr>
<tr><td> <tr><td>
@ -135,7 +135,7 @@ graph {
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr> <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left" sides="TLR"> <td balign="left" sides="TLR">
<table border="0" cellspacing="0" cellborder="0"><tr> <table border="0" cellspacing="0" cellborder="0"><tr>
<td width="70.0" height="70" fixedsize="true"><img scale="true" src="resources/cable-WH+BN+GN+shield.png"/></td> <td width="70.0" height="70" fixedsize="true"><img scale="true" src="/Users/daniel/Projects/WireViz/examples/resources/cable-WH+BN+GN+shield.png"/></td>
</tr></table> </tr></table>
</td> </td>
</tr></table> </tr></table>

77
examples/ex08.html generated

File diff suppressed because one or more lines are too long

6
examples/ex08.svg generated

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 17 KiB

83
examples/ex09.html generated
View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex09</title> <title>ex09</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex09</h1> <h1>ex09</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="835pt" height="1158pt" <svg width="835pt" height="1158pt"
@ -528,35 +551,47 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Cable, 12 x 0.25 mm&sup2; shielded</td> <td class="bom_col_description">Cable, 12 x 0.25 mm² shielded</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td> <td class="bom_col_qty">0.2</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Connector, D-Sub, male, 25 pins</td> <td class="bom_col_description">Connector, D-Sub, male, 25 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1</td> <td class="bom_col_designators">X1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Connector, F48, female, 48 pins</td> <td class="bom_col_description">Connector, F48, female, 48 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X2</td> <td class="bom_col_designators">X2</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

2
examples/ex09.svg generated
View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="835pt" height="1158pt" <svg width="835pt" height="1158pt"

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

73
examples/ex10.html generated
View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex10</title> <title>ex10</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex10</h1> <h1>ex10</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="1120pt" height="324pt" <svg width="1120pt" height="324pt"
@ -331,28 +354,40 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Cable, CAT5e, 8 x 24 AWG</td> <td class="bom_col_description">Cable, CAT5e, 8 x 24 AWG</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Stewart Connector SS-37000-002, male, 8 pins</td> <td class="bom_col_description">Connector, Stewart Connector SS-37000-002, male, 8 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td> <td class="bom_col_qty">2</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1, X2</td> <td class="bom_col_designators">X1, X2</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

2
examples/ex10.svg generated
View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="1120pt" height="324pt" <svg width="1120pt" height="324pt"

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

4
examples/ex11.bom.tsv generated Normal file
View File

@ -0,0 +1,4 @@
Id Description Qty Unit Designators
1 Cable, 4 wires, BK 0 m W1
2 Connector, Ferrule, GY 4
3 Connector, Screw connector, male, 4 pins, GN 1 X1
1 Id Description Qty Unit Designators
2 1 Cable, 4 wires, BK 0 m W1
3 2 Connector, Ferrule, GY 4
4 3 Connector, Screw connector, male, 4 pins, GN 1 X1

191
examples/ex11.gv generated Normal file
View File

@ -0,0 +1,191 @@
graph {
// Graph generated by WireViz 0.4-dev
// https://github.com/formatc1702/WireViz
graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2]
node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0]
edge [fontname=arial style=bold]
AUTOGENERATED_F_1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Ferrule</td>
<td balign="left">GY</td>
<td balign="left" bgcolor="#999999" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_F_2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Ferrule</td>
<td balign="left">GY</td>
<td balign="left" bgcolor="#999999" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_F_3 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Ferrule</td>
<td balign="left">GY</td>
<td balign="left" bgcolor="#999999" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_F_4 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Ferrule</td>
<td balign="left">GY</td>
<td balign="left" bgcolor="#999999" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
X1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">X1</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Screw connector</td>
<td balign="left">male</td>
<td balign="left">4-pin</td>
<td balign="left">GN</td>
<td balign="left" bgcolor="#00FF00" width="4"></td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1">
<tr>
<td port="p1l">1</td>
<td>A</td>
</tr>
<tr>
<td port="p2l">2</td>
<td>B</td>
</tr>
<tr>
<td port="p3l">3</td>
<td>C</td>
</tr>
<tr>
<td port="p4l">4</td>
<td>D</td>
</tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#000000:#000000"]
W1:w1:e -- AUTOGENERATED_F_1:w
edge [color="#000000:#ffffff:#000000"]
W1:w2:e -- AUTOGENERATED_F_2:w
edge [color="#000000:#0066ff:#000000"]
W1:w3:e -- AUTOGENERATED_F_3:w
edge [color="#000000:#895956:#000000"]
W1:w4:e -- AUTOGENERATED_F_4:w
W1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">W1</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4x</td>
<td balign="left">BK</td>
<td balign="left" bgcolor="#000000" width="4"></td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellborder="0">
<tr><td>&nbsp;</td></tr>
<tr>
<td><!-- 1_in --></td>
<td>
1:BK
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w1" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td><!-- 2_in --></td>
<td>
2:WH
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w2" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffffff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td><!-- 3_in --></td>
<td>
3:BU
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w3" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#0066ff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td><!-- 4_in --></td>
<td>
4:BN
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w4" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#895956" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr><td>&nbsp;</td></tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000" dir=forward style=dashed]
AUTOGENERATED_F_1:e -- X1:p1l:w
edge [color="#000000" dir=forward style=dashed]
AUTOGENERATED_F_2:e -- X1:p2l:w
edge [color="#000000" dir=forward style=dashed]
AUTOGENERATED_F_3:e -- X1:p3l:w
edge [color="#000000" dir=forward style=dashed]
AUTOGENERATED_F_4:e -- X1:p4l:w
}

245
examples/ex11.html generated Normal file
View File

@ -0,0 +1,245 @@
<!DOCTYPE html>
<html lang="en"><head>
<meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex11</title>
<style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex11</h1>
<h2>Diagram</h2>
<div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
-->
<!-- Pages: 1 -->
<svg width="703pt" height="215pt"
viewBox="0.00 0.00 703.00 214.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 210.5)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-210.5 699,-210.5 699,4 -4,4"/>
<!-- AUTOGENERATED_F_1 -->
<g id="node1" class="node">
<title>AUTOGENERATED_F_1</title>
<polygon fill="#ffffff" stroke="black" points="321,-164 231,-164 231,-141 321,-141 321,-164"/>
<polygon fill="none" stroke="black" points="231,-140.5 231,-163.5 284,-163.5 284,-140.5 231,-140.5"/>
<text text-anchor="start" x="235" y="-148.3" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="284,-140.5 284,-163.5 313,-163.5 313,-140.5 284,-140.5"/>
<text text-anchor="start" x="288" y="-148.3" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="313,-140.5 313,-163.5 321,-163.5 321,-140.5 313,-140.5"/>
<polygon fill="none" stroke="black" points="313,-140.5 313,-163.5 321,-163.5 321,-140.5 313,-140.5"/>
</g>
<!-- X1 -->
<g id="node5" class="node">
<title>X1</title>
<polygon fill="#ffffff" stroke="black" points="695,-174.5 465,-174.5 465,-36.5 695,-36.5 695,-174.5"/>
<polygon fill="none" stroke="black" points="465,-151.5 465,-174.5 695,-174.5 695,-151.5 465,-151.5"/>
<text text-anchor="start" x="571" y="-159.3" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="465,-128.5 465,-151.5 578,-151.5 578,-128.5 465,-128.5"/>
<text text-anchor="start" x="469" y="-136.3" font-family="arial" font-size="14.00">Screw connector</text>
<polygon fill="none" stroke="black" points="578,-128.5 578,-151.5 617,-151.5 617,-128.5 578,-128.5"/>
<text text-anchor="start" x="582" y="-136.3" font-family="arial" font-size="14.00">male</text>
<polygon fill="none" stroke="black" points="617,-128.5 617,-151.5 657,-151.5 657,-128.5 617,-128.5"/>
<text text-anchor="start" x="621" y="-136.3" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="657,-128.5 657,-151.5 687,-151.5 687,-128.5 657,-128.5"/>
<text text-anchor="start" x="661" y="-136.3" font-family="arial" font-size="14.00">GN</text>
<polygon fill="#00ff00" stroke="transparent" points="687,-128.5 687,-151.5 695,-151.5 695,-128.5 687,-128.5"/>
<polygon fill="none" stroke="black" points="687,-128.5 687,-151.5 695,-151.5 695,-128.5 687,-128.5"/>
<polygon fill="none" stroke="black" points="465,-105.5 465,-128.5 579,-128.5 579,-105.5 465,-105.5"/>
<text text-anchor="start" x="518" y="-113.3" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="579,-105.5 579,-128.5 695,-128.5 695,-105.5 579,-105.5"/>
<text text-anchor="start" x="632" y="-113.3" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="465,-82.5 465,-105.5 579,-105.5 579,-82.5 465,-82.5"/>
<text text-anchor="start" x="518" y="-90.3" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="579,-82.5 579,-105.5 695,-105.5 695,-82.5 579,-82.5"/>
<text text-anchor="start" x="632" y="-90.3" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="465,-59.5 465,-82.5 579,-82.5 579,-59.5 465,-59.5"/>
<text text-anchor="start" x="518" y="-67.3" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="579,-59.5 579,-82.5 695,-82.5 695,-59.5 579,-59.5"/>
<text text-anchor="start" x="631.5" y="-67.3" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="465,-36.5 465,-59.5 579,-59.5 579,-36.5 465,-36.5"/>
<text text-anchor="start" x="518" y="-44.3" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="579,-36.5 579,-59.5 695,-59.5 695,-36.5 579,-36.5"/>
<text text-anchor="start" x="631.5" y="-44.3" font-family="arial" font-size="14.00">D</text>
</g>
<!-- AUTOGENERATED_F_1&#45;&#45;X1 -->
<g id="edge5" class="edge">
<title>AUTOGENERATED_F_1:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M321,-152.5C383.26,-152.5 397.63,-121.22 454.66,-117.8"/>
<polygon fill="#000000" stroke="#000000" points="455.11,-121.29 465,-117.5 454.9,-114.29 455.11,-121.29"/>
</g>
<!-- AUTOGENERATED_F_2 -->
<g id="node2" class="node">
<title>AUTOGENERATED_F_2</title>
<polygon fill="#ffffff" stroke="black" points="321,-117 231,-117 231,-94 321,-94 321,-117"/>
<polygon fill="none" stroke="black" points="231,-93.5 231,-116.5 284,-116.5 284,-93.5 231,-93.5"/>
<text text-anchor="start" x="235" y="-101.3" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="284,-93.5 284,-116.5 313,-116.5 313,-93.5 284,-93.5"/>
<text text-anchor="start" x="288" y="-101.3" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="313,-93.5 313,-116.5 321,-116.5 321,-93.5 313,-93.5"/>
<polygon fill="none" stroke="black" points="313,-93.5 313,-116.5 321,-116.5 321,-93.5 313,-93.5"/>
</g>
<!-- AUTOGENERATED_F_2&#45;&#45;X1 -->
<g id="edge6" class="edge">
<title>AUTOGENERATED_F_2:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M321,-105.5C381.71,-105.5 398.93,-94.78 454.88,-93.6"/>
<polygon fill="#000000" stroke="#000000" points="455.04,-97.1 465,-93.5 454.96,-90.1 455.04,-97.1"/>
</g>
<!-- AUTOGENERATED_F_3 -->
<g id="node3" class="node">
<title>AUTOGENERATED_F_3</title>
<polygon fill="#ffffff" stroke="black" points="321,-70 231,-70 231,-47 321,-47 321,-70"/>
<polygon fill="none" stroke="black" points="231,-46.5 231,-69.5 284,-69.5 284,-46.5 231,-46.5"/>
<text text-anchor="start" x="235" y="-54.3" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="284,-46.5 284,-69.5 313,-69.5 313,-46.5 284,-46.5"/>
<text text-anchor="start" x="288" y="-54.3" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="313,-46.5 313,-69.5 321,-69.5 321,-46.5 313,-46.5"/>
<polygon fill="none" stroke="black" points="313,-46.5 313,-69.5 321,-69.5 321,-46.5 313,-46.5"/>
</g>
<!-- AUTOGENERATED_F_3&#45;&#45;X1 -->
<g id="edge7" class="edge">
<title>AUTOGENERATED_F_3:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M321,-58.5C381.71,-58.5 398.93,-69.22 454.88,-70.4"/>
<polygon fill="#000000" stroke="#000000" points="454.96,-73.9 465,-70.5 455.04,-66.9 454.96,-73.9"/>
</g>
<!-- AUTOGENERATED_F_4 -->
<g id="node4" class="node">
<title>AUTOGENERATED_F_4</title>
<polygon fill="#ffffff" stroke="black" points="321,-23 231,-23 231,0 321,0 321,-23"/>
<polygon fill="none" stroke="black" points="231,0.5 231,-22.5 284,-22.5 284,0.5 231,0.5"/>
<text text-anchor="start" x="235" y="-7.3" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="284,0.5 284,-22.5 313,-22.5 313,0.5 284,0.5"/>
<text text-anchor="start" x="288" y="-7.3" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="313,0.5 313,-22.5 321,-22.5 321,0.5 313,0.5"/>
<polygon fill="none" stroke="black" points="313,0.5 313,-22.5 321,-22.5 321,0.5 313,0.5"/>
</g>
<!-- AUTOGENERATED_F_4&#45;&#45;X1 -->
<g id="edge8" class="edge">
<title>AUTOGENERATED_F_4:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M321,-11.5C383.49,-11.5 397.61,-43.8 455,-47.21"/>
<polygon fill="#000000" stroke="#000000" points="454.9,-50.71 465,-47.5 455.11,-43.71 454.9,-50.71"/>
</g>
<!-- W1 -->
<g id="node6" class="node">
<title>W1</title>
<polygon fill="#ffffff" stroke="black" points="87,-206.5 0,-206.5 0,-22.5 87,-22.5 87,-206.5"/>
<polygon fill="none" stroke="black" points="0.5,-183.5 0.5,-206.5 87.5,-206.5 87.5,-183.5 0.5,-183.5"/>
<text text-anchor="start" x="33.5" y="-191.3" font-family="arial" font-size="14.00">W1</text>
<polygon fill="none" stroke="black" points="0.5,-160.5 0.5,-183.5 33.5,-183.5 33.5,-160.5 0.5,-160.5"/>
<text text-anchor="start" x="9.5" y="-168.3" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="33.5,-160.5 33.5,-183.5 70.5,-183.5 70.5,-160.5 33.5,-160.5"/>
<text text-anchor="start" x="42.5" y="-168.3" font-family="arial" font-size="14.00">BK</text>
<polygon fill="#000000" stroke="transparent" points="70.5,-160.5 70.5,-183.5 87.5,-183.5 87.5,-160.5 70.5,-160.5"/>
<polygon fill="none" stroke="black" points="70.5,-160.5 70.5,-183.5 87.5,-183.5 87.5,-160.5 70.5,-160.5"/>
<text text-anchor="start" x="2.5" y="-147.3" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="13" y="-128.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:BK &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="0.5,-120.5 0.5,-122.5 87.5,-122.5 87.5,-120.5 0.5,-120.5"/>
<polygon fill="#000000" stroke="transparent" points="0.5,-118.5 0.5,-120.5 87.5,-120.5 87.5,-118.5 0.5,-118.5"/>
<polygon fill="#000000" stroke="transparent" points="0.5,-116.5 0.5,-118.5 87.5,-118.5 87.5,-116.5 0.5,-116.5"/>
<text text-anchor="start" x="10.5" y="-103.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:WH &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="0.5,-95.5 0.5,-97.5 87.5,-97.5 87.5,-95.5 0.5,-95.5"/>
<polygon fill="#ffffff" stroke="transparent" points="0.5,-93.5 0.5,-95.5 87.5,-95.5 87.5,-93.5 0.5,-93.5"/>
<polygon fill="#000000" stroke="transparent" points="0.5,-91.5 0.5,-93.5 87.5,-93.5 87.5,-91.5 0.5,-91.5"/>
<text text-anchor="start" x="12.5" y="-78.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:BU &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="0.5,-70.5 0.5,-72.5 87.5,-72.5 87.5,-70.5 0.5,-70.5"/>
<polygon fill="#0066ff" stroke="transparent" points="0.5,-68.5 0.5,-70.5 87.5,-70.5 87.5,-68.5 0.5,-68.5"/>
<polygon fill="#000000" stroke="transparent" points="0.5,-66.5 0.5,-68.5 87.5,-68.5 87.5,-66.5 0.5,-66.5"/>
<text text-anchor="start" x="12.5" y="-53.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:BN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="0.5,-45.5 0.5,-47.5 87.5,-47.5 87.5,-45.5 0.5,-45.5"/>
<polygon fill="#895956" stroke="transparent" points="0.5,-43.5 0.5,-45.5 87.5,-45.5 87.5,-43.5 0.5,-43.5"/>
<polygon fill="#000000" stroke="transparent" points="0.5,-41.5 0.5,-43.5 87.5,-43.5 87.5,-41.5 0.5,-41.5"/>
<text text-anchor="start" x="2.5" y="-28.3" font-family="arial" font-size="14.00"> </text>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_F_1 -->
<g id="edge1" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_F_1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-117.5C154.53,-118.78 167.21,-151.78 231,-150.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-119.5C152.66,-119.5 165.34,-152.5 231,-152.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-121.5C150.79,-120.22 163.47,-153.22 231,-154.5"/>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_F_2 -->
<g id="edge2" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_F_2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-92.5C152.34,-92.86 167.96,-103.86 231,-103.5"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M87,-94.5C151.19,-94.5 166.81,-105.5 231,-105.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-96.5C150.04,-96.14 165.66,-107.14 231,-107.5"/>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_F_3 -->
<g id="edge3" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_F_3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-67.5C150.04,-67.86 165.66,-56.86 231,-56.5"/>
<path fill="none" stroke="#0066ff" stroke-width="2" d="M87,-69.5C151.19,-69.5 166.81,-58.5 231,-58.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-71.5C152.34,-71.14 167.96,-60.14 231,-60.5"/>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_F_4 -->
<g id="edge4" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_F_4:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-42.5C150.79,-43.78 163.47,-10.78 231,-9.5"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M87,-44.5C152.66,-44.5 165.34,-11.5 231,-11.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-46.5C154.53,-45.22 167.21,-12.22 231,-13.5"/>
</g>
</g>
</svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2>
<div id="bom">
<table class="bom">
<tr>
<th class="bom_col_id">Id</th>
<th class="bom_col_description">Description</th>
<th class="bom_col_qty">Qty</th>
<th class="bom_col_unit">Unit</th>
<th class="bom_col_designators">Designators</th>
</tr>
<tr>
<td class="bom_col_id">1</td>
<td class="bom_col_description">Cable, 4 wires, BK</td>
<td class="bom_col_qty">0</td>
<td class="bom_col_unit">m</td>
<td class="bom_col_designators">W1</td>
</tr>
<tr>
<td class="bom_col_id">2</td>
<td class="bom_col_description">Connector, Ferrule, GY</td>
<td class="bom_col_qty">4</td>
<td class="bom_col_unit"></td>
<td class="bom_col_designators"></td>
</tr>
<tr>
<td class="bom_col_id">3</td>
<td class="bom_col_description">Connector, Screw connector, male, 4 pins, GN</td>
<td class="bom_col_qty">1</td>
<td class="bom_col_unit"></td>
<td class="bom_col_designators">X1</td>
</tr>
</table>
</div>
</body></html>

BIN
examples/ex11.png generated Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

172
examples/ex11.svg generated Normal file
View File

@ -0,0 +1,172 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
-->
<!-- Pages: 1 -->
<svg width="703pt" height="215pt"
viewBox="0.00 0.00 703.00 214.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 210.5)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-210.5 699,-210.5 699,4 -4,4"/>
<!-- AUTOGENERATED_F_1 -->
<g id="node1" class="node">
<title>AUTOGENERATED_F_1</title>
<polygon fill="#ffffff" stroke="black" points="321,-164 231,-164 231,-141 321,-141 321,-164"/>
<polygon fill="none" stroke="black" points="231,-140.5 231,-163.5 284,-163.5 284,-140.5 231,-140.5"/>
<text text-anchor="start" x="235" y="-148.3" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="284,-140.5 284,-163.5 313,-163.5 313,-140.5 284,-140.5"/>
<text text-anchor="start" x="288" y="-148.3" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="313,-140.5 313,-163.5 321,-163.5 321,-140.5 313,-140.5"/>
<polygon fill="none" stroke="black" points="313,-140.5 313,-163.5 321,-163.5 321,-140.5 313,-140.5"/>
</g>
<!-- X1 -->
<g id="node5" class="node">
<title>X1</title>
<polygon fill="#ffffff" stroke="black" points="695,-174.5 465,-174.5 465,-36.5 695,-36.5 695,-174.5"/>
<polygon fill="none" stroke="black" points="465,-151.5 465,-174.5 695,-174.5 695,-151.5 465,-151.5"/>
<text text-anchor="start" x="571" y="-159.3" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="465,-128.5 465,-151.5 578,-151.5 578,-128.5 465,-128.5"/>
<text text-anchor="start" x="469" y="-136.3" font-family="arial" font-size="14.00">Screw connector</text>
<polygon fill="none" stroke="black" points="578,-128.5 578,-151.5 617,-151.5 617,-128.5 578,-128.5"/>
<text text-anchor="start" x="582" y="-136.3" font-family="arial" font-size="14.00">male</text>
<polygon fill="none" stroke="black" points="617,-128.5 617,-151.5 657,-151.5 657,-128.5 617,-128.5"/>
<text text-anchor="start" x="621" y="-136.3" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="657,-128.5 657,-151.5 687,-151.5 687,-128.5 657,-128.5"/>
<text text-anchor="start" x="661" y="-136.3" font-family="arial" font-size="14.00">GN</text>
<polygon fill="#00ff00" stroke="transparent" points="687,-128.5 687,-151.5 695,-151.5 695,-128.5 687,-128.5"/>
<polygon fill="none" stroke="black" points="687,-128.5 687,-151.5 695,-151.5 695,-128.5 687,-128.5"/>
<polygon fill="none" stroke="black" points="465,-105.5 465,-128.5 579,-128.5 579,-105.5 465,-105.5"/>
<text text-anchor="start" x="518" y="-113.3" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="579,-105.5 579,-128.5 695,-128.5 695,-105.5 579,-105.5"/>
<text text-anchor="start" x="632" y="-113.3" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="465,-82.5 465,-105.5 579,-105.5 579,-82.5 465,-82.5"/>
<text text-anchor="start" x="518" y="-90.3" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="579,-82.5 579,-105.5 695,-105.5 695,-82.5 579,-82.5"/>
<text text-anchor="start" x="632" y="-90.3" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="465,-59.5 465,-82.5 579,-82.5 579,-59.5 465,-59.5"/>
<text text-anchor="start" x="518" y="-67.3" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="579,-59.5 579,-82.5 695,-82.5 695,-59.5 579,-59.5"/>
<text text-anchor="start" x="631.5" y="-67.3" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="465,-36.5 465,-59.5 579,-59.5 579,-36.5 465,-36.5"/>
<text text-anchor="start" x="518" y="-44.3" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="579,-36.5 579,-59.5 695,-59.5 695,-36.5 579,-36.5"/>
<text text-anchor="start" x="631.5" y="-44.3" font-family="arial" font-size="14.00">D</text>
</g>
<!-- AUTOGENERATED_F_1&#45;&#45;X1 -->
<g id="edge5" class="edge">
<title>AUTOGENERATED_F_1:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M321,-152.5C383.26,-152.5 397.63,-121.22 454.66,-117.8"/>
<polygon fill="#000000" stroke="#000000" points="455.11,-121.29 465,-117.5 454.9,-114.29 455.11,-121.29"/>
</g>
<!-- AUTOGENERATED_F_2 -->
<g id="node2" class="node">
<title>AUTOGENERATED_F_2</title>
<polygon fill="#ffffff" stroke="black" points="321,-117 231,-117 231,-94 321,-94 321,-117"/>
<polygon fill="none" stroke="black" points="231,-93.5 231,-116.5 284,-116.5 284,-93.5 231,-93.5"/>
<text text-anchor="start" x="235" y="-101.3" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="284,-93.5 284,-116.5 313,-116.5 313,-93.5 284,-93.5"/>
<text text-anchor="start" x="288" y="-101.3" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="313,-93.5 313,-116.5 321,-116.5 321,-93.5 313,-93.5"/>
<polygon fill="none" stroke="black" points="313,-93.5 313,-116.5 321,-116.5 321,-93.5 313,-93.5"/>
</g>
<!-- AUTOGENERATED_F_2&#45;&#45;X1 -->
<g id="edge6" class="edge">
<title>AUTOGENERATED_F_2:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M321,-105.5C381.71,-105.5 398.93,-94.78 454.88,-93.6"/>
<polygon fill="#000000" stroke="#000000" points="455.04,-97.1 465,-93.5 454.96,-90.1 455.04,-97.1"/>
</g>
<!-- AUTOGENERATED_F_3 -->
<g id="node3" class="node">
<title>AUTOGENERATED_F_3</title>
<polygon fill="#ffffff" stroke="black" points="321,-70 231,-70 231,-47 321,-47 321,-70"/>
<polygon fill="none" stroke="black" points="231,-46.5 231,-69.5 284,-69.5 284,-46.5 231,-46.5"/>
<text text-anchor="start" x="235" y="-54.3" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="284,-46.5 284,-69.5 313,-69.5 313,-46.5 284,-46.5"/>
<text text-anchor="start" x="288" y="-54.3" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="313,-46.5 313,-69.5 321,-69.5 321,-46.5 313,-46.5"/>
<polygon fill="none" stroke="black" points="313,-46.5 313,-69.5 321,-69.5 321,-46.5 313,-46.5"/>
</g>
<!-- AUTOGENERATED_F_3&#45;&#45;X1 -->
<g id="edge7" class="edge">
<title>AUTOGENERATED_F_3:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M321,-58.5C381.71,-58.5 398.93,-69.22 454.88,-70.4"/>
<polygon fill="#000000" stroke="#000000" points="454.96,-73.9 465,-70.5 455.04,-66.9 454.96,-73.9"/>
</g>
<!-- AUTOGENERATED_F_4 -->
<g id="node4" class="node">
<title>AUTOGENERATED_F_4</title>
<polygon fill="#ffffff" stroke="black" points="321,-23 231,-23 231,0 321,0 321,-23"/>
<polygon fill="none" stroke="black" points="231,0.5 231,-22.5 284,-22.5 284,0.5 231,0.5"/>
<text text-anchor="start" x="235" y="-7.3" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="284,0.5 284,-22.5 313,-22.5 313,0.5 284,0.5"/>
<text text-anchor="start" x="288" y="-7.3" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="313,0.5 313,-22.5 321,-22.5 321,0.5 313,0.5"/>
<polygon fill="none" stroke="black" points="313,0.5 313,-22.5 321,-22.5 321,0.5 313,0.5"/>
</g>
<!-- AUTOGENERATED_F_4&#45;&#45;X1 -->
<g id="edge8" class="edge">
<title>AUTOGENERATED_F_4:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M321,-11.5C383.49,-11.5 397.61,-43.8 455,-47.21"/>
<polygon fill="#000000" stroke="#000000" points="454.9,-50.71 465,-47.5 455.11,-43.71 454.9,-50.71"/>
</g>
<!-- W1 -->
<g id="node6" class="node">
<title>W1</title>
<polygon fill="#ffffff" stroke="black" points="87,-206.5 0,-206.5 0,-22.5 87,-22.5 87,-206.5"/>
<polygon fill="none" stroke="black" points="0.5,-183.5 0.5,-206.5 87.5,-206.5 87.5,-183.5 0.5,-183.5"/>
<text text-anchor="start" x="33.5" y="-191.3" font-family="arial" font-size="14.00">W1</text>
<polygon fill="none" stroke="black" points="0.5,-160.5 0.5,-183.5 33.5,-183.5 33.5,-160.5 0.5,-160.5"/>
<text text-anchor="start" x="9.5" y="-168.3" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="33.5,-160.5 33.5,-183.5 70.5,-183.5 70.5,-160.5 33.5,-160.5"/>
<text text-anchor="start" x="42.5" y="-168.3" font-family="arial" font-size="14.00">BK</text>
<polygon fill="#000000" stroke="transparent" points="70.5,-160.5 70.5,-183.5 87.5,-183.5 87.5,-160.5 70.5,-160.5"/>
<polygon fill="none" stroke="black" points="70.5,-160.5 70.5,-183.5 87.5,-183.5 87.5,-160.5 70.5,-160.5"/>
<text text-anchor="start" x="2.5" y="-147.3" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="13" y="-128.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:BK &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="0.5,-120.5 0.5,-122.5 87.5,-122.5 87.5,-120.5 0.5,-120.5"/>
<polygon fill="#000000" stroke="transparent" points="0.5,-118.5 0.5,-120.5 87.5,-120.5 87.5,-118.5 0.5,-118.5"/>
<polygon fill="#000000" stroke="transparent" points="0.5,-116.5 0.5,-118.5 87.5,-118.5 87.5,-116.5 0.5,-116.5"/>
<text text-anchor="start" x="10.5" y="-103.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:WH &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="0.5,-95.5 0.5,-97.5 87.5,-97.5 87.5,-95.5 0.5,-95.5"/>
<polygon fill="#ffffff" stroke="transparent" points="0.5,-93.5 0.5,-95.5 87.5,-95.5 87.5,-93.5 0.5,-93.5"/>
<polygon fill="#000000" stroke="transparent" points="0.5,-91.5 0.5,-93.5 87.5,-93.5 87.5,-91.5 0.5,-91.5"/>
<text text-anchor="start" x="12.5" y="-78.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:BU &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="0.5,-70.5 0.5,-72.5 87.5,-72.5 87.5,-70.5 0.5,-70.5"/>
<polygon fill="#0066ff" stroke="transparent" points="0.5,-68.5 0.5,-70.5 87.5,-70.5 87.5,-68.5 0.5,-68.5"/>
<polygon fill="#000000" stroke="transparent" points="0.5,-66.5 0.5,-68.5 87.5,-68.5 87.5,-66.5 0.5,-66.5"/>
<text text-anchor="start" x="12.5" y="-53.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:BN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="0.5,-45.5 0.5,-47.5 87.5,-47.5 87.5,-45.5 0.5,-45.5"/>
<polygon fill="#895956" stroke="transparent" points="0.5,-43.5 0.5,-45.5 87.5,-45.5 87.5,-43.5 0.5,-43.5"/>
<polygon fill="#000000" stroke="transparent" points="0.5,-41.5 0.5,-43.5 87.5,-43.5 87.5,-41.5 0.5,-41.5"/>
<text text-anchor="start" x="2.5" y="-28.3" font-family="arial" font-size="14.00"> </text>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_F_1 -->
<g id="edge1" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_F_1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-117.5C154.53,-118.78 167.21,-151.78 231,-150.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-119.5C152.66,-119.5 165.34,-152.5 231,-152.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-121.5C150.79,-120.22 163.47,-153.22 231,-154.5"/>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_F_2 -->
<g id="edge2" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_F_2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-92.5C152.34,-92.86 167.96,-103.86 231,-103.5"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M87,-94.5C151.19,-94.5 166.81,-105.5 231,-105.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-96.5C150.04,-96.14 165.66,-107.14 231,-107.5"/>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_F_3 -->
<g id="edge3" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_F_3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-67.5C150.04,-67.86 165.66,-56.86 231,-56.5"/>
<path fill="none" stroke="#0066ff" stroke-width="2" d="M87,-69.5C151.19,-69.5 166.81,-58.5 231,-58.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-71.5C152.34,-71.14 167.96,-60.14 231,-60.5"/>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_F_4 -->
<g id="edge4" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_F_4:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-42.5C150.79,-43.78 163.47,-10.78 231,-9.5"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M87,-44.5C152.66,-44.5 165.34,-11.5 231,-11.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M87,-46.5C154.53,-45.22 167.21,-12.22 231,-13.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

7
examples/ex12.bom.tsv generated Normal file
View File

@ -0,0 +1,7 @@
Id Description Qty Unit Designators
1 Connector, Dupont 2.54mm, female, 5 pins, BK 1 X2
2 Connector, Dupont 2.54mm, male, 5 pins, BK 1 X1
3 Wire, BK 0.4 m W1, W2
4 Wire, BU 0.4 m W1, W2
5 Wire, GN 0.4 m W1, W2
6 Wire, RD 0.4 m W1, W2
1 Id Description Qty Unit Designators
2 1 Connector, Dupont 2.54mm, female, 5 pins, BK 1 X2
3 2 Connector, Dupont 2.54mm, male, 5 pins, BK 1 X1
4 3 Wire, BK 0.4 m W1, W2
5 4 Wire, BU 0.4 m W1, W2
6 5 Wire, GN 0.4 m W1, W2
7 6 Wire, RD 0.4 m W1, W2

269
examples/ex12.gv generated Normal file
View File

@ -0,0 +1,269 @@
graph {
// Graph generated by WireViz 0.4-dev
// https://github.com/formatc1702/WireViz
graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2]
node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0]
edge [fontname=arial style=bold]
X1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">X1</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Dupont 2.54mm</td>
<td balign="left">male</td>
<td balign="left">5-pin</td>
<td balign="left">BK</td>
<td balign="left" bgcolor="#000000" width="4"></td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1">
<tr>
<td port="p1l">1</td>
</tr>
<tr>
<td port="p2l">2</td>
</tr>
<tr>
<td port="p3l">3</td>
</tr>
<tr>
<td port="p4l">4</td>
</tr>
<tr>
<td port="p5l">5</td>
</tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
X2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">X2</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Dupont 2.54mm</td>
<td balign="left">female</td>
<td balign="left">5-pin</td>
<td balign="left">BK</td>
<td balign="left" bgcolor="#000000" width="4"></td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1">
<tr>
<td port="p1r">1</td>
</tr>
<tr>
<td port="p2r">2</td>
</tr>
<tr>
<td port="p3r">3</td>
</tr>
<tr>
<td port="p4r">4</td>
</tr>
<tr>
<td port="p5r">5</td>
</tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ff0000:#000000"]
W1:w1:e -- X1:p1l:w
edge [color="#000000:#000000:#000000"]
W1:w2:e -- X1:p2l:w
edge [color="#000000:#0066ff:#000000"]
W1:w3:e -- X1:p3l:w
edge [color="#000000:#00ff00:#000000"]
W1:w4:e -- X1:p4l:w
W1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">W1</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4x</td>
<td balign="left">0.2 m</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellborder="0">
<tr><td>&nbsp;</td></tr>
<tr>
<td><!-- 1_in --></td>
<td>
RD
</td>
<td>X1:1</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w1" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ff0000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td><!-- 2_in --></td>
<td>
BK
</td>
<td>X1:2</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w2" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td><!-- 3_in --></td>
<td>
BU
</td>
<td>X1:3</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w3" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#0066ff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td><!-- 4_in --></td>
<td>
GN
</td>
<td>X1:4</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w4" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#00ff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr><td>&nbsp;</td></tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style="filled,dashed"]
edge [color="#000000:#ff0000:#000000"]
X2:p1r:e -- W2:w1:w
edge [color="#000000:#000000:#000000"]
X2:p2r:e -- W2:w2:w
edge [color="#000000:#0066ff:#000000"]
X2:p3r:e -- W2:w3:w
edge [color="#000000:#00ff00:#000000"]
X2:p4r:e -- W2:w4:w
W2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">W2</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4x</td>
<td balign="left">0.2 m</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellborder="0">
<tr><td>&nbsp;</td></tr>
<tr>
<td>X2:1</td>
<td>
RD
</td>
<td><!-- 1_out --></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w1" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ff0000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td>X2:2</td>
<td>
BK
</td>
<td><!-- 2_out --></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w2" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td>X2:3</td>
<td>
BU
</td>
<td><!-- 3_out --></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w3" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#0066ff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td>X2:4</td>
<td>
GN
</td>
<td><!-- 4_out --></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w4" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#00ff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr><td>&nbsp;</td></tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style="filled,dashed"]
edge [color="#000000:#000000" dir=forward style=dashed]
X1:e -- X2:w
}

289
examples/ex12.html generated Normal file
View File

@ -0,0 +1,289 @@
<!DOCTYPE html>
<html lang="en"><head>
<meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex12</title>
<style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex12</h1>
<h2>Diagram</h2>
<div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
-->
<!-- Pages: 1 -->
<svg width="1096pt" height="201pt"
viewBox="0.00 0.00 1096.00 200.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 196.5)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-196.5 1092,-196.5 1092,4 -4,4"/>
<!-- X1 -->
<g id="node1" class="node">
<title>X1</title>
<polygon fill="#ffffff" stroke="black" points="468,-161 246,-161 246,0 468,0 468,-161"/>
<polygon fill="none" stroke="black" points="246,-137.5 246,-160.5 468,-160.5 468,-137.5 246,-137.5"/>
<text text-anchor="start" x="348" y="-145.3" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="246,-114.5 246,-137.5 354,-137.5 354,-114.5 246,-114.5"/>
<text text-anchor="start" x="250" y="-122.3" font-family="arial" font-size="14.00">Dupont 2.54mm</text>
<polygon fill="none" stroke="black" points="354,-114.5 354,-137.5 393,-137.5 393,-114.5 354,-114.5"/>
<text text-anchor="start" x="358" y="-122.3" font-family="arial" font-size="14.00">male</text>
<polygon fill="none" stroke="black" points="393,-114.5 393,-137.5 433,-137.5 433,-114.5 393,-114.5"/>
<text text-anchor="start" x="397" y="-122.3" font-family="arial" font-size="14.00">5&#45;pin</text>
<polygon fill="none" stroke="black" points="433,-114.5 433,-137.5 460,-137.5 460,-114.5 433,-114.5"/>
<text text-anchor="start" x="437" y="-122.3" font-family="arial" font-size="14.00">BK</text>
<polygon fill="#000000" stroke="transparent" points="460,-114.5 460,-137.5 468,-137.5 468,-114.5 460,-114.5"/>
<polygon fill="none" stroke="black" points="460,-114.5 460,-137.5 468,-137.5 468,-114.5 460,-114.5"/>
<polygon fill="none" stroke="black" points="246,-91.5 246,-114.5 468,-114.5 468,-91.5 246,-91.5"/>
<text text-anchor="start" x="353" y="-99.3" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="246,-68.5 246,-91.5 468,-91.5 468,-68.5 246,-68.5"/>
<text text-anchor="start" x="353" y="-76.3" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="246,-45.5 246,-68.5 468,-68.5 468,-45.5 246,-45.5"/>
<text text-anchor="start" x="353" y="-53.3" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="246,-22.5 246,-45.5 468,-45.5 468,-22.5 246,-22.5"/>
<text text-anchor="start" x="353" y="-30.3" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="246,0.5 246,-22.5 468,-22.5 468,0.5 246,0.5"/>
<text text-anchor="start" x="353" y="-7.3" font-family="arial" font-size="14.00">5</text>
</g>
<!-- X2 -->
<g id="node2" class="node">
<title>X2</title>
<polygon fill="#ffffff" stroke="black" points="846,-161 612,-161 612,0 846,0 846,-161"/>
<polygon fill="none" stroke="black" points="612,-137.5 612,-160.5 846,-160.5 846,-137.5 612,-137.5"/>
<text text-anchor="start" x="720" y="-145.3" font-family="arial" font-size="14.00">X2</text>
<polygon fill="none" stroke="black" points="612,-114.5 612,-137.5 720,-137.5 720,-114.5 612,-114.5"/>
<text text-anchor="start" x="616" y="-122.3" font-family="arial" font-size="14.00">Dupont 2.54mm</text>
<polygon fill="none" stroke="black" points="720,-114.5 720,-137.5 771,-137.5 771,-114.5 720,-114.5"/>
<text text-anchor="start" x="724" y="-122.3" font-family="arial" font-size="14.00">female</text>
<polygon fill="none" stroke="black" points="771,-114.5 771,-137.5 811,-137.5 811,-114.5 771,-114.5"/>
<text text-anchor="start" x="775" y="-122.3" font-family="arial" font-size="14.00">5&#45;pin</text>
<polygon fill="none" stroke="black" points="811,-114.5 811,-137.5 838,-137.5 838,-114.5 811,-114.5"/>
<text text-anchor="start" x="815" y="-122.3" font-family="arial" font-size="14.00">BK</text>
<polygon fill="#000000" stroke="transparent" points="838,-114.5 838,-137.5 846,-137.5 846,-114.5 838,-114.5"/>
<polygon fill="none" stroke="black" points="838,-114.5 838,-137.5 846,-137.5 846,-114.5 838,-114.5"/>
<polygon fill="none" stroke="black" points="612,-91.5 612,-114.5 846,-114.5 846,-91.5 612,-91.5"/>
<text text-anchor="start" x="725" y="-99.3" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="612,-68.5 612,-91.5 846,-91.5 846,-68.5 612,-68.5"/>
<text text-anchor="start" x="725" y="-76.3" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="612,-45.5 612,-68.5 846,-68.5 846,-45.5 612,-45.5"/>
<text text-anchor="start" x="725" y="-53.3" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="612,-22.5 612,-45.5 846,-45.5 846,-22.5 612,-22.5"/>
<text text-anchor="start" x="725" y="-30.3" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="612,0.5 612,-22.5 846,-22.5 846,0.5 612,0.5"/>
<text text-anchor="start" x="725" y="-7.3" font-family="arial" font-size="14.00">5</text>
</g>
<!-- X1&#45;&#45;X2 -->
<g id="edge9" class="edge">
<title>X1:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M468,-79.5C528.5,-79.5 546.11,-79.5 601.91,-79.5"/>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M468,-81.5C528.5,-81.5 546.11,-81.5 601.91,-81.5"/>
<polygon fill="#000000" stroke="#000000" points="602,-84 612,-80.5 602,-77 602,-84"/>
</g>
<!-- W2 -->
<g id="node4" class="node">
<title>W2</title>
<polygon fill="#ffffff" stroke="black" stroke-dasharray="5,2" points="1088,-192.5 990,-192.5 990,-8.5 1088,-8.5 1088,-192.5"/>
<polygon fill="none" stroke="black" points="990,-169.5 990,-192.5 1088,-192.5 1088,-169.5 990,-169.5"/>
<text text-anchor="start" x="1028.5" y="-177.3" font-family="arial" font-size="14.00">W2</text>
<polygon fill="none" stroke="black" points="990,-146.5 990,-169.5 1029,-169.5 1029,-146.5 990,-146.5"/>
<text text-anchor="start" x="1002" y="-154.3" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="1029,-146.5 1029,-169.5 1088,-169.5 1088,-146.5 1029,-146.5"/>
<text text-anchor="start" x="1040.5" y="-154.3" font-family="arial" font-size="14.00">0.2 m</text>
<text text-anchor="start" x="1004.5" y="-133.3" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="992" y="-114.3" font-family="arial" font-size="14.00">X2:1</text>
<text text-anchor="start" x="1025.5" y="-114.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;RD &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="990,-106.5 990,-108.5 1088,-108.5 1088,-106.5 990,-106.5"/>
<polygon fill="#ff0000" stroke="transparent" points="990,-104.5 990,-106.5 1088,-106.5 1088,-104.5 990,-104.5"/>
<polygon fill="#000000" stroke="transparent" points="990,-102.5 990,-104.5 1088,-104.5 1088,-102.5 990,-102.5"/>
<text text-anchor="start" x="992" y="-89.3" font-family="arial" font-size="14.00">X2:2</text>
<text text-anchor="start" x="1026.5" y="-89.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;BK &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="990,-81.5 990,-83.5 1088,-83.5 1088,-81.5 990,-81.5"/>
<polygon fill="#000000" stroke="transparent" points="990,-79.5 990,-81.5 1088,-81.5 1088,-79.5 990,-79.5"/>
<polygon fill="#000000" stroke="transparent" points="990,-77.5 990,-79.5 1088,-79.5 1088,-77.5 990,-77.5"/>
<text text-anchor="start" x="992" y="-64.3" font-family="arial" font-size="14.00">X2:3</text>
<text text-anchor="start" x="1026" y="-64.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;BU &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="990,-56.5 990,-58.5 1088,-58.5 1088,-56.5 990,-56.5"/>
<polygon fill="#0066ff" stroke="transparent" points="990,-54.5 990,-56.5 1088,-56.5 1088,-54.5 990,-54.5"/>
<polygon fill="#000000" stroke="transparent" points="990,-52.5 990,-54.5 1088,-54.5 1088,-52.5 990,-52.5"/>
<text text-anchor="start" x="992" y="-39.3" font-family="arial" font-size="14.00">X2:4</text>
<text text-anchor="start" x="1025" y="-39.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;GN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="990,-31.5 990,-33.5 1088,-33.5 1088,-31.5 990,-31.5"/>
<polygon fill="#00ff00" stroke="transparent" points="990,-29.5 990,-31.5 1088,-31.5 1088,-29.5 990,-29.5"/>
<polygon fill="#000000" stroke="transparent" points="990,-27.5 990,-29.5 1088,-29.5 1088,-27.5 990,-27.5"/>
<text text-anchor="start" x="1004.5" y="-14.3" font-family="arial" font-size="14.00"> </text>
</g>
<!-- X2&#45;&#45;W2 -->
<g id="edge5" class="edge">
<title>X2:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-101.5C910.25,-101.52 926.24,-103.52 990,-103.5"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M846,-103.5C910.01,-103.5 925.99,-105.5 990,-105.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-105.5C909.76,-105.48 925.75,-107.48 990,-107.5"/>
</g>
<!-- X2&#45;&#45;W2 -->
<g id="edge6" class="edge">
<title>X2:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-77.5C910.13,-77.5 926.12,-78.5 990,-78.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-79.5C910,-79.5 926,-80.5 990,-80.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-81.5C909.88,-81.5 925.87,-82.5 990,-82.5"/>
</g>
<!-- X2&#45;&#45;W2 -->
<g id="edge7" class="edge">
<title>X2:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-54.5C909.88,-54.5 925.87,-53.5 990,-53.5"/>
<path fill="none" stroke="#0066ff" stroke-width="2" d="M846,-56.5C910,-56.5 926,-55.5 990,-55.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-58.5C910.13,-58.5 926.12,-57.5 990,-57.5"/>
</g>
<!-- X2&#45;&#45;W2 -->
<g id="edge8" class="edge">
<title>X2:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-31.5C909.64,-31.53 925.62,-28.53 990,-28.5"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M846,-33.5C910.01,-33.5 925.99,-30.5 990,-30.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-35.5C910.38,-35.47 926.36,-32.47 990,-32.5"/>
</g>
<!-- W1 -->
<g id="node3" class="node">
<title>W1</title>
<polygon fill="#ffffff" stroke="black" stroke-dasharray="5,2" points="102,-192.5 0,-192.5 0,-8.5 102,-8.5 102,-192.5"/>
<polygon fill="none" stroke="black" points="0,-169.5 0,-192.5 102,-192.5 102,-169.5 0,-169.5"/>
<text text-anchor="start" x="40.5" y="-177.3" font-family="arial" font-size="14.00">W1</text>
<polygon fill="none" stroke="black" points="0,-146.5 0,-169.5 41,-169.5 41,-146.5 0,-146.5"/>
<text text-anchor="start" x="13" y="-154.3" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="41,-146.5 41,-169.5 102,-169.5 102,-146.5 41,-146.5"/>
<text text-anchor="start" x="53.5" y="-154.3" font-family="arial" font-size="14.00">0.2 m</text>
<text text-anchor="start" x="2" y="-133.3" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="10.5" y="-114.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;RD &#160;&#160;&#160;</text>
<text text-anchor="start" x="71" y="-114.3" font-family="arial" font-size="14.00">X1:1</text>
<polygon fill="#000000" stroke="transparent" points="0,-106.5 0,-108.5 102,-108.5 102,-106.5 0,-106.5"/>
<polygon fill="#ff0000" stroke="transparent" points="0,-104.5 0,-106.5 102,-106.5 102,-104.5 0,-104.5"/>
<polygon fill="#000000" stroke="transparent" points="0,-102.5 0,-104.5 102,-104.5 102,-102.5 0,-102.5"/>
<text text-anchor="start" x="11.5" y="-89.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;BK &#160;&#160;&#160;</text>
<text text-anchor="start" x="71" y="-89.3" font-family="arial" font-size="14.00">X1:2</text>
<polygon fill="#000000" stroke="transparent" points="0,-81.5 0,-83.5 102,-83.5 102,-81.5 0,-81.5"/>
<polygon fill="#000000" stroke="transparent" points="0,-79.5 0,-81.5 102,-81.5 102,-79.5 0,-79.5"/>
<polygon fill="#000000" stroke="transparent" points="0,-77.5 0,-79.5 102,-79.5 102,-77.5 0,-77.5"/>
<text text-anchor="start" x="11" y="-64.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;BU &#160;&#160;&#160;</text>
<text text-anchor="start" x="71" y="-64.3" font-family="arial" font-size="14.00">X1:3</text>
<polygon fill="#000000" stroke="transparent" points="0,-56.5 0,-58.5 102,-58.5 102,-56.5 0,-56.5"/>
<polygon fill="#0066ff" stroke="transparent" points="0,-54.5 0,-56.5 102,-56.5 102,-54.5 0,-54.5"/>
<polygon fill="#000000" stroke="transparent" points="0,-52.5 0,-54.5 102,-54.5 102,-52.5 0,-52.5"/>
<text text-anchor="start" x="10" y="-39.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;GN &#160;&#160;&#160;</text>
<text text-anchor="start" x="71" y="-39.3" font-family="arial" font-size="14.00">X1:4</text>
<polygon fill="#000000" stroke="transparent" points="0,-31.5 0,-33.5 102,-33.5 102,-31.5 0,-31.5"/>
<polygon fill="#00ff00" stroke="transparent" points="0,-29.5 0,-31.5 102,-31.5 102,-29.5 0,-29.5"/>
<polygon fill="#000000" stroke="transparent" points="0,-27.5 0,-29.5 102,-29.5 102,-27.5 0,-27.5"/>
<text text-anchor="start" x="2" y="-14.3" font-family="arial" font-size="14.00"> </text>
</g>
<!-- W1&#45;&#45;X1 -->
<g id="edge1" class="edge">
<title>W1:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-103.5C165.76,-103.52 181.75,-101.52 246,-101.5"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M102,-105.5C166.01,-105.5 181.99,-103.5 246,-103.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-107.5C166.25,-107.48 182.24,-105.48 246,-105.5"/>
</g>
<!-- W1&#45;&#45;X1 -->
<g id="edge2" class="edge">
<title>W1:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-78.5C165.88,-78.5 181.87,-77.5 246,-77.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-80.5C166,-80.5 182,-79.5 246,-79.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-82.5C166.13,-82.5 182.12,-81.5 246,-81.5"/>
</g>
<!-- W1&#45;&#45;X1 -->
<g id="edge3" class="edge">
<title>W1:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-53.5C166.13,-53.5 182.12,-54.5 246,-54.5"/>
<path fill="none" stroke="#0066ff" stroke-width="2" d="M102,-55.5C166,-55.5 182,-56.5 246,-56.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-57.5C165.88,-57.5 181.87,-58.5 246,-58.5"/>
</g>
<!-- W1&#45;&#45;X1 -->
<g id="edge4" class="edge">
<title>W1:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-28.5C166.38,-28.53 182.36,-31.53 246,-31.5"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M102,-30.5C166.01,-30.5 181.99,-33.5 246,-33.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-32.5C165.64,-32.47 181.62,-35.47 246,-35.5"/>
</g>
</g>
</svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2>
<div id="bom">
<table class="bom">
<tr>
<th class="bom_col_id">Id</th>
<th class="bom_col_description">Description</th>
<th class="bom_col_qty">Qty</th>
<th class="bom_col_unit">Unit</th>
<th class="bom_col_designators">Designators</th>
</tr>
<tr>
<td class="bom_col_id">1</td>
<td class="bom_col_description">Connector, Dupont 2.54mm, female, 5 pins, BK</td>
<td class="bom_col_qty">1</td>
<td class="bom_col_unit"></td>
<td class="bom_col_designators">X2</td>
</tr>
<tr>
<td class="bom_col_id">2</td>
<td class="bom_col_description">Connector, Dupont 2.54mm, male, 5 pins, BK</td>
<td class="bom_col_qty">1</td>
<td class="bom_col_unit"></td>
<td class="bom_col_designators">X1</td>
</tr>
<tr>
<td class="bom_col_id">3</td>
<td class="bom_col_description">Wire, BK</td>
<td class="bom_col_qty">0.4</td>
<td class="bom_col_unit">m</td>
<td class="bom_col_designators">W1, W2</td>
</tr>
<tr>
<td class="bom_col_id">4</td>
<td class="bom_col_description">Wire, BU</td>
<td class="bom_col_qty">0.4</td>
<td class="bom_col_unit">m</td>
<td class="bom_col_designators">W1, W2</td>
</tr>
<tr>
<td class="bom_col_id">5</td>
<td class="bom_col_description">Wire, GN</td>
<td class="bom_col_qty">0.4</td>
<td class="bom_col_unit">m</td>
<td class="bom_col_designators">W1, W2</td>
</tr>
<tr>
<td class="bom_col_id">6</td>
<td class="bom_col_description">Wire, RD</td>
<td class="bom_col_qty">0.4</td>
<td class="bom_col_unit">m</td>
<td class="bom_col_designators">W1, W2</td>
</tr>
</table>
</div>
</body></html>

BIN
examples/ex12.png generated Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

195
examples/ex12.svg generated Normal file
View File

@ -0,0 +1,195 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
-->
<!-- Pages: 1 -->
<svg width="1096pt" height="201pt"
viewBox="0.00 0.00 1096.00 200.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 196.5)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-196.5 1092,-196.5 1092,4 -4,4"/>
<!-- X1 -->
<g id="node1" class="node">
<title>X1</title>
<polygon fill="#ffffff" stroke="black" points="468,-161 246,-161 246,0 468,0 468,-161"/>
<polygon fill="none" stroke="black" points="246,-137.5 246,-160.5 468,-160.5 468,-137.5 246,-137.5"/>
<text text-anchor="start" x="348" y="-145.3" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="246,-114.5 246,-137.5 354,-137.5 354,-114.5 246,-114.5"/>
<text text-anchor="start" x="250" y="-122.3" font-family="arial" font-size="14.00">Dupont 2.54mm</text>
<polygon fill="none" stroke="black" points="354,-114.5 354,-137.5 393,-137.5 393,-114.5 354,-114.5"/>
<text text-anchor="start" x="358" y="-122.3" font-family="arial" font-size="14.00">male</text>
<polygon fill="none" stroke="black" points="393,-114.5 393,-137.5 433,-137.5 433,-114.5 393,-114.5"/>
<text text-anchor="start" x="397" y="-122.3" font-family="arial" font-size="14.00">5&#45;pin</text>
<polygon fill="none" stroke="black" points="433,-114.5 433,-137.5 460,-137.5 460,-114.5 433,-114.5"/>
<text text-anchor="start" x="437" y="-122.3" font-family="arial" font-size="14.00">BK</text>
<polygon fill="#000000" stroke="transparent" points="460,-114.5 460,-137.5 468,-137.5 468,-114.5 460,-114.5"/>
<polygon fill="none" stroke="black" points="460,-114.5 460,-137.5 468,-137.5 468,-114.5 460,-114.5"/>
<polygon fill="none" stroke="black" points="246,-91.5 246,-114.5 468,-114.5 468,-91.5 246,-91.5"/>
<text text-anchor="start" x="353" y="-99.3" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="246,-68.5 246,-91.5 468,-91.5 468,-68.5 246,-68.5"/>
<text text-anchor="start" x="353" y="-76.3" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="246,-45.5 246,-68.5 468,-68.5 468,-45.5 246,-45.5"/>
<text text-anchor="start" x="353" y="-53.3" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="246,-22.5 246,-45.5 468,-45.5 468,-22.5 246,-22.5"/>
<text text-anchor="start" x="353" y="-30.3" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="246,0.5 246,-22.5 468,-22.5 468,0.5 246,0.5"/>
<text text-anchor="start" x="353" y="-7.3" font-family="arial" font-size="14.00">5</text>
</g>
<!-- X2 -->
<g id="node2" class="node">
<title>X2</title>
<polygon fill="#ffffff" stroke="black" points="846,-161 612,-161 612,0 846,0 846,-161"/>
<polygon fill="none" stroke="black" points="612,-137.5 612,-160.5 846,-160.5 846,-137.5 612,-137.5"/>
<text text-anchor="start" x="720" y="-145.3" font-family="arial" font-size="14.00">X2</text>
<polygon fill="none" stroke="black" points="612,-114.5 612,-137.5 720,-137.5 720,-114.5 612,-114.5"/>
<text text-anchor="start" x="616" y="-122.3" font-family="arial" font-size="14.00">Dupont 2.54mm</text>
<polygon fill="none" stroke="black" points="720,-114.5 720,-137.5 771,-137.5 771,-114.5 720,-114.5"/>
<text text-anchor="start" x="724" y="-122.3" font-family="arial" font-size="14.00">female</text>
<polygon fill="none" stroke="black" points="771,-114.5 771,-137.5 811,-137.5 811,-114.5 771,-114.5"/>
<text text-anchor="start" x="775" y="-122.3" font-family="arial" font-size="14.00">5&#45;pin</text>
<polygon fill="none" stroke="black" points="811,-114.5 811,-137.5 838,-137.5 838,-114.5 811,-114.5"/>
<text text-anchor="start" x="815" y="-122.3" font-family="arial" font-size="14.00">BK</text>
<polygon fill="#000000" stroke="transparent" points="838,-114.5 838,-137.5 846,-137.5 846,-114.5 838,-114.5"/>
<polygon fill="none" stroke="black" points="838,-114.5 838,-137.5 846,-137.5 846,-114.5 838,-114.5"/>
<polygon fill="none" stroke="black" points="612,-91.5 612,-114.5 846,-114.5 846,-91.5 612,-91.5"/>
<text text-anchor="start" x="725" y="-99.3" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="612,-68.5 612,-91.5 846,-91.5 846,-68.5 612,-68.5"/>
<text text-anchor="start" x="725" y="-76.3" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="612,-45.5 612,-68.5 846,-68.5 846,-45.5 612,-45.5"/>
<text text-anchor="start" x="725" y="-53.3" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="612,-22.5 612,-45.5 846,-45.5 846,-22.5 612,-22.5"/>
<text text-anchor="start" x="725" y="-30.3" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="612,0.5 612,-22.5 846,-22.5 846,0.5 612,0.5"/>
<text text-anchor="start" x="725" y="-7.3" font-family="arial" font-size="14.00">5</text>
</g>
<!-- X1&#45;&#45;X2 -->
<g id="edge9" class="edge">
<title>X1:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M468,-79.5C528.5,-79.5 546.11,-79.5 601.91,-79.5"/>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M468,-81.5C528.5,-81.5 546.11,-81.5 601.91,-81.5"/>
<polygon fill="#000000" stroke="#000000" points="602,-84 612,-80.5 602,-77 602,-84"/>
</g>
<!-- W2 -->
<g id="node4" class="node">
<title>W2</title>
<polygon fill="#ffffff" stroke="black" stroke-dasharray="5,2" points="1088,-192.5 990,-192.5 990,-8.5 1088,-8.5 1088,-192.5"/>
<polygon fill="none" stroke="black" points="990,-169.5 990,-192.5 1088,-192.5 1088,-169.5 990,-169.5"/>
<text text-anchor="start" x="1028.5" y="-177.3" font-family="arial" font-size="14.00">W2</text>
<polygon fill="none" stroke="black" points="990,-146.5 990,-169.5 1029,-169.5 1029,-146.5 990,-146.5"/>
<text text-anchor="start" x="1002" y="-154.3" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="1029,-146.5 1029,-169.5 1088,-169.5 1088,-146.5 1029,-146.5"/>
<text text-anchor="start" x="1040.5" y="-154.3" font-family="arial" font-size="14.00">0.2 m</text>
<text text-anchor="start" x="1004.5" y="-133.3" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="992" y="-114.3" font-family="arial" font-size="14.00">X2:1</text>
<text text-anchor="start" x="1025.5" y="-114.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;RD &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="990,-106.5 990,-108.5 1088,-108.5 1088,-106.5 990,-106.5"/>
<polygon fill="#ff0000" stroke="transparent" points="990,-104.5 990,-106.5 1088,-106.5 1088,-104.5 990,-104.5"/>
<polygon fill="#000000" stroke="transparent" points="990,-102.5 990,-104.5 1088,-104.5 1088,-102.5 990,-102.5"/>
<text text-anchor="start" x="992" y="-89.3" font-family="arial" font-size="14.00">X2:2</text>
<text text-anchor="start" x="1026.5" y="-89.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;BK &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="990,-81.5 990,-83.5 1088,-83.5 1088,-81.5 990,-81.5"/>
<polygon fill="#000000" stroke="transparent" points="990,-79.5 990,-81.5 1088,-81.5 1088,-79.5 990,-79.5"/>
<polygon fill="#000000" stroke="transparent" points="990,-77.5 990,-79.5 1088,-79.5 1088,-77.5 990,-77.5"/>
<text text-anchor="start" x="992" y="-64.3" font-family="arial" font-size="14.00">X2:3</text>
<text text-anchor="start" x="1026" y="-64.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;BU &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="990,-56.5 990,-58.5 1088,-58.5 1088,-56.5 990,-56.5"/>
<polygon fill="#0066ff" stroke="transparent" points="990,-54.5 990,-56.5 1088,-56.5 1088,-54.5 990,-54.5"/>
<polygon fill="#000000" stroke="transparent" points="990,-52.5 990,-54.5 1088,-54.5 1088,-52.5 990,-52.5"/>
<text text-anchor="start" x="992" y="-39.3" font-family="arial" font-size="14.00">X2:4</text>
<text text-anchor="start" x="1025" y="-39.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;GN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="990,-31.5 990,-33.5 1088,-33.5 1088,-31.5 990,-31.5"/>
<polygon fill="#00ff00" stroke="transparent" points="990,-29.5 990,-31.5 1088,-31.5 1088,-29.5 990,-29.5"/>
<polygon fill="#000000" stroke="transparent" points="990,-27.5 990,-29.5 1088,-29.5 1088,-27.5 990,-27.5"/>
<text text-anchor="start" x="1004.5" y="-14.3" font-family="arial" font-size="14.00"> </text>
</g>
<!-- X2&#45;&#45;W2 -->
<g id="edge5" class="edge">
<title>X2:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-101.5C910.25,-101.52 926.24,-103.52 990,-103.5"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M846,-103.5C910.01,-103.5 925.99,-105.5 990,-105.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-105.5C909.76,-105.48 925.75,-107.48 990,-107.5"/>
</g>
<!-- X2&#45;&#45;W2 -->
<g id="edge6" class="edge">
<title>X2:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-77.5C910.13,-77.5 926.12,-78.5 990,-78.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-79.5C910,-79.5 926,-80.5 990,-80.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-81.5C909.88,-81.5 925.87,-82.5 990,-82.5"/>
</g>
<!-- X2&#45;&#45;W2 -->
<g id="edge7" class="edge">
<title>X2:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-54.5C909.88,-54.5 925.87,-53.5 990,-53.5"/>
<path fill="none" stroke="#0066ff" stroke-width="2" d="M846,-56.5C910,-56.5 926,-55.5 990,-55.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-58.5C910.13,-58.5 926.12,-57.5 990,-57.5"/>
</g>
<!-- X2&#45;&#45;W2 -->
<g id="edge8" class="edge">
<title>X2:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-31.5C909.64,-31.53 925.62,-28.53 990,-28.5"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M846,-33.5C910.01,-33.5 925.99,-30.5 990,-30.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M846,-35.5C910.38,-35.47 926.36,-32.47 990,-32.5"/>
</g>
<!-- W1 -->
<g id="node3" class="node">
<title>W1</title>
<polygon fill="#ffffff" stroke="black" stroke-dasharray="5,2" points="102,-192.5 0,-192.5 0,-8.5 102,-8.5 102,-192.5"/>
<polygon fill="none" stroke="black" points="0,-169.5 0,-192.5 102,-192.5 102,-169.5 0,-169.5"/>
<text text-anchor="start" x="40.5" y="-177.3" font-family="arial" font-size="14.00">W1</text>
<polygon fill="none" stroke="black" points="0,-146.5 0,-169.5 41,-169.5 41,-146.5 0,-146.5"/>
<text text-anchor="start" x="13" y="-154.3" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="41,-146.5 41,-169.5 102,-169.5 102,-146.5 41,-146.5"/>
<text text-anchor="start" x="53.5" y="-154.3" font-family="arial" font-size="14.00">0.2 m</text>
<text text-anchor="start" x="2" y="-133.3" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="10.5" y="-114.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;RD &#160;&#160;&#160;</text>
<text text-anchor="start" x="71" y="-114.3" font-family="arial" font-size="14.00">X1:1</text>
<polygon fill="#000000" stroke="transparent" points="0,-106.5 0,-108.5 102,-108.5 102,-106.5 0,-106.5"/>
<polygon fill="#ff0000" stroke="transparent" points="0,-104.5 0,-106.5 102,-106.5 102,-104.5 0,-104.5"/>
<polygon fill="#000000" stroke="transparent" points="0,-102.5 0,-104.5 102,-104.5 102,-102.5 0,-102.5"/>
<text text-anchor="start" x="11.5" y="-89.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;BK &#160;&#160;&#160;</text>
<text text-anchor="start" x="71" y="-89.3" font-family="arial" font-size="14.00">X1:2</text>
<polygon fill="#000000" stroke="transparent" points="0,-81.5 0,-83.5 102,-83.5 102,-81.5 0,-81.5"/>
<polygon fill="#000000" stroke="transparent" points="0,-79.5 0,-81.5 102,-81.5 102,-79.5 0,-79.5"/>
<polygon fill="#000000" stroke="transparent" points="0,-77.5 0,-79.5 102,-79.5 102,-77.5 0,-77.5"/>
<text text-anchor="start" x="11" y="-64.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;BU &#160;&#160;&#160;</text>
<text text-anchor="start" x="71" y="-64.3" font-family="arial" font-size="14.00">X1:3</text>
<polygon fill="#000000" stroke="transparent" points="0,-56.5 0,-58.5 102,-58.5 102,-56.5 0,-56.5"/>
<polygon fill="#0066ff" stroke="transparent" points="0,-54.5 0,-56.5 102,-56.5 102,-54.5 0,-54.5"/>
<polygon fill="#000000" stroke="transparent" points="0,-52.5 0,-54.5 102,-54.5 102,-52.5 0,-52.5"/>
<text text-anchor="start" x="10" y="-39.3" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;GN &#160;&#160;&#160;</text>
<text text-anchor="start" x="71" y="-39.3" font-family="arial" font-size="14.00">X1:4</text>
<polygon fill="#000000" stroke="transparent" points="0,-31.5 0,-33.5 102,-33.5 102,-31.5 0,-31.5"/>
<polygon fill="#00ff00" stroke="transparent" points="0,-29.5 0,-31.5 102,-31.5 102,-29.5 0,-29.5"/>
<polygon fill="#000000" stroke="transparent" points="0,-27.5 0,-29.5 102,-29.5 102,-27.5 0,-27.5"/>
<text text-anchor="start" x="2" y="-14.3" font-family="arial" font-size="14.00"> </text>
</g>
<!-- W1&#45;&#45;X1 -->
<g id="edge1" class="edge">
<title>W1:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-103.5C165.76,-103.52 181.75,-101.52 246,-101.5"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M102,-105.5C166.01,-105.5 181.99,-103.5 246,-103.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-107.5C166.25,-107.48 182.24,-105.48 246,-105.5"/>
</g>
<!-- W1&#45;&#45;X1 -->
<g id="edge2" class="edge">
<title>W1:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-78.5C165.88,-78.5 181.87,-77.5 246,-77.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-80.5C166,-80.5 182,-79.5 246,-79.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-82.5C166.13,-82.5 182.12,-81.5 246,-81.5"/>
</g>
<!-- W1&#45;&#45;X1 -->
<g id="edge3" class="edge">
<title>W1:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-53.5C166.13,-53.5 182.12,-54.5 246,-54.5"/>
<path fill="none" stroke="#0066ff" stroke-width="2" d="M102,-55.5C166,-55.5 182,-56.5 246,-56.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-57.5C165.88,-57.5 181.87,-58.5 246,-58.5"/>
</g>
<!-- W1&#45;&#45;X1 -->
<g id="edge4" class="edge">
<title>W1:e&#45;&#45;X1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-28.5C166.38,-28.53 182.36,-31.53 246,-31.5"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M102,-30.5C166.01,-30.5 181.99,-33.5 246,-33.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M102,-32.5C165.64,-32.47 181.62,-35.47 246,-35.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

4
examples/ex13.bom.tsv generated Normal file
View File

@ -0,0 +1,4 @@
Id Description Qty Unit Designators
1 Cable, 4 wires 0 m C1, C2, C3
2 Connector, 4 pins 3 X1, X2, X3
3 Connector, ferrule 4
1 Id Description Qty Unit Designators
2 1 Cable, 4 wires 0 m C1, C2, C3
3 2 Connector, 4 pins 3 X1, X2, X3
4 3 Connector, ferrule 4

433
examples/ex13.gv generated Normal file
View File

@ -0,0 +1,433 @@
graph {
// Graph generated by WireViz 0.4-dev
// https://github.com/formatc1702/WireViz
graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2]
node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0]
edge [fontname=arial style=bold]
X1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">X1</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4-pin</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1">
<tr>
<td>A</td>
<td port="p1r">1</td>
</tr>
<tr>
<td>B</td>
<td port="p2r">2</td>
</tr>
<tr>
<td>C</td>
<td port="p3r">3</td>
</tr>
<tr>
<td>D</td>
<td port="p4r">4</td>
</tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
F1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">ferrule</td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
F2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">ferrule</td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
F3 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">ferrule</td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
F4 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">ferrule</td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
X2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">X2</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4-pin</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1">
<tr>
<td port="p1l">1</td>
<td>A</td>
</tr>
<tr>
<td port="p2l">2</td>
<td>B</td>
</tr>
<tr>
<td port="p3l">3</td>
<td>C</td>
</tr>
<tr>
<td port="p4l">4</td>
<td>D</td>
</tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
X3 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">X3</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4-pin</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1">
<tr>
<td port="p1l">1</td>
<td>A</td>
</tr>
<tr>
<td port="p2l">2</td>
<td>B</td>
</tr>
<tr>
<td port="p3l">3</td>
<td>C</td>
</tr>
<tr>
<td port="p4l">4</td>
<td>D</td>
</tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ffffff:#000000"]
X1:p1r:e -- C1:w1:w
C1:w1:e -- F1:w
edge [color="#000000:#895956:#000000"]
X1:p2r:e -- C1:w2:w
C1:w2:e -- F2:w
edge [color="#000000:#00ff00:#000000"]
X1:p3r:e -- C1:w3:w
C1:w3:e -- F3:w
edge [color="#000000:#ffff00:#000000"]
X1:p4r:e -- C1:w4:w
C1:w4:e -- F4:w
C1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">C1</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4x</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellborder="0">
<tr><td>&nbsp;</td></tr>
<tr>
<td>X1:1:A</td>
<td>
1:WH
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w1" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffffff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td>X1:2:B</td>
<td>
2:BN
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w2" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#895956" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td>X1:3:C</td>
<td>
3:GN
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w3" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#00ff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td>X1:4:D</td>
<td>
4:YE
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w4" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr><td>&nbsp;</td></tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ffffff:#000000"]
F1:e -- C2:w1:w
C2:w1:e -- X2:p1l:w
edge [color="#000000:#895956:#000000"]
F2:e -- C2:w2:w
C2:w2:e -- X2:p2l:w
edge [color="#000000:#00ff00:#000000"]
F3:e -- C2:w3:w
C2:w3:e -- X2:p3l:w
edge [color="#000000:#ffff00:#000000"]
F4:e -- C2:w4:w
C2:w4:e -- X2:p4l:w
C2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">C2</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4x</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellborder="0">
<tr><td>&nbsp;</td></tr>
<tr>
<td></td>
<td>
1:WH
</td>
<td>X2:1:A</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w1" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffffff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td>
2:BN
</td>
<td>X2:2:B</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w2" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#895956" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td>
3:GN
</td>
<td>X2:3:C</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w3" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#00ff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td>
4:YE
</td>
<td>X2:4:D</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w4" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr><td>&nbsp;</td></tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ffffff:#000000"]
F1:e -- C3:w1:w
C3:w1:e -- X3:p1l:w
edge [color="#000000:#895956:#000000"]
F2:e -- C3:w2:w
C3:w2:e -- X3:p2l:w
edge [color="#000000:#00ff00:#000000"]
F3:e -- C3:w3:w
C3:w3:e -- X3:p3l:w
edge [color="#000000:#ffff00:#000000"]
F4:e -- C3:w4:w
C3:w4:e -- X3:p4l:w
C3 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">C3</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4x</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellborder="0">
<tr><td>&nbsp;</td></tr>
<tr>
<td></td>
<td>
1:WH
</td>
<td>X3:1:A</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w1" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffffff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td>
2:BN
</td>
<td>X3:2:B</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w2" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#895956" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td>
3:GN
</td>
<td>X3:3:C</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w3" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#00ff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td>
4:YE
</td>
<td>X3:4:D</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w4" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr><td>&nbsp;</td></tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
}

449
examples/ex13.html generated Normal file
View File

@ -0,0 +1,449 @@
<!DOCTYPE html>
<html lang="en"><head>
<meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex13</title>
<style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex13</h1>
<h2>Diagram</h2>
<div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
-->
<!-- Pages: 1 -->
<svg width="968pt" height="400pt"
viewBox="0.00 0.00 968.00 400.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 396)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-396 964,-396 964,4 -4,4"/>
<!-- X1 -->
<g id="node1" class="node">
<title>X1</title>
<polygon fill="#ffffff" stroke="black" points="40,-256 0,-256 0,-118 40,-118 40,-256"/>
<polygon fill="none" stroke="black" points="0,-233 0,-256 40,-256 40,-233 0,-233"/>
<text text-anchor="start" x="11" y="-240.8" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="0,-210 0,-233 40,-233 40,-210 0,-210"/>
<text text-anchor="start" x="4" y="-217.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="0,-187 0,-210 22,-210 22,-187 0,-187"/>
<text text-anchor="start" x="6" y="-194.8" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="22,-187 22,-210 40,-210 40,-187 22,-187"/>
<text text-anchor="start" x="27" y="-194.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="0,-164 0,-187 22,-187 22,-164 0,-164"/>
<text text-anchor="start" x="6" y="-171.8" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="22,-164 22,-187 40,-187 40,-164 22,-164"/>
<text text-anchor="start" x="27" y="-171.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="0,-141 0,-164 22,-164 22,-141 0,-141"/>
<text text-anchor="start" x="5.5" y="-148.8" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="22,-141 22,-164 40,-164 40,-141 22,-141"/>
<text text-anchor="start" x="27" y="-148.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="0,-118 0,-141 22,-141 22,-118 0,-118"/>
<text text-anchor="start" x="5.5" y="-125.8" font-family="arial" font-size="14.00">D</text>
<polygon fill="none" stroke="black" points="22,-118 22,-141 40,-141 40,-118 22,-118"/>
<text text-anchor="start" x="27" y="-125.8" font-family="arial" font-size="14.00">4</text>
</g>
<!-- C1 -->
<g id="node8" class="node">
<title>C1</title>
<polygon fill="#ffffff" stroke="black" points="310,-288 184,-288 184,-104 310,-104 310,-288"/>
<polygon fill="none" stroke="black" points="184,-265 184,-288 310,-288 310,-265 184,-265"/>
<text text-anchor="start" x="238" y="-272.8" font-family="arial" font-size="14.00">C1</text>
<polygon fill="none" stroke="black" points="184,-242 184,-265 310,-265 310,-242 184,-242"/>
<text text-anchor="start" x="239.5" y="-249.8" font-family="arial" font-size="14.00">4x</text>
<text text-anchor="start" x="205.5" y="-228.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="186" y="-209.8" font-family="arial" font-size="14.00">X1:1:A</text>
<text text-anchor="start" x="233" y="-209.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="184,-202 184,-204 310,-204 310,-202 184,-202"/>
<polygon fill="#ffffff" stroke="transparent" points="184,-200 184,-202 310,-202 310,-200 184,-200"/>
<polygon fill="#000000" stroke="transparent" points="184,-198 184,-200 310,-200 310,-198 184,-198"/>
<text text-anchor="start" x="186" y="-184.8" font-family="arial" font-size="14.00">X1:2:B</text>
<text text-anchor="start" x="235" y="-184.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="184,-177 184,-179 310,-179 310,-177 184,-177"/>
<polygon fill="#895956" stroke="transparent" points="184,-175 184,-177 310,-177 310,-175 184,-175"/>
<polygon fill="#000000" stroke="transparent" points="184,-173 184,-175 310,-175 310,-173 184,-173"/>
<text text-anchor="start" x="186" y="-159.8" font-family="arial" font-size="14.00">X1:3:C</text>
<text text-anchor="start" x="234.5" y="-159.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="184,-152 184,-154 310,-154 310,-152 184,-152"/>
<polygon fill="#00ff00" stroke="transparent" points="184,-150 184,-152 310,-152 310,-150 184,-150"/>
<polygon fill="#000000" stroke="transparent" points="184,-148 184,-150 310,-150 310,-148 184,-148"/>
<text text-anchor="start" x="186" y="-134.8" font-family="arial" font-size="14.00">X1:4:D</text>
<text text-anchor="start" x="235.5" y="-134.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="184,-127 184,-129 310,-129 310,-127 184,-127"/>
<polygon fill="#ffff00" stroke="transparent" points="184,-125 184,-127 310,-127 310,-125 184,-125"/>
<polygon fill="#000000" stroke="transparent" points="184,-123 184,-125 310,-125 310,-123 184,-123"/>
<text text-anchor="start" x="205.5" y="-109.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- X1&#45;&#45;C1 -->
<g id="edge1" class="edge">
<title>X1:e&#45;&#45;C1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-197C104.25,-197.02 120.24,-199.02 184,-199"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M40,-199C104.01,-199 119.99,-201 184,-201"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-201C103.76,-200.98 119.75,-202.98 184,-203"/>
</g>
<!-- X1&#45;&#45;C1 -->
<g id="edge3" class="edge">
<title>X1:e&#45;&#45;C1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-173C104.13,-173 120.12,-174 184,-174"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M40,-175C104,-175 120,-176 184,-176"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-177C103.88,-177 119.87,-178 184,-178"/>
</g>
<!-- X1&#45;&#45;C1 -->
<g id="edge5" class="edge">
<title>X1:e&#45;&#45;C1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-150C103.88,-150 119.87,-149 184,-149"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M40,-152C104,-152 120,-151 184,-151"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-154C104.13,-154 120.12,-153 184,-153"/>
</g>
<!-- X1&#45;&#45;C1 -->
<g id="edge7" class="edge">
<title>X1:e&#45;&#45;C1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-127C103.64,-127.03 119.62,-124.03 184,-124"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M40,-129C104.01,-129 119.99,-126 184,-126"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-131C104.38,-130.97 120.36,-127.97 184,-128"/>
</g>
<!-- F1 -->
<g id="node2" class="node">
<title>F1</title>
<polygon fill="#ffffff" stroke="black" points="502,-245.5 454,-245.5 454,-222.5 502,-222.5 502,-245.5"/>
<polygon fill="none" stroke="black" points="454,-222 454,-245 502,-245 502,-222 454,-222"/>
<text text-anchor="start" x="458" y="-229.8" font-family="arial" font-size="14.00">ferrule</text>
</g>
<!-- C2 -->
<g id="node9" class="node">
<title>C2</title>
<polygon fill="#ffffff" stroke="black" points="776,-392 646,-392 646,-208 776,-208 776,-392"/>
<polygon fill="none" stroke="black" points="646,-369 646,-392 776,-392 776,-369 646,-369"/>
<text text-anchor="start" x="702" y="-376.8" font-family="arial" font-size="14.00">C2</text>
<polygon fill="none" stroke="black" points="646,-346 646,-369 776,-369 776,-346 646,-346"/>
<text text-anchor="start" x="703.5" y="-353.8" font-family="arial" font-size="14.00">4x</text>
<text text-anchor="start" x="648" y="-332.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="656" y="-313.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-313.8" font-family="arial" font-size="14.00">X2:1:A</text>
<polygon fill="#000000" stroke="transparent" points="646,-306 646,-308 776,-308 776,-306 646,-306"/>
<polygon fill="#ffffff" stroke="transparent" points="646,-304 646,-306 776,-306 776,-304 646,-304"/>
<polygon fill="#000000" stroke="transparent" points="646,-302 646,-304 776,-304 776,-302 646,-302"/>
<text text-anchor="start" x="658" y="-288.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-288.8" font-family="arial" font-size="14.00">X2:2:B</text>
<polygon fill="#000000" stroke="transparent" points="646,-281 646,-283 776,-283 776,-281 646,-281"/>
<polygon fill="#895956" stroke="transparent" points="646,-279 646,-281 776,-281 776,-279 646,-279"/>
<polygon fill="#000000" stroke="transparent" points="646,-277 646,-279 776,-279 776,-277 646,-277"/>
<text text-anchor="start" x="657.5" y="-263.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-263.8" font-family="arial" font-size="14.00">X2:3:C</text>
<polygon fill="#000000" stroke="transparent" points="646,-256 646,-258 776,-258 776,-256 646,-256"/>
<polygon fill="#00ff00" stroke="transparent" points="646,-254 646,-256 776,-256 776,-254 646,-254"/>
<polygon fill="#000000" stroke="transparent" points="646,-252 646,-254 776,-254 776,-252 646,-252"/>
<text text-anchor="start" x="658.5" y="-238.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-238.8" font-family="arial" font-size="14.00">X2:4:D</text>
<polygon fill="#000000" stroke="transparent" points="646,-231 646,-233 776,-233 776,-231 646,-231"/>
<polygon fill="#ffff00" stroke="transparent" points="646,-229 646,-231 776,-231 776,-229 646,-229"/>
<polygon fill="#000000" stroke="transparent" points="646,-227 646,-229 776,-229 776,-227 646,-227"/>
<text text-anchor="start" x="648" y="-213.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- F1&#45;&#45;C2 -->
<g id="edge9" class="edge">
<title>F1:e&#45;&#45;C2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-232C575.36,-233.96 576.64,-304.96 646,-303"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M502,-234C573.36,-234 574.64,-305 646,-305"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-236C571.36,-234.04 572.64,-305.04 646,-307"/>
</g>
<!-- C3 -->
<g id="node10" class="node">
<title>C3</title>
<polygon fill="#ffffff" stroke="black" points="776,-184 646,-184 646,0 776,0 776,-184"/>
<polygon fill="none" stroke="black" points="646,-161 646,-184 776,-184 776,-161 646,-161"/>
<text text-anchor="start" x="702" y="-168.8" font-family="arial" font-size="14.00">C3</text>
<polygon fill="none" stroke="black" points="646,-138 646,-161 776,-161 776,-138 646,-138"/>
<text text-anchor="start" x="703.5" y="-145.8" font-family="arial" font-size="14.00">4x</text>
<text text-anchor="start" x="648" y="-124.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="656" y="-105.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-105.8" font-family="arial" font-size="14.00">X3:1:A</text>
<polygon fill="#000000" stroke="transparent" points="646,-98 646,-100 776,-100 776,-98 646,-98"/>
<polygon fill="#ffffff" stroke="transparent" points="646,-96 646,-98 776,-98 776,-96 646,-96"/>
<polygon fill="#000000" stroke="transparent" points="646,-94 646,-96 776,-96 776,-94 646,-94"/>
<text text-anchor="start" x="658" y="-80.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-80.8" font-family="arial" font-size="14.00">X3:2:B</text>
<polygon fill="#000000" stroke="transparent" points="646,-73 646,-75 776,-75 776,-73 646,-73"/>
<polygon fill="#895956" stroke="transparent" points="646,-71 646,-73 776,-73 776,-71 646,-71"/>
<polygon fill="#000000" stroke="transparent" points="646,-69 646,-71 776,-71 776,-69 646,-69"/>
<text text-anchor="start" x="657.5" y="-55.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-55.8" font-family="arial" font-size="14.00">X3:3:C</text>
<polygon fill="#000000" stroke="transparent" points="646,-48 646,-50 776,-50 776,-48 646,-48"/>
<polygon fill="#00ff00" stroke="transparent" points="646,-46 646,-48 776,-48 776,-46 646,-46"/>
<polygon fill="#000000" stroke="transparent" points="646,-44 646,-46 776,-46 776,-44 646,-44"/>
<text text-anchor="start" x="658.5" y="-30.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-30.8" font-family="arial" font-size="14.00">X3:4:D</text>
<polygon fill="#000000" stroke="transparent" points="646,-23 646,-25 776,-25 776,-23 646,-23"/>
<polygon fill="#ffff00" stroke="transparent" points="646,-21 646,-23 776,-23 776,-21 646,-21"/>
<polygon fill="#000000" stroke="transparent" points="646,-19 646,-21 776,-21 776,-19 646,-19"/>
<text text-anchor="start" x="648" y="-5.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- F1&#45;&#45;C3 -->
<g id="edge17" class="edge">
<title>F1:e&#45;&#45;C3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-232C588.39,-234.46 555.72,-97.46 646,-95"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M502,-234C590.34,-234 557.66,-97 646,-97"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-236C592.28,-233.54 559.61,-96.54 646,-99"/>
</g>
<!-- F2 -->
<g id="node3" class="node">
<title>F2</title>
<polygon fill="#ffffff" stroke="black" points="502,-198.5 454,-198.5 454,-175.5 502,-175.5 502,-198.5"/>
<polygon fill="none" stroke="black" points="454,-175 454,-198 502,-198 502,-175 454,-175"/>
<text text-anchor="start" x="458" y="-182.8" font-family="arial" font-size="14.00">ferrule</text>
</g>
<!-- F2&#45;&#45;C2 -->
<g id="edge11" class="edge">
<title>F2:e&#45;&#45;C2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-185C580.18,-187.18 571.81,-280.18 646,-278"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M502,-187C578.19,-187 569.81,-280 646,-280"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-189C576.19,-186.82 567.82,-279.82 646,-282"/>
</g>
<!-- F2&#45;&#45;C3 -->
<g id="edge19" class="edge">
<title>F2:e&#45;&#45;C3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-185C581.93,-187.34 562.12,-72.34 646,-70"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M502,-187C583.9,-187 564.1,-72 646,-72"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-189C585.88,-186.66 566.07,-71.66 646,-74"/>
</g>
<!-- F3 -->
<g id="node4" class="node">
<title>F3</title>
<polygon fill="#ffffff" stroke="black" points="502,-151.5 454,-151.5 454,-128.5 502,-128.5 502,-151.5"/>
<polygon fill="none" stroke="black" points="454,-128 454,-151 502,-151 502,-128 454,-128"/>
<text text-anchor="start" x="458" y="-135.8" font-family="arial" font-size="14.00">ferrule</text>
</g>
<!-- F3&#45;&#45;C2 -->
<g id="edge13" class="edge">
<title>F3:e&#45;&#45;C2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-138C585.88,-140.34 566.07,-255.34 646,-253"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M502,-140C583.9,-140 564.1,-255 646,-255"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-142C581.93,-139.66 562.12,-254.66 646,-257"/>
</g>
<!-- F3&#45;&#45;C3 -->
<g id="edge21" class="edge">
<title>F3:e&#45;&#45;C3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-138C576.19,-140.18 567.82,-47.18 646,-45"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M502,-140C578.19,-140 569.81,-47 646,-47"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-142C580.18,-139.82 571.81,-46.82 646,-49"/>
</g>
<!-- F4 -->
<g id="node5" class="node">
<title>F4</title>
<polygon fill="#ffffff" stroke="black" points="502,-104.5 454,-104.5 454,-81.5 502,-81.5 502,-104.5"/>
<polygon fill="none" stroke="black" points="454,-81 454,-104 502,-104 502,-81 454,-81"/>
<text text-anchor="start" x="458" y="-88.8" font-family="arial" font-size="14.00">ferrule</text>
</g>
<!-- F4&#45;&#45;C2 -->
<g id="edge15" class="edge">
<title>F4:e&#45;&#45;C2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-91C592.28,-93.46 559.61,-230.46 646,-228"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M502,-93C590.34,-93 557.66,-230 646,-230"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-95C588.39,-92.54 555.72,-229.54 646,-232"/>
</g>
<!-- F4&#45;&#45;C3 -->
<g id="edge23" class="edge">
<title>F4:e&#45;&#45;C3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-91C571.36,-92.96 572.64,-21.96 646,-20"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M502,-93C573.36,-93 574.64,-22 646,-22"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-95C575.36,-93.04 576.64,-22.04 646,-24"/>
</g>
<!-- X2 -->
<g id="node6" class="node">
<title>X2</title>
<polygon fill="#ffffff" stroke="black" points="960,-360 920,-360 920,-222 960,-222 960,-360"/>
<polygon fill="none" stroke="black" points="920,-337 920,-360 960,-360 960,-337 920,-337"/>
<text text-anchor="start" x="931" y="-344.8" font-family="arial" font-size="14.00">X2</text>
<polygon fill="none" stroke="black" points="920,-314 920,-337 960,-337 960,-314 920,-314"/>
<text text-anchor="start" x="924" y="-321.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="920,-291 920,-314 939,-314 939,-291 920,-291"/>
<text text-anchor="start" x="925.5" y="-298.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="939,-291 939,-314 960,-314 960,-291 939,-291"/>
<text text-anchor="start" x="944.5" y="-298.8" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="920,-268 920,-291 939,-291 939,-268 920,-268"/>
<text text-anchor="start" x="925.5" y="-275.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="939,-268 939,-291 960,-291 960,-268 939,-268"/>
<text text-anchor="start" x="944.5" y="-275.8" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="920,-245 920,-268 939,-268 939,-245 920,-245"/>
<text text-anchor="start" x="925.5" y="-252.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="939,-245 939,-268 960,-268 960,-245 939,-245"/>
<text text-anchor="start" x="944" y="-252.8" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="920,-222 920,-245 939,-245 939,-222 920,-222"/>
<text text-anchor="start" x="925.5" y="-229.8" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="939,-222 939,-245 960,-245 960,-222 939,-222"/>
<text text-anchor="start" x="944" y="-229.8" font-family="arial" font-size="14.00">D</text>
</g>
<!-- X3 -->
<g id="node7" class="node">
<title>X3</title>
<polygon fill="#ffffff" stroke="black" points="960,-152 920,-152 920,-14 960,-14 960,-152"/>
<polygon fill="none" stroke="black" points="920,-129 920,-152 960,-152 960,-129 920,-129"/>
<text text-anchor="start" x="931" y="-136.8" font-family="arial" font-size="14.00">X3</text>
<polygon fill="none" stroke="black" points="920,-106 920,-129 960,-129 960,-106 920,-106"/>
<text text-anchor="start" x="924" y="-113.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="920,-83 920,-106 939,-106 939,-83 920,-83"/>
<text text-anchor="start" x="925.5" y="-90.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="939,-83 939,-106 960,-106 960,-83 939,-83"/>
<text text-anchor="start" x="944.5" y="-90.8" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="920,-60 920,-83 939,-83 939,-60 920,-60"/>
<text text-anchor="start" x="925.5" y="-67.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="939,-60 939,-83 960,-83 960,-60 939,-60"/>
<text text-anchor="start" x="944.5" y="-67.8" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="920,-37 920,-60 939,-60 939,-37 920,-37"/>
<text text-anchor="start" x="925.5" y="-44.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="939,-37 939,-60 960,-60 960,-37 939,-37"/>
<text text-anchor="start" x="944" y="-44.8" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="920,-14 920,-37 939,-37 939,-14 920,-14"/>
<text text-anchor="start" x="925.5" y="-21.8" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="939,-14 939,-37 960,-37 960,-14 939,-14"/>
<text text-anchor="start" x="944" y="-21.8" font-family="arial" font-size="14.00">D</text>
</g>
<!-- C1&#45;&#45;F1 -->
<g id="edge2" class="edge">
<title>C1:e&#45;&#45;F1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-199C377.53,-200.28 390.21,-233.28 454,-232"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M310,-201C375.66,-201 388.34,-234 454,-234"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-203C373.79,-201.72 386.47,-234.72 454,-236"/>
</g>
<!-- C1&#45;&#45;F2 -->
<g id="edge4" class="edge">
<title>C1:e&#45;&#45;F2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-174C375.34,-174.36 390.96,-185.36 454,-185"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M310,-176C374.19,-176 389.81,-187 454,-187"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-178C373.04,-177.64 388.66,-188.64 454,-189"/>
</g>
<!-- C1&#45;&#45;F3 -->
<g id="edge6" class="edge">
<title>C1:e&#45;&#45;F3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-149C373.04,-149.36 388.66,-138.36 454,-138"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M310,-151C374.19,-151 389.81,-140 454,-140"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-153C375.34,-152.64 390.96,-141.64 454,-142"/>
</g>
<!-- C1&#45;&#45;F4 -->
<g id="edge8" class="edge">
<title>C1:e&#45;&#45;F4:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-124C373.79,-125.28 386.47,-92.28 454,-91"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M310,-126C375.66,-126 388.34,-93 454,-93"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-128C377.53,-126.72 390.21,-93.72 454,-95"/>
</g>
<!-- C2&#45;&#45;X2 -->
<g id="edge10" class="edge">
<title>C2:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-303C839.76,-303.02 855.75,-301.02 920,-301"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M776,-305C840.01,-305 855.99,-303 920,-303"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-307C840.25,-306.98 856.24,-304.98 920,-305"/>
</g>
<!-- C2&#45;&#45;X2 -->
<g id="edge12" class="edge">
<title>C2:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-278C839.88,-278 855.87,-277 920,-277"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M776,-280C840,-280 856,-279 920,-279"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-282C840.13,-282 856.12,-281 920,-281"/>
</g>
<!-- C2&#45;&#45;X2 -->
<g id="edge14" class="edge">
<title>C2:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-253C840.13,-253 856.12,-254 920,-254"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M776,-255C840,-255 856,-256 920,-256"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-257C839.88,-257 855.87,-258 920,-258"/>
</g>
<!-- C2&#45;&#45;X2 -->
<g id="edge16" class="edge">
<title>C2:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-228C840.38,-228.03 856.36,-231.03 920,-231"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M776,-230C840.01,-230 855.99,-233 920,-233"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-232C839.64,-231.97 855.62,-234.97 920,-235"/>
</g>
<!-- C3&#45;&#45;X3 -->
<g id="edge18" class="edge">
<title>C3:e&#45;&#45;X3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-95C839.76,-95.02 855.75,-93.02 920,-93"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M776,-97C840.01,-97 855.99,-95 920,-95"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-99C840.25,-98.98 856.24,-96.98 920,-97"/>
</g>
<!-- C3&#45;&#45;X3 -->
<g id="edge20" class="edge">
<title>C3:e&#45;&#45;X3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-70C839.88,-70 855.87,-69 920,-69"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M776,-72C840,-72 856,-71 920,-71"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-74C840.13,-74 856.12,-73 920,-73"/>
</g>
<!-- C3&#45;&#45;X3 -->
<g id="edge22" class="edge">
<title>C3:e&#45;&#45;X3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-45C840.13,-45 856.12,-46 920,-46"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M776,-47C840,-47 856,-48 920,-48"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-49C839.88,-49 855.87,-50 920,-50"/>
</g>
<!-- C3&#45;&#45;X3 -->
<g id="edge24" class="edge">
<title>C3:e&#45;&#45;X3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-20C840.38,-20.03 856.36,-23.03 920,-23"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M776,-22C840.01,-22 855.99,-25 920,-25"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-24C839.64,-23.97 855.62,-26.97 920,-27"/>
</g>
</g>
</svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2>
<div id="bom">
<table class="bom">
<tr>
<th class="bom_col_id">Id</th>
<th class="bom_col_description">Description</th>
<th class="bom_col_qty">Qty</th>
<th class="bom_col_unit">Unit</th>
<th class="bom_col_designators">Designators</th>
</tr>
<tr>
<td class="bom_col_id">1</td>
<td class="bom_col_description">Cable, 4 wires</td>
<td class="bom_col_qty">0</td>
<td class="bom_col_unit">m</td>
<td class="bom_col_designators">C1, C2, C3</td>
</tr>
<tr>
<td class="bom_col_id">2</td>
<td class="bom_col_description">Connector, 4 pins</td>
<td class="bom_col_qty">3</td>
<td class="bom_col_unit"></td>
<td class="bom_col_designators">X1, X2, X3</td>
</tr>
<tr>
<td class="bom_col_id">3</td>
<td class="bom_col_description">Connector, ferrule</td>
<td class="bom_col_qty">4</td>
<td class="bom_col_unit"></td>
<td class="bom_col_designators"></td>
</tr>
</table>
</div>
</body></html>

BIN
examples/ex13.png generated Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

376
examples/ex13.svg generated Normal file
View File

@ -0,0 +1,376 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
-->
<!-- Pages: 1 -->
<svg width="968pt" height="400pt"
viewBox="0.00 0.00 968.00 400.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 396)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-396 964,-396 964,4 -4,4"/>
<!-- X1 -->
<g id="node1" class="node">
<title>X1</title>
<polygon fill="#ffffff" stroke="black" points="40,-256 0,-256 0,-118 40,-118 40,-256"/>
<polygon fill="none" stroke="black" points="0,-233 0,-256 40,-256 40,-233 0,-233"/>
<text text-anchor="start" x="11" y="-240.8" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="0,-210 0,-233 40,-233 40,-210 0,-210"/>
<text text-anchor="start" x="4" y="-217.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="0,-187 0,-210 22,-210 22,-187 0,-187"/>
<text text-anchor="start" x="6" y="-194.8" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="22,-187 22,-210 40,-210 40,-187 22,-187"/>
<text text-anchor="start" x="27" y="-194.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="0,-164 0,-187 22,-187 22,-164 0,-164"/>
<text text-anchor="start" x="6" y="-171.8" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="22,-164 22,-187 40,-187 40,-164 22,-164"/>
<text text-anchor="start" x="27" y="-171.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="0,-141 0,-164 22,-164 22,-141 0,-141"/>
<text text-anchor="start" x="5.5" y="-148.8" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="22,-141 22,-164 40,-164 40,-141 22,-141"/>
<text text-anchor="start" x="27" y="-148.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="0,-118 0,-141 22,-141 22,-118 0,-118"/>
<text text-anchor="start" x="5.5" y="-125.8" font-family="arial" font-size="14.00">D</text>
<polygon fill="none" stroke="black" points="22,-118 22,-141 40,-141 40,-118 22,-118"/>
<text text-anchor="start" x="27" y="-125.8" font-family="arial" font-size="14.00">4</text>
</g>
<!-- C1 -->
<g id="node8" class="node">
<title>C1</title>
<polygon fill="#ffffff" stroke="black" points="310,-288 184,-288 184,-104 310,-104 310,-288"/>
<polygon fill="none" stroke="black" points="184,-265 184,-288 310,-288 310,-265 184,-265"/>
<text text-anchor="start" x="238" y="-272.8" font-family="arial" font-size="14.00">C1</text>
<polygon fill="none" stroke="black" points="184,-242 184,-265 310,-265 310,-242 184,-242"/>
<text text-anchor="start" x="239.5" y="-249.8" font-family="arial" font-size="14.00">4x</text>
<text text-anchor="start" x="205.5" y="-228.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="186" y="-209.8" font-family="arial" font-size="14.00">X1:1:A</text>
<text text-anchor="start" x="233" y="-209.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="184,-202 184,-204 310,-204 310,-202 184,-202"/>
<polygon fill="#ffffff" stroke="transparent" points="184,-200 184,-202 310,-202 310,-200 184,-200"/>
<polygon fill="#000000" stroke="transparent" points="184,-198 184,-200 310,-200 310,-198 184,-198"/>
<text text-anchor="start" x="186" y="-184.8" font-family="arial" font-size="14.00">X1:2:B</text>
<text text-anchor="start" x="235" y="-184.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="184,-177 184,-179 310,-179 310,-177 184,-177"/>
<polygon fill="#895956" stroke="transparent" points="184,-175 184,-177 310,-177 310,-175 184,-175"/>
<polygon fill="#000000" stroke="transparent" points="184,-173 184,-175 310,-175 310,-173 184,-173"/>
<text text-anchor="start" x="186" y="-159.8" font-family="arial" font-size="14.00">X1:3:C</text>
<text text-anchor="start" x="234.5" y="-159.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="184,-152 184,-154 310,-154 310,-152 184,-152"/>
<polygon fill="#00ff00" stroke="transparent" points="184,-150 184,-152 310,-152 310,-150 184,-150"/>
<polygon fill="#000000" stroke="transparent" points="184,-148 184,-150 310,-150 310,-148 184,-148"/>
<text text-anchor="start" x="186" y="-134.8" font-family="arial" font-size="14.00">X1:4:D</text>
<text text-anchor="start" x="235.5" y="-134.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="184,-127 184,-129 310,-129 310,-127 184,-127"/>
<polygon fill="#ffff00" stroke="transparent" points="184,-125 184,-127 310,-127 310,-125 184,-125"/>
<polygon fill="#000000" stroke="transparent" points="184,-123 184,-125 310,-125 310,-123 184,-123"/>
<text text-anchor="start" x="205.5" y="-109.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- X1&#45;&#45;C1 -->
<g id="edge1" class="edge">
<title>X1:e&#45;&#45;C1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-197C104.25,-197.02 120.24,-199.02 184,-199"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M40,-199C104.01,-199 119.99,-201 184,-201"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-201C103.76,-200.98 119.75,-202.98 184,-203"/>
</g>
<!-- X1&#45;&#45;C1 -->
<g id="edge3" class="edge">
<title>X1:e&#45;&#45;C1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-173C104.13,-173 120.12,-174 184,-174"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M40,-175C104,-175 120,-176 184,-176"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-177C103.88,-177 119.87,-178 184,-178"/>
</g>
<!-- X1&#45;&#45;C1 -->
<g id="edge5" class="edge">
<title>X1:e&#45;&#45;C1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-150C103.88,-150 119.87,-149 184,-149"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M40,-152C104,-152 120,-151 184,-151"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-154C104.13,-154 120.12,-153 184,-153"/>
</g>
<!-- X1&#45;&#45;C1 -->
<g id="edge7" class="edge">
<title>X1:e&#45;&#45;C1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-127C103.64,-127.03 119.62,-124.03 184,-124"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M40,-129C104.01,-129 119.99,-126 184,-126"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M40,-131C104.38,-130.97 120.36,-127.97 184,-128"/>
</g>
<!-- F1 -->
<g id="node2" class="node">
<title>F1</title>
<polygon fill="#ffffff" stroke="black" points="502,-245.5 454,-245.5 454,-222.5 502,-222.5 502,-245.5"/>
<polygon fill="none" stroke="black" points="454,-222 454,-245 502,-245 502,-222 454,-222"/>
<text text-anchor="start" x="458" y="-229.8" font-family="arial" font-size="14.00">ferrule</text>
</g>
<!-- C2 -->
<g id="node9" class="node">
<title>C2</title>
<polygon fill="#ffffff" stroke="black" points="776,-392 646,-392 646,-208 776,-208 776,-392"/>
<polygon fill="none" stroke="black" points="646,-369 646,-392 776,-392 776,-369 646,-369"/>
<text text-anchor="start" x="702" y="-376.8" font-family="arial" font-size="14.00">C2</text>
<polygon fill="none" stroke="black" points="646,-346 646,-369 776,-369 776,-346 646,-346"/>
<text text-anchor="start" x="703.5" y="-353.8" font-family="arial" font-size="14.00">4x</text>
<text text-anchor="start" x="648" y="-332.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="656" y="-313.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-313.8" font-family="arial" font-size="14.00">X2:1:A</text>
<polygon fill="#000000" stroke="transparent" points="646,-306 646,-308 776,-308 776,-306 646,-306"/>
<polygon fill="#ffffff" stroke="transparent" points="646,-304 646,-306 776,-306 776,-304 646,-304"/>
<polygon fill="#000000" stroke="transparent" points="646,-302 646,-304 776,-304 776,-302 646,-302"/>
<text text-anchor="start" x="658" y="-288.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-288.8" font-family="arial" font-size="14.00">X2:2:B</text>
<polygon fill="#000000" stroke="transparent" points="646,-281 646,-283 776,-283 776,-281 646,-281"/>
<polygon fill="#895956" stroke="transparent" points="646,-279 646,-281 776,-281 776,-279 646,-279"/>
<polygon fill="#000000" stroke="transparent" points="646,-277 646,-279 776,-279 776,-277 646,-277"/>
<text text-anchor="start" x="657.5" y="-263.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-263.8" font-family="arial" font-size="14.00">X2:3:C</text>
<polygon fill="#000000" stroke="transparent" points="646,-256 646,-258 776,-258 776,-256 646,-256"/>
<polygon fill="#00ff00" stroke="transparent" points="646,-254 646,-256 776,-256 776,-254 646,-254"/>
<polygon fill="#000000" stroke="transparent" points="646,-252 646,-254 776,-254 776,-252 646,-252"/>
<text text-anchor="start" x="658.5" y="-238.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-238.8" font-family="arial" font-size="14.00">X2:4:D</text>
<polygon fill="#000000" stroke="transparent" points="646,-231 646,-233 776,-233 776,-231 646,-231"/>
<polygon fill="#ffff00" stroke="transparent" points="646,-229 646,-231 776,-231 776,-229 646,-229"/>
<polygon fill="#000000" stroke="transparent" points="646,-227 646,-229 776,-229 776,-227 646,-227"/>
<text text-anchor="start" x="648" y="-213.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- F1&#45;&#45;C2 -->
<g id="edge9" class="edge">
<title>F1:e&#45;&#45;C2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-232C575.36,-233.96 576.64,-304.96 646,-303"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M502,-234C573.36,-234 574.64,-305 646,-305"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-236C571.36,-234.04 572.64,-305.04 646,-307"/>
</g>
<!-- C3 -->
<g id="node10" class="node">
<title>C3</title>
<polygon fill="#ffffff" stroke="black" points="776,-184 646,-184 646,0 776,0 776,-184"/>
<polygon fill="none" stroke="black" points="646,-161 646,-184 776,-184 776,-161 646,-161"/>
<text text-anchor="start" x="702" y="-168.8" font-family="arial" font-size="14.00">C3</text>
<polygon fill="none" stroke="black" points="646,-138 646,-161 776,-161 776,-138 646,-138"/>
<text text-anchor="start" x="703.5" y="-145.8" font-family="arial" font-size="14.00">4x</text>
<text text-anchor="start" x="648" y="-124.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="656" y="-105.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-105.8" font-family="arial" font-size="14.00">X3:1:A</text>
<polygon fill="#000000" stroke="transparent" points="646,-98 646,-100 776,-100 776,-98 646,-98"/>
<polygon fill="#ffffff" stroke="transparent" points="646,-96 646,-98 776,-98 776,-96 646,-96"/>
<polygon fill="#000000" stroke="transparent" points="646,-94 646,-96 776,-96 776,-94 646,-94"/>
<text text-anchor="start" x="658" y="-80.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-80.8" font-family="arial" font-size="14.00">X3:2:B</text>
<polygon fill="#000000" stroke="transparent" points="646,-73 646,-75 776,-75 776,-73 646,-73"/>
<polygon fill="#895956" stroke="transparent" points="646,-71 646,-73 776,-73 776,-71 646,-71"/>
<polygon fill="#000000" stroke="transparent" points="646,-69 646,-71 776,-71 776,-69 646,-69"/>
<text text-anchor="start" x="657.5" y="-55.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-55.8" font-family="arial" font-size="14.00">X3:3:C</text>
<polygon fill="#000000" stroke="transparent" points="646,-48 646,-50 776,-50 776,-48 646,-48"/>
<polygon fill="#00ff00" stroke="transparent" points="646,-46 646,-48 776,-48 776,-46 646,-46"/>
<polygon fill="#000000" stroke="transparent" points="646,-44 646,-46 776,-46 776,-44 646,-44"/>
<text text-anchor="start" x="658.5" y="-30.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<text text-anchor="start" x="731" y="-30.8" font-family="arial" font-size="14.00">X3:4:D</text>
<polygon fill="#000000" stroke="transparent" points="646,-23 646,-25 776,-25 776,-23 646,-23"/>
<polygon fill="#ffff00" stroke="transparent" points="646,-21 646,-23 776,-23 776,-21 646,-21"/>
<polygon fill="#000000" stroke="transparent" points="646,-19 646,-21 776,-21 776,-19 646,-19"/>
<text text-anchor="start" x="648" y="-5.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- F1&#45;&#45;C3 -->
<g id="edge17" class="edge">
<title>F1:e&#45;&#45;C3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-232C588.39,-234.46 555.72,-97.46 646,-95"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M502,-234C590.34,-234 557.66,-97 646,-97"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-236C592.28,-233.54 559.61,-96.54 646,-99"/>
</g>
<!-- F2 -->
<g id="node3" class="node">
<title>F2</title>
<polygon fill="#ffffff" stroke="black" points="502,-198.5 454,-198.5 454,-175.5 502,-175.5 502,-198.5"/>
<polygon fill="none" stroke="black" points="454,-175 454,-198 502,-198 502,-175 454,-175"/>
<text text-anchor="start" x="458" y="-182.8" font-family="arial" font-size="14.00">ferrule</text>
</g>
<!-- F2&#45;&#45;C2 -->
<g id="edge11" class="edge">
<title>F2:e&#45;&#45;C2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-185C580.18,-187.18 571.81,-280.18 646,-278"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M502,-187C578.19,-187 569.81,-280 646,-280"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-189C576.19,-186.82 567.82,-279.82 646,-282"/>
</g>
<!-- F2&#45;&#45;C3 -->
<g id="edge19" class="edge">
<title>F2:e&#45;&#45;C3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-185C581.93,-187.34 562.12,-72.34 646,-70"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M502,-187C583.9,-187 564.1,-72 646,-72"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-189C585.88,-186.66 566.07,-71.66 646,-74"/>
</g>
<!-- F3 -->
<g id="node4" class="node">
<title>F3</title>
<polygon fill="#ffffff" stroke="black" points="502,-151.5 454,-151.5 454,-128.5 502,-128.5 502,-151.5"/>
<polygon fill="none" stroke="black" points="454,-128 454,-151 502,-151 502,-128 454,-128"/>
<text text-anchor="start" x="458" y="-135.8" font-family="arial" font-size="14.00">ferrule</text>
</g>
<!-- F3&#45;&#45;C2 -->
<g id="edge13" class="edge">
<title>F3:e&#45;&#45;C2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-138C585.88,-140.34 566.07,-255.34 646,-253"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M502,-140C583.9,-140 564.1,-255 646,-255"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-142C581.93,-139.66 562.12,-254.66 646,-257"/>
</g>
<!-- F3&#45;&#45;C3 -->
<g id="edge21" class="edge">
<title>F3:e&#45;&#45;C3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-138C576.19,-140.18 567.82,-47.18 646,-45"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M502,-140C578.19,-140 569.81,-47 646,-47"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-142C580.18,-139.82 571.81,-46.82 646,-49"/>
</g>
<!-- F4 -->
<g id="node5" class="node">
<title>F4</title>
<polygon fill="#ffffff" stroke="black" points="502,-104.5 454,-104.5 454,-81.5 502,-81.5 502,-104.5"/>
<polygon fill="none" stroke="black" points="454,-81 454,-104 502,-104 502,-81 454,-81"/>
<text text-anchor="start" x="458" y="-88.8" font-family="arial" font-size="14.00">ferrule</text>
</g>
<!-- F4&#45;&#45;C2 -->
<g id="edge15" class="edge">
<title>F4:e&#45;&#45;C2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-91C592.28,-93.46 559.61,-230.46 646,-228"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M502,-93C590.34,-93 557.66,-230 646,-230"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-95C588.39,-92.54 555.72,-229.54 646,-232"/>
</g>
<!-- F4&#45;&#45;C3 -->
<g id="edge23" class="edge">
<title>F4:e&#45;&#45;C3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-91C571.36,-92.96 572.64,-21.96 646,-20"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M502,-93C573.36,-93 574.64,-22 646,-22"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M502,-95C575.36,-93.04 576.64,-22.04 646,-24"/>
</g>
<!-- X2 -->
<g id="node6" class="node">
<title>X2</title>
<polygon fill="#ffffff" stroke="black" points="960,-360 920,-360 920,-222 960,-222 960,-360"/>
<polygon fill="none" stroke="black" points="920,-337 920,-360 960,-360 960,-337 920,-337"/>
<text text-anchor="start" x="931" y="-344.8" font-family="arial" font-size="14.00">X2</text>
<polygon fill="none" stroke="black" points="920,-314 920,-337 960,-337 960,-314 920,-314"/>
<text text-anchor="start" x="924" y="-321.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="920,-291 920,-314 939,-314 939,-291 920,-291"/>
<text text-anchor="start" x="925.5" y="-298.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="939,-291 939,-314 960,-314 960,-291 939,-291"/>
<text text-anchor="start" x="944.5" y="-298.8" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="920,-268 920,-291 939,-291 939,-268 920,-268"/>
<text text-anchor="start" x="925.5" y="-275.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="939,-268 939,-291 960,-291 960,-268 939,-268"/>
<text text-anchor="start" x="944.5" y="-275.8" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="920,-245 920,-268 939,-268 939,-245 920,-245"/>
<text text-anchor="start" x="925.5" y="-252.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="939,-245 939,-268 960,-268 960,-245 939,-245"/>
<text text-anchor="start" x="944" y="-252.8" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="920,-222 920,-245 939,-245 939,-222 920,-222"/>
<text text-anchor="start" x="925.5" y="-229.8" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="939,-222 939,-245 960,-245 960,-222 939,-222"/>
<text text-anchor="start" x="944" y="-229.8" font-family="arial" font-size="14.00">D</text>
</g>
<!-- X3 -->
<g id="node7" class="node">
<title>X3</title>
<polygon fill="#ffffff" stroke="black" points="960,-152 920,-152 920,-14 960,-14 960,-152"/>
<polygon fill="none" stroke="black" points="920,-129 920,-152 960,-152 960,-129 920,-129"/>
<text text-anchor="start" x="931" y="-136.8" font-family="arial" font-size="14.00">X3</text>
<polygon fill="none" stroke="black" points="920,-106 920,-129 960,-129 960,-106 920,-106"/>
<text text-anchor="start" x="924" y="-113.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="920,-83 920,-106 939,-106 939,-83 920,-83"/>
<text text-anchor="start" x="925.5" y="-90.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="939,-83 939,-106 960,-106 960,-83 939,-83"/>
<text text-anchor="start" x="944.5" y="-90.8" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="920,-60 920,-83 939,-83 939,-60 920,-60"/>
<text text-anchor="start" x="925.5" y="-67.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="939,-60 939,-83 960,-83 960,-60 939,-60"/>
<text text-anchor="start" x="944.5" y="-67.8" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="920,-37 920,-60 939,-60 939,-37 920,-37"/>
<text text-anchor="start" x="925.5" y="-44.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="939,-37 939,-60 960,-60 960,-37 939,-37"/>
<text text-anchor="start" x="944" y="-44.8" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="920,-14 920,-37 939,-37 939,-14 920,-14"/>
<text text-anchor="start" x="925.5" y="-21.8" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="939,-14 939,-37 960,-37 960,-14 939,-14"/>
<text text-anchor="start" x="944" y="-21.8" font-family="arial" font-size="14.00">D</text>
</g>
<!-- C1&#45;&#45;F1 -->
<g id="edge2" class="edge">
<title>C1:e&#45;&#45;F1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-199C377.53,-200.28 390.21,-233.28 454,-232"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M310,-201C375.66,-201 388.34,-234 454,-234"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-203C373.79,-201.72 386.47,-234.72 454,-236"/>
</g>
<!-- C1&#45;&#45;F2 -->
<g id="edge4" class="edge">
<title>C1:e&#45;&#45;F2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-174C375.34,-174.36 390.96,-185.36 454,-185"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M310,-176C374.19,-176 389.81,-187 454,-187"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-178C373.04,-177.64 388.66,-188.64 454,-189"/>
</g>
<!-- C1&#45;&#45;F3 -->
<g id="edge6" class="edge">
<title>C1:e&#45;&#45;F3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-149C373.04,-149.36 388.66,-138.36 454,-138"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M310,-151C374.19,-151 389.81,-140 454,-140"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-153C375.34,-152.64 390.96,-141.64 454,-142"/>
</g>
<!-- C1&#45;&#45;F4 -->
<g id="edge8" class="edge">
<title>C1:e&#45;&#45;F4:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-124C373.79,-125.28 386.47,-92.28 454,-91"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M310,-126C375.66,-126 388.34,-93 454,-93"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M310,-128C377.53,-126.72 390.21,-93.72 454,-95"/>
</g>
<!-- C2&#45;&#45;X2 -->
<g id="edge10" class="edge">
<title>C2:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-303C839.76,-303.02 855.75,-301.02 920,-301"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M776,-305C840.01,-305 855.99,-303 920,-303"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-307C840.25,-306.98 856.24,-304.98 920,-305"/>
</g>
<!-- C2&#45;&#45;X2 -->
<g id="edge12" class="edge">
<title>C2:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-278C839.88,-278 855.87,-277 920,-277"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M776,-280C840,-280 856,-279 920,-279"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-282C840.13,-282 856.12,-281 920,-281"/>
</g>
<!-- C2&#45;&#45;X2 -->
<g id="edge14" class="edge">
<title>C2:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-253C840.13,-253 856.12,-254 920,-254"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M776,-255C840,-255 856,-256 920,-256"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-257C839.88,-257 855.87,-258 920,-258"/>
</g>
<!-- C2&#45;&#45;X2 -->
<g id="edge16" class="edge">
<title>C2:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-228C840.38,-228.03 856.36,-231.03 920,-231"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M776,-230C840.01,-230 855.99,-233 920,-233"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-232C839.64,-231.97 855.62,-234.97 920,-235"/>
</g>
<!-- C3&#45;&#45;X3 -->
<g id="edge18" class="edge">
<title>C3:e&#45;&#45;X3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-95C839.76,-95.02 855.75,-93.02 920,-93"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M776,-97C840.01,-97 855.99,-95 920,-95"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-99C840.25,-98.98 856.24,-96.98 920,-97"/>
</g>
<!-- C3&#45;&#45;X3 -->
<g id="edge20" class="edge">
<title>C3:e&#45;&#45;X3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-70C839.88,-70 855.87,-69 920,-69"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M776,-72C840,-72 856,-71 920,-71"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-74C840.13,-74 856.12,-73 920,-73"/>
</g>
<!-- C3&#45;&#45;X3 -->
<g id="edge22" class="edge">
<title>C3:e&#45;&#45;X3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-45C840.13,-45 856.12,-46 920,-46"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M776,-47C840,-47 856,-48 920,-48"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-49C839.88,-49 855.87,-50 920,-50"/>
</g>
<!-- C3&#45;&#45;X3 -->
<g id="edge24" class="edge">
<title>C3:e&#45;&#45;X3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-20C840.38,-20.03 856.36,-23.03 920,-23"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M776,-22C840.01,-22 855.99,-25 920,-25"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M776,-24C839.64,-23.97 855.62,-26.97 920,-27"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

8
examples/ex14.bom.tsv generated Normal file
View File

@ -0,0 +1,8 @@
Id Description Qty Unit Designators
1 Cable, 1 wires 0.1 m
2 Cable, 4 wires 0.4 m W1, W2, W21, W3
3 Connector, Ferrule, GY 4
4 Connector, JST SM, female, 4 pins 1 X2
5 Connector, JST SM, male, 4 pins 2 X1, X3
6 Connector, Screw terminal connector, 4 pins, GN 1 X4
7 Connector, Splice, CU 8
1 Id Description Qty Unit Designators
2 1 Cable, 1 wires 0.1 m
3 2 Cable, 4 wires 0.4 m W1, W2, W21, W3
4 3 Connector, Ferrule, GY 4
5 4 Connector, JST SM, female, 4 pins 1 X2
6 5 Connector, JST SM, male, 4 pins 2 X1, X3
7 6 Connector, Screw terminal connector, 4 pins, GN 1 X4
8 7 Connector, Splice, CU 8

717
examples/ex14.gv generated Normal file
View File

@ -0,0 +1,717 @@
graph {
// Graph generated by WireViz 0.4-dev
// https://github.com/formatc1702/WireViz
graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2]
node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0]
edge [fontname=arial style=bold]
X1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">X1</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">JST SM</td>
<td balign="left">male</td>
<td balign="left">4-pin</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1">
<tr>
<td>A</td>
<td port="p1r">1</td>
</tr>
<tr>
<td>B</td>
<td port="p2r">2</td>
</tr>
<tr>
<td>C</td>
<td port="p3r">3</td>
</tr>
<tr>
<td>D</td>
<td port="p4r">4</td>
</tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_S_1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Splice</td>
<td balign="left">CU</td>
<td balign="left" bgcolor="#D6775E" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_S_2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Splice</td>
<td balign="left">CU</td>
<td balign="left" bgcolor="#D6775E" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
S1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Splice</td>
<td balign="left">CU</td>
<td balign="left" bgcolor="#D6775E" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_S_3 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Splice</td>
<td balign="left">CU</td>
<td balign="left" bgcolor="#D6775E" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_S_4 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Splice</td>
<td balign="left">CU</td>
<td balign="left" bgcolor="#D6775E" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_S_5 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Splice</td>
<td balign="left">CU</td>
<td balign="left" bgcolor="#D6775E" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_S_6 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Splice</td>
<td balign="left">CU</td>
<td balign="left" bgcolor="#D6775E" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_S_7 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Splice</td>
<td balign="left">CU</td>
<td balign="left" bgcolor="#D6775E" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
X2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">X2</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">JST SM</td>
<td balign="left">female</td>
<td balign="left">4-pin</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1">
<tr>
<td port="p1l">1</td>
<td>A</td>
</tr>
<tr>
<td port="p2l">2</td>
<td>B</td>
</tr>
<tr>
<td port="p3l">3</td>
<td>C</td>
</tr>
<tr>
<td port="p4l">4</td>
<td>D</td>
</tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
X3 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">X3</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">JST SM</td>
<td balign="left">male</td>
<td balign="left">4-pin</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1">
<tr>
<td>A</td>
<td port="p1r">1</td>
</tr>
<tr>
<td>B</td>
<td port="p2r">2</td>
</tr>
<tr>
<td>C</td>
<td port="p3r">3</td>
</tr>
<tr>
<td>D</td>
<td port="p4r">4</td>
</tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_F_1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Ferrule</td>
<td balign="left">GY</td>
<td balign="left" bgcolor="#999999" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_F_2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Ferrule</td>
<td balign="left">GY</td>
<td balign="left" bgcolor="#999999" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_F_3 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Ferrule</td>
<td balign="left">GY</td>
<td balign="left" bgcolor="#999999" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_F_4 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Ferrule</td>
<td balign="left">GY</td>
<td balign="left" bgcolor="#999999" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
X4 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">X4</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Screw terminal connector</td>
<td balign="left">4-pin</td>
<td balign="left">GN</td>
<td balign="left" bgcolor="#00FF00" width="4"></td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1">
<tr>
<td port="p1l">1</td>
<td>W</td>
</tr>
<tr>
<td port="p2l">2</td>
<td>X</td>
</tr>
<tr>
<td port="p3l">3</td>
<td>Y</td>
</tr>
<tr>
<td port="p4l">4</td>
<td>Z</td>
</tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ffffff:#000000"]
X1:p4r:e -- W1:w1:w
W1:w1:e -- AUTOGENERATED_S_1:w
edge [color="#000000:#895956:#000000"]
X1:p3r:e -- W1:w2:w
W1:w2:e -- AUTOGENERATED_S_2:w
edge [color="#000000:#00ff00:#000000"]
X1:p2r:e -- W1:w3:w
W1:w3:e -- S1:w
edge [color="#000000:#ffff00:#000000"]
X1:p1r:e -- W1:w4:w
W1:w4:e -- AUTOGENERATED_S_3:w
W1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">W1</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4x</td>
<td balign="left">0.1 m</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellborder="0">
<tr><td>&nbsp;</td></tr>
<tr>
<td>X1:4:D</td>
<td>
1:WH
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w1" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffffff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td>X1:3:C</td>
<td>
2:BN
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w2" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#895956" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td>X1:2:B</td>
<td>
3:GN
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w3" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#00ff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td>X1:1:A</td>
<td>
4:YE
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w4" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr><td>&nbsp;</td></tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ffffff:#000000"]
AUTOGENERATED_S_1:e -- W2:w1:w
W2:w1:e -- AUTOGENERATED_S_4:w
edge [color="#000000:#895956:#000000"]
AUTOGENERATED_S_2:e -- W2:w2:w
W2:w2:e -- AUTOGENERATED_S_5:w
edge [color="#000000:#00ff00:#000000"]
S1:e -- W2:w3:w
W2:w3:e -- AUTOGENERATED_S_6:w
edge [color="#000000:#ffff00:#000000"]
AUTOGENERATED_S_3:e -- W2:w4:w
W2:w4:e -- AUTOGENERATED_S_7:w
W2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">W2</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4x</td>
<td balign="left">0.1 m</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellborder="0">
<tr><td>&nbsp;</td></tr>
<tr>
<td></td>
<td>
1:WH
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w1" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffffff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td>
2:BN
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w2" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#895956" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td>
3:GN
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w3" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#00ff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td>
4:YE
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w4" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr><td>&nbsp;</td></tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ffffff:#000000"]
AUTOGENERATED_S_4:e -- W21:w1:w
W21:w1:e -- X2:p1l:w
edge [color="#000000:#895956:#000000"]
AUTOGENERATED_S_5:e -- W21:w2:w
W21:w2:e -- X2:p2l:w
edge [color="#000000:#00ff00:#000000"]
AUTOGENERATED_S_6:e -- W21:w3:w
W21:w3:e -- X2:p3l:w
edge [color="#000000:#ffff00:#000000"]
AUTOGENERATED_S_7:e -- W21:w4:w
W21:w4:e -- X2:p4l:w
W21 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">W21</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4x</td>
<td balign="left">0.1 m</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellborder="0">
<tr><td>&nbsp;</td></tr>
<tr>
<td></td>
<td>
1:WH
</td>
<td>X2:1:A</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w1" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffffff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td>
2:BN
</td>
<td>X2:2:B</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w2" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#895956" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td>
3:GN
</td>
<td>X2:3:C</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w3" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#00ff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td>
4:YE
</td>
<td>X2:4:D</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w4" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr><td>&nbsp;</td></tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ffffff:#000000"]
X3:p1r:e -- W3:w1:w
W3:w1:e -- AUTOGENERATED_F_1:w
edge [color="#000000:#895956:#000000"]
X3:p2r:e -- W3:w2:w
W3:w2:e -- AUTOGENERATED_F_2:w
edge [color="#000000:#00ff00:#000000"]
X3:p3r:e -- W3:w3:w
W3:w3:e -- AUTOGENERATED_F_3:w
edge [color="#000000:#ffff00:#000000"]
X3:p4r:e -- W3:w4:w
W3:w4:e -- AUTOGENERATED_F_4:w
W3 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">W3</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">4x</td>
<td balign="left">0.1 m</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellborder="0">
<tr><td>&nbsp;</td></tr>
<tr>
<td>X3:1:A</td>
<td>
1:WH
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w1" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffffff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td>X3:2:B</td>
<td>
2:BN
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w2" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#895956" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td>X3:3:C</td>
<td>
3:GN
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w3" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#00ff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td>X3:4:D</td>
<td>
4:YE
</td>
<td></td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w4" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#ffff00" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr><td>&nbsp;</td></tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#000000:#000000"]
S1:e -- AUTOGENERATED_WIRE_1:w1:w
AUTOGENERATED_WIRE_1:w1:e -- X2:p4l:w
AUTOGENERATED_WIRE_1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">1x</td>
<td balign="left">0.1 m</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellborder="0">
<tr><td>&nbsp;</td></tr>
<tr>
<td></td>
<td>
1:BK
</td>
<td>X2:4:D</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w1" height="6">
<table cellspacing="0" cellborder="0" border="0">
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr><td>&nbsp;</td></tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#000000" dir=both style=dashed]
X2:e -- X3:w
edge [color="#000000" dir=forward style=dashed]
AUTOGENERATED_F_1:e -- X4:p2l:w
edge [color="#000000" dir=forward style=dashed]
AUTOGENERATED_F_2:e -- X4:p1l:w
edge [color="#000000" dir=forward style=dashed]
AUTOGENERATED_F_3:e -- X4:p4l:w
edge [color="#000000" dir=forward style=dashed]
AUTOGENERATED_F_4:e -- X4:p3l:w
}

777
examples/ex14.html generated Normal file
View File

@ -0,0 +1,777 @@
<!DOCTYPE html>
<html lang="en"><head>
<meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>ex14</title>
<style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>ex14</h1>
<h2>Diagram</h2>
<div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
-->
<!-- Pages: 1 -->
<svg width="2842pt" height="302pt"
viewBox="0.00 0.00 2842.00 302.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 298)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-298 2838,-298 2838,4 -4,4"/>
<!-- X1 -->
<g id="node1" class="node">
<title>X1</title>
<polygon fill="#ffffff" stroke="black" points="137,-229 0,-229 0,-91 137,-91 137,-229"/>
<polygon fill="none" stroke="black" points="0.5,-206 0.5,-229 137.5,-229 137.5,-206 0.5,-206"/>
<text text-anchor="start" x="60" y="-213.8" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="0.5,-183 0.5,-206 58.5,-206 58.5,-183 0.5,-183"/>
<text text-anchor="start" x="4.5" y="-190.8" font-family="arial" font-size="14.00">JST SM</text>
<polygon fill="none" stroke="black" points="58.5,-183 58.5,-206 97.5,-206 97.5,-183 58.5,-183"/>
<text text-anchor="start" x="62.5" y="-190.8" font-family="arial" font-size="14.00">male</text>
<polygon fill="none" stroke="black" points="97.5,-183 97.5,-206 137.5,-206 137.5,-183 97.5,-183"/>
<text text-anchor="start" x="101.5" y="-190.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="0.5,-160 0.5,-183 70.5,-183 70.5,-160 0.5,-160"/>
<text text-anchor="start" x="30.5" y="-167.8" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="70.5,-160 70.5,-183 137.5,-183 137.5,-160 70.5,-160"/>
<text text-anchor="start" x="100" y="-167.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="0.5,-137 0.5,-160 70.5,-160 70.5,-137 0.5,-137"/>
<text text-anchor="start" x="30.5" y="-144.8" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="70.5,-137 70.5,-160 137.5,-160 137.5,-137 70.5,-137"/>
<text text-anchor="start" x="100" y="-144.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="0.5,-114 0.5,-137 70.5,-137 70.5,-114 0.5,-114"/>
<text text-anchor="start" x="30" y="-121.8" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="70.5,-114 70.5,-137 137.5,-137 137.5,-114 70.5,-114"/>
<text text-anchor="start" x="100" y="-121.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="0.5,-91 0.5,-114 70.5,-114 70.5,-91 0.5,-91"/>
<text text-anchor="start" x="30" y="-98.8" font-family="arial" font-size="14.00">D</text>
<polygon fill="none" stroke="black" points="70.5,-91 70.5,-114 137.5,-114 137.5,-91 70.5,-91"/>
<text text-anchor="start" x="100" y="-98.8" font-family="arial" font-size="14.00">4</text>
</g>
<!-- W1 -->
<g id="node17" class="node">
<title>W1</title>
<polygon fill="#ffffff" stroke="black" points="407,-261 281,-261 281,-77 407,-77 407,-261"/>
<polygon fill="none" stroke="black" points="281,-238 281,-261 407,-261 407,-238 281,-238"/>
<text text-anchor="start" x="333.5" y="-245.8" font-family="arial" font-size="14.00">W1</text>
<polygon fill="none" stroke="black" points="281,-215 281,-238 334,-238 334,-215 281,-215"/>
<text text-anchor="start" x="300" y="-222.8" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="334,-215 334,-238 407,-238 407,-215 334,-215"/>
<text text-anchor="start" x="352.5" y="-222.8" font-family="arial" font-size="14.00">0.1 m</text>
<text text-anchor="start" x="302.5" y="-201.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="283" y="-182.8" font-family="arial" font-size="14.00">X1:4:D</text>
<text text-anchor="start" x="330" y="-182.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="281,-175 281,-177 407,-177 407,-175 281,-175"/>
<polygon fill="#ffffff" stroke="transparent" points="281,-173 281,-175 407,-175 407,-173 281,-173"/>
<polygon fill="#000000" stroke="transparent" points="281,-171 281,-173 407,-173 407,-171 281,-171"/>
<text text-anchor="start" x="283" y="-157.8" font-family="arial" font-size="14.00">X1:3:C</text>
<text text-anchor="start" x="332" y="-157.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="281,-150 281,-152 407,-152 407,-150 281,-150"/>
<polygon fill="#895956" stroke="transparent" points="281,-148 281,-150 407,-150 407,-148 281,-148"/>
<polygon fill="#000000" stroke="transparent" points="281,-146 281,-148 407,-148 407,-146 281,-146"/>
<text text-anchor="start" x="283" y="-132.8" font-family="arial" font-size="14.00">X1:2:B</text>
<text text-anchor="start" x="331.5" y="-132.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="281,-125 281,-127 407,-127 407,-125 281,-125"/>
<polygon fill="#00ff00" stroke="transparent" points="281,-123 281,-125 407,-125 407,-123 281,-123"/>
<polygon fill="#000000" stroke="transparent" points="281,-121 281,-123 407,-123 407,-121 281,-121"/>
<text text-anchor="start" x="283" y="-107.8" font-family="arial" font-size="14.00">X1:1:A</text>
<text text-anchor="start" x="332.5" y="-107.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="281,-100 281,-102 407,-102 407,-100 281,-100"/>
<polygon fill="#ffff00" stroke="transparent" points="281,-98 281,-100 407,-100 407,-98 281,-98"/>
<polygon fill="#000000" stroke="transparent" points="281,-96 281,-98 407,-98 407,-96 281,-96"/>
<text text-anchor="start" x="302.5" y="-82.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- X1&#45;&#45;W1 -->
<g id="edge1" class="edge">
<title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-100C210.55,-101.98 211.45,-173.98 281,-172"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M137,-102C208.55,-102 209.45,-174 281,-174"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-104C206.55,-102.02 207.45,-174.02 281,-176"/>
</g>
<!-- X1&#45;&#45;W1 -->
<g id="edge3" class="edge">
<title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-123C203.6,-123.98 217.84,-147.98 281,-147"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M137,-125C201.88,-125 216.12,-149 281,-149"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-127C200.16,-126.02 214.4,-150.02 281,-151"/>
</g>
<!-- X1&#45;&#45;W1 -->
<g id="edge5" class="edge">
<title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-146C200.16,-146.98 214.4,-122.98 281,-122"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M137,-148C201.88,-148 216.12,-124 281,-124"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-150C203.6,-149.02 217.84,-125.02 281,-126"/>
</g>
<!-- X1&#45;&#45;W1 -->
<g id="edge7" class="edge">
<title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-170C206.75,-171.99 207.25,-98.99 281,-97"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M137,-172C208.75,-172 209.25,-99 281,-99"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-174C210.75,-172.01 211.25,-99.01 281,-101"/>
</g>
<!-- AUTOGENERATED_S_1 -->
<g id="node2" class="node">
<title>AUTOGENERATED_S_1</title>
<polygon fill="#ffffff" stroke="black" points="635,-218.5 551,-218.5 551,-195.5 635,-195.5 635,-218.5"/>
<polygon fill="none" stroke="black" points="551,-195 551,-218 598,-218 598,-195 551,-195"/>
<text text-anchor="start" x="555" y="-202.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="598,-195 598,-218 627,-218 627,-195 598,-195"/>
<text text-anchor="start" x="602" y="-202.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="627,-195 627,-218 635,-218 635,-195 627,-195"/>
<polygon fill="none" stroke="black" points="627,-195 627,-218 635,-218 635,-195 627,-195"/>
</g>
<!-- W2 -->
<g id="node18" class="node">
<title>W2</title>
<polygon fill="#ffffff" stroke="black" points="866,-272 779,-272 779,-88 866,-88 866,-272"/>
<polygon fill="none" stroke="black" points="779.5,-249 779.5,-272 866.5,-272 866.5,-249 779.5,-249"/>
<text text-anchor="start" x="812.5" y="-256.8" font-family="arial" font-size="14.00">W2</text>
<polygon fill="none" stroke="black" points="779.5,-226 779.5,-249 812.5,-249 812.5,-226 779.5,-226"/>
<text text-anchor="start" x="788.5" y="-233.8" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="812.5,-226 812.5,-249 866.5,-249 866.5,-226 812.5,-226"/>
<text text-anchor="start" x="821.5" y="-233.8" font-family="arial" font-size="14.00">0.1 m</text>
<text text-anchor="start" x="781.5" y="-212.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="789.5" y="-193.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="779.5,-186 779.5,-188 866.5,-188 866.5,-186 779.5,-186"/>
<polygon fill="#ffffff" stroke="transparent" points="779.5,-184 779.5,-186 866.5,-186 866.5,-184 779.5,-184"/>
<polygon fill="#000000" stroke="transparent" points="779.5,-182 779.5,-184 866.5,-184 866.5,-182 779.5,-182"/>
<text text-anchor="start" x="791.5" y="-168.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="779.5,-161 779.5,-163 866.5,-163 866.5,-161 779.5,-161"/>
<polygon fill="#895956" stroke="transparent" points="779.5,-159 779.5,-161 866.5,-161 866.5,-159 779.5,-159"/>
<polygon fill="#000000" stroke="transparent" points="779.5,-157 779.5,-159 866.5,-159 866.5,-157 779.5,-157"/>
<text text-anchor="start" x="791" y="-143.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="779.5,-136 779.5,-138 866.5,-138 866.5,-136 779.5,-136"/>
<polygon fill="#00ff00" stroke="transparent" points="779.5,-134 779.5,-136 866.5,-136 866.5,-134 779.5,-134"/>
<polygon fill="#000000" stroke="transparent" points="779.5,-132 779.5,-134 866.5,-134 866.5,-132 779.5,-132"/>
<text text-anchor="start" x="792" y="-118.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="779.5,-111 779.5,-113 866.5,-113 866.5,-111 779.5,-111"/>
<polygon fill="#ffff00" stroke="transparent" points="779.5,-109 779.5,-111 866.5,-111 866.5,-109 779.5,-109"/>
<polygon fill="#000000" stroke="transparent" points="779.5,-107 779.5,-109 866.5,-109 866.5,-107 779.5,-107"/>
<text text-anchor="start" x="781.5" y="-93.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- AUTOGENERATED_S_1&#45;&#45;W2 -->
<g id="edge9" class="edge">
<title>AUTOGENERATED_S_1:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-205C698.07,-205.9 712.59,-183.9 779,-183"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M635,-207C699.74,-207 714.26,-185 779,-185"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-209C701.41,-208.1 715.93,-186.1 779,-187"/>
</g>
<!-- AUTOGENERATED_S_2 -->
<g id="node3" class="node">
<title>AUTOGENERATED_S_2</title>
<polygon fill="#ffffff" stroke="black" points="635,-171.5 551,-171.5 551,-148.5 635,-148.5 635,-171.5"/>
<polygon fill="none" stroke="black" points="551,-148 551,-171 598,-171 598,-148 551,-148"/>
<text text-anchor="start" x="555" y="-155.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="598,-148 598,-171 627,-171 627,-148 598,-148"/>
<text text-anchor="start" x="602" y="-155.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="627,-148 627,-171 635,-171 635,-148 627,-148"/>
<polygon fill="none" stroke="black" points="627,-148 627,-171 635,-171 635,-148 627,-148"/>
</g>
<!-- AUTOGENERATED_S_2&#45;&#45;W2 -->
<g id="edge11" class="edge">
<title>AUTOGENERATED_S_2:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-158C699,-158 715,-158 779,-158"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M635,-160C699,-160 715,-160 779,-160"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-162C699,-162 715,-162 779,-162"/>
</g>
<!-- S1 -->
<g id="node4" class="node">
<title>S1</title>
<polygon fill="#ffffff" stroke="black" points="635,-124.5 551,-124.5 551,-101.5 635,-101.5 635,-124.5"/>
<polygon fill="none" stroke="black" points="551,-101 551,-124 598,-124 598,-101 551,-101"/>
<text text-anchor="start" x="555" y="-108.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="598,-101 598,-124 627,-124 627,-101 598,-101"/>
<text text-anchor="start" x="602" y="-108.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="627,-101 627,-124 635,-124 635,-101 627,-101"/>
<polygon fill="none" stroke="black" points="627,-101 627,-124 635,-124 635,-101 627,-101"/>
</g>
<!-- S1&#45;&#45;W2 -->
<g id="edge13" class="edge">
<title>S1:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-111C701.41,-111.9 715.93,-133.9 779,-133"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M635,-113C699.74,-113 714.26,-135 779,-135"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-115C698.07,-114.1 712.59,-136.1 779,-137"/>
</g>
<!-- AUTOGENERATED_WIRE_1 -->
<g id="node21" class="node">
<title>AUTOGENERATED_WIRE_1</title>
<polygon fill="#ffffff" stroke="black" points="1365.5,-86 1240.5,-86 1240.5,0 1365.5,0 1365.5,-86"/>
<polygon fill="none" stroke="black" points="1241,-63 1241,-86 1293,-86 1293,-63 1241,-63"/>
<text text-anchor="start" x="1259.5" y="-70.8" font-family="arial" font-size="14.00">1x</text>
<polygon fill="none" stroke="black" points="1293,-63 1293,-86 1366,-86 1366,-63 1293,-63"/>
<text text-anchor="start" x="1311.5" y="-70.8" font-family="arial" font-size="14.00">0.1 m</text>
<text text-anchor="start" x="1243" y="-49.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="1251" y="-30.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:BK &#160;&#160;&#160;</text>
<text text-anchor="start" x="1321" y="-30.8" font-family="arial" font-size="14.00">X2:4:D</text>
<polygon fill="#000000" stroke="transparent" points="1241,-23 1241,-25 1366,-25 1366,-23 1241,-23"/>
<polygon fill="#000000" stroke="transparent" points="1241,-21 1241,-23 1366,-23 1366,-21 1241,-21"/>
<polygon fill="#000000" stroke="transparent" points="1241,-19 1241,-21 1366,-21 1366,-19 1241,-19"/>
<text text-anchor="start" x="1243" y="-5.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- S1&#45;&#45;AUTOGENERATED_WIRE_1 -->
<g id="edge33" class="edge">
<title>S1:e&#45;&#45;AUTOGENERATED_WIRE_1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-111C699.3,-112.08 712.26,-87.17 778.63,-74.03 981.21,-36.34 1033.11,-20.09 1240,-20"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-113C701.08,-113 714.04,-88.09 779,-76 981.81,-38.25 1033.71,-22 1240,-22"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-115C702.85,-113.92 715.81,-89.02 779.37,-77.97 982.4,-40.15 1034.31,-23.91 1240,-24"/>
</g>
<!-- AUTOGENERATED_S_3 -->
<g id="node5" class="node">
<title>AUTOGENERATED_S_3</title>
<polygon fill="#ffffff" stroke="black" points="635,-77.5 551,-77.5 551,-54.5 635,-54.5 635,-77.5"/>
<polygon fill="none" stroke="black" points="551,-54 551,-77 598,-77 598,-54 551,-54"/>
<text text-anchor="start" x="555" y="-61.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="598,-54 598,-77 627,-77 627,-54 598,-54"/>
<text text-anchor="start" x="602" y="-61.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="627,-54 627,-77 635,-77 635,-54 627,-54"/>
<polygon fill="none" stroke="black" points="627,-54 627,-77 635,-77 635,-54 627,-54"/>
</g>
<!-- AUTOGENERATED_S_3&#45;&#45;W2 -->
<g id="edge15" class="edge">
<title>AUTOGENERATED_S_3:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-64C703.87,-65.55 714.03,-109.55 779,-108"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M635,-66C701.92,-66 712.08,-110 779,-110"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-68C699.97,-66.45 710.13,-110.45 779,-112"/>
</g>
<!-- AUTOGENERATED_S_4 -->
<g id="node6" class="node">
<title>AUTOGENERATED_S_4</title>
<polygon fill="#ffffff" stroke="black" points="1094,-240.5 1010,-240.5 1010,-217.5 1094,-217.5 1094,-240.5"/>
<polygon fill="none" stroke="black" points="1010,-217 1010,-240 1057,-240 1057,-217 1010,-217"/>
<text text-anchor="start" x="1014" y="-224.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="1057,-217 1057,-240 1086,-240 1086,-217 1057,-217"/>
<text text-anchor="start" x="1061" y="-224.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="1086,-217 1086,-240 1094,-240 1094,-217 1086,-217"/>
<polygon fill="none" stroke="black" points="1086,-217 1086,-240 1094,-240 1094,-217 1086,-217"/>
</g>
<!-- W21 -->
<g id="node19" class="node">
<title>W21</title>
<polygon fill="#ffffff" stroke="black" points="1368,-294 1238,-294 1238,-110 1368,-110 1368,-294"/>
<polygon fill="none" stroke="black" points="1238,-271 1238,-294 1368,-294 1368,-271 1238,-271"/>
<text text-anchor="start" x="1288.5" y="-278.8" font-family="arial" font-size="14.00">W21</text>
<polygon fill="none" stroke="black" points="1238,-248 1238,-271 1293,-271 1293,-248 1238,-248"/>
<text text-anchor="start" x="1258" y="-255.8" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="1293,-248 1293,-271 1368,-271 1368,-248 1293,-248"/>
<text text-anchor="start" x="1312.5" y="-255.8" font-family="arial" font-size="14.00">0.1 m</text>
<text text-anchor="start" x="1240" y="-234.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="1248" y="-215.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<text text-anchor="start" x="1323" y="-215.8" font-family="arial" font-size="14.00">X2:1:A</text>
<polygon fill="#000000" stroke="transparent" points="1238,-208 1238,-210 1368,-210 1368,-208 1238,-208"/>
<polygon fill="#ffffff" stroke="transparent" points="1238,-206 1238,-208 1368,-208 1368,-206 1238,-206"/>
<polygon fill="#000000" stroke="transparent" points="1238,-204 1238,-206 1368,-206 1368,-204 1238,-204"/>
<text text-anchor="start" x="1250" y="-190.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<text text-anchor="start" x="1323" y="-190.8" font-family="arial" font-size="14.00">X2:2:B</text>
<polygon fill="#000000" stroke="transparent" points="1238,-183 1238,-185 1368,-185 1368,-183 1238,-183"/>
<polygon fill="#895956" stroke="transparent" points="1238,-181 1238,-183 1368,-183 1368,-181 1238,-181"/>
<polygon fill="#000000" stroke="transparent" points="1238,-179 1238,-181 1368,-181 1368,-179 1238,-179"/>
<text text-anchor="start" x="1249.5" y="-165.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<text text-anchor="start" x="1323" y="-165.8" font-family="arial" font-size="14.00">X2:3:C</text>
<polygon fill="#000000" stroke="transparent" points="1238,-158 1238,-160 1368,-160 1368,-158 1238,-158"/>
<polygon fill="#00ff00" stroke="transparent" points="1238,-156 1238,-158 1368,-158 1368,-156 1238,-156"/>
<polygon fill="#000000" stroke="transparent" points="1238,-154 1238,-156 1368,-156 1368,-154 1238,-154"/>
<text text-anchor="start" x="1250.5" y="-140.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<text text-anchor="start" x="1323" y="-140.8" font-family="arial" font-size="14.00">X2:4:D</text>
<polygon fill="#000000" stroke="transparent" points="1238,-133 1238,-135 1368,-135 1368,-133 1238,-133"/>
<polygon fill="#ffff00" stroke="transparent" points="1238,-131 1238,-133 1368,-133 1368,-131 1238,-131"/>
<polygon fill="#000000" stroke="transparent" points="1238,-129 1238,-131 1368,-131 1368,-129 1238,-129"/>
<text text-anchor="start" x="1240" y="-115.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- AUTOGENERATED_S_4&#45;&#45;W21 -->
<g id="edge17" class="edge">
<title>AUTOGENERATED_S_4:e&#45;&#45;W21:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-227C1157.07,-227.9 1171.59,-205.9 1238,-205"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M1094,-229C1158.74,-229 1173.26,-207 1238,-207"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-231C1160.41,-230.1 1174.93,-208.1 1238,-209"/>
</g>
<!-- AUTOGENERATED_S_5 -->
<g id="node7" class="node">
<title>AUTOGENERATED_S_5</title>
<polygon fill="#ffffff" stroke="black" points="1094,-193.5 1010,-193.5 1010,-170.5 1094,-170.5 1094,-193.5"/>
<polygon fill="none" stroke="black" points="1010,-170 1010,-193 1057,-193 1057,-170 1010,-170"/>
<text text-anchor="start" x="1014" y="-177.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="1057,-170 1057,-193 1086,-193 1086,-170 1057,-170"/>
<text text-anchor="start" x="1061" y="-177.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="1086,-170 1086,-193 1094,-193 1094,-170 1086,-170"/>
<polygon fill="none" stroke="black" points="1086,-170 1086,-193 1094,-193 1094,-170 1086,-170"/>
</g>
<!-- AUTOGENERATED_S_5&#45;&#45;W21 -->
<g id="edge19" class="edge">
<title>AUTOGENERATED_S_5:e&#45;&#45;W21:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-180C1158,-180 1174,-180 1238,-180"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M1094,-182C1158,-182 1174,-182 1238,-182"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-184C1158,-184 1174,-184 1238,-184"/>
</g>
<!-- AUTOGENERATED_S_6 -->
<g id="node8" class="node">
<title>AUTOGENERATED_S_6</title>
<polygon fill="#ffffff" stroke="black" points="1094,-146.5 1010,-146.5 1010,-123.5 1094,-123.5 1094,-146.5"/>
<polygon fill="none" stroke="black" points="1010,-123 1010,-146 1057,-146 1057,-123 1010,-123"/>
<text text-anchor="start" x="1014" y="-130.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="1057,-123 1057,-146 1086,-146 1086,-123 1057,-123"/>
<text text-anchor="start" x="1061" y="-130.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="1086,-123 1086,-146 1094,-146 1094,-123 1086,-123"/>
<polygon fill="none" stroke="black" points="1086,-123 1086,-146 1094,-146 1094,-123 1086,-123"/>
</g>
<!-- AUTOGENERATED_S_6&#45;&#45;W21 -->
<g id="edge21" class="edge">
<title>AUTOGENERATED_S_6:e&#45;&#45;W21:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-133C1160.41,-133.9 1174.93,-155.9 1238,-155"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M1094,-135C1158.74,-135 1173.26,-157 1238,-157"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-137C1157.07,-136.1 1171.59,-158.1 1238,-159"/>
</g>
<!-- AUTOGENERATED_S_7 -->
<g id="node9" class="node">
<title>AUTOGENERATED_S_7</title>
<polygon fill="#ffffff" stroke="black" points="1094,-99.5 1010,-99.5 1010,-76.5 1094,-76.5 1094,-99.5"/>
<polygon fill="none" stroke="black" points="1010,-76 1010,-99 1057,-99 1057,-76 1010,-76"/>
<text text-anchor="start" x="1014" y="-83.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="1057,-76 1057,-99 1086,-99 1086,-76 1057,-76"/>
<text text-anchor="start" x="1061" y="-83.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="1086,-76 1086,-99 1094,-99 1094,-76 1086,-76"/>
<polygon fill="none" stroke="black" points="1086,-76 1086,-99 1094,-99 1094,-76 1086,-76"/>
</g>
<!-- AUTOGENERATED_S_7&#45;&#45;W21 -->
<g id="edge23" class="edge">
<title>AUTOGENERATED_S_7:e&#45;&#45;W21:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-86C1162.87,-87.55 1173.03,-131.55 1238,-130"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M1094,-88C1160.92,-88 1171.08,-132 1238,-132"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-90C1158.97,-88.45 1169.13,-132.45 1238,-134"/>
</g>
<!-- X2 -->
<g id="node10" class="node">
<title>X2</title>
<polygon fill="#ffffff" stroke="black" points="1661,-261 1512,-261 1512,-123 1661,-123 1661,-261"/>
<polygon fill="none" stroke="black" points="1512.5,-238 1512.5,-261 1661.5,-261 1661.5,-238 1512.5,-238"/>
<text text-anchor="start" x="1578" y="-245.8" font-family="arial" font-size="14.00">X2</text>
<polygon fill="none" stroke="black" points="1512.5,-215 1512.5,-238 1570.5,-238 1570.5,-215 1512.5,-215"/>
<text text-anchor="start" x="1516.5" y="-222.8" font-family="arial" font-size="14.00">JST SM</text>
<polygon fill="none" stroke="black" points="1570.5,-215 1570.5,-238 1621.5,-238 1621.5,-215 1570.5,-215"/>
<text text-anchor="start" x="1574.5" y="-222.8" font-family="arial" font-size="14.00">female</text>
<polygon fill="none" stroke="black" points="1621.5,-215 1621.5,-238 1661.5,-238 1661.5,-215 1621.5,-215"/>
<text text-anchor="start" x="1625.5" y="-222.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="1512.5,-192 1512.5,-215 1585.5,-215 1585.5,-192 1512.5,-192"/>
<text text-anchor="start" x="1545" y="-199.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="1585.5,-192 1585.5,-215 1661.5,-215 1661.5,-192 1585.5,-192"/>
<text text-anchor="start" x="1618.5" y="-199.8" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="1512.5,-169 1512.5,-192 1585.5,-192 1585.5,-169 1512.5,-169"/>
<text text-anchor="start" x="1545" y="-176.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="1585.5,-169 1585.5,-192 1661.5,-192 1661.5,-169 1585.5,-169"/>
<text text-anchor="start" x="1618.5" y="-176.8" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="1512.5,-146 1512.5,-169 1585.5,-169 1585.5,-146 1512.5,-146"/>
<text text-anchor="start" x="1545" y="-153.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="1585.5,-146 1585.5,-169 1661.5,-169 1661.5,-146 1585.5,-146"/>
<text text-anchor="start" x="1618" y="-153.8" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="1512.5,-123 1512.5,-146 1585.5,-146 1585.5,-123 1512.5,-123"/>
<text text-anchor="start" x="1545" y="-130.8" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="1585.5,-123 1585.5,-146 1661.5,-146 1661.5,-123 1585.5,-123"/>
<text text-anchor="start" x="1618" y="-130.8" font-family="arial" font-size="14.00">D</text>
</g>
<!-- X3 -->
<g id="node11" class="node">
<title>X3</title>
<polygon fill="#ffffff" stroke="black" points="1942,-261 1805,-261 1805,-123 1942,-123 1942,-261"/>
<polygon fill="none" stroke="black" points="1805.5,-238 1805.5,-261 1942.5,-261 1942.5,-238 1805.5,-238"/>
<text text-anchor="start" x="1865" y="-245.8" font-family="arial" font-size="14.00">X3</text>
<polygon fill="none" stroke="black" points="1805.5,-215 1805.5,-238 1863.5,-238 1863.5,-215 1805.5,-215"/>
<text text-anchor="start" x="1809.5" y="-222.8" font-family="arial" font-size="14.00">JST SM</text>
<polygon fill="none" stroke="black" points="1863.5,-215 1863.5,-238 1902.5,-238 1902.5,-215 1863.5,-215"/>
<text text-anchor="start" x="1867.5" y="-222.8" font-family="arial" font-size="14.00">male</text>
<polygon fill="none" stroke="black" points="1902.5,-215 1902.5,-238 1942.5,-238 1942.5,-215 1902.5,-215"/>
<text text-anchor="start" x="1906.5" y="-222.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="1805.5,-192 1805.5,-215 1875.5,-215 1875.5,-192 1805.5,-192"/>
<text text-anchor="start" x="1835.5" y="-199.8" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="1875.5,-192 1875.5,-215 1942.5,-215 1942.5,-192 1875.5,-192"/>
<text text-anchor="start" x="1905" y="-199.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="1805.5,-169 1805.5,-192 1875.5,-192 1875.5,-169 1805.5,-169"/>
<text text-anchor="start" x="1835.5" y="-176.8" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="1875.5,-169 1875.5,-192 1942.5,-192 1942.5,-169 1875.5,-169"/>
<text text-anchor="start" x="1905" y="-176.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="1805.5,-146 1805.5,-169 1875.5,-169 1875.5,-146 1805.5,-146"/>
<text text-anchor="start" x="1835" y="-153.8" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="1875.5,-146 1875.5,-169 1942.5,-169 1942.5,-146 1875.5,-146"/>
<text text-anchor="start" x="1905" y="-153.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="1805.5,-123 1805.5,-146 1875.5,-146 1875.5,-123 1805.5,-123"/>
<text text-anchor="start" x="1835" y="-130.8" font-family="arial" font-size="14.00">D</text>
<polygon fill="none" stroke="black" points="1875.5,-123 1875.5,-146 1942.5,-146 1942.5,-123 1875.5,-123"/>
<text text-anchor="start" x="1905" y="-130.8" font-family="arial" font-size="14.00">4</text>
</g>
<!-- X2&#45;&#45;X3 -->
<g id="edge35" class="edge">
<title>X2:e&#45;&#45;X3:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M1671.09,-191C1723.62,-191 1742.31,-191 1794.79,-191"/>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M1671.09,-193C1723.62,-193 1742.31,-193 1794.79,-193"/>
<polygon fill="#000000" stroke="#000000" points="1671,-188.5 1661,-192 1671,-195.5 1671,-188.5"/>
<polygon fill="#000000" stroke="#000000" points="1795,-195.5 1805,-192 1795,-188.5 1795,-195.5"/>
</g>
<!-- W3 -->
<g id="node20" class="node">
<title>W3</title>
<polygon fill="#ffffff" stroke="black" points="2212,-293 2086,-293 2086,-109 2212,-109 2212,-293"/>
<polygon fill="none" stroke="black" points="2086,-270 2086,-293 2212,-293 2212,-270 2086,-270"/>
<text text-anchor="start" x="2138.5" y="-277.8" font-family="arial" font-size="14.00">W3</text>
<polygon fill="none" stroke="black" points="2086,-247 2086,-270 2139,-270 2139,-247 2086,-247"/>
<text text-anchor="start" x="2105" y="-254.8" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="2139,-247 2139,-270 2212,-270 2212,-247 2139,-247"/>
<text text-anchor="start" x="2157.5" y="-254.8" font-family="arial" font-size="14.00">0.1 m</text>
<text text-anchor="start" x="2107.5" y="-233.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="2088" y="-214.8" font-family="arial" font-size="14.00">X3:1:A</text>
<text text-anchor="start" x="2135" y="-214.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="2086,-207 2086,-209 2212,-209 2212,-207 2086,-207"/>
<polygon fill="#ffffff" stroke="transparent" points="2086,-205 2086,-207 2212,-207 2212,-205 2086,-205"/>
<polygon fill="#000000" stroke="transparent" points="2086,-203 2086,-205 2212,-205 2212,-203 2086,-203"/>
<text text-anchor="start" x="2088" y="-189.8" font-family="arial" font-size="14.00">X3:2:B</text>
<text text-anchor="start" x="2137" y="-189.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="2086,-182 2086,-184 2212,-184 2212,-182 2086,-182"/>
<polygon fill="#895956" stroke="transparent" points="2086,-180 2086,-182 2212,-182 2212,-180 2086,-180"/>
<polygon fill="#000000" stroke="transparent" points="2086,-178 2086,-180 2212,-180 2212,-178 2086,-178"/>
<text text-anchor="start" x="2088" y="-164.8" font-family="arial" font-size="14.00">X3:3:C</text>
<text text-anchor="start" x="2136.5" y="-164.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="2086,-157 2086,-159 2212,-159 2212,-157 2086,-157"/>
<polygon fill="#00ff00" stroke="transparent" points="2086,-155 2086,-157 2212,-157 2212,-155 2086,-155"/>
<polygon fill="#000000" stroke="transparent" points="2086,-153 2086,-155 2212,-155 2212,-153 2086,-153"/>
<text text-anchor="start" x="2088" y="-139.8" font-family="arial" font-size="14.00">X3:4:D</text>
<text text-anchor="start" x="2137.5" y="-139.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="2086,-132 2086,-134 2212,-134 2212,-132 2086,-132"/>
<polygon fill="#ffff00" stroke="transparent" points="2086,-130 2086,-132 2212,-132 2212,-130 2086,-130"/>
<polygon fill="#000000" stroke="transparent" points="2086,-128 2086,-130 2212,-130 2212,-128 2086,-128"/>
<text text-anchor="start" x="2107.5" y="-114.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- X3&#45;&#45;W3 -->
<g id="edge25" class="edge">
<title>X3:e&#45;&#45;W3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-202C2006.25,-202.02 2022.24,-204.02 2086,-204"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M1942,-204C2006.01,-204 2021.99,-206 2086,-206"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-206C2005.76,-205.98 2021.75,-207.98 2086,-208"/>
</g>
<!-- X3&#45;&#45;W3 -->
<g id="edge27" class="edge">
<title>X3:e&#45;&#45;W3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-178C2006.13,-178 2022.12,-179 2086,-179"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M1942,-180C2006,-180 2022,-181 2086,-181"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-182C2005.88,-182 2021.87,-183 2086,-183"/>
</g>
<!-- X3&#45;&#45;W3 -->
<g id="edge29" class="edge">
<title>X3:e&#45;&#45;W3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-155C2005.88,-155 2021.87,-154 2086,-154"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M1942,-157C2006,-157 2022,-156 2086,-156"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-159C2006.13,-159 2022.12,-158 2086,-158"/>
</g>
<!-- X3&#45;&#45;W3 -->
<g id="edge31" class="edge">
<title>X3:e&#45;&#45;W3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-132C2005.64,-132.03 2021.62,-129.03 2086,-129"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M1942,-134C2006.01,-134 2021.99,-131 2086,-131"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-136C2006.38,-135.97 2022.36,-132.97 2086,-133"/>
</g>
<!-- AUTOGENERATED_F_1 -->
<g id="node12" class="node">
<title>AUTOGENERATED_F_1</title>
<polygon fill="#ffffff" stroke="black" points="2446,-203.5 2356,-203.5 2356,-180.5 2446,-180.5 2446,-203.5"/>
<polygon fill="none" stroke="black" points="2356,-180 2356,-203 2409,-203 2409,-180 2356,-180"/>
<text text-anchor="start" x="2360" y="-187.8" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="2409,-180 2409,-203 2438,-203 2438,-180 2409,-180"/>
<text text-anchor="start" x="2413" y="-187.8" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="2438,-180 2438,-203 2446,-203 2446,-180 2438,-180"/>
<polygon fill="none" stroke="black" points="2438,-180 2438,-203 2446,-203 2446,-180 2438,-180"/>
</g>
<!-- X4 -->
<g id="node16" class="node">
<title>X4</title>
<polygon fill="#ffffff" stroke="black" points="2834,-261 2590,-261 2590,-123 2834,-123 2834,-261"/>
<polygon fill="none" stroke="black" points="2590,-238 2590,-261 2834,-261 2834,-238 2590,-238"/>
<text text-anchor="start" x="2703" y="-245.8" font-family="arial" font-size="14.00">X4</text>
<polygon fill="none" stroke="black" points="2590,-215 2590,-238 2756,-238 2756,-215 2590,-215"/>
<text text-anchor="start" x="2594" y="-222.8" font-family="arial" font-size="14.00">Screw terminal connector</text>
<polygon fill="none" stroke="black" points="2756,-215 2756,-238 2796,-238 2796,-215 2756,-215"/>
<text text-anchor="start" x="2760" y="-222.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="2796,-215 2796,-238 2826,-238 2826,-215 2796,-215"/>
<text text-anchor="start" x="2800" y="-222.8" font-family="arial" font-size="14.00">GN</text>
<polygon fill="#00ff00" stroke="transparent" points="2826,-215 2826,-238 2834,-238 2834,-215 2826,-215"/>
<polygon fill="none" stroke="black" points="2826,-215 2826,-238 2834,-238 2834,-215 2826,-215"/>
<polygon fill="none" stroke="black" points="2590,-192 2590,-215 2709,-215 2709,-192 2590,-192"/>
<text text-anchor="start" x="2645.5" y="-199.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="2709,-192 2709,-215 2834,-215 2834,-192 2709,-192"/>
<text text-anchor="start" x="2764.5" y="-199.8" font-family="arial" font-size="14.00">W</text>
<polygon fill="none" stroke="black" points="2590,-169 2590,-192 2709,-192 2709,-169 2590,-169"/>
<text text-anchor="start" x="2645.5" y="-176.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="2709,-169 2709,-192 2834,-192 2834,-169 2709,-169"/>
<text text-anchor="start" x="2766.5" y="-176.8" font-family="arial" font-size="14.00">X</text>
<polygon fill="none" stroke="black" points="2590,-146 2590,-169 2709,-169 2709,-146 2590,-146"/>
<text text-anchor="start" x="2645.5" y="-153.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="2709,-146 2709,-169 2834,-169 2834,-146 2709,-146"/>
<text text-anchor="start" x="2766.5" y="-153.8" font-family="arial" font-size="14.00">Y</text>
<polygon fill="none" stroke="black" points="2590,-123 2590,-146 2709,-146 2709,-123 2590,-123"/>
<text text-anchor="start" x="2645.5" y="-130.8" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="2709,-123 2709,-146 2834,-146 2834,-123 2709,-123"/>
<text text-anchor="start" x="2767" y="-130.8" font-family="arial" font-size="14.00">Z</text>
</g>
<!-- AUTOGENERATED_F_1&#45;&#45;X4 -->
<g id="edge36" class="edge">
<title>AUTOGENERATED_F_1:e&#45;&#45;X4:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M2446,-192C2506.71,-192 2523.93,-181.28 2579.88,-180.1"/>
<polygon fill="#000000" stroke="#000000" points="2580.04,-183.6 2590,-180 2579.96,-176.6 2580.04,-183.6"/>
</g>
<!-- AUTOGENERATED_F_2 -->
<g id="node13" class="node">
<title>AUTOGENERATED_F_2</title>
<polygon fill="#ffffff" stroke="black" points="2446,-250.5 2356,-250.5 2356,-227.5 2446,-227.5 2446,-250.5"/>
<polygon fill="none" stroke="black" points="2356,-227 2356,-250 2409,-250 2409,-227 2356,-227"/>
<text text-anchor="start" x="2360" y="-234.8" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="2409,-227 2409,-250 2438,-250 2438,-227 2409,-227"/>
<text text-anchor="start" x="2413" y="-234.8" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="2438,-227 2438,-250 2446,-250 2446,-227 2438,-227"/>
<polygon fill="none" stroke="black" points="2438,-227 2438,-250 2446,-250 2446,-227 2438,-227"/>
</g>
<!-- AUTOGENERATED_F_2&#45;&#45;X4 -->
<g id="edge37" class="edge">
<title>AUTOGENERATED_F_2:e&#45;&#45;X4:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M2446,-239C2508.26,-239 2522.63,-207.72 2579.66,-204.3"/>
<polygon fill="#000000" stroke="#000000" points="2580.11,-207.79 2590,-204 2579.9,-200.79 2580.11,-207.79"/>
</g>
<!-- AUTOGENERATED_F_3 -->
<g id="node14" class="node">
<title>AUTOGENERATED_F_3</title>
<polygon fill="#ffffff" stroke="black" points="2446,-109.5 2356,-109.5 2356,-86.5 2446,-86.5 2446,-109.5"/>
<polygon fill="none" stroke="black" points="2356,-86 2356,-109 2409,-109 2409,-86 2356,-86"/>
<text text-anchor="start" x="2360" y="-93.8" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="2409,-86 2409,-109 2438,-109 2438,-86 2409,-86"/>
<text text-anchor="start" x="2413" y="-93.8" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="2438,-86 2438,-109 2446,-109 2446,-86 2438,-86"/>
<polygon fill="none" stroke="black" points="2438,-86 2438,-109 2446,-109 2446,-86 2438,-86"/>
</g>
<!-- AUTOGENERATED_F_3&#45;&#45;X4 -->
<g id="edge38" class="edge">
<title>AUTOGENERATED_F_3:e&#45;&#45;X4:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M2446,-98C2508.49,-98 2522.61,-130.3 2580,-133.71"/>
<polygon fill="#000000" stroke="#000000" points="2579.9,-137.21 2590,-134 2580.11,-130.21 2579.9,-137.21"/>
</g>
<!-- AUTOGENERATED_F_4 -->
<g id="node15" class="node">
<title>AUTOGENERATED_F_4</title>
<polygon fill="#ffffff" stroke="black" points="2446,-156.5 2356,-156.5 2356,-133.5 2446,-133.5 2446,-156.5"/>
<polygon fill="none" stroke="black" points="2356,-133 2356,-156 2409,-156 2409,-133 2356,-133"/>
<text text-anchor="start" x="2360" y="-140.8" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="2409,-133 2409,-156 2438,-156 2438,-133 2409,-133"/>
<text text-anchor="start" x="2413" y="-140.8" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="2438,-133 2438,-156 2446,-156 2446,-133 2438,-133"/>
<polygon fill="none" stroke="black" points="2438,-133 2438,-156 2446,-156 2446,-133 2438,-133"/>
</g>
<!-- AUTOGENERATED_F_4&#45;&#45;X4 -->
<g id="edge39" class="edge">
<title>AUTOGENERATED_F_4:e&#45;&#45;X4:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M2446,-145C2506.71,-145 2523.93,-155.72 2579.88,-156.9"/>
<polygon fill="#000000" stroke="#000000" points="2579.96,-160.4 2590,-157 2580.04,-153.4 2579.96,-160.4"/>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_S_1 -->
<g id="edge2" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_S_1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-172C474.53,-173.28 487.21,-206.28 551,-205"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M407,-174C472.66,-174 485.34,-207 551,-207"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-176C470.79,-174.72 483.47,-207.72 551,-209"/>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_S_2 -->
<g id="edge4" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_S_2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-147C472.34,-147.36 487.96,-158.36 551,-158"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M407,-149C471.19,-149 486.81,-160 551,-160"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-151C470.04,-150.64 485.66,-161.64 551,-162"/>
</g>
<!-- W1&#45;&#45;S1 -->
<g id="edge6" class="edge">
<title>W1:e&#45;&#45;S1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-122C470.04,-122.36 485.66,-111.36 551,-111"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M407,-124C471.19,-124 486.81,-113 551,-113"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-126C472.34,-125.64 487.96,-114.64 551,-115"/>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_S_3 -->
<g id="edge8" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_S_3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-97C470.79,-98.28 483.47,-65.28 551,-64"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M407,-99C472.66,-99 485.34,-66 551,-66"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-101C474.53,-99.72 487.21,-66.72 551,-68"/>
</g>
<!-- W2&#45;&#45;AUTOGENERATED_S_4 -->
<g id="edge10" class="edge">
<title>W2:e&#45;&#45;AUTOGENERATED_S_4:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-183C934.87,-184.55 945.03,-228.55 1010,-227"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M866,-185C932.92,-185 943.08,-229 1010,-229"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-187C930.97,-185.45 941.13,-229.45 1010,-231"/>
</g>
<!-- W2&#45;&#45;AUTOGENERATED_S_5 -->
<g id="edge12" class="edge">
<title>W2:e&#45;&#45;AUTOGENERATED_S_5:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-158C932.41,-158.9 946.93,-180.9 1010,-180"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M866,-160C930.74,-160 945.26,-182 1010,-182"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-162C929.07,-161.1 943.59,-183.1 1010,-184"/>
</g>
<!-- W2&#45;&#45;AUTOGENERATED_S_6 -->
<g id="edge14" class="edge">
<title>W2:e&#45;&#45;AUTOGENERATED_S_6:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-133C930,-133 946,-133 1010,-133"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M866,-135C930,-135 946,-135 1010,-135"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-137C930,-137 946,-137 1010,-137"/>
</g>
<!-- W2&#45;&#45;AUTOGENERATED_S_7 -->
<g id="edge16" class="edge">
<title>W2:e&#45;&#45;AUTOGENERATED_S_7:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-108C929.07,-108.9 943.59,-86.9 1010,-86"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M866,-110C930.74,-110 945.26,-88 1010,-88"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-112C932.41,-111.1 946.93,-89.1 1010,-90"/>
</g>
<!-- W21&#45;&#45;X2 -->
<g id="edge18" class="edge">
<title>W21:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-205C1431.64,-205.03 1447.62,-202.03 1512,-202"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M1368,-207C1432.01,-207 1447.99,-204 1512,-204"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-209C1432.38,-208.97 1448.36,-205.97 1512,-206"/>
</g>
<!-- W21&#45;&#45;X2 -->
<g id="edge20" class="edge">
<title>W21:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-180C1431.76,-180.02 1447.75,-178.02 1512,-178"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M1368,-182C1432.01,-182 1447.99,-180 1512,-180"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-184C1432.25,-183.98 1448.24,-181.98 1512,-182"/>
</g>
<!-- W21&#45;&#45;X2 -->
<g id="edge22" class="edge">
<title>W21:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-155C1432,-155 1448,-155 1512,-155"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M1368,-157C1432,-157 1448,-157 1512,-157"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-159C1432,-159 1448,-159 1512,-159"/>
</g>
<!-- W21&#45;&#45;X2 -->
<g id="edge24" class="edge">
<title>W21:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-130C1432.25,-130.02 1448.24,-132.02 1512,-132"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M1368,-132C1432.01,-132 1447.99,-134 1512,-134"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-134C1431.76,-133.98 1447.75,-135.98 1512,-136"/>
</g>
<!-- W3&#45;&#45;AUTOGENERATED_F_1 -->
<g id="edge26" class="edge">
<title>W3:e&#45;&#45;AUTOGENERATED_F_1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-204C2274.96,-204.52 2290.35,-190.52 2356,-190"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M2212,-206C2276.3,-206 2291.7,-192 2356,-192"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-208C2277.65,-207.48 2293.04,-193.48 2356,-194"/>
</g>
<!-- W3&#45;&#45;AUTOGENERATED_F_2 -->
<g id="edge28" class="edge">
<title>W3:e&#45;&#45;AUTOGENERATED_F_2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-179C2282.99,-180.79 2288.99,-238.79 2356,-237"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M2212,-181C2281,-181 2287,-239 2356,-239"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-183C2279.01,-181.21 2285.01,-239.21 2356,-241"/>
</g>
<!-- W3&#45;&#45;AUTOGENERATED_F_3 -->
<g id="edge30" class="edge">
<title>W3:e&#45;&#45;AUTOGENERATED_F_3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-154C2279.01,-155.79 2285.01,-97.79 2356,-96"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M2212,-156C2281,-156 2287,-98 2356,-98"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-158C2282.99,-156.21 2288.99,-98.21 2356,-100"/>
</g>
<!-- W3&#45;&#45;AUTOGENERATED_F_4 -->
<g id="edge32" class="edge">
<title>W3:e&#45;&#45;AUTOGENERATED_F_4:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-129C2277.65,-129.52 2293.04,-143.52 2356,-143"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M2212,-131C2276.3,-131 2291.7,-145 2356,-145"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-133C2274.96,-132.48 2290.35,-146.48 2356,-147"/>
</g>
<!-- AUTOGENERATED_WIRE_1&#45;&#45;X2 -->
<g id="edge34" class="edge">
<title>AUTOGENERATED_WIRE_1:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1367,-20C1450.41,-22.31 1432.54,-134.31 1512,-132"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1367,-22C1448.43,-22 1430.57,-134 1512,-134"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1367,-24C1446.46,-21.69 1428.59,-133.69 1512,-136"/>
</g>
</g>
</svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2>
<div id="bom">
<table class="bom">
<tr>
<th class="bom_col_id">Id</th>
<th class="bom_col_description">Description</th>
<th class="bom_col_qty">Qty</th>
<th class="bom_col_unit">Unit</th>
<th class="bom_col_designators">Designators</th>
</tr>
<tr>
<td class="bom_col_id">1</td>
<td class="bom_col_description">Cable, 1 wires</td>
<td class="bom_col_qty">0.1</td>
<td class="bom_col_unit">m</td>
<td class="bom_col_designators"></td>
</tr>
<tr>
<td class="bom_col_id">2</td>
<td class="bom_col_description">Cable, 4 wires</td>
<td class="bom_col_qty">0.4</td>
<td class="bom_col_unit">m</td>
<td class="bom_col_designators">W1, W2, W21, W3</td>
</tr>
<tr>
<td class="bom_col_id">3</td>
<td class="bom_col_description">Connector, Ferrule, GY</td>
<td class="bom_col_qty">4</td>
<td class="bom_col_unit"></td>
<td class="bom_col_designators"></td>
</tr>
<tr>
<td class="bom_col_id">4</td>
<td class="bom_col_description">Connector, JST SM, female, 4 pins</td>
<td class="bom_col_qty">1</td>
<td class="bom_col_unit"></td>
<td class="bom_col_designators">X2</td>
</tr>
<tr>
<td class="bom_col_id">5</td>
<td class="bom_col_description">Connector, JST SM, male, 4 pins</td>
<td class="bom_col_qty">2</td>
<td class="bom_col_unit"></td>
<td class="bom_col_designators">X1, X3</td>
</tr>
<tr>
<td class="bom_col_id">6</td>
<td class="bom_col_description">Connector, Screw terminal connector, 4 pins, GN</td>
<td class="bom_col_qty">1</td>
<td class="bom_col_unit"></td>
<td class="bom_col_designators">X4</td>
</tr>
<tr>
<td class="bom_col_id">7</td>
<td class="bom_col_description">Connector, Splice, CU</td>
<td class="bom_col_qty">8</td>
<td class="bom_col_unit"></td>
<td class="bom_col_designators"></td>
</tr>
</table>
</div>
</body></html>

BIN
examples/ex14.png generated Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

676
examples/ex14.svg generated Normal file
View File

@ -0,0 +1,676 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
-->
<!-- Pages: 1 -->
<svg width="2842pt" height="302pt"
viewBox="0.00 0.00 2842.00 302.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 298)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-298 2838,-298 2838,4 -4,4"/>
<!-- X1 -->
<g id="node1" class="node">
<title>X1</title>
<polygon fill="#ffffff" stroke="black" points="137,-229 0,-229 0,-91 137,-91 137,-229"/>
<polygon fill="none" stroke="black" points="0.5,-206 0.5,-229 137.5,-229 137.5,-206 0.5,-206"/>
<text text-anchor="start" x="60" y="-213.8" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="0.5,-183 0.5,-206 58.5,-206 58.5,-183 0.5,-183"/>
<text text-anchor="start" x="4.5" y="-190.8" font-family="arial" font-size="14.00">JST SM</text>
<polygon fill="none" stroke="black" points="58.5,-183 58.5,-206 97.5,-206 97.5,-183 58.5,-183"/>
<text text-anchor="start" x="62.5" y="-190.8" font-family="arial" font-size="14.00">male</text>
<polygon fill="none" stroke="black" points="97.5,-183 97.5,-206 137.5,-206 137.5,-183 97.5,-183"/>
<text text-anchor="start" x="101.5" y="-190.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="0.5,-160 0.5,-183 70.5,-183 70.5,-160 0.5,-160"/>
<text text-anchor="start" x="30.5" y="-167.8" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="70.5,-160 70.5,-183 137.5,-183 137.5,-160 70.5,-160"/>
<text text-anchor="start" x="100" y="-167.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="0.5,-137 0.5,-160 70.5,-160 70.5,-137 0.5,-137"/>
<text text-anchor="start" x="30.5" y="-144.8" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="70.5,-137 70.5,-160 137.5,-160 137.5,-137 70.5,-137"/>
<text text-anchor="start" x="100" y="-144.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="0.5,-114 0.5,-137 70.5,-137 70.5,-114 0.5,-114"/>
<text text-anchor="start" x="30" y="-121.8" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="70.5,-114 70.5,-137 137.5,-137 137.5,-114 70.5,-114"/>
<text text-anchor="start" x="100" y="-121.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="0.5,-91 0.5,-114 70.5,-114 70.5,-91 0.5,-91"/>
<text text-anchor="start" x="30" y="-98.8" font-family="arial" font-size="14.00">D</text>
<polygon fill="none" stroke="black" points="70.5,-91 70.5,-114 137.5,-114 137.5,-91 70.5,-91"/>
<text text-anchor="start" x="100" y="-98.8" font-family="arial" font-size="14.00">4</text>
</g>
<!-- W1 -->
<g id="node17" class="node">
<title>W1</title>
<polygon fill="#ffffff" stroke="black" points="407,-261 281,-261 281,-77 407,-77 407,-261"/>
<polygon fill="none" stroke="black" points="281,-238 281,-261 407,-261 407,-238 281,-238"/>
<text text-anchor="start" x="333.5" y="-245.8" font-family="arial" font-size="14.00">W1</text>
<polygon fill="none" stroke="black" points="281,-215 281,-238 334,-238 334,-215 281,-215"/>
<text text-anchor="start" x="300" y="-222.8" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="334,-215 334,-238 407,-238 407,-215 334,-215"/>
<text text-anchor="start" x="352.5" y="-222.8" font-family="arial" font-size="14.00">0.1 m</text>
<text text-anchor="start" x="302.5" y="-201.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="283" y="-182.8" font-family="arial" font-size="14.00">X1:4:D</text>
<text text-anchor="start" x="330" y="-182.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="281,-175 281,-177 407,-177 407,-175 281,-175"/>
<polygon fill="#ffffff" stroke="transparent" points="281,-173 281,-175 407,-175 407,-173 281,-173"/>
<polygon fill="#000000" stroke="transparent" points="281,-171 281,-173 407,-173 407,-171 281,-171"/>
<text text-anchor="start" x="283" y="-157.8" font-family="arial" font-size="14.00">X1:3:C</text>
<text text-anchor="start" x="332" y="-157.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="281,-150 281,-152 407,-152 407,-150 281,-150"/>
<polygon fill="#895956" stroke="transparent" points="281,-148 281,-150 407,-150 407,-148 281,-148"/>
<polygon fill="#000000" stroke="transparent" points="281,-146 281,-148 407,-148 407,-146 281,-146"/>
<text text-anchor="start" x="283" y="-132.8" font-family="arial" font-size="14.00">X1:2:B</text>
<text text-anchor="start" x="331.5" y="-132.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="281,-125 281,-127 407,-127 407,-125 281,-125"/>
<polygon fill="#00ff00" stroke="transparent" points="281,-123 281,-125 407,-125 407,-123 281,-123"/>
<polygon fill="#000000" stroke="transparent" points="281,-121 281,-123 407,-123 407,-121 281,-121"/>
<text text-anchor="start" x="283" y="-107.8" font-family="arial" font-size="14.00">X1:1:A</text>
<text text-anchor="start" x="332.5" y="-107.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="281,-100 281,-102 407,-102 407,-100 281,-100"/>
<polygon fill="#ffff00" stroke="transparent" points="281,-98 281,-100 407,-100 407,-98 281,-98"/>
<polygon fill="#000000" stroke="transparent" points="281,-96 281,-98 407,-98 407,-96 281,-96"/>
<text text-anchor="start" x="302.5" y="-82.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- X1&#45;&#45;W1 -->
<g id="edge1" class="edge">
<title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-100C210.55,-101.98 211.45,-173.98 281,-172"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M137,-102C208.55,-102 209.45,-174 281,-174"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-104C206.55,-102.02 207.45,-174.02 281,-176"/>
</g>
<!-- X1&#45;&#45;W1 -->
<g id="edge3" class="edge">
<title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-123C203.6,-123.98 217.84,-147.98 281,-147"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M137,-125C201.88,-125 216.12,-149 281,-149"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-127C200.16,-126.02 214.4,-150.02 281,-151"/>
</g>
<!-- X1&#45;&#45;W1 -->
<g id="edge5" class="edge">
<title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-146C200.16,-146.98 214.4,-122.98 281,-122"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M137,-148C201.88,-148 216.12,-124 281,-124"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-150C203.6,-149.02 217.84,-125.02 281,-126"/>
</g>
<!-- X1&#45;&#45;W1 -->
<g id="edge7" class="edge">
<title>X1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-170C206.75,-171.99 207.25,-98.99 281,-97"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M137,-172C208.75,-172 209.25,-99 281,-99"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M137,-174C210.75,-172.01 211.25,-99.01 281,-101"/>
</g>
<!-- AUTOGENERATED_S_1 -->
<g id="node2" class="node">
<title>AUTOGENERATED_S_1</title>
<polygon fill="#ffffff" stroke="black" points="635,-218.5 551,-218.5 551,-195.5 635,-195.5 635,-218.5"/>
<polygon fill="none" stroke="black" points="551,-195 551,-218 598,-218 598,-195 551,-195"/>
<text text-anchor="start" x="555" y="-202.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="598,-195 598,-218 627,-218 627,-195 598,-195"/>
<text text-anchor="start" x="602" y="-202.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="627,-195 627,-218 635,-218 635,-195 627,-195"/>
<polygon fill="none" stroke="black" points="627,-195 627,-218 635,-218 635,-195 627,-195"/>
</g>
<!-- W2 -->
<g id="node18" class="node">
<title>W2</title>
<polygon fill="#ffffff" stroke="black" points="866,-272 779,-272 779,-88 866,-88 866,-272"/>
<polygon fill="none" stroke="black" points="779.5,-249 779.5,-272 866.5,-272 866.5,-249 779.5,-249"/>
<text text-anchor="start" x="812.5" y="-256.8" font-family="arial" font-size="14.00">W2</text>
<polygon fill="none" stroke="black" points="779.5,-226 779.5,-249 812.5,-249 812.5,-226 779.5,-226"/>
<text text-anchor="start" x="788.5" y="-233.8" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="812.5,-226 812.5,-249 866.5,-249 866.5,-226 812.5,-226"/>
<text text-anchor="start" x="821.5" y="-233.8" font-family="arial" font-size="14.00">0.1 m</text>
<text text-anchor="start" x="781.5" y="-212.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="789.5" y="-193.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="779.5,-186 779.5,-188 866.5,-188 866.5,-186 779.5,-186"/>
<polygon fill="#ffffff" stroke="transparent" points="779.5,-184 779.5,-186 866.5,-186 866.5,-184 779.5,-184"/>
<polygon fill="#000000" stroke="transparent" points="779.5,-182 779.5,-184 866.5,-184 866.5,-182 779.5,-182"/>
<text text-anchor="start" x="791.5" y="-168.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="779.5,-161 779.5,-163 866.5,-163 866.5,-161 779.5,-161"/>
<polygon fill="#895956" stroke="transparent" points="779.5,-159 779.5,-161 866.5,-161 866.5,-159 779.5,-159"/>
<polygon fill="#000000" stroke="transparent" points="779.5,-157 779.5,-159 866.5,-159 866.5,-157 779.5,-157"/>
<text text-anchor="start" x="791" y="-143.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="779.5,-136 779.5,-138 866.5,-138 866.5,-136 779.5,-136"/>
<polygon fill="#00ff00" stroke="transparent" points="779.5,-134 779.5,-136 866.5,-136 866.5,-134 779.5,-134"/>
<polygon fill="#000000" stroke="transparent" points="779.5,-132 779.5,-134 866.5,-134 866.5,-132 779.5,-132"/>
<text text-anchor="start" x="792" y="-118.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="779.5,-111 779.5,-113 866.5,-113 866.5,-111 779.5,-111"/>
<polygon fill="#ffff00" stroke="transparent" points="779.5,-109 779.5,-111 866.5,-111 866.5,-109 779.5,-109"/>
<polygon fill="#000000" stroke="transparent" points="779.5,-107 779.5,-109 866.5,-109 866.5,-107 779.5,-107"/>
<text text-anchor="start" x="781.5" y="-93.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- AUTOGENERATED_S_1&#45;&#45;W2 -->
<g id="edge9" class="edge">
<title>AUTOGENERATED_S_1:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-205C698.07,-205.9 712.59,-183.9 779,-183"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M635,-207C699.74,-207 714.26,-185 779,-185"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-209C701.41,-208.1 715.93,-186.1 779,-187"/>
</g>
<!-- AUTOGENERATED_S_2 -->
<g id="node3" class="node">
<title>AUTOGENERATED_S_2</title>
<polygon fill="#ffffff" stroke="black" points="635,-171.5 551,-171.5 551,-148.5 635,-148.5 635,-171.5"/>
<polygon fill="none" stroke="black" points="551,-148 551,-171 598,-171 598,-148 551,-148"/>
<text text-anchor="start" x="555" y="-155.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="598,-148 598,-171 627,-171 627,-148 598,-148"/>
<text text-anchor="start" x="602" y="-155.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="627,-148 627,-171 635,-171 635,-148 627,-148"/>
<polygon fill="none" stroke="black" points="627,-148 627,-171 635,-171 635,-148 627,-148"/>
</g>
<!-- AUTOGENERATED_S_2&#45;&#45;W2 -->
<g id="edge11" class="edge">
<title>AUTOGENERATED_S_2:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-158C699,-158 715,-158 779,-158"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M635,-160C699,-160 715,-160 779,-160"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-162C699,-162 715,-162 779,-162"/>
</g>
<!-- S1 -->
<g id="node4" class="node">
<title>S1</title>
<polygon fill="#ffffff" stroke="black" points="635,-124.5 551,-124.5 551,-101.5 635,-101.5 635,-124.5"/>
<polygon fill="none" stroke="black" points="551,-101 551,-124 598,-124 598,-101 551,-101"/>
<text text-anchor="start" x="555" y="-108.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="598,-101 598,-124 627,-124 627,-101 598,-101"/>
<text text-anchor="start" x="602" y="-108.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="627,-101 627,-124 635,-124 635,-101 627,-101"/>
<polygon fill="none" stroke="black" points="627,-101 627,-124 635,-124 635,-101 627,-101"/>
</g>
<!-- S1&#45;&#45;W2 -->
<g id="edge13" class="edge">
<title>S1:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-111C701.41,-111.9 715.93,-133.9 779,-133"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M635,-113C699.74,-113 714.26,-135 779,-135"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-115C698.07,-114.1 712.59,-136.1 779,-137"/>
</g>
<!-- AUTOGENERATED_WIRE_1 -->
<g id="node21" class="node">
<title>AUTOGENERATED_WIRE_1</title>
<polygon fill="#ffffff" stroke="black" points="1365.5,-86 1240.5,-86 1240.5,0 1365.5,0 1365.5,-86"/>
<polygon fill="none" stroke="black" points="1241,-63 1241,-86 1293,-86 1293,-63 1241,-63"/>
<text text-anchor="start" x="1259.5" y="-70.8" font-family="arial" font-size="14.00">1x</text>
<polygon fill="none" stroke="black" points="1293,-63 1293,-86 1366,-86 1366,-63 1293,-63"/>
<text text-anchor="start" x="1311.5" y="-70.8" font-family="arial" font-size="14.00">0.1 m</text>
<text text-anchor="start" x="1243" y="-49.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="1251" y="-30.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:BK &#160;&#160;&#160;</text>
<text text-anchor="start" x="1321" y="-30.8" font-family="arial" font-size="14.00">X2:4:D</text>
<polygon fill="#000000" stroke="transparent" points="1241,-23 1241,-25 1366,-25 1366,-23 1241,-23"/>
<polygon fill="#000000" stroke="transparent" points="1241,-21 1241,-23 1366,-23 1366,-21 1241,-21"/>
<polygon fill="#000000" stroke="transparent" points="1241,-19 1241,-21 1366,-21 1366,-19 1241,-19"/>
<text text-anchor="start" x="1243" y="-5.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- S1&#45;&#45;AUTOGENERATED_WIRE_1 -->
<g id="edge33" class="edge">
<title>S1:e&#45;&#45;AUTOGENERATED_WIRE_1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-111C699.3,-112.08 712.26,-87.17 778.63,-74.03 981.21,-36.34 1033.11,-20.09 1240,-20"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-113C701.08,-113 714.04,-88.09 779,-76 981.81,-38.25 1033.71,-22 1240,-22"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-115C702.85,-113.92 715.81,-89.02 779.37,-77.97 982.4,-40.15 1034.31,-23.91 1240,-24"/>
</g>
<!-- AUTOGENERATED_S_3 -->
<g id="node5" class="node">
<title>AUTOGENERATED_S_3</title>
<polygon fill="#ffffff" stroke="black" points="635,-77.5 551,-77.5 551,-54.5 635,-54.5 635,-77.5"/>
<polygon fill="none" stroke="black" points="551,-54 551,-77 598,-77 598,-54 551,-54"/>
<text text-anchor="start" x="555" y="-61.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="598,-54 598,-77 627,-77 627,-54 598,-54"/>
<text text-anchor="start" x="602" y="-61.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="627,-54 627,-77 635,-77 635,-54 627,-54"/>
<polygon fill="none" stroke="black" points="627,-54 627,-77 635,-77 635,-54 627,-54"/>
</g>
<!-- AUTOGENERATED_S_3&#45;&#45;W2 -->
<g id="edge15" class="edge">
<title>AUTOGENERATED_S_3:e&#45;&#45;W2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-64C703.87,-65.55 714.03,-109.55 779,-108"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M635,-66C701.92,-66 712.08,-110 779,-110"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M635,-68C699.97,-66.45 710.13,-110.45 779,-112"/>
</g>
<!-- AUTOGENERATED_S_4 -->
<g id="node6" class="node">
<title>AUTOGENERATED_S_4</title>
<polygon fill="#ffffff" stroke="black" points="1094,-240.5 1010,-240.5 1010,-217.5 1094,-217.5 1094,-240.5"/>
<polygon fill="none" stroke="black" points="1010,-217 1010,-240 1057,-240 1057,-217 1010,-217"/>
<text text-anchor="start" x="1014" y="-224.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="1057,-217 1057,-240 1086,-240 1086,-217 1057,-217"/>
<text text-anchor="start" x="1061" y="-224.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="1086,-217 1086,-240 1094,-240 1094,-217 1086,-217"/>
<polygon fill="none" stroke="black" points="1086,-217 1086,-240 1094,-240 1094,-217 1086,-217"/>
</g>
<!-- W21 -->
<g id="node19" class="node">
<title>W21</title>
<polygon fill="#ffffff" stroke="black" points="1368,-294 1238,-294 1238,-110 1368,-110 1368,-294"/>
<polygon fill="none" stroke="black" points="1238,-271 1238,-294 1368,-294 1368,-271 1238,-271"/>
<text text-anchor="start" x="1288.5" y="-278.8" font-family="arial" font-size="14.00">W21</text>
<polygon fill="none" stroke="black" points="1238,-248 1238,-271 1293,-271 1293,-248 1238,-248"/>
<text text-anchor="start" x="1258" y="-255.8" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="1293,-248 1293,-271 1368,-271 1368,-248 1293,-248"/>
<text text-anchor="start" x="1312.5" y="-255.8" font-family="arial" font-size="14.00">0.1 m</text>
<text text-anchor="start" x="1240" y="-234.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="1248" y="-215.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<text text-anchor="start" x="1323" y="-215.8" font-family="arial" font-size="14.00">X2:1:A</text>
<polygon fill="#000000" stroke="transparent" points="1238,-208 1238,-210 1368,-210 1368,-208 1238,-208"/>
<polygon fill="#ffffff" stroke="transparent" points="1238,-206 1238,-208 1368,-208 1368,-206 1238,-206"/>
<polygon fill="#000000" stroke="transparent" points="1238,-204 1238,-206 1368,-206 1368,-204 1238,-204"/>
<text text-anchor="start" x="1250" y="-190.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<text text-anchor="start" x="1323" y="-190.8" font-family="arial" font-size="14.00">X2:2:B</text>
<polygon fill="#000000" stroke="transparent" points="1238,-183 1238,-185 1368,-185 1368,-183 1238,-183"/>
<polygon fill="#895956" stroke="transparent" points="1238,-181 1238,-183 1368,-183 1368,-181 1238,-181"/>
<polygon fill="#000000" stroke="transparent" points="1238,-179 1238,-181 1368,-181 1368,-179 1238,-179"/>
<text text-anchor="start" x="1249.5" y="-165.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<text text-anchor="start" x="1323" y="-165.8" font-family="arial" font-size="14.00">X2:3:C</text>
<polygon fill="#000000" stroke="transparent" points="1238,-158 1238,-160 1368,-160 1368,-158 1238,-158"/>
<polygon fill="#00ff00" stroke="transparent" points="1238,-156 1238,-158 1368,-158 1368,-156 1238,-156"/>
<polygon fill="#000000" stroke="transparent" points="1238,-154 1238,-156 1368,-156 1368,-154 1238,-154"/>
<text text-anchor="start" x="1250.5" y="-140.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<text text-anchor="start" x="1323" y="-140.8" font-family="arial" font-size="14.00">X2:4:D</text>
<polygon fill="#000000" stroke="transparent" points="1238,-133 1238,-135 1368,-135 1368,-133 1238,-133"/>
<polygon fill="#ffff00" stroke="transparent" points="1238,-131 1238,-133 1368,-133 1368,-131 1238,-131"/>
<polygon fill="#000000" stroke="transparent" points="1238,-129 1238,-131 1368,-131 1368,-129 1238,-129"/>
<text text-anchor="start" x="1240" y="-115.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- AUTOGENERATED_S_4&#45;&#45;W21 -->
<g id="edge17" class="edge">
<title>AUTOGENERATED_S_4:e&#45;&#45;W21:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-227C1157.07,-227.9 1171.59,-205.9 1238,-205"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M1094,-229C1158.74,-229 1173.26,-207 1238,-207"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-231C1160.41,-230.1 1174.93,-208.1 1238,-209"/>
</g>
<!-- AUTOGENERATED_S_5 -->
<g id="node7" class="node">
<title>AUTOGENERATED_S_5</title>
<polygon fill="#ffffff" stroke="black" points="1094,-193.5 1010,-193.5 1010,-170.5 1094,-170.5 1094,-193.5"/>
<polygon fill="none" stroke="black" points="1010,-170 1010,-193 1057,-193 1057,-170 1010,-170"/>
<text text-anchor="start" x="1014" y="-177.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="1057,-170 1057,-193 1086,-193 1086,-170 1057,-170"/>
<text text-anchor="start" x="1061" y="-177.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="1086,-170 1086,-193 1094,-193 1094,-170 1086,-170"/>
<polygon fill="none" stroke="black" points="1086,-170 1086,-193 1094,-193 1094,-170 1086,-170"/>
</g>
<!-- AUTOGENERATED_S_5&#45;&#45;W21 -->
<g id="edge19" class="edge">
<title>AUTOGENERATED_S_5:e&#45;&#45;W21:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-180C1158,-180 1174,-180 1238,-180"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M1094,-182C1158,-182 1174,-182 1238,-182"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-184C1158,-184 1174,-184 1238,-184"/>
</g>
<!-- AUTOGENERATED_S_6 -->
<g id="node8" class="node">
<title>AUTOGENERATED_S_6</title>
<polygon fill="#ffffff" stroke="black" points="1094,-146.5 1010,-146.5 1010,-123.5 1094,-123.5 1094,-146.5"/>
<polygon fill="none" stroke="black" points="1010,-123 1010,-146 1057,-146 1057,-123 1010,-123"/>
<text text-anchor="start" x="1014" y="-130.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="1057,-123 1057,-146 1086,-146 1086,-123 1057,-123"/>
<text text-anchor="start" x="1061" y="-130.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="1086,-123 1086,-146 1094,-146 1094,-123 1086,-123"/>
<polygon fill="none" stroke="black" points="1086,-123 1086,-146 1094,-146 1094,-123 1086,-123"/>
</g>
<!-- AUTOGENERATED_S_6&#45;&#45;W21 -->
<g id="edge21" class="edge">
<title>AUTOGENERATED_S_6:e&#45;&#45;W21:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-133C1160.41,-133.9 1174.93,-155.9 1238,-155"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M1094,-135C1158.74,-135 1173.26,-157 1238,-157"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-137C1157.07,-136.1 1171.59,-158.1 1238,-159"/>
</g>
<!-- AUTOGENERATED_S_7 -->
<g id="node9" class="node">
<title>AUTOGENERATED_S_7</title>
<polygon fill="#ffffff" stroke="black" points="1094,-99.5 1010,-99.5 1010,-76.5 1094,-76.5 1094,-99.5"/>
<polygon fill="none" stroke="black" points="1010,-76 1010,-99 1057,-99 1057,-76 1010,-76"/>
<text text-anchor="start" x="1014" y="-83.8" font-family="arial" font-size="14.00">Splice</text>
<polygon fill="none" stroke="black" points="1057,-76 1057,-99 1086,-99 1086,-76 1057,-76"/>
<text text-anchor="start" x="1061" y="-83.8" font-family="arial" font-size="14.00">CU</text>
<polygon fill="#d6775e" stroke="transparent" points="1086,-76 1086,-99 1094,-99 1094,-76 1086,-76"/>
<polygon fill="none" stroke="black" points="1086,-76 1086,-99 1094,-99 1094,-76 1086,-76"/>
</g>
<!-- AUTOGENERATED_S_7&#45;&#45;W21 -->
<g id="edge23" class="edge">
<title>AUTOGENERATED_S_7:e&#45;&#45;W21:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-86C1162.87,-87.55 1173.03,-131.55 1238,-130"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M1094,-88C1160.92,-88 1171.08,-132 1238,-132"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1094,-90C1158.97,-88.45 1169.13,-132.45 1238,-134"/>
</g>
<!-- X2 -->
<g id="node10" class="node">
<title>X2</title>
<polygon fill="#ffffff" stroke="black" points="1661,-261 1512,-261 1512,-123 1661,-123 1661,-261"/>
<polygon fill="none" stroke="black" points="1512.5,-238 1512.5,-261 1661.5,-261 1661.5,-238 1512.5,-238"/>
<text text-anchor="start" x="1578" y="-245.8" font-family="arial" font-size="14.00">X2</text>
<polygon fill="none" stroke="black" points="1512.5,-215 1512.5,-238 1570.5,-238 1570.5,-215 1512.5,-215"/>
<text text-anchor="start" x="1516.5" y="-222.8" font-family="arial" font-size="14.00">JST SM</text>
<polygon fill="none" stroke="black" points="1570.5,-215 1570.5,-238 1621.5,-238 1621.5,-215 1570.5,-215"/>
<text text-anchor="start" x="1574.5" y="-222.8" font-family="arial" font-size="14.00">female</text>
<polygon fill="none" stroke="black" points="1621.5,-215 1621.5,-238 1661.5,-238 1661.5,-215 1621.5,-215"/>
<text text-anchor="start" x="1625.5" y="-222.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="1512.5,-192 1512.5,-215 1585.5,-215 1585.5,-192 1512.5,-192"/>
<text text-anchor="start" x="1545" y="-199.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="1585.5,-192 1585.5,-215 1661.5,-215 1661.5,-192 1585.5,-192"/>
<text text-anchor="start" x="1618.5" y="-199.8" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="1512.5,-169 1512.5,-192 1585.5,-192 1585.5,-169 1512.5,-169"/>
<text text-anchor="start" x="1545" y="-176.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="1585.5,-169 1585.5,-192 1661.5,-192 1661.5,-169 1585.5,-169"/>
<text text-anchor="start" x="1618.5" y="-176.8" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="1512.5,-146 1512.5,-169 1585.5,-169 1585.5,-146 1512.5,-146"/>
<text text-anchor="start" x="1545" y="-153.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="1585.5,-146 1585.5,-169 1661.5,-169 1661.5,-146 1585.5,-146"/>
<text text-anchor="start" x="1618" y="-153.8" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="1512.5,-123 1512.5,-146 1585.5,-146 1585.5,-123 1512.5,-123"/>
<text text-anchor="start" x="1545" y="-130.8" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="1585.5,-123 1585.5,-146 1661.5,-146 1661.5,-123 1585.5,-123"/>
<text text-anchor="start" x="1618" y="-130.8" font-family="arial" font-size="14.00">D</text>
</g>
<!-- X3 -->
<g id="node11" class="node">
<title>X3</title>
<polygon fill="#ffffff" stroke="black" points="1942,-261 1805,-261 1805,-123 1942,-123 1942,-261"/>
<polygon fill="none" stroke="black" points="1805.5,-238 1805.5,-261 1942.5,-261 1942.5,-238 1805.5,-238"/>
<text text-anchor="start" x="1865" y="-245.8" font-family="arial" font-size="14.00">X3</text>
<polygon fill="none" stroke="black" points="1805.5,-215 1805.5,-238 1863.5,-238 1863.5,-215 1805.5,-215"/>
<text text-anchor="start" x="1809.5" y="-222.8" font-family="arial" font-size="14.00">JST SM</text>
<polygon fill="none" stroke="black" points="1863.5,-215 1863.5,-238 1902.5,-238 1902.5,-215 1863.5,-215"/>
<text text-anchor="start" x="1867.5" y="-222.8" font-family="arial" font-size="14.00">male</text>
<polygon fill="none" stroke="black" points="1902.5,-215 1902.5,-238 1942.5,-238 1942.5,-215 1902.5,-215"/>
<text text-anchor="start" x="1906.5" y="-222.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="1805.5,-192 1805.5,-215 1875.5,-215 1875.5,-192 1805.5,-192"/>
<text text-anchor="start" x="1835.5" y="-199.8" font-family="arial" font-size="14.00">A</text>
<polygon fill="none" stroke="black" points="1875.5,-192 1875.5,-215 1942.5,-215 1942.5,-192 1875.5,-192"/>
<text text-anchor="start" x="1905" y="-199.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="1805.5,-169 1805.5,-192 1875.5,-192 1875.5,-169 1805.5,-169"/>
<text text-anchor="start" x="1835.5" y="-176.8" font-family="arial" font-size="14.00">B</text>
<polygon fill="none" stroke="black" points="1875.5,-169 1875.5,-192 1942.5,-192 1942.5,-169 1875.5,-169"/>
<text text-anchor="start" x="1905" y="-176.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="1805.5,-146 1805.5,-169 1875.5,-169 1875.5,-146 1805.5,-146"/>
<text text-anchor="start" x="1835" y="-153.8" font-family="arial" font-size="14.00">C</text>
<polygon fill="none" stroke="black" points="1875.5,-146 1875.5,-169 1942.5,-169 1942.5,-146 1875.5,-146"/>
<text text-anchor="start" x="1905" y="-153.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="1805.5,-123 1805.5,-146 1875.5,-146 1875.5,-123 1805.5,-123"/>
<text text-anchor="start" x="1835" y="-130.8" font-family="arial" font-size="14.00">D</text>
<polygon fill="none" stroke="black" points="1875.5,-123 1875.5,-146 1942.5,-146 1942.5,-123 1875.5,-123"/>
<text text-anchor="start" x="1905" y="-130.8" font-family="arial" font-size="14.00">4</text>
</g>
<!-- X2&#45;&#45;X3 -->
<g id="edge35" class="edge">
<title>X2:e&#45;&#45;X3:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M1671.09,-191C1723.62,-191 1742.31,-191 1794.79,-191"/>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M1671.09,-193C1723.62,-193 1742.31,-193 1794.79,-193"/>
<polygon fill="#000000" stroke="#000000" points="1671,-188.5 1661,-192 1671,-195.5 1671,-188.5"/>
<polygon fill="#000000" stroke="#000000" points="1795,-195.5 1805,-192 1795,-188.5 1795,-195.5"/>
</g>
<!-- W3 -->
<g id="node20" class="node">
<title>W3</title>
<polygon fill="#ffffff" stroke="black" points="2212,-293 2086,-293 2086,-109 2212,-109 2212,-293"/>
<polygon fill="none" stroke="black" points="2086,-270 2086,-293 2212,-293 2212,-270 2086,-270"/>
<text text-anchor="start" x="2138.5" y="-277.8" font-family="arial" font-size="14.00">W3</text>
<polygon fill="none" stroke="black" points="2086,-247 2086,-270 2139,-270 2139,-247 2086,-247"/>
<text text-anchor="start" x="2105" y="-254.8" font-family="arial" font-size="14.00">4x</text>
<polygon fill="none" stroke="black" points="2139,-247 2139,-270 2212,-270 2212,-247 2139,-247"/>
<text text-anchor="start" x="2157.5" y="-254.8" font-family="arial" font-size="14.00">0.1 m</text>
<text text-anchor="start" x="2107.5" y="-233.8" font-family="arial" font-size="14.00"> </text>
<text text-anchor="start" x="2088" y="-214.8" font-family="arial" font-size="14.00">X3:1:A</text>
<text text-anchor="start" x="2135" y="-214.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;1:WH &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="2086,-207 2086,-209 2212,-209 2212,-207 2086,-207"/>
<polygon fill="#ffffff" stroke="transparent" points="2086,-205 2086,-207 2212,-207 2212,-205 2086,-205"/>
<polygon fill="#000000" stroke="transparent" points="2086,-203 2086,-205 2212,-205 2212,-203 2086,-203"/>
<text text-anchor="start" x="2088" y="-189.8" font-family="arial" font-size="14.00">X3:2:B</text>
<text text-anchor="start" x="2137" y="-189.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;2:BN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="2086,-182 2086,-184 2212,-184 2212,-182 2086,-182"/>
<polygon fill="#895956" stroke="transparent" points="2086,-180 2086,-182 2212,-182 2212,-180 2086,-180"/>
<polygon fill="#000000" stroke="transparent" points="2086,-178 2086,-180 2212,-180 2212,-178 2086,-178"/>
<text text-anchor="start" x="2088" y="-164.8" font-family="arial" font-size="14.00">X3:3:C</text>
<text text-anchor="start" x="2136.5" y="-164.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;3:GN &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="2086,-157 2086,-159 2212,-159 2212,-157 2086,-157"/>
<polygon fill="#00ff00" stroke="transparent" points="2086,-155 2086,-157 2212,-157 2212,-155 2086,-155"/>
<polygon fill="#000000" stroke="transparent" points="2086,-153 2086,-155 2212,-155 2212,-153 2086,-153"/>
<text text-anchor="start" x="2088" y="-139.8" font-family="arial" font-size="14.00">X3:4:D</text>
<text text-anchor="start" x="2137.5" y="-139.8" font-family="arial" font-size="14.00"> &#160;&#160;&#160;&#160;4:YE &#160;&#160;&#160;</text>
<polygon fill="#000000" stroke="transparent" points="2086,-132 2086,-134 2212,-134 2212,-132 2086,-132"/>
<polygon fill="#ffff00" stroke="transparent" points="2086,-130 2086,-132 2212,-132 2212,-130 2086,-130"/>
<polygon fill="#000000" stroke="transparent" points="2086,-128 2086,-130 2212,-130 2212,-128 2086,-128"/>
<text text-anchor="start" x="2107.5" y="-114.8" font-family="arial" font-size="14.00"> </text>
</g>
<!-- X3&#45;&#45;W3 -->
<g id="edge25" class="edge">
<title>X3:e&#45;&#45;W3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-202C2006.25,-202.02 2022.24,-204.02 2086,-204"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M1942,-204C2006.01,-204 2021.99,-206 2086,-206"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-206C2005.76,-205.98 2021.75,-207.98 2086,-208"/>
</g>
<!-- X3&#45;&#45;W3 -->
<g id="edge27" class="edge">
<title>X3:e&#45;&#45;W3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-178C2006.13,-178 2022.12,-179 2086,-179"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M1942,-180C2006,-180 2022,-181 2086,-181"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-182C2005.88,-182 2021.87,-183 2086,-183"/>
</g>
<!-- X3&#45;&#45;W3 -->
<g id="edge29" class="edge">
<title>X3:e&#45;&#45;W3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-155C2005.88,-155 2021.87,-154 2086,-154"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M1942,-157C2006,-157 2022,-156 2086,-156"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-159C2006.13,-159 2022.12,-158 2086,-158"/>
</g>
<!-- X3&#45;&#45;W3 -->
<g id="edge31" class="edge">
<title>X3:e&#45;&#45;W3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-132C2005.64,-132.03 2021.62,-129.03 2086,-129"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M1942,-134C2006.01,-134 2021.99,-131 2086,-131"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1942,-136C2006.38,-135.97 2022.36,-132.97 2086,-133"/>
</g>
<!-- AUTOGENERATED_F_1 -->
<g id="node12" class="node">
<title>AUTOGENERATED_F_1</title>
<polygon fill="#ffffff" stroke="black" points="2446,-203.5 2356,-203.5 2356,-180.5 2446,-180.5 2446,-203.5"/>
<polygon fill="none" stroke="black" points="2356,-180 2356,-203 2409,-203 2409,-180 2356,-180"/>
<text text-anchor="start" x="2360" y="-187.8" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="2409,-180 2409,-203 2438,-203 2438,-180 2409,-180"/>
<text text-anchor="start" x="2413" y="-187.8" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="2438,-180 2438,-203 2446,-203 2446,-180 2438,-180"/>
<polygon fill="none" stroke="black" points="2438,-180 2438,-203 2446,-203 2446,-180 2438,-180"/>
</g>
<!-- X4 -->
<g id="node16" class="node">
<title>X4</title>
<polygon fill="#ffffff" stroke="black" points="2834,-261 2590,-261 2590,-123 2834,-123 2834,-261"/>
<polygon fill="none" stroke="black" points="2590,-238 2590,-261 2834,-261 2834,-238 2590,-238"/>
<text text-anchor="start" x="2703" y="-245.8" font-family="arial" font-size="14.00">X4</text>
<polygon fill="none" stroke="black" points="2590,-215 2590,-238 2756,-238 2756,-215 2590,-215"/>
<text text-anchor="start" x="2594" y="-222.8" font-family="arial" font-size="14.00">Screw terminal connector</text>
<polygon fill="none" stroke="black" points="2756,-215 2756,-238 2796,-238 2796,-215 2756,-215"/>
<text text-anchor="start" x="2760" y="-222.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="2796,-215 2796,-238 2826,-238 2826,-215 2796,-215"/>
<text text-anchor="start" x="2800" y="-222.8" font-family="arial" font-size="14.00">GN</text>
<polygon fill="#00ff00" stroke="transparent" points="2826,-215 2826,-238 2834,-238 2834,-215 2826,-215"/>
<polygon fill="none" stroke="black" points="2826,-215 2826,-238 2834,-238 2834,-215 2826,-215"/>
<polygon fill="none" stroke="black" points="2590,-192 2590,-215 2709,-215 2709,-192 2590,-192"/>
<text text-anchor="start" x="2645.5" y="-199.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="2709,-192 2709,-215 2834,-215 2834,-192 2709,-192"/>
<text text-anchor="start" x="2764.5" y="-199.8" font-family="arial" font-size="14.00">W</text>
<polygon fill="none" stroke="black" points="2590,-169 2590,-192 2709,-192 2709,-169 2590,-169"/>
<text text-anchor="start" x="2645.5" y="-176.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="2709,-169 2709,-192 2834,-192 2834,-169 2709,-169"/>
<text text-anchor="start" x="2766.5" y="-176.8" font-family="arial" font-size="14.00">X</text>
<polygon fill="none" stroke="black" points="2590,-146 2590,-169 2709,-169 2709,-146 2590,-146"/>
<text text-anchor="start" x="2645.5" y="-153.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="2709,-146 2709,-169 2834,-169 2834,-146 2709,-146"/>
<text text-anchor="start" x="2766.5" y="-153.8" font-family="arial" font-size="14.00">Y</text>
<polygon fill="none" stroke="black" points="2590,-123 2590,-146 2709,-146 2709,-123 2590,-123"/>
<text text-anchor="start" x="2645.5" y="-130.8" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="2709,-123 2709,-146 2834,-146 2834,-123 2709,-123"/>
<text text-anchor="start" x="2767" y="-130.8" font-family="arial" font-size="14.00">Z</text>
</g>
<!-- AUTOGENERATED_F_1&#45;&#45;X4 -->
<g id="edge36" class="edge">
<title>AUTOGENERATED_F_1:e&#45;&#45;X4:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M2446,-192C2506.71,-192 2523.93,-181.28 2579.88,-180.1"/>
<polygon fill="#000000" stroke="#000000" points="2580.04,-183.6 2590,-180 2579.96,-176.6 2580.04,-183.6"/>
</g>
<!-- AUTOGENERATED_F_2 -->
<g id="node13" class="node">
<title>AUTOGENERATED_F_2</title>
<polygon fill="#ffffff" stroke="black" points="2446,-250.5 2356,-250.5 2356,-227.5 2446,-227.5 2446,-250.5"/>
<polygon fill="none" stroke="black" points="2356,-227 2356,-250 2409,-250 2409,-227 2356,-227"/>
<text text-anchor="start" x="2360" y="-234.8" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="2409,-227 2409,-250 2438,-250 2438,-227 2409,-227"/>
<text text-anchor="start" x="2413" y="-234.8" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="2438,-227 2438,-250 2446,-250 2446,-227 2438,-227"/>
<polygon fill="none" stroke="black" points="2438,-227 2438,-250 2446,-250 2446,-227 2438,-227"/>
</g>
<!-- AUTOGENERATED_F_2&#45;&#45;X4 -->
<g id="edge37" class="edge">
<title>AUTOGENERATED_F_2:e&#45;&#45;X4:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M2446,-239C2508.26,-239 2522.63,-207.72 2579.66,-204.3"/>
<polygon fill="#000000" stroke="#000000" points="2580.11,-207.79 2590,-204 2579.9,-200.79 2580.11,-207.79"/>
</g>
<!-- AUTOGENERATED_F_3 -->
<g id="node14" class="node">
<title>AUTOGENERATED_F_3</title>
<polygon fill="#ffffff" stroke="black" points="2446,-109.5 2356,-109.5 2356,-86.5 2446,-86.5 2446,-109.5"/>
<polygon fill="none" stroke="black" points="2356,-86 2356,-109 2409,-109 2409,-86 2356,-86"/>
<text text-anchor="start" x="2360" y="-93.8" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="2409,-86 2409,-109 2438,-109 2438,-86 2409,-86"/>
<text text-anchor="start" x="2413" y="-93.8" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="2438,-86 2438,-109 2446,-109 2446,-86 2438,-86"/>
<polygon fill="none" stroke="black" points="2438,-86 2438,-109 2446,-109 2446,-86 2438,-86"/>
</g>
<!-- AUTOGENERATED_F_3&#45;&#45;X4 -->
<g id="edge38" class="edge">
<title>AUTOGENERATED_F_3:e&#45;&#45;X4:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M2446,-98C2508.49,-98 2522.61,-130.3 2580,-133.71"/>
<polygon fill="#000000" stroke="#000000" points="2579.9,-137.21 2590,-134 2580.11,-130.21 2579.9,-137.21"/>
</g>
<!-- AUTOGENERATED_F_4 -->
<g id="node15" class="node">
<title>AUTOGENERATED_F_4</title>
<polygon fill="#ffffff" stroke="black" points="2446,-156.5 2356,-156.5 2356,-133.5 2446,-133.5 2446,-156.5"/>
<polygon fill="none" stroke="black" points="2356,-133 2356,-156 2409,-156 2409,-133 2356,-133"/>
<text text-anchor="start" x="2360" y="-140.8" font-family="arial" font-size="14.00">Ferrule</text>
<polygon fill="none" stroke="black" points="2409,-133 2409,-156 2438,-156 2438,-133 2409,-133"/>
<text text-anchor="start" x="2413" y="-140.8" font-family="arial" font-size="14.00">GY</text>
<polygon fill="#999999" stroke="transparent" points="2438,-133 2438,-156 2446,-156 2446,-133 2438,-133"/>
<polygon fill="none" stroke="black" points="2438,-133 2438,-156 2446,-156 2446,-133 2438,-133"/>
</g>
<!-- AUTOGENERATED_F_4&#45;&#45;X4 -->
<g id="edge39" class="edge">
<title>AUTOGENERATED_F_4:e&#45;&#45;X4:w</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M2446,-145C2506.71,-145 2523.93,-155.72 2579.88,-156.9"/>
<polygon fill="#000000" stroke="#000000" points="2579.96,-160.4 2590,-157 2580.04,-153.4 2579.96,-160.4"/>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_S_1 -->
<g id="edge2" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_S_1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-172C474.53,-173.28 487.21,-206.28 551,-205"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M407,-174C472.66,-174 485.34,-207 551,-207"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-176C470.79,-174.72 483.47,-207.72 551,-209"/>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_S_2 -->
<g id="edge4" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_S_2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-147C472.34,-147.36 487.96,-158.36 551,-158"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M407,-149C471.19,-149 486.81,-160 551,-160"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-151C470.04,-150.64 485.66,-161.64 551,-162"/>
</g>
<!-- W1&#45;&#45;S1 -->
<g id="edge6" class="edge">
<title>W1:e&#45;&#45;S1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-122C470.04,-122.36 485.66,-111.36 551,-111"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M407,-124C471.19,-124 486.81,-113 551,-113"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-126C472.34,-125.64 487.96,-114.64 551,-115"/>
</g>
<!-- W1&#45;&#45;AUTOGENERATED_S_3 -->
<g id="edge8" class="edge">
<title>W1:e&#45;&#45;AUTOGENERATED_S_3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-97C470.79,-98.28 483.47,-65.28 551,-64"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M407,-99C472.66,-99 485.34,-66 551,-66"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M407,-101C474.53,-99.72 487.21,-66.72 551,-68"/>
</g>
<!-- W2&#45;&#45;AUTOGENERATED_S_4 -->
<g id="edge10" class="edge">
<title>W2:e&#45;&#45;AUTOGENERATED_S_4:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-183C934.87,-184.55 945.03,-228.55 1010,-227"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M866,-185C932.92,-185 943.08,-229 1010,-229"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-187C930.97,-185.45 941.13,-229.45 1010,-231"/>
</g>
<!-- W2&#45;&#45;AUTOGENERATED_S_5 -->
<g id="edge12" class="edge">
<title>W2:e&#45;&#45;AUTOGENERATED_S_5:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-158C932.41,-158.9 946.93,-180.9 1010,-180"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M866,-160C930.74,-160 945.26,-182 1010,-182"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-162C929.07,-161.1 943.59,-183.1 1010,-184"/>
</g>
<!-- W2&#45;&#45;AUTOGENERATED_S_6 -->
<g id="edge14" class="edge">
<title>W2:e&#45;&#45;AUTOGENERATED_S_6:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-133C930,-133 946,-133 1010,-133"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M866,-135C930,-135 946,-135 1010,-135"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-137C930,-137 946,-137 1010,-137"/>
</g>
<!-- W2&#45;&#45;AUTOGENERATED_S_7 -->
<g id="edge16" class="edge">
<title>W2:e&#45;&#45;AUTOGENERATED_S_7:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-108C929.07,-108.9 943.59,-86.9 1010,-86"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M866,-110C930.74,-110 945.26,-88 1010,-88"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M866,-112C932.41,-111.1 946.93,-89.1 1010,-90"/>
</g>
<!-- W21&#45;&#45;X2 -->
<g id="edge18" class="edge">
<title>W21:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-205C1431.64,-205.03 1447.62,-202.03 1512,-202"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M1368,-207C1432.01,-207 1447.99,-204 1512,-204"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-209C1432.38,-208.97 1448.36,-205.97 1512,-206"/>
</g>
<!-- W21&#45;&#45;X2 -->
<g id="edge20" class="edge">
<title>W21:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-180C1431.76,-180.02 1447.75,-178.02 1512,-178"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M1368,-182C1432.01,-182 1447.99,-180 1512,-180"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-184C1432.25,-183.98 1448.24,-181.98 1512,-182"/>
</g>
<!-- W21&#45;&#45;X2 -->
<g id="edge22" class="edge">
<title>W21:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-155C1432,-155 1448,-155 1512,-155"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M1368,-157C1432,-157 1448,-157 1512,-157"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-159C1432,-159 1448,-159 1512,-159"/>
</g>
<!-- W21&#45;&#45;X2 -->
<g id="edge24" class="edge">
<title>W21:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-130C1432.25,-130.02 1448.24,-132.02 1512,-132"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M1368,-132C1432.01,-132 1447.99,-134 1512,-134"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1368,-134C1431.76,-133.98 1447.75,-135.98 1512,-136"/>
</g>
<!-- W3&#45;&#45;AUTOGENERATED_F_1 -->
<g id="edge26" class="edge">
<title>W3:e&#45;&#45;AUTOGENERATED_F_1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-204C2274.96,-204.52 2290.35,-190.52 2356,-190"/>
<path fill="none" stroke="#ffffff" stroke-width="2" d="M2212,-206C2276.3,-206 2291.7,-192 2356,-192"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-208C2277.65,-207.48 2293.04,-193.48 2356,-194"/>
</g>
<!-- W3&#45;&#45;AUTOGENERATED_F_2 -->
<g id="edge28" class="edge">
<title>W3:e&#45;&#45;AUTOGENERATED_F_2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-179C2282.99,-180.79 2288.99,-238.79 2356,-237"/>
<path fill="none" stroke="#895956" stroke-width="2" d="M2212,-181C2281,-181 2287,-239 2356,-239"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-183C2279.01,-181.21 2285.01,-239.21 2356,-241"/>
</g>
<!-- W3&#45;&#45;AUTOGENERATED_F_3 -->
<g id="edge30" class="edge">
<title>W3:e&#45;&#45;AUTOGENERATED_F_3:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-154C2279.01,-155.79 2285.01,-97.79 2356,-96"/>
<path fill="none" stroke="#00ff00" stroke-width="2" d="M2212,-156C2281,-156 2287,-98 2356,-98"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-158C2282.99,-156.21 2288.99,-98.21 2356,-100"/>
</g>
<!-- W3&#45;&#45;AUTOGENERATED_F_4 -->
<g id="edge32" class="edge">
<title>W3:e&#45;&#45;AUTOGENERATED_F_4:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-129C2277.65,-129.52 2293.04,-143.52 2356,-143"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M2212,-131C2276.3,-131 2291.7,-145 2356,-145"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M2212,-133C2274.96,-132.48 2290.35,-146.48 2356,-147"/>
</g>
<!-- AUTOGENERATED_WIRE_1&#45;&#45;X2 -->
<g id="edge34" class="edge">
<title>AUTOGENERATED_WIRE_1:e&#45;&#45;X2:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M1367,-20C1450.41,-22.31 1432.54,-134.31 1512,-132"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1367,-22C1448.43,-22 1430.57,-134 1512,-134"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M1367,-24C1446.46,-21.69 1428.59,-133.69 1512,-136"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 49 KiB

View File

@ -60,3 +60,27 @@
[Source](ex10.yml) - [Bill of Materials](ex10.bom.tsv) [Source](ex10.yml) - [Bill of Materials](ex10.bom.tsv)
## Example 11
![](ex11.png)
[Source](ex11.yml) - [Bill of Materials](ex11.bom.tsv)
## Example 12
![](ex12.png)
[Source](ex12.yml) - [Bill of Materials](ex12.bom.tsv)
## Example 13
![](ex13.png)
[Source](ex13.yml) - [Bill of Materials](ex13.bom.tsv)
## Example 14
![](ex14.png)
[Source](ex14.yml) - [Bill of Materials](ex14.bom.tsv)

View File

@ -3,3 +3,4 @@ graphviz
pillow pillow
pyyaml pyyaml
setuptools setuptools
tabulate

View File

@ -15,13 +15,14 @@ setup(
author="Daniel Rojas", author="Daniel Rojas",
# author_email='', # author_email='',
description="Easily document cables and wiring harnesses", description="Easily document cables and wiring harnesses",
long_description=open(README_PATH).read(), long_description=README_PATH.read_text(),
long_description_content_type="text/markdown", long_description_content_type="text/markdown",
install_requires=[ install_requires=[
"click", "click",
"pyyaml",
"pillow",
"graphviz", "graphviz",
"pillow",
"pyyaml",
"tabulate",
], ],
license="GPLv3", license="GPLv3",
keywords="cable connector hardware harness wiring wiring-diagram wiring-harness", keywords="cable connector hardware harness wiring wiring-diagram wiring-harness",
@ -37,8 +38,9 @@ setup(
"Development Status :: 4 - Beta", "Development Status :: 4 - Beta",
"Environment :: Console", "Environment :: Console",
"Programming Language :: Python :: 3", "Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Topic :: Utilities", "Topic :: Utilities",
"License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
], ],

View File

@ -1,433 +0,0 @@
# -*- coding: utf-8 -*-
from dataclasses import InitVar, dataclass, field
from enum import Enum, auto
from pathlib import Path
from typing import Dict, List, Optional, Tuple, Union
from wireviz.wv_colors import COLOR_CODES, Color, ColorMode, Colors, ColorScheme
from wireviz.wv_helper import aspect_ratio, int2tuple
# Each type alias have their legal values described in comments - validation might be implemented in the future
PlainText = str # Text not containing HTML tags nor newlines
Hypertext = str # Text possibly including HTML hyperlinks that are removed in all outputs except HTML output
MultilineHypertext = (
str # Hypertext possibly also including newlines to break lines in diagram output
)
Designator = PlainText # Case insensitive unique name of connector or cable
# Literal type aliases below are commented to avoid requiring python 3.8
ConnectorMultiplier = PlainText # = Literal['pincount', 'populated']
CableMultiplier = (
PlainText # = Literal['wirecount', 'terminations', 'length', 'total_length']
)
ImageScale = PlainText # = Literal['false', 'true', 'width', 'height', 'both']
# Type combinations
Pin = Union[int, PlainText] # Pin identifier
PinIndex = int # Zero-based pin index
Wire = Union[int, PlainText] # Wire number or Literal['s'] for shield
NoneOrMorePins = Union[
Pin, Tuple[Pin, ...], None
] # None, one, or a tuple of pin identifiers
NoneOrMorePinIndices = Union[
PinIndex, Tuple[PinIndex, ...], None
] # None, one, or a tuple of zero-based pin indices
OneOrMoreWires = Union[Wire, Tuple[Wire, ...]] # One or a tuple of wires
# Metadata can contain whatever is needed by the HTML generation/template.
MetadataKeys = PlainText # Literal['title', 'description', 'notes', ...]
Side = Enum("Side", "LEFT RIGHT")
class Metadata(dict):
pass
@dataclass
class Options:
fontname: PlainText = "arial"
bgcolor: Color = "WH"
bgcolor_node: Optional[Color] = "WH"
bgcolor_connector: Optional[Color] = None
bgcolor_cable: Optional[Color] = None
bgcolor_bundle: Optional[Color] = None
color_mode: ColorMode = "SHORT"
mini_bom_mode: bool = True
template_separator: str = "."
def __post_init__(self):
if not self.bgcolor_node:
self.bgcolor_node = self.bgcolor
if not self.bgcolor_connector:
self.bgcolor_connector = self.bgcolor_node
if not self.bgcolor_cable:
self.bgcolor_cable = self.bgcolor_node
if not self.bgcolor_bundle:
self.bgcolor_bundle = self.bgcolor_cable
@dataclass
class Tweak:
override: Optional[Dict[Designator, Dict[str, Optional[str]]]] = None
append: Union[str, List[str], None] = None
@dataclass
class Image:
# Attributes of the image object <img>:
src: str
scale: Optional[ImageScale] = None
# Attributes of the image cell <td> containing the image:
width: Optional[int] = None
height: Optional[int] = None
fixedsize: Optional[bool] = None
bgcolor: Optional[Color] = None
# Contents of the text cell <td> just below the image cell:
caption: Optional[MultilineHypertext] = None
# See also HTML doc at https://graphviz.org/doc/info/shapes.html#html
def __post_init__(self):
if self.fixedsize is None:
# Default True if any dimension specified unless self.scale also is specified.
self.fixedsize = (self.width or self.height) and self.scale is None
if self.scale is None:
if not self.width and not self.height:
self.scale = "false"
elif self.width and self.height:
self.scale = "both"
else:
self.scale = "true" # When only one dimension is specified.
if self.fixedsize:
# If only one dimension is specified, compute the other
# because Graphviz requires both when fixedsize=True.
if self.height:
if not self.width:
self.width = self.height * aspect_ratio(self.src)
else:
if self.width:
self.height = self.width / aspect_ratio(self.src)
@dataclass
class AdditionalComponent:
type: MultilineHypertext
subtype: Optional[MultilineHypertext] = None
manufacturer: Optional[MultilineHypertext] = None
mpn: Optional[MultilineHypertext] = None
supplier: Optional[MultilineHypertext] = None
spn: Optional[MultilineHypertext] = None
pn: Optional[Hypertext] = None
qty: float = 1
unit: Optional[str] = None
qty_multiplier: Union[ConnectorMultiplier, CableMultiplier, None] = None
bgcolor: Optional[Color] = None
@property
def description(self) -> str:
s = self.type.rstrip() + f", {self.subtype.rstrip()}" if self.subtype else ""
return s
@dataclass
class Connector:
name: Designator
bgcolor: Optional[Color] = None
bgcolor_title: Optional[Color] = None
manufacturer: Optional[MultilineHypertext] = None
mpn: Optional[MultilineHypertext] = None
supplier: Optional[MultilineHypertext] = None
spn: Optional[MultilineHypertext] = None
pn: Optional[Hypertext] = None
style: Optional[str] = None
category: Optional[str] = None
type: Optional[MultilineHypertext] = None
subtype: Optional[MultilineHypertext] = None
pincount: Optional[int] = None
image: Optional[Image] = None
notes: Optional[MultilineHypertext] = None
pins: List[Pin] = field(default_factory=list)
pinlabels: List[Pin] = field(default_factory=list)
pincolors: List[Color] = field(default_factory=list)
color: Optional[Color] = None
show_name: Optional[bool] = None
show_pincount: Optional[bool] = None
hide_disconnected_pins: bool = False
loops: List[List[Pin]] = field(default_factory=list)
ignore_in_bom: bool = False
additional_components: List[AdditionalComponent] = field(default_factory=list)
def __post_init__(self) -> None:
if isinstance(self.image, dict):
self.image = Image(**self.image)
self.ports_left = False
self.ports_right = False
self.visible_pins = {}
if self.style == "simple":
if self.pincount and self.pincount > 1:
raise Exception(
"Connectors with style set to simple may only have one pin"
)
self.pincount = 1
if not self.pincount:
self.pincount = max(
len(self.pins), len(self.pinlabels), len(self.pincolors)
)
if not self.pincount:
raise Exception(
"You need to specify at least one, pincount, pins, pinlabels, or pincolors"
)
# create default list for pins (sequential) if not specified
if not self.pins:
self.pins = list(range(1, self.pincount + 1))
if len(self.pins) != len(set(self.pins)):
raise Exception("Pins are not unique")
if self.show_name is None:
# hide designators for simple and for auto-generated connectors by default
self.show_name = self.style != "simple" and self.name[0:2] != "__"
if self.show_pincount is None:
# hide pincount for simple (1 pin) connectors by default
self.show_pincount = self.style != "simple"
for loop in self.loops:
# TODO: allow using pin labels in addition to pin numbers, just like when defining regular connections
# TODO: include properties of wire used to create the loop
if len(loop) != 2:
raise Exception("Loops must be between exactly two pins!")
for pin in loop:
if pin not in self.pins:
raise Exception(f'Unknown loop pin "{pin}" for connector "{self.name}"!')
# Make sure loop connected pins are not hidden.
self.activate_pin(pin)
for i, item in enumerate(self.additional_components):
if isinstance(item, dict):
self.additional_components[i] = AdditionalComponent(**item)
def activate_pin(self, pin: Pin, side: Side) -> None:
self.visible_pins[pin] = True
if side == Side.LEFT:
self.ports_left = True
elif side == Side.RIGHT:
self.ports_right = True
def get_qty_multiplier(self, qty_multiplier: Optional[ConnectorMultiplier]) -> int:
if not qty_multiplier:
return 1
elif qty_multiplier == "pincount":
return self.pincount
elif qty_multiplier == "populated":
return sum(self.visible_pins.values())
else:
raise ValueError(
f"invalid qty multiplier parameter for connector {qty_multiplier}"
)
@dataclass
class Cable:
name: Designator
bgcolor: Optional[Color] = None
bgcolor_title: Optional[Color] = None
manufacturer: Union[MultilineHypertext, List[MultilineHypertext], None] = None
mpn: Union[MultilineHypertext, List[MultilineHypertext], None] = None
supplier: Union[MultilineHypertext, List[MultilineHypertext], None] = None
spn: Union[MultilineHypertext, List[MultilineHypertext], None] = None
pn: Union[Hypertext, List[Hypertext], None] = None
category: Optional[str] = None
type: Optional[MultilineHypertext] = None
gauge: Optional[float] = None
gauge_unit: Optional[str] = None
show_equiv: bool = False
length: float = 0
length_unit: Optional[str] = None
color: Optional[Color] = None
wirecount: Optional[int] = None
shield: Union[bool, Color] = False
image: Optional[Image] = None
notes: Optional[MultilineHypertext] = None
colors: List[Colors] = field(default_factory=list)
wirelabels: List[Wire] = field(default_factory=list)
color_code: Optional[ColorScheme] = None
show_name: Optional[bool] = None
show_wirecount: bool = True
show_wirenumbers: Optional[bool] = None
ignore_in_bom: bool = False
additional_components: List[AdditionalComponent] = field(default_factory=list)
def __post_init__(self) -> None:
if isinstance(self.image, dict):
self.image = Image(**self.image)
if isinstance(self.gauge, str): # gauge and unit specified
try:
g, u = self.gauge.split(" ")
except Exception:
raise Exception(
f"Cable {self.name} gauge={self.gauge} - Gauge must be a number, or number and unit separated by a space"
)
self.gauge = g
if self.gauge_unit is not None:
print(
f"Warning: Cable {self.name} gauge_unit={self.gauge_unit} is ignored because its gauge contains {u}"
)
if u.upper() == "AWG":
self.gauge_unit = u.upper()
else:
self.gauge_unit = u.replace("mm2", "mm\u00B2")
elif self.gauge is not None: # gauge specified, assume mm2
if self.gauge_unit is None:
self.gauge_unit = "mm\u00B2"
else:
pass # gauge not specified
if isinstance(self.length, str): # length and unit specified
try:
L, u = self.length.split(" ")
L = float(L)
except Exception:
raise Exception(
f"Cable {self.name} length={self.length} - Length must be a number, or number and unit separated by a space"
)
self.length = L
if self.length_unit is not None:
print(
f"Warning: Cable {self.name} length_unit={self.length_unit} is ignored because its length contains {u}"
)
self.length_unit = u
elif not any(isinstance(self.length, t) for t in [int, float]):
raise Exception(f"Cable {self.name} length has a non-numeric value")
elif self.length_unit is None:
self.length_unit = "m"
self.connections = []
if self.wirecount: # number of wires explicitly defined
if self.colors: # use custom color palette (partly or looped if needed)
pass
elif self.color_code:
# use standard color palette (partly or looped if needed)
if self.color_code not in COLOR_CODES:
raise Exception("Unknown color code")
self.colors = COLOR_CODES[self.color_code]
else: # no colors defined, add dummy colors
self.colors = [""] * self.wirecount
# make color code loop around if more wires than colors
if self.wirecount > len(self.colors):
m = self.wirecount // len(self.colors) + 1
self.colors = self.colors * int(m)
# cut off excess after looping
self.colors = self.colors[: self.wirecount]
else: # wirecount implicit in length of color list
if not self.colors:
raise Exception(
"Unknown number of wires. Must specify wirecount or colors (implicit length)"
)
self.wirecount = len(self.colors)
if self.wirelabels:
if self.shield and "s" in self.wirelabels:
raise Exception(
'"s" may not be used as a wire label for a shielded cable.'
)
# if lists of part numbers are provided check this is a bundle and that it matches the wirecount.
for idfield in [self.manufacturer, self.mpn, self.supplier, self.spn, self.pn]:
if isinstance(idfield, list):
if self.category == "bundle":
# check the length
if len(idfield) != self.wirecount:
raise Exception("lists of part data must match wirecount")
else:
raise Exception("lists of part data are only supported for bundles")
if self.show_name is None:
# hide designators for auto-generated cables by default
self.show_name = self.name[0:2] != "__"
if self.show_wirenumbers is None:
# by default, show wire numbers for cables, hide for bundles
self.show_wirenumbers = self.category != "bundle"
for i, item in enumerate(self.additional_components):
if isinstance(item, dict):
self.additional_components[i] = AdditionalComponent(**item)
# The *_pin arguments accept a tuple, but it seems not in use with the current code.
def connect(
self,
from_name: Optional[Designator],
from_pin: NoneOrMorePinIndices,
via_wire: OneOrMoreWires,
to_name: Optional[Designator],
to_pin: NoneOrMorePinIndices,
) -> None:
from_pin = int2tuple(from_pin)
via_wire = int2tuple(via_wire)
to_pin = int2tuple(to_pin)
if len(from_pin) != len(to_pin):
raise Exception("from_pin must have the same number of elements as to_pin")
for i, _ in enumerate(from_pin):
self.connections.append(
Connection(from_name, from_pin[i], via_wire[i], to_name, to_pin[i])
)
def get_qty_multiplier(self, qty_multiplier: Optional[CableMultiplier]) -> float:
if not qty_multiplier:
return 1
elif qty_multiplier == "wirecount":
return self.wirecount
elif qty_multiplier == "terminations":
return len(self.connections)
elif qty_multiplier == "length":
return self.length
elif qty_multiplier == "total_length":
return self.length * self.wirecount
else:
raise ValueError(
f"invalid qty multiplier parameter for cable {qty_multiplier}"
)
@dataclass
class Connection:
from_name: Optional[Designator]
from_pin: Optional[Pin]
via_port: Wire
to_name: Optional[Designator]
to_pin: Optional[Pin]
@dataclass
class MatePin:
from_name: Designator
from_pin: Pin
to_name: Designator
to_pin: Pin
shape: str
@dataclass
class MateComponent:
from_name: Designator
to_name: Designator
shape: str

View File

@ -1,706 +0,0 @@
# -*- coding: utf-8 -*-
import re
from collections import Counter
from dataclasses import dataclass
from itertools import zip_longest
from pathlib import Path
from typing import Any, List, Union
from graphviz import Graph
from wireviz import APP_NAME, APP_URL, __version__, wv_colors
from wireviz.DataClasses import (
Cable,
Connector,
MateComponent,
MatePin,
Metadata,
Options,
Tweak,
Side,
)
from wireviz.svgembed import embed_svg_images_file
from wireviz.wv_bom import (
HEADER_MPN,
HEADER_PN,
HEADER_SPN,
bom_list,
component_table_entry,
generate_bom,
get_additional_component_table,
pn_info_string,
)
from wireviz.wv_colors import get_color_hex, translate_color
from wireviz.wv_gv_html import (
html_bgcolor,
html_bgcolor_attr,
html_caption,
html_colorbar,
html_image,
html_line_breaks,
nested_html_table,
remove_links,
)
from wireviz.wv_helper import (
awg_equiv,
flatten2d,
is_arrow,
mm2_equiv,
open_file_read,
open_file_write,
tuplelist2tsv,
)
from wireviz.wv_html import generate_html_output
@dataclass
class Harness:
metadata: Metadata
options: Options
tweak: Tweak
def __post_init__(self):
self.connectors = {}
self.cables = {}
self.mates = []
self._bom = [] # Internal Cache for generated bom
self.additional_bom_items = []
def add_connector(self, name: str, *args, **kwargs) -> None:
self.connectors[name] = Connector(name, *args, **kwargs)
def add_cable(self, name: str, *args, **kwargs) -> None:
self.cables[name] = Cable(name, *args, **kwargs)
def add_mate_pin(self, from_name, from_pin, to_name, to_pin, arrow_type) -> None:
self.mates.append(MatePin(from_name, from_pin, to_name, to_pin, arrow_type))
self.connectors[from_name].activate_pin(from_pin, Side.RIGHT)
self.connectors[to_name].activate_pin(to_pin, Side.LEFT)
def add_mate_component(self, from_name, to_name, arrow_type) -> None:
self.mates.append(MateComponent(from_name, to_name, arrow_type))
def add_bom_item(self, item: dict) -> None:
self.additional_bom_items.append(item)
def connect(
self,
from_name: str,
from_pin: (int, str),
via_name: str,
via_wire: (int, str),
to_name: str,
to_pin: (int, str),
) -> None:
# check from and to connectors
for (name, pin) in zip([from_name, to_name], [from_pin, to_pin]):
if name is not None and name in self.connectors:
connector = self.connectors[name]
# check if provided name is ambiguous
if pin in connector.pins and pin in connector.pinlabels:
if connector.pins.index(pin) != connector.pinlabels.index(pin):
raise Exception(
f"{name}:{pin} is defined both in pinlabels and pins, for different pins."
)
# TODO: Maybe issue a warning if present in both lists but referencing the same pin?
if pin in connector.pinlabels:
if connector.pinlabels.count(pin) > 1:
raise Exception(f"{name}:{pin} is defined more than once.")
index = connector.pinlabels.index(pin)
pin = connector.pins[index] # map pin name to pin number
if name == from_name:
from_pin = pin
if name == to_name:
to_pin = pin
if not pin in connector.pins:
raise Exception(f"{name}:{pin} not found.")
# check via cable
if via_name in self.cables:
cable = self.cables[via_name]
# check if provided name is ambiguous
if via_wire in cable.colors and via_wire in cable.wirelabels:
if cable.colors.index(via_wire) != cable.wirelabels.index(via_wire):
raise Exception(
f"{via_name}:{via_wire} is defined both in colors and wirelabels, for different wires."
)
# TODO: Maybe issue a warning if present in both lists but referencing the same wire?
if via_wire in cable.colors:
if cable.colors.count(via_wire) > 1:
raise Exception(
f"{via_name}:{via_wire} is used for more than one wire."
)
# list index starts at 0, wire IDs start at 1
via_wire = cable.colors.index(via_wire) + 1
elif via_wire in cable.wirelabels:
if cable.wirelabels.count(via_wire) > 1:
raise Exception(
f"{via_name}:{via_wire} is used for more than one wire."
)
via_wire = (
cable.wirelabels.index(via_wire) + 1
) # list index starts at 0, wire IDs start at 1
# perform the actual connection
self.cables[via_name].connect(from_name, from_pin, via_wire, to_name, to_pin)
if from_name in self.connectors:
self.connectors[from_name].activate_pin(from_pin, Side.RIGHT)
if to_name in self.connectors:
self.connectors[to_name].activate_pin(to_pin, Side.LEFT)
def create_graph(self) -> Graph:
dot = Graph()
dot.body.append(f"// Graph generated by {APP_NAME} {__version__}\n")
dot.body.append(f"// {APP_URL}\n")
dot.attr(
"graph",
rankdir="LR",
ranksep="2",
bgcolor=wv_colors.translate_color(self.options.bgcolor, "HEX"),
nodesep="0.33",
fontname=self.options.fontname,
)
dot.attr(
"node",
shape="none",
width="0",
height="0",
margin="0", # Actual size of the node is entirely determined by the label.
style="filled",
fillcolor=wv_colors.translate_color(self.options.bgcolor_node, "HEX"),
fontname=self.options.fontname,
)
dot.attr("edge", style="bold", fontname=self.options.fontname)
for connector in self.connectors.values():
# If no wires connected (except maybe loop wires)?
if not (connector.ports_left or connector.ports_right):
connector.ports_left = True # Use left side pins.
html = []
# fmt: off
rows = [[f'{html_bgcolor(connector.bgcolor_title)}{remove_links(connector.name)}'
if connector.show_name else None],
[pn_info_string(HEADER_PN, None, remove_links(connector.pn)),
html_line_breaks(pn_info_string(HEADER_MPN, connector.manufacturer, connector.mpn)),
html_line_breaks(pn_info_string(HEADER_SPN, connector.supplier, connector.spn))],
[html_line_breaks(connector.type),
html_line_breaks(connector.subtype),
f'{connector.pincount}-pin' if connector.show_pincount else None,
translate_color(connector.color, self.options.color_mode) if connector.color else None,
html_colorbar(connector.color)],
'<!-- connector table -->' if connector.style != 'simple' else None,
[html_image(connector.image)],
[html_caption(connector.image)]]
# fmt: on
rows.extend(get_additional_component_table(self, connector))
rows.append([html_line_breaks(connector.notes)])
html.extend(nested_html_table(rows, html_bgcolor_attr(connector.bgcolor)))
if connector.style != "simple":
pinhtml = []
pinhtml.append(
'<table border="0" cellspacing="0" cellpadding="3" cellborder="1">'
)
for pinindex, (pinname, pinlabel, pincolor) in enumerate(
zip_longest(
connector.pins, connector.pinlabels, connector.pincolors
)
):
if (
connector.hide_disconnected_pins
and not connector.visible_pins.get(pinname, False)
):
continue
pinhtml.append(" <tr>")
if connector.ports_left:
pinhtml.append(f' <td port="p{pinindex+1}l">{pinname}</td>')
if pinlabel:
pinhtml.append(f" <td>{pinlabel}</td>")
if connector.pincolors:
if pincolor in wv_colors._color_hex.keys():
# fmt: off
pinhtml.append(f' <td sides="tbl">{translate_color(pincolor, self.options.color_mode)}</td>')
pinhtml.append( ' <td sides="tbr">')
pinhtml.append( ' <table border="0" cellborder="1"><tr>')
pinhtml.append(f' <td bgcolor="{wv_colors.translate_color(pincolor, "HEX")}" width="8" height="8" fixedsize="true"></td>')
pinhtml.append( ' </tr></table>')
pinhtml.append( ' </td>')
# fmt: on
else:
pinhtml.append(' <td colspan="2"></td>')
if connector.ports_right:
pinhtml.append(f' <td port="p{pinindex+1}r">{pinname}</td>')
pinhtml.append(" </tr>")
pinhtml.append(" </table>")
html = [
row.replace("<!-- connector table -->", "\n".join(pinhtml))
for row in html
]
html = "\n".join(html)
dot.node(
connector.name,
label=f"<\n{html}\n>",
shape="box",
style="filled",
fillcolor=translate_color(self.options.bgcolor_connector, "HEX"),
)
if len(connector.loops) > 0:
dot.attr("edge", color="#000000:#ffffff:#000000")
if connector.ports_left:
loop_side = "l"
loop_dir = "w"
elif connector.ports_right:
loop_side = "r"
loop_dir = "e"
else:
raise Exception("No side for loops")
for loop in connector.loops:
dot.edge(
f"{connector.name}:p{loop[0]}{loop_side}:{loop_dir}",
f"{connector.name}:p{loop[1]}{loop_side}:{loop_dir}",
)
# determine if there are double- or triple-colored wires in the harness;
# if so, pad single-color wires to make all wires of equal thickness
pad = any(
len(colorstr) > 2
for cable in self.cables.values()
for colorstr in cable.colors
)
for cable in self.cables.values():
html = []
awg_fmt = ""
if cable.show_equiv:
# Only convert units we actually know about, i.e. currently
# mm2 and awg --- other units _are_ technically allowed,
# and passed through as-is.
if cable.gauge_unit == "mm\u00B2":
awg_fmt = f" ({awg_equiv(cable.gauge)} AWG)"
elif cable.gauge_unit.upper() == "AWG":
awg_fmt = f" ({mm2_equiv(cable.gauge)} mm\u00B2)"
# fmt: off
rows = [[f'{html_bgcolor(cable.bgcolor_title)}{remove_links(cable.name)}'
if cable.show_name else None],
[pn_info_string(HEADER_PN, None,
remove_links(cable.pn)) if not isinstance(cable.pn, list) else None,
html_line_breaks(pn_info_string(HEADER_MPN,
cable.manufacturer if not isinstance(cable.manufacturer, list) else None,
cable.mpn if not isinstance(cable.mpn, list) else None)),
html_line_breaks(pn_info_string(HEADER_SPN,
cable.supplier if not isinstance(cable.supplier, list) else None,
cable.spn if not isinstance(cable.spn, list) else None))],
[html_line_breaks(cable.type),
f'{cable.wirecount}x' if cable.show_wirecount else None,
f'{cable.gauge} {cable.gauge_unit}{awg_fmt}' if cable.gauge else None,
'+ S' if cable.shield else None,
f'{cable.length} {cable.length_unit}' if cable.length > 0 else None,
translate_color(cable.color, self.options.color_mode) if cable.color else None,
html_colorbar(cable.color)],
'<!-- wire table -->',
[html_image(cable.image)],
[html_caption(cable.image)]]
# fmt: on
rows.extend(get_additional_component_table(self, cable))
rows.append([html_line_breaks(cable.notes)])
html.extend(nested_html_table(rows, html_bgcolor_attr(cable.bgcolor)))
wirehtml = []
# conductor table
wirehtml.append('<table border="0" cellspacing="0" cellborder="0">')
wirehtml.append(" <tr><td>&nbsp;</td></tr>")
for i, (connection_color, wirelabel) in enumerate(
zip_longest(cable.colors, cable.wirelabels), 1
):
wirehtml.append(" <tr>")
wirehtml.append(f" <td><!-- {i}_in --></td>")
wirehtml.append(f" <td>")
wireinfo = []
if cable.show_wirenumbers:
wireinfo.append(str(i))
colorstr = wv_colors.translate_color(
connection_color, self.options.color_mode
)
if colorstr:
wireinfo.append(colorstr)
if cable.wirelabels:
wireinfo.append(wirelabel if wirelabel is not None else "")
wirehtml.append(f' {":".join(wireinfo)}')
wirehtml.append(f" </td>")
wirehtml.append(f" <td><!-- {i}_out --></td>")
wirehtml.append(" </tr>")
# fmt: off
bgcolors = ['#000000'] + get_color_hex(connection_color, pad=pad) + ['#000000']
wirehtml.append(f" <tr>")
wirehtml.append(f' <td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w{i}" height="{(2 * len(bgcolors))}">')
wirehtml.append(' <table cellspacing="0" cellborder="0" border="0">')
for j, bgcolor in enumerate(bgcolors[::-1]): # Reverse to match the curved wires when more than 2 colors
wirehtml.append(f' <tr><td colspan="3" cellpadding="0" height="2" bgcolor="{bgcolor if bgcolor != "" else wv_colors.default_color}" border="0"></td></tr>')
wirehtml.append(" </table>")
wirehtml.append(" </td>")
wirehtml.append(" </tr>")
# fmt: on
# for bundles, individual wires can have part information
if cable.category == "bundle":
# create a list of wire parameters
wireidentification = []
if isinstance(cable.pn, list):
wireidentification.append(
pn_info_string(
HEADER_PN, None, remove_links(cable.pn[i - 1])
)
)
manufacturer_info = pn_info_string(
HEADER_MPN,
cable.manufacturer[i - 1]
if isinstance(cable.manufacturer, list)
else None,
cable.mpn[i - 1] if isinstance(cable.mpn, list) else None,
)
supplier_info = pn_info_string(
HEADER_SPN,
cable.supplier[i - 1]
if isinstance(cable.supplier, list)
else None,
cable.spn[i - 1] if isinstance(cable.spn, list) else None,
)
if manufacturer_info:
wireidentification.append(html_line_breaks(manufacturer_info))
if supplier_info:
wireidentification.append(html_line_breaks(supplier_info))
# print parameters into a table row under the wire
if len(wireidentification) > 0:
# fmt: off
wirehtml.append(' <tr><td colspan="3">')
wirehtml.append(' <table border="0" cellspacing="0" cellborder="0"><tr>')
for attrib in wireidentification:
wirehtml.append(f" <td>{attrib}</td>")
wirehtml.append(" </tr></table>")
wirehtml.append(" </td></tr>")
# fmt: on
if cable.shield:
wirehtml.append(" <tr><td>&nbsp;</td></tr>") # spacer
wirehtml.append(" <tr>")
wirehtml.append(" <td><!-- s_in --></td>")
wirehtml.append(" <td>Shield</td>")
wirehtml.append(" <td><!-- s_out --></td>")
wirehtml.append(" </tr>")
if isinstance(cable.shield, str):
# shield is shown with specified color and black borders
shield_color_hex = wv_colors.get_color_hex(cable.shield)[0]
attributes = (
f'height="6" bgcolor="{shield_color_hex}" border="2" sides="tb"'
)
else:
# shield is shown as a thin black wire
attributes = f'height="2" bgcolor="#000000" border="0"'
# fmt: off
wirehtml.append(f' <tr><td colspan="3" cellpadding="0" {attributes} port="ws"></td></tr>')
# fmt: on
wirehtml.append(" <tr><td>&nbsp;</td></tr>")
wirehtml.append(" </table>")
html = [
row.replace("<!-- wire table -->", "\n".join(wirehtml)) for row in html
]
# connections
for connection in cable.connections:
if isinstance(connection.via_port, int):
# check if it's an actual wire and not a shield
dot.attr(
"edge",
color=":".join(
["#000000"]
+ wv_colors.get_color_hex(
cable.colors[connection.via_port - 1], pad=pad
)
+ ["#000000"]
),
)
else: # it's a shield connection
# shield is shown with specified color and black borders, or as a thin black wire otherwise
dot.attr(
"edge",
color=":".join(["#000000", shield_color_hex, "#000000"])
if isinstance(cable.shield, str)
else "#000000",
)
if connection.from_pin is not None: # connect to left
from_connector = self.connectors[connection.from_name]
from_pin_index = from_connector.pins.index(connection.from_pin)
from_port_str = (
f":p{from_pin_index+1}r"
if from_connector.style != "simple"
else ""
)
code_left_1 = f"{connection.from_name}{from_port_str}:e"
code_left_2 = f"{cable.name}:w{connection.via_port}:w"
dot.edge(code_left_1, code_left_2)
if from_connector.show_name:
from_info = [
str(connection.from_name),
str(connection.from_pin),
]
if from_connector.pinlabels:
pinlabel = from_connector.pinlabels[from_pin_index]
if pinlabel != "":
from_info.append(pinlabel)
from_string = ":".join(from_info)
else:
from_string = ""
html = [
row.replace(f"<!-- {connection.via_port}_in -->", from_string)
for row in html
]
if connection.to_pin is not None: # connect to right
to_connector = self.connectors[connection.to_name]
to_pin_index = to_connector.pins.index(connection.to_pin)
to_port_str = (
f":p{to_pin_index+1}l" if to_connector.style != "simple" else ""
)
code_right_1 = f"{cable.name}:w{connection.via_port}:e"
code_right_2 = f"{connection.to_name}{to_port_str}:w"
dot.edge(code_right_1, code_right_2)
if to_connector.show_name:
to_info = [str(connection.to_name), str(connection.to_pin)]
if to_connector.pinlabels:
pinlabel = to_connector.pinlabels[to_pin_index]
if pinlabel != "":
to_info.append(pinlabel)
to_string = ":".join(to_info)
else:
to_string = ""
html = [
row.replace(f"<!-- {connection.via_port}_out -->", to_string)
for row in html
]
style, bgcolor = (
("filled,dashed", self.options.bgcolor_bundle)
if cable.category == "bundle"
else ("filled", self.options.bgcolor_cable)
)
html = "\n".join(html)
dot.node(
cable.name,
label=f"<\n{html}\n>",
shape="box",
style=style,
fillcolor=translate_color(bgcolor, "HEX"),
)
def typecheck(name: str, value: Any, expect: type) -> None:
if not isinstance(value, expect):
raise Exception(
f"Unexpected value type of {name}: Expected {expect}, got {type(value)}\n{value}"
)
# TODO?: Differ between override attributes and HTML?
if self.tweak.override is not None:
typecheck("tweak.override", self.tweak.override, dict)
for k, d in self.tweak.override.items():
typecheck(f"tweak.override.{k} key", k, str)
typecheck(f"tweak.override.{k} value", d, dict)
for a, v in d.items():
typecheck(f"tweak.override.{k}.{a} key", a, str)
typecheck(f"tweak.override.{k}.{a} value", v, (str, type(None)))
# Override generated attributes of selected entries matching tweak.override.
for i, entry in enumerate(dot.body):
if isinstance(entry, str):
# Find a possibly quoted keyword after leading TAB(s) and followed by [ ].
match = re.match(
r'^\t*(")?((?(1)[^"]|[^ "])+)(?(1)") \[.*\]$', entry, re.S
)
keyword = match and match[2]
if keyword in self.tweak.override.keys():
for attr, value in self.tweak.override[keyword].items():
if value is None:
entry, n_subs = re.subn(
f'( +)?{attr}=("[^"]*"|[^] ]*)(?(1)| *)', "", entry
)
if n_subs < 1:
print(
f"Harness.create_graph() warning: {attr} not found in {keyword}!"
)
elif n_subs > 1:
print(
f"Harness.create_graph() warning: {attr} removed {n_subs} times in {keyword}!"
)
continue
if len(value) == 0 or " " in value:
value = value.replace('"', r"\"")
value = f'"{value}"'
entry, n_subs = re.subn(
f'{attr}=("[^"]*"|[^] ]*)', f"{attr}={value}", entry
)
if n_subs < 1:
# If attr not found, then append it
entry = re.sub(r"\]$", f" {attr}={value}]", entry)
elif n_subs > 1:
print(
f"Harness.create_graph() warning: {attr} overridden {n_subs} times in {keyword}!"
)
dot.body[i] = entry
if self.tweak.append is not None:
if isinstance(self.tweak.append, list):
for i, element in enumerate(self.tweak.append, 1):
typecheck(f"tweak.append[{i}]", element, str)
dot.body.extend(self.tweak.append)
else:
typecheck("tweak.append", self.tweak.append, str)
dot.body.append(self.tweak.append)
for mate in self.mates:
if mate.shape[0] == "<" and mate.shape[-1] == ">":
dir = "both"
elif mate.shape[0] == "<":
dir = "back"
elif mate.shape[-1] == ">":
dir = "forward"
else:
dir = "none"
if isinstance(mate, MatePin):
color = "#000000"
elif isinstance(mate, MateComponent):
color = "#000000:#000000"
else:
raise Exception(f"{mate} is an unknown mate")
from_connector = self.connectors[mate.from_name]
if (
isinstance(mate, MatePin)
and self.connectors[mate.from_name].style != "simple"
):
from_pin_index = from_connector.pins.index(mate.from_pin)
from_port_str = f":p{from_pin_index+1}r"
else: # MateComponent or style == 'simple'
from_port_str = ""
if (
isinstance(mate, MatePin)
and self.connectors[mate.to_name].style != "simple"
):
to_pin_index = to_connector.pins.index(mate.to_pin)
to_port_str = (
f":p{to_pin_index+1}l"
if isinstance(mate, MatePin)
and self.connectors[mate.to_name].style != "simple"
else ""
)
else: # MateComponent or style == 'simple'
to_port_str = ""
code_from = f"{mate.from_name}{from_port_str}:e"
to_connector = self.connectors[mate.to_name]
code_to = f"{mate.to_name}{to_port_str}:w"
dot.attr("edge", color=color, style="dashed", dir=dir)
dot.edge(code_from, code_to)
return dot
# cache for the GraphViz Graph object
# do not access directly, use self.graph instead
_graph = None
@property
def graph(self):
if not self._graph: # no cached graph exists, generate one
self._graph = self.create_graph()
return self._graph # return cached graph
@property
def png(self):
from io import BytesIO
graph = self.graph
data = BytesIO()
data.write(graph.pipe(format="png"))
data.seek(0)
return data.read()
@property
def svg(self):
graph = self.graph
return embed_svg_images(graph.pipe(format="svg").decode("utf-8"), Path.cwd())
def output(
self,
filename: (str, Path),
view: bool = False,
cleanup: bool = True,
fmt: tuple = ("html", "png", "svg", "tsv"),
) -> None:
# graphical output
graph = self.graph
svg_already_exists = Path(
f"{filename}.svg"
).exists() # if SVG already exists, do not delete later
# graphical output
for f in fmt:
if f in ("png", "svg", "html"):
if f == "html": # if HTML format is specified,
f = "svg" # generate SVG for embedding into HTML
# SVG file will be renamed/deleted later
_filename = f"{filename}.tmp" if f == "svg" else filename
# TODO: prevent rendering SVG twice when both SVG and HTML are specified
graph.format = f
graph.render(filename=_filename, view=view, cleanup=cleanup)
# embed images into SVG output
if "svg" in fmt or "html" in fmt:
embed_svg_images_file(f"{filename}.tmp.svg")
# GraphViz output
if "gv" in fmt:
graph.save(filename=f"{filename}.gv")
# BOM output
bomlist = bom_list(self.bom())
if "tsv" in fmt:
open_file_write(f"{filename}.bom.tsv").write(tuplelist2tsv(bomlist))
if "csv" in fmt:
# TODO: implement CSV output (preferrably using CSV library)
print("CSV output is not yet supported")
# HTML output
if "html" in fmt:
generate_html_output(filename, bomlist, self.metadata, self.options)
# PDF output
if "pdf" in fmt:
# TODO: implement PDF output
print("PDF output is not yet supported")
# delete SVG if not needed
if "html" in fmt and not "svg" in fmt:
# SVG file was just needed to generate HTML
Path(f"{filename}.tmp.svg").unlink()
elif "svg" in fmt:
Path(f"{filename}.tmp.svg").replace(f"{filename}.svg")
def bom(self):
if not self._bom:
self._bom = generate_bom(self)
return self._bom

View File

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Please don't import anything in this file to avoid issues when it is imported in setup.py # Please don't import anything in this file to avoid issues when it is imported in setup.py
__version__ = "0.4-dev" __version__ = "0.4-dev251"
CMD_NAME = "wireviz" # Lower case command and module name CMD_NAME = "wireviz" # Lower case command and module name
APP_NAME = "WireViz" # Application name in texts meant to be human readable APP_NAME = "WireViz" # Application name in texts meant to be human readable

View File

@ -1,52 +0,0 @@
# -*- coding: utf-8 -*-
import base64
import re
from pathlib import Path
from typing import Union
mime_subtype_replacements = {"jpg": "jpeg", "tif": "tiff"}
def embed_svg_images(svg_in: str, base_path: Union[str, Path] = Path.cwd()) -> str:
images_b64 = {} # cache of base64-encoded images
def image_tag(pre: str, url: str, post: str) -> str:
return f'<image{pre} xlink:href="{url}"{post}>'
def replace(match: re.Match) -> str:
imgurl = match["URL"]
if not imgurl in images_b64: # only encode/cache every unique URL once
imgurl_abs = (Path(base_path) / imgurl).resolve()
image = imgurl_abs.read_bytes()
images_b64[imgurl] = base64.b64encode(image).decode("utf-8")
return image_tag(
match["PRE"] or "",
f"data:image/{get_mime_subtype(imgurl)};base64, {images_b64[imgurl]}",
match["POST"] or "",
)
pattern = re.compile(
image_tag(r"(?P<PRE> [^>]*?)?", r'(?P<URL>[^"]*?)', r"(?P<POST> [^>]*?)?"),
re.IGNORECASE,
)
return pattern.sub(replace, svg_in)
def get_mime_subtype(filename: Union[str, Path]) -> str:
mime_subtype = Path(filename).suffix.lstrip(".").lower()
if mime_subtype in mime_subtype_replacements:
mime_subtype = mime_subtype_replacements[mime_subtype]
return mime_subtype
def embed_svg_images_file(
filename_in: Union[str, Path], overwrite: bool = True
) -> None:
filename_in = Path(filename_in).resolve()
filename_out = filename_in.with_suffix(".b64.svg")
filename_out.write_text(
embed_svg_images(filename_in.read_text(), filename_in.parent)
)
if overwrite:
filename_out.replace(filename_in)

View File

@ -7,13 +7,12 @@ import sys
from pathlib import Path from pathlib import Path
script_path = Path(__file__).absolute() script_path = Path(__file__).absolute()
sys.path.insert(0, str(script_path.parent.parent.parent)) # to find wireviz module
sys.path.insert(0, str(script_path.parent.parent)) # to find wireviz module
from wv_helper import open_file_append, open_file_read, open_file_write
from wireviz import APP_NAME, __version__, wireviz from wireviz import APP_NAME, __version__, wireviz
from wireviz.wv_utils import open_file_append, open_file_read, open_file_write
dir = script_path.parent.parent.parent dir = script_path.parent.parent.parent.parent
readme = "readme.md" readme = "readme.md"
groups = { groups = {
"examples": { "examples": {
@ -32,10 +31,11 @@ groups = {
"path": dir / "examples", "path": dir / "examples",
"prefix": "demo", "prefix": "demo",
}, },
**{p.stem: {"path": p} for p in (dir / "tests").glob("**")},
} }
input_extensions = [".yml"] input_extensions = [".yml"]
extensions_not_containing_graphviz_output = [".gv", ".bom.tsv"] extensions_not_containing_graphviz_output = [".gv", ".tsv"]
extensions_containing_graphviz_output = [".png", ".svg", ".html"] extensions_containing_graphviz_output = [".png", ".svg", ".html"]
generated_extensions = ( generated_extensions = (
extensions_not_containing_graphviz_output + extensions_containing_graphviz_output extensions_not_containing_graphviz_output + extensions_containing_graphviz_output
@ -44,7 +44,7 @@ generated_extensions = (
def collect_filenames(description, groupkey, ext_list): def collect_filenames(description, groupkey, ext_list):
path = groups[groupkey]["path"] path = groups[groupkey]["path"]
patterns = [f"{groups[groupkey]['prefix']}*{ext}" for ext in ext_list] patterns = [f"{groups[groupkey].get('prefix', '')}*{ext}" for ext in ext_list]
if ext_list != input_extensions and readme in groups[groupkey]: if ext_list != input_extensions and readme in groups[groupkey]:
patterns.append(readme) patterns.append(readme)
print(f'{description} {groupkey} in "{path}"') print(f'{description} {groupkey} in "{path}"')
@ -88,7 +88,7 @@ def build_generated(groupkeys):
out.write(f"![]({yaml_file.stem}.png)\n\n") out.write(f"![]({yaml_file.stem}.png)\n\n")
out.write( out.write(
f"[Source]({yaml_file.name}) - [Bill of Materials]({yaml_file.stem}.bom.tsv)\n\n\n" f"[Source]({yaml_file.name}) - [Bill of Materials]({yaml_file.stem}.tsv)\n\n\n"
) )
@ -98,7 +98,7 @@ def clean_generated(groupkeys):
for filename in collect_filenames("Cleaning", key, generated_extensions): for filename in collect_filenames("Cleaning", key, generated_extensions):
if filename.is_file(): if filename.is_file():
print(f' rm "{filename}"') print(f' rm "{filename}"')
Path(filename).unlink() filename.unlink()
def compare_generated(groupkeys, branch="", include_graphviz_output=False): def compare_generated(groupkeys, branch="", include_graphviz_output=False):

View File

@ -10,9 +10,9 @@ import yaml
if __name__ == "__main__": if __name__ == "__main__":
sys.path.insert(0, str(Path(__file__).parent.parent)) # add src/wireviz to PATH sys.path.insert(0, str(Path(__file__).parent.parent)) # add src/wireviz to PATH
from wireviz.DataClasses import Metadata, Options, Tweak from wireviz.wv_dataclasses import AUTOGENERATED_PREFIX, Metadata, Options, Tweak
from wireviz.Harness import Harness from wireviz.wv_harness import Harness
from wireviz.wv_helper import ( from wireviz.wv_utils import (
expand, expand,
get_single_key_and_value, get_single_key_and_value,
is_arrow, is_arrow,
@ -34,7 +34,7 @@ def parse(
and outputs the result as one or more files and/or as a function return value and outputs the result as one or more files and/or as a function return value
Accepted inputs: Accepted inputs:
* A path to a YAML source file to parse * A Path object or a path-like string pointing to a YAML source file to parse
* A string containing the YAML data to parse * A string containing the YAML data to parse
* A Python Dict containing the pre-parsed YAML data * A Python Dict containing the pre-parsed YAML data
@ -93,7 +93,8 @@ def parse(
output_file = output_dir / output_name output_file = output_dir / output_name
if yaml_file: if yaml_file:
# if reading from file, ensure that input file's parent directory is included in image_paths # if reading from file, ensure that input file's parent directory
# is included in image_paths
default_image_path = yaml_file.parent.resolve() default_image_path = yaml_file.parent.resolve()
if not default_image_path in [Path(x).resolve() for x in image_paths]: if not default_image_path in [Path(x).resolve() for x in image_paths]:
image_paths.append(default_image_path) image_paths.append(default_image_path)
@ -128,7 +129,8 @@ def parse(
if len(yaml_data[sec]) > 0: # section has contents if len(yaml_data[sec]) > 0: # section has contents
if ty == dict: if ty == dict:
for key, attribs in yaml_data[sec].items(): for key, attribs in yaml_data[sec].items():
# The Image dataclass might need to open an image file with a relative path. # The Image dataclass might need to open
# an image file with a relative path.
image = attribs.get("image") image = attribs.get("image")
if isinstance(image, dict): if isinstance(image, dict):
image_path = image["src"] image_path = image["src"]
@ -164,12 +166,16 @@ def parse(
autogenerated_designators[template] = ( autogenerated_designators[template] = (
autogenerated_designators.get(template, 0) + 1 autogenerated_designators.get(template, 0) + 1
) )
designator = f"__{template}_{autogenerated_designators[template]}" designator = (
f"{AUTOGENERATED_PREFIX}"
f"{template}_{autogenerated_designators[template]}"
)
# check if redefining existing component to different template # check if redefining existing component to different template
if designator in designators_and_templates: if designator in designators_and_templates:
if designators_and_templates[designator] != template: if designators_and_templates[designator] != template:
raise Exception( raise Exception(
f"Trying to redefine {designator} from {designators_and_templates[designator]} to {template}" f"Trying to redefine {designator}"
f" from {designators_and_templates[designator]} to {template}"
) )
else: else:
designators_and_templates[designator] = template designators_and_templates[designator] = template
@ -201,7 +207,6 @@ def parse(
expected_type = alternating_types[1 - alternating_types.index(expected_type)] expected_type = alternating_types[1 - alternating_types.index(expected_type)]
for connection_set in connection_sets: for connection_set in connection_sets:
# figure out number of parallel connections within this set # figure out number of parallel connections within this set
connectioncount = [] connectioncount = []
for entry in connection_set: for entry in connection_set:
@ -282,7 +287,7 @@ def parse(
# generate new connector instance from template # generate new connector instance from template
check_type(designator, template, "connector") check_type(designator, template, "connector")
harness.add_connector( harness.add_connector(
name=designator, **template_connectors[template] designator=designator, **template_connectors[template]
) )
elif designator in harness.cables: # existing cable instance elif designator in harness.cables: # existing cable instance
@ -290,7 +295,9 @@ def parse(
elif template in template_cables.keys(): elif template in template_cables.keys():
# generate new cable instance from template # generate new cable instance from template
check_type(designator, template, "cable/arrow") check_type(designator, template, "cable/arrow")
harness.add_cable(name=designator, **template_cables[template]) harness.add_cable(
designator=designator, **template_cables[template]
)
elif is_arrow(designator): elif is_arrow(designator):
check_type(designator, template, "cable/arrow") check_type(designator, template, "cable/arrow")
@ -300,7 +307,8 @@ def parse(
f"{template} is an unknown template/designator/arrow." f"{template} is an unknown template/designator/arrow."
) )
alternate_type() # entries in connection set must alternate between connectors and cables/arrows # entries in connection set must alternate between connectors and cables/arrows
alternate_type()
# transpose connection set list # transpose connection set list
# before: one item per component, one subitem per connection in set # before: one item per component, one subitem per connection in set
@ -355,11 +363,13 @@ def parse(
# mate two connectors as a whole # mate two connectors as a whole
harness.add_mate_component(from_name, to_name, designator) harness.add_mate_component(from_name, to_name, designator)
# harness population completed =============================================
if "additional_bom_items" in yaml_data: if "additional_bom_items" in yaml_data:
for line in yaml_data["additional_bom_items"]: for line in yaml_data["additional_bom_items"]:
harness.add_bom_item(line) harness.add_additional_bom_item(line)
# harness population completed =============================================
harness.populate_bom()
if output_formats: if output_formats:
harness.output(filename=output_file, fmt=output_formats, view=False) harness.output(filename=output_file, fmt=output_formats, view=False)
@ -382,23 +392,15 @@ def parse(
return tuple(returns) if len(returns) != 1 else returns[0] return tuple(returns) if len(returns) != 1 else returns[0]
def _get_yaml_data_and_path(inp: Union[str, Path, Dict]) -> (Dict, Path): def _get_yaml_data_and_path(inp: Union[str, Path, Dict]) -> Tuple[Dict, Path]:
# determine whether inp is a file path, a YAML string, or a Dict # determine whether inp is a file path, a YAML string, or a Dict
if not isinstance(inp, Dict): # received a str or a Path if not isinstance(inp, Dict): # received a str or a Path
try: if isinstance(inp, Path) or (isinstance(inp, str) and not "\n" in inp):
yaml_path = Path(inp).expanduser().resolve(strict=True) yaml_path = Path(inp).expanduser().resolve(strict=True)
# if no FileNotFoundError exception happens, get file contents
yaml_str = open_file_read(yaml_path).read() yaml_str = open_file_read(yaml_path).read()
except (FileNotFoundError, OSError) as e: else:
# if inp is a long YAML string, Pathlib will raise OSError: [errno.ENAMETOOLONG]
# when trying to expand and resolve it as a path.
# Catch this error, but raise any others
from errno import ENAMETOOLONG
if type(e) is OSError and e.errno != ENAMETOOLONG:
raise e
# file does not exist; assume inp is a YAML string
yaml_str = inp
yaml_path = None yaml_path = None
yaml_str = inp
yaml_data = yaml.safe_load(yaml_str) yaml_data = yaml.safe_load(yaml_str)
else: else:
# received a Dict, use as-is # received a Dict, use as-is

View File

@ -1,266 +1,87 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from dataclasses import asdict from collections import namedtuple
from itertools import groupby from dataclasses import dataclass
from typing import Any, Dict, List, Optional, Tuple, Union from enum import Enum, IntEnum
from typing import List, Optional, Union
from wireviz.DataClasses import AdditionalComponent, Cable, Color, Connector import tabulate as tabulate_module
from wireviz.wv_colors import translate_color
from wireviz.wv_gv_html import html_bgcolor_attr, html_line_breaks
from wireviz.wv_helper import clean_whitespace
BOM_COLUMNS_ALWAYS = ("id", "description", "qty", "unit", "designators") from wireviz.wv_utils import html_line_breaks
BOM_COLUMNS_OPTIONAL = ("pn", "manufacturer", "mpn", "supplier", "spn")
BOM_COLUMNS_IN_KEY = ("description", "unit") + BOM_COLUMNS_OPTIONAL
HEADER_PN = "P/N" BOM_HASH_FIELDS = "description qty_unit amount partnumbers"
HEADER_MPN = "MPN"
HEADER_SPN = "SPN"
BOMKey = Tuple[str, ...]
BOMColumn = str # = Literal[*BOM_COLUMNS_ALWAYS, *BOM_COLUMNS_OPTIONAL]
BOMEntry = Dict[BOMColumn, Union[str, int, float, List[str], None]]
def optional_fields(part: Union[Connector, Cable, AdditionalComponent]) -> BOMEntry: BomEntry = namedtuple("BomEntry", "category qty designators")
"""Return part field values for the optional BOM columns as a dict.""" BomHash = namedtuple("BomHash", BOM_HASH_FIELDS)
part = asdict(part) BomHashList = namedtuple("BomHashList", BOM_HASH_FIELDS)
return {field: part.get(field) for field in BOM_COLUMNS_OPTIONAL} PartNumberInfo = namedtuple("PartNumberInfo", "pn manufacturer mpn supplier spn")
# TODO: different BOM modes
# BomMode
# "normal" # no bubbles, full PN info in GV node
# "bubbles" # = "full" -> maximum info in GV node
# "hide PN info"
# "PN crossref" = "PN bubbles" + "hide PN info"
# "additionally: BOM table in GV graph label (#227)"
# "title block in GV graph label"
def get_additional_component_table( BomCategory = IntEnum( # to enforce ordering in BOM
harness: "Harness", component: Union[Connector, Cable] "BomEntry", "CONNECTOR CABLE WIRE ADDITIONAL_INSIDE ADDITIONAL_OUTSIDE"
)
QtyMultiplierConnector = Enum(
"QtyMultiplierConnector", "PINCOUNT POPULATED CONNECTIONS"
)
QtyMultiplierCable = Enum(
"QtyMultiplierCable", "WIRECOUNT TERMINATION LENGTH TOTAL_LENGTH"
)
PART_NUMBER_HEADERS = PartNumberInfo(
pn="P/N", manufacturer=None, mpn="MPN", supplier=None, spn="SPN"
)
def partnumbers2list(
partnumbers: PartNumberInfo, parent_partnumbers: PartNumberInfo = None
) -> List[str]: ) -> List[str]:
"""Return a list of diagram node table row strings with additional components.""" if parent_partnumbers is None:
rows = [] _is_toplevel = True
if component.additional_components: parent_partnumbers = partnumbers
rows.append(["Additional components"]) else:
for part in component.additional_components: _is_toplevel = False
common_args = {
"qty": part.qty * component.get_qty_multiplier(part.qty_multiplier), # Note: != operator used as XOR in the following section (https://stackoverflow.com/a/433161)
"unit": part.unit,
"bgcolor": part.bgcolor, if _is_toplevel != isinstance(parent_partnumbers.pn, List):
} # top level and not a list, or wire level and list
if harness.options.mini_bom_mode: cell_pn = pn_info_string(PART_NUMBER_HEADERS.pn, None, partnumbers.pn)
id = get_bom_index( else:
harness.bom(), # top level and list -> do per wire later
bom_entry_key({**asdict(part), "description": part.description}), # wire level and not list -> already done at top level
) cell_pn = None
rows.append(
component_table_entry( if _is_toplevel != isinstance(parent_partnumbers.mpn, List):
f"#{id} ({part.type.rstrip()})", **common_args # TODO: edge case: different manufacturers, but same MPN?
) cell_mpn = pn_info_string(
PART_NUMBER_HEADERS.mpn, partnumbers.manufacturer, partnumbers.mpn
) )
else: else:
rows.append( cell_mpn = None
component_table_entry(
part.description, **common_args, **optional_fields(part)
)
)
return rows
if _is_toplevel != isinstance(parent_partnumbers.spn, List):
def get_additional_component_bom(component: Union[Connector, Cable]) -> List[BOMEntry]: # TODO: edge case: different suppliers, but same SPN?
"""Return a list of BOM entries with additional components.""" cell_spn = pn_info_string(
bom_entries = [] PART_NUMBER_HEADERS.spn, partnumbers.supplier, partnumbers.spn
for part in component.additional_components:
bom_entries.append(
{
"description": part.description,
"qty": part.qty * component.get_qty_multiplier(part.qty_multiplier),
"unit": part.unit,
"designators": component.name if component.show_name else None,
**optional_fields(part),
}
)
return bom_entries
def bom_entry_key(entry: BOMEntry) -> BOMKey:
"""Return a tuple of string values from the dict that must be equal to join BOM entries."""
if "key" not in entry:
entry["key"] = tuple(
clean_whitespace(make_str(entry.get(c))) for c in BOM_COLUMNS_IN_KEY
)
return entry["key"]
def generate_bom(harness: "Harness") -> List[BOMEntry]:
"""Return a list of BOM entries generated from the harness."""
from wireviz.Harness import Harness # Local import to avoid circular imports
bom_entries = []
# connectors
for connector in harness.connectors.values():
if not connector.ignore_in_bom:
description = (
"Connector"
+ (f", {connector.type}" if connector.type else "")
+ (f", {connector.subtype}" if connector.subtype else "")
+ (f", {connector.pincount} pins" if connector.show_pincount else "")
+ (
f", {translate_color(connector.color, harness.options.color_mode)}"
if connector.color
else ""
)
)
bom_entries.append(
{
"description": description,
"designators": connector.name if connector.show_name else None,
**optional_fields(connector),
}
)
# add connectors aditional components to bom
bom_entries.extend(get_additional_component_bom(connector))
# cables
# TODO: If category can have other non-empty values than 'bundle', maybe it should be part of description?
for cable in harness.cables.values():
if not cable.ignore_in_bom:
if cable.category != "bundle":
# process cable as a single entity
description = (
"Cable"
+ (f", {cable.type}" if cable.type else "")
+ (f", {cable.wirecount}")
+ (
f" x {cable.gauge} {cable.gauge_unit}"
if cable.gauge
else " wires"
)
+ (" shielded" if cable.shield else "")
+ (
f", {translate_color(cable.color, harness.options.color_mode)}"
if cable.color
else ""
)
)
bom_entries.append(
{
"description": description,
"qty": cable.length,
"unit": cable.length_unit,
"designators": cable.name if cable.show_name else None,
**optional_fields(cable),
}
) )
else: else:
# add each wire from the bundle to the bom cell_spn = None
for index, color in enumerate(cable.colors):
description = (
"Wire"
+ (f", {cable.type}" if cable.type else "")
+ (f", {cable.gauge} {cable.gauge_unit}" if cable.gauge else "")
+ (
f", {translate_color(color, harness.options.color_mode)}"
if color
else ""
)
)
bom_entries.append(
{
"description": description,
"qty": cable.length,
"unit": cable.length_unit,
"designators": cable.name if cable.show_name else None,
**{
k: index_if_list(v, index)
for k, v in optional_fields(cable).items()
},
}
)
# add cable/bundles aditional components to bom cell_contents = [cell_pn, cell_mpn, cell_spn]
bom_entries.extend(get_additional_component_bom(cable)) if any(cell_contents):
return [html_line_breaks(cell) for cell in cell_contents]
# add harness aditional components to bom directly, as they both are List[BOMEntry] else:
bom_entries.extend(harness.additional_bom_items) return None
# remove line breaks if present and cleanup any resulting whitespace issues
bom_entries = [
{k: clean_whitespace(v) for k, v in entry.items()} for entry in bom_entries
]
# deduplicate bom
bom = []
for _, group in groupby(sorted(bom_entries, key=bom_entry_key), key=bom_entry_key):
group_entries = list(group)
designators = sum(
(make_list(entry.get("designators")) for entry in group_entries), []
)
total_qty = sum(entry.get("qty", 1) for entry in group_entries)
bom.append(
{
**group_entries[0],
"qty": round(total_qty, 3),
"designators": sorted(set(designators)),
}
)
# add an incrementing id to each bom entry
return [{**entry, "id": index} for index, entry in enumerate(bom, 1)]
def get_bom_index(bom: List[BOMEntry], target: BOMKey) -> int:
"""Return id of BOM entry or raise exception if not found."""
for entry in bom:
if bom_entry_key(entry) == target:
return entry["id"]
raise Exception("Internal error: No BOM entry found matching: " + "|".join(target))
def bom_list(bom: List[BOMEntry]) -> List[List[str]]:
"""Return list of BOM rows as lists of column strings with headings in top row."""
keys = list(BOM_COLUMNS_ALWAYS) # Always include this fixed set of BOM columns.
for fieldname in BOM_COLUMNS_OPTIONAL:
# Include only those optional BOM columns that are in use.
if any(entry.get(fieldname) for entry in bom):
keys.append(fieldname)
# Custom mapping from internal name to BOM column headers.
# Headers not specified here are generated by capitilising the internal name.
bom_headings = {
"pn": HEADER_PN,
"mpn": HEADER_MPN,
"spn": HEADER_SPN,
}
return [
[bom_headings.get(k, k.capitalize()) for k in keys]
] + [ # Create header row with key names
[make_str(entry.get(k)) for k in keys] for entry in bom
] # Create string list for each entry row
def component_table_entry(
type: str,
qty: Union[int, float],
unit: Optional[str] = None,
bgcolor: Optional[Color] = None,
pn: Optional[str] = None,
manufacturer: Optional[str] = None,
mpn: Optional[str] = None,
supplier: Optional[str] = None,
spn: Optional[str] = None,
) -> str:
"""Return a diagram node table row string with an additional component."""
part_number_list = [
pn_info_string(HEADER_PN, None, pn),
pn_info_string(HEADER_MPN, manufacturer, mpn),
pn_info_string(HEADER_SPN, supplier, spn),
]
output = (
f"{qty}"
+ (f" {unit}" if unit else "")
+ f" x {type}"
+ ("<br/>" if any(part_number_list) else "")
+ (", ".join([pn for pn in part_number_list if pn]))
)
# format the above output as left aligned text in a single visible cell
# indent is set to two to match the indent in the generated html table
return f"""<table border="0" cellspacing="0" cellpadding="3" cellborder="1"{html_bgcolor_attr(bgcolor)}><tr>
<td align="left" balign="left">{html_line_breaks(output)}</td>
</tr></table>"""
def pn_info_string( def pn_info_string(
@ -274,16 +95,51 @@ def pn_info_string(
return None return None
def index_if_list(value: Any, index: int) -> Any: def bom_list(bom):
"""Return the value indexed if it is a list, or simply the value otherwise.""" headers = (
return value[index] if isinstance(value, list) else value "# Qty Unit Description Amount Unit Designators "
"P/N Manufacturer MPN Supplier SPN Category".split(" ")
)
rows = []
rows.append(headers)
# fill rows
for hash, entry in bom.items():
cells = [
entry["id"],
entry["qty"],
hash.qty_unit,
hash.description,
hash.amount.number if hash.amount else None,
hash.amount.unit if hash.amount else None,
", ".join(sorted(entry["designators"])),
]
if hash.partnumbers:
cells.extend(
[
hash.partnumbers.pn,
hash.partnumbers.manufacturer,
hash.partnumbers.mpn,
hash.partnumbers.supplier,
hash.partnumbers.spn,
]
)
else:
cells.extend([None, None, None, None, None])
# cells.extend([f"{entry['category']} ({entry['category'].name})"]) # for debugging
rows.append(cells)
# remove empty columns
transposed = list(map(list, zip(*rows)))
transposed = [
column
for column in transposed
if any([cell is not None for cell in column[1:]])
# ^ ignore header cell in check
]
rows = list(map(list, zip(*transposed)))
return rows
def make_list(value: Any) -> list: def print_bom_table(bom):
"""Return value if a list, empty list if None, or single element list otherwise.""" print()
return value if isinstance(value, list) else [] if value is None else [value] print(tabulate_module.tabulate(bom_list(bom), headers="firstrow"))
print()
def make_str(value: Any) -> str:
"""Return comma separated elements if a list, empty string if None, or value as a string otherwise."""
return ", ".join(str(element) for element in make_list(value))

View File

@ -11,7 +11,7 @@ if __name__ == "__main__":
import wireviz.wireviz as wv import wireviz.wireviz as wv
from wireviz import APP_NAME, __version__ from wireviz import APP_NAME, __version__
from wireviz.wv_helper import open_file_read from wireviz.wv_utils import open_file_read
format_codes = { format_codes = {
"c": "csv", "c": "csv",
@ -23,9 +23,12 @@ format_codes = {
"t": "tsv", "t": "tsv",
} }
epilog = "The -f or --format option accepts a string containing one or more of the "
epilog += "following characters to specify which file types to output:\n" epilog = (
epilog += ", ".join([f"{key} ({value.upper()})" for key, value in format_codes.items()]) "The -f or --format option accepts a string containing one or more of the "
"following characters to specify which file types to output:\n"
+ f", ".join([f"{key} ({value.upper()})" for key, value in format_codes.items()])
)
@click.command(epilog=epilog, no_args_is_help=True) @click.command(epilog=epilog, no_args_is_help=True)
@ -58,7 +61,10 @@ epilog += ", ".join([f"{key} ({value.upper()})" for key, value in format_codes.i
"--output-name", "--output-name",
default=None, default=None,
type=str, type=str,
help="File name (without extension) to use for output files, if different from input file name.", help=(
"File name (without extension) to use for output files, "
"if different from input file name."
),
) )
@click.option( @click.option(
"-V", "-V",
@ -71,7 +77,7 @@ def wireviz(file, format, prepend, output_dir, output_name, version):
""" """
Parses the provided FILE and generates the specified outputs. Parses the provided FILE and generates the specified outputs.
""" """
print() print() # blank line before execution
print(f"{APP_NAME} {__version__}") print(f"{APP_NAME} {__version__}")
if version: if version:
return # print version number only and exit return # print version number only and exit
@ -105,6 +111,8 @@ def wireviz(file, format, prepend, output_dir, output_name, version):
prepend_file = Path(prepend_file) prepend_file = Path(prepend_file)
if not prepend_file.exists(): if not prepend_file.exists():
raise Exception(f"File does not exist:\n{prepend_file}") raise Exception(f"File does not exist:\n{prepend_file}")
if not prepend_file.is_file():
raise Exception(f"Path is not a file:\n{prepend_file}")
print("Prepend file:", prepend_file) print("Prepend file:", prepend_file)
prepend_input += open_file_read(prepend_file).read() + "\n" prepend_input += open_file_read(prepend_file).read() + "\n"
@ -116,6 +124,8 @@ def wireviz(file, format, prepend, output_dir, output_name, version):
file = Path(file) file = Path(file)
if not file.exists(): if not file.exists():
raise Exception(f"File does not exist:\n{file}") raise Exception(f"File does not exist:\n{file}")
if not file.is_file():
raise Exception(f"Path is not a file:\n{file}")
# file_out = file.with_suffix("") if not output_file else output_file # file_out = file.with_suffix("") if not output_file else output_file
_output_dir = file.parent if not output_dir else output_dir _output_dir = file.parent if not output_dir else output_dir
@ -142,7 +152,7 @@ def wireviz(file, format, prepend, output_dir, output_name, version):
image_paths=list(image_paths), image_paths=list(image_paths),
) )
print() print() # blank line after execution
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -1,6 +1,205 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from typing import Dict, List from collections import namedtuple
from dataclasses import dataclass, field
from enum import Enum
from typing import List
padding_amount = 1
ColorOutputMode = Enum(
"ColorOutputMode", "EN_LOWER EN_UPPER DE_LOWER DE_UPPER HTML_LOWER HTML_UPPER"
)
color_output_mode = ColorOutputMode.EN_UPPER
KnownColor = namedtuple("KnownColor", "html code_de full_en full_de")
known_colors = { # v--------v--------- for future use
"BK": KnownColor("#000000", "sw", "black", "schwarz"),
"WH": KnownColor("#ffffff", "ws", "white", "weiß"),
"GY": KnownColor("#999999", "gr", "grey", "grau"),
"PK": KnownColor("#ff66cc", "rs", "pink", "rosa"),
"RD": KnownColor("#ff0000", "rt", "red", "rot"),
"OG": KnownColor("#ff8000", "or", "orange", "orange"),
"YE": KnownColor("#ffff00", "ge", "yellow", "gelb"),
"OL": KnownColor("#708000", "ol", "olive green", "olivgrün"),
"GN": KnownColor("#00aa00", "gn", "green", "grün"),
"TQ": KnownColor("#00ffff", "tk", "turquoise", "türkis"),
"LB": KnownColor("#a0dfff", "hb", "light blue", "hellblau"),
"BU": KnownColor("#0066ff", "bl", "blue", "blau"),
"VT": KnownColor("#8000ff", "vi", "violet", "violett"),
"BN": KnownColor("#895956", "br", "brown", "braun"),
"BG": KnownColor("#ceb673", "bg", "beige", "beige"),
"IV": KnownColor("#f5f0d0", "eb", "ivory", "elfenbein"),
"SL": KnownColor("#708090", "si", "slate", "schiefer"),
"CU": KnownColor("#d6775e", "ku", "copper", "Kupfer"),
"SN": KnownColor("#aaaaaa", "vz", "tin", "verzinkt"),
"SR": KnownColor("#84878c", "ag", "silver", "Silber"),
"GD": KnownColor("#ffcf80", "au", "gold", "Gold"),
}
def convert_case(inp):
if "_LOWER" in color_output_mode.name:
return inp.lower()
elif "_UPPER" in color_output_mode.name:
return inp.upper()
else: # currently not used
return inp
def get_color_by_colorcode_index(color_code: str, index: int) -> str:
num_colors_in_code = len(COLOR_CODES[color_code])
actual_index = index % num_colors_in_code # wrap around if index is out of bounds
return COLOR_CODES[color_code][actual_index]
@dataclass
class SingleColor:
_code_en: str
_html: str
@property
def code_en(self):
return convert_case(self._code_en) if self._code_en else None
@property
def code_de(self):
return (
convert_case(known_colors[self._code_en.upper()].code_de)
if self._code_en
else None
)
@property
def html(self):
return convert_case(self._html) if self._code_en else None
@property
def known(self):
# treat None as a known color
return self.code_en.upper() in known_colors.keys() if self._code_en else True
def __init__(self, inp):
if inp is None:
self._html = None
self._code_en = None
elif isinstance(inp, int):
hex_str = f"#{inp:06x}"
self._html = hex_str
self._code_en = hex_str # do not perform reverse lookup - why not?
elif not isinstance(inp, str):
raise Exception(f"Unknown single color {inp}!")
else:
inp_upper = inp.upper()
if inp_upper in known_colors.keys():
self._code_en = inp_upper
self._html = known_colors[inp_upper].html
else:
try: # Maybe inp is an int as string?
inp = f"#{int(inp, 0):06x}"
except ValueError:
pass # assume it's a valid HTML color name
self._html = inp
self._code_en = inp
@property
def html_padded(self):
return ":".join([self.html] * padding_amount)
def __bool__(self):
return self._code_en is not None
def __str__(self):
if self._html is None:
return ""
elif self.known and "EN_" in color_output_mode.name:
return self.code_en
elif self.known and "DE_" in color_output_mode.name:
return self.code_de
else:
return self.html
@dataclass
class MultiColor:
colors: List[SingleColor] = field(default_factory=list)
def __init__(self, inp):
self.colors = []
if inp is None:
pass
elif isinstance(inp, List): # input is already a list
for item in inp:
if item is None:
pass
elif isinstance(item, SingleColor):
self.colors.append(item)
else: # string or integer (type check done inside)
self.colors.append(SingleColor(item))
elif isinstance(inp, SingleColor): # single color
self.colors = [inp]
elif isinstance(inp, int):
self.colors = [SingleColor(inp)]
elif not isinstance(inp, str):
raise Exception(f"Unknown multi-color {inp}!")
elif ":" in inp: # split input into list
self.colors = [SingleColor(item) for item in inp.split(":")]
else:
if len(inp) % 2 == 0:
items = [inp[i : i + 2] for i in range(0, len(inp), 2)]
known = [item.upper() in known_colors.keys() for item in items]
if all(known):
self.colors = [SingleColor(item) for item in items]
return
# assume it's a valid HTML color name
self.colors = [SingleColor(inp)]
def __len__(self):
return len(self.colors)
def __bool__(self):
return len(self.colors) >= 1
def __str__(self):
if "EN_" in color_output_mode.name or "DE_" in color_output_mode.name:
joiner = "" if self.all_known else ":"
elif "HTML_" in color_output_mode.name:
joiner = ":"
else:
joiner = "???"
return joiner.join([str(color) for color in self.colors])
@property
def all_known(self):
return all([color.known for color in self.colors])
@property
def html(self):
return ":".join([color.html for color in self.colors])
@property
def html_padded_list(self):
# padding only properly works for padding_amount 1 or 3
if padding_amount == 1:
out = [color.html for color in self.colors]
elif len(self) == 0:
out = []
elif len(self) == 1:
out = [self.colors[0].html for i in range(3)]
elif len(self) == 2:
out = [self.colors[0].html, self.colors[1].html, self.colors[0].html]
elif len(self) == 3:
out = [color.html for color in self.colors]
else:
raise Exception(f"Padding not supported for len {len(self)}")
return [str(color) for color in out]
@property
def html_padded(self):
return ":".join(self.html_padded_list)
COLOR_CODES = { COLOR_CODES = {
# fmt: off # fmt: off
@ -38,164 +237,3 @@ COLOR_CODES = {
"T568A": ["WHGN", "GN", "WHOG", "BU", "WHBU", "OG", "WHBN", "BN"], "T568A": ["WHGN", "GN", "WHOG", "BU", "WHBU", "OG", "WHBN", "BN"],
"T568B": ["WHOG", "OG", "WHGN", "BU", "WHBU", "GN", "WHBN", "BN"], "T568B": ["WHOG", "OG", "WHGN", "BU", "WHBU", "GN", "WHBN", "BN"],
} }
# Convention: Color names should be 2 letters long, to allow for multicolored wires
_color_hex = {
"BK": "#000000",
"WH": "#ffffff",
"GY": "#999999",
"PK": "#ff66cc",
"RD": "#ff0000",
"OG": "#ff8000",
"YE": "#ffff00",
"OL": "#708000", # olive green
"GN": "#00ff00",
"TQ": "#00ffff",
"LB": "#a0dfff", # light blue
"BU": "#0066ff",
"VT": "#8000ff",
"BN": "#895956",
"BG": "#ceb673", # beige
"IV": "#f5f0d0", # ivory
"SL": "#708090",
"CU": "#d6775e", # Faux-copper look, for bare CU wire
"SN": "#aaaaaa", # Silvery look for tinned bare wire
"SR": "#84878c", # Darker silver for silvered wire
"GD": "#ffcf80", # Golden color for gold
}
_color_full = {
"BK": "black",
"WH": "white",
"GY": "grey",
"PK": "pink",
"RD": "red",
"OG": "orange",
"YE": "yellow",
"OL": "olive green",
"GN": "green",
"TQ": "turquoise",
"LB": "light blue",
"BU": "blue",
"VT": "violet",
"BN": "brown",
"BG": "beige",
"IV": "ivory",
"SL": "slate",
"CU": "copper",
"SN": "tin",
"SR": "silver",
"GD": "gold",
}
_color_ger = {
"BK": "sw",
"WH": "ws",
"GY": "gr",
"PK": "rs",
"RD": "rt",
"OG": "or",
"YE": "ge",
"OL": "ol", # olivgrün
"GN": "gn",
"TQ": "tk",
"LB": "hb", # hellblau
"BU": "bl",
"VT": "vi",
"BN": "br",
"BG": "bg", # beige
"IV": "eb", # elfenbeinfarben
"SL": "si", # Schiefer
"CU": "ku", # Kupfer
"SN": "vz", # verzinkt
"SR": "ag", # Silber
"GD": "au", # Gold
}
color_default = "#ffffff"
_hex_digits = set("0123456789abcdefABCDEF")
# Literal type aliases below are commented to avoid requiring python 3.8
Color = str # Two-letter color name = Literal[_color_hex.keys()]
Colors = str # One or more two-letter color names (Color) concatenated into one string
ColorMode = (
str # = Literal['full', 'FULL', 'hex', 'HEX', 'short', 'SHORT', 'ger', 'GER']
)
ColorScheme = str # Color scheme name = Literal[COLOR_CODES.keys()]
def get_color_hex(input: Colors, pad: bool = False) -> List[str]:
"""Return list of hex colors from either a string of color names or :-separated hex colors."""
if input is None or input == "":
return [color_default]
elif input[0] == "#": # Hex color(s)
output = input.split(":")
for i, c in enumerate(output):
if c[0] != "#" or not all(d in _hex_digits for d in c[1:]):
if c != input:
c += f" in input: {input}"
print(f"Invalid hex color: {c}")
output[i] = color_default
else: # Color name(s)
def lookup(c: str) -> str:
try:
return _color_hex[c]
except KeyError:
if c != input:
c += f" in input: {input}"
print(f"Unknown color name: {c}")
return color_default
output = [lookup(input[i : i + 2]) for i in range(0, len(input), 2)]
if len(output) == 2: # Give wires with EXACTLY 2 colors that striped look.
output += output[:1]
elif pad and len(output) == 1: # Hacky style fix: Give single color wires
output *= 3 # a triple-up so that wires are the same size.
return output
def get_color_translation(translate: Dict[Color, str], input: Colors) -> List[str]:
"""Return list of colors translations from either a string of color names or :-separated hex colors."""
def from_hex(hex_input: str) -> str:
for color, hex in _color_hex.items():
if hex == hex_input:
return translate[color]
return f'({",".join(str(int(hex_input[i:i+2], 16)) for i in range(1, 6, 2))})'
return (
[from_hex(h) for h in input.lower().split(":")]
if input[0] == "#"
else [translate.get(input[i : i + 2], "??") for i in range(0, len(input), 2)]
)
def translate_color(input: Colors, color_mode: ColorMode) -> str:
if input == "" or input is None:
return ""
upper = color_mode.isupper()
if not (color_mode.isupper() or color_mode.islower()):
raise Exception("Unknown color mode capitalization")
color_mode = color_mode.lower()
if color_mode == "full":
output = "/".join(get_color_translation(_color_full, input))
elif color_mode == "hex":
output = ":".join(get_color_hex(input, pad=False))
elif color_mode == "ger":
output = "".join(get_color_translation(_color_ger, input))
elif color_mode == "short":
output = input
else:
raise Exception("Unknown color mode")
if upper:
return output.upper()
else:
return output.lower()

View File

@ -0,0 +1,826 @@
# -*- coding: utf-8 -*-
from collections import namedtuple
from dataclasses import dataclass, field
from enum import Enum
from itertools import zip_longest
from typing import Any, Dict, List, Optional, Tuple, Union
from wireviz.wv_bom import (
BomHash,
BomHashList,
PartNumberInfo,
QtyMultiplierCable,
QtyMultiplierConnector,
)
from wireviz.wv_colors import (
COLOR_CODES,
ColorOutputMode,
MultiColor,
SingleColor,
get_color_by_colorcode_index,
)
from wireviz.wv_utils import (
NumberAndUnit,
awg_equiv,
aspect_ratio,
mm2_equiv,
parse_number_and_unit,
remove_links,
)
# Each type alias have their legal values described in comments
# - validation might be implemented in the future
PlainText = str # Text not containing HTML tags nor newlines
Hypertext = str # Text possibly including HTML hyperlinks that are removed in all outputs except HTML output
MultilineHypertext = (
str # Hypertext possibly also including newlines to break lines in diagram output
)
Designator = PlainText # Case insensitive unique name of connector or cable
# Literal type aliases below are commented to avoid requiring python 3.8
ImageScale = PlainText # = Literal['false', 'true', 'width', 'height', 'both']
# Type combinations
Pin = Union[int, PlainText] # Pin identifier
PinIndex = int # Zero-based pin index
Wire = Union[int, PlainText] # Wire number or Literal['s'] for shield
NoneOrMorePins = Union[
Pin, Tuple[Pin, ...], None
] # None, one, or a tuple of pin identifiers
NoneOrMorePinIndices = Union[
PinIndex, Tuple[PinIndex, ...], None
] # None, one, or a tuple of zero-based pin indices
OneOrMoreWires = Union[Wire, Tuple[Wire, ...]] # One or a tuple of wires
# Metadata can contain whatever is needed by the HTML generation/template.
MetadataKeys = PlainText # Literal['title', 'description', 'notes', ...]
Side = Enum("Side", "LEFT RIGHT")
ArrowDirection = Enum("ArrowDirection", "NONE BACK FORWARD BOTH")
ArrowWeight = Enum("ArrowWeight", "SINGLE DOUBLE")
AUTOGENERATED_PREFIX = "AUTOGENERATED_"
@dataclass
class Arrow:
direction: ArrowDirection
weight: ArrowWeight
class Metadata(dict):
pass
@dataclass
class Options:
fontname: PlainText = "arial"
bgcolor: SingleColor = "WH" # will be converted to SingleColor in __post_init__
bgcolor_node: SingleColor = "WH"
bgcolor_connector: SingleColor = None
bgcolor_cable: SingleColor = None
bgcolor_bundle: SingleColor = None
color_output_mode: ColorOutputMode = ColorOutputMode.EN_UPPER
mini_bom_mode: bool = True
template_separator: str = "."
_pad: int = 0
# TODO: resolve template and image paths during rendering, not during YAML parsing
_template_paths: List = field(default_factory=list)
_image_paths: List = field(default_factory=list)
def __post_init__(self):
self.bgcolor = SingleColor(self.bgcolor)
self.bgcolor_node = SingleColor(self.bgcolor_node)
self.bgcolor_connector = SingleColor(self.bgcolor_connector)
self.bgcolor_cable = SingleColor(self.bgcolor_cable)
self.bgcolor_bundle = SingleColor(self.bgcolor_bundle)
if not self.bgcolor_node:
self.bgcolor_node = self.bgcolor
if not self.bgcolor_connector:
self.bgcolor_connector = self.bgcolor_node
if not self.bgcolor_cable:
self.bgcolor_cable = self.bgcolor_node
if not self.bgcolor_bundle:
self.bgcolor_bundle = self.bgcolor_cable
@dataclass
class Tweak:
override: Optional[Dict[Designator, Dict[str, Optional[str]]]] = None
append: Union[str, List[str], None] = None
@dataclass
class Image:
# Attributes of the image object <img>:
src: str
scale: Optional[ImageScale] = None
# Attributes of the image cell <td> containing the image:
width: Optional[int] = None
height: Optional[int] = None
fixedsize: Optional[bool] = None
bgcolor: SingleColor = None
# Contents of the text cell <td> just below the image cell:
caption: Optional[MultilineHypertext] = None
# See also HTML doc at https://graphviz.org/doc/info/shapes.html#html
def __post_init__(self):
self.bgcolor = SingleColor(self.bgcolor)
if self.fixedsize is None:
# Default True if any dimension specified unless self.scale also is specified.
self.fixedsize = (self.width or self.height) and self.scale is None
if self.scale is None:
if not self.width and not self.height:
self.scale = "false"
elif self.width and self.height:
self.scale = "both"
else:
self.scale = "true" # When only one dimension is specified.
if self.fixedsize:
# If only one dimension is specified, compute the other
# because Graphviz requires both when fixedsize=True.
if self.height:
if not self.width:
self.width = self.height * aspect_ratio(self.src)
else:
if self.width:
self.height = self.width / aspect_ratio(self.src)
@dataclass
class PinClass:
index: int
id: str
label: str
color: MultiColor
parent: str # designator of parent connector
_num_connections = 0 # incremented in Connector.connect()
_anonymous: bool = False # true for pins on autogenerated connectors
_simple: bool = False # true for simple connector
def __str__(self):
snippets = [ # use str() for each in case they are int or other non-str
str(self.parent) if not self._anonymous else "",
str(self.id) if not self._anonymous and not self._simple else "",
str(self.label) if self.label else "",
]
return ":".join([snip for snip in snippets if snip != ""])
@dataclass
class Component:
category: Optional[str] = None # currently only used by cables, to define bundles
type: Union[MultilineHypertext, List[MultilineHypertext]] = None
subtype: Union[MultilineHypertext, List[MultilineHypertext]] = None
# part number
partnumbers: PartNumberInfo = None # filled by __post_init__()
# the following are provided for user convenience and should not be accessed later.
# their contents are loaded into partnumbers during the child class __post_init__()
pn: str = None
manufacturer: str = None
mpn: str = None
supplier: str = None
spn: str = None
# BOM info
qty: Optional[Union[None, int, float]] = None
amount: Optional[NumberAndUnit] = None
sum_amounts_in_bom: bool = True
ignore_in_bom: bool = False
bom_id: Optional[str] = None # to be filled after harness is built
def __post_init__(self):
partnos = [self.pn, self.manufacturer, self.mpn, self.supplier, self.spn]
partnos = [remove_links(entry) for entry in partnos]
partnos = tuple(partnos)
self.partnumbers = PartNumberInfo(*partnos)
self.amount = parse_number_and_unit(self.amount, None)
@property
def bom_hash(self) -> BomHash:
if isinstance(self, AdditionalComponent):
_amount = self.amount_computed
else:
_amount = self.amount
if self.sum_amounts_in_bom:
_hash = BomHash(
description=self.description,
qty_unit=_amount.unit if _amount else None,
amount=None,
partnumbers=self.partnumbers,
)
else:
_hash = BomHash(
description=self.description,
qty_unit=None,
amount=_amount,
partnumbers=self.partnumbers,
)
return _hash
@property
def has_pn_info(self) -> bool:
return any([self.pn, self.manufacturer, self.mpn, self.supplier, self.spn])
@property
def description(self) -> str:
return f"{self.type}{', ' + self.subtype if self.subtype else ''}"
@dataclass
class AdditionalBomItem(Component):
designators: Optional[str] = None
@property
def additional_components(self):
# An additional item may not have further nested additional comonents.
# This property is currently needed for objects in the same list as
# TopLevelGraphicalComponent objects in a Harness method.
return []
@dataclass
class GraphicalComponent(Component): # abstract class
bgcolor: Optional[SingleColor] = None
def __post_init__(self):
super().__post_init__()
self.bgcolor = SingleColor(self.bgcolor)
@dataclass
class AdditionalComponent(GraphicalComponent):
qty_multiplier: Union[QtyMultiplierConnector, QtyMultiplierCable, int] = 1
qty_computed: Optional[int] = None
explicit_qty: bool = True
amount_computed: Optional[NumberAndUnit] = None
note: str = None
def __post_init__(self):
super().__post_init__()
if isinstance(self.qty_multiplier, float) or isinstance(
self.qty_multiplier, int
):
pass
else:
self.qty_multiplier = self.qty_multiplier.upper()
if self.qty_multiplier in QtyMultiplierConnector.__members__.keys():
self.qty_multiplier = QtyMultiplierConnector[self.qty_multiplier]
elif self.qty_multiplier in QtyMultiplierCable.__members__.keys():
self.qty_multiplier = QtyMultiplierCable[self.qty_multiplier]
else:
raise Exception(f"Unknown qty multiplier: {self.qty_multiplier}")
if self.qty is None and self.qty_multiplier in [
QtyMultiplierCable.TOTAL_LENGTH,
QtyMultiplierCable.LENGTH,
1,
]: # simplify add.comp. table in parent node for implicit qty 1
self.qty = 1
self.explicit_qty = False
@dataclass
class TopLevelGraphicalComponent(GraphicalComponent): # abstract class
# component properties
designator: Designator = None
color: Optional[MultiColor] = None
image: Optional[Image] = None
additional_parameters: Optional[Dict] = None
additional_components: List[AdditionalComponent] = field(default_factory=list)
notes: Optional[MultilineHypertext] = None
# rendering options
bgcolor_title: Optional[SingleColor] = None
show_name: Optional[bool] = None
@dataclass
class Connector(TopLevelGraphicalComponent):
# connector-specific properties
style: Optional[str] = None
loops: List[List[Pin]] = field(default_factory=list)
# pin information in particular
pincount: Optional[int] = None
pins: List[Pin] = field(default_factory=list) # legacy
pinlabels: List[Pin] = field(default_factory=list) # legacy
pincolors: List[str] = field(default_factory=list) # legacy
pin_objects: Dict[Any, PinClass] = field(default_factory=dict) # new
# rendering option
show_pincount: Optional[bool] = None
hide_disconnected_pins: bool = False
@property
def is_autogenerated(self):
return self.designator.startswith(AUTOGENERATED_PREFIX)
@property
def description(self) -> str:
substrs = [
"Connector",
self.type,
self.subtype,
f"{self.pincount} pins" if self.show_pincount else None,
str(self.color) if self.color else None,
]
return ", ".join([str(s) for s in substrs if s is not None and s != ""])
def should_show_pin(self, pin_id):
return (
not self.hide_disconnected_pins
or self.pin_objects[pin_id]._num_connections > 0
)
@property
def unit(self): # for compatibility with BOM hashing
return None # connectors do not support units.
def __post_init__(self) -> None:
super().__post_init__()
self.bgcolor_title = SingleColor(self.bgcolor_title)
self.color = MultiColor(self.color)
# connectors do not support custom qty or amount
if self.qty is None:
self.qty = 1
if self.qty != 1:
raise Exception("Connector qty != 1 not supported")
if self.amount is not None:
raise Exception("Connector amount not supported")
if isinstance(self.image, dict):
self.image = Image(**self.image)
self.ports_left = False
self.ports_right = False
self.visible_pins = {}
if self.style == "simple":
if self.pincount and self.pincount > 1:
raise Exception(
"Connectors with style set to simple may only have one pin"
)
self.pincount = 1
if not self.pincount:
self.pincount = max(
len(self.pins), len(self.pinlabels), len(self.pincolors)
)
if not self.pincount:
raise Exception(
"You need to specify at least one: "
"pincount, pins, pinlabels, or pincolors"
)
# create default list for pins (sequential) if not specified
if not self.pins:
self.pins = list(range(1, self.pincount + 1))
if len(self.pins) != len(set(self.pins)):
raise Exception("Pins are not unique")
# all checks have passed
pin_tuples = zip_longest(
self.pins,
self.pinlabels,
self.pincolors,
)
for pin_index, (pin_id, pin_label, pin_color) in enumerate(pin_tuples):
self.pin_objects[pin_id] = PinClass(
index=pin_index,
id=pin_id,
label=pin_label,
color=MultiColor(pin_color),
parent=self.designator,
_anonymous=self.is_autogenerated,
_simple=self.style == "simple",
)
if self.show_name is None:
self.show_name = self.style != "simple" and not self.is_autogenerated
if self.show_pincount is None:
# hide pincount for simple (1 pin) connectors by default
self.show_pincount = self.style != "simple"
for loop in self.loops:
# TODO: allow using pin labels in addition to pin numbers,
# just like when defining regular connections
# TODO: include properties of wire used to create the loop
if len(loop) != 2:
raise Exception("Loops must be between exactly two pins!")
for pin in loop:
if pin not in self.pins:
raise Exception(
f'Unknown loop pin "{pin}" for connector "{self.name}"!'
)
# Make sure loop connected pins are not hidden.
# side=None, determine side to show loops during rendering
self.activate_pin(pin, side=None, is_connection=True)
for i, item in enumerate(self.additional_components):
if isinstance(item, dict):
self.additional_components[i] = AdditionalComponent(**item)
def activate_pin(self, pin_id, side: Side = None, is_connection=True) -> None:
if is_connection:
self.pin_objects[pin_id]._num_connections += 1
if side == Side.LEFT:
self.ports_left = True
elif side == Side.RIGHT:
self.ports_right = True
def compute_qty_multipliers(self):
# do not run before all connections in harness have been made!
num_populated_pins = len(
[pin for pin in self.pin_objects.values() if pin._num_connections > 0]
)
num_connections = sum(
[pin._num_connections for pin in self.pin_objects.values()]
)
qty_multipliers_computed = {
"PINCOUNT": self.pincount,
"POPULATED": num_populated_pins,
"CONNECTIONS": num_connections,
}
for subitem in self.additional_components:
if isinstance(subitem.qty_multiplier, QtyMultiplierConnector):
computed_factor = qty_multipliers_computed[subitem.qty_multiplier.name]
elif isinstance(subitem.qty_multiplier, QtyMultiplierCable):
raise Exception("Used a cable multiplier in a connector!")
else: # int or float
computed_factor = subitem.qty_multiplier
if subitem.qty is not None:
subitem.qty_computed = subitem.qty * computed_factor
else:
subitem.qty_computed = computed_factor
subitem.amount_computed = subitem.amount
@dataclass
class WireClass:
parent: str # designator of parent cable/bundle
# wire-specific properties
index: int
id: str
label: str
color: MultiColor
# ...
bom_id: Optional[str] = None # to be filled after harness is built
# inheritable from parent cable
type: Union[MultilineHypertext, List[MultilineHypertext]] = None
subtype: Union[MultilineHypertext, List[MultilineHypertext]] = None
gauge: Optional[NumberAndUnit] = None
length: Optional[NumberAndUnit] = None
ignore_in_bom: Optional[bool] = False
sum_amounts_in_bom: bool = True
partnumbers: PartNumberInfo = None
@property
def bom_hash(self) -> BomHash:
if self.sum_amounts_in_bom:
_hash = BomHash(
description=self.description,
qty_unit=self.length.unit if self.length else None,
amount=None,
partnumbers=self.partnumbers,
)
else:
_hash = BomHash(
description=self.description,
qty_unit=None,
amount=self.length,
partnumbers=self.partnumbers,
)
return _hash
@property
def gauge_str(self):
if not self.gauge:
return None
actual_gauge = f"{self.gauge.number} {self.gauge.unit}"
actual_gauge = actual_gauge.replace("mm2", "mm\u00B2")
return actual_gauge
@property
def description(self) -> str:
substrs = [
"Wire",
self.type,
self.subtype,
self.gauge_str,
str(self.color) if self.color else None,
]
desc = ", ".join([s for s in substrs if s is not None and s != ""])
return desc
@dataclass
class ShieldClass(WireClass):
pass # TODO, for wires with multiple shields more shield details, ...
@dataclass
class Connection:
from_: PinClass = None
via: Union[WireClass, ShieldClass] = None
to: PinClass = None
@dataclass
class Cable(TopLevelGraphicalComponent):
# cable-specific properties
gauge: Optional[NumberAndUnit] = None
length: Optional[NumberAndUnit] = None
color_code: Optional[str] = None
# wire information in particular
wirecount: Optional[int] = None
shield: Union[bool, MultiColor] = False
colors: List[str] = field(default_factory=list) # legacy
wirelabels: List[Wire] = field(default_factory=list) # legacy
wire_objects: Dict[Any, WireClass] = field(default_factory=dict) # new
# internal
_connections: List[Connection] = field(default_factory=list)
# rendering options
show_name: Optional[bool] = None
show_equiv: bool = False
show_wirecount: bool = True
show_wirenumbers: Optional[bool] = None
@property
def is_autogenerated(self):
return self.designator.startswith(AUTOGENERATED_PREFIX)
@property
def unit(self): # for compatibility with parent class
return self.length
@property
def gauge_str(self):
if not self.gauge:
return None
actual_gauge = f"{self.gauge.number} {self.gauge.unit}"
actual_gauge = actual_gauge.replace("mm2", "mm\u00B2")
return actual_gauge
@property
def gauge_str_with_equiv(self):
if not self.gauge:
return None
actual_gauge = self.gauge_str
equivalent_gauge = ""
if self.show_equiv:
# convert unit if known
if self.gauge.unit == "mm2":
equivalent_gauge = f" ({awg_equiv(self.gauge.number)} AWG)"
elif self.gauge.unit.upper() == "AWG":
equivalent_gauge = f" ({mm2_equiv(self.gauge.number)} mm2)"
out = f"{actual_gauge}{equivalent_gauge}"
out = out.replace("mm2", "mm\u00B2")
return out
@property
def length_str(self):
if not self.length:
return None
out = f"{self.length.number} {self.length.unit}"
return out
@property
def bom_hash(self):
if self.category == "bundle":
# This line should never be reached, since caller checks
# whether item is a bundle and if so, calls bom_hash
# for each individual wire instead
raise Exception("Do this at the wire level!")
else:
return super().bom_hash
@property
def description(self) -> str:
if self.category == "bundle":
raise Exception("Do this at the wire level!")
else:
substrs = [
("", "Cable"),
(", ", self.type),
(", ", self.subtype),
(", ", self.wirecount),
(" ", f"x {self.gauge_str}" if self.gauge else "wires"),
(" ", "shielded" if self.shield else None),
(", ", str(self.color) if self.color else None),
]
desc = "".join(
[f"{s[0]}{s[1]}" for s in substrs if s[1] is not None and s[1] != ""]
)
return desc
def _get_wire_partnumber(self, idx) -> PartNumberInfo:
def _get_correct_element(inp, idx):
return inp[idx] if isinstance(inp, List) else inp
# TODO: possibly make more robust/elegant
if self.category == "bundle":
return PartNumberInfo(
_get_correct_element(self.partnumbers.pn, idx),
_get_correct_element(self.partnumbers.manufacturer, idx),
_get_correct_element(self.partnumbers.mpn, idx),
_get_correct_element(self.partnumbers.supplier, idx),
_get_correct_element(self.partnumbers.spn, idx),
)
else:
return None # non-bundles do not support lists of part data
def __post_init__(self) -> None:
super().__post_init__()
self.bgcolor_title = SingleColor(self.bgcolor_title)
self.color = MultiColor(self.color)
# cables do not support custom qty or amount
if self.qty is None:
self.qty = 1
if self.qty != 1:
raise Exception("Cable qty != 1 not supported")
if isinstance(self.image, dict):
self.image = Image(**self.image)
# TODO:
# allow gauge, length, and other fields to be lists too (like part numbers),
# and assign them the same way to bundles.
self.gauge = parse_number_and_unit(self.gauge, "mm2")
self.length = parse_number_and_unit(self.length, "m")
self.amount = self.length # for BOM
if self.wirecount: # number of wires explicitly defined
if self.colors: # use custom color palette (partly or looped if needed)
self.colors = [
self.colors[i % len(self.colors)] for i in range(self.wirecount)
]
elif self.color_code:
# use standard color palette (partly or looped if needed)
if self.color_code not in COLOR_CODES:
raise Exception("Unknown color code")
self.colors = [
get_color_by_colorcode_index(self.color_code, i)
for i in range(self.wirecount)
]
else: # no colors defined, add dummy colors
self.colors = [""] * self.wirecount
else: # wirecount implicit in length of color list
if not self.colors:
raise Exception(
"Unknown number of wires. "
"Must specify wirecount or colors (implicit length)"
)
self.wirecount = len(self.colors)
if self.wirelabels:
if self.shield and "s" in self.wirelabels:
raise Exception(
'"s" may not be used as a wire label for a shielded cable.'
)
# if lists of part numbers are provided,
# check this is a bundle and that it matches the wirecount.
for idfield in [self.manufacturer, self.mpn, self.supplier, self.spn, self.pn]:
if isinstance(idfield, list):
if self.category == "bundle":
# check the length
if len(idfield) != self.wirecount:
raise Exception("lists of part data must match wirecount")
else:
raise Exception("lists of part data are only supported for bundles")
# all checks have passed
wire_tuples = zip_longest(
# TODO: self.wire_ids
self.colors,
self.wirelabels,
)
for wire_index, (wire_color, wire_label) in enumerate(wire_tuples):
id = wire_index + 1
self.wire_objects[id] = WireClass(
parent=self.designator,
# wire-specific properties
index=wire_index, # TODO: wire_id
id=id, # TODO: wire_id
label=wire_label,
color=MultiColor(wire_color),
# inheritable from parent cable
type=self.type,
subtype=self.subtype,
gauge=self.gauge,
length=self.length,
sum_amounts_in_bom=self.sum_amounts_in_bom,
ignore_in_bom=self.ignore_in_bom,
partnumbers=self._get_wire_partnumber(wire_index),
)
if self.shield:
index_offset = len(self.wire_objects)
# TODO: add support for multiple shields
id = "s"
self.wire_objects[id] = ShieldClass(
index=index_offset,
id=id,
label="Shield",
color=(
MultiColor(self.shield)
if isinstance(self.shield, str)
else MultiColor(None)
),
parent=self.designator,
)
if self.show_name is None:
self.show_name = not self.is_autogenerated
if self.show_wirenumbers is None:
# by default, show wire numbers for cables, hide for bundles
self.show_wirenumbers = self.category != "bundle"
for i, item in enumerate(self.additional_components):
if isinstance(item, dict):
self.additional_components[i] = AdditionalComponent(**item)
def _connect(
self,
from_pin_obj: List[PinClass],
via_wire_id: str,
to_pin_obj: List[PinClass],
) -> None:
via_wire_obj = self.wire_objects[via_wire_id]
self._connections.append(Connection(from_pin_obj, via_wire_obj, to_pin_obj))
def compute_qty_multipliers(self):
# do not run before all connections in harness have been made!
total_length = sum(
[
wire.length.number if wire.length else 0
for wire in self.wire_objects.values()
]
)
qty_multipliers_computed = {
"WIRECOUNT": len(self.wire_objects),
# "TERMINATIONS": ___, # TODO
"LENGTH": self.length.number if self.length else 0,
"TOTAL_LENGTH": total_length,
}
for subitem in self.additional_components:
if isinstance(subitem.qty_multiplier, QtyMultiplierCable):
computed_factor = qty_multipliers_computed[subitem.qty_multiplier.name]
if subitem.qty_multiplier.name in ["LENGTH", "TOTAL_LENGTH"]:
# since length can have a unit, use amount fields to hold
if subitem.amount is not None:
raise Exception(
f"No amount may be specified when using "
f"{subitem.qty_multiplier.name} as a multiplier."
)
subitem.qty_computed = subitem.qty if subitem.qty else 1
subitem.amount_computed = NumberAndUnit(
computed_factor, self.length.unit
)
else:
# multiplier unrelated to length, therefore no unit
if subitem.qty is not None:
subitem.qty_computed = subitem.qty * computed_factor
else:
subitem.qty_computed = computed_factor
subitem.amount_computed = subitem.amount
elif isinstance(subitem.qty_multiplier, QtyMultiplierConnector):
raise Exception("Used a connector multiplier in a cable!")
else: # int or float
if subitem.qty is not None:
subitem.qty_computed = subitem.qty * subitem.qty_multiplier
else:
subitem.qty_computed = subitem.qty_multiplier
subitem.amount_computed = subitem.amount
@dataclass
class MatePin:
from_: PinClass
to: PinClass
arrow: Arrow
@dataclass
class MateComponent:
from_: str # Designator
to: str # Designator
arrow: Arrow

632
src/wireviz/wv_graphviz.py Normal file
View File

@ -0,0 +1,632 @@
# -*- coding: utf-8 -*-
import re
import warnings
from itertools import zip_longest
from typing import Any, List, Optional, Tuple, Union
from wireviz import APP_NAME, APP_URL, __version__
from wireviz.wv_bom import partnumbers2list
from wireviz.wv_colors import MultiColor
from wireviz.wv_dataclasses import (
ArrowDirection,
ArrowWeight,
Cable,
Component,
Connector,
MateComponent,
MatePin,
Options,
PartNumberInfo,
ShieldClass,
WireClass,
)
from wireviz.wv_html import Img, Table, Td, Tr
from wireviz.wv_utils import html_line_breaks, remove_links
def gv_node_component(component: Component) -> Table:
# If no wires connected (except maybe loop wires)?
if isinstance(component, Connector):
if not (component.ports_left or component.ports_right):
component.ports_left = True # Use left side pins by default
# generate all rows to be shown in the node
if component.show_name:
str_name = f"{remove_links(component.designator)}"
line_name = Td(str_name, bgcolor=component.bgcolor_title.html)
else:
line_name = None
line_pn = partnumbers2list(component.partnumbers)
is_simple_connector = (
isinstance(component, Connector) and component.style == "simple"
)
if isinstance(component, Connector):
line_info = [
bom_bubble(component.bom_id),
html_line_breaks(component.type),
html_line_breaks(component.subtype),
f"{component.pincount}-pin" if component.show_pincount else None,
str(component.color) if component.color else None,
]
elif isinstance(component, Cable):
line_info = [
bom_bubble(component.bom_id) if component.category != "bundle" else None,
html_line_breaks(component.type),
f"{component.wirecount}x" if component.show_wirecount else None,
component.gauge_str_with_equiv,
"+ S" if component.shield else None,
component.length_str,
str(component.color) if component.color else None,
]
if component.additional_parameters:
line_additional_parameters = nested_table_dict(component.additional_parameters)
else:
line_additional_parameters = []
if component.color:
line_info.extend(colorbar_cells(component.color))
line_image, line_image_caption = image_and_caption_cells(component)
line_additional_component_table = gv_additional_component_table(component)
line_notes = [Td(html_line_breaks(component.notes), balign="left")]
if isinstance(component, Connector):
if component.style != "simple":
line_ports = gv_pin_table(component)
else:
line_ports = None
elif isinstance(component, Cable):
line_ports = gv_conductor_table(component)
lines = [
line_name,
line_pn,
line_info,
line_additional_parameters,
line_ports,
line_image,
line_image_caption,
line_additional_component_table,
line_notes,
]
tbl = nested_table(lines)
if is_simple_connector:
# Simple connectors have no pin table, and therefore, no ports to attach wires to.
# Manually assign left and right ports here if required.
# Use table itself for right port, and the first cell for left port.
# Even if the table only has one cell, two separate ports can still be assigned.
tbl.update_attribs(port="p1r")
first_cell_in_tbl = tbl.contents[0].contents
first_cell_in_tbl.update_attribs(port="p1l")
return tbl
def gv_additional_component_table(component):
if not component.additional_components:
return None
rows = []
for subitem in component.additional_components:
if subitem.explicit_qty:
text_qty, unit_qty = subitem.qty_computed, "x"
if subitem.amount_computed is not None:
text_desc = f"{subitem.amount_computed.number} {subitem.amount_computed.unit} {subitem.description}"
else:
text_desc = f"{subitem.description}"
else:
if subitem.amount_computed is not None:
text_qty, unit_qty = (
subitem.amount_computed.number,
subitem.amount_computed.unit,
)
else:
text_qty, unit_qty = "1", "x"
text_desc = subitem.description
firstline = [
Td(bom_bubble(subitem.bom_id)),
Td(text_qty, align="right"),
Td(unit_qty, align="left"),
Td(text_desc, align="left"),
Td(f"{subitem.note if subitem.note else ''}", align="left"),
]
rows.append(Tr(firstline))
if subitem.has_pn_info:
pn_list = partnumbers2list(subitem.partnumbers)
secondline = [
Td("", colspan=3),
Td(", ".join(pn for pn in pn_list if pn), align="left"),
Td(""),
]
rows.append(Tr(secondline))
return Table(rows, border=1, cellborder=0, cellpadding=3, cellspacing=0)
def calculate_node_bgcolor(component, harness_options):
# assign component node bgcolor at the GraphViz node level
# instead of at the HTML table level for better rendering of node outline
if component.bgcolor:
return component.bgcolor.html
elif isinstance(component, Connector) and harness_options.bgcolor_connector:
return harness_options.bgcolor_connector.html
elif (
isinstance(component, Cable)
and component.category == "bundle"
and harness_options.bgcolor_bundle
):
return harness_options.bgcolor_bundle.html
elif isinstance(component, Cable) and harness_options.bgcolor_cable:
return harness_options.bgcolor_cable.html
def bom_bubble(id) -> Table:
if id is None:
return None
else:
# TODO: activate BOM bubbles
return None
# size and style of BOM bubble is optimized to be a rounded square,
# big enough to hold any two-digit ID without GraphViz warnings
text = id
# text = f'<FONT COLOR="#FFFFFF">{id}</FONT>'
return Table(
Tr(
Td(
text,
border=1,
cellpadding=0,
fixedsize="true",
style="rounded",
height=20,
width=20,
# bgcolor="#000000",
)
),
border=0,
)
def make_list_of_cells(inp) -> List[Td]:
# inp may be List,
if isinstance(inp, List):
# ensure all list items are Td
list_out = [item if isinstance(item, Td) else Td(item) for item in inp]
return list_out
else:
if inp is None:
return []
if isinstance(inp, Td):
return [inp]
else:
return [Td(inp)]
def nested_table(lines: List[Td]) -> Table:
cell_lists = [make_list_of_cells(line) for line in lines]
rows = []
for lst in cell_lists:
if len(lst) == 0:
continue # no cells in list
cells = [item for item in lst if item.contents is not None]
if len(cells) == 0:
continue # no cells in list, or all cells are None
if (
len(cells) == 1
and isinstance(cells[0].contents, Table)
and not "!" in cells[0].contents.attribs.get("id", "")
):
# cell content is already a table, no need to re-wrap it;
# unless explicitly asked to by a "!" in the ID field
# as used by image_and_caption_cells()
inner_table = cells[0].contents
else:
# nest cell content inside a table
inner_table = Table(
Tr(cells), border=0, cellborder=1, cellpadding=3, cellspacing=0
)
rows.append(Tr(Td(inner_table)))
if len(rows) == 0: # create dummy row to avoid GraphViz errors due to empty <table>
inner_table = Table(
Tr(Td("")), border=0, cellborder=1, cellpadding=3, cellspacing=0
)
rows = [Tr(Td(inner_table))]
tbl = Table(rows, border=0, cellspacing=0, cellpadding=0)
return tbl
def nested_table_dict(d: dict) -> Table:
rows = []
for k, v in d.items():
rows.append(
Tr(
[
Td(k, align="left", balign="left", valign="top"),
Td(html_line_breaks(v), align="left", balign="left"),
]
)
)
return Table(rows, border=0, cellborder=1, cellpadding=3, cellspacing=0)
def gv_pin_table(component) -> Table:
pin_rows = []
for pin in component.pin_objects.values():
if component.should_show_pin(pin.id):
pin_rows.append(gv_pin_row(pin, component))
if len(pin_rows) == 0:
# TODO: write test for empty pin tables, and for unconnected connectors that hide disconnected pins
pass
tbl = Table(pin_rows, border=0, cellborder=1, cellpadding=3, cellspacing=0)
return tbl
def gv_pin_row(pin, connector) -> Tr:
# ports in GraphViz are 1-indexed for more natural maping to pin/wire numbers
has_pincolors = any([_pin.color for _pin in connector.pin_objects.values()])
cells = [
Td(pin.id, port=f"p{pin.index+1}l") if connector.ports_left else None,
Td(pin.label, delete_if_empty=True),
Td(str(pin.color) if pin.color else "", sides="TBL") if has_pincolors else None,
Td(color_minitable(pin.color), sides="TBR") if has_pincolors else None,
Td(pin.id, port=f"p{pin.index+1}r") if connector.ports_right else None,
]
return Tr(cells)
def gv_connector_loops(connector: Connector) -> List:
loop_edges = []
if connector.ports_left:
loop_side = "l"
loop_dir = "w"
elif connector.ports_right:
loop_side = "r"
loop_dir = "e"
else:
raise Exception("No side for loops")
for loop in connector.loops:
head = f"{connector.designator}:p{loop[0]}{loop_side}:{loop_dir}"
tail = f"{connector.designator}:p{loop[1]}{loop_side}:{loop_dir}"
loop_edges.append((head, tail))
return loop_edges
def gv_conductor_table(cable) -> Table:
rows = []
rows.append(Tr(Td("&nbsp;"))) # spacer row on top
inserted_break_inbetween = False
for wire in cable.wire_objects.values():
# insert blank space between wires and shields
if isinstance(wire, ShieldClass) and not inserted_break_inbetween:
rows.append(Tr(Td("&nbsp;"))) # spacer row between wires and shields
inserted_break_inbetween = True
# row above the wire
wireinfo = []
if cable.show_wirenumbers and not isinstance(wire, ShieldClass):
wireinfo.append(str(wire.id))
wireinfo.append(str(wire.color))
wireinfo.append(wire.label)
ins, outs = [], []
for conn in cable._connections:
if conn.via.id == wire.id:
if conn.from_ is not None:
ins.append(str(conn.from_))
if conn.to is not None:
outs.append(str(conn.to))
cells_above = [
Td(" " + ", ".join(ins), align="left"),
Td(" "), # increase cell spacing here
Td(bom_bubble(wire.bom_id)) if cable.category == "bundle" else None,
Td(":".join([wi for wi in wireinfo if wi is not None and wi != ""])),
Td(" "), # increase cell spacing here
Td(", ".join(outs) + " ", align="right"),
]
cells_above = [cell for cell in cells_above if cell is not None]
rows.append(Tr(cells_above))
# the wire itself
rows.append(Tr(gv_wire_cell(wire, len(cells_above))))
# row below the wire
if wire.partnumbers:
cells_below = partnumbers2list(
wire.partnumbers, parent_partnumbers=cable.partnumbers
)
if cells_below is not None and len(cells_below) > 0:
table_below = (
Table(
Tr([Td(cell) for cell in cells_below]),
border=0,
cellborder=0,
cellspacing=0,
),
)
rows.append(Tr(Td(table_below, colspan=len(cells_above))))
rows.append(Tr(Td("&nbsp;"))) # spacer row on bottom
tbl = Table(rows, border=0, cellborder=0, cellspacing=0)
return tbl
def gv_wire_cell(wire: Union[WireClass, ShieldClass], colspan: int) -> Td:
if wire.color:
color_list = ["#000000"] + wire.color.html_padded_list + ["#000000"]
else:
color_list = ["#000000"]
wire_inner_rows = []
for j, bgcolor in enumerate(color_list[::-1]):
wire_inner_cell_attribs = {
"bgcolor": bgcolor if bgcolor != "" else "#000000",
"border": 0,
"cellpadding": 0,
"colspan": colspan,
"height": 2,
}
wire_inner_rows.append(Tr(Td("", **wire_inner_cell_attribs)))
wire_inner_table = Table(wire_inner_rows, border=0, cellborder=0, cellspacing=0)
wire_outer_cell_attribs = {
"border": 0,
"cellspacing": 0,
"cellpadding": 0,
"colspan": colspan,
"height": 2 * len(color_list),
"port": f"w{wire.index+1}",
}
# ports in GraphViz are 1-indexed for more natural maping to pin/wire numbers
wire_outer_cell = Td(wire_inner_table, **wire_outer_cell_attribs)
return wire_outer_cell
def gv_edge_wire(harness, cable, connection) -> Tuple[str, str, str, str, str]:
if connection.via.color:
# check if it's an actual wire and not a shield
color = f"#000000:{connection.via.color.html_padded}:#000000"
else: # it's a shield connection
color = "#000000"
if connection.from_ is not None: # connect to left
from_port_str = (
f":p{connection.from_.index+1}r"
if harness.connectors[connection.from_.parent].style != "simple"
else ""
)
code_left_1 = f"{connection.from_.parent}{from_port_str}:e"
code_left_2 = f"{connection.via.parent}:w{connection.via.index+1}:w"
# ports in GraphViz are 1-indexed for more natural maping to pin/wire numbers
else:
code_left_1, code_left_2 = None, None
if connection.to is not None: # connect to right
to_port_str = (
f":p{connection.to.index+1}l"
if harness.connectors[connection.to.parent].style != "simple"
else ""
)
code_right_1 = f"{connection.via.parent}:w{connection.via.index+1}:e"
code_right_2 = f"{connection.to.parent}{to_port_str}:w"
else:
code_right_1, code_right_2 = None, None
return color, code_left_1, code_left_2, code_right_1, code_right_2
def parse_arrow_str(inp: str) -> ArrowDirection:
if inp[0] == "<" and inp[-1] == ">":
return ArrowDirection.BOTH
elif inp[0] == "<":
return ArrowDirection.BACK
elif inp[-1] == ">":
return ArrowDirection.FORWARD
else:
return ArrowDirection.NONE
def gv_edge_mate(mate) -> Tuple[str, str, str, str]:
if mate.arrow.weight == ArrowWeight.SINGLE:
color = "#000000"
elif mate.arrow.weight == ArrowWeight.DOUBLE:
color = "#000000:#000000"
dir = mate.arrow.direction.name.lower()
if isinstance(mate, MatePin):
from_pin_index = mate.from_.index
from_port_str = f":p{from_pin_index+1}r"
from_designator = mate.from_.parent
to_pin_index = mate.to.index
to_port_str = f":p{to_pin_index+1}l"
to_designator = mate.to.parent
elif isinstance(mate, MateComponent):
from_designator = mate.from_
from_port_str = ""
to_designator = mate.to
to_port_str = ""
else:
raise Exception(f"Unknown type of mate:\n{mate}")
code_from = f"{from_designator}{from_port_str}:e"
code_to = f"{to_designator}{to_port_str}:w"
return color, dir, code_from, code_to
def colorbar_cells(color, mini=False) -> List[Td]:
cells = []
mini = {"height": 8, "width": 8, "fixedsize": "true"} if mini else {}
for index, subcolor in enumerate(color.colors):
sides_l = "L" if index == 0 else ""
sides_r = "R" if index == len(color.colors) - 1 else ""
sides = "TB" + sides_l + sides_r
cells.append(Td("", bgcolor=subcolor.html, sides=sides, **mini))
return cells
def color_minitable(color: Optional[MultiColor]) -> Union[Table, str]:
if color is None or len(color) == 0:
return ""
cells = colorbar_cells(color, mini=True)
return Table(
Tr(cells),
border=0,
cellborder=1,
cellspacing=0,
height=8,
width=8 * len(cells),
fixedsize="true",
)
def image_and_caption_cells(component: Component) -> Tuple[Td, Td]:
if not component.image:
return (None, None)
image_tag = Img(scale=component.image.scale, src=component.image.src)
image_cell_inner = Td(image_tag, flat=True)
if component.image.fixedsize:
# further nest the image in a table with width/height/fixedsize parameters,
# and place that table in a cell
image_cell_inner.update_attribs(**html_size_attr_dict(component.image))
image_cell = Td(
Table(Tr(image_cell_inner), border=0, cellborder=0, cellspacing=0, id="!")
)
else:
image_cell = image_cell_inner
image_cell.update_attribs(
balign="left",
bgcolor=component.image.bgcolor.html,
sides="TLR" if component.image.caption else None,
)
if component.image.caption:
caption_cell = Td(
f"{html_line_breaks(component.image.caption)}", balign="left", sides="BLR"
)
else:
caption_cell = None
return (image_cell, caption_cell)
def html_size_attr_dict(image):
# Return Graphviz HTML attributes to specify minimum or fixed size of a TABLE or TD object
pass
attr_dict = {}
if image:
if image.width:
attr_dict["width"] = image.width
if image.height:
attr_dict["height"] = image.height
if image.fixedsize:
attr_dict["fixedsize"] = "true"
return attr_dict
def set_dot_basics(dot, options):
dot.body.append(f"// Graph generated by {APP_NAME} {__version__}\n")
dot.body.append(f"// {APP_URL}\n")
dot.attr(
"graph",
rankdir="LR",
ranksep="2",
bgcolor=options.bgcolor.html,
nodesep="0.33",
fontname=options.fontname,
)
dot.attr(
"node",
shape="none",
width="0",
height="0",
margin="0", # Actual size of the node is entirely determined by the label.
style="filled",
fillcolor=options.bgcolor_node.html,
fontname=options.fontname,
)
dot.attr("edge", style="bold", fontname=options.fontname)
def apply_dot_tweaks(dot, tweak):
def typecheck(name: str, value: Any, expect: type) -> None:
if not isinstance(value, expect):
raise Exception(
f"Unexpected value type of {name}: "
f"Expected {expect}, got {type(value)}\n{value}"
)
# TODO?: Differ between override attributes and HTML?
if tweak.override is not None:
typecheck("tweak.override", tweak.override, dict)
for k, d in tweak.override.items():
typecheck(f"tweak.override.{k} key", k, str)
typecheck(f"tweak.override.{k} value", d, dict)
for a, v in d.items():
typecheck(f"tweak.override.{k}.{a} key", a, str)
typecheck(f"tweak.override.{k}.{a} value", v, (str, type(None)))
# Override generated attributes of selected entries matching tweak.override.
for i, entry in enumerate(dot.body):
if not isinstance(entry, str):
continue
# Find a possibly quoted keyword after leading TAB(s) and followed by [ ].
match = re.match(r'^\t*(")?((?(1)[^"]|[^ "])+)(?(1)") \[.*\]$', entry, re.S)
keyword = match and match[2]
if not keyword in tweak.override.keys():
continue
for attr, value in tweak.override[keyword].items():
if value is None:
entry, n_subs = re.subn(
f'( +)?{attr}=("[^"]*"|[^] ]*)(?(1)| *)', "", entry
)
if n_subs < 1:
warnings.warn(f"tweak: {attr} not found in {keyword}!")
elif n_subs > 1:
warnings.warn(
f"tweak: {attr} removed {n_subs} times in {keyword}!"
)
continue
if len(value) == 0 or " " in value:
value = value.replace('"', r"\"")
value = f'"{value}"'
entry, n_subs = re.subn(
f'{attr}=("[^"]*"|[^] ]*)', f"{attr}={value}", entry
)
if n_subs < 1:
# If attr not found, then append it
entry = re.sub(r"\]$", f" {attr}={value}]", entry)
elif n_subs > 1:
warnings.warn(
f"tweak: {attr} overridden {n_subs} times in {keyword}!"
)
dot.body[i] = entry
if tweak.append is not None:
if isinstance(tweak.append, list):
for i, element in enumerate(tweak.append, 1):
typecheck(f"tweak.append[{i}]", element, str)
dot.body.extend(tweak.append)
else:
typecheck("tweak.append", tweak.append, str)
dot.body.append(tweak.append)

View File

@ -1,111 +0,0 @@
# -*- coding: utf-8 -*-
import re
from typing import List, Optional, Union
from wireviz.DataClasses import Color
from wireviz.wv_colors import translate_color
from wireviz.wv_helper import remove_links
def nested_html_table(
rows: List[Union[str, List[Optional[str]], None]], table_attrs: str = ""
) -> str:
# input: list, each item may be scalar or list
# output: a parent table with one child table per parent item that is list, and one cell per parent item that is scalar
# purpose: create the appearance of one table, where cell widths are independent between rows
# attributes in any leading <tdX> inside a list are injected into to the preceeding <td> tag
html = []
html.append(
f'<table border="0" cellspacing="0" cellpadding="0"{table_attrs or ""}>'
)
num_rows = 0
for row in rows:
if isinstance(row, List):
if len(row) > 0 and any(row):
html.append(" <tr><td>")
# fmt: off
html.append(' <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>')
# fmt: on
for cell in row:
if cell is not None:
# Inject attributes to the preceeding <td> tag where needed
# fmt: off
html.append(f' <td balign="left">{cell}</td>'.replace("><tdX", ""))
# fmt: on
html.append(" </tr></table>")
html.append(" </td></tr>")
num_rows = num_rows + 1
elif row is not None:
html.append(" <tr><td>")
html.append(f" {row}")
html.append(" </td></tr>")
num_rows = num_rows + 1
if num_rows == 0: # empty table
# generate empty cell to avoid GraphViz errors
html.append("<tr><td></td></tr>")
html.append("</table>")
return html
def html_bgcolor_attr(color: Color) -> str:
"""Return attributes for bgcolor or '' if no color."""
return f' bgcolor="{translate_color(color, "HEX")}"' if color else ""
def html_bgcolor(color: Color, _extra_attr: str = "") -> str:
"""Return <td> attributes prefix for bgcolor or '' if no color."""
return f"<tdX{html_bgcolor_attr(color)}{_extra_attr}>" if color else ""
def html_colorbar(color: Color) -> str:
"""Return <tdX> attributes prefix for bgcolor and minimum width or None if no color."""
return html_bgcolor(color, ' width="4"') if color else None
def html_image(image):
from wireviz.DataClasses import Image
if not image:
return None
# The leading attributes belong to the preceeding tag. See where used below.
html = f'{html_size_attr(image)}><img scale="{image.scale}" src="{image.src}"/>'
if image.fixedsize:
# Close the preceeding tag and enclose the image cell in a table without
# borders to avoid narrow borders when the fixed width < the node width.
html = f""">
<table border="0" cellspacing="0" cellborder="0"><tr>
<td{html}</td>
</tr></table>
"""
return f"""<tdX{' sides="TLR"' if image.caption else ''}{html_bgcolor_attr(image.bgcolor)}{html}"""
def html_caption(image):
from wireviz.DataClasses import Image
return (
f'<tdX sides="BLR"{html_bgcolor_attr(image.bgcolor)}>{html_line_breaks(image.caption)}'
if image and image.caption
else None
)
def html_size_attr(image):
from wireviz.DataClasses import Image
# Return Graphviz HTML attributes to specify minimum or fixed size of a TABLE or TD object
return (
(
(f' width="{image.width}"' if image.width else "")
+ (f' height="{image.height}"' if image.height else "")
+ (' fixedsize="true"' if image.fixedsize else "")
)
if image
else ""
)
def html_line_breaks(inp):
return remove_links(inp).replace("\n", "<br />") if isinstance(inp, str) else inp

441
src/wireviz/wv_harness.py Normal file
View File

@ -0,0 +1,441 @@
# -*- coding: utf-8 -*-
from collections import defaultdict
from dataclasses import dataclass, field
from pathlib import Path
from typing import List, Union
from graphviz import Graph
import wireviz.wv_colors
from wireviz.wv_bom import BomCategory, BomEntry, bom_list, print_bom_table
from wireviz.wv_dataclasses import (
AUTOGENERATED_PREFIX,
AdditionalBomItem,
Arrow,
ArrowWeight,
Cable,
Component,
Connector,
MateComponent,
MatePin,
Metadata,
Options,
Side,
TopLevelGraphicalComponent,
Tweak,
)
from wireviz.wv_graphviz import (
apply_dot_tweaks,
calculate_node_bgcolor,
gv_connector_loops,
gv_edge_mate,
gv_edge_wire,
gv_node_component,
parse_arrow_str,
set_dot_basics,
)
from wireviz.wv_output import (
embed_svg_images,
embed_svg_images_file,
generate_html_output,
)
from wireviz.wv_utils import bom2tsv, open_file_write
@dataclass
class Harness:
metadata: Metadata
options: Options
tweak: Tweak
additional_bom_items: List[AdditionalBomItem] = field(default_factory=list)
def __post_init__(self):
self.connectors = {}
self.cables = {}
self.mates = []
self.bom = defaultdict(dict)
self.additional_bom_items = []
def add_connector(self, designator: str, *args, **kwargs) -> None:
conn = Connector(designator=designator, *args, **kwargs)
self.connectors[designator] = conn
def add_cable(self, designator: str, *args, **kwargs) -> None:
cbl = Cable(designator=designator, *args, **kwargs)
self.cables[designator] = cbl
def add_additional_bom_item(self, item: dict) -> None:
new_item = AdditionalBomItem(**item)
self.additional_bom_items.append(new_item)
def add_mate_pin(self, from_name, from_pin, to_name, to_pin, arrow_str) -> None:
from_con = self.connectors[from_name]
from_pin_obj = from_con.pin_objects[from_pin]
to_con = self.connectors[to_name]
to_pin_obj = to_con.pin_objects[to_pin]
arrow = Arrow(direction=parse_arrow_str(arrow_str), weight=ArrowWeight.SINGLE)
self.mates.append(MatePin(from_pin_obj, to_pin_obj, arrow))
self.connectors[from_name].activate_pin(
from_pin, Side.RIGHT, is_connection=False
)
self.connectors[to_name].activate_pin(to_pin, Side.LEFT, is_connection=False)
def add_mate_component(self, from_name, to_name, arrow_str) -> None:
arrow = Arrow(direction=parse_arrow_str(arrow_str), weight=ArrowWeight.SINGLE)
self.mates.append(MateComponent(from_name, to_name, arrow))
def populate_bom(self): # called once harness creation is complete
# helper lists
all_toplevel_items = (
list(self.connectors.values())
+ list(self.cables.values())
+ self.additional_bom_items
)
all_subitems = [
subitem
for item in all_toplevel_items
for subitem in item.additional_components
]
all_bom_relevant_items = (
list(self.connectors.values())
+ [cable for cable in self.cables.values() if cable.category != "bundle"]
+ [
wire
for cable in self.cables.values()
if cable.category == "bundle"
for wire in cable.wire_objects.values()
]
+ all_subitems
)
# add items to BOM
for item in all_toplevel_items:
self._add_to_internal_bom(item) # nested subitems are also handled
# sort BOM by category first, then alphabetically by description within category
self.bom = dict(
sorted(
self.bom.items(),
key=lambda x: (
x[1]["category"],
x[0].description,
), # x[0] = key, x[1] = value
)
)
# assign BOM IDs
for id, key in enumerate(self.bom.keys(), 1):
self.bom[key]["id"] = id
# set BOM IDs within components (for BOM bubbles)
for item in all_bom_relevant_items:
if item.ignore_in_bom:
continue
if not item.bom_hash in self.bom:
print(f"{item}'s hash' not found in BOM dict.") # Should not happen
continue
item.bom_id = self.bom[item.bom_hash]["id"]
def _add_to_internal_bom(self, item: Component):
if item.ignore_in_bom:
return
def _add(hash, qty, designator=None, category=None):
bom_entry = self.bom[hash]
# initialize missing fields
if not "qty" in bom_entry:
bom_entry["qty"] = 0
if not "designators" in bom_entry:
bom_entry["designators"] = set()
# update fields
bom_entry["qty"] += qty
if designator is None:
designator_list = []
elif isinstance(designator, list):
designator_list = designator
else:
designator_list = [designator]
for des in designator_list:
if des and not des.startswith(AUTOGENERATED_PREFIX):
bom_entry["designators"].add(des)
bom_entry["category"] = category
if isinstance(item, TopLevelGraphicalComponent):
if isinstance(item, Connector):
cat = BomCategory.CONNECTOR
elif isinstance(item, Cable):
if item.category == "bundle":
cat = BomCategory.WIRE
else:
cat = BomCategory.CABLE
else:
cat = ""
if item.category == "bundle":
# wires of a bundle are added as individual BOM entries
for subitem in item.wire_objects.values():
_add(
hash=subitem.bom_hash,
qty=item.qty, # should be 1
designator=item.designator, # inherit from parent item
category=cat,
)
else:
_add(
hash=item.bom_hash,
qty=item.qty, # should be 1
designator=item.designator,
category=cat,
)
if item.additional_components:
item.compute_qty_multipliers()
for comp in item.additional_components:
if comp.ignore_in_bom:
continue
if comp.sum_amounts_in_bom:
if comp.amount_computed:
total_qty = comp.qty_computed * comp.amount_computed.number
else:
total_qty = comp.qty_computed
else:
total_qty = comp.qty_computed
_add(
hash=comp.bom_hash,
designator=item.designator,
qty=total_qty,
# no explicit qty specified; assume qty = 1
# used to simplify add.comp. table within parent node
# e.g. show "10 mm Heatshrink" instead of "1x 10 mm Heatshrink"
category=BomCategory.ADDITIONAL_INSIDE,
)
elif isinstance(item, AdditionalBomItem):
cat = BomCategory.ADDITIONAL_OUTSIDE
_add(
hash=item.bom_hash,
qty=item.qty,
designator=None,
category=cat,
)
else:
raise Exception(f"Unknown type of item:\n{item}")
def connect(
self,
from_name: str,
from_pin: Union[int, str],
via_name: str,
via_wire: Union[int, str],
to_name: str,
to_pin: Union[int, str],
) -> None:
# check from and to connectors
for name, pin in zip([from_name, to_name], [from_pin, to_pin]):
if name is not None and name in self.connectors:
connector = self.connectors[name]
# check if provided name is ambiguous
if pin in connector.pins and pin in connector.pinlabels:
if connector.pins.index(pin) != connector.pinlabels.index(pin):
raise Exception(
f"{name}:{pin} is defined both in pinlabels and pins, "
"for different pins."
)
# TODO: Maybe issue a warning if present in both lists
# but referencing the same pin?
if pin in connector.pinlabels:
if connector.pinlabels.count(pin) > 1:
raise Exception(f"{name}:{pin} is defined more than once.")
index = connector.pinlabels.index(pin)
pin = connector.pins[index] # map pin name to pin number
if name == from_name:
from_pin = pin
if name == to_name:
to_pin = pin
if not pin in connector.pins:
raise Exception(f"{name}:{pin} not found.")
# check via cable
if via_name in self.cables:
cable = self.cables[via_name]
# check if provided name is ambiguous
if via_wire in cable.colors and via_wire in cable.wirelabels:
if cable.colors.index(via_wire) != cable.wirelabels.index(via_wire):
raise Exception(
f"{via_name}:{via_wire} is defined both in colors and wirelabels, "
"for different wires."
)
# TODO: Maybe issue a warning if present in both lists
# but referencing the same wire?
if via_wire in cable.colors:
if cable.colors.count(via_wire) > 1:
raise Exception(
f"{via_name}:{via_wire} is used for more than one wire."
)
# list index starts at 0, wire IDs start at 1
via_wire = cable.colors.index(via_wire) + 1
elif via_wire in cable.wirelabels:
if cable.wirelabels.count(via_wire) > 1:
raise Exception(
f"{via_name}:{via_wire} is used for more than one wire."
)
via_wire = (
cable.wirelabels.index(via_wire) + 1
) # list index starts at 0, wire IDs start at 1
# perform the actual connection
if from_name is not None:
from_con = self.connectors[from_name]
from_pin_obj = from_con.pin_objects[from_pin]
else:
from_pin_obj = None
if to_name is not None:
to_con = self.connectors[to_name]
to_pin_obj = to_con.pin_objects[to_pin]
else:
to_pin_obj = None
self.cables[via_name]._connect(from_pin_obj, via_wire, to_pin_obj)
if from_name in self.connectors:
self.connectors[from_name].activate_pin(from_pin, Side.RIGHT)
if to_name in self.connectors:
self.connectors[to_name].activate_pin(to_pin, Side.LEFT)
def create_graph(self) -> Graph:
dot = Graph()
set_dot_basics(dot, self.options)
for connector in self.connectors.values():
# generate connector node
gv_html = gv_node_component(connector)
gv_html.update_attribs(
bgcolor=calculate_node_bgcolor(connector, self.options)
)
dot.node(
connector.designator,
label=f"<\n{gv_html}\n>",
shape="box",
style="filled",
)
# generate edges for connector loops
if len(connector.loops) > 0:
dot.attr("edge", color="#000000")
loops = gv_connector_loops(connector)
for head, tail in loops:
dot.edge(head, tail)
# determine if there are double- or triple-colored wires in the harness;
# if so, pad single-color wires to make all wires of equal thickness
wire_is_multicolor = [
len(wire.color) > 1
for cable in self.cables.values()
for wire in cable.wire_objects.values()
]
if any(wire_is_multicolor):
wireviz.wv_colors.padding_amount = 3
else:
wireviz.wv_colors.padding_amount = 1
for cable in self.cables.values():
# generate cable node
# TODO: PN info for bundles (per wire)
gv_html = gv_node_component(cable)
gv_html.update_attribs(bgcolor=calculate_node_bgcolor(cable, self.options))
style = "filled,dashed" if cable.category == "bundle" else "filled"
dot.node(
cable.designator,
label=f"<\n{gv_html}\n>",
shape="box",
style=style,
)
# generate wire edges between component nodes and cable nodes
for connection in cable._connections:
color, l1, l2, r1, r2 = gv_edge_wire(self, cable, connection)
dot.attr("edge", color=color)
if not (l1, l2) == (None, None):
dot.edge(l1, l2)
if not (r1, r2) == (None, None):
dot.edge(r1, r2)
for mate in self.mates:
color, dir, code_from, code_to = gv_edge_mate(mate)
dot.attr("edge", color=color, style="dashed", dir=dir)
dot.edge(code_from, code_to)
apply_dot_tweaks(dot, self.tweak)
return dot
# cache for the GraphViz Graph object
# do not access directly, use self.graph instead
_graph = None
@property
def graph(self):
if not self._graph: # no cached graph exists, generate one
self._graph = self.create_graph()
return self._graph # return cached graph
@property
def png(self):
from io import BytesIO
graph = self.graph
data = BytesIO()
data.write(graph.pipe(format="png"))
data.seek(0)
return data.read()
@property
def svg(self):
graph = self.graph
return embed_svg_images(graph.pipe(format="svg").decode("utf-8"), Path.cwd())
def output(
self,
filename: Union[str, Path],
view: bool = False,
cleanup: bool = True,
fmt: tuple = ("html", "png", "svg", "tsv"),
) -> None:
# graphical output
graph = self.graph
for f in fmt:
if f in ("png", "svg", "html"):
if f == "html": # if HTML format is specified,
f = "svg" # generate SVG for embedding into HTML
# SVG file will be renamed/deleted later
_filename = f"{filename}.tmp" if f == "svg" else filename
# TODO: prevent rendering SVG twice when both SVG and HTML are specified
graph.format = f
graph.render(filename=_filename, view=view, cleanup=cleanup)
# embed images into SVG output
if "svg" in fmt or "html" in fmt:
embed_svg_images_file(f"{filename}.tmp.svg")
# GraphViz output
if "gv" in fmt:
graph.save(filename=f"{filename}.gv")
# BOM output
bomlist = bom_list(self.bom)
# bomlist = [[]]
if "tsv" in fmt:
tsv = bom2tsv(bomlist)
open_file_write(f"{filename}.tsv").write(tsv)
if "csv" in fmt:
# TODO: implement CSV output (preferrably using CSV library)
print("CSV output is not yet supported")
# HTML output
if "html" in fmt:
generate_html_output(filename, bomlist, self.metadata, self.options)
# PDF output
if "pdf" in fmt:
# TODO: implement PDF output
print("PDF output is not yet supported")
# delete SVG if not needed
if "html" in fmt and not "svg" in fmt:
# SVG file was just needed to generate HTML
Path(f"{filename}.tmp.svg").unlink()
elif "svg" in fmt:
Path(f"{filename}.tmp.svg").replace(f"{filename}.svg")

View File

@ -1,119 +1,125 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import re from collections.abc import Iterable
from pathlib import Path from dataclasses import dataclass, field
from typing import Dict, List, Union from typing import Dict
from wireviz import APP_NAME, APP_URL, __version__, wv_colors indent_count = 1
from wireviz.DataClasses import Metadata, Options
from wireviz.wv_gv_html import html_line_breaks
from wireviz.wv_helper import (
flatten2d,
open_file_read,
open_file_write,
smart_file_resolve,
)
def generate_html_output( class Attribs(Dict):
filename: Union[str, Path], def __repr__(self):
bom_list: List[List[str]], if len(self) == 0:
metadata: Metadata, return ""
options: Options,
):
# load HTML template html = []
templatename = metadata.get("template", {}).get("name") for k, v in self.items():
if templatename: if v is not None:
# if relative path to template was provided, check directory of YAML file first, fall back to built-in template directory html.append(f' {k}="{v}"')
templatefile = smart_file_resolve( # else:
f"{templatename}.html", # html.append(f" {k}")
[Path(filename).parent, Path(__file__).parent / "templates"], return "".join(html)
)
@dataclass
class Tag:
contents = None
attribs: Attribs = field(default_factory=Attribs)
flat: bool = None
delete_if_empty: bool = False
def __init__(self, contents, flat=None, delete_if_empty=False, **kwargs):
self.contents = contents
self.flat = flat
self.delete_if_empty = delete_if_empty
self.attribs = Attribs({**kwargs})
def update_attribs(self, **kwargs):
for k, v in kwargs.items():
self.attribs[k] = v
@property
def tagname(self):
return type(self).__name__.lower()
@property
def auto_flat(self):
if self.flat is not None: # user specified
return self.flat
if not _is_iterable_not_str(self.contents): # catch str, int, float, ...
if not isinstance(self.contents, Tag): # avoid recursion
return not "\n" in str(self.contents) # flatten if single line
@property
def is_empty(self):
return self.get_contents(force_flat=True) == ""
def indent_lines(self, lines, force_flat=False):
if self.auto_flat or force_flat:
return lines
else: else:
# fall back to built-in simple template if no template was provided indenter = " " * indent_count
templatefile = Path(__file__).parent / "templates/simple.html" return "\n".join(f"{indenter}{line}" for line in lines.split("\n"))
html = open_file_read(templatefile).read() def get_contents(self, force_flat=False):
separator = "" if self.auto_flat or force_flat else "\n"
# embed SVG diagram if _is_iterable_not_str(self.contents):
with open_file_read(f"{filename}.tmp.svg") as file: return separator.join(
svgdata = re.sub( [
"^<[?]xml [^?>]*[?]>[^<]*<!DOCTYPE [^>]*>", self.indent_lines(str(c), force_flat)
"<!-- XML and DOCTYPE declarations from SVG file removed -->", for c in self.contents
file.read(), if c is not None
1, ]
) )
elif self.contents is None:
return ""
else: # str, int, float, etc.
return self.indent_lines(str(self.contents), force_flat)
# generate BOM table def __repr__(self):
bom = flatten2d(bom_list) separator = "" if self.auto_flat else "\n"
if self.delete_if_empty and self.is_empty:
return ""
else:
html = [
f"<{self.tagname}{str(self.attribs)}>",
f"{self.get_contents()}",
f"</{self.tagname}>",
]
html_joined = separator.join(html)
return html_joined
# generate BOM header (may be at the top or bottom of the table)
bom_header_html = " <tr>\n"
for item in bom[0]:
th_class = f"bom_col_{item.lower()}"
bom_header_html = f'{bom_header_html} <th class="{th_class}">{item}</th>\n'
bom_header_html = f"{bom_header_html} </tr>\n"
# generate BOM contents @dataclass
bom_contents = [] class TagSingleton(Tag):
for row in bom[1:]: def __init__(self, **kwargs):
row_html = " <tr>\n" self.attribs = Attribs({**kwargs})
for i, item in enumerate(row):
td_class = f"bom_col_{bom[0][i].lower()}"
row_html = f'{row_html} <td class="{td_class}">{item}</td>\n'
row_html = f"{row_html} </tr>\n"
bom_contents.append(row_html)
bom_html = ( def __repr__(self):
'<table class="bom">\n' + bom_header_html + "".join(bom_contents) + "</table>\n" return f"<{self.tagname}{str(self.attribs)} />"
)
bom_html_reversed = (
'<table class="bom">\n'
+ "".join(list(reversed(bom_contents)))
+ bom_header_html
+ "</table>\n"
)
# prepare simple replacements
replacements = {
"<!-- %generator% -->": f"{APP_NAME} {__version__} - {APP_URL}",
"<!-- %fontname% -->": options.fontname,
"<!-- %bgcolor% -->": wv_colors.translate_color(options.bgcolor, "hex"),
"<!-- %diagram% -->": svgdata,
"<!-- %bom% -->": bom_html,
"<!-- %bom_reversed% -->": bom_html_reversed,
"<!-- %sheet_current% -->": "1", # TODO: handle multi-page documents
"<!-- %sheet_total% -->": "1", # TODO: handle multi-page documents
}
# prepare metadata replacements def _is_iterable_not_str(inp):
if metadata: # str is iterable, but should be treated as not iterable
for item, contents in metadata.items(): return isinstance(inp, Iterable) and not isinstance(inp, str)
if isinstance(contents, (str, int, float)):
replacements[f"<!-- %{item}% -->"] = html_line_breaks(str(contents))
elif isinstance(contents, Dict): # useful for authors, revisions
for index, (category, entry) in enumerate(contents.items()):
if isinstance(entry, Dict):
replacements[f"<!-- %{item}_{index+1}% -->"] = str(category)
for entry_key, entry_value in entry.items():
replacements[
f"<!-- %{item}_{index+1}_{entry_key}% -->"
] = html_line_breaks(str(entry_value))
replacements['"sheetsize_default"'] = '"{}"'.format(
metadata.get("template", {}).get("sheetsize", "")
)
# include quotes so no replacement happens within <style> definition
# perform replacements @dataclass
# regex replacement adapted from: class Br(TagSingleton):
# https://gist.github.com/bgusach/a967e0587d6e01e889fd1d776c5f3729 pass
# longer replacements first, just in case
replacements_sorted = sorted(replacements, key=len, reverse=True)
replacements_escaped = map(re.escape, replacements_sorted)
pattern = re.compile("|".join(replacements_escaped))
html = pattern.sub(lambda match: replacements[match.group(0)], html)
open_file_write(f"{filename}.html").write(html) class Img(TagSingleton):
pass
class Td(Tag):
pass
class Tr(Tag):
pass
class Table(Tag):
pass

164
src/wireviz/wv_output.py Normal file
View File

@ -0,0 +1,164 @@
# -*- coding: utf-8 -*-
import base64
import re
from pathlib import Path
from typing import Dict, List, Union
import wireviz # for doing wireviz.__file__
from wireviz import APP_NAME, APP_URL, __version__
from wireviz.wv_dataclasses import Metadata, Options
from wireviz.wv_utils import (
html_line_breaks,
open_file_read,
open_file_write,
smart_file_resolve,
)
mime_subtype_replacements = {"jpg": "jpeg", "tif": "tiff"}
def embed_svg_images(svg_in: str, base_path: Union[str, Path] = Path.cwd()) -> str:
images_b64 = {} # cache of base64-encoded images
def image_tag(pre: str, url: str, post: str) -> str:
return f'<image{pre} xlink:href="{url}"{post}>'
def replace(match: re.Match) -> str:
imgurl = match["URL"]
if not imgurl in images_b64: # only encode/cache every unique URL once
imgurl_abs = (Path(base_path) / imgurl).resolve()
image = imgurl_abs.read_bytes()
images_b64[imgurl] = base64.b64encode(image).decode("utf-8")
return image_tag(
match["PRE"] or "",
f"data:image/{get_mime_subtype(imgurl)};base64, {images_b64[imgurl]}",
match["POST"] or "",
)
pattern = re.compile(
image_tag(r"(?P<PRE> [^>]*?)?", r'(?P<URL>[^"]*?)', r"(?P<POST> [^>]*?)?"),
re.IGNORECASE,
)
return pattern.sub(replace, svg_in)
def get_mime_subtype(filename: Union[str, Path]) -> str:
mime_subtype = Path(filename).suffix.lstrip(".").lower()
if mime_subtype in mime_subtype_replacements:
mime_subtype = mime_subtype_replacements[mime_subtype]
return mime_subtype
def embed_svg_images_file(
filename_in: Union[str, Path], overwrite: bool = True
) -> None:
filename_in = Path(filename_in).resolve()
filename_out = filename_in.with_suffix(".b64.svg")
filename_out.write_text(
embed_svg_images(filename_in.read_text(), filename_in.parent)
)
if overwrite:
filename_out.replace(filename_in)
def generate_html_output(
filename: Union[str, Path],
bom: List[List[str]],
metadata: Metadata,
options: Options,
):
# load HTML template
templatename = metadata.get("template", {}).get("name")
if templatename:
# if relative path to template was provided,
# check directory of YAML file first, fall back to built-in template directory
templatefile = smart_file_resolve(
f"{templatename}.html",
[Path(filename).parent, Path(__file__).parent / "templates"],
)
else:
# fall back to built-in simple template if no template was provided
templatefile = Path(wireviz.__file__).parent / "templates/simple.html"
html = open_file_read(templatefile).read()
# embed SVG diagram
with open_file_read(f"{filename}.tmp.svg") as file:
svgdata = re.sub(
"^<[?]xml [^?>]*[?]>[^<]*<!DOCTYPE [^>]*>",
"<!-- XML and DOCTYPE declarations from SVG file removed -->",
file.read(),
1,
)
# generate BOM table
# generate BOM header (may be at the top or bottom of the table)
bom_header_html = " <tr>\n"
for item in bom[0]:
th_class = f"bom_col_{item.lower()}"
bom_header_html = f'{bom_header_html} <th class="{th_class}">{item}</th>\n'
bom_header_html = f"{bom_header_html} </tr>\n"
# generate BOM contents
bom_contents = []
for row in bom[1:]:
row_html = " <tr>\n"
for i, item in enumerate(row):
td_class = f"bom_col_{bom[0][i].lower()}"
row_html = f'{row_html} <td class="{td_class}">{item if item is not None else ""}</td>\n'
row_html = f"{row_html} </tr>\n"
bom_contents.append(row_html)
bom_html = (
'<table class="bom">\n' + bom_header_html + "".join(bom_contents) + "</table>\n"
)
bom_html_reversed = (
'<table class="bom">\n'
+ "".join(list(reversed(bom_contents)))
+ bom_header_html
+ "</table>\n"
)
# prepare simple replacements
replacements = {
"<!-- %generator% -->": f"{APP_NAME} {__version__} - {APP_URL}",
"<!-- %fontname% -->": options.fontname,
"<!-- %bgcolor% -->": options.bgcolor.html,
"<!-- %diagram% -->": svgdata,
"<!-- %bom% -->": bom_html,
"<!-- %bom_reversed% -->": bom_html_reversed,
"<!-- %sheet_current% -->": "1", # TODO: handle multi-page documents
"<!-- %sheet_total% -->": "1", # TODO: handle multi-page documents
}
# prepare metadata replacements
if metadata:
for item, contents in metadata.items():
if isinstance(contents, (str, int, float)):
replacements[f"<!-- %{item}% -->"] = html_line_breaks(str(contents))
elif isinstance(contents, Dict): # useful for authors, revisions
for index, (category, entry) in enumerate(contents.items()):
if isinstance(entry, Dict):
replacements[f"<!-- %{item}_{index+1}% -->"] = str(category)
for entry_key, entry_value in entry.items():
replacements[
f"<!-- %{item}_{index+1}_{entry_key}% -->"
] = html_line_breaks(str(entry_value))
replacements['"sheetsize_default"'] = '"{}"'.format(
metadata.get("template", {}).get("sheetsize", "")
)
# include quotes so no replacement happens within <style> definition
# perform replacements
# regex replacement adapted from:
# https://gist.github.com/bgusach/a967e0587d6e01e889fd1d776c5f3729
# longer replacements first, just in case
replacements_sorted = sorted(replacements, key=len, reverse=True)
replacements_escaped = map(re.escape, replacements_sorted)
pattern = re.compile("|".join(replacements_escaped))
html = pattern.sub(lambda match: replacements[match.group(0)], html)
open_file_write(f"{filename}.html").write(html)

View File

@ -1,8 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import re import re
from collections import namedtuple
from pathlib import Path from pathlib import Path
from typing import Dict, List from typing import List, Optional, Union
NumberAndUnit = namedtuple("NumberAndUnit", "number unit")
awg_equiv_table = { awg_equiv_table = {
"0.09": "28", "0.09": "28",
@ -70,9 +73,40 @@ def expand(yaml_data):
def get_single_key_and_value(d: dict): def get_single_key_and_value(d: dict):
k = list(d.keys())[0] # used for defining a line in a harness' connection set
v = d[k] # E.g. for the YAML input `- X1: 1`
return (k, v) # this function returns a tuple in the form ("X1", "1")
return next(iter(d.items()))
def parse_number_and_unit(
inp: Optional[Union[NumberAndUnit, float, int, str]],
default_unit: Optional[str] = None,
) -> Optional[NumberAndUnit]:
if inp is None:
return None
elif isinstance(inp, NumberAndUnit):
return inp
elif isinstance(inp, float) or isinstance(inp, int):
return NumberAndUnit(inp, default_unit)
elif isinstance(inp, str):
if " " in inp:
num_str, unit = inp.split(" ", 1)
else:
num_str, unit = inp, default_unit
try:
number = int(num_str)
except ValueError: # maybe it is a float?
try:
number = float(num_str)
except ValueError: # neither float nor int
raise Exception(
f"{inp} is not a valid number and unit.\n"
"It must be a number, or a number and unit separated by a space."
)
return NumberAndUnit(number, unit)
def int2tuple(inp): def int2tuple(inp):
@ -90,16 +124,20 @@ def flatten2d(inp):
] ]
def tuplelist2tsv(inp, header=None): def bom2tsv(inp, header=None):
output = "" output = ""
if header is not None: if header is not None:
inp.insert(0, header) inp.insert(0, header)
inp = flatten2d(inp)
for row in inp: for row in inp:
row = [item if item is not None else "" for item in row]
output = output + "\t".join(str(remove_links(item)) for item in row) + "\n" output = output + "\t".join(str(remove_links(item)) for item in row) + "\n"
return output return output
def html_line_breaks(inp):
return remove_links(inp).replace("\n", "<br />") if isinstance(inp, str) else inp
def remove_links(inp): def remove_links(inp):
return ( return (
re.sub(r"<[aA] [^>]*>([^<]*)</[aA]>", r"\1", inp) re.sub(r"<[aA] [^>]*>([^<]*)</[aA]>", r"\1", inp)
@ -154,7 +192,7 @@ def aspect_ratio(image_src):
return 1 # Assume 1:1 when unable to read actual image size return 1 # Assume 1:1 when unable to read actual image size
def smart_file_resolve(filename: str, possible_paths: (str, List[str])) -> Path: def smart_file_resolve(filename: str, possible_paths: Union[str, List[str]]) -> Path:
if not isinstance(possible_paths, List): if not isinstance(possible_paths, List):
possible_paths = [possible_paths] possible_paths = [possible_paths]
filename = Path(filename) filename = Path(filename)

8
tests/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
*.gv
*.html
*.png
*.svg
*.tsv
*.csv
*.html
*.pdf

55
tests/bom/bomqty.yml Normal file
View File

@ -0,0 +1,55 @@
connectors:
X1:
type: No additional components
pincount: 6
X2:
type: Contains additional components
pincount: 6
additional_components:
- type: One, no unit
- type: Two kilometers
amount: 2 km
- type: Takes pincount times seven
qty: 7
qty_multiplier: pincount
- type: Takes 10 mm per populated pin
amount: 10 mm
qty_multiplier: populated
- type: Takes number of connections
qty_multiplier: connections
cables:
C1:
type: Containts additional components
wirecount: 4
length: 1.5
color_code: DIN
additional_components:
- type: One
- type: Three centimeters
amount: 3 cm
- type: Takes wirecount times two
qty: 2
qty_multiplier: wirecount
- type: Takes length times three
qty: 3
# adding amount here should cause error because the length already has a unit
qty_multiplier: length
- type: Takes total length times three
qty: 2
# adding amount here should cause error because the length already has a unit
qty_multiplier: total_length
W2:
category: bundle
wirecount: 2
colors: [tomato, skyblue]
connections:
- - X1: [1-3]
- C1: [1-3]
- X2: [1-3]
- - X1: [3, 4]
- W2: [1, 2]
- X2: [3, 4]

View File

@ -0,0 +1,26 @@
connectors:
X1:
pincount: 4
X2:
pincount: 4
X3:
pincount: 2
F:
style: simple
cables:
C1:
wirecount: 4
W2:
wirecount: 2
category: bundle
connections:
-
- X1: [1-4]
- C1: [1-4]
- X2: [1-4]
-
- X3: [1,2]
- W2: [1,2]
- F.

View File

@ -0,0 +1,32 @@
connectors:
X1: # shorthand color codes
color: BK
pincount: 4
pincolors: [RD, YE, GN, BU]
X2: # HTML color codes
color: 0xFFFFFF
pincount: 4
pincolors: [0xFF8000, 0x00FF80, 0x8000FF] # no color for last pin
X3: # HTML color names
color: red
pincount: 4
pincolors: [deeppink, tomato, salmon, indianred]
F:
style: simple
color: BN
cables:
C1:
wirecount: 4
color: GY
colors: [OG, OL, LB, PK]
connections:
-
- X1: [1-4]
- C1: [1-4]
- X2: [1-4]
- <--
- X3: [1-4]
- --
- F.

View File

@ -0,0 +1,35 @@
connectors:
X1:
color: YEGN
pincount: 4
pincolors: [WHBK, BKWH, GNYE, GNWHRD]
X2:
color: 0xCCCCCC:0x333333
pincount: 4
pincolors: [0xFF8000:0x80FF00, 0x00FF80, 0x8000FF]
X3:
color: red:yellow
pincount: 4
pincolors: [deeppink, tomato, salmon, indianred]
F:
style: simple
color: IVTQ
cables:
C1:
wirecount: 4
color: GDSR
colors: [RDYE, YEGN, GNBU, BURD]
C2:
wirecount: 4
colors: [0xFF8000:0x80FF00, YEGN, GNBU, BURD]
connections:
-
- X1: [1-4]
- C1: [1-4]
- X2: [1-4]
- C2: [1-4]
- X3: [1-4]
- --
- F.

View File

@ -0,0 +1,51 @@
options:
bgcolor_connector: 0xFFCCCC
bgcolor_cable: 0xCCFFCC
bgcolor_bundle: 0xCCCCFF
connectors:
X1:
pincount: 4
bgcolor: 0xFF9999
bgcolor_title: 0xFF6666
X2:
pincount: 4
X3:
pincount: 4
color: GN
X:
pincount: 2
F:
style: simple
cables:
C1:
wirecount: 4
bgcolor: 0x99FF99
bgcolor_title: 0x66FF66
C2:
wirecount: 4
color: PK
W1:
wirecount: 2
category: bundle
W2:
wirecount: 2
category: bundle
bgcolor: 0x9999FF
bgcolor_title: 0x6666FF
connections:
-
- X1: [1-4]
- C1: [1-4]
- X2: [1-4]
- C2: [1-4]
- X3: [1-4]
-
- X.X4: [1,2]
- W1: [1,2]
- X.X5: [1,2]
- W2: [1,2]
- F.

View File

@ -189,7 +189,6 @@ connectors:
subtype: female subtype: female
F1: F1:
style: simple style: simple
autogenerate: true
type: Crimp ferrule type: Crimp ferrule
subtype: 0.5 mm² subtype: 0.5 mm²
color: OG # optional color color: OG # optional color
@ -203,7 +202,7 @@ cables:
connections: connections:
- -
- F1 # a new ferrule is auto-generated for each of the four wires - F1. # a new ferrule is auto-generated for each of the four wires
- W1: [1-4] - W1: [1-4]
- X1: [1-4] - X1: [1-4]
``` ```
@ -228,13 +227,11 @@ connectors:
subtype: female subtype: female
F_10: # this is a unique ferrule F_10: # this is a unique ferrule
style: simple style: simple
show_name: false # non-autogenerated connectors show their name by default; override
type: Crimp ferrule type: Crimp ferrule
subtype: 1.0 mm² subtype: 1.0 mm²
color: YE # optional color color: YE # optional color
F_05: # this is a ferrule that will be auto-generated on demand F_05: # this is a ferrule that will be auto-generated on demand
style: simple style: simple
autogenerate: true
type: Crimp ferrule type: Crimp ferrule
subtype: 0.5 mm² subtype: 0.5 mm²
color: OG color: OG
@ -248,7 +245,7 @@ cables:
connections: connections:
- -
- [F_05, F_10, F_10, F_05] - [F_05., F_10.F1, F_10.F1, F_05.]
- W1: [1-4] - W1: [1-4]
- X1: [1-4] - X1: [1-4]
``` ```

View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>tutorial01</title> <title>tutorial01</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>tutorial01</h1> <h1>tutorial01</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="489pt" height="192pt" <svg width="489pt" height="192pt"
@ -143,28 +166,40 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Cable, 4 wires</td> <td class="bom_col_description">Cable, 4 wires</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Connector, 4 pins</td> <td class="bom_col_description">Connector, 4 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td> <td class="bom_col_qty">2</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1, X2</td> <td class="bom_col_designators">X1, X2</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="489pt" height="192pt" <svg width="489pt" height="192pt"

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>tutorial02</title> <title>tutorial02</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>tutorial02</h1> <h1>tutorial02</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="857pt" height="192pt" <svg width="857pt" height="192pt"
@ -153,28 +176,40 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Cable, 4 x 0.25 mm&sup2;</td> <td class="bom_col_description">Cable, 4 x 0.25 mm²</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 4 pins</td> <td class="bom_col_description">Connector, Molex KK 254, female, 4 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td> <td class="bom_col_qty">2</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1, X2</td> <td class="bom_col_designators">X1, X2</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="857pt" height="192pt" <svg width="857pt" height="192pt"

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>tutorial03</title> <title>tutorial03</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>tutorial03</h1> <h1>tutorial03</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="887pt" height="232pt" <svg width="887pt" height="232pt"
@ -180,28 +203,40 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Cable, 4 x 0.25 mm&sup2; shielded</td> <td class="bom_col_description">Cable, 4 x 0.25 mm² shielded</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 4 pins</td> <td class="bom_col_description">Connector, Molex KK 254, female, 4 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td> <td class="bom_col_qty">2</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1, X2</td> <td class="bom_col_designators">X1, X2</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="887pt" height="232pt" <svg width="887pt" height="232pt"

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>tutorial04</title> <title>tutorial04</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>tutorial04</h1> <h1>tutorial04</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="1551pt" height="215pt" <svg width="1551pt" height="215pt"
@ -311,35 +334,47 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Cable, 4 x 24 AWG</td> <td class="bom_col_description">Cable, 4 x 24 AWG</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.4</td> <td class="bom_col_qty">0.4</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2</td> <td class="bom_col_designators">W1, W2</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 4 pins</td> <td class="bom_col_description">Connector, Molex KK 254, female, 4 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td> <td class="bom_col_qty">2</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X2, X3</td> <td class="bom_col_designators">X2, X3</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, male, 4 pins</td> <td class="bom_col_description">Connector, Molex KK 254, male, 4 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1</td> <td class="bom_col_designators">X1</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="1551pt" height="215pt" <svg width="1551pt" height="215pt"

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

104
tutorial/tutorial05.gv generated
View File

@ -4,6 +4,54 @@ graph {
graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2]
node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0]
edge [fontname=arial style=bold] edge [fontname=arial style=bold]
AUTOGENERATED_F1_1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">0.5 mm²</td>
<td balign="left">OG</td>
<td balign="left" bgcolor="#FF8000" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_F1_2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">0.5 mm²</td>
<td balign="left">OG</td>
<td balign="left" bgcolor="#FF8000" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_F1_3 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">0.5 mm²</td>
<td balign="left">OG</td>
<td balign="left" bgcolor="#FF8000" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_F1_4 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">0.5 mm²</td>
<td balign="left">OG</td>
<td balign="left" bgcolor="#FF8000" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
X1 [label=< X1 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
@ -39,66 +87,18 @@ graph {
</table> </table>
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled]
_F1_1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">0.5 mm²</td>
<td balign="left">OG</td>
<td balign="left" bgcolor="#FF8000" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
_F1_2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">0.5 mm²</td>
<td balign="left">OG</td>
<td balign="left" bgcolor="#FF8000" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
_F1_3 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">0.5 mm²</td>
<td balign="left">OG</td>
<td balign="left" bgcolor="#FF8000" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
_F1_4 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">0.5 mm²</td>
<td balign="left">OG</td>
<td balign="left" bgcolor="#FF8000" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ffff00:#000000"] edge [color="#000000:#ffff00:#000000"]
_F1_1:e -- W1:w1:w AUTOGENERATED_F1_1:e -- W1:w1:w
W1:w1:e -- X1:p1l:w W1:w1:e -- X1:p1l:w
edge [color="#000000:#000000:#000000"] edge [color="#000000:#000000:#000000"]
_F1_2:e -- W1:w2:w AUTOGENERATED_F1_2:e -- W1:w2:w
W1:w2:e -- X1:p2l:w W1:w2:e -- X1:p2l:w
edge [color="#000000:#000000:#000000"] edge [color="#000000:#000000:#000000"]
_F1_3:e -- W1:w3:w AUTOGENERATED_F1_3:e -- W1:w3:w
W1:w3:e -- X1:p3l:w W1:w3:e -- X1:p3l:w
edge [color="#000000:#ff0000:#000000"] edge [color="#000000:#ff0000:#000000"]
_F1_4:e -- W1:w4:w AUTOGENERATED_F1_4:e -- W1:w4:w
W1:w4:e -- X1:p4l:w W1:w4:e -- X1:p4l:w
W1 [label=< W1 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">

199
tutorial/tutorial05.html generated
View File

@ -3,49 +3,43 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>tutorial05</title> <title>tutorial05</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>tutorial05</h1> <h1>tutorial05</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="793pt" height="215pt" <svg width="793pt" height="215pt"
viewBox="0.00 0.00 793.00 214.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> viewBox="0.00 0.00 793.00 214.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 210.5)"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 210.5)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-210.5 789,-210.5 789,4 -4,4"/> <polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-210.5 789,-210.5 789,4 -4,4"/>
<!-- X1 --> <!-- AUTOGENERATED_F1_1 -->
<g id="node1" class="node"> <g id="node1" class="node">
<title>X1</title> <title>AUTOGENERATED_F1_1</title>
<polygon fill="#ffffff" stroke="black" points="785,-174.5 613,-174.5 613,-36.5 785,-36.5 785,-174.5"/>
<polygon fill="none" stroke="black" points="613,-151.5 613,-174.5 785,-174.5 785,-151.5 613,-151.5"/>
<text text-anchor="start" x="690" y="-159.3" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="613,-128.5 613,-151.5 694,-151.5 694,-128.5 613,-128.5"/>
<text text-anchor="start" x="617" y="-136.3" font-family="arial" font-size="14.00">Molex 8981</text>
<polygon fill="none" stroke="black" points="694,-128.5 694,-151.5 745,-151.5 745,-128.5 694,-128.5"/>
<text text-anchor="start" x="698" y="-136.3" font-family="arial" font-size="14.00">female</text>
<polygon fill="none" stroke="black" points="745,-128.5 745,-151.5 785,-151.5 785,-128.5 745,-128.5"/>
<text text-anchor="start" x="749" y="-136.3" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="613,-105.5 613,-128.5 686,-128.5 686,-105.5 613,-105.5"/>
<text text-anchor="start" x="645.5" y="-113.3" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="686,-105.5 686,-128.5 785,-128.5 785,-105.5 686,-105.5"/>
<text text-anchor="start" x="718.5" y="-113.3" font-family="arial" font-size="14.00">+12V</text>
<polygon fill="none" stroke="black" points="613,-82.5 613,-105.5 686,-105.5 686,-82.5 613,-82.5"/>
<text text-anchor="start" x="645.5" y="-90.3" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="686,-82.5 686,-105.5 785,-105.5 785,-82.5 686,-82.5"/>
<text text-anchor="start" x="719.5" y="-90.3" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-59.5 613,-82.5 686,-82.5 686,-59.5 613,-59.5"/>
<text text-anchor="start" x="645.5" y="-67.3" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="686,-59.5 686,-82.5 785,-82.5 785,-59.5 686,-59.5"/>
<text text-anchor="start" x="719.5" y="-67.3" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-36.5 613,-59.5 686,-59.5 686,-36.5 613,-36.5"/>
<text text-anchor="start" x="645.5" y="-44.3" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="686,-36.5 686,-59.5 785,-59.5 785,-36.5 686,-36.5"/>
<text text-anchor="start" x="722.5" y="-44.3" font-family="arial" font-size="14.00">+5V</text>
</g>
<!-- _F1_1 -->
<g id="node2" class="node">
<title>_F1_1</title>
<polygon fill="#ffffff" stroke="black" points="187,-164 0,-164 0,-141 187,-141 187,-164"/> <polygon fill="#ffffff" stroke="black" points="187,-164 0,-164 0,-141 187,-141 187,-164"/>
<polygon fill="none" stroke="black" points="0.5,-140.5 0.5,-163.5 89.5,-163.5 89.5,-140.5 0.5,-140.5"/> <polygon fill="none" stroke="black" points="0.5,-140.5 0.5,-163.5 89.5,-163.5 89.5,-140.5 0.5,-140.5"/>
<text text-anchor="start" x="4.5" y="-148.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-148.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
@ -91,16 +85,16 @@
<polygon fill="#000000" stroke="transparent" points="331,-41.5 331,-43.5 469,-43.5 469,-41.5 331,-41.5"/> <polygon fill="#000000" stroke="transparent" points="331,-41.5 331,-43.5 469,-43.5 469,-41.5 331,-41.5"/>
<text text-anchor="start" x="333" y="-28.3" font-family="arial" font-size="14.00"> </text> <text text-anchor="start" x="333" y="-28.3" font-family="arial" font-size="14.00"> </text>
</g> </g>
<!-- _F1_1&#45;&#45;W1 --> <!-- AUTOGENERATED_F1_1&#45;&#45;W1 -->
<g id="edge1" class="edge"> <g id="edge1" class="edge">
<title>_F1_1:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F1_1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-150.5C250.79,-151.78 263.47,-118.78 331,-117.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-150.5C250.79,-151.78 263.47,-118.78 331,-117.5"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M187,-152.5C252.66,-152.5 265.34,-119.5 331,-119.5"/> <path fill="none" stroke="#ffff00" stroke-width="2" d="M187,-152.5C252.66,-152.5 265.34,-119.5 331,-119.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-154.5C254.53,-153.22 267.21,-120.22 331,-121.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-154.5C254.53,-153.22 267.21,-120.22 331,-121.5"/>
</g> </g>
<!-- _F1_2 --> <!-- AUTOGENERATED_F1_2 -->
<g id="node3" class="node"> <g id="node2" class="node">
<title>_F1_2</title> <title>AUTOGENERATED_F1_2</title>
<polygon fill="#ffffff" stroke="black" points="187,-117 0,-117 0,-94 187,-94 187,-117"/> <polygon fill="#ffffff" stroke="black" points="187,-117 0,-117 0,-94 187,-94 187,-117"/>
<polygon fill="none" stroke="black" points="0.5,-93.5 0.5,-116.5 89.5,-116.5 89.5,-93.5 0.5,-93.5"/> <polygon fill="none" stroke="black" points="0.5,-93.5 0.5,-116.5 89.5,-116.5 89.5,-93.5 0.5,-93.5"/>
<text text-anchor="start" x="4.5" y="-101.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-101.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
@ -111,16 +105,16 @@
<polygon fill="#ff8000" stroke="transparent" points="179.5,-93.5 179.5,-116.5 187.5,-116.5 187.5,-93.5 179.5,-93.5"/> <polygon fill="#ff8000" stroke="transparent" points="179.5,-93.5 179.5,-116.5 187.5,-116.5 187.5,-93.5 179.5,-93.5"/>
<polygon fill="none" stroke="black" points="179.5,-93.5 179.5,-116.5 187.5,-116.5 187.5,-93.5 179.5,-93.5"/> <polygon fill="none" stroke="black" points="179.5,-93.5 179.5,-116.5 187.5,-116.5 187.5,-93.5 179.5,-93.5"/>
</g> </g>
<!-- _F1_2&#45;&#45;W1 --> <!-- AUTOGENERATED_F1_2&#45;&#45;W1 -->
<g id="edge3" class="edge"> <g id="edge3" class="edge">
<title>_F1_2:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F1_2:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-103.5C250.04,-103.86 265.66,-92.86 331,-92.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-103.5C250.04,-103.86 265.66,-92.86 331,-92.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-105.5C251.19,-105.5 266.81,-94.5 331,-94.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-105.5C251.19,-105.5 266.81,-94.5 331,-94.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-107.5C252.34,-107.14 267.96,-96.14 331,-96.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-107.5C252.34,-107.14 267.96,-96.14 331,-96.5"/>
</g> </g>
<!-- _F1_3 --> <!-- AUTOGENERATED_F1_3 -->
<g id="node4" class="node"> <g id="node3" class="node">
<title>_F1_3</title> <title>AUTOGENERATED_F1_3</title>
<polygon fill="#ffffff" stroke="black" points="187,-70 0,-70 0,-47 187,-47 187,-70"/> <polygon fill="#ffffff" stroke="black" points="187,-70 0,-70 0,-47 187,-47 187,-70"/>
<polygon fill="none" stroke="black" points="0.5,-46.5 0.5,-69.5 89.5,-69.5 89.5,-46.5 0.5,-46.5"/> <polygon fill="none" stroke="black" points="0.5,-46.5 0.5,-69.5 89.5,-69.5 89.5,-46.5 0.5,-46.5"/>
<text text-anchor="start" x="4.5" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
@ -131,16 +125,16 @@
<polygon fill="#ff8000" stroke="transparent" points="179.5,-46.5 179.5,-69.5 187.5,-69.5 187.5,-46.5 179.5,-46.5"/> <polygon fill="#ff8000" stroke="transparent" points="179.5,-46.5 179.5,-69.5 187.5,-69.5 187.5,-46.5 179.5,-46.5"/>
<polygon fill="none" stroke="black" points="179.5,-46.5 179.5,-69.5 187.5,-69.5 187.5,-46.5 179.5,-46.5"/> <polygon fill="none" stroke="black" points="179.5,-46.5 179.5,-69.5 187.5,-69.5 187.5,-46.5 179.5,-46.5"/>
</g> </g>
<!-- _F1_3&#45;&#45;W1 --> <!-- AUTOGENERATED_F1_3&#45;&#45;W1 -->
<g id="edge5" class="edge"> <g id="edge5" class="edge">
<title>_F1_3:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F1_3:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-56.5C252.34,-56.86 267.96,-67.86 331,-67.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-56.5C252.34,-56.86 267.96,-67.86 331,-67.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-58.5C251.19,-58.5 266.81,-69.5 331,-69.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-58.5C251.19,-58.5 266.81,-69.5 331,-69.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-60.5C250.04,-60.14 265.66,-71.14 331,-71.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-60.5C250.04,-60.14 265.66,-71.14 331,-71.5"/>
</g> </g>
<!-- _F1_4 --> <!-- AUTOGENERATED_F1_4 -->
<g id="node5" class="node"> <g id="node4" class="node">
<title>_F1_4</title> <title>AUTOGENERATED_F1_4</title>
<polygon fill="#ffffff" stroke="black" points="187,-23 0,-23 0,0 187,0 187,-23"/> <polygon fill="#ffffff" stroke="black" points="187,-23 0,-23 0,0 187,0 187,-23"/>
<polygon fill="none" stroke="black" points="0.5,0.5 0.5,-22.5 89.5,-22.5 89.5,0.5 0.5,0.5"/> <polygon fill="none" stroke="black" points="0.5,0.5 0.5,-22.5 89.5,-22.5 89.5,0.5 0.5,0.5"/>
<text text-anchor="start" x="4.5" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
@ -151,13 +145,42 @@
<polygon fill="#ff8000" stroke="transparent" points="179.5,0.5 179.5,-22.5 187.5,-22.5 187.5,0.5 179.5,0.5"/> <polygon fill="#ff8000" stroke="transparent" points="179.5,0.5 179.5,-22.5 187.5,-22.5 187.5,0.5 179.5,0.5"/>
<polygon fill="none" stroke="black" points="179.5,0.5 179.5,-22.5 187.5,-22.5 187.5,0.5 179.5,0.5"/> <polygon fill="none" stroke="black" points="179.5,0.5 179.5,-22.5 187.5,-22.5 187.5,0.5 179.5,0.5"/>
</g> </g>
<!-- _F1_4&#45;&#45;W1 --> <!-- AUTOGENERATED_F1_4&#45;&#45;W1 -->
<g id="edge7" class="edge"> <g id="edge7" class="edge">
<title>_F1_4:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F1_4:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-9.5C254.53,-10.78 267.21,-43.78 331,-42.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-9.5C254.53,-10.78 267.21,-43.78 331,-42.5"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M187,-11.5C252.66,-11.5 265.34,-44.5 331,-44.5"/> <path fill="none" stroke="#ff0000" stroke-width="2" d="M187,-11.5C252.66,-11.5 265.34,-44.5 331,-44.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-13.5C250.79,-12.22 263.47,-45.22 331,-46.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-13.5C250.79,-12.22 263.47,-45.22 331,-46.5"/>
</g> </g>
<!-- X1 -->
<g id="node5" class="node">
<title>X1</title>
<polygon fill="#ffffff" stroke="black" points="785,-174.5 613,-174.5 613,-36.5 785,-36.5 785,-174.5"/>
<polygon fill="none" stroke="black" points="613,-151.5 613,-174.5 785,-174.5 785,-151.5 613,-151.5"/>
<text text-anchor="start" x="690" y="-159.3" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="613,-128.5 613,-151.5 694,-151.5 694,-128.5 613,-128.5"/>
<text text-anchor="start" x="617" y="-136.3" font-family="arial" font-size="14.00">Molex 8981</text>
<polygon fill="none" stroke="black" points="694,-128.5 694,-151.5 745,-151.5 745,-128.5 694,-128.5"/>
<text text-anchor="start" x="698" y="-136.3" font-family="arial" font-size="14.00">female</text>
<polygon fill="none" stroke="black" points="745,-128.5 745,-151.5 785,-151.5 785,-128.5 745,-128.5"/>
<text text-anchor="start" x="749" y="-136.3" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="613,-105.5 613,-128.5 686,-128.5 686,-105.5 613,-105.5"/>
<text text-anchor="start" x="645.5" y="-113.3" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="686,-105.5 686,-128.5 785,-128.5 785,-105.5 686,-105.5"/>
<text text-anchor="start" x="718.5" y="-113.3" font-family="arial" font-size="14.00">+12V</text>
<polygon fill="none" stroke="black" points="613,-82.5 613,-105.5 686,-105.5 686,-82.5 613,-82.5"/>
<text text-anchor="start" x="645.5" y="-90.3" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="686,-82.5 686,-105.5 785,-105.5 785,-82.5 686,-82.5"/>
<text text-anchor="start" x="719.5" y="-90.3" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-59.5 613,-82.5 686,-82.5 686,-59.5 613,-59.5"/>
<text text-anchor="start" x="645.5" y="-67.3" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="686,-59.5 686,-82.5 785,-82.5 785,-59.5 686,-59.5"/>
<text text-anchor="start" x="719.5" y="-67.3" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-36.5 613,-59.5 686,-59.5 686,-36.5 613,-36.5"/>
<text text-anchor="start" x="645.5" y="-44.3" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="686,-36.5 686,-59.5 785,-59.5 785,-36.5 686,-36.5"/>
<text text-anchor="start" x="722.5" y="-44.3" font-family="arial" font-size="14.00">+5V</text>
</g>
<!-- W1&#45;&#45;X1 --> <!-- W1&#45;&#45;X1 -->
<g id="edge2" class="edge"> <g id="edge2" class="edge">
<title>W1:e&#45;&#45;X1:w</title> <title>W1:e&#45;&#45;X1:w</title>
@ -188,49 +211,61 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Crimp ferrule, 0.5 mm&sup2;, OG</td> <td class="bom_col_description">Connector, Crimp ferrule, 0.5 mm², OG</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">4</td> <td class="bom_col_qty">4</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_designators"></td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex 8981, female, 4 pins</td> <td class="bom_col_description">Connector, Molex 8981, female, 4 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1</td> <td class="bom_col_designators">X1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.5 mm&sup2;, BK</td> <td class="bom_col_description">Wire, 0.5 mm², BK</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.6</td> <td class="bom_col_qty">0.6</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">4</td> <td class="bom_col_id">4</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.5 mm&sup2;, RD</td> <td class="bom_col_description">Wire, 0.5 mm², RD</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.3</td> <td class="bom_col_qty">0.3</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">5</td> <td class="bom_col_id">5</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.5 mm&sup2;, YE</td> <td class="bom_col_description">Wire, 0.5 mm², YE</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.3</td> <td class="bom_col_qty">0.3</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

View File

@ -1,45 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="793pt" height="215pt" <svg width="793pt" height="215pt"
viewBox="0.00 0.00 793.00 214.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> viewBox="0.00 0.00 793.00 214.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 210.5)"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 210.5)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-210.5 789,-210.5 789,4 -4,4"/> <polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-210.5 789,-210.5 789,4 -4,4"/>
<!-- X1 --> <!-- AUTOGENERATED_F1_1 -->
<g id="node1" class="node"> <g id="node1" class="node">
<title>X1</title> <title>AUTOGENERATED_F1_1</title>
<polygon fill="#ffffff" stroke="black" points="785,-174.5 613,-174.5 613,-36.5 785,-36.5 785,-174.5"/>
<polygon fill="none" stroke="black" points="613,-151.5 613,-174.5 785,-174.5 785,-151.5 613,-151.5"/>
<text text-anchor="start" x="690" y="-159.3" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="613,-128.5 613,-151.5 694,-151.5 694,-128.5 613,-128.5"/>
<text text-anchor="start" x="617" y="-136.3" font-family="arial" font-size="14.00">Molex 8981</text>
<polygon fill="none" stroke="black" points="694,-128.5 694,-151.5 745,-151.5 745,-128.5 694,-128.5"/>
<text text-anchor="start" x="698" y="-136.3" font-family="arial" font-size="14.00">female</text>
<polygon fill="none" stroke="black" points="745,-128.5 745,-151.5 785,-151.5 785,-128.5 745,-128.5"/>
<text text-anchor="start" x="749" y="-136.3" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="613,-105.5 613,-128.5 686,-128.5 686,-105.5 613,-105.5"/>
<text text-anchor="start" x="645.5" y="-113.3" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="686,-105.5 686,-128.5 785,-128.5 785,-105.5 686,-105.5"/>
<text text-anchor="start" x="718.5" y="-113.3" font-family="arial" font-size="14.00">+12V</text>
<polygon fill="none" stroke="black" points="613,-82.5 613,-105.5 686,-105.5 686,-82.5 613,-82.5"/>
<text text-anchor="start" x="645.5" y="-90.3" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="686,-82.5 686,-105.5 785,-105.5 785,-82.5 686,-82.5"/>
<text text-anchor="start" x="719.5" y="-90.3" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-59.5 613,-82.5 686,-82.5 686,-59.5 613,-59.5"/>
<text text-anchor="start" x="645.5" y="-67.3" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="686,-59.5 686,-82.5 785,-82.5 785,-59.5 686,-59.5"/>
<text text-anchor="start" x="719.5" y="-67.3" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-36.5 613,-59.5 686,-59.5 686,-36.5 613,-36.5"/>
<text text-anchor="start" x="645.5" y="-44.3" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="686,-36.5 686,-59.5 785,-59.5 785,-36.5 686,-36.5"/>
<text text-anchor="start" x="722.5" y="-44.3" font-family="arial" font-size="14.00">+5V</text>
</g>
<!-- _F1_1 -->
<g id="node2" class="node">
<title>_F1_1</title>
<polygon fill="#ffffff" stroke="black" points="187,-164 0,-164 0,-141 187,-141 187,-164"/> <polygon fill="#ffffff" stroke="black" points="187,-164 0,-164 0,-141 187,-141 187,-164"/>
<polygon fill="none" stroke="black" points="0.5,-140.5 0.5,-163.5 89.5,-163.5 89.5,-140.5 0.5,-140.5"/> <polygon fill="none" stroke="black" points="0.5,-140.5 0.5,-163.5 89.5,-163.5 89.5,-140.5 0.5,-140.5"/>
<text text-anchor="start" x="4.5" y="-148.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-148.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
@ -85,16 +56,16 @@
<polygon fill="#000000" stroke="transparent" points="331,-41.5 331,-43.5 469,-43.5 469,-41.5 331,-41.5"/> <polygon fill="#000000" stroke="transparent" points="331,-41.5 331,-43.5 469,-43.5 469,-41.5 331,-41.5"/>
<text text-anchor="start" x="333" y="-28.3" font-family="arial" font-size="14.00"> </text> <text text-anchor="start" x="333" y="-28.3" font-family="arial" font-size="14.00"> </text>
</g> </g>
<!-- _F1_1&#45;&#45;W1 --> <!-- AUTOGENERATED_F1_1&#45;&#45;W1 -->
<g id="edge1" class="edge"> <g id="edge1" class="edge">
<title>_F1_1:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F1_1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-150.5C250.79,-151.78 263.47,-118.78 331,-117.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-150.5C250.79,-151.78 263.47,-118.78 331,-117.5"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M187,-152.5C252.66,-152.5 265.34,-119.5 331,-119.5"/> <path fill="none" stroke="#ffff00" stroke-width="2" d="M187,-152.5C252.66,-152.5 265.34,-119.5 331,-119.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-154.5C254.53,-153.22 267.21,-120.22 331,-121.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-154.5C254.53,-153.22 267.21,-120.22 331,-121.5"/>
</g> </g>
<!-- _F1_2 --> <!-- AUTOGENERATED_F1_2 -->
<g id="node3" class="node"> <g id="node2" class="node">
<title>_F1_2</title> <title>AUTOGENERATED_F1_2</title>
<polygon fill="#ffffff" stroke="black" points="187,-117 0,-117 0,-94 187,-94 187,-117"/> <polygon fill="#ffffff" stroke="black" points="187,-117 0,-117 0,-94 187,-94 187,-117"/>
<polygon fill="none" stroke="black" points="0.5,-93.5 0.5,-116.5 89.5,-116.5 89.5,-93.5 0.5,-93.5"/> <polygon fill="none" stroke="black" points="0.5,-93.5 0.5,-116.5 89.5,-116.5 89.5,-93.5 0.5,-93.5"/>
<text text-anchor="start" x="4.5" y="-101.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-101.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
@ -105,16 +76,16 @@
<polygon fill="#ff8000" stroke="transparent" points="179.5,-93.5 179.5,-116.5 187.5,-116.5 187.5,-93.5 179.5,-93.5"/> <polygon fill="#ff8000" stroke="transparent" points="179.5,-93.5 179.5,-116.5 187.5,-116.5 187.5,-93.5 179.5,-93.5"/>
<polygon fill="none" stroke="black" points="179.5,-93.5 179.5,-116.5 187.5,-116.5 187.5,-93.5 179.5,-93.5"/> <polygon fill="none" stroke="black" points="179.5,-93.5 179.5,-116.5 187.5,-116.5 187.5,-93.5 179.5,-93.5"/>
</g> </g>
<!-- _F1_2&#45;&#45;W1 --> <!-- AUTOGENERATED_F1_2&#45;&#45;W1 -->
<g id="edge3" class="edge"> <g id="edge3" class="edge">
<title>_F1_2:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F1_2:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-103.5C250.04,-103.86 265.66,-92.86 331,-92.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-103.5C250.04,-103.86 265.66,-92.86 331,-92.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-105.5C251.19,-105.5 266.81,-94.5 331,-94.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-105.5C251.19,-105.5 266.81,-94.5 331,-94.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-107.5C252.34,-107.14 267.96,-96.14 331,-96.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-107.5C252.34,-107.14 267.96,-96.14 331,-96.5"/>
</g> </g>
<!-- _F1_3 --> <!-- AUTOGENERATED_F1_3 -->
<g id="node4" class="node"> <g id="node3" class="node">
<title>_F1_3</title> <title>AUTOGENERATED_F1_3</title>
<polygon fill="#ffffff" stroke="black" points="187,-70 0,-70 0,-47 187,-47 187,-70"/> <polygon fill="#ffffff" stroke="black" points="187,-70 0,-70 0,-47 187,-47 187,-70"/>
<polygon fill="none" stroke="black" points="0.5,-46.5 0.5,-69.5 89.5,-69.5 89.5,-46.5 0.5,-46.5"/> <polygon fill="none" stroke="black" points="0.5,-46.5 0.5,-69.5 89.5,-69.5 89.5,-46.5 0.5,-46.5"/>
<text text-anchor="start" x="4.5" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-54.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
@ -125,16 +96,16 @@
<polygon fill="#ff8000" stroke="transparent" points="179.5,-46.5 179.5,-69.5 187.5,-69.5 187.5,-46.5 179.5,-46.5"/> <polygon fill="#ff8000" stroke="transparent" points="179.5,-46.5 179.5,-69.5 187.5,-69.5 187.5,-46.5 179.5,-46.5"/>
<polygon fill="none" stroke="black" points="179.5,-46.5 179.5,-69.5 187.5,-69.5 187.5,-46.5 179.5,-46.5"/> <polygon fill="none" stroke="black" points="179.5,-46.5 179.5,-69.5 187.5,-69.5 187.5,-46.5 179.5,-46.5"/>
</g> </g>
<!-- _F1_3&#45;&#45;W1 --> <!-- AUTOGENERATED_F1_3&#45;&#45;W1 -->
<g id="edge5" class="edge"> <g id="edge5" class="edge">
<title>_F1_3:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F1_3:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-56.5C252.34,-56.86 267.96,-67.86 331,-67.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-56.5C252.34,-56.86 267.96,-67.86 331,-67.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-58.5C251.19,-58.5 266.81,-69.5 331,-69.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-58.5C251.19,-58.5 266.81,-69.5 331,-69.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-60.5C250.04,-60.14 265.66,-71.14 331,-71.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-60.5C250.04,-60.14 265.66,-71.14 331,-71.5"/>
</g> </g>
<!-- _F1_4 --> <!-- AUTOGENERATED_F1_4 -->
<g id="node5" class="node"> <g id="node4" class="node">
<title>_F1_4</title> <title>AUTOGENERATED_F1_4</title>
<polygon fill="#ffffff" stroke="black" points="187,-23 0,-23 0,0 187,0 187,-23"/> <polygon fill="#ffffff" stroke="black" points="187,-23 0,-23 0,0 187,0 187,-23"/>
<polygon fill="none" stroke="black" points="0.5,0.5 0.5,-22.5 89.5,-22.5 89.5,0.5 0.5,0.5"/> <polygon fill="none" stroke="black" points="0.5,0.5 0.5,-22.5 89.5,-22.5 89.5,0.5 0.5,0.5"/>
<text text-anchor="start" x="4.5" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-7.3" font-family="arial" font-size="14.00">Crimp ferrule</text>
@ -145,13 +116,42 @@
<polygon fill="#ff8000" stroke="transparent" points="179.5,0.5 179.5,-22.5 187.5,-22.5 187.5,0.5 179.5,0.5"/> <polygon fill="#ff8000" stroke="transparent" points="179.5,0.5 179.5,-22.5 187.5,-22.5 187.5,0.5 179.5,0.5"/>
<polygon fill="none" stroke="black" points="179.5,0.5 179.5,-22.5 187.5,-22.5 187.5,0.5 179.5,0.5"/> <polygon fill="none" stroke="black" points="179.5,0.5 179.5,-22.5 187.5,-22.5 187.5,0.5 179.5,0.5"/>
</g> </g>
<!-- _F1_4&#45;&#45;W1 --> <!-- AUTOGENERATED_F1_4&#45;&#45;W1 -->
<g id="edge7" class="edge"> <g id="edge7" class="edge">
<title>_F1_4:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F1_4:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-9.5C254.53,-10.78 267.21,-43.78 331,-42.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-9.5C254.53,-10.78 267.21,-43.78 331,-42.5"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M187,-11.5C252.66,-11.5 265.34,-44.5 331,-44.5"/> <path fill="none" stroke="#ff0000" stroke-width="2" d="M187,-11.5C252.66,-11.5 265.34,-44.5 331,-44.5"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-13.5C250.79,-12.22 263.47,-45.22 331,-46.5"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-13.5C250.79,-12.22 263.47,-45.22 331,-46.5"/>
</g> </g>
<!-- X1 -->
<g id="node5" class="node">
<title>X1</title>
<polygon fill="#ffffff" stroke="black" points="785,-174.5 613,-174.5 613,-36.5 785,-36.5 785,-174.5"/>
<polygon fill="none" stroke="black" points="613,-151.5 613,-174.5 785,-174.5 785,-151.5 613,-151.5"/>
<text text-anchor="start" x="690" y="-159.3" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="613,-128.5 613,-151.5 694,-151.5 694,-128.5 613,-128.5"/>
<text text-anchor="start" x="617" y="-136.3" font-family="arial" font-size="14.00">Molex 8981</text>
<polygon fill="none" stroke="black" points="694,-128.5 694,-151.5 745,-151.5 745,-128.5 694,-128.5"/>
<text text-anchor="start" x="698" y="-136.3" font-family="arial" font-size="14.00">female</text>
<polygon fill="none" stroke="black" points="745,-128.5 745,-151.5 785,-151.5 785,-128.5 745,-128.5"/>
<text text-anchor="start" x="749" y="-136.3" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="613,-105.5 613,-128.5 686,-128.5 686,-105.5 613,-105.5"/>
<text text-anchor="start" x="645.5" y="-113.3" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="686,-105.5 686,-128.5 785,-128.5 785,-105.5 686,-105.5"/>
<text text-anchor="start" x="718.5" y="-113.3" font-family="arial" font-size="14.00">+12V</text>
<polygon fill="none" stroke="black" points="613,-82.5 613,-105.5 686,-105.5 686,-82.5 613,-82.5"/>
<text text-anchor="start" x="645.5" y="-90.3" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="686,-82.5 686,-105.5 785,-105.5 785,-82.5 686,-82.5"/>
<text text-anchor="start" x="719.5" y="-90.3" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-59.5 613,-82.5 686,-82.5 686,-59.5 613,-59.5"/>
<text text-anchor="start" x="645.5" y="-67.3" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="686,-59.5 686,-82.5 785,-82.5 785,-59.5 686,-59.5"/>
<text text-anchor="start" x="719.5" y="-67.3" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-36.5 613,-59.5 686,-59.5 686,-36.5 613,-36.5"/>
<text text-anchor="start" x="645.5" y="-44.3" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="686,-36.5 686,-59.5 785,-59.5 785,-36.5 686,-36.5"/>
<text text-anchor="start" x="722.5" y="-44.3" font-family="arial" font-size="14.00">+5V</text>
</g>
<!-- W1&#45;&#45;X1 --> <!-- W1&#45;&#45;X1 -->
<g id="edge2" class="edge"> <g id="edge2" class="edge">
<title>W1:e&#45;&#45;X1:w</title> <title>W1:e&#45;&#45;X1:w</title>

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

80
tutorial/tutorial06.gv generated
View File

@ -4,6 +4,42 @@ graph {
graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2] graph [bgcolor="#FFFFFF" fontname=arial nodesep=0.33 rankdir=LR ranksep=2]
node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0] node [fillcolor="#FFFFFF" fontname=arial height=0 margin=0 shape=none style=filled width=0]
edge [fontname=arial style=bold] edge [fontname=arial style=bold]
AUTOGENERATED_F_05_1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">0.5 mm²</td>
<td balign="left">OG</td>
<td balign="left" bgcolor="#FF8000" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
F1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">1.0 mm²</td>
<td balign="left">YE</td>
<td balign="left" bgcolor="#FFFF00" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
AUTOGENERATED_F_05_2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">0.5 mm²</td>
<td balign="left">OG</td>
<td balign="left" bgcolor="#FF8000" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
X1 [label=< X1 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">
<tr><td> <tr><td>
@ -39,54 +75,18 @@ graph {
</table> </table>
</td></tr> </td></tr>
</table> </table>
> fillcolor="#FFFFFF" shape=box style=filled]
F_10 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">1.0 mm²</td>
<td balign="left">YE</td>
<td balign="left" bgcolor="#FFFF00" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
_F_05_1 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">0.5 mm²</td>
<td balign="left">OG</td>
<td balign="left" bgcolor="#FF8000" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
_F_05_2 [label=<
<table border="0" cellspacing="0" cellpadding="0">
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
<td balign="left">Crimp ferrule</td>
<td balign="left">0.5 mm²</td>
<td balign="left">OG</td>
<td balign="left" bgcolor="#FF8000" width="4"></td>
</tr></table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled] > fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ffff00:#000000"] edge [color="#000000:#ffff00:#000000"]
_F_05_1:e -- W1:w1:w AUTOGENERATED_F_05_1:e -- W1:w1:w
W1:w1:e -- X1:p1l:w W1:w1:e -- X1:p1l:w
edge [color="#000000:#000000:#000000"] edge [color="#000000:#000000:#000000"]
F_10:e -- W1:w2:w F1:e -- W1:w2:w
W1:w2:e -- X1:p2l:w W1:w2:e -- X1:p2l:w
edge [color="#000000:#000000:#000000"] edge [color="#000000:#000000:#000000"]
F_10:e -- W1:w3:w F1:e -- W1:w3:w
W1:w3:e -- X1:p3l:w W1:w3:e -- X1:p3l:w
edge [color="#000000:#ff0000:#000000"] edge [color="#000000:#ff0000:#000000"]
_F_05_2:e -- W1:w4:w AUTOGENERATED_F_05_2:e -- W1:w4:w
W1:w4:e -- X1:p4l:w W1:w4:e -- X1:p4l:w
W1 [label=< W1 [label=<
<table border="0" cellspacing="0" cellpadding="0"> <table border="0" cellspacing="0" cellpadding="0">

261
tutorial/tutorial06.html generated
View File

@ -3,58 +3,52 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>tutorial06</title> <title>tutorial06</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>tutorial06</h1> <h1>tutorial06</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="793pt" height="192pt" <svg width="793pt" height="192pt"
viewBox="0.00 0.00 793.00 192.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> viewBox="0.00 0.00 793.00 192.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 188)"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 188)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-188 789,-188 789,4 -4,4"/> <polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-188 789,-188 789,4 -4,4"/>
<!-- X1 --> <!-- AUTOGENERATED_F_05_1 -->
<g id="node1" class="node"> <g id="node1" class="node">
<title>X1</title> <title>AUTOGENERATED_F_05_1</title>
<polygon fill="#ffffff" stroke="black" points="785,-152 613,-152 613,-14 785,-14 785,-152"/> <polygon fill="#ffffff" stroke="black" points="187,-118.5 0,-118.5 0,-95.5 187,-95.5 187,-118.5"/>
<polygon fill="none" stroke="black" points="613,-129 613,-152 785,-152 785,-129 613,-129"/> <polygon fill="none" stroke="black" points="0.5,-95 0.5,-118 89.5,-118 89.5,-95 0.5,-95"/>
<text text-anchor="start" x="690" y="-136.8" font-family="arial" font-size="14.00">X1</text> <text text-anchor="start" x="4.5" y="-102.8" font-family="arial" font-size="14.00">Crimp ferrule</text>
<polygon fill="none" stroke="black" points="613,-106 613,-129 694,-129 694,-106 613,-106"/> <polygon fill="none" stroke="black" points="89.5,-95 89.5,-118 149.5,-118 149.5,-95 89.5,-95"/>
<text text-anchor="start" x="617" y="-113.8" font-family="arial" font-size="14.00">Molex 8981</text> <text text-anchor="start" x="93.5" y="-102.8" font-family="arial" font-size="14.00">0.5 mm²</text>
<polygon fill="none" stroke="black" points="694,-106 694,-129 745,-129 745,-106 694,-106"/> <polygon fill="none" stroke="black" points="149.5,-95 149.5,-118 179.5,-118 179.5,-95 149.5,-95"/>
<text text-anchor="start" x="698" y="-113.8" font-family="arial" font-size="14.00">female</text> <text text-anchor="start" x="153.5" y="-102.8" font-family="arial" font-size="14.00">OG</text>
<polygon fill="none" stroke="black" points="745,-106 745,-129 785,-129 785,-106 745,-106"/> <polygon fill="#ff8000" stroke="transparent" points="179.5,-95 179.5,-118 187.5,-118 187.5,-95 179.5,-95"/>
<text text-anchor="start" x="749" y="-113.8" font-family="arial" font-size="14.00">4&#45;pin</text> <polygon fill="none" stroke="black" points="179.5,-95 179.5,-118 187.5,-118 187.5,-95 179.5,-95"/>
<polygon fill="none" stroke="black" points="613,-83 613,-106 686,-106 686,-83 613,-83"/>
<text text-anchor="start" x="645.5" y="-90.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="686,-83 686,-106 785,-106 785,-83 686,-83"/>
<text text-anchor="start" x="718.5" y="-90.8" font-family="arial" font-size="14.00">+12V</text>
<polygon fill="none" stroke="black" points="613,-60 613,-83 686,-83 686,-60 613,-60"/>
<text text-anchor="start" x="645.5" y="-67.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="686,-60 686,-83 785,-83 785,-60 686,-60"/>
<text text-anchor="start" x="719.5" y="-67.8" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-37 613,-60 686,-60 686,-37 613,-37"/>
<text text-anchor="start" x="645.5" y="-44.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="686,-37 686,-60 785,-60 785,-37 686,-37"/>
<text text-anchor="start" x="719.5" y="-44.8" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-14 613,-37 686,-37 686,-14 613,-14"/>
<text text-anchor="start" x="645.5" y="-21.8" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="686,-14 686,-37 785,-37 785,-14 686,-14"/>
<text text-anchor="start" x="722.5" y="-21.8" font-family="arial" font-size="14.00">+5V</text>
</g>
<!-- F_10 -->
<g id="node2" class="node">
<title>F_10</title>
<polygon fill="#ffffff" stroke="black" points="185.5,-71.5 1.5,-71.5 1.5,-48.5 185.5,-48.5 185.5,-71.5"/>
<polygon fill="none" stroke="black" points="1.5,-48 1.5,-71 90.5,-71 90.5,-48 1.5,-48"/>
<text text-anchor="start" x="5.5" y="-55.8" font-family="arial" font-size="14.00">Crimp ferrule</text>
<polygon fill="none" stroke="black" points="90.5,-48 90.5,-71 150.5,-71 150.5,-48 90.5,-48"/>
<text text-anchor="start" x="94.5" y="-55.8" font-family="arial" font-size="14.00">1.0 mm²</text>
<polygon fill="none" stroke="black" points="150.5,-48 150.5,-71 177.5,-71 177.5,-48 150.5,-48"/>
<text text-anchor="start" x="154.5" y="-55.8" font-family="arial" font-size="14.00">YE</text>
<polygon fill="#ffff00" stroke="transparent" points="177.5,-48 177.5,-71 185.5,-71 185.5,-48 177.5,-48"/>
<polygon fill="none" stroke="black" points="177.5,-48 177.5,-71 185.5,-71 185.5,-48 177.5,-48"/>
</g> </g>
<!-- W1 --> <!-- W1 -->
<g id="node5" class="node"> <g id="node5" class="node">
@ -91,43 +85,43 @@
<polygon fill="#000000" stroke="transparent" points="331,-19 331,-21 469,-21 469,-19 331,-19"/> <polygon fill="#000000" stroke="transparent" points="331,-19 331,-21 469,-21 469,-19 331,-19"/>
<text text-anchor="start" x="333" y="-5.8" font-family="arial" font-size="14.00"> </text> <text text-anchor="start" x="333" y="-5.8" font-family="arial" font-size="14.00"> </text>
</g> </g>
<!-- F_10&#45;&#45;W1 --> <!-- AUTOGENERATED_F_05_1&#45;&#45;W1 -->
<g id="edge3" class="edge">
<title>F_10:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-58C252.16,-58.41 267.78,-70.41 331,-70"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-60C250.94,-60 266.56,-72 331,-72"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-62C249.72,-61.59 265.34,-73.59 331,-74"/>
</g>
<!-- F_10&#45;&#45;W1 -->
<g id="edge5" class="edge">
<title>F_10:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-58C249.7,-58.47 265.23,-45.47 331,-45"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-60C250.98,-60 266.52,-47 331,-47"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-62C252.27,-61.53 267.8,-48.53 331,-49"/>
</g>
<!-- _F_05_1 -->
<g id="node3" class="node">
<title>_F_05_1</title>
<polygon fill="#ffffff" stroke="black" points="187,-118.5 0,-118.5 0,-95.5 187,-95.5 187,-118.5"/>
<polygon fill="none" stroke="black" points="0.5,-95 0.5,-118 89.5,-118 89.5,-95 0.5,-95"/>
<text text-anchor="start" x="4.5" y="-102.8" font-family="arial" font-size="14.00">Crimp ferrule</text>
<polygon fill="none" stroke="black" points="89.5,-95 89.5,-118 149.5,-118 149.5,-95 89.5,-95"/>
<text text-anchor="start" x="93.5" y="-102.8" font-family="arial" font-size="14.00">0.5 mm²</text>
<polygon fill="none" stroke="black" points="149.5,-95 149.5,-118 179.5,-118 179.5,-95 149.5,-95"/>
<text text-anchor="start" x="153.5" y="-102.8" font-family="arial" font-size="14.00">OG</text>
<polygon fill="#ff8000" stroke="transparent" points="179.5,-95 179.5,-118 187.5,-118 187.5,-95 179.5,-95"/>
<polygon fill="none" stroke="black" points="179.5,-95 179.5,-118 187.5,-118 187.5,-95 179.5,-95"/>
</g>
<!-- _F_05_1&#45;&#45;W1 -->
<g id="edge1" class="edge"> <g id="edge1" class="edge">
<title>_F_05_1:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_05_1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-105C250.08,-105.31 265.77,-95.31 331,-95"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-105C250.08,-105.31 265.77,-95.31 331,-95"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M187,-107C251.15,-107 266.85,-97 331,-97"/> <path fill="none" stroke="#ffff00" stroke-width="2" d="M187,-107C251.15,-107 266.85,-97 331,-97"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-109C252.23,-108.69 267.92,-98.69 331,-99"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-109C252.23,-108.69 267.92,-98.69 331,-99"/>
</g> </g>
<!-- _F_05_2 --> <!-- F1 -->
<g id="node4" class="node"> <g id="node2" class="node">
<title>_F_05_2</title> <title>F1</title>
<polygon fill="#ffffff" stroke="black" points="185.5,-71.5 1.5,-71.5 1.5,-48.5 185.5,-48.5 185.5,-71.5"/>
<polygon fill="none" stroke="black" points="1.5,-48 1.5,-71 90.5,-71 90.5,-48 1.5,-48"/>
<text text-anchor="start" x="5.5" y="-55.8" font-family="arial" font-size="14.00">Crimp ferrule</text>
<polygon fill="none" stroke="black" points="90.5,-48 90.5,-71 150.5,-71 150.5,-48 90.5,-48"/>
<text text-anchor="start" x="94.5" y="-55.8" font-family="arial" font-size="14.00">1.0 mm²</text>
<polygon fill="none" stroke="black" points="150.5,-48 150.5,-71 177.5,-71 177.5,-48 150.5,-48"/>
<text text-anchor="start" x="154.5" y="-55.8" font-family="arial" font-size="14.00">YE</text>
<polygon fill="#ffff00" stroke="transparent" points="177.5,-48 177.5,-71 185.5,-71 185.5,-48 177.5,-48"/>
<polygon fill="none" stroke="black" points="177.5,-48 177.5,-71 185.5,-71 185.5,-48 177.5,-48"/>
</g>
<!-- F1&#45;&#45;W1 -->
<g id="edge3" class="edge">
<title>F1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-58C252.16,-58.41 267.78,-70.41 331,-70"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-60C250.94,-60 266.56,-72 331,-72"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-62C249.72,-61.59 265.34,-73.59 331,-74"/>
</g>
<!-- F1&#45;&#45;W1 -->
<g id="edge5" class="edge">
<title>F1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-58C249.7,-58.47 265.23,-45.47 331,-45"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-60C250.98,-60 266.52,-47 331,-47"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-62C252.27,-61.53 267.8,-48.53 331,-49"/>
</g>
<!-- AUTOGENERATED_F_05_2 -->
<g id="node3" class="node">
<title>AUTOGENERATED_F_05_2</title>
<polygon fill="#ffffff" stroke="black" points="187,-24.5 0,-24.5 0,-1.5 187,-1.5 187,-24.5"/> <polygon fill="#ffffff" stroke="black" points="187,-24.5 0,-24.5 0,-1.5 187,-1.5 187,-24.5"/>
<polygon fill="none" stroke="black" points="0.5,-1 0.5,-24 89.5,-24 89.5,-1 0.5,-1"/> <polygon fill="none" stroke="black" points="0.5,-1 0.5,-24 89.5,-24 89.5,-1 0.5,-1"/>
<text text-anchor="start" x="4.5" y="-8.8" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-8.8" font-family="arial" font-size="14.00">Crimp ferrule</text>
@ -138,13 +132,42 @@
<polygon fill="#ff8000" stroke="transparent" points="179.5,-1 179.5,-24 187.5,-24 187.5,-1 179.5,-1"/> <polygon fill="#ff8000" stroke="transparent" points="179.5,-1 179.5,-24 187.5,-24 187.5,-1 179.5,-1"/>
<polygon fill="none" stroke="black" points="179.5,-1 179.5,-24 187.5,-24 187.5,-1 179.5,-1"/> <polygon fill="none" stroke="black" points="179.5,-1 179.5,-24 187.5,-24 187.5,-1 179.5,-1"/>
</g> </g>
<!-- _F_05_2&#45;&#45;W1 --> <!-- AUTOGENERATED_F_05_2&#45;&#45;W1 -->
<g id="edge7" class="edge"> <g id="edge7" class="edge">
<title>_F_05_2:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_05_2:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-11C252.12,-11.26 267.87,-20.26 331,-20"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-11C252.12,-11.26 267.87,-20.26 331,-20"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M187,-13C251.12,-13 266.88,-22 331,-22"/> <path fill="none" stroke="#ff0000" stroke-width="2" d="M187,-13C251.12,-13 266.88,-22 331,-22"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-15C250.13,-14.74 265.88,-23.74 331,-24"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-15C250.13,-14.74 265.88,-23.74 331,-24"/>
</g> </g>
<!-- X1 -->
<g id="node4" class="node">
<title>X1</title>
<polygon fill="#ffffff" stroke="black" points="785,-152 613,-152 613,-14 785,-14 785,-152"/>
<polygon fill="none" stroke="black" points="613,-129 613,-152 785,-152 785,-129 613,-129"/>
<text text-anchor="start" x="690" y="-136.8" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="613,-106 613,-129 694,-129 694,-106 613,-106"/>
<text text-anchor="start" x="617" y="-113.8" font-family="arial" font-size="14.00">Molex 8981</text>
<polygon fill="none" stroke="black" points="694,-106 694,-129 745,-129 745,-106 694,-106"/>
<text text-anchor="start" x="698" y="-113.8" font-family="arial" font-size="14.00">female</text>
<polygon fill="none" stroke="black" points="745,-106 745,-129 785,-129 785,-106 745,-106"/>
<text text-anchor="start" x="749" y="-113.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="613,-83 613,-106 686,-106 686,-83 613,-83"/>
<text text-anchor="start" x="645.5" y="-90.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="686,-83 686,-106 785,-106 785,-83 686,-83"/>
<text text-anchor="start" x="718.5" y="-90.8" font-family="arial" font-size="14.00">+12V</text>
<polygon fill="none" stroke="black" points="613,-60 613,-83 686,-83 686,-60 613,-60"/>
<text text-anchor="start" x="645.5" y="-67.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="686,-60 686,-83 785,-83 785,-60 686,-60"/>
<text text-anchor="start" x="719.5" y="-67.8" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-37 613,-60 686,-60 686,-37 613,-37"/>
<text text-anchor="start" x="645.5" y="-44.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="686,-37 686,-60 785,-60 785,-37 686,-37"/>
<text text-anchor="start" x="719.5" y="-44.8" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-14 613,-37 686,-37 686,-14 613,-14"/>
<text text-anchor="start" x="645.5" y="-21.8" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="686,-14 686,-37 785,-37 785,-14 686,-14"/>
<text text-anchor="start" x="722.5" y="-21.8" font-family="arial" font-size="14.00">+5V</text>
</g>
<!-- W1&#45;&#45;X1 --> <!-- W1&#45;&#45;X1 -->
<g id="edge2" class="edge"> <g id="edge2" class="edge">
<title>W1:e&#45;&#45;X1:w</title> <title>W1:e&#45;&#45;X1:w</title>
@ -175,56 +198,68 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Crimp ferrule, 0.5 mm&sup2;, OG</td> <td class="bom_col_description">Connector, Crimp ferrule, 0.5 mm², OG</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td> <td class="bom_col_qty">2</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_designators"></td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Crimp ferrule, 1.0 mm&sup2;, YE</td> <td class="bom_col_description">Connector, Crimp ferrule, 1.0 mm², YE</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_designators"></td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex 8981, female, 4 pins</td> <td class="bom_col_description">Connector, Molex 8981, female, 4 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td> <td class="bom_col_qty">1</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1</td> <td class="bom_col_designators">X1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">4</td> <td class="bom_col_id">4</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.5 mm&sup2;, BK</td> <td class="bom_col_description">Wire, 0.5 mm², BK</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.6</td> <td class="bom_col_qty">0.6</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">5</td> <td class="bom_col_id">5</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.5 mm&sup2;, RD</td> <td class="bom_col_description">Wire, 0.5 mm², RD</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.3</td> <td class="bom_col_qty">0.3</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">6</td> <td class="bom_col_id">6</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.5 mm&sup2;, YE</td> <td class="bom_col_description">Wire, 0.5 mm², YE</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.3</td> <td class="bom_col_qty">0.3</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1</td> <td class="bom_col_designators">W1</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

150
tutorial/tutorial06.svg generated
View File

@ -1,54 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="793pt" height="192pt" <svg width="793pt" height="192pt"
viewBox="0.00 0.00 793.00 192.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> viewBox="0.00 0.00 793.00 192.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 188)"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 188)">
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-188 789,-188 789,4 -4,4"/> <polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-188 789,-188 789,4 -4,4"/>
<!-- X1 --> <!-- AUTOGENERATED_F_05_1 -->
<g id="node1" class="node"> <g id="node1" class="node">
<title>X1</title> <title>AUTOGENERATED_F_05_1</title>
<polygon fill="#ffffff" stroke="black" points="785,-152 613,-152 613,-14 785,-14 785,-152"/> <polygon fill="#ffffff" stroke="black" points="187,-118.5 0,-118.5 0,-95.5 187,-95.5 187,-118.5"/>
<polygon fill="none" stroke="black" points="613,-129 613,-152 785,-152 785,-129 613,-129"/> <polygon fill="none" stroke="black" points="0.5,-95 0.5,-118 89.5,-118 89.5,-95 0.5,-95"/>
<text text-anchor="start" x="690" y="-136.8" font-family="arial" font-size="14.00">X1</text> <text text-anchor="start" x="4.5" y="-102.8" font-family="arial" font-size="14.00">Crimp ferrule</text>
<polygon fill="none" stroke="black" points="613,-106 613,-129 694,-129 694,-106 613,-106"/> <polygon fill="none" stroke="black" points="89.5,-95 89.5,-118 149.5,-118 149.5,-95 89.5,-95"/>
<text text-anchor="start" x="617" y="-113.8" font-family="arial" font-size="14.00">Molex 8981</text> <text text-anchor="start" x="93.5" y="-102.8" font-family="arial" font-size="14.00">0.5 mm²</text>
<polygon fill="none" stroke="black" points="694,-106 694,-129 745,-129 745,-106 694,-106"/> <polygon fill="none" stroke="black" points="149.5,-95 149.5,-118 179.5,-118 179.5,-95 149.5,-95"/>
<text text-anchor="start" x="698" y="-113.8" font-family="arial" font-size="14.00">female</text> <text text-anchor="start" x="153.5" y="-102.8" font-family="arial" font-size="14.00">OG</text>
<polygon fill="none" stroke="black" points="745,-106 745,-129 785,-129 785,-106 745,-106"/> <polygon fill="#ff8000" stroke="transparent" points="179.5,-95 179.5,-118 187.5,-118 187.5,-95 179.5,-95"/>
<text text-anchor="start" x="749" y="-113.8" font-family="arial" font-size="14.00">4&#45;pin</text> <polygon fill="none" stroke="black" points="179.5,-95 179.5,-118 187.5,-118 187.5,-95 179.5,-95"/>
<polygon fill="none" stroke="black" points="613,-83 613,-106 686,-106 686,-83 613,-83"/>
<text text-anchor="start" x="645.5" y="-90.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="686,-83 686,-106 785,-106 785,-83 686,-83"/>
<text text-anchor="start" x="718.5" y="-90.8" font-family="arial" font-size="14.00">+12V</text>
<polygon fill="none" stroke="black" points="613,-60 613,-83 686,-83 686,-60 613,-60"/>
<text text-anchor="start" x="645.5" y="-67.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="686,-60 686,-83 785,-83 785,-60 686,-60"/>
<text text-anchor="start" x="719.5" y="-67.8" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-37 613,-60 686,-60 686,-37 613,-37"/>
<text text-anchor="start" x="645.5" y="-44.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="686,-37 686,-60 785,-60 785,-37 686,-37"/>
<text text-anchor="start" x="719.5" y="-44.8" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-14 613,-37 686,-37 686,-14 613,-14"/>
<text text-anchor="start" x="645.5" y="-21.8" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="686,-14 686,-37 785,-37 785,-14 686,-14"/>
<text text-anchor="start" x="722.5" y="-21.8" font-family="arial" font-size="14.00">+5V</text>
</g>
<!-- F_10 -->
<g id="node2" class="node">
<title>F_10</title>
<polygon fill="#ffffff" stroke="black" points="185.5,-71.5 1.5,-71.5 1.5,-48.5 185.5,-48.5 185.5,-71.5"/>
<polygon fill="none" stroke="black" points="1.5,-48 1.5,-71 90.5,-71 90.5,-48 1.5,-48"/>
<text text-anchor="start" x="5.5" y="-55.8" font-family="arial" font-size="14.00">Crimp ferrule</text>
<polygon fill="none" stroke="black" points="90.5,-48 90.5,-71 150.5,-71 150.5,-48 90.5,-48"/>
<text text-anchor="start" x="94.5" y="-55.8" font-family="arial" font-size="14.00">1.0 mm²</text>
<polygon fill="none" stroke="black" points="150.5,-48 150.5,-71 177.5,-71 177.5,-48 150.5,-48"/>
<text text-anchor="start" x="154.5" y="-55.8" font-family="arial" font-size="14.00">YE</text>
<polygon fill="#ffff00" stroke="transparent" points="177.5,-48 177.5,-71 185.5,-71 185.5,-48 177.5,-48"/>
<polygon fill="none" stroke="black" points="177.5,-48 177.5,-71 185.5,-71 185.5,-48 177.5,-48"/>
</g> </g>
<!-- W1 --> <!-- W1 -->
<g id="node5" class="node"> <g id="node5" class="node">
@ -85,43 +56,43 @@
<polygon fill="#000000" stroke="transparent" points="331,-19 331,-21 469,-21 469,-19 331,-19"/> <polygon fill="#000000" stroke="transparent" points="331,-19 331,-21 469,-21 469,-19 331,-19"/>
<text text-anchor="start" x="333" y="-5.8" font-family="arial" font-size="14.00"> </text> <text text-anchor="start" x="333" y="-5.8" font-family="arial" font-size="14.00"> </text>
</g> </g>
<!-- F_10&#45;&#45;W1 --> <!-- AUTOGENERATED_F_05_1&#45;&#45;W1 -->
<g id="edge3" class="edge">
<title>F_10:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-58C252.16,-58.41 267.78,-70.41 331,-70"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-60C250.94,-60 266.56,-72 331,-72"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-62C249.72,-61.59 265.34,-73.59 331,-74"/>
</g>
<!-- F_10&#45;&#45;W1 -->
<g id="edge5" class="edge">
<title>F_10:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-58C249.7,-58.47 265.23,-45.47 331,-45"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-60C250.98,-60 266.52,-47 331,-47"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-62C252.27,-61.53 267.8,-48.53 331,-49"/>
</g>
<!-- _F_05_1 -->
<g id="node3" class="node">
<title>_F_05_1</title>
<polygon fill="#ffffff" stroke="black" points="187,-118.5 0,-118.5 0,-95.5 187,-95.5 187,-118.5"/>
<polygon fill="none" stroke="black" points="0.5,-95 0.5,-118 89.5,-118 89.5,-95 0.5,-95"/>
<text text-anchor="start" x="4.5" y="-102.8" font-family="arial" font-size="14.00">Crimp ferrule</text>
<polygon fill="none" stroke="black" points="89.5,-95 89.5,-118 149.5,-118 149.5,-95 89.5,-95"/>
<text text-anchor="start" x="93.5" y="-102.8" font-family="arial" font-size="14.00">0.5 mm²</text>
<polygon fill="none" stroke="black" points="149.5,-95 149.5,-118 179.5,-118 179.5,-95 149.5,-95"/>
<text text-anchor="start" x="153.5" y="-102.8" font-family="arial" font-size="14.00">OG</text>
<polygon fill="#ff8000" stroke="transparent" points="179.5,-95 179.5,-118 187.5,-118 187.5,-95 179.5,-95"/>
<polygon fill="none" stroke="black" points="179.5,-95 179.5,-118 187.5,-118 187.5,-95 179.5,-95"/>
</g>
<!-- _F_05_1&#45;&#45;W1 -->
<g id="edge1" class="edge"> <g id="edge1" class="edge">
<title>_F_05_1:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_05_1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-105C250.08,-105.31 265.77,-95.31 331,-95"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-105C250.08,-105.31 265.77,-95.31 331,-95"/>
<path fill="none" stroke="#ffff00" stroke-width="2" d="M187,-107C251.15,-107 266.85,-97 331,-97"/> <path fill="none" stroke="#ffff00" stroke-width="2" d="M187,-107C251.15,-107 266.85,-97 331,-97"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-109C252.23,-108.69 267.92,-98.69 331,-99"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-109C252.23,-108.69 267.92,-98.69 331,-99"/>
</g> </g>
<!-- _F_05_2 --> <!-- F1 -->
<g id="node4" class="node"> <g id="node2" class="node">
<title>_F_05_2</title> <title>F1</title>
<polygon fill="#ffffff" stroke="black" points="185.5,-71.5 1.5,-71.5 1.5,-48.5 185.5,-48.5 185.5,-71.5"/>
<polygon fill="none" stroke="black" points="1.5,-48 1.5,-71 90.5,-71 90.5,-48 1.5,-48"/>
<text text-anchor="start" x="5.5" y="-55.8" font-family="arial" font-size="14.00">Crimp ferrule</text>
<polygon fill="none" stroke="black" points="90.5,-48 90.5,-71 150.5,-71 150.5,-48 90.5,-48"/>
<text text-anchor="start" x="94.5" y="-55.8" font-family="arial" font-size="14.00">1.0 mm²</text>
<polygon fill="none" stroke="black" points="150.5,-48 150.5,-71 177.5,-71 177.5,-48 150.5,-48"/>
<text text-anchor="start" x="154.5" y="-55.8" font-family="arial" font-size="14.00">YE</text>
<polygon fill="#ffff00" stroke="transparent" points="177.5,-48 177.5,-71 185.5,-71 185.5,-48 177.5,-48"/>
<polygon fill="none" stroke="black" points="177.5,-48 177.5,-71 185.5,-71 185.5,-48 177.5,-48"/>
</g>
<!-- F1&#45;&#45;W1 -->
<g id="edge3" class="edge">
<title>F1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-58C252.16,-58.41 267.78,-70.41 331,-70"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-60C250.94,-60 266.56,-72 331,-72"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-62C249.72,-61.59 265.34,-73.59 331,-74"/>
</g>
<!-- F1&#45;&#45;W1 -->
<g id="edge5" class="edge">
<title>F1:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-58C249.7,-58.47 265.23,-45.47 331,-45"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-60C250.98,-60 266.52,-47 331,-47"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M186.5,-62C252.27,-61.53 267.8,-48.53 331,-49"/>
</g>
<!-- AUTOGENERATED_F_05_2 -->
<g id="node3" class="node">
<title>AUTOGENERATED_F_05_2</title>
<polygon fill="#ffffff" stroke="black" points="187,-24.5 0,-24.5 0,-1.5 187,-1.5 187,-24.5"/> <polygon fill="#ffffff" stroke="black" points="187,-24.5 0,-24.5 0,-1.5 187,-1.5 187,-24.5"/>
<polygon fill="none" stroke="black" points="0.5,-1 0.5,-24 89.5,-24 89.5,-1 0.5,-1"/> <polygon fill="none" stroke="black" points="0.5,-1 0.5,-24 89.5,-24 89.5,-1 0.5,-1"/>
<text text-anchor="start" x="4.5" y="-8.8" font-family="arial" font-size="14.00">Crimp ferrule</text> <text text-anchor="start" x="4.5" y="-8.8" font-family="arial" font-size="14.00">Crimp ferrule</text>
@ -132,13 +103,42 @@
<polygon fill="#ff8000" stroke="transparent" points="179.5,-1 179.5,-24 187.5,-24 187.5,-1 179.5,-1"/> <polygon fill="#ff8000" stroke="transparent" points="179.5,-1 179.5,-24 187.5,-24 187.5,-1 179.5,-1"/>
<polygon fill="none" stroke="black" points="179.5,-1 179.5,-24 187.5,-24 187.5,-1 179.5,-1"/> <polygon fill="none" stroke="black" points="179.5,-1 179.5,-24 187.5,-24 187.5,-1 179.5,-1"/>
</g> </g>
<!-- _F_05_2&#45;&#45;W1 --> <!-- AUTOGENERATED_F_05_2&#45;&#45;W1 -->
<g id="edge7" class="edge"> <g id="edge7" class="edge">
<title>_F_05_2:e&#45;&#45;W1:w</title> <title>AUTOGENERATED_F_05_2:e&#45;&#45;W1:w</title>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-11C252.12,-11.26 267.87,-20.26 331,-20"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-11C252.12,-11.26 267.87,-20.26 331,-20"/>
<path fill="none" stroke="#ff0000" stroke-width="2" d="M187,-13C251.12,-13 266.88,-22 331,-22"/> <path fill="none" stroke="#ff0000" stroke-width="2" d="M187,-13C251.12,-13 266.88,-22 331,-22"/>
<path fill="none" stroke="#000000" stroke-width="2" d="M187,-15C250.13,-14.74 265.88,-23.74 331,-24"/> <path fill="none" stroke="#000000" stroke-width="2" d="M187,-15C250.13,-14.74 265.88,-23.74 331,-24"/>
</g> </g>
<!-- X1 -->
<g id="node4" class="node">
<title>X1</title>
<polygon fill="#ffffff" stroke="black" points="785,-152 613,-152 613,-14 785,-14 785,-152"/>
<polygon fill="none" stroke="black" points="613,-129 613,-152 785,-152 785,-129 613,-129"/>
<text text-anchor="start" x="690" y="-136.8" font-family="arial" font-size="14.00">X1</text>
<polygon fill="none" stroke="black" points="613,-106 613,-129 694,-129 694,-106 613,-106"/>
<text text-anchor="start" x="617" y="-113.8" font-family="arial" font-size="14.00">Molex 8981</text>
<polygon fill="none" stroke="black" points="694,-106 694,-129 745,-129 745,-106 694,-106"/>
<text text-anchor="start" x="698" y="-113.8" font-family="arial" font-size="14.00">female</text>
<polygon fill="none" stroke="black" points="745,-106 745,-129 785,-129 785,-106 745,-106"/>
<text text-anchor="start" x="749" y="-113.8" font-family="arial" font-size="14.00">4&#45;pin</text>
<polygon fill="none" stroke="black" points="613,-83 613,-106 686,-106 686,-83 613,-83"/>
<text text-anchor="start" x="645.5" y="-90.8" font-family="arial" font-size="14.00">1</text>
<polygon fill="none" stroke="black" points="686,-83 686,-106 785,-106 785,-83 686,-83"/>
<text text-anchor="start" x="718.5" y="-90.8" font-family="arial" font-size="14.00">+12V</text>
<polygon fill="none" stroke="black" points="613,-60 613,-83 686,-83 686,-60 613,-60"/>
<text text-anchor="start" x="645.5" y="-67.8" font-family="arial" font-size="14.00">2</text>
<polygon fill="none" stroke="black" points="686,-60 686,-83 785,-83 785,-60 686,-60"/>
<text text-anchor="start" x="719.5" y="-67.8" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-37 613,-60 686,-60 686,-37 613,-37"/>
<text text-anchor="start" x="645.5" y="-44.8" font-family="arial" font-size="14.00">3</text>
<polygon fill="none" stroke="black" points="686,-37 686,-60 785,-60 785,-37 686,-37"/>
<text text-anchor="start" x="719.5" y="-44.8" font-family="arial" font-size="14.00">GND</text>
<polygon fill="none" stroke="black" points="613,-14 613,-37 686,-37 686,-14 613,-14"/>
<text text-anchor="start" x="645.5" y="-21.8" font-family="arial" font-size="14.00">4</text>
<polygon fill="none" stroke="black" points="686,-14 686,-37 785,-37 785,-14 686,-14"/>
<text text-anchor="start" x="722.5" y="-21.8" font-family="arial" font-size="14.00">+5V</text>
</g>
<!-- W1&#45;&#45;X1 --> <!-- W1&#45;&#45;X1 -->
<g id="edge2" class="edge"> <g id="edge2" class="edge">
<title>W1:e&#45;&#45;X1:w</title> <title>W1:e&#45;&#45;X1:w</title>

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

103
tutorial/tutorial07.html generated
View File

@ -3,11 +3,34 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz"> <meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
<title>tutorial07</title> <title>tutorial07</title>
</head><body style="font-family:arial;background-color:#FFFFFF"> <style>
#bom table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
#bom th, td {
padding: 4px;
text-align: left;
}
.bom_col_qty {
text-align: right;
}
</style>
</head><body style="font-family:arial;background-color:#ffffff">
<h1>tutorial07</h1> <h1>tutorial07</h1>
<h2>Diagram</h2> <h2>Diagram</h2>
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.0 (20210828.1703) <div id="description">
<!-- %description% -->
</div>
<div id="diagram">
<!-- XML and DOCTYPE declarations from SVG file removed -->
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
--> -->
<!-- Pages: 1 --> <!-- Pages: 1 -->
<svg width="865pt" height="1024pt" <svg width="865pt" height="1024pt"
@ -665,49 +688,61 @@
</g> </g>
</g> </g>
</svg> </svg>
</div>
<div id="notes">
<!-- %notes% -->
</div>
<h2>Bill of Materials</h2> <h2>Bill of Materials</h2>
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
<div id="bom">
<table class="bom">
<tr> <tr>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th> <th class="bom_col_id">Id</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th> <th class="bom_col_description">Description</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th> <th class="bom_col_qty">Qty</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th> <th class="bom_col_unit">Unit</th>
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th> <th class="bom_col_designators">Designators</th>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">1</td> <td class="bom_col_id">1</td>
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 4 pins</td> <td class="bom_col_description">Connector, Molex KK 254, female, 4 pins</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">6</td> <td class="bom_col_qty">6</td>
<td style="border:1px solid #000000; padding: 4px"></td> <td class="bom_col_unit"></td>
<td style="border:1px solid #000000; padding: 4px">X1, X2, X3, X4, X5, X6</td> <td class="bom_col_designators">X1, X2, X3, X4, X5, X6</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">2</td> <td class="bom_col_id">2</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, PK</td> <td class="bom_col_description">Wire, 0.25 mm², PK</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1.0</td> <td class="bom_col_qty">1.0</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3, W4, W5</td> <td class="bom_col_designators">W1, W2, W3, W4, W5</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">3</td> <td class="bom_col_id">3</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, TQ</td> <td class="bom_col_description">Wire, 0.25 mm², TQ</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1.0</td> <td class="bom_col_qty">1.0</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3, W4, W5</td> <td class="bom_col_designators">W1, W2, W3, W4, W5</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">4</td> <td class="bom_col_id">4</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, VT</td> <td class="bom_col_description">Wire, 0.25 mm², VT</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1.0</td> <td class="bom_col_qty">1.0</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3, W4, W5</td> <td class="bom_col_designators">W1, W2, W3, W4, W5</td>
</tr> </tr>
<tr> <tr>
<td style="border:1px solid #000000; padding: 4px">5</td> <td class="bom_col_id">5</td>
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm&sup2;, YE</td> <td class="bom_col_description">Wire, 0.25 mm², YE</td>
<td style="border:1px solid #000000; padding: 4px; text-align:right">1.0</td> <td class="bom_col_qty">1.0</td>
<td style="border:1px solid #000000; padding: 4px">m</td> <td class="bom_col_unit">m</td>
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3, W4, W5</td> <td class="bom_col_designators">W1, W2, W3, W4, W5</td>
</tr> </tr>
</table> </table>
</div>
</body></html> </body></html>

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