Merge pull request #1 from laurierloi/refactor/big-refactor
Refactor/big refactor
6
.github/workflows/main.yml
vendored
@ -8,7 +8,7 @@ jobs:
|
||||
strategy:
|
||||
max-parallel: 4
|
||||
matrix:
|
||||
python-version: [3.7, 3.8]
|
||||
python-version: ["3.8", "3.10"]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
@ -22,11 +22,11 @@ jobs:
|
||||
python -m pip install --upgrade pip
|
||||
pip install .
|
||||
- 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
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: examples-and-tutorials
|
||||
path: |
|
||||
examples/
|
||||
tutorial/
|
||||
tutorial/
|
||||
|
||||
27
.gitignore
vendored
@ -1,13 +1,20 @@
|
||||
# OS-specific files
|
||||
.DS_Store
|
||||
.eggs
|
||||
__pycache__
|
||||
.*.swp
|
||||
desktop.ini
|
||||
Thumbs.db
|
||||
|
||||
# Development aids
|
||||
.idea/
|
||||
temp/
|
||||
venv/
|
||||
.venv/
|
||||
|
||||
# Build/compile/release artifacts
|
||||
build/
|
||||
dist/
|
||||
*.egg-info
|
||||
*.pyc
|
||||
build
|
||||
data
|
||||
dist
|
||||
venv/
|
||||
desktop.ini
|
||||
thumbs.db
|
||||
temp/
|
||||
|
||||
# Other temporary files
|
||||
__pycache__
|
||||
.*.swp
|
||||
|
||||
3
cleanup.sh
Executable file
@ -0,0 +1,3 @@
|
||||
autoflake -i --remove-all-unused-imports src/wireviz/*.py
|
||||
isort src/wireviz/*py
|
||||
black src/wireviz/*.py
|
||||
12
devtools.txt
Normal 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
|
||||
@ -25,6 +25,7 @@ When contributing to this repository, please [submit a new issue](https://github
|
||||
1. Create a new feature branch on top of the `dev` branch.
|
||||
1. Commit your code changes to this feature branch.
|
||||
1. Push the changes to your fork.
|
||||
1. Please format your code using [`isort`](https://pycqa.github.io/isort/) and [`black`](https://black.readthedocs.io) before submitting.
|
||||
1. Submit a new pull request, using `dev` as the base branch.
|
||||
- If your code changes or extends the WireViz YAML syntax, be sure to update the [syntax description document](https://github.com/formatc1702/WireViz/blob/dev/docs/syntax.md) in your PR.
|
||||
1. Please include in the PR description (and optionally also in the commit message body) a reference (# followed by issue number) to the issue where the suggested changes are discussed.
|
||||
|
||||
@ -4,6 +4,7 @@
|
||||
[](https://pypi.org/project/wireviz/)
|
||||
[](https://pypi.org/project/wireviz/)
|
||||
[](https://pypi.org/project/wireviz/)
|
||||
[](https://github.com/psf/black)
|
||||
|
||||
## Summary
|
||||
|
||||
@ -81,10 +82,11 @@ Output file:
|
||||
|
||||
[Source](../examples/demo02.yml) - [Bill of Materials](../examples/demo02.bom.tsv)
|
||||
|
||||
### Tutorial and example gallery
|
||||
### Syntax, tutorial and example gallery
|
||||
|
||||
See the [tutorial page](../tutorial/readme.md) for sample code,
|
||||
as well as the [example gallery](../examples/readme.md) to see more of what WireViz can do.
|
||||
Read the [syntax description](syntax.md) to learn about WireViz' features and how to use them.
|
||||
|
||||
See the [tutorial page](../tutorial/readme.md) for sample code, as well as the [example gallery](../examples/readme.md) to see more of what WireViz can do.
|
||||
|
||||
|
||||
## Usage
|
||||
@ -125,7 +127,7 @@ If you would like to contribute to this project, make sure you read the [contrib
|
||||
$ wireviz ~/path/to/file/mywire.yml
|
||||
```
|
||||
|
||||
This will output the following files
|
||||
Depending on the options specified, this will output some or all of the following files:
|
||||
|
||||
```
|
||||
mywire.gv GraphViz output
|
||||
@ -135,17 +137,16 @@ mywire.bom.tsv BOM (bill of materials) as tab-separated text file
|
||||
mywire.html HTML page with wiring diagram and BOM embedded
|
||||
```
|
||||
|
||||
#### Command line options
|
||||
Wildcars in the file path are also supported to process multiple files at once, e.g.:
|
||||
```
|
||||
$ wireviz ~/path/to/files/*.yml
|
||||
```
|
||||
|
||||
- `--prepend-file <FILE>` to prepend an additional YAML file. Useful for part libraries and templates shared among multiple cables/harnesses.
|
||||
- `-o <OUTPUT>` or `--output_file <OUTPUT>` to generate output files with a name different from the input file.
|
||||
- `-V` or `--version` to display the WireViz version.
|
||||
- `-h` or `--help` to see a summary of the usage help text.
|
||||
To see how to specify the output formats, as well as additional options, run:
|
||||
|
||||
|
||||
### Syntax description
|
||||
|
||||
A description of the WireViz YAML input syntax can be found [here](syntax.md).
|
||||
```
|
||||
$ wireviz --help
|
||||
```
|
||||
|
||||
|
||||
### (Re-)Building the example projects
|
||||
|
||||
103
docs/syntax.md
@ -85,22 +85,8 @@ tweak: # optional tweaking of .gv output
|
||||
# loops
|
||||
loops: <List> # every list item is itself a list of exactly two pins
|
||||
# on the connector that are to be shorted
|
||||
|
||||
# auto-generation
|
||||
autogenerate: <bool> # optional; defaults to false; see below
|
||||
|
||||
```
|
||||
|
||||
### Auto-generation of connectors
|
||||
|
||||
The `autogenerate: true` option is especially useful for very simple, recurring connectors such as crimp ferrules, splices, and others, where it would be a hassle to individually assign unique designators for every instance.
|
||||
|
||||
By default, when defining a connector, it will be generated once using the specified designator, and can be referenced multiple times, in different connection sets (see below).
|
||||
|
||||
If `autogenerate: true` is set, the connector will _not_ be generated at first. When defining the `connections` section (see below), every time the connector is mentioned, a new instance with an auto-incremented designator is generated and attached.
|
||||
|
||||
Since the auto-incremented and auto-assigned designator is not known to the user, one instance of the connector can not be referenced again outside the point of creation. The `autogenerate: true` option is therefore only useful for terminals with only one wire attached, or splices with exactly one wire going in, and one wire going out. If more wires are to be attached (e.g. for a three-way splice, or a crimp where multiple wires are joined), a separate connector with `autogenerate: false` and a user-defined, unique designator needs to be used.
|
||||
|
||||
## Cable attributes
|
||||
|
||||
```yaml
|
||||
@ -173,6 +159,7 @@ connections:
|
||||
- # Each list entry is a connection set
|
||||
- <component> # Each connection set is itself a list of items
|
||||
- <component> # Items must alternatingly belong to the connectors and cables sections
|
||||
# Arrows may be used instead of cables
|
||||
-...
|
||||
|
||||
- # example (single connection)
|
||||
@ -189,6 +176,18 @@ connections:
|
||||
- [<connector>, ..., <connector>] # specify multiple simple connectors to attach in parallel
|
||||
# these may be unique, auto-generated, or a mix of both
|
||||
|
||||
- # example (arrows between pins)
|
||||
- <connector>: [<pin>, ..., <pin>]
|
||||
- [<arrow>, ..., <arrow>] # draw arrow linking pins of both connectors
|
||||
# use single line arrows (--, <--, <-->, -->)
|
||||
- <connector>: [<pin>, ..., <pin>]
|
||||
|
||||
- # example (arrows between connectors)
|
||||
- <connector>
|
||||
- <arrow> # draw arrow linking the connectors themselves
|
||||
# use double line arrow (==, <==, <==>, ==>)
|
||||
- <connector>
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
@ -199,6 +198,7 @@ connections:
|
||||
- When a connection set defines multiple parallel connections, the number of specified `<pin>`s and `<wire>`s for each component in the set must match. When specifying only one designator, one is auto-generated for each connection of the set.
|
||||
- `<pin>` may reference a pin's unique ID (as per the connector's `pins` attribute, auto-numbered from 1 by default) or its label (as per `pinlabels`).
|
||||
- `<wire>` may reference a wire's number within a cable/bundle, its label (as per `wirelabels`) or, if unambiguous, its color.
|
||||
- For `<arrow>`, see below.
|
||||
|
||||
### Single connections
|
||||
|
||||
@ -249,6 +249,80 @@ For connectors with `autogenerate: true`, a new instance, with auto-generated de
|
||||
- `<int>-<int>` auto-expands to a range.
|
||||
- `<str>` to refer to a wire's label or color, if unambiguous.
|
||||
|
||||
### Arrows
|
||||
|
||||
Arrows may be used in place of wires to join two connectors. This can represent the mating of matching connectors.
|
||||
|
||||
To represent joining individual pins between two connectors, a list of single arrows is used:
|
||||
```yaml
|
||||
connections:
|
||||
-
|
||||
- <connector>: [<pin>,...,<pin>]
|
||||
- [<arrow>, ..., <arrow>] # --, <--, <--> or -->
|
||||
- <connector>: [<pin>,...,<pin>]
|
||||
```
|
||||
|
||||
To represent mating of two connectors as a whole, one double arrow is used:
|
||||
```yaml
|
||||
connections:
|
||||
-
|
||||
- <connector> # using connector designator only
|
||||
- <arrow> # ==, <==, <==> or ==>
|
||||
- <connector>
|
||||
-
|
||||
- ...
|
||||
- <connector>: [<pin>, ...] # designator and pinlist (pinlist is ignored)
|
||||
# useful when combining arrows and wires
|
||||
- <arrow> # ==, <==, <==> or ==>
|
||||
- <connector>: [<pin>, ...]
|
||||
- ...
|
||||
```
|
||||
|
||||
### Autogeneration of items
|
||||
|
||||
For very simple, recurring connectors such as crimp ferrules, splices and others, where it would be a hassle to individually assign unique designators for every instance, autogeneration may be used. Both connectors and cables can be autogenerated.
|
||||
|
||||
Example (see `connections` section):
|
||||
|
||||
```yaml
|
||||
connectors:
|
||||
X:
|
||||
# ...
|
||||
Y:
|
||||
# ...
|
||||
Z:
|
||||
style: simple
|
||||
# ...
|
||||
cables:
|
||||
V:
|
||||
# ...
|
||||
W:
|
||||
# ...
|
||||
|
||||
connections:
|
||||
- # no autogeneration (normal use)
|
||||
- X: [1,2,...] # Use X as both the template and the instance designator
|
||||
- V: [1,2,...] # Use V as both the template and the instance designator
|
||||
# ...
|
||||
|
||||
- # autogeneration of named instances
|
||||
- Y.Y1: [1,2,...] # Use template Y, generate instance with designator Y1
|
||||
- W.W1: [1,2,...] # Use template W, generate instance with designator W1
|
||||
- Y.Y2: [1,2,...] # generate more instances from the same templates
|
||||
- W.W2: [1,2,...]
|
||||
- Y.Y3: [1,2,...]
|
||||
|
||||
- # autogeneration of unnamed instances
|
||||
- Y3: [1,2,...] # reuse existing instance Y3
|
||||
- W.W4: [1,2,...]
|
||||
- Z. # Use template Z, generate one unnamed instance
|
||||
# for each connection in set
|
||||
```
|
||||
|
||||
Since the internally assigned designator of an unnamed component is not known to the user, one instance of the connector can not be referenced again outside the point of creation (i.e. in other connection sets, or later in the same set). Autogeneration of unnamed instances is therefore only useful for terminals with only one wire attached, or splices with exactly one wire going in, and one wire going out.
|
||||
If a component is to be used in other connection sets (e.g. for a three-way splice, or a crimp where multiple wires are joined), a named instance needs to be used.
|
||||
|
||||
Names of autogenerated components are hidden by default. While they can be shown in the graphical output using the `show_name: true` option, it is not recommended to manually use the internally assigned designator (starting with a double underscore `__`), since it might change in future WireViz versions, or when the order of items in connection sets changes.
|
||||
|
||||
|
||||
## Metadata entries
|
||||
@ -300,6 +374,7 @@ For connectors with `autogenerate: true`, a new instance, with auto-generated de
|
||||
mini_bom_mode: <bool> # Default = True
|
||||
```
|
||||
|
||||
|
||||
## BOM items and additional components
|
||||
|
||||
Connectors (both regular, and auto-generated), cables, and wires of a bundle are automatically added to the BOM,
|
||||
|
||||
4
examples/demo01.gv
generated
@ -1,5 +1,5 @@
|
||||
graph {
|
||||
// Graph generated by WireViz 0.3
|
||||
// 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]
|
||||
@ -60,6 +60,8 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
edge [color="#000000:#ffffff:#000000"]
|
||||
X1:p7r:e -- X1:p8r:e
|
||||
X2 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
|
||||
128
examples/demo01.html
generated
@ -1,13 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.3 - https://github.com/formatc1702/WireViz">
|
||||
<title>demo01</title>
|
||||
</head><body style="font-family:arial;background-color:#FFFFFF">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
|
||||
<title>demo01</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>demo01</h1>
|
||||
<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 -->
|
||||
<svg width="833pt" height="291pt"
|
||||
@ -18,6 +41,7 @@
|
||||
<g id="node1" class="node">
|
||||
<title>X1</title>
|
||||
<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"/>
|
||||
<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"/>
|
||||
@ -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"/>
|
||||
<text text-anchor="start" x="107" y="-7.3" font-family="arial" font-size="14.00">9</text>
|
||||
</g>
|
||||
<!-- X1--X1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>X1:e--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 -->
|
||||
<g id="node3" class="node">
|
||||
<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>
|
||||
</g>
|
||||
<!-- X1--W1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<g id="edge2" class="edge">
|
||||
<title>X1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- X1--W1 -->
|
||||
<g id="edge3" class="edge">
|
||||
<g id="edge4" class="edge">
|
||||
<title>X1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- X1--W1 -->
|
||||
<g id="edge5" class="edge">
|
||||
<g id="edge6" class="edge">
|
||||
<title>X1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- X1--W1 -->
|
||||
<g id="edge7" class="edge">
|
||||
<g id="edge8" class="edge">
|
||||
<title>X1:e--W1:w</title>
|
||||
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-102.5C203,-102.5 219,-103.5 283,-103.5"/>
|
||||
</g>
|
||||
@ -132,6 +163,7 @@
|
||||
<g id="node2" class="node">
|
||||
<title>X2</title>
|
||||
<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"/>
|
||||
<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"/>
|
||||
@ -154,21 +186,21 @@
|
||||
<text text-anchor="start" x="764" y="-146.3" font-family="arial" font-size="14.00">TX</text>
|
||||
</g>
|
||||
<!-- W1--X2 -->
|
||||
<g id="edge2" class="edge">
|
||||
<g id="edge3" class="edge">
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--X2 -->
|
||||
<g id="edge4" class="edge">
|
||||
<g id="edge5" class="edge">
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--X2 -->
|
||||
<g id="edge6" class="edge">
|
||||
<g id="edge7" class="edge">
|
||||
<title>W1:e--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="#00ff00" stroke-width="2" d="M494,-145.5C559.12,-145.5 572.88,-172.5 638,-172.5"/>
|
||||
@ -176,35 +208,47 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
<h2>Bill of Materials</h2>
|
||||
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
|
||||
<tr>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Cable, 3 x 0.25 mm² shielded</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, D-Sub, female, 9 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 3 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X2</td>
|
||||
</tr>
|
||||
|
||||
<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, 3 x 0.25 mm² shielded</td>
|
||||
<td class="bom_col_qty">0.2</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, D-Sub, female, 9 pins</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">Connector, Molex KK 254, female, 3 pins</td>
|
||||
<td class="bom_col_qty">1</td>
|
||||
<td class="bom_col_unit"></td>
|
||||
<td class="bom_col_designators">X2</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
</body></html>
|
||||
|
||||
BIN
examples/demo01.png
generated
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 63 KiB |
25
examples/demo01.svg
generated
@ -1,7 +1,7 @@
|
||||
<?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.0 (20210828.1703)
|
||||
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
|
||||
-->
|
||||
<!-- Pages: 1 -->
|
||||
<svg width="833pt" height="291pt"
|
||||
@ -12,6 +12,7 @@
|
||||
<g id="node1" class="node">
|
||||
<title>X1</title>
|
||||
<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"/>
|
||||
<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"/>
|
||||
@ -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"/>
|
||||
<text text-anchor="start" x="107" y="-7.3" font-family="arial" font-size="14.00">9</text>
|
||||
</g>
|
||||
<!-- X1--X1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>X1:e--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 -->
|
||||
<g id="node3" class="node">
|
||||
<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>
|
||||
</g>
|
||||
<!-- X1--W1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<g id="edge2" class="edge">
|
||||
<title>X1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- X1--W1 -->
|
||||
<g id="edge3" class="edge">
|
||||
<g id="edge4" class="edge">
|
||||
<title>X1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- X1--W1 -->
|
||||
<g id="edge5" class="edge">
|
||||
<g id="edge6" class="edge">
|
||||
<title>X1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- X1--W1 -->
|
||||
<g id="edge7" class="edge">
|
||||
<g id="edge8" class="edge">
|
||||
<title>X1:e--W1:w</title>
|
||||
<path fill="none" stroke="#000000" stroke-width="2" d="M139,-102.5C203,-102.5 219,-103.5 283,-103.5"/>
|
||||
</g>
|
||||
@ -126,6 +134,7 @@
|
||||
<g id="node2" class="node">
|
||||
<title>X2</title>
|
||||
<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"/>
|
||||
<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"/>
|
||||
@ -148,21 +157,21 @@
|
||||
<text text-anchor="start" x="764" y="-146.3" font-family="arial" font-size="14.00">TX</text>
|
||||
</g>
|
||||
<!-- W1--X2 -->
|
||||
<g id="edge2" class="edge">
|
||||
<g id="edge3" class="edge">
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--X2 -->
|
||||
<g id="edge4" class="edge">
|
||||
<g id="edge5" class="edge">
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--X2 -->
|
||||
<g id="edge6" class="edge">
|
||||
<g id="edge7" class="edge">
|
||||
<title>W1:e--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="#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 |
@ -1,8 +1,13 @@
|
||||
metadata:
|
||||
title: demo01
|
||||
|
||||
connectors:
|
||||
X1:
|
||||
type: D-Sub
|
||||
subtype: female
|
||||
pinlabels: [DCD, RX, TX, DTR, GND, DSR, RTS, CTS, RI]
|
||||
loops:
|
||||
- [7,8]
|
||||
X2:
|
||||
type: Molex KK 254
|
||||
subtype: female
|
||||
|
||||
10
examples/demo02.gv
generated
@ -1,5 +1,5 @@
|
||||
graph {
|
||||
// Graph generated by WireViz 0.3
|
||||
// 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]
|
||||
@ -168,7 +168,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_1 [label=<
|
||||
AUTOGENERATED_F_1 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -180,7 +180,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_2 [label=<
|
||||
AUTOGENERATED_F_2 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -487,10 +487,10 @@ graph {
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style="filled,dashed"]
|
||||
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
|
||||
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 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
|
||||
504
examples/demo02.html
generated
@ -1,13 +1,194 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.3 - https://github.com/formatc1702/WireViz">
|
||||
<title>demo02</title>
|
||||
</head><body style="font-family:arial;background-color:#FFFFFF">
|
||||
<h1>demo02</h1>
|
||||
<h2>Diagram</h2>
|
||||
<!-- XML and DOCTYPE declarations from SVG file removed -->
|
||||
<!-- Generated by graphviz version 2.49.0 (20210828.1703)
|
||||
<html>
|
||||
<head>
|
||||
<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">
|
||||
<title>WireViz Demo 2</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: arial;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
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 -->
|
||||
<svg width="882pt" height="767pt"
|
||||
@ -18,6 +199,7 @@
|
||||
<g id="node1" class="node">
|
||||
<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="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"/>
|
||||
<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"/>
|
||||
@ -264,6 +446,7 @@
|
||||
<g id="node2" class="node">
|
||||
<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="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"/>
|
||||
<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"/>
|
||||
@ -293,6 +476,7 @@
|
||||
<g id="node3" class="node">
|
||||
<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="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"/>
|
||||
<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"/>
|
||||
@ -322,6 +506,7 @@
|
||||
<g id="node4" class="node">
|
||||
<title>X4</title>
|
||||
<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"/>
|
||||
<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"/>
|
||||
@ -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"/>
|
||||
<text text-anchor="start" x="806.5" y="-168.3" font-family="arial" font-size="14.00">SCK</text>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_1 -->
|
||||
<!-- AUTOGENERATED_F_1 -->
|
||||
<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="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"/>
|
||||
<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"/>
|
||||
@ -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"/>
|
||||
<text text-anchor="start" x="351" y="-6.3" font-family="arial" font-size="14.00"> </text>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_1--W4 -->
|
||||
<!-- AUTOGENERATED_F_1--W4 -->
|
||||
<g id="edge25" class="edge">
|
||||
<title>_ferrule_crimp_1:e--W4:w</title>
|
||||
<title>AUTOGENERATED_F_1:e--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,-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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_2 -->
|
||||
<!-- AUTOGENERATED_F_2 -->
|
||||
<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="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"/>
|
||||
<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"/>
|
||||
@ -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="none" stroke="black" points="184,0.5 184,-22.5 192,-22.5 192,0.5 184,0.5"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_2--W4 -->
|
||||
<!-- AUTOGENERATED_F_2--W4 -->
|
||||
<g id="edge27" class="edge">
|
||||
<title>_ferrule_crimp_2:e--W4:w</title>
|
||||
<title>AUTOGENERATED_F_2:e--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="#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"/>
|
||||
@ -516,98 +703,193 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
<h2>Bill of Materials</h2>
|
||||
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
|
||||
<tr>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Cable, 2 x 0.25 mm²</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Crimp ferrule, 0.25 mm², YE</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 4 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X2, X3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">4</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 5 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">5</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 8 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">6</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm², BK</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.9</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">7</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm², BU</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">8</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm², GN</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.6</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">9</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm², OG</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">10</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm², RD</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.6</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">11</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm², VT</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">12</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.14 mm², YE</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.6</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="bom">
|
||||
<table class="bom">
|
||||
<tr>
|
||||
<td class="bom_col_id">12</td>
|
||||
<td class="bom_col_description">Wire, 0.14 mm², YE</td>
|
||||
<td class="bom_col_qty">0.6</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1, W2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">11</td>
|
||||
<td class="bom_col_description">Wire, 0.14 mm², VT</td>
|
||||
<td class="bom_col_qty">0.3</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">10</td>
|
||||
<td class="bom_col_description">Wire, 0.14 mm², RD</td>
|
||||
<td class="bom_col_qty">0.6</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1, W2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">9</td>
|
||||
<td class="bom_col_description">Wire, 0.14 mm², OG</td>
|
||||
<td class="bom_col_qty">0.3</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">8</td>
|
||||
<td class="bom_col_description">Wire, 0.14 mm², GN</td>
|
||||
<td class="bom_col_qty">0.6</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1, W2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">7</td>
|
||||
<td class="bom_col_description">Wire, 0.14 mm², BU</td>
|
||||
<td class="bom_col_qty">0.3</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">6</td>
|
||||
<td class="bom_col_description">Wire, 0.14 mm², BK</td>
|
||||
<td class="bom_col_qty">0.9</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1, W2, W3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">5</td>
|
||||
<td class="bom_col_description">Connector, Molex KK 254, female, 8 pins</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">4</td>
|
||||
<td class="bom_col_description">Connector, Molex KK 254, female, 5 pins</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">3</td>
|
||||
<td class="bom_col_description">Connector, Molex KK 254, female, 4 pins</td>
|
||||
<td class="bom_col_qty">2</td>
|
||||
<td class="bom_col_unit"></td>
|
||||
<td class="bom_col_designators">X2, X3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">2</td>
|
||||
<td class="bom_col_description">Connector, Crimp ferrule, 0.25 mm², YE</td>
|
||||
<td class="bom_col_qty">2</td>
|
||||
<td class="bom_col_unit"></td>
|
||||
<td class="bom_col_designators"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">1</td>
|
||||
<td class="bom_col_description">Cable, 2 x 0.25 mm²</td>
|
||||
<td class="bom_col_qty">0.3</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W4</td>
|
||||
</tr>
|
||||
<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>
|
||||
</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
|
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 185 KiB |
24
examples/demo02.svg
generated
@ -1,7 +1,7 @@
|
||||
<?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.0 (20210828.1703)
|
||||
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
|
||||
-->
|
||||
<!-- Pages: 1 -->
|
||||
<svg width="882pt" height="767pt"
|
||||
@ -12,6 +12,7 @@
|
||||
<g id="node1" class="node">
|
||||
<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="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"/>
|
||||
<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"/>
|
||||
@ -258,6 +259,7 @@
|
||||
<g id="node2" class="node">
|
||||
<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="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"/>
|
||||
<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"/>
|
||||
@ -287,6 +289,7 @@
|
||||
<g id="node3" class="node">
|
||||
<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="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"/>
|
||||
<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"/>
|
||||
@ -316,6 +319,7 @@
|
||||
<g id="node4" class="node">
|
||||
<title>X4</title>
|
||||
<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"/>
|
||||
<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"/>
|
||||
@ -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"/>
|
||||
<text text-anchor="start" x="806.5" y="-168.3" font-family="arial" font-size="14.00">SCK</text>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_1 -->
|
||||
<!-- AUTOGENERATED_F_1 -->
|
||||
<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="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"/>
|
||||
<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"/>
|
||||
@ -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"/>
|
||||
<text text-anchor="start" x="351" y="-6.3" font-family="arial" font-size="14.00"> </text>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_1--W4 -->
|
||||
<!-- AUTOGENERATED_F_1--W4 -->
|
||||
<g id="edge25" class="edge">
|
||||
<title>_ferrule_crimp_1:e--W4:w</title>
|
||||
<title>AUTOGENERATED_F_1:e--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,-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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_2 -->
|
||||
<!-- AUTOGENERATED_F_2 -->
|
||||
<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="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"/>
|
||||
<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"/>
|
||||
@ -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="none" stroke="black" points="184,0.5 184,-22.5 192,-22.5 192,0.5 184,0.5"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_2--W4 -->
|
||||
<!-- AUTOGENERATED_F_2--W4 -->
|
||||
<g id="edge27" class="edge">
|
||||
<title>_ferrule_crimp_2:e--W4:w</title>
|
||||
<title>AUTOGENERATED_F_2:e--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="#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"/>
|
||||
|
||||
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 41 KiB |
@ -1,3 +1,26 @@
|
||||
metadata:
|
||||
|
||||
title: WireViz Demo 2
|
||||
pn: WV-DEMO-02
|
||||
|
||||
authors:
|
||||
Created:
|
||||
name: D. Rojas
|
||||
date: 2020-05-20
|
||||
Approved:
|
||||
name: D. Rojas
|
||||
date: 2020-05-20
|
||||
|
||||
revisions:
|
||||
A:
|
||||
name: D. Rojas
|
||||
date: 2020-10-17
|
||||
changelog: WireViz 0.2 release
|
||||
|
||||
template:
|
||||
name: din-6771
|
||||
sheetsize: A3
|
||||
|
||||
templates: # defining templates to be used later on
|
||||
- &molex_f
|
||||
type: Molex KK 254
|
||||
@ -22,9 +45,8 @@ connectors:
|
||||
X4:
|
||||
<<: *molex_f
|
||||
pinlabels: [GND, +12V, MISO, MOSI, SCK]
|
||||
ferrule_crimp:
|
||||
F:
|
||||
style: simple
|
||||
autogenerate: true
|
||||
type: Crimp ferrule
|
||||
subtype: 0.25 mm²
|
||||
color: YE
|
||||
@ -64,6 +86,6 @@ connections:
|
||||
- W3: [1-4]
|
||||
- X4: [1,3-5]
|
||||
-
|
||||
- ferrule_crimp
|
||||
- F.
|
||||
- W4: [1,2]
|
||||
- X4: [1,2]
|
||||
|
||||
2
examples/ex01.gv
generated
@ -1,5 +1,5 @@
|
||||
graph {
|
||||
// Graph generated by WireViz 0.3
|
||||
// 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]
|
||||
|
||||
91
examples/ex01.html
generated
@ -1,13 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.3 - https://github.com/formatc1702/WireViz">
|
||||
<title>ex01</title>
|
||||
</head><body style="font-family:arial;background-color:#FFFFFF">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
|
||||
<title>ex01</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>ex01</h1>
|
||||
<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 -->
|
||||
<svg width="943pt" height="232pt"
|
||||
@ -182,28 +205,40 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
<h2>Bill of Materials</h2>
|
||||
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
|
||||
<tr>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Cable, Serial, 4 x 0.25 mm² shielded</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 4 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X1, X2</td>
|
||||
</tr>
|
||||
|
||||
<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, Serial, 4 x 0.25 mm² shielded</td>
|
||||
<td class="bom_col_qty">0.2</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, Molex KK 254, female, 4 pins</td>
|
||||
<td class="bom_col_qty">2</td>
|
||||
<td class="bom_col_unit"></td>
|
||||
<td class="bom_col_designators">X1, X2</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
</body></html>
|
||||
|
||||
2
examples/ex01.svg
generated
@ -1,7 +1,7 @@
|
||||
<?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.0 (20210828.1703)
|
||||
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
|
||||
-->
|
||||
<!-- Pages: 1 -->
|
||||
<svg width="943pt" height="232pt"
|
||||
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
2
examples/ex02.gv
generated
@ -1,5 +1,5 @@
|
||||
graph {
|
||||
// Graph generated by WireViz 0.3
|
||||
// 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]
|
||||
|
||||
119
examples/ex02.html
generated
@ -1,13 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.3 - https://github.com/formatc1702/WireViz">
|
||||
<title>ex02</title>
|
||||
</head><body style="font-family:arial;background-color:#FFFFFF">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
|
||||
<title>ex02</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>ex02</h1>
|
||||
<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 -->
|
||||
<svg width="881pt" height="458pt"
|
||||
@ -265,42 +288,54 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
<h2>Bill of Materials</h2>
|
||||
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
|
||||
<tr>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Cable, 2 x 0.25 mm²</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.4</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Cable, 2 x 20 AWG</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Molex Micro-Fit, female, 2 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X2, X3, X4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">4</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Molex Micro-Fit, male, 2 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X1</td>
|
||||
</tr>
|
||||
|
||||
<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, 2 x 0.25 mm²</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">2</td>
|
||||
<td class="bom_col_description">Cable, 2 x 20 AWG</td>
|
||||
<td class="bom_col_qty">0.2</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">3</td>
|
||||
<td class="bom_col_description">Connector, Molex Micro-Fit, female, 2 pins</td>
|
||||
<td class="bom_col_qty">3</td>
|
||||
<td class="bom_col_unit"></td>
|
||||
<td class="bom_col_designators">X2, X3, X4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">4</td>
|
||||
<td class="bom_col_description">Connector, Molex Micro-Fit, male, 2 pins</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>
|
||||
|
||||
2
examples/ex02.svg
generated
@ -1,7 +1,7 @@
|
||||
<?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.0 (20210828.1703)
|
||||
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
|
||||
-->
|
||||
<!-- Pages: 1 -->
|
||||
<svg width="881pt" height="458pt"
|
||||
|
||||
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
2
examples/ex03.gv
generated
@ -1,5 +1,5 @@
|
||||
graph {
|
||||
// Graph generated by WireViz 0.3
|
||||
// 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]
|
||||
|
||||
119
examples/ex03.html
generated
@ -1,13 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.3 - https://github.com/formatc1702/WireViz">
|
||||
<title>ex03</title>
|
||||
</head><body style="font-family:arial;background-color:#FFFFFF">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
|
||||
<title>ex03</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>ex03</h1>
|
||||
<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 -->
|
||||
<svg width="873pt" height="332pt"
|
||||
@ -235,42 +258,54 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
<h2>Bill of Materials</h2>
|
||||
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
|
||||
<tr>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Molex Micro-Fit, female, 2 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X2, X3, X4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Molex Micro-Fit, male, 2 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm², BK</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.6</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">4</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm², RD</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.6</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1</td>
|
||||
</tr>
|
||||
|
||||
<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, Molex Micro-Fit, female, 2 pins</td>
|
||||
<td class="bom_col_qty">3</td>
|
||||
<td class="bom_col_unit"></td>
|
||||
<td class="bom_col_designators">X2, X3, X4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">2</td>
|
||||
<td class="bom_col_description">Connector, Molex Micro-Fit, male, 2 pins</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, 0.25 mm², BK</td>
|
||||
<td class="bom_col_qty">0.6</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">4</td>
|
||||
<td class="bom_col_description">Wire, 0.25 mm², RD</td>
|
||||
<td class="bom_col_qty">0.6</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
</body></html>
|
||||
|
||||
2
examples/ex03.svg
generated
@ -1,7 +1,7 @@
|
||||
<?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.0 (20210828.1703)
|
||||
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
|
||||
-->
|
||||
<!-- Pages: 1 -->
|
||||
<svg width="873pt" height="332pt"
|
||||
|
||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
50
examples/ex04.gv
generated
@ -1,10 +1,10 @@
|
||||
graph {
|
||||
// Graph generated by WireViz 0.3
|
||||
// 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]
|
||||
_ferrule_crimp_1 [label=<
|
||||
AUTOGENERATED_F_1 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -13,7 +13,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_2 [label=<
|
||||
AUTOGENERATED_F_2 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -22,7 +22,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_3 [label=<
|
||||
AUTOGENERATED_F_3 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -31,7 +31,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_4 [label=<
|
||||
AUTOGENERATED_F_4 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -40,7 +40,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_5 [label=<
|
||||
AUTOGENERATED_F_5 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -49,7 +49,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_6 [label=<
|
||||
AUTOGENERATED_F_6 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -58,7 +58,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_7 [label=<
|
||||
AUTOGENERATED_F_7 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -67,7 +67,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_8 [label=<
|
||||
AUTOGENERATED_F_8 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -76,7 +76,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_9 [label=<
|
||||
AUTOGENERATED_F_9 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -85,7 +85,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_10 [label=<
|
||||
AUTOGENERATED_F_10 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -94,7 +94,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_11 [label=<
|
||||
AUTOGENERATED_F_11 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -103,7 +103,7 @@ graph {
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
_ferrule_crimp_12 [label=<
|
||||
AUTOGENERATED_F_12 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
@ -113,23 +113,23 @@ graph {
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
edge [color="#000000:#895956:#000000"]
|
||||
_ferrule_crimp_1:e -- W1:w1:w
|
||||
W1:w1:e -- _ferrule_crimp_7:w
|
||||
AUTOGENERATED_F_1:e -- W1:w1:w
|
||||
W1:w1:e -- AUTOGENERATED_F_7:w
|
||||
edge [color="#000000:#ff0000:#000000"]
|
||||
_ferrule_crimp_2:e -- W1:w2:w
|
||||
W1:w2:e -- _ferrule_crimp_8:w
|
||||
AUTOGENERATED_F_2:e -- W1:w2:w
|
||||
W1:w2:e -- AUTOGENERATED_F_8:w
|
||||
edge [color="#000000:#ff8000:#000000"]
|
||||
_ferrule_crimp_3:e -- W1:w3:w
|
||||
W1:w3:e -- _ferrule_crimp_9:w
|
||||
AUTOGENERATED_F_3:e -- W1:w3:w
|
||||
W1:w3:e -- AUTOGENERATED_F_9:w
|
||||
edge [color="#000000:#ffff00:#000000"]
|
||||
_ferrule_crimp_4:e -- W1:w4:w
|
||||
W1:w4:e -- _ferrule_crimp_10:w
|
||||
AUTOGENERATED_F_4:e -- W1:w4:w
|
||||
W1:w4:e -- AUTOGENERATED_F_10:w
|
||||
edge [color="#000000:#00ff00:#000000"]
|
||||
_ferrule_crimp_5:e -- W1:w5:w
|
||||
W1:w5:e -- _ferrule_crimp_11:w
|
||||
AUTOGENERATED_F_5:e -- W1:w5:w
|
||||
W1:w5:e -- AUTOGENERATED_F_11:w
|
||||
edge [color="#000000:#0066ff:#000000"]
|
||||
_ferrule_crimp_6:e -- W1:w6:w
|
||||
W1:w6:e -- _ferrule_crimp_12:w
|
||||
AUTOGENERATED_F_6:e -- W1:w6:w
|
||||
W1:w6:e -- AUTOGENERATED_F_12:w
|
||||
W1 [label=<
|
||||
<table border="0" cellspacing="0" cellpadding="0">
|
||||
<tr><td>
|
||||
|
||||
257
examples/ex04.html
generated
@ -1,22 +1,45 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.3 - https://github.com/formatc1702/WireViz">
|
||||
<title>ex04</title>
|
||||
</head><body style="font-family:arial;background-color:#FFFFFF">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
|
||||
<title>ex04</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>ex04</h1>
|
||||
<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 -->
|
||||
<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">
|
||||
<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"/>
|
||||
<!-- _ferrule_crimp_1 -->
|
||||
<!-- AUTOGENERATED_F_1 -->
|
||||
<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="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>
|
||||
@ -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"/>
|
||||
<text text-anchor="start" x="256.5" y="-50.3" font-family="arial" font-size="14.00"> </text>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_1--W1 -->
|
||||
<!-- AUTOGENERATED_F_1--W1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>_ferrule_crimp_1:e--W1:w</title>
|
||||
<title>AUTOGENERATED_F_1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_2 -->
|
||||
<!-- AUTOGENERATED_F_2 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_2--W1 -->
|
||||
<!-- AUTOGENERATED_F_2--W1 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>_ferrule_crimp_2:e--W1:w</title>
|
||||
<title>AUTOGENERATED_F_2:e--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="#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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_3 -->
|
||||
<!-- AUTOGENERATED_F_3 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_3--W1 -->
|
||||
<!-- AUTOGENERATED_F_3--W1 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>_ferrule_crimp_3:e--W1:w</title>
|
||||
<title>AUTOGENERATED_F_3:e--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="#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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_4 -->
|
||||
<!-- AUTOGENERATED_F_4 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_4--W1 -->
|
||||
<!-- AUTOGENERATED_F_4--W1 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>_ferrule_crimp_4:e--W1:w</title>
|
||||
<title>AUTOGENERATED_F_4:e--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="#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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_5 -->
|
||||
<!-- AUTOGENERATED_F_5 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_5--W1 -->
|
||||
<!-- AUTOGENERATED_F_5--W1 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>_ferrule_crimp_5:e--W1:w</title>
|
||||
<title>AUTOGENERATED_F_5:e--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="#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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_6 -->
|
||||
<!-- AUTOGENERATED_F_6 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_6--W1 -->
|
||||
<!-- AUTOGENERATED_F_6--W1 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>_ferrule_crimp_6:e--W1:w</title>
|
||||
<title>AUTOGENERATED_F_6:e--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="#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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_7 -->
|
||||
<!-- AUTOGENERATED_F_7 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_8 -->
|
||||
<!-- AUTOGENERATED_F_8 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_9 -->
|
||||
<!-- AUTOGENERATED_F_9 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_10 -->
|
||||
<!-- AUTOGENERATED_F_10 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_11 -->
|
||||
<!-- AUTOGENERATED_F_11 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_12 -->
|
||||
<!-- AUTOGENERATED_F_12 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- W1--_ferrule_crimp_7 -->
|
||||
<!-- W1--AUTOGENERATED_F_7 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>W1:e--_ferrule_crimp_7:w</title>
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--_ferrule_crimp_8 -->
|
||||
<!-- W1--AUTOGENERATED_F_8 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>W1:e--_ferrule_crimp_8:w</title>
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--_ferrule_crimp_9 -->
|
||||
<!-- W1--AUTOGENERATED_F_9 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>W1:e--_ferrule_crimp_9:w</title>
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--_ferrule_crimp_10 -->
|
||||
<!-- W1--AUTOGENERATED_F_10 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>W1:e--_ferrule_crimp_10:w</title>
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--_ferrule_crimp_11 -->
|
||||
<!-- W1--AUTOGENERATED_F_11 -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>W1:e--_ferrule_crimp_11:w</title>
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--_ferrule_crimp_12 -->
|
||||
<!-- W1--AUTOGENERATED_F_12 -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>W1:e--_ferrule_crimp_12:w</title>
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
<h2>Bill of Materials</h2>
|
||||
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
|
||||
<tr>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Crimp ferrule</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">12</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm², BN</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm², BU</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">4</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm², GN</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">5</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm², OG</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">6</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm², RD</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">7</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm², YE</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1</td>
|
||||
</tr>
|
||||
|
||||
<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, Crimp ferrule</td>
|
||||
<td class="bom_col_qty">12</td>
|
||||
<td class="bom_col_unit"></td>
|
||||
<td class="bom_col_designators"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">2</td>
|
||||
<td class="bom_col_description">Wire, 0.25 mm², BN</td>
|
||||
<td class="bom_col_qty">0.2</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">3</td>
|
||||
<td class="bom_col_description">Wire, 0.25 mm², BU</td>
|
||||
<td class="bom_col_qty">0.2</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">4</td>
|
||||
<td class="bom_col_description">Wire, 0.25 mm², GN</td>
|
||||
<td class="bom_col_qty">0.2</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">5</td>
|
||||
<td class="bom_col_description">Wire, 0.25 mm², OG</td>
|
||||
<td class="bom_col_qty">0.2</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">6</td>
|
||||
<td class="bom_col_description">Wire, 0.25 mm², RD</td>
|
||||
<td class="bom_col_qty">0.2</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">7</td>
|
||||
<td class="bom_col_description">Wire, 0.25 mm², YE</td>
|
||||
<td class="bom_col_qty">0.2</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
</body></html>
|
||||
|
||||
98
examples/ex04.svg
generated
@ -1,16 +1,16 @@
|
||||
<?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.0 (20210828.1703)
|
||||
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
|
||||
-->
|
||||
<!-- Pages: 1 -->
|
||||
<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">
|
||||
<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"/>
|
||||
<!-- _ferrule_crimp_1 -->
|
||||
<!-- AUTOGENERATED_F_1 -->
|
||||
<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="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>
|
||||
@ -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"/>
|
||||
<text text-anchor="start" x="256.5" y="-50.3" font-family="arial" font-size="14.00"> </text>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_1--W1 -->
|
||||
<!-- AUTOGENERATED_F_1--W1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>_ferrule_crimp_1:e--W1:w</title>
|
||||
<title>AUTOGENERATED_F_1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_2 -->
|
||||
<!-- AUTOGENERATED_F_2 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_2--W1 -->
|
||||
<!-- AUTOGENERATED_F_2--W1 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>_ferrule_crimp_2:e--W1:w</title>
|
||||
<title>AUTOGENERATED_F_2:e--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="#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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_3 -->
|
||||
<!-- AUTOGENERATED_F_3 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_3--W1 -->
|
||||
<!-- AUTOGENERATED_F_3--W1 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>_ferrule_crimp_3:e--W1:w</title>
|
||||
<title>AUTOGENERATED_F_3:e--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="#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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_4 -->
|
||||
<!-- AUTOGENERATED_F_4 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_4--W1 -->
|
||||
<!-- AUTOGENERATED_F_4--W1 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>_ferrule_crimp_4:e--W1:w</title>
|
||||
<title>AUTOGENERATED_F_4:e--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="#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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_5 -->
|
||||
<!-- AUTOGENERATED_F_5 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_5--W1 -->
|
||||
<!-- AUTOGENERATED_F_5--W1 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>_ferrule_crimp_5:e--W1:w</title>
|
||||
<title>AUTOGENERATED_F_5:e--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="#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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_6 -->
|
||||
<!-- AUTOGENERATED_F_6 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_6--W1 -->
|
||||
<!-- AUTOGENERATED_F_6--W1 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>_ferrule_crimp_6:e--W1:w</title>
|
||||
<title>AUTOGENERATED_F_6:e--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="#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"/>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_7 -->
|
||||
<!-- AUTOGENERATED_F_7 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_8 -->
|
||||
<!-- AUTOGENERATED_F_8 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_9 -->
|
||||
<!-- AUTOGENERATED_F_9 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_10 -->
|
||||
<!-- AUTOGENERATED_F_10 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_11 -->
|
||||
<!-- AUTOGENERATED_F_11 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- _ferrule_crimp_12 -->
|
||||
<!-- AUTOGENERATED_F_12 -->
|
||||
<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="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>
|
||||
</g>
|
||||
<!-- W1--_ferrule_crimp_7 -->
|
||||
<!-- W1--AUTOGENERATED_F_7 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>W1:e--_ferrule_crimp_7:w</title>
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--_ferrule_crimp_8 -->
|
||||
<!-- W1--AUTOGENERATED_F_8 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>W1:e--_ferrule_crimp_8:w</title>
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--_ferrule_crimp_9 -->
|
||||
<!-- W1--AUTOGENERATED_F_9 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>W1:e--_ferrule_crimp_9:w</title>
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--_ferrule_crimp_10 -->
|
||||
<!-- W1--AUTOGENERATED_F_10 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>W1:e--_ferrule_crimp_10:w</title>
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--_ferrule_crimp_11 -->
|
||||
<!-- W1--AUTOGENERATED_F_11 -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>W1:e--_ferrule_crimp_11:w</title>
|
||||
<title>W1:e--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="#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"/>
|
||||
</g>
|
||||
<!-- W1--_ferrule_crimp_12 -->
|
||||
<!-- W1--AUTOGENERATED_F_12 -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>W1:e--_ferrule_crimp_12:w</title>
|
||||
<title>W1:e--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="#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"/>
|
||||
|
||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
@ -8,13 +8,12 @@ cables:
|
||||
category: bundle
|
||||
|
||||
connectors:
|
||||
ferrule_crimp:
|
||||
F:
|
||||
style: simple
|
||||
autogenerate: true
|
||||
type: Crimp ferrule
|
||||
|
||||
connections:
|
||||
-
|
||||
- ferrule_crimp
|
||||
- F.
|
||||
- W1: [1-6]
|
||||
- ferrule_crimp
|
||||
- F.
|
||||
|
||||
2
examples/ex05.gv
generated
@ -1,5 +1,5 @@
|
||||
graph {
|
||||
// Graph generated by WireViz 0.3
|
||||
// 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]
|
||||
|
||||
133
examples/ex05.html
generated
@ -1,13 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.3 - https://github.com/formatc1702/WireViz">
|
||||
<title>ex05</title>
|
||||
</head><body style="font-family:arial;background-color:#FFFFFF">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
|
||||
<title>ex05</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>ex05</h1>
|
||||
<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 -->
|
||||
<svg width="1535pt" height="192pt"
|
||||
@ -305,49 +328,61 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
<h2>Bill of Materials</h2>
|
||||
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
|
||||
<tr>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">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 style="border:1px solid #000000; padding: 4px; text-align:right">3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X1, X2, X3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, I2C, 0.25 mm², PK</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.4</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, I2C, 0.25 mm², TQ</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.4</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">4</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, I2C, 0.25 mm², VT</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.4</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">5</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, I2C, 0.25 mm², YE</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.4</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2</td>
|
||||
</tr>
|
||||
|
||||
<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, <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_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">2</td>
|
||||
<td class="bom_col_description">Wire, I2C, 0.25 mm², PK</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">3</td>
|
||||
<td class="bom_col_description">Wire, I2C, 0.25 mm², TQ</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, I2C, 0.25 mm², VT</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, I2C, 0.25 mm², YE</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>
|
||||
|
||||
2
examples/ex05.svg
generated
@ -1,7 +1,7 @@
|
||||
<?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.0 (20210828.1703)
|
||||
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
|
||||
-->
|
||||
<!-- Pages: 1 -->
|
||||
<svg width="1535pt" height="192pt"
|
||||
|
||||
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
2
examples/ex06.gv
generated
@ -1,5 +1,5 @@
|
||||
graph {
|
||||
// Graph generated by WireViz 0.3
|
||||
// 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]
|
||||
|
||||
133
examples/ex06.html
generated
@ -1,13 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.3 - https://github.com/formatc1702/WireViz">
|
||||
<title>ex06</title>
|
||||
</head><body style="font-family:arial;background-color:#FFFFFF">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
|
||||
<title>ex06</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>ex06</h1>
|
||||
<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 -->
|
||||
<svg width="865pt" height="1024pt"
|
||||
@ -665,49 +688,61 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
<h2>Bill of Materials</h2>
|
||||
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
|
||||
<tr>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Molex KK 254, female, 4 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">6</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X1, X2, X3, X4, X5, X6</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm², PK</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1.0</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3, W4, W5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm², TQ</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1.0</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3, W4, W5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">4</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm², VT</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1.0</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3, W4, W5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">5</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Wire, 0.25 mm², YE</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1.0</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1, W2, W3, W4, W5</td>
|
||||
</tr>
|
||||
|
||||
<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, Molex KK 254, female, 4 pins</td>
|
||||
<td class="bom_col_qty">6</td>
|
||||
<td class="bom_col_unit"></td>
|
||||
<td class="bom_col_designators">X1, X2, X3, X4, X5, X6</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">2</td>
|
||||
<td class="bom_col_description">Wire, 0.25 mm², PK</td>
|
||||
<td class="bom_col_qty">1.0</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1, W2, W3, W4, W5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">3</td>
|
||||
<td class="bom_col_description">Wire, 0.25 mm², TQ</td>
|
||||
<td class="bom_col_qty">1.0</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1, W2, W3, W4, W5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">4</td>
|
||||
<td class="bom_col_description">Wire, 0.25 mm², VT</td>
|
||||
<td class="bom_col_qty">1.0</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1, W2, W3, W4, W5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">5</td>
|
||||
<td class="bom_col_description">Wire, 0.25 mm², YE</td>
|
||||
<td class="bom_col_qty">1.0</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">W1, W2, W3, W4, W5</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
</body></html>
|
||||
|
||||
2
examples/ex06.svg
generated
@ -1,7 +1,7 @@
|
||||
<?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.0 (20210828.1703)
|
||||
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
|
||||
-->
|
||||
<!-- Pages: 1 -->
|
||||
<svg width="865pt" height="1024pt"
|
||||
|
||||
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
2
examples/ex07.gv
generated
@ -1,5 +1,5 @@
|
||||
graph {
|
||||
// Graph generated by WireViz 0.3
|
||||
// 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]
|
||||
|
||||
105
examples/ex07.html
generated
@ -1,13 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.3 - https://github.com/formatc1702/WireViz">
|
||||
<title>ex07</title>
|
||||
</head><body style="font-family:arial;background-color:#FFFFFF">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
|
||||
<title>ex07</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>ex07</h1>
|
||||
<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 -->
|
||||
<svg width="858pt" height="153pt"
|
||||
@ -109,35 +132,47 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
<h2>Bill of Materials</h2>
|
||||
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
|
||||
<tr>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Cable, 2 x 20 AWG</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">C1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, D-Sub, female, 9 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, TE 776164-1, female, 35 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X1</td>
|
||||
</tr>
|
||||
|
||||
<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, 2 x 20 AWG</td>
|
||||
<td class="bom_col_qty">1</td>
|
||||
<td class="bom_col_unit">m</td>
|
||||
<td class="bom_col_designators">C1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="bom_col_id">2</td>
|
||||
<td class="bom_col_description">Connector, D-Sub, female, 9 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">3</td>
|
||||
<td class="bom_col_description">Connector, TE 776164-1, female, 35 pins</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>
|
||||
|
||||
2
examples/ex07.svg
generated
@ -1,7 +1,7 @@
|
||||
<?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.0 (20210828.1703)
|
||||
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
|
||||
-->
|
||||
<!-- Pages: 1 -->
|
||||
<svg width="858pt" height="153pt"
|
||||
|
||||
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
6
examples/ex08.gv
generated
@ -1,5 +1,5 @@
|
||||
graph {
|
||||
// Graph generated by WireViz 0.3
|
||||
// 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]
|
||||
@ -35,7 +35,7 @@ graph {
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
<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>
|
||||
</td></tr>
|
||||
<tr><td>
|
||||
@ -135,7 +135,7 @@ graph {
|
||||
<table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>
|
||||
<td balign="left" sides="TLR">
|
||||
<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>
|
||||
</td>
|
||||
</tr></table>
|
||||
|
||||
95
examples/ex08.html
generated
6
examples/ex08.svg
generated
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 17 KiB |
2
examples/ex09.gv
generated
@ -1,5 +1,5 @@
|
||||
graph {
|
||||
// Graph generated by WireViz 0.3
|
||||
// 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]
|
||||
|
||||
105
examples/ex09.html
generated
@ -1,13 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.3 - https://github.com/formatc1702/WireViz">
|
||||
<title>ex09</title>
|
||||
</head><body style="font-family:arial;background-color:#FFFFFF">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
|
||||
<title>ex09</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>ex09</h1>
|
||||
<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 -->
|
||||
<svg width="835pt" height="1158pt"
|
||||
@ -528,35 +551,47 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
<h2>Bill of Materials</h2>
|
||||
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
|
||||
<tr>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Cable, 12 x 0.25 mm² shielded</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">0.2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, D-Sub, male, 25 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">3</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, F48, female, 48 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X2</td>
|
||||
</tr>
|
||||
|
||||
<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, 12 x 0.25 mm² shielded</td>
|
||||
<td class="bom_col_qty">0.2</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, D-Sub, male, 25 pins</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">Connector, F48, female, 48 pins</td>
|
||||
<td class="bom_col_qty">1</td>
|
||||
<td class="bom_col_unit"></td>
|
||||
<td class="bom_col_designators">X2</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
</body></html>
|
||||
|
||||
2
examples/ex09.svg
generated
@ -1,7 +1,7 @@
|
||||
<?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.0 (20210828.1703)
|
||||
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
|
||||
-->
|
||||
<!-- Pages: 1 -->
|
||||
<svg width="835pt" height="1158pt"
|
||||
|
||||
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
2
examples/ex10.gv
generated
@ -1,5 +1,5 @@
|
||||
graph {
|
||||
// Graph generated by WireViz 0.3
|
||||
// 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]
|
||||
|
||||
91
examples/ex10.html
generated
@ -1,13 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.3 - https://github.com/formatc1702/WireViz">
|
||||
<title>ex10</title>
|
||||
</head><body style="font-family:arial;background-color:#FFFFFF">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="WireViz 0.4-dev - https://github.com/formatc1702/WireViz">
|
||||
<title>ex10</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>ex10</h1>
|
||||
<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 -->
|
||||
<svg width="1120pt" height="324pt"
|
||||
@ -331,28 +354,40 @@
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
<h2>Bill of Materials</h2>
|
||||
<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">
|
||||
<tr>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Id</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Description</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Qty</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Unit</th>
|
||||
<th style="text-align:left; border:1px solid #000000; padding: 8px">Designators</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Cable, CAT5e, 8 x 24 AWG</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">1</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">m</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">W1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="border:1px solid #000000; padding: 4px">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px">Connector, Stewart Connector SS-37000-002, male, 8 pins</td>
|
||||
<td style="border:1px solid #000000; padding: 4px; text-align:right">2</td>
|
||||
<td style="border:1px solid #000000; padding: 4px"></td>
|
||||
<td style="border:1px solid #000000; padding: 4px">X1, X2</td>
|
||||
</tr>
|
||||
|
||||
<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, CAT5e, 8 x 24 AWG</td>
|
||||
<td class="bom_col_qty">1</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, Stewart Connector SS-37000-002, male, 8 pins</td>
|
||||
<td class="bom_col_qty">2</td>
|
||||
<td class="bom_col_unit"></td>
|
||||
<td class="bom_col_designators">X1, X2</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
</body></html>
|
||||
|
||||
2
examples/ex10.svg
generated
@ -1,7 +1,7 @@
|
||||
<?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.0 (20210828.1703)
|
||||
<!-- Generated by graphviz version 2.49.1 (20210923.0004)
|
||||
-->
|
||||
<!-- Pages: 1 -->
|
||||
<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
@ -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
|
||||
|
191
examples/ex11.gv
generated
Normal 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> </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> </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
@ -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-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--X1 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>AUTOGENERATED_F_1:e--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--X1 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>AUTOGENERATED_F_2:e--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--X1 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>AUTOGENERATED_F_3:e--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--X1 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>AUTOGENERATED_F_4:e--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">     1:BK    </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">     2:WH    </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">     3:BU    </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">     4:BN    </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--AUTOGENERATED_F_1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>W1:e--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--AUTOGENERATED_F_2 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>W1:e--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--AUTOGENERATED_F_3 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>W1:e--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--AUTOGENERATED_F_4 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>W1:e--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
|
After Width: | Height: | Size: 37 KiB |
172
examples/ex11.svg
generated
Normal 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-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--X1 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>AUTOGENERATED_F_1:e--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--X1 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>AUTOGENERATED_F_2:e--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--X1 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>AUTOGENERATED_F_3:e--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--X1 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>AUTOGENERATED_F_4:e--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">     1:BK    </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">     2:WH    </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">     3:BU    </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">     4:BN    </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--AUTOGENERATED_F_1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>W1:e--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--AUTOGENERATED_F_2 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>W1:e--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--AUTOGENERATED_F_3 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>W1:e--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--AUTOGENERATED_F_4 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>W1:e--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 |
25
examples/ex11.yml
Normal file
@ -0,0 +1,25 @@
|
||||
# based on @stmaxed's example in #134
|
||||
|
||||
connectors:
|
||||
X1: &X
|
||||
type: Screw connector
|
||||
subtype: male
|
||||
color: GN
|
||||
pincount: 4
|
||||
pinlabels: [A, B, C, D]
|
||||
F:
|
||||
style: simple
|
||||
type: Ferrule
|
||||
color: GY
|
||||
|
||||
cables:
|
||||
W:
|
||||
color: BK
|
||||
colors: [BK, WH, BU, BN]
|
||||
|
||||
connections:
|
||||
- # ferrules + connector X1
|
||||
- W.W1: [1-4]
|
||||
- F.
|
||||
- -->
|
||||
- X1: [1-4]
|
||||
7
examples/ex12.bom.tsv
generated
Normal 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
|
||||
|
269
examples/ex12.gv
generated
Normal 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> </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> </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> </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> </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
@ -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-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-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--X2 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>X1:e--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">     RD    </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">     BK    </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">     BU    </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">     GN    </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--W2 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>X2:e--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--W2 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>X2:e--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--W2 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>X2:e--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--W2 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>X2:e--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">     RD    </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">     BK    </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">     BU    </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">     GN    </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--X1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>W1:e--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--X1 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>W1:e--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--X1 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>W1:e--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--X1 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>W1:e--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
|
After Width: | Height: | Size: 28 KiB |
195
examples/ex12.svg
generated
Normal 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-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-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--X2 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>X1:e--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">     RD    </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">     BK    </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">     BU    </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">     GN    </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--W2 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>X2:e--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--W2 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>X2:e--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--W2 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>X2:e--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--W2 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>X2:e--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">     RD    </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">     BK    </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">     BU    </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">     GN    </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--X1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>W1:e--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--X1 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>W1:e--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--X1 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>W1:e--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--X1 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>W1:e--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 |
25
examples/ex12.yml
Normal file
@ -0,0 +1,25 @@
|
||||
# based on @MSBGit's example in #134
|
||||
|
||||
connectors:
|
||||
X1: &dupont
|
||||
type: Dupont 2.54mm
|
||||
subtype: male
|
||||
pincount: 5
|
||||
color: BK
|
||||
X2:
|
||||
<<: *dupont
|
||||
subtype: female
|
||||
|
||||
cables:
|
||||
W:
|
||||
category: bundle
|
||||
colors: [RD, BK, BU, GN]
|
||||
length: 0.2
|
||||
|
||||
connections:
|
||||
-
|
||||
- W.W1: [1-4]
|
||||
- X1: [1-4]
|
||||
- ==>
|
||||
- X2: [1-4]
|
||||
- W.W2: [1-4]
|
||||
4
examples/ex13.bom.tsv
generated
Normal 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
|
||||
|
433
examples/ex13.gv
generated
Normal 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> </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> </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> </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> </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> </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> </td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
> fillcolor="#FFFFFF" shape=box style=filled]
|
||||
}
|
||||
449
examples/ex13.html
generated
Normal 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-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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--C1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>X1:e--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--C1 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>X1:e--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--C1 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>X1:e--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--C1 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>X1:e--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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--C2 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>F1:e--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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--C3 -->
|
||||
<g id="edge17" class="edge">
|
||||
<title>F1:e--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--C2 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>F2:e--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--C3 -->
|
||||
<g id="edge19" class="edge">
|
||||
<title>F2:e--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--C2 -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>F3:e--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--C3 -->
|
||||
<g id="edge21" class="edge">
|
||||
<title>F3:e--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--C2 -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>F4:e--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--C3 -->
|
||||
<g id="edge23" class="edge">
|
||||
<title>F4:e--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-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-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--F1 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>C1:e--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--F2 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>C1:e--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--F3 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>C1:e--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--F4 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>C1:e--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--X2 -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>C2:e--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--X2 -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>C2:e--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--X2 -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>C2:e--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--X2 -->
|
||||
<g id="edge16" class="edge">
|
||||
<title>C2:e--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--X3 -->
|
||||
<g id="edge18" class="edge">
|
||||
<title>C3:e--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--X3 -->
|
||||
<g id="edge20" class="edge">
|
||||
<title>C3:e--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--X3 -->
|
||||
<g id="edge22" class="edge">
|
||||
<title>C3:e--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--X3 -->
|
||||
<g id="edge24" class="edge">
|
||||
<title>C3:e--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
|
After Width: | Height: | Size: 120 KiB |
376
examples/ex13.svg
generated
Normal 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-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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--C1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>X1:e--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--C1 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>X1:e--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--C1 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>X1:e--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--C1 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>X1:e--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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--C2 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>F1:e--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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--C3 -->
|
||||
<g id="edge17" class="edge">
|
||||
<title>F1:e--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--C2 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>F2:e--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--C3 -->
|
||||
<g id="edge19" class="edge">
|
||||
<title>F2:e--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--C2 -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>F3:e--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--C3 -->
|
||||
<g id="edge21" class="edge">
|
||||
<title>F3:e--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--C2 -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>F4:e--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--C3 -->
|
||||
<g id="edge23" class="edge">
|
||||
<title>F4:e--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-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-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--F1 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>C1:e--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--F2 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>C1:e--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--F3 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>C1:e--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--F4 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>C1:e--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--X2 -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>C2:e--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--X2 -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>C2:e--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--X2 -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>C2:e--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--X2 -->
|
||||
<g id="edge16" class="edge">
|
||||
<title>C2:e--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--X3 -->
|
||||
<g id="edge18" class="edge">
|
||||
<title>C3:e--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--X3 -->
|
||||
<g id="edge20" class="edge">
|
||||
<title>C3:e--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--X3 -->
|
||||
<g id="edge22" class="edge">
|
||||
<title>C3:e--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--X3 -->
|
||||
<g id="edge24" class="edge">
|
||||
<title>C3:e--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 |
26
examples/ex13.yml
Normal file
@ -0,0 +1,26 @@
|
||||
# based on @formatc1702's example in #184
|
||||
|
||||
connectors:
|
||||
X:
|
||||
pincount: 4
|
||||
pinlabels: [A, B, C, D]
|
||||
F:
|
||||
style: simple
|
||||
type: ferrule
|
||||
|
||||
cables:
|
||||
C:
|
||||
wirecount: 4
|
||||
color_code: DIN
|
||||
|
||||
connections:
|
||||
-
|
||||
- X.X1: [1-4]
|
||||
- C.C1: [1-4]
|
||||
- [F.F1, F.F2, F.F3, F.F4] # generate new instances of F and assign designators
|
||||
- C.C2: [1-4]
|
||||
- X.X2: [1-4]
|
||||
-
|
||||
- [F1, F2, F3, F4] # use previously assigned designators
|
||||
- C.C3: [1-4]
|
||||
- X.X3: [1-4]
|
||||
8
examples/ex14.bom.tsv
generated
Normal 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
|
||||
|
717
examples/ex14.gv
generated
Normal 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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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
@ -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-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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--W1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>X1:e--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--W1 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>X1:e--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--W1 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>X1:e--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--W1 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>X1:e--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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--W2 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>AUTOGENERATED_S_1:e--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--W2 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>AUTOGENERATED_S_2:e--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--W2 -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>S1:e--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">     1:BK    </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--AUTOGENERATED_WIRE_1 -->
|
||||
<g id="edge33" class="edge">
|
||||
<title>S1:e--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--W2 -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>AUTOGENERATED_S_3:e--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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--W21 -->
|
||||
<g id="edge17" class="edge">
|
||||
<title>AUTOGENERATED_S_4:e--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--W21 -->
|
||||
<g id="edge19" class="edge">
|
||||
<title>AUTOGENERATED_S_5:e--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--W21 -->
|
||||
<g id="edge21" class="edge">
|
||||
<title>AUTOGENERATED_S_6:e--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--W21 -->
|
||||
<g id="edge23" class="edge">
|
||||
<title>AUTOGENERATED_S_7:e--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-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-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--X3 -->
|
||||
<g id="edge35" class="edge">
|
||||
<title>X2:e--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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--W3 -->
|
||||
<g id="edge25" class="edge">
|
||||
<title>X3:e--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--W3 -->
|
||||
<g id="edge27" class="edge">
|
||||
<title>X3:e--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--W3 -->
|
||||
<g id="edge29" class="edge">
|
||||
<title>X3:e--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--W3 -->
|
||||
<g id="edge31" class="edge">
|
||||
<title>X3:e--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-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--X4 -->
|
||||
<g id="edge36" class="edge">
|
||||
<title>AUTOGENERATED_F_1:e--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--X4 -->
|
||||
<g id="edge37" class="edge">
|
||||
<title>AUTOGENERATED_F_2:e--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--X4 -->
|
||||
<g id="edge38" class="edge">
|
||||
<title>AUTOGENERATED_F_3:e--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--X4 -->
|
||||
<g id="edge39" class="edge">
|
||||
<title>AUTOGENERATED_F_4:e--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--AUTOGENERATED_S_1 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>W1:e--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--AUTOGENERATED_S_2 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>W1:e--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--S1 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>W1:e--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--AUTOGENERATED_S_3 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>W1:e--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--AUTOGENERATED_S_4 -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>W2:e--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--AUTOGENERATED_S_5 -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>W2:e--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--AUTOGENERATED_S_6 -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>W2:e--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--AUTOGENERATED_S_7 -->
|
||||
<g id="edge16" class="edge">
|
||||
<title>W2:e--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--X2 -->
|
||||
<g id="edge18" class="edge">
|
||||
<title>W21:e--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--X2 -->
|
||||
<g id="edge20" class="edge">
|
||||
<title>W21:e--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--X2 -->
|
||||
<g id="edge22" class="edge">
|
||||
<title>W21:e--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--X2 -->
|
||||
<g id="edge24" class="edge">
|
||||
<title>W21:e--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--AUTOGENERATED_F_1 -->
|
||||
<g id="edge26" class="edge">
|
||||
<title>W3:e--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--AUTOGENERATED_F_2 -->
|
||||
<g id="edge28" class="edge">
|
||||
<title>W3:e--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--AUTOGENERATED_F_3 -->
|
||||
<g id="edge30" class="edge">
|
||||
<title>W3:e--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--AUTOGENERATED_F_4 -->
|
||||
<g id="edge32" class="edge">
|
||||
<title>W3:e--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--X2 -->
|
||||
<g id="edge34" class="edge">
|
||||
<title>AUTOGENERATED_WIRE_1:e--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
|
After Width: | Height: | Size: 202 KiB |
676
examples/ex14.svg
generated
Normal 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-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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--W1 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>X1:e--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--W1 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>X1:e--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--W1 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>X1:e--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--W1 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>X1:e--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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--W2 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>AUTOGENERATED_S_1:e--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--W2 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>AUTOGENERATED_S_2:e--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--W2 -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>S1:e--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">     1:BK    </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--AUTOGENERATED_WIRE_1 -->
|
||||
<g id="edge33" class="edge">
|
||||
<title>S1:e--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--W2 -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>AUTOGENERATED_S_3:e--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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--W21 -->
|
||||
<g id="edge17" class="edge">
|
||||
<title>AUTOGENERATED_S_4:e--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--W21 -->
|
||||
<g id="edge19" class="edge">
|
||||
<title>AUTOGENERATED_S_5:e--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--W21 -->
|
||||
<g id="edge21" class="edge">
|
||||
<title>AUTOGENERATED_S_6:e--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--W21 -->
|
||||
<g id="edge23" class="edge">
|
||||
<title>AUTOGENERATED_S_7:e--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-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-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--X3 -->
|
||||
<g id="edge35" class="edge">
|
||||
<title>X2:e--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">     1:WH    </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">     2:BN    </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">     3:GN    </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">     4:YE    </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--W3 -->
|
||||
<g id="edge25" class="edge">
|
||||
<title>X3:e--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--W3 -->
|
||||
<g id="edge27" class="edge">
|
||||
<title>X3:e--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--W3 -->
|
||||
<g id="edge29" class="edge">
|
||||
<title>X3:e--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--W3 -->
|
||||
<g id="edge31" class="edge">
|
||||
<title>X3:e--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-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--X4 -->
|
||||
<g id="edge36" class="edge">
|
||||
<title>AUTOGENERATED_F_1:e--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--X4 -->
|
||||
<g id="edge37" class="edge">
|
||||
<title>AUTOGENERATED_F_2:e--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--X4 -->
|
||||
<g id="edge38" class="edge">
|
||||
<title>AUTOGENERATED_F_3:e--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--X4 -->
|
||||
<g id="edge39" class="edge">
|
||||
<title>AUTOGENERATED_F_4:e--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--AUTOGENERATED_S_1 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>W1:e--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--AUTOGENERATED_S_2 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>W1:e--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--S1 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>W1:e--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--AUTOGENERATED_S_3 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>W1:e--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--AUTOGENERATED_S_4 -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>W2:e--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--AUTOGENERATED_S_5 -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>W2:e--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--AUTOGENERATED_S_6 -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>W2:e--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--AUTOGENERATED_S_7 -->
|
||||
<g id="edge16" class="edge">
|
||||
<title>W2:e--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--X2 -->
|
||||
<g id="edge18" class="edge">
|
||||
<title>W21:e--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--X2 -->
|
||||
<g id="edge20" class="edge">
|
||||
<title>W21:e--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--X2 -->
|
||||
<g id="edge22" class="edge">
|
||||
<title>W21:e--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--X2 -->
|
||||
<g id="edge24" class="edge">
|
||||
<title>W21:e--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--AUTOGENERATED_F_1 -->
|
||||
<g id="edge26" class="edge">
|
||||
<title>W3:e--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--AUTOGENERATED_F_2 -->
|
||||
<g id="edge28" class="edge">
|
||||
<title>W3:e--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--AUTOGENERATED_F_3 -->
|
||||
<g id="edge30" class="edge">
|
||||
<title>W3:e--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--AUTOGENERATED_F_4 -->
|
||||
<g id="edge32" class="edge">
|
||||
<title>W3:e--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--X2 -->
|
||||
<g id="edge34" class="edge">
|
||||
<title>AUTOGENERATED_WIRE_1:e--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 |
55
examples/ex14.yml
Normal file
@ -0,0 +1,55 @@
|
||||
connectors:
|
||||
JSTMALE: &JST_SM # use generic names here, assign designators at generation time
|
||||
type: JST SM
|
||||
subtype: male
|
||||
pincount: 4
|
||||
pinlabels: [A, B, C, D]
|
||||
JSTFEMALE:
|
||||
<<: *JST_SM # easily create JSTMALE's matching connector
|
||||
subtype: female
|
||||
X4: # this connector is only used once, use fixed designator here already
|
||||
type: Screw terminal connector
|
||||
pincount: 4
|
||||
color: GN
|
||||
pinlabels: [W, X, Y, Z]
|
||||
S:
|
||||
style: simple
|
||||
type: Splice
|
||||
color: CU
|
||||
F:
|
||||
style: simple
|
||||
type: Ferrule
|
||||
color: GY
|
||||
|
||||
|
||||
cables:
|
||||
CABLE:
|
||||
wirecount: 4
|
||||
color_code: DIN
|
||||
length: 0.1
|
||||
WIRE:
|
||||
wirecount: 1
|
||||
colors: [BK]
|
||||
length: 0.1
|
||||
|
||||
connections:
|
||||
-
|
||||
- JSTMALE.X1: [4-1] # use `.` syntax to generate a new instance of JSTMALE, named X1
|
||||
- CABLE.W1: [1-4] # same syntax for cables
|
||||
- [S., S., S.S1, S.] # splice W1 and W2 together; only wire #3 needs a user-defined designator
|
||||
- CABLE.W2: [1-4]
|
||||
- S. # test shorthand, auto-get required number of ferrules from context
|
||||
- CABLE.W21: [1-4]
|
||||
- JSTFEMALE.X2: [1-4]
|
||||
- <=> # mate X2 and X3
|
||||
- JSTMALE.X3: [1-4]
|
||||
- CABLE.W3: [1-4]
|
||||
- [F., F., F., F.]
|
||||
- --> # insert ferrules into screw terminal connector
|
||||
- X4: [2,1,4,3] # X4 does not require auto-generation, thus no `.` syntax here
|
||||
-
|
||||
- S1: [1] # reuse previously generated splice
|
||||
# TODO: Make it work with `- F1` only, making pin 1 is implied
|
||||
- WIRE.: [1] # We don't care about a simple wire's designator, auto-generate please!
|
||||
# TODO: Make it work with `- W.W4: 1`, dropping the need for `[]`
|
||||
- X2: [4]
|
||||
@ -60,3 +60,27 @@
|
||||
[Source](ex10.yml) - [Bill of Materials](ex10.bom.tsv)
|
||||
|
||||
|
||||
## Example 11
|
||||

|
||||
|
||||
[Source](ex11.yml) - [Bill of Materials](ex11.bom.tsv)
|
||||
|
||||
|
||||
## Example 12
|
||||

|
||||
|
||||
[Source](ex12.yml) - [Bill of Materials](ex12.bom.tsv)
|
||||
|
||||
|
||||
## Example 13
|
||||

|
||||
|
||||
[Source](ex13.yml) - [Bill of Materials](ex13.bom.tsv)
|
||||
|
||||
|
||||
## Example 14
|
||||

|
||||
|
||||
[Source](ex14.yml) - [Bill of Materials](ex14.bom.tsv)
|
||||
|
||||
|
||||
|
||||
2
pyproject.toml
Normal file
@ -0,0 +1,2 @@
|
||||
[tool.isort]
|
||||
profile = "black"
|
||||
@ -1,4 +1,6 @@
|
||||
click
|
||||
graphviz
|
||||
pillow
|
||||
pyyaml
|
||||
setuptools
|
||||
tabulate
|
||||
|
||||
66
setup.py
@ -1,47 +1,47 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
from setuptools import setup, find_packages
|
||||
from pathlib import Path
|
||||
|
||||
from src.wireviz import __version__, CMD_NAME, APP_URL
|
||||
from setuptools import find_packages, setup
|
||||
|
||||
# Utility function to read the README file.
|
||||
# Used for the long_description. It's nice, because now 1) we have a top level
|
||||
# README file and 2) it's easier to type in the README file than to put a raw
|
||||
# string in below ...
|
||||
def read(fname):
|
||||
return open(os.path.join(os.path.dirname(__file__), fname)).read()
|
||||
from src.wireviz import APP_URL, CMD_NAME, __version__
|
||||
|
||||
README_PATH = Path(__file__).parent / "docs" / "README.md"
|
||||
|
||||
setup(
|
||||
name=CMD_NAME,
|
||||
version=__version__,
|
||||
author='Daniel Rojas',
|
||||
#author_email='',
|
||||
description='Easily document cables and wiring harnesses',
|
||||
long_description=read(os.path.join(os.path.dirname(__file__), 'docs/README.md')),
|
||||
long_description_content_type='text/markdown',
|
||||
author="Daniel Rojas",
|
||||
# author_email='',
|
||||
description="Easily document cables and wiring harnesses",
|
||||
long_description=README_PATH.read_text(),
|
||||
long_description_content_type="text/markdown",
|
||||
install_requires=[
|
||||
'pyyaml',
|
||||
'pillow',
|
||||
'graphviz',
|
||||
],
|
||||
license='GPLv3',
|
||||
keywords='cable connector hardware harness wiring wiring-diagram wiring-harness',
|
||||
"click",
|
||||
"graphviz",
|
||||
"pillow",
|
||||
"pyyaml",
|
||||
"tabulate",
|
||||
],
|
||||
license="GPLv3",
|
||||
keywords="cable connector hardware harness wiring wiring-diagram wiring-harness",
|
||||
url=APP_URL,
|
||||
package_dir={'': 'src'},
|
||||
packages=find_packages('src'),
|
||||
package_dir={"": "src"},
|
||||
packages=find_packages("src"),
|
||||
entry_points={
|
||||
'console_scripts': ['wireviz=wireviz.wireviz:main'],
|
||||
},
|
||||
classifiers=[
|
||||
'Development Status :: 4 - Beta',
|
||||
'Environment :: Console',
|
||||
'Programming Language :: Python :: 3',
|
||||
'Programming Language :: Python :: 3.7',
|
||||
'Programming Language :: Python :: 3.8',
|
||||
'Topic :: Utilities',
|
||||
'License :: OSI Approved :: GNU General Public License v3 (GPLv3)',
|
||||
"console_scripts": [
|
||||
"wireviz=wireviz.wv_cli:wireviz",
|
||||
],
|
||||
|
||||
},
|
||||
classifiers=[
|
||||
"Development Status :: 4 - Beta",
|
||||
"Environment :: Console",
|
||||
"Programming Language :: Python :: 3",
|
||||
"Programming Language :: Python :: 3.8",
|
||||
"Programming Language :: Python :: 3.9",
|
||||
"Programming Language :: Python :: 3.10",
|
||||
"Topic :: Utilities",
|
||||
"License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
|
||||
],
|
||||
)
|
||||
|
||||
@ -1,353 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from typing import Dict, List, Optional, Tuple, Union
|
||||
from dataclasses import dataclass, field, InitVar
|
||||
from pathlib import Path
|
||||
|
||||
from wireviz.wv_helper import int2tuple, aspect_ratio
|
||||
from wireviz.wv_colors import Color, Colors, ColorMode, ColorScheme, COLOR_CODES
|
||||
|
||||
|
||||
# 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
|
||||
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', ...]
|
||||
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
|
||||
|
||||
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:
|
||||
gv_dir: InitVar[Path] # Directory of .gv file injected as context during parsing
|
||||
# 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, gv_dir):
|
||||
|
||||
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:
|
||||
self.scale = "false" if not self.width and not self.height \
|
||||
else "both" if self.width and self.height \
|
||||
else "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(gv_dir.joinpath(self.src))
|
||||
else:
|
||||
if self.width:
|
||||
self.height = self.width / aspect_ratio(gv_dir.joinpath(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:
|
||||
return self.type.rstrip() + (f', {self.subtype.rstrip()}' if self.subtype else '')
|
||||
|
||||
|
||||
@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
|
||||
autogenerate: 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:
|
||||
self.show_name = not self.autogenerate # hide auto-generated designators by default
|
||||
|
||||
if self.show_pincount is None:
|
||||
self.show_pincount = self.style != 'simple' # hide pincount for simple (1 pin) connectors by default
|
||||
|
||||
for loop in self.loops:
|
||||
# TODO: check that pins to connect actually exist
|
||||
# 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 i, item in enumerate(self.additional_components):
|
||||
if isinstance(item, dict):
|
||||
self.additional_components[i] = AdditionalComponent(**item)
|
||||
|
||||
def activate_pin(self, pin: Pin) -> None:
|
||||
self.visible_pins[pin] = 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: bool = True
|
||||
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')
|
||||
|
||||
# by default, show wire numbers for cables, hide for bundles
|
||||
if self.show_wirenumbers is None:
|
||||
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_port: Optional[PinIndex]
|
||||
via_port: Wire
|
||||
to_name: Optional[Designator]
|
||||
to_port: Optional[PinIndex]
|
||||
@ -1,449 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from graphviz import Graph
|
||||
from collections import Counter
|
||||
from typing import Any, List, Union
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
from itertools import zip_longest
|
||||
import re
|
||||
|
||||
from wireviz import wv_colors, __version__, APP_NAME, APP_URL
|
||||
from wireviz.DataClasses import Metadata, Options, Tweak, Connector, Cable
|
||||
from wireviz.wv_colors import get_color_hex, translate_color
|
||||
from wireviz.wv_gv_html import nested_html_table, \
|
||||
html_bgcolor_attr, html_bgcolor, html_colorbar, \
|
||||
html_image, html_caption, remove_links, html_line_breaks
|
||||
from wireviz.wv_bom import pn_info_string, component_table_entry, \
|
||||
get_additional_component_table, bom_list, generate_bom, \
|
||||
HEADER_PN, HEADER_MPN, HEADER_SPN
|
||||
from wireviz.wv_html import generate_html_output
|
||||
from wireviz.wv_helper import awg_equiv, mm2_equiv, tuplelist2tsv, flatten2d, \
|
||||
open_file_read, open_file_write
|
||||
|
||||
|
||||
@dataclass
|
||||
class Harness:
|
||||
metadata: Metadata
|
||||
options: Options
|
||||
tweak: Tweak
|
||||
|
||||
def __post_init__(self):
|
||||
self.connectors = {}
|
||||
self.cables = {}
|
||||
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_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.')
|
||||
via_wire = cable.colors.index(via_wire) + 1 # list index starts at 0, wire IDs start at 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
|
||||
|
||||
from_pin_id = self.connectors[from_name].pins.index(from_pin) if from_pin is not None else None
|
||||
to_pin_id = self.connectors[to_name].pins.index(to_pin) if to_pin is not None else None
|
||||
|
||||
self.cables[via_name].connect(from_name, from_pin_id, via_wire, to_name, to_pin_id)
|
||||
if from_name in self.connectors:
|
||||
self.connectors[from_name].activate_pin(from_pin)
|
||||
if to_name in self.connectors:
|
||||
self.connectors[to_name].activate_pin(to_pin)
|
||||
|
||||
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)
|
||||
|
||||
# prepare ports on connectors depending on which side they will connect
|
||||
for _, cable in self.cables.items():
|
||||
for connection_color in cable.connections:
|
||||
if connection_color.from_port is not None: # connect to left
|
||||
self.connectors[connection_color.from_name].ports_right = True
|
||||
if connection_color.to_port is not None: # connect to right
|
||||
self.connectors[connection_color.to_name].ports_left = True
|
||||
|
||||
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 = []
|
||||
|
||||
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)]]
|
||||
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():
|
||||
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>')
|
||||
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)'
|
||||
|
||||
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)]]
|
||||
|
||||
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 = []
|
||||
wirehtml.append('<table border="0" cellspacing="0" cellborder="0">') # conductor table
|
||||
wirehtml.append(' <tr><td> </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>')
|
||||
|
||||
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>')
|
||||
if cable.category == 'bundle': # for bundles individual wires can have part information
|
||||
# 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 :
|
||||
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>')
|
||||
|
||||
if cable.shield:
|
||||
wirehtml.append(' <tr><td> </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"'
|
||||
wirehtml.append(f' <tr><td colspan="3" cellpadding="0" {attributes} port="ws"></td></tr>')
|
||||
|
||||
wirehtml.append(' <tr><td> </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_port is not None: # connect to left
|
||||
from_connector = self.connectors[connection.from_name]
|
||||
from_port = f':p{connection.from_port+1}r' if from_connector.style != 'simple' else ''
|
||||
code_left_1 = f'{connection.from_name}{from_port}: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(self.connectors[connection.from_name].pins[connection.from_port])]
|
||||
if from_connector.pinlabels:
|
||||
pinlabel = from_connector.pinlabels[connection.from_port]
|
||||
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_port is not None: # connect to right
|
||||
to_connector = self.connectors[connection.to_name]
|
||||
code_right_1 = f'{cable.name}:w{connection.via_port}:e'
|
||||
to_port = f':p{connection.to_port+1}l' if self.connectors[connection.to_name].style != 'simple' else ''
|
||||
code_right_2 = f'{connection.to_name}{to_port}:w'
|
||||
dot.edge(code_right_1, code_right_2)
|
||||
if to_connector.show_name:
|
||||
to_info = [str(connection.to_name), str(self.connectors[connection.to_name].pins[connection.to_port])]
|
||||
if to_connector.pinlabels:
|
||||
pinlabel = to_connector.pinlabels[connection.to_port]
|
||||
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)
|
||||
|
||||
return dot
|
||||
|
||||
@property
|
||||
def png(self):
|
||||
from io import BytesIO
|
||||
graph = self.create_graph()
|
||||
data = BytesIO()
|
||||
data.write(graph.pipe(format='png'))
|
||||
data.seek(0)
|
||||
return data.read()
|
||||
|
||||
@property
|
||||
def svg(self):
|
||||
from io import BytesIO
|
||||
graph = self.create_graph()
|
||||
data = BytesIO()
|
||||
data.write(graph.pipe(format='svg'))
|
||||
data.seek(0)
|
||||
return data.read()
|
||||
|
||||
def output(self, filename: (str, Path), view: bool = False, cleanup: bool = True, fmt: tuple = ('pdf', )) -> None:
|
||||
# graphical output
|
||||
graph = self.create_graph()
|
||||
for f in fmt:
|
||||
graph.format = f
|
||||
graph.render(filename=filename, view=view, cleanup=cleanup)
|
||||
graph.save(filename=f'{filename}.gv')
|
||||
# bom output
|
||||
bomlist = bom_list(self.bom())
|
||||
with open_file_write(f'{filename}.bom.tsv') as file:
|
||||
file.write(tuplelist2tsv(bomlist))
|
||||
# HTML output
|
||||
generate_html_output(filename, bomlist, self.metadata, self.options)
|
||||
|
||||
def bom(self):
|
||||
if not self._bom:
|
||||
self._bom = generate_bom(self)
|
||||
return self._bom
|
||||
@ -1,8 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Please don't import anything in this file to avoid issues when it is imported in setup.py
|
||||
|
||||
__version__ = '0.3.2'
|
||||
__version__ = "0.4-dev"
|
||||
|
||||
CMD_NAME = 'wireviz' # Lower case command and module name
|
||||
APP_NAME = 'WireViz' # Application name in texts meant to be human readable
|
||||
APP_URL = 'https://github.com/formatc1702/WireViz'
|
||||
CMD_NAME = "wireviz" # Lower case command and module name
|
||||
APP_NAME = "WireViz" # Application name in texts meant to be human readable
|
||||
APP_URL = "https://github.com/formatc1702/WireViz"
|
||||
|
||||
@ -1,158 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import argparse
|
||||
import sys
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
script_path = Path(__file__).absolute()
|
||||
|
||||
sys.path.insert(0, str(script_path.parent.parent)) # to find wireviz module
|
||||
from wireviz import wireviz, __version__, APP_NAME
|
||||
from wv_helper import open_file_write, open_file_read, open_file_append
|
||||
|
||||
|
||||
dir = script_path.parent.parent.parent
|
||||
readme = 'readme.md'
|
||||
groups = {
|
||||
'examples': {
|
||||
'path': dir / 'examples',
|
||||
'prefix': 'ex',
|
||||
readme: [], # Include no files
|
||||
'title': 'Example Gallery',
|
||||
},
|
||||
'tutorial' : {
|
||||
'path': dir / 'tutorial',
|
||||
'prefix': 'tutorial',
|
||||
readme: ['md', 'yml'], # Include .md and .yml files
|
||||
'title': f'{APP_NAME} Tutorial',
|
||||
},
|
||||
'demos' : {
|
||||
'path': dir / 'examples',
|
||||
'prefix': 'demo',
|
||||
},
|
||||
}
|
||||
|
||||
input_extensions = ['.yml']
|
||||
extensions_not_containing_graphviz_output = ['.gv', '.bom.tsv']
|
||||
extensions_containing_graphviz_output = ['.png', '.svg', '.html']
|
||||
generated_extensions = extensions_not_containing_graphviz_output + extensions_containing_graphviz_output
|
||||
|
||||
|
||||
def collect_filenames(description, groupkey, ext_list):
|
||||
path = groups[groupkey]['path']
|
||||
patterns = [f"{groups[groupkey]['prefix']}*{ext}" for ext in ext_list]
|
||||
if ext_list != input_extensions and readme in groups[groupkey]:
|
||||
patterns.append(readme)
|
||||
print(f'{description} {groupkey} in "{path}"')
|
||||
return sorted([filename for pattern in patterns for filename in path.glob(pattern)])
|
||||
|
||||
|
||||
def build_generated(groupkeys):
|
||||
for key in groupkeys:
|
||||
# preparation
|
||||
path = groups[key]['path']
|
||||
build_readme = readme in groups[key]
|
||||
if build_readme:
|
||||
include_readme = 'md' in groups[key][readme]
|
||||
include_source = 'yml' in groups[key][readme]
|
||||
with open_file_write(path / readme) as out:
|
||||
out.write(f'# {groups[key]["title"]}\n\n')
|
||||
# collect and iterate input YAML files
|
||||
for yaml_file in collect_filenames('Building', key, input_extensions):
|
||||
print(f' "{yaml_file}"')
|
||||
wireviz.parse_file(yaml_file)
|
||||
|
||||
if build_readme:
|
||||
i = ''.join(filter(str.isdigit, yaml_file.stem))
|
||||
|
||||
with open_file_append(path / readme) as out:
|
||||
if include_readme:
|
||||
with open_file_read(yaml_file.with_suffix('.md')) as info:
|
||||
for line in info:
|
||||
out.write(line.replace('## ', f'## {i} - '))
|
||||
out.write('\n\n')
|
||||
else:
|
||||
out.write(f'## Example {i}\n')
|
||||
|
||||
if include_source:
|
||||
with open_file_read(yaml_file) as src:
|
||||
out.write('```yaml\n')
|
||||
for line in src:
|
||||
out.write(line)
|
||||
out.write('```\n')
|
||||
out.write('\n')
|
||||
|
||||
out.write(f'\n\n')
|
||||
out.write(f'[Source]({yaml_file.name}) - [Bill of Materials]({yaml_file.stem}.bom.tsv)\n\n\n')
|
||||
|
||||
|
||||
def clean_generated(groupkeys):
|
||||
for key in groupkeys:
|
||||
# collect and remove files
|
||||
for filename in collect_filenames('Cleaning', key, generated_extensions):
|
||||
if filename.is_file():
|
||||
print(f' rm "{filename}"')
|
||||
os.remove(filename)
|
||||
|
||||
|
||||
def compare_generated(groupkeys, branch = '', include_graphviz_output = False):
|
||||
if branch:
|
||||
branch = f' {branch.strip()}'
|
||||
compare_extensions = generated_extensions if include_graphviz_output else extensions_not_containing_graphviz_output
|
||||
for key in groupkeys:
|
||||
# collect and compare files
|
||||
for filename in collect_filenames('Comparing', key, compare_extensions):
|
||||
cmd = f'git --no-pager diff{branch} -- "{filename}"'
|
||||
print(f' {cmd}')
|
||||
os.system(cmd)
|
||||
|
||||
|
||||
def restore_generated(groupkeys, branch = ''):
|
||||
if branch:
|
||||
branch = f' {branch.strip()}'
|
||||
for key in groupkeys:
|
||||
# collect input YAML files
|
||||
filename_list = collect_filenames('Restoring', key, input_extensions)
|
||||
# collect files to restore
|
||||
filename_list = [fn.with_suffix(ext) for fn in filename_list for ext in generated_extensions]
|
||||
if readme in groups[key]:
|
||||
filename_list.append(groups[key]['path'] / readme)
|
||||
# restore files
|
||||
for filename in filename_list:
|
||||
cmd = f'git checkout{branch} -- "{filename}"'
|
||||
print(f' {cmd}')
|
||||
os.system(cmd)
|
||||
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description=f'{APP_NAME} Example Manager',)
|
||||
parser.add_argument('-V', '--version', action='version', version=f'%(prog)s - {APP_NAME} {__version__}')
|
||||
parser.add_argument('action', nargs='?', action='store',
|
||||
choices=['build','clean','compare','diff','restore'], default='build',
|
||||
help='what to do with the generated files (default: build)')
|
||||
parser.add_argument('-c', '--compare-graphviz-output', action='store_true',
|
||||
help='the Graphviz output is also compared (default: False)')
|
||||
parser.add_argument('-b', '--branch', action='store', default='',
|
||||
help='branch or commit to compare with or restore from')
|
||||
parser.add_argument('-g', '--groups', nargs='+',
|
||||
choices=groups.keys(), default=groups.keys(),
|
||||
help='the groups of generated files (default: all)')
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def main():
|
||||
args = parse_args()
|
||||
if args.action == 'build':
|
||||
build_generated(args.groups)
|
||||
elif args.action == 'clean':
|
||||
clean_generated(args.groups)
|
||||
elif args.action == 'compare' or args.action == 'diff':
|
||||
compare_generated(args.groups, args.branch, args.compare_graphviz_output)
|
||||
elif args.action == 'restore':
|
||||
restore_generated(args.groups, args.branch)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
286
src/wireviz/templates/din-6771.html
generated
Normal file
@ -0,0 +1,286 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<meta name="generator" content="<!-- %generator% -->">
|
||||
<title><!-- %title% --></title>
|
||||
<style>
|
||||
body {
|
||||
font-family: <!-- %fontname% -->;
|
||||
background-color: <!-- %bgcolor% -->;
|
||||
}
|
||||
|
||||
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="sheetsize_default">
|
||||
|
||||
<div id="diagram">
|
||||
|
||||
<div id="description">
|
||||
<!-- %description% -->
|
||||
</div>
|
||||
|
||||
<!-- %diagram% -->
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="bom">
|
||||
<!-- %bom_reversed% -->
|
||||
</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"><!-- %title% --></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><!-- %authors_1% --></td>
|
||||
<td><!-- %authors_1_date% --></td>
|
||||
<td><!-- %authors_1_name% --></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><!-- %authors_2% --></td>
|
||||
<td><!-- %authors_2_date% --></td>
|
||||
<td><!-- %authors_2_name% --></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"><!-- %pn% --></td>
|
||||
<td class="sheetno" rowspan="2">Sheet<br /><!-- %sheet_current% --></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"><!-- %revisions_1% --></td>
|
||||
<td><!-- %revisions_1_changelog% --></td>
|
||||
<td><!-- %revisions_1_date% --></td>
|
||||
<td><!-- %revisions_1_name% --></td>
|
||||
<td class="sheetno">of <!-- %sheet_total% --></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>
|
||||
45
src/wireviz/templates/simple.html
generated
Normal file
@ -0,0 +1,45 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="generator" content="<!-- %generator% -->">
|
||||
<title><!-- %title% --></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:<!-- %fontname% -->;background-color:<!-- %bgcolor% -->">
|
||||
<h1><!-- %title% --></h1>
|
||||
<h2>Diagram</h2>
|
||||
|
||||
<div id="description">
|
||||
<!-- %description% -->
|
||||
</div>
|
||||
|
||||
<div id="diagram">
|
||||
<!-- %diagram% -->
|
||||
</div>
|
||||
|
||||
<div id="notes">
|
||||
<!-- %notes% -->
|
||||
</div>
|
||||
|
||||
<h2>Bill of Materials</h2>
|
||||
|
||||
<div id="bom">
|
||||
<!-- %bom% -->
|
||||
</div>
|
||||
|
||||
</body></html>
|
||||
193
src/wireviz/tools/build_examples.py
Executable file
@ -0,0 +1,193 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
script_path = Path(__file__).absolute()
|
||||
sys.path.insert(0, str(script_path.parent.parent.parent)) # to find wireviz module
|
||||
|
||||
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.parent
|
||||
readme = "readme.md"
|
||||
groups = {
|
||||
"examples": {
|
||||
"path": dir / "examples",
|
||||
"prefix": "ex",
|
||||
readme: [], # Include no files
|
||||
"title": "Example Gallery",
|
||||
},
|
||||
"tutorial": {
|
||||
"path": dir / "tutorial",
|
||||
"prefix": "tutorial",
|
||||
readme: ["md", "yml"], # Include .md and .yml files
|
||||
"title": f"{APP_NAME} Tutorial",
|
||||
},
|
||||
"demos": {
|
||||
"path": dir / "examples",
|
||||
"prefix": "demo",
|
||||
},
|
||||
}
|
||||
|
||||
input_extensions = [".yml"]
|
||||
extensions_not_containing_graphviz_output = [".gv", ".bom.tsv"]
|
||||
extensions_containing_graphviz_output = [".png", ".svg", ".html"]
|
||||
generated_extensions = (
|
||||
extensions_not_containing_graphviz_output + extensions_containing_graphviz_output
|
||||
)
|
||||
|
||||
|
||||
def collect_filenames(description, groupkey, ext_list):
|
||||
path = groups[groupkey]["path"]
|
||||
patterns = [f"{groups[groupkey]['prefix']}*{ext}" for ext in ext_list]
|
||||
if ext_list != input_extensions and readme in groups[groupkey]:
|
||||
patterns.append(readme)
|
||||
print(f'{description} {groupkey} in "{path}"')
|
||||
return sorted([filename for pattern in patterns for filename in path.glob(pattern)])
|
||||
|
||||
|
||||
def build_generated(groupkeys):
|
||||
for key in groupkeys:
|
||||
# preparation
|
||||
path = groups[key]["path"]
|
||||
build_readme = readme in groups[key]
|
||||
if build_readme:
|
||||
include_readme = "md" in groups[key][readme]
|
||||
include_source = "yml" in groups[key][readme]
|
||||
with open_file_write(path / readme) as out:
|
||||
out.write(f'# {groups[key]["title"]}\n\n')
|
||||
# collect and iterate input YAML files
|
||||
for yaml_file in collect_filenames("Building", key, input_extensions):
|
||||
print(f' "{yaml_file}"')
|
||||
wireviz.parse(yaml_file, output_formats=("gv", "html", "png", "svg", "tsv"))
|
||||
|
||||
if build_readme:
|
||||
i = "".join(filter(str.isdigit, yaml_file.stem))
|
||||
|
||||
with open_file_append(path / readme) as out:
|
||||
if include_readme:
|
||||
with open_file_read(yaml_file.with_suffix(".md")) as info:
|
||||
for line in info:
|
||||
out.write(line.replace("## ", f"## {i} - "))
|
||||
out.write("\n\n")
|
||||
else:
|
||||
out.write(f"## Example {i}\n")
|
||||
|
||||
if include_source:
|
||||
with open_file_read(yaml_file) as src:
|
||||
out.write("```yaml\n")
|
||||
for line in src:
|
||||
out.write(line)
|
||||
out.write("```\n")
|
||||
out.write("\n")
|
||||
|
||||
out.write(f"\n\n")
|
||||
out.write(
|
||||
f"[Source]({yaml_file.name}) - [Bill of Materials]({yaml_file.stem}.bom.tsv)\n\n\n"
|
||||
)
|
||||
|
||||
|
||||
def clean_generated(groupkeys):
|
||||
for key in groupkeys:
|
||||
# collect and remove files
|
||||
for filename in collect_filenames("Cleaning", key, generated_extensions):
|
||||
if filename.is_file():
|
||||
print(f' rm "{filename}"')
|
||||
filename.unlink()
|
||||
|
||||
|
||||
def compare_generated(groupkeys, branch="", include_graphviz_output=False):
|
||||
if branch:
|
||||
branch = f" {branch.strip()}"
|
||||
compare_extensions = (
|
||||
generated_extensions
|
||||
if include_graphviz_output
|
||||
else extensions_not_containing_graphviz_output
|
||||
)
|
||||
for key in groupkeys:
|
||||
# collect and compare files
|
||||
for filename in collect_filenames("Comparing", key, compare_extensions):
|
||||
cmd = f'git --no-pager diff{branch} -- "{filename}"'
|
||||
print(f" {cmd}")
|
||||
os.system(cmd)
|
||||
|
||||
|
||||
def restore_generated(groupkeys, branch=""):
|
||||
if branch:
|
||||
branch = f" {branch.strip()}"
|
||||
for key in groupkeys:
|
||||
# collect input YAML files
|
||||
filename_list = collect_filenames("Restoring", key, input_extensions)
|
||||
# collect files to restore
|
||||
filename_list = [
|
||||
fn.with_suffix(ext) for fn in filename_list for ext in generated_extensions
|
||||
]
|
||||
if readme in groups[key]:
|
||||
filename_list.append(groups[key]["path"] / readme)
|
||||
# restore files
|
||||
for filename in filename_list:
|
||||
cmd = f'git checkout{branch} -- "{filename}"'
|
||||
print(f" {cmd}")
|
||||
os.system(cmd)
|
||||
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(
|
||||
description=f"{APP_NAME} Example Manager",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-V",
|
||||
"--version",
|
||||
action="version",
|
||||
version=f"%(prog)s - {APP_NAME} {__version__}",
|
||||
)
|
||||
parser.add_argument(
|
||||
"action",
|
||||
nargs="?",
|
||||
action="store",
|
||||
choices=["build", "clean", "compare", "diff", "restore"],
|
||||
default="build",
|
||||
help="what to do with the generated files (default: build)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-c",
|
||||
"--compare-graphviz-output",
|
||||
action="store_true",
|
||||
help="the Graphviz output is also compared (default: False)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-b",
|
||||
"--branch",
|
||||
action="store",
|
||||
default="",
|
||||
help="branch or commit to compare with or restore from",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-g",
|
||||
"--groups",
|
||||
nargs="+",
|
||||
choices=groups.keys(),
|
||||
default=groups.keys(),
|
||||
help="the groups of generated files (default: all)",
|
||||
)
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def main():
|
||||
args = parse_args()
|
||||
if args.action == "build":
|
||||
build_generated(args.groups)
|
||||
elif args.action == "clean":
|
||||
clean_generated(args.groups)
|
||||
elif args.action == "compare" or args.action == "diff":
|
||||
compare_generated(args.groups, args.branch, args.compare_graphviz_output)
|
||||
elif args.action == "restore":
|
||||
restore_generated(args.groups, args.branch)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@ -1,270 +1,445 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import argparse
|
||||
import os
|
||||
from pathlib import Path
|
||||
import logging
|
||||
import sys
|
||||
from typing import Any, Tuple
|
||||
from pathlib import Path
|
||||
from typing import Any, Dict, List, Tuple, Union
|
||||
|
||||
import yaml
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
||||
if __name__ == "__main__":
|
||||
sys.path.insert(0, str(Path(__file__).parent.parent)) # add src/wireviz to PATH
|
||||
|
||||
from wireviz import __version__
|
||||
from wireviz.DataClasses import Metadata, Options, Tweak
|
||||
from wireviz.Harness import Harness
|
||||
from wireviz.wv_helper import expand, open_file_read
|
||||
from wireviz.wv_dataclasses import AUTOGENERATED_PREFIX, Metadata, Options, Tweak
|
||||
from wireviz.wv_harness import Harness
|
||||
from wireviz.wv_utils import (
|
||||
expand,
|
||||
get_single_key_and_value,
|
||||
is_arrow,
|
||||
open_file_read,
|
||||
smart_file_resolve,
|
||||
)
|
||||
|
||||
|
||||
def parse(yaml_input: str, file_out: (str, Path) = None, return_types: (None, str, Tuple[str]) = None) -> Any:
|
||||
def parse(
|
||||
inp: Union[Path, str, Dict],
|
||||
return_types: Union[None, str, Tuple[str]] = None,
|
||||
output_formats: Union[None, str, Tuple[str]] = None,
|
||||
output_dir: Union[str, Path] = None,
|
||||
output_name: Union[None, str] = None,
|
||||
image_paths: Union[Path, str, List] = [],
|
||||
) -> Any:
|
||||
"""
|
||||
Parses yaml input string and does the high-level harness conversion
|
||||
This function takes an input, parses it as a WireViz Harness file,
|
||||
and outputs the result as one or more files and/or as a function return value
|
||||
|
||||
:param yaml_input: a string containing the yaml input data
|
||||
:param file_out:
|
||||
:param return_types: if None, then returns None; if the value is a string, then a
|
||||
corresponding data format will be returned; if the value is a tuple of strings,
|
||||
then for every valid format in the `return_types` tuple, another return type
|
||||
will be generated and returned in the same order; currently supports:
|
||||
- "png" - will return the PNG data
|
||||
- "svg" - will return the SVG data
|
||||
- "harness" - will return the `Harness` instance
|
||||
Accepted inputs:
|
||||
* 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 Python Dict containing the pre-parsed YAML data
|
||||
|
||||
Supported return types:
|
||||
* "png": the diagram as raw PNG data
|
||||
* "svg": the diagram as raw SVG data
|
||||
* "harness": the diagram as a Harness Python object
|
||||
|
||||
Supported output formats:
|
||||
* "csv": the BOM, as a comma-separated text file
|
||||
* "gv": the diagram, as a GraphViz source file
|
||||
* "html": the diagram and (depending on the template) the BOM, as a HTML file
|
||||
* "png": the diagram, as a PNG raster image
|
||||
* "pdf": the diagram and (depending on the template) the BOM, as a PDF file
|
||||
* "svg": the diagram, as a SVG vector image
|
||||
* "tsv": the BOM, as a tab-separated text file
|
||||
|
||||
Args:
|
||||
inp (Path | str | Dict):
|
||||
The input to be parsed (see above for accepted inputs).
|
||||
return_types (optional):
|
||||
One of the supported return types (see above), or a tuple of multiple return types.
|
||||
If set to None, no output is returned by the function.
|
||||
output_formats (optional):
|
||||
One of the supported output types (see above), or a tuple of multiple output formats.
|
||||
If set to None, no files are generated.
|
||||
output_dir (Path | str, optional):
|
||||
The directory to place the generated output files.
|
||||
Defaults to inp's parent directory, or cwd if inp is not a path.
|
||||
output_name (str, optional):
|
||||
The name to use for the generated output files (without extension).
|
||||
Defaults to inp's file name (without extension).
|
||||
Required parameter if inp is not a path.
|
||||
image_paths (Path | str | List, optional):
|
||||
Paths to use when resolving any image paths included in the data.
|
||||
Note: If inp is a path to a YAML file,
|
||||
its parent directory will automatically be included in the list.
|
||||
|
||||
Returns:
|
||||
Depending on the return_types parameter, may return:
|
||||
* None
|
||||
* one of the following, or a tuple containing two or more of the following:
|
||||
* PNG data
|
||||
* SVG data
|
||||
* a Harness object
|
||||
"""
|
||||
|
||||
yaml_data = yaml.safe_load(yaml_input)
|
||||
if not output_formats and not return_types:
|
||||
raise Exception("No output formats or return types specified")
|
||||
|
||||
yaml_data, yaml_file = _get_yaml_data_and_path(inp)
|
||||
if output_formats:
|
||||
# need to write data to file, determine output directory and filename
|
||||
output_dir = _get_output_dir(yaml_file, output_dir)
|
||||
output_name = _get_output_name(yaml_file, output_name)
|
||||
output_file = output_dir / output_name
|
||||
|
||||
if yaml_file:
|
||||
# if reading from file, ensure that input file's parent directory
|
||||
# is included in image_paths
|
||||
default_image_path = yaml_file.parent.resolve()
|
||||
if not default_image_path in [Path(x).resolve() for x in image_paths]:
|
||||
image_paths.append(default_image_path)
|
||||
|
||||
# define variables =========================================================
|
||||
# containers for parsed component data and connection sets
|
||||
template_connectors = {}
|
||||
template_cables = {}
|
||||
connection_sets = []
|
||||
# actual harness
|
||||
harness = Harness(
|
||||
metadata = Metadata(**yaml_data.get('metadata', {})),
|
||||
options = Options(**yaml_data.get('options', {})),
|
||||
tweak = Tweak(**yaml_data.get('tweak', {})),
|
||||
metadata=Metadata(**yaml_data.get("metadata", {})),
|
||||
options=Options(**yaml_data.get("options", {})),
|
||||
tweak=Tweak(**yaml_data.get("tweak", {})),
|
||||
)
|
||||
# others
|
||||
# store mapping of components to their respective template
|
||||
designators_and_templates = {}
|
||||
# keep track of auto-generated designators to avoid duplicates
|
||||
autogenerated_designators = {}
|
||||
|
||||
# When title is not given, either deduce it from filename, or use default text.
|
||||
if 'title' not in harness.metadata:
|
||||
if file_out is None:
|
||||
harness.metadata['title'] = "WireViz diagram and BOM"
|
||||
else:
|
||||
harness.metadata['title'] = Path(file_out).stem
|
||||
if "title" not in harness.metadata:
|
||||
harness.metadata["title"] = Path(yaml_file).stem if yaml_file else ""
|
||||
|
||||
# add items
|
||||
sections = ['connectors', 'cables', 'connections']
|
||||
# parse YAML input file ====================================================
|
||||
|
||||
sections = ["connectors", "cables", "connections"]
|
||||
types = [dict, dict, list]
|
||||
for sec, ty in zip(sections, types):
|
||||
if sec in yaml_data and type(yaml_data[sec]) == ty:
|
||||
if len(yaml_data[sec]) > 0:
|
||||
if sec in yaml_data and type(yaml_data[sec]) == ty: # section exists
|
||||
if len(yaml_data[sec]) > 0: # section has contents
|
||||
if ty == dict:
|
||||
for key, attribs in yaml_data[sec].items():
|
||||
# The Image dataclass might need to open an image file with a relative path.
|
||||
image = attribs.get('image')
|
||||
# The Image dataclass might need to open
|
||||
# an image file with a relative path.
|
||||
image = attribs.get("image")
|
||||
if isinstance(image, dict):
|
||||
image['gv_dir'] = Path(file_out if file_out else '').parent # Inject context
|
||||
|
||||
if sec == 'connectors':
|
||||
if not attribs.get('autogenerate', False):
|
||||
harness.add_connector(name=key, **attribs)
|
||||
elif sec == 'cables':
|
||||
harness.add_cable(name=key, **attribs)
|
||||
else:
|
||||
pass # section exists but is empty
|
||||
image_path = image["src"]
|
||||
if image_path and not Path(image_path).is_absolute():
|
||||
# resolve relative image path
|
||||
image["src"] = smart_file_resolve(
|
||||
image_path, image_paths
|
||||
)
|
||||
if sec == "connectors":
|
||||
template_connectors[key] = attribs
|
||||
elif sec == "cables":
|
||||
template_cables[key] = attribs
|
||||
else: # section exists but is empty
|
||||
pass
|
||||
else: # section does not exist, create empty section
|
||||
if ty == dict:
|
||||
yaml_data[sec] = {}
|
||||
elif ty == list:
|
||||
yaml_data[sec] = []
|
||||
|
||||
# add connections
|
||||
connection_sets = yaml_data["connections"]
|
||||
|
||||
def check_designators(what, where): # helper function
|
||||
for i, x in enumerate(what):
|
||||
if x not in yaml_data[where[i]]:
|
||||
return False
|
||||
return True
|
||||
# go through connection sets, generate and connect components ==============
|
||||
|
||||
autogenerated_ids = {}
|
||||
for connection in yaml_data['connections']:
|
||||
# find first component (potentially nested inside list or dict)
|
||||
first_item = connection[0]
|
||||
if isinstance(first_item, list):
|
||||
first_item = first_item[0]
|
||||
elif isinstance(first_item, dict):
|
||||
first_item = list(first_item.keys())[0]
|
||||
elif isinstance(first_item, str):
|
||||
pass
|
||||
template_separator_char = harness.options.template_separator
|
||||
|
||||
# check which section the first item belongs to
|
||||
alternating_sections = ['connectors','cables']
|
||||
for index, section in enumerate(alternating_sections):
|
||||
if first_item in yaml_data[section]:
|
||||
expected_index = index
|
||||
break
|
||||
else:
|
||||
raise Exception('First item not found anywhere.')
|
||||
expected_index = 1 - expected_index # flip once since it is flipped back at the *beginning* of every loop
|
||||
|
||||
# check that all iterable items (lists and dicts) are the same length
|
||||
# and that they are alternating between connectors and cables/bundles, starting with either
|
||||
itemcount = None
|
||||
for item in connection:
|
||||
expected_index = 1 - expected_index # make sure items alternate between connectors and cables
|
||||
expected_section = alternating_sections[expected_index]
|
||||
if isinstance(item, list):
|
||||
itemcount_new = len(item)
|
||||
for subitem in item:
|
||||
if not subitem in yaml_data[expected_section]:
|
||||
raise Exception(f'{subitem} is not in {expected_section}')
|
||||
elif isinstance(item, dict):
|
||||
if len(item.keys()) != 1:
|
||||
raise Exception('Dicts may contain only one key here!')
|
||||
itemcount_new = len(expand(list(item.values())[0]))
|
||||
subitem = list(item.keys())[0]
|
||||
if not subitem in yaml_data[expected_section]:
|
||||
raise Exception(f'{subitem} is not in {expected_section}')
|
||||
elif isinstance(item, str):
|
||||
if not item in yaml_data[expected_section]:
|
||||
raise Exception(f'{item} is not in {expected_section}')
|
||||
continue
|
||||
if itemcount is not None and itemcount_new != itemcount:
|
||||
raise Exception('All lists and dict lists must be the same length!')
|
||||
itemcount = itemcount_new
|
||||
if itemcount is None:
|
||||
raise Exception('No item revealed the number of connections to make!')
|
||||
|
||||
# populate connection list
|
||||
connection_list = []
|
||||
for i, item in enumerate(connection):
|
||||
if isinstance(item, str): # one single-pin component was specified
|
||||
sublist = []
|
||||
for i in range(1, itemcount + 1):
|
||||
if yaml_data['connectors'][item].get('autogenerate'):
|
||||
autogenerated_ids[item] = autogenerated_ids.get(item, 0) + 1
|
||||
new_id = f'_{item}_{autogenerated_ids[item]}'
|
||||
harness.add_connector(new_id, **yaml_data['connectors'][item])
|
||||
sublist.append([new_id, 1])
|
||||
else:
|
||||
sublist.append([item, 1])
|
||||
connection_list.append(sublist)
|
||||
elif isinstance(item, list): # a list of single-pin components were specified
|
||||
sublist = []
|
||||
for subitem in item:
|
||||
if yaml_data['connectors'][subitem].get('autogenerate'):
|
||||
autogenerated_ids[subitem] = autogenerated_ids.get(subitem, 0) + 1
|
||||
new_id = f'_{subitem}_{autogenerated_ids[subitem]}'
|
||||
harness.add_connector(new_id, **yaml_data['connectors'][subitem])
|
||||
sublist.append([new_id, 1])
|
||||
else:
|
||||
sublist.append([subitem, 1])
|
||||
connection_list.append(sublist)
|
||||
elif isinstance(item, dict): # a component with multiple pins was specified
|
||||
sublist = []
|
||||
id = list(item.keys())[0]
|
||||
pins = expand(list(item.values())[0])
|
||||
for pin in pins:
|
||||
sublist.append([id, pin])
|
||||
connection_list.append(sublist)
|
||||
def resolve_designator(inp, separator):
|
||||
if separator in inp: # generate a new instance of an item
|
||||
if inp.count(separator) > 1:
|
||||
raise Exception(f"{inp} - Found more than one separator ({separator})")
|
||||
template, designator = inp.split(separator)
|
||||
if designator == "":
|
||||
autogenerated_designators[template] = (
|
||||
autogenerated_designators.get(template, 0) + 1
|
||||
)
|
||||
designator = (
|
||||
f"{AUTOGENERATED_PREFIX}"
|
||||
f"{template}_{autogenerated_designators[template]}"
|
||||
)
|
||||
# check if redefining existing component to different template
|
||||
if designator in designators_and_templates:
|
||||
if designators_and_templates[designator] != template:
|
||||
raise Exception(
|
||||
f"Trying to redefine {designator}"
|
||||
f" from {designators_and_templates[designator]} to {template}"
|
||||
)
|
||||
else:
|
||||
raise Exception('Unexpected item in connection list')
|
||||
designators_and_templates[designator] = template
|
||||
else:
|
||||
template, designator = (inp, inp)
|
||||
if designator in designators_and_templates:
|
||||
pass # referencing an exiting connector, no need to add again
|
||||
else:
|
||||
designators_and_templates[designator] = template
|
||||
return (template, designator)
|
||||
|
||||
# actually connect components using connection list
|
||||
for i, item in enumerate(connection_list):
|
||||
id = item[0][0] # TODO: make more elegant/robust/pythonic
|
||||
if id in harness.cables:
|
||||
for j, con in enumerate(item):
|
||||
if i == 0: # list started with a cable, no connector to join on left side
|
||||
from_name = None
|
||||
from_pin = None
|
||||
# utilities to check for alternating connectors and cables/arrows ==========
|
||||
|
||||
alternating_types = ["connector", "cable/arrow"]
|
||||
expected_type = None
|
||||
|
||||
def check_type(designator, template, actual_type):
|
||||
nonlocal expected_type
|
||||
if not expected_type: # each connection set may start with either section
|
||||
expected_type = actual_type
|
||||
|
||||
if actual_type != expected_type: # did not alternate
|
||||
raise Exception(
|
||||
f'Expected {expected_type}, but "{designator}" ("{template}") is {actual_type}'
|
||||
)
|
||||
|
||||
def alternate_type(): # flip between connector and cable/arrow
|
||||
nonlocal expected_type
|
||||
expected_type = alternating_types[1 - alternating_types.index(expected_type)]
|
||||
|
||||
for connection_set in connection_sets:
|
||||
|
||||
# figure out number of parallel connections within this set
|
||||
connectioncount = []
|
||||
for entry in connection_set:
|
||||
if isinstance(entry, list):
|
||||
connectioncount.append(len(entry))
|
||||
elif isinstance(entry, dict):
|
||||
connectioncount.append(len(expand(list(entry.values())[0])))
|
||||
# e.g.: - X1: [1-4,6] yields 5
|
||||
else:
|
||||
pass # strings do not reveal connectioncount
|
||||
if not any(connectioncount):
|
||||
# no item in the list revealed connection count;
|
||||
# assume connection count is 1
|
||||
connectioncount = [1]
|
||||
# Example: The following is a valid connection set,
|
||||
# even though no item reveals the connection count;
|
||||
# the count is not needed because only a component-level mate happens.
|
||||
# -
|
||||
# - CONNECTOR
|
||||
# - ==>
|
||||
# - CONNECTOR
|
||||
|
||||
# check that all entries are the same length
|
||||
if len(set(connectioncount)) > 1:
|
||||
raise Exception(
|
||||
"All items in connection set must reference the same number of connections"
|
||||
)
|
||||
# all entries are the same length, connection count is set
|
||||
connectioncount = connectioncount[0]
|
||||
|
||||
# expand string entries to list entries of correct length
|
||||
for index, entry in enumerate(connection_set):
|
||||
if isinstance(entry, str):
|
||||
connection_set[index] = [entry] * connectioncount
|
||||
|
||||
# resolve all designators
|
||||
for index, entry in enumerate(connection_set):
|
||||
if isinstance(entry, list):
|
||||
for subindex, item in enumerate(entry):
|
||||
template, designator = resolve_designator(
|
||||
item, template_separator_char
|
||||
)
|
||||
connection_set[index][subindex] = designator
|
||||
elif isinstance(entry, dict):
|
||||
key = list(entry.keys())[0]
|
||||
template, designator = resolve_designator(key, template_separator_char)
|
||||
value = entry[key]
|
||||
connection_set[index] = {designator: value}
|
||||
else:
|
||||
pass # string entries have been expanded in previous step
|
||||
|
||||
# expand all pin lists
|
||||
for index, entry in enumerate(connection_set):
|
||||
if isinstance(entry, list):
|
||||
connection_set[index] = [{designator: 1} for designator in entry]
|
||||
elif isinstance(entry, dict):
|
||||
designator = list(entry.keys())[0]
|
||||
pinlist = expand(entry[designator])
|
||||
connection_set[index] = [{designator: pin} for pin in pinlist]
|
||||
else:
|
||||
pass # string entries have been expanded in previous step
|
||||
|
||||
# Populate wiring harness ==============================================
|
||||
|
||||
expected_type = None # reset check for alternating types
|
||||
# at the beginning of every connection set
|
||||
# since each set may begin with either type
|
||||
|
||||
# generate components
|
||||
for entry in connection_set:
|
||||
for item in entry:
|
||||
designator = list(item.keys())[0]
|
||||
template = designators_and_templates[designator]
|
||||
|
||||
if designator in harness.connectors: # existing connector instance
|
||||
check_type(designator, template, "connector")
|
||||
elif template in template_connectors.keys():
|
||||
# generate new connector instance from template
|
||||
check_type(designator, template, "connector")
|
||||
harness.add_connector(
|
||||
designator=designator, **template_connectors[template]
|
||||
)
|
||||
|
||||
elif designator in harness.cables: # existing cable instance
|
||||
check_type(designator, template, "cable/arrow")
|
||||
elif template in template_cables.keys():
|
||||
# generate new cable instance from template
|
||||
check_type(designator, template, "cable/arrow")
|
||||
harness.add_cable(
|
||||
designator=designator, **template_cables[template]
|
||||
)
|
||||
|
||||
elif is_arrow(designator):
|
||||
check_type(designator, template, "cable/arrow")
|
||||
# arrows do not need to be generated here
|
||||
else:
|
||||
raise Exception(
|
||||
f"{template} is an unknown template/designator/arrow."
|
||||
)
|
||||
|
||||
# entries in connection set must alternate between connectors and cables/arrows
|
||||
alternate_type()
|
||||
|
||||
# transpose connection set list
|
||||
# before: one item per component, one subitem per connection in set
|
||||
# after: one item per connection in set, one subitem per component
|
||||
connection_set = list(map(list, zip(*connection_set)))
|
||||
|
||||
# connect components
|
||||
for index_entry, entry in enumerate(connection_set):
|
||||
for index_item, item in enumerate(entry):
|
||||
designator = list(item.keys())[0]
|
||||
|
||||
if designator in harness.cables:
|
||||
if index_item == 0:
|
||||
# list started with a cable, no connector to join on left side
|
||||
from_name, from_pin = (None, None)
|
||||
else:
|
||||
from_name = connection_list[i-1][j][0]
|
||||
from_pin = connection_list[i-1][j][1]
|
||||
via_name = item[j][0]
|
||||
via_pin = item[j][1]
|
||||
if i == len(connection_list) - 1: # list ends with a cable, no connector to join on right side
|
||||
to_name = None
|
||||
to_pin = None
|
||||
from_name, from_pin = get_single_key_and_value(
|
||||
entry[index_item - 1]
|
||||
)
|
||||
via_name, via_pin = (designator, item[designator])
|
||||
if index_item == len(entry) - 1:
|
||||
# list ends with a cable, no connector to join on right side
|
||||
to_name, to_pin = (None, None)
|
||||
else:
|
||||
to_name = connection_list[i+1][j][0]
|
||||
to_pin = connection_list[i+1][j][1]
|
||||
harness.connect(from_name, from_pin, via_name, via_pin, to_name, to_pin)
|
||||
to_name, to_pin = get_single_key_and_value(
|
||||
entry[index_item + 1]
|
||||
)
|
||||
harness.connect(
|
||||
from_name, from_pin, via_name, via_pin, to_name, to_pin
|
||||
)
|
||||
|
||||
elif is_arrow(designator):
|
||||
if index_item == 0: # list starts with an arrow
|
||||
raise Exception(
|
||||
"An arrow cannot be at the start of a connection set"
|
||||
)
|
||||
elif index_item == len(entry) - 1: # list ends with an arrow
|
||||
raise Exception(
|
||||
"An arrow cannot be at the end of a connection set"
|
||||
)
|
||||
|
||||
from_name, from_pin = get_single_key_and_value(
|
||||
entry[index_item - 1]
|
||||
)
|
||||
via_name, via_pin = (designator, None)
|
||||
to_name, to_pin = get_single_key_and_value(entry[index_item + 1])
|
||||
if "-" in designator: # mate pin by pin
|
||||
harness.add_mate_pin(
|
||||
from_name, from_pin, to_name, to_pin, designator
|
||||
)
|
||||
elif "=" in designator and index_entry == 0:
|
||||
# mate two connectors as a whole
|
||||
harness.add_mate_component(from_name, to_name, designator)
|
||||
|
||||
if "additional_bom_items" in yaml_data:
|
||||
for line in yaml_data["additional_bom_items"]:
|
||||
harness.add_bom_item(line)
|
||||
try:
|
||||
harness.add_additional_bom_item(line)
|
||||
except TypeError as e:
|
||||
logging.error(f"Failed to add line {line} as an additional bom item")
|
||||
raise
|
||||
|
||||
if file_out is not None:
|
||||
harness.output(filename=file_out, fmt=('png', 'svg'), view=False)
|
||||
# harness population completed =============================================
|
||||
|
||||
if return_types is not None:
|
||||
harness.populate_bom()
|
||||
|
||||
if output_formats:
|
||||
harness.output(filename=output_file, fmt=output_formats, view=False)
|
||||
|
||||
if return_types:
|
||||
returns = []
|
||||
if isinstance(return_types, str): # only one return type speficied
|
||||
if isinstance(return_types, str): # only one return type speficied
|
||||
return_types = [return_types]
|
||||
|
||||
return_types = [t.lower() for t in return_types]
|
||||
|
||||
for rt in return_types:
|
||||
if rt == 'png':
|
||||
if rt == "png":
|
||||
returns.append(harness.png)
|
||||
if rt == 'svg':
|
||||
if rt == "svg":
|
||||
returns.append(harness.svg)
|
||||
if rt == 'harness':
|
||||
if rt == "harness":
|
||||
returns.append(harness)
|
||||
|
||||
return tuple(returns) if len(returns) != 1 else returns[0]
|
||||
|
||||
|
||||
def parse_file(yaml_file: str, file_out: (str, Path) = None) -> None:
|
||||
with open_file_read(yaml_file) as file:
|
||||
yaml_input = file.read()
|
||||
|
||||
if not file_out:
|
||||
fn, fext = os.path.splitext(yaml_file)
|
||||
file_out = fn
|
||||
file_out = os.path.abspath(file_out)
|
||||
|
||||
parse(yaml_input, file_out=file_out)
|
||||
def _get_yaml_data_and_path(inp: Union[str, Path, Dict]) -> (Dict, Path):
|
||||
# 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 isinstance(inp, Path) or (isinstance(inp, str) and not "\n" in inp):
|
||||
yaml_path = Path(inp).expanduser().resolve(strict=True)
|
||||
yaml_str = open_file_read(yaml_path).read()
|
||||
else:
|
||||
yaml_path = None
|
||||
yaml_str = inp
|
||||
yaml_data = yaml.safe_load(yaml_str)
|
||||
else:
|
||||
# received a Dict, use as-is
|
||||
yaml_data = inp
|
||||
yaml_path = None
|
||||
return yaml_data, yaml_path
|
||||
|
||||
|
||||
def parse_cmdline():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Generate cable and wiring harness documentation from YAML descriptions',
|
||||
)
|
||||
parser.add_argument('-V', '--version', action='version', version='%(prog)s ' + __version__)
|
||||
parser.add_argument('input_file', action='store', type=str, metavar='YAML_FILE')
|
||||
parser.add_argument('-o', '--output_file', action='store', type=str, metavar='OUTPUT')
|
||||
# Not implemented: parser.add_argument('--generate-bom', action='store_true', default=True)
|
||||
parser.add_argument('--prepend-file', action='store', type=str, metavar='YAML_FILE')
|
||||
return parser.parse_args()
|
||||
def _get_output_dir(input_file: Path, default_output_dir: Path) -> Path:
|
||||
if default_output_dir: # user-specified output directory
|
||||
output_dir = Path(default_output_dir)
|
||||
else: # auto-determine appropriate output directory
|
||||
if input_file: # input comes from a file; place output in same directory
|
||||
output_dir = input_file.parent
|
||||
else: # input comes from str or Dict; fall back to cwd
|
||||
output_dir = Path.cwd()
|
||||
return output_dir.resolve()
|
||||
|
||||
|
||||
def _get_output_name(input_file: Path, default_output_name: Path) -> str:
|
||||
if default_output_name: # user-specified output name
|
||||
output_name = default_output_name
|
||||
else: # auto-determine appropriate output name
|
||||
if input_file: # input comes from a file; use same file stem
|
||||
output_name = input_file.stem
|
||||
else: # input comes from str or Dict; no fallback available
|
||||
raise Exception("No output file name provided")
|
||||
return output_name
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
args = parse_cmdline()
|
||||
|
||||
if not os.path.exists(args.input_file):
|
||||
print(f'Error: input file {args.input_file} inaccessible or does not exist, check path')
|
||||
sys.exit(1)
|
||||
|
||||
with open_file_read(args.input_file) as fh:
|
||||
yaml_input = fh.read()
|
||||
|
||||
if args.prepend_file:
|
||||
if not os.path.exists(args.prepend_file):
|
||||
print(f'Error: prepend input file {args.prepend_file} inaccessible or does not exist, check path')
|
||||
sys.exit(1)
|
||||
with open_file_read(args.prepend_file) as fh:
|
||||
prepend = fh.read()
|
||||
yaml_input = prepend + yaml_input
|
||||
|
||||
if not args.output_file:
|
||||
file_out = args.input_file
|
||||
pre, _ = os.path.splitext(file_out)
|
||||
file_out = pre # extension will be added by graphviz output function
|
||||
else:
|
||||
file_out = args.output_file
|
||||
file_out = os.path.abspath(file_out)
|
||||
|
||||
parse(yaml_input, file_out=file_out)
|
||||
print("When running from the command line, please use wv_cli.py instead.")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
@ -1,203 +1,144 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from dataclasses import asdict
|
||||
from itertools import groupby
|
||||
from typing import Any, Dict, List, Optional, Tuple, Union
|
||||
from collections import namedtuple
|
||||
from enum import Enum, IntEnum
|
||||
from typing import List, Optional
|
||||
|
||||
from wireviz.DataClasses import AdditionalComponent, Cable, Color, Connector
|
||||
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
|
||||
import tabulate as tabulate_module
|
||||
|
||||
BOM_COLUMNS_ALWAYS = ('id', 'description', 'qty', 'unit', 'designators')
|
||||
BOM_COLUMNS_OPTIONAL = ('pn', 'manufacturer', 'mpn', 'supplier', 'spn')
|
||||
BOM_COLUMNS_IN_KEY = ('description', 'unit') + BOM_COLUMNS_OPTIONAL
|
||||
from wireviz.wv_utils import html_line_breaks
|
||||
|
||||
HEADER_PN = 'P/N'
|
||||
HEADER_MPN = 'MPN'
|
||||
HEADER_SPN = 'SPN'
|
||||
BOM_HASH_FIELDS = "description qty_unit amount partnumbers"
|
||||
|
||||
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:
|
||||
"""Return part field values for the optional BOM columns as a dict."""
|
||||
part = asdict(part)
|
||||
return {field: part.get(field) for field in BOM_COLUMNS_OPTIONAL}
|
||||
BomEntry = namedtuple("BomEntry", "category qty designators")
|
||||
BomHash = namedtuple("BomHash", BOM_HASH_FIELDS)
|
||||
BomHashList = namedtuple("BomHashList", BOM_HASH_FIELDS)
|
||||
PartNumberInfo = namedtuple("PartNumberInfo", "pn manufacturer mpn supplier spn")
|
||||
|
||||
def get_additional_component_table(harness: "Harness", component: Union[Connector, Cable]) -> List[str]:
|
||||
"""Return a list of diagram node table row strings with additional components."""
|
||||
rows = []
|
||||
if component.additional_components:
|
||||
rows.append(["Additional components"])
|
||||
for part in component.additional_components:
|
||||
common_args = {
|
||||
'qty': part.qty * component.get_qty_multiplier(part.qty_multiplier),
|
||||
'unit': part.unit,
|
||||
'bgcolor': part.bgcolor,
|
||||
}
|
||||
if harness.options.mini_bom_mode:
|
||||
id = get_bom_index(harness.bom(), bom_entry_key({**asdict(part), 'description': part.description}))
|
||||
rows.append(component_table_entry(f'#{id} ({part.type.rstrip()})', **common_args))
|
||||
else:
|
||||
rows.append(component_table_entry(part.description, **common_args, **optional_fields(part)))
|
||||
return rows
|
||||
# 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_bom(component: Union[Connector, Cable]) -> List[BOMEntry]:
|
||||
"""Return a list of BOM entries with additional components."""
|
||||
bom_entries = []
|
||||
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']
|
||||
BomCategory = IntEnum( # to enforce ordering in BOM
|
||||
"BomEntry", "CONNECTOR CABLE WIRE ADDITIONAL_INSIDE ADDITIONAL_OUTSIDE"
|
||||
)
|
||||
QtyMultiplierConnector = Enum(
|
||||
"QtyMultiplierConnector", "PINCOUNT POPULATED CONNECTIONS"
|
||||
)
|
||||
QtyMultiplierCable = Enum(
|
||||
"QtyMultiplierCable", "WIRECOUNT TERMINATION LENGTH TOTAL_LENGTH"
|
||||
)
|
||||
|
||||
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),
|
||||
})
|
||||
PART_NUMBER_HEADERS = PartNumberInfo(
|
||||
pn="P/N", manufacturer=None, mpn="MPN", supplier=None, spn="SPN"
|
||||
)
|
||||
|
||||
# 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:
|
||||
# add each wire from the bundle to the bom
|
||||
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()},
|
||||
})
|
||||
def partnumbers2list(
|
||||
partnumbers: PartNumberInfo, parent_partnumbers: PartNumberInfo = None
|
||||
) -> List[str]:
|
||||
if parent_partnumbers is None:
|
||||
_is_toplevel = True
|
||||
parent_partnumbers = partnumbers
|
||||
else:
|
||||
_is_toplevel = False
|
||||
|
||||
# add cable/bundles aditional components to bom
|
||||
bom_entries.extend(get_additional_component_bom(cable))
|
||||
# Note: != operator used as XOR in the following section (https://stackoverflow.com/a/433161)
|
||||
|
||||
# add harness aditional components to bom directly, as they both are List[BOMEntry]
|
||||
bom_entries.extend(harness.additional_bom_items)
|
||||
if _is_toplevel != isinstance(parent_partnumbers.pn, List):
|
||||
# top level and not a list, or wire level and list
|
||||
cell_pn = pn_info_string(PART_NUMBER_HEADERS.pn, None, partnumbers.pn)
|
||||
else:
|
||||
# top level and list -> do per wire later
|
||||
# wire level and not list -> already done at top level
|
||||
cell_pn = 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]
|
||||
if _is_toplevel != isinstance(parent_partnumbers.mpn, List):
|
||||
# TODO: edge case: different manufacturers, but same MPN?
|
||||
cell_mpn = pn_info_string(
|
||||
PART_NUMBER_HEADERS.mpn, partnumbers.manufacturer, partnumbers.mpn
|
||||
)
|
||||
else:
|
||||
cell_mpn = None
|
||||
|
||||
# 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))})
|
||||
if _is_toplevel != isinstance(parent_partnumbers.spn, List):
|
||||
# TODO: edge case: different suppliers, but same SPN?
|
||||
cell_spn = pn_info_string(
|
||||
PART_NUMBER_HEADERS.spn, partnumbers.supplier, partnumbers.spn
|
||||
)
|
||||
else:
|
||||
cell_spn = None
|
||||
|
||||
# add an incrementing id to each bom entry
|
||||
return [{**entry, 'id': index} for index, entry in enumerate(bom, 1)]
|
||||
cell_contents = [cell_pn, cell_mpn, cell_spn]
|
||||
if any(cell_contents):
|
||||
return [html_line_breaks(cell) for cell in cell_contents]
|
||||
else:
|
||||
return None
|
||||
|
||||
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(header: str, name: Optional[str], number: Optional[str]) -> Optional[str]:
|
||||
def pn_info_string(
|
||||
header: str, name: Optional[str], number: Optional[str]
|
||||
) -> Optional[str]:
|
||||
"""Return the company name and/or the part number in one single string or None otherwise."""
|
||||
number = str(number).strip() if number is not None else ''
|
||||
number = str(number).strip() if number is not None else ""
|
||||
if name or number:
|
||||
return f'{name if name else header}{": " + number if number else ""}'
|
||||
else:
|
||||
return None
|
||||
|
||||
def index_if_list(value: Any, index: int) -> Any:
|
||||
"""Return the value indexed if it is a list, or simply the value otherwise."""
|
||||
return value[index] if isinstance(value, list) else value
|
||||
|
||||
def make_list(value: Any) -> list:
|
||||
"""Return value if a list, empty list if None, or single element list otherwise."""
|
||||
return value if isinstance(value, list) else [] if value is None else [value]
|
||||
def bom_list(bom):
|
||||
headers = (
|
||||
"# 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_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))
|
||||
|
||||
def print_bom_table(bom):
|
||||
print()
|
||||
print(tabulate_module.tabulate(bom_list(bom), headers="firstrow"))
|
||||
print()
|
||||
|
||||
159
src/wireviz/wv_cli.py
Normal file
@ -0,0 +1,159 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import click
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
|
||||
|
||||
import wireviz.wireviz as wv
|
||||
from wireviz import APP_NAME, __version__
|
||||
from wireviz.wv_utils import open_file_read
|
||||
|
||||
format_codes = {
|
||||
"c": "csv",
|
||||
"g": "gv",
|
||||
"h": "html",
|
||||
"p": "png",
|
||||
"P": "pdf",
|
||||
"s": "svg",
|
||||
"t": "tsv",
|
||||
}
|
||||
|
||||
|
||||
epilog = (
|
||||
"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.argument("file", nargs=-1)
|
||||
@click.option(
|
||||
"-f",
|
||||
"--format",
|
||||
default="hpst",
|
||||
type=str,
|
||||
show_default=True,
|
||||
help="Output formats (see below).",
|
||||
)
|
||||
@click.option(
|
||||
"-p",
|
||||
"--prepend",
|
||||
default=[],
|
||||
multiple=True,
|
||||
type=Path,
|
||||
help="YAML file to prepend to the input file (optional).",
|
||||
)
|
||||
@click.option(
|
||||
"-o",
|
||||
"--output-dir",
|
||||
default=None,
|
||||
type=Path,
|
||||
help="Directory to use for output files, if different from input file directory.",
|
||||
)
|
||||
@click.option(
|
||||
"-O",
|
||||
"--output-name",
|
||||
default=None,
|
||||
type=str,
|
||||
help=(
|
||||
"File name (without extension) to use for output files, "
|
||||
"if different from input file name."
|
||||
),
|
||||
)
|
||||
@click.option(
|
||||
"-V",
|
||||
"--version",
|
||||
is_flag=True,
|
||||
default=False,
|
||||
help=f"Output {APP_NAME} version and exit.",
|
||||
)
|
||||
def wireviz(file, format, prepend, output_dir, output_name, version):
|
||||
"""
|
||||
Parses the provided FILE and generates the specified outputs.
|
||||
"""
|
||||
print() # blank line before execution
|
||||
print(f"{APP_NAME} {__version__}")
|
||||
if version:
|
||||
return # print version number only and exit
|
||||
|
||||
# get list of files
|
||||
try:
|
||||
_ = iter(file)
|
||||
except TypeError:
|
||||
filepaths = [file]
|
||||
else:
|
||||
filepaths = list(file)
|
||||
|
||||
# determine output formats
|
||||
output_formats = []
|
||||
for code in format:
|
||||
if code in format_codes:
|
||||
output_formats.append(format_codes[code])
|
||||
else:
|
||||
raise Exception(f"Unknown output format: {code}")
|
||||
output_formats = tuple(sorted(set(output_formats)))
|
||||
output_formats_str = (
|
||||
f'[{"|".join(output_formats)}]'
|
||||
if len(output_formats) > 1
|
||||
else output_formats[0]
|
||||
)
|
||||
|
||||
# check prepend file
|
||||
if len(prepend) > 0:
|
||||
prepend_input = ""
|
||||
for prepend_file in prepend:
|
||||
prepend_file = Path(prepend_file)
|
||||
if not prepend_file.exists():
|
||||
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)
|
||||
|
||||
prepend_input += open_file_read(prepend_file).read() + "\n"
|
||||
else:
|
||||
prepend_input = ""
|
||||
|
||||
# run WireVIz on each input file
|
||||
for file in filepaths:
|
||||
file = Path(file)
|
||||
if not file.exists():
|
||||
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
|
||||
_output_dir = file.parent if not output_dir else output_dir
|
||||
_output_name = file.stem if not output_name else output_name
|
||||
|
||||
print("Input file: ", file)
|
||||
print(
|
||||
"Output file: ", f"{Path(_output_dir / _output_name)}.{output_formats_str}"
|
||||
)
|
||||
|
||||
yaml_input = open_file_read(file).read()
|
||||
file_dir = file.parent
|
||||
|
||||
yaml_input = prepend_input + yaml_input
|
||||
image_paths = {file_dir}
|
||||
for p in prepend:
|
||||
image_paths.add(Path(p).parent)
|
||||
|
||||
wv.parse(
|
||||
yaml_input,
|
||||
output_formats=output_formats,
|
||||
output_dir=_output_dir,
|
||||
output_name=_output_name,
|
||||
image_paths=list(image_paths),
|
||||
)
|
||||
|
||||
print() # blank line after execution
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
wireviz()
|
||||
@ -1,184 +1,232 @@
|
||||
# -*- 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
|
||||
elif inp.upper() in known_colors.keys():
|
||||
inp_upper = inp.upper()
|
||||
self._code_en = inp_upper
|
||||
self._html = known_colors[inp_upper].html
|
||||
else: # 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
|
||||
self.colors.append(SingleColor(item))
|
||||
elif isinstance(inp, SingleColor): # single color
|
||||
self.colors = [inp]
|
||||
else: # split input into list
|
||||
if ":" in str(inp):
|
||||
self.colors = [SingleColor(item) for item in inp.split(":")]
|
||||
else:
|
||||
if isinstance(inp, int):
|
||||
self.colors = [SingleColor(inp)]
|
||||
elif 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]
|
||||
else: # assume it's a valud HTML color name
|
||||
self.colors = [SingleColor(inp)]
|
||||
else: # 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(selfq)}")
|
||||
return [str(color) for color in out]
|
||||
|
||||
@property
|
||||
def html_padded(self):
|
||||
return ":".join(self.html_padded_list)
|
||||
|
||||
|
||||
COLOR_CODES = {
|
||||
'DIN': ['WH', 'BN', 'GN', 'YE', 'GY', 'PK', 'BU', 'RD', 'BK', 'VT', 'GYPK', 'RDBU', 'WHGN', 'BNGN', 'WHYE', 'YEBN',
|
||||
'WHGY', 'GYBN', 'WHPK', 'PKBN', 'WHBU', 'BNBU', 'WHRD', 'BNRD', 'WHBK', 'BNBK', 'GYGN', 'YEGY', 'PKGN',
|
||||
'YEPK', 'GNBU', 'YEBU', 'GNRD', 'YERD', 'GNBK', 'YEBK', 'GYBU', 'PKBU', 'GYRD', 'PKRD', 'GYBK', 'PKBK',
|
||||
'BUBK', 'RDBK', 'WHBNBK', 'YEGNBK', 'GYPKBK', 'RDBUBK', 'WHGNBK', 'BNGNBK', 'WHYEBK', 'YEBNBK', 'WHGYBK',
|
||||
'GYBNBK', 'WHPKBK', 'PKBNBK', 'WHBUBK', 'BNBUBK', 'WHRDBK', 'BNRDBK'],
|
||||
'IEC': ['BN', 'RD', 'OG', 'YE', 'GN', 'BU', 'VT', 'GY', 'WH', 'BK'],
|
||||
'BW': ['BK', 'WH'],
|
||||
# fmt: off
|
||||
"DIN": [
|
||||
"WH", "BN", "GN", "YE", "GY", "PK", "BU", "RD", "BK", "VT", "GYPK", "RDBU",
|
||||
"WHGN", "BNGN", "WHYE", "YEBN", "WHGY", "GYBN", "WHPK", "PKBN", "WHBU", "BNBU",
|
||||
"WHRD", "BNRD", "WHBK", "BNBK", "GYGN", "YEGY", "PKGN", "YEPK", "GNBU", "YEBU",
|
||||
"GNRD", "YERD", "GNBK", "YEBK", "GYBU", "PKBU", "GYRD", "PKRD", "GYBK", "PKBK",
|
||||
"BUBK", "RDBK", "WHBNBK", "YEGNBK", "GYPKBK", "RDBUBK", "WHGNBK", "BNGNBK",
|
||||
"WHYEBK", "YEBNBK", "WHGYBK", "GYBNBK", "WHPKBK", "PKBNBK", "WHBUBK",
|
||||
"BNBUBK", "WHRDBK", "BNRDBK",
|
||||
],
|
||||
# fmt: on
|
||||
"IEC": ["BN", "RD", "OG", "YE", "GN", "BU", "VT", "GY", "WH", "BK"],
|
||||
"BW": ["BK", "WH"],
|
||||
# 25-pair color code - see also https://en.wikipedia.org/wiki/25-pair_color_code
|
||||
# 5 major colors (WH,RD,BK,YE,VT) combined with 5 minor colors (BU,OG,GN,BN,SL).
|
||||
# Each POTS pair tip (+) had major/minor color, and ring (-) had minor/major color.
|
||||
'TEL': [ # 25x2: Ring and then tip of each pair
|
||||
'BUWH', 'WHBU', 'OGWH', 'WHOG', 'GNWH', 'WHGN', 'BNWH', 'WHBN', 'SLWH', 'WHSL',
|
||||
'BURD', 'RDBU', 'OGRD', 'RDOG', 'GNRD', 'RDGN', 'BNRD', 'RDBN', 'SLRD', 'RDSL',
|
||||
'BUBK', 'BKBU', 'OGBK', 'BKOG', 'GNBK', 'BKGN', 'BNBK', 'BKBN', 'SLBK', 'BKSL',
|
||||
'BUYE', 'YEBU', 'OGYE', 'YEOG', 'GNYE', 'YEGN', 'BNYE', 'YEBN', 'SLYE', 'YESL',
|
||||
'BUVT', 'VTBU', 'OGVT', 'VTOG', 'GNVT', 'VTGN', 'BNVT', 'VTBN', 'SLVT', 'VTSL'],
|
||||
'TELALT': [ # 25x2: Tip and then ring of each pair
|
||||
'WHBU', 'BU', 'WHOG', 'OG', 'WHGN', 'GN', 'WHBN', 'BN', 'WHSL', 'SL',
|
||||
'RDBU', 'BURD', 'RDOG', 'OGRD', 'RDGN', 'GNRD', 'RDBN', 'BNRD', 'RDSL', 'SLRD',
|
||||
'BKBU', 'BUBK', 'BKOG', 'OGBK', 'BKGN', 'GNBK', 'BKBN', 'BNBK', 'BKSL', 'SLBK',
|
||||
'YEBU', 'BUYE', 'YEOG', 'OGYE', 'YEGN', 'GNYE', 'YEBN', 'BNYE', 'YESL', 'SLYE',
|
||||
'VTBU', 'BUVT', 'VTOG', 'OGVT', 'VTGN', 'GNVT', 'VTBN', 'BNVT', 'VTSL', 'SLVT'],
|
||||
'T568A': ['WHGN', 'GN', 'WHOG', 'BU', 'WHBU', 'OG', 'WHBN', 'BN'],
|
||||
'T568B': ['WHOG', 'OG', 'WHGN', 'BU', 'WHBU', 'GN', 'WHBN', 'BN'],
|
||||
# fmt: off
|
||||
"TEL": [ # 25x2: Ring and then tip of each pair
|
||||
"BUWH", "WHBU", "OGWH", "WHOG", "GNWH", "WHGN", "BNWH", "WHBN", "SLWH", "WHSL",
|
||||
"BURD", "RDBU", "OGRD", "RDOG", "GNRD", "RDGN", "BNRD", "RDBN", "SLRD", "RDSL",
|
||||
"BUBK", "BKBU", "OGBK", "BKOG", "GNBK", "BKGN", "BNBK", "BKBN", "SLBK", "BKSL",
|
||||
"BUYE", "YEBU", "OGYE", "YEOG", "GNYE", "YEGN", "BNYE", "YEBN", "SLYE", "YESL",
|
||||
"BUVT", "VTBU", "OGVT", "VTOG", "GNVT", "VTGN", "BNVT", "VTBN", "SLVT", "VTSL",
|
||||
],
|
||||
"TELALT": [ # 25x2: Tip and then ring of each pair
|
||||
"WHBU", "BU", "WHOG", "OG", "WHGN", "GN", "WHBN", "BN", "WHSL", "SL",
|
||||
"RDBU", "BURD", "RDOG", "OGRD", "RDGN", "GNRD", "RDBN", "BNRD", "RDSL", "SLRD",
|
||||
"BKBU", "BUBK", "BKOG", "OGBK", "BKGN", "GNBK", "BKBN", "BNBK", "BKSL", "SLBK",
|
||||
"YEBU", "BUYE", "YEOG", "OGYE", "YEGN", "GNYE", "YEBN", "BNYE", "YESL", "SLYE",
|
||||
"VTBU", "BUVT", "VTOG", "OGVT", "VTGN", "GNVT", "VTBN", "BNVT", "VTSL", "SLVT",
|
||||
],
|
||||
# fmt: on
|
||||
"T568A": ["WHGN", "GN", "WHOG", "BU", "WHBU", "OG", "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()
|
||||
|
||||
810
src/wireviz/wv_dataclasses.py
Normal file
@ -0,0 +1,810 @@
|
||||
# -*- 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,
|
||||
PartNumberInfo,
|
||||
QtyMultiplierCable,
|
||||
QtyMultiplierConnector,
|
||||
)
|
||||
from wireviz.wv_colors import (
|
||||
COLOR_CODES,
|
||||
ColorOutputMode,
|
||||
MultiColor,
|
||||
SingleColor,
|
||||
get_color_by_colorcode_index,
|
||||
)
|
||||
from wireviz.wv_utils import aspect_ratio, awg_equiv, mm2_equiv, 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")
|
||||
NumberAndUnit = namedtuple("NumberAndUnit", "number unit")
|
||||
|
||||
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 fill_partnumbers()
|
||||
# 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: NumberAndUnit = NumberAndUnit(1, 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 fill_partnumbers(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)
|
||||
|
||||
def parse_number_and_unit(
|
||||
self,
|
||||
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(float(inp), default_unit)
|
||||
elif isinstance(inp, str):
|
||||
if " " in inp:
|
||||
number, unit = inp.split(" ", 1)
|
||||
else:
|
||||
number, unit = inp, default_unit
|
||||
try:
|
||||
number = float(number)
|
||||
except ValueError:
|
||||
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."
|
||||
)
|
||||
else:
|
||||
return NumberAndUnit(number, unit)
|
||||
|
||||
@property
|
||||
def bom_hash(self) -> BomHash:
|
||||
if self.sum_amounts_in_bom:
|
||||
_hash = BomHash(
|
||||
description=self.description,
|
||||
qty_unit=self.amount.unit if self.amount else None,
|
||||
amount=None,
|
||||
partnumbers=self.partnumbers,
|
||||
)
|
||||
else:
|
||||
_hash = BomHash(
|
||||
description=self.description,
|
||||
qty_unit=self.qty.unit,
|
||||
amount=self.amount,
|
||||
partnumbers=self.partnumbers,
|
||||
)
|
||||
return _hash
|
||||
|
||||
@property
|
||||
def bom_qty(self) -> float:
|
||||
if self.sum_amounts_in_bom:
|
||||
if self.amount:
|
||||
return self.qty.number * self.amount.number
|
||||
else:
|
||||
return self.qty.number
|
||||
else:
|
||||
return self.qty.number
|
||||
|
||||
def bom_amount(self) -> NumberAndUnit:
|
||||
if self.sum_amounts_in_bom:
|
||||
return NumberAndUnit(None, None)
|
||||
else:
|
||||
return self.amount
|
||||
|
||||
|
||||
@dataclass
|
||||
class AdditionalComponent(Component):
|
||||
qty_multiplier: Union[QtyMultiplierConnector, QtyMultiplierCable, int] = 1
|
||||
_qty_multiplier_computed: Union[int, float] = 1
|
||||
designators: Optional[str] = None # used for components definedi in the
|
||||
# additional_bom_items section within another component
|
||||
bgcolor: SingleColor = None # ^ same here
|
||||
|
||||
def __post_init__(self):
|
||||
super().fill_partnumbers()
|
||||
self.bgcolor = SingleColor(self.bgcolor)
|
||||
self.qty = self.parse_number_and_unit(self.qty, None)
|
||||
self.amount = self.parse_number_and_unit(self.amount, None)
|
||||
|
||||
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}")
|
||||
|
||||
@property
|
||||
def additional_components(self):
|
||||
# an additional component may not have further nested additional comonents
|
||||
return []
|
||||
|
||||
@property
|
||||
def bom_qty(self):
|
||||
return self.qty.number * self._qty_multiplier_computed
|
||||
|
||||
@property
|
||||
def description(self) -> str:
|
||||
return f"{self.type}{', ' + self.subtype if self.subtype else ''}"
|
||||
|
||||
|
||||
@dataclass
|
||||
class GraphicalComponent(Component): # abstract class, for future use
|
||||
bgcolor: Optional[SingleColor] = None
|
||||
|
||||
|
||||
@dataclass
|
||||
class TopLevelGraphicalComponent(GraphicalComponent): # abstract class
|
||||
# component properties
|
||||
designator: Designator = None
|
||||
color: Optional[MultiColor] = None
|
||||
image: Optional[Image] = None
|
||||
additional_components: List[AdditionalComponent] = field(default_factory=list)
|
||||
notes: Optional[MultilineHypertext] = None
|
||||
# BOM options
|
||||
add_up_in_bom: Optional[bool] = None
|
||||
# rendering options
|
||||
bgcolor_title: Optional[SingleColor] = None
|
||||
show_name: Optional[bool] = None
|
||||
|
||||
|
||||
@dataclass
|
||||
class Connector(TopLevelGraphicalComponent):
|
||||
# connector-specific properties
|
||||
style: Optional[str] = None
|
||||
category: 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().fill_partnumbers()
|
||||
|
||||
self.bgcolor = SingleColor(self.bgcolor)
|
||||
self.bgcolor_title = SingleColor(self.bgcolor_title)
|
||||
self.color = MultiColor(self.color)
|
||||
|
||||
# connectors do not support custom qty or amount
|
||||
self.qty = NumberAndUnit(1, None)
|
||||
self.amount = 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")
|
||||
|
||||
# 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: check that pins to connect actually exist
|
||||
# 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!")
|
||||
# side=None, determine side to show loops during rendering
|
||||
self.activate_pin(loop[0], side=None, is_connection=True)
|
||||
self.activate_pin(loop[1], 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
|
||||
subitem._qty_multiplier_computed = computed_factor
|
||||
|
||||
|
||||
@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":
|
||||
raise Exception("Do this at the wire level!") # TODO
|
||||
else:
|
||||
return super().bom_hash
|
||||
|
||||
@property
|
||||
def description(self) -> str:
|
||||
if self.category == "bundle":
|
||||
raise Exception("Do this at the wire level!") # TODO
|
||||
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().fill_partnumbers()
|
||||
|
||||
self.bgcolor = SingleColor(self.bgcolor)
|
||||
self.bgcolor_title = SingleColor(self.bgcolor_title)
|
||||
self.color = MultiColor(self.color)
|
||||
|
||||
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 = self.parse_number_and_unit(self.gauge, "mm2")
|
||||
self.length = self.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: [PinClass],
|
||||
via_wire_id: str,
|
||||
to_pin_obj: [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": 999, # 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]
|
||||
# inherit component's length unit if appropriate
|
||||
if subitem.qty_multiplier.name in ["LENGTH", "TOTAL_LENGTH"]:
|
||||
if subitem.qty.unit is not None:
|
||||
raise Exception(
|
||||
f"No unit may be specified when using"
|
||||
f"{subitem.qty_multiplier} as a multiplier"
|
||||
)
|
||||
subitem.qty = NumberAndUnit(subitem.qty.number, self.length.unit)
|
||||
|
||||
elif isinstance(subitem.qty_multiplier, QtyMultiplierConnector):
|
||||
raise Exception("Used a connector multiplier in a cable!")
|
||||
else: # int or float
|
||||
computed_factor = subitem.qty_multiplier
|
||||
subitem._qty_multiplier_computed = computed_factor
|
||||
|
||||
|
||||
@dataclass
|
||||
class MatePin:
|
||||
from_: PinClass
|
||||
to: PinClass
|
||||
arrow: Arrow
|
||||
|
||||
|
||||
@dataclass
|
||||
class MateComponent:
|
||||
from_: str # Designator
|
||||
to: str # Designator
|
||||
arrow: Arrow
|
||||
589
src/wireviz/wv_graphviz.py
Normal file
@ -0,0 +1,589 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import re
|
||||
from typing import Any, List, Optional, 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,
|
||||
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.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 = [html_line_breaks(component.notes)]
|
||||
|
||||
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_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:
|
||||
rows.append(
|
||||
Tr(
|
||||
[
|
||||
Td(bom_bubble(subitem.bom_id)),
|
||||
Td(f"{subitem.bom_qty}", align="right"),
|
||||
Td(
|
||||
f"{subitem.qty.unit if subitem.qty.unit else 'x'}", align="left"
|
||||
),
|
||||
Td(f"{subitem.description}", align="left"),
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
return Table(rows, border=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 that are not 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>
|
||||
rows = Tr(Td(""))
|
||||
tbl = Table(rows, border=0, cellspacing=0, cellpadding=0)
|
||||
return tbl
|
||||
|
||||
|
||||
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(" "))) # 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(" "))) # 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(" "))) # 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) -> (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) -> (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) -> (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:
|
||||
print(
|
||||
"Harness.create_graph() warning: "
|
||||
f"{attr} not found in {keyword}!"
|
||||
)
|
||||
elif n_subs > 1:
|
||||
print(
|
||||
"Harness.create_graph() warning: "
|
||||
f"{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(
|
||||
"Harness.create_graph() warning: "
|
||||
f"{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)
|
||||
@ -1,76 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from typing import List, Optional, Union
|
||||
import re
|
||||
|
||||
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 ""}>')
|
||||
for row in rows:
|
||||
if isinstance(row, List):
|
||||
if len(row) > 0 and any(row):
|
||||
html.append(' <tr><td>')
|
||||
html.append(' <table border="0" cellspacing="0" cellpadding="3" cellborder="1"><tr>')
|
||||
for cell in row:
|
||||
if cell is not None:
|
||||
# Inject attributes to the preceeding <td> tag where needed
|
||||
html.append(f' <td balign="left">{cell}</td>'.replace('><tdX', ''))
|
||||
html.append(' </tr></table>')
|
||||
html.append(' </td></tr>')
|
||||
elif row is not None:
|
||||
html.append(' <tr><td>')
|
||||
html.append(f' {row}')
|
||||
html.append(' </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
|
||||
427
src/wireviz/wv_harness.py
Normal file
@ -0,0 +1,427 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from collections import defaultdict
|
||||
from dataclasses import dataclass, field
|
||||
from pathlib import Path
|
||||
from typing import List
|
||||
|
||||
from graphviz import Graph
|
||||
|
||||
import wireviz.wv_colors
|
||||
from wireviz.wv_bom import BomCategory, bom_list
|
||||
from wireviz.wv_dataclasses import (
|
||||
AUTOGENERATED_PREFIX,
|
||||
AdditionalComponent,
|
||||
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_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[AdditionalComponent] = 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 = AdditionalComponent(**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):
|
||||
# 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.")
|
||||
continue
|
||||
item.bom_id = self.bom[item.bom_hash]["id"]
|
||||
|
||||
# print_bom_table(self.bom) # for debugging
|
||||
|
||||
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":
|
||||
for subitem in item.wire_objects.values():
|
||||
_add(
|
||||
hash=subitem.bom_hash,
|
||||
qty=item.bom_qty, # should be 1
|
||||
designator=item.designator, # inherit from parent item
|
||||
category=cat,
|
||||
)
|
||||
else:
|
||||
_add(
|
||||
hash=item.bom_hash,
|
||||
qty=item.bom_qty,
|
||||
designator=item.designator,
|
||||
category=cat,
|
||||
)
|
||||
if item.additional_components:
|
||||
if item.category == "bundle":
|
||||
pass # TODO
|
||||
item.compute_qty_multipliers()
|
||||
for comp in item.additional_components:
|
||||
if comp.ignore_in_bom:
|
||||
continue
|
||||
_add(
|
||||
hash=comp.bom_hash,
|
||||
designator=item.designator,
|
||||
qty=comp.bom_qty,
|
||||
category=BomCategory.ADDITIONAL_INSIDE,
|
||||
)
|
||||
elif isinstance(item, AdditionalComponent):
|
||||
cat = BomCategory.ADDITIONAL_OUTSIDE
|
||||
_add(
|
||||
hash=item.bom_hash,
|
||||
qty=item.bom_qty,
|
||||
designator=None,
|
||||
category=cat,
|
||||
)
|
||||
else:
|
||||
raise Exception(f"Unknown type of item:\n{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
|
||||
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: (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")
|
||||
@ -1,118 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from typing import List
|
||||
import re
|
||||
|
||||
awg_equiv_table = {
|
||||
'0.09': '28',
|
||||
'0.14': '26',
|
||||
'0.25': '24',
|
||||
'0.34': '22',
|
||||
'0.5': '21',
|
||||
'0.75': '20',
|
||||
'1': '18',
|
||||
'1.5': '16',
|
||||
'2.5': '14',
|
||||
'4': '12',
|
||||
'6': '10',
|
||||
'10': '8',
|
||||
'16': '6',
|
||||
'25': '4',
|
||||
'35': '2',
|
||||
'50': '1',
|
||||
}
|
||||
|
||||
mm2_equiv_table = {v:k for k,v in awg_equiv_table.items()}
|
||||
|
||||
def awg_equiv(mm2):
|
||||
return awg_equiv_table.get(str(mm2), 'Unknown')
|
||||
|
||||
def mm2_equiv(awg):
|
||||
return mm2_equiv_table.get(str(awg), 'Unknown')
|
||||
|
||||
|
||||
def expand(yaml_data):
|
||||
# yaml_data can be:
|
||||
# - a singleton (normally str or int)
|
||||
# - a list of str or int
|
||||
# if str is of the format '#-#', it is treated as a range (inclusive) and expanded
|
||||
output = []
|
||||
if not isinstance(yaml_data, list):
|
||||
yaml_data = [yaml_data]
|
||||
for e in yaml_data:
|
||||
e = str(e)
|
||||
if '-' in e:
|
||||
a, b = e.split('-', 1)
|
||||
try:
|
||||
a = int(a)
|
||||
b = int(b)
|
||||
if a < b:
|
||||
for x in range(a, b + 1):
|
||||
output.append(x) # ascending range
|
||||
elif a > b:
|
||||
for x in range(a, b - 1, -1):
|
||||
output.append(x) # descending range
|
||||
else: # a == b
|
||||
output.append(a) # range of length 1
|
||||
except:
|
||||
output.append(e) # '-' was not a delimiter between two ints, pass e through unchanged
|
||||
else:
|
||||
try:
|
||||
x = int(e) # single int
|
||||
except Exception:
|
||||
x = e # string
|
||||
output.append(x)
|
||||
return output
|
||||
|
||||
|
||||
def int2tuple(inp):
|
||||
if isinstance(inp, tuple):
|
||||
output = inp
|
||||
else:
|
||||
output = (inp,)
|
||||
return output
|
||||
|
||||
|
||||
def flatten2d(inp):
|
||||
return [[str(item) if not isinstance(item, List) else ', '.join(item) for item in row] for row in inp]
|
||||
|
||||
|
||||
def tuplelist2tsv(inp, header=None):
|
||||
output = ''
|
||||
if header is not None:
|
||||
inp.insert(0, header)
|
||||
inp = flatten2d(inp)
|
||||
for row in inp:
|
||||
output = output + '\t'.join(str(remove_links(item)) for item in row) + '\n'
|
||||
return output
|
||||
|
||||
|
||||
def remove_links(inp):
|
||||
return re.sub(r'<[aA] [^>]*>([^<]*)</[aA]>', r'\1', inp) if isinstance(inp, str) else inp
|
||||
|
||||
|
||||
def clean_whitespace(inp):
|
||||
return ' '.join(inp.split()).replace(' ,', ',') if isinstance(inp, str) else inp
|
||||
|
||||
|
||||
def open_file_read(filename):
|
||||
# TODO: Intelligently determine encoding
|
||||
return open(filename, 'r', encoding='UTF-8')
|
||||
|
||||
def open_file_write(filename):
|
||||
return open(filename, 'w', encoding='UTF-8')
|
||||
|
||||
def open_file_append(filename):
|
||||
return open(filename, 'a', encoding='UTF-8')
|
||||
|
||||
def aspect_ratio(image_src):
|
||||
try:
|
||||
from PIL import Image
|
||||
image = Image.open(image_src)
|
||||
if image.width > 0 and image.height > 0:
|
||||
return image.width / image.height
|
||||
print(f'aspect_ratio(): Invalid image size {image.width} x {image.height}')
|
||||
# ModuleNotFoundError and FileNotFoundError are the most expected, but all are handled equally.
|
||||
except Exception as error:
|
||||
print(f'aspect_ratio(): {type(error).__name__}: {error}')
|
||||
return 1 # Assume 1:1 when unable to read actual image size
|
||||
@ -1,54 +1,125 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from pathlib import Path
|
||||
from typing import List, Union
|
||||
import re
|
||||
from collections.abc import Iterable
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Dict
|
||||
|
||||
from wireviz import __version__, APP_NAME, APP_URL, wv_colors
|
||||
from wireviz.DataClasses import Metadata, Options
|
||||
from wireviz.wv_helper import flatten2d, open_file_read, open_file_write
|
||||
indent_count = 1
|
||||
|
||||
def generate_html_output(filename: Union[str, Path], bom_list: List[List[str]], metadata: Metadata, options: Options):
|
||||
with open_file_write(f'{filename}.html') as file:
|
||||
file.write('<!DOCTYPE html>\n')
|
||||
file.write('<html lang="en"><head>\n')
|
||||
file.write(' <meta charset="UTF-8">\n')
|
||||
file.write(f' <meta name="generator" content="{APP_NAME} {__version__} - {APP_URL}">\n')
|
||||
file.write(f' <title>{metadata["title"]}</title>\n')
|
||||
file.write(f'</head><body style="font-family:{options.fontname};background-color:'
|
||||
f'{wv_colors.translate_color(options.bgcolor, "HEX")}">\n')
|
||||
|
||||
file.write(f'<h1>{metadata["title"]}</h1>\n')
|
||||
description = metadata.get('description')
|
||||
if description:
|
||||
file.write(f'<p>{description}</p>\n')
|
||||
file.write('<h2>Diagram</h2>\n')
|
||||
with open_file_read(f'{filename}.svg') as svg:
|
||||
file.write(re.sub(
|
||||
'^<[?]xml [^?>]*[?]>[^<]*<!DOCTYPE [^>]*>',
|
||||
'<!-- XML and DOCTYPE declarations from SVG file removed -->',
|
||||
svg.read(1024), 1))
|
||||
for svgdata in svg:
|
||||
file.write(svgdata)
|
||||
class Attribs(Dict):
|
||||
def __repr__(self):
|
||||
if len(self) == 0:
|
||||
return ""
|
||||
|
||||
file.write('<h2>Bill of Materials</h2>\n')
|
||||
listy = flatten2d(bom_list)
|
||||
file.write('<table style="border:1px solid #000000; font-size: 14pt; border-spacing: 0px">\n')
|
||||
file.write(' <tr>\n')
|
||||
for item in listy[0]:
|
||||
file.write(f' <th style="text-align:left; border:1px solid #000000; padding: 8px">{item}</th>\n')
|
||||
file.write(' </tr>\n')
|
||||
for row in listy[1:]:
|
||||
file.write(' <tr>\n')
|
||||
for i, item in enumerate(row):
|
||||
item_str = item.replace('\u00b2', '²')
|
||||
align = '; text-align:right' if listy[0][i] == 'Qty' else ''
|
||||
file.write(f' <td style="border:1px solid #000000; padding: 4px{align}">{item_str}</td>\n')
|
||||
file.write(' </tr>\n')
|
||||
file.write('</table>\n')
|
||||
html = []
|
||||
for k, v in self.items():
|
||||
if v is not None:
|
||||
html.append(f' {k}="{v}"')
|
||||
# else:
|
||||
# html.append(f" {k}")
|
||||
return "".join(html)
|
||||
|
||||
notes = metadata.get('notes')
|
||||
if notes:
|
||||
file.write(f'<h2>Notes</h2>\n<p>{notes}</p>\n')
|
||||
|
||||
file.write('</body></html>\n')
|
||||
@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:
|
||||
indenter = " " * indent_count
|
||||
return "\n".join(f"{indenter}{line}" for line in lines.split("\n"))
|
||||
|
||||
def get_contents(self, force_flat=False):
|
||||
separator = "" if self.auto_flat or force_flat else "\n"
|
||||
if _is_iterable_not_str(self.contents):
|
||||
return separator.join(
|
||||
[
|
||||
self.indent_lines(str(c), force_flat)
|
||||
for c in self.contents
|
||||
if c is not None
|
||||
]
|
||||
)
|
||||
elif self.contents is None:
|
||||
return ""
|
||||
else: # str, int, float, etc.
|
||||
return self.indent_lines(str(self.contents), force_flat)
|
||||
|
||||
def __repr__(self):
|
||||
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
|
||||
|
||||
|
||||
@dataclass
|
||||
class TagSingleton(Tag):
|
||||
def __init__(self, **kwargs):
|
||||
self.attribs = Attribs({**kwargs})
|
||||
|
||||
def __repr__(self):
|
||||
return f"<{self.tagname}{str(self.attribs)} />"
|
||||
|
||||
|
||||
def _is_iterable_not_str(inp):
|
||||
# str is iterable, but should be treated as not iterable
|
||||
return isinstance(inp, Iterable) and not isinstance(inp, str)
|
||||
|
||||
|
||||
@dataclass
|
||||
class Br(TagSingleton):
|
||||
pass
|
||||
|
||||
|
||||
class Img(TagSingleton):
|
||||
pass
|
||||
|
||||
|
||||
class Td(Tag):
|
||||
pass
|
||||
|
||||
|
||||
class Tr(Tag):
|
||||
pass
|
||||
|
||||
|
||||
class Table(Tag):
|
||||
pass
|
||||
|
||||
165
src/wireviz/wv_output.py
Normal file
@ -0,0 +1,165 @@
|
||||
# -*- 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)
|
||||
183
src/wireviz/wv_utils.py
Normal file
@ -0,0 +1,183 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import re
|
||||
from pathlib import Path
|
||||
from typing import List
|
||||
|
||||
awg_equiv_table = {
|
||||
"0.09": "28",
|
||||
"0.14": "26",
|
||||
"0.25": "24",
|
||||
"0.34": "22",
|
||||
"0.5": "21",
|
||||
"0.75": "20",
|
||||
"1": "18",
|
||||
"1.5": "16",
|
||||
"2.5": "14",
|
||||
"4": "12",
|
||||
"6": "10",
|
||||
"10": "8",
|
||||
"16": "6",
|
||||
"25": "4",
|
||||
"35": "2",
|
||||
"50": "1",
|
||||
}
|
||||
|
||||
mm2_equiv_table = {v: k for k, v in awg_equiv_table.items()}
|
||||
|
||||
|
||||
def awg_equiv(mm2):
|
||||
return awg_equiv_table.get(str(mm2), "Unknown")
|
||||
|
||||
|
||||
def mm2_equiv(awg):
|
||||
return mm2_equiv_table.get(str(awg), "Unknown")
|
||||
|
||||
|
||||
def expand(yaml_data):
|
||||
# yaml_data can be:
|
||||
# - a singleton (normally str or int)
|
||||
# - a list of str or int
|
||||
# if str is of the format '#-#', it is treated as a range (inclusive) and expanded
|
||||
output = []
|
||||
if not isinstance(yaml_data, list):
|
||||
yaml_data = [yaml_data]
|
||||
for e in yaml_data:
|
||||
e = str(e)
|
||||
if "-" in e:
|
||||
a, b = e.split("-", 1)
|
||||
try:
|
||||
a = int(a)
|
||||
b = int(b)
|
||||
if a < b:
|
||||
for x in range(a, b + 1):
|
||||
output.append(x) # ascending range
|
||||
elif a > b:
|
||||
for x in range(a, b - 1, -1):
|
||||
output.append(x) # descending range
|
||||
else: # a == b
|
||||
output.append(a) # range of length 1
|
||||
except:
|
||||
# '-' was not a delimiter between two ints, pass e through unchanged
|
||||
output.append(e)
|
||||
else:
|
||||
try:
|
||||
x = int(e) # single int
|
||||
except Exception:
|
||||
x = e # string
|
||||
output.append(x)
|
||||
return output
|
||||
|
||||
|
||||
def get_single_key_and_value(d: dict):
|
||||
# used for defining a line in a harness' connection set
|
||||
# E.g. for the YAML input `- X1: 1`
|
||||
# this function returns a tuple in the form ("X1", "1")
|
||||
return next(iter(d.items()))
|
||||
|
||||
|
||||
def int2tuple(inp):
|
||||
if isinstance(inp, tuple):
|
||||
output = inp
|
||||
else:
|
||||
output = (inp,)
|
||||
return output
|
||||
|
||||
|
||||
def flatten2d(inp):
|
||||
return [
|
||||
[str(item) if not isinstance(item, List) else ", ".join(item) for item in row]
|
||||
for row in inp
|
||||
]
|
||||
|
||||
|
||||
def bom2tsv(inp, header=None):
|
||||
output = ""
|
||||
if header is not None:
|
||||
inp.insert(0, header)
|
||||
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"
|
||||
return output
|
||||
|
||||
|
||||
def html_line_breaks(inp):
|
||||
return remove_links(inp).replace("\n", "<br />") if isinstance(inp, str) else inp
|
||||
|
||||
|
||||
def remove_links(inp):
|
||||
return (
|
||||
re.sub(r"<[aA] [^>]*>([^<]*)</[aA]>", r"\1", inp)
|
||||
if isinstance(inp, str)
|
||||
else inp
|
||||
)
|
||||
|
||||
|
||||
def clean_whitespace(inp):
|
||||
return " ".join(inp.split()).replace(" ,", ",") if isinstance(inp, str) else inp
|
||||
|
||||
|
||||
def open_file_read(filename):
|
||||
# TODO: Intelligently determine encoding
|
||||
return open(filename, "r", encoding="UTF-8")
|
||||
|
||||
|
||||
def open_file_write(filename):
|
||||
return open(filename, "w", encoding="UTF-8")
|
||||
|
||||
|
||||
def open_file_append(filename):
|
||||
return open(filename, "a", encoding="UTF-8")
|
||||
|
||||
|
||||
def is_arrow(inp):
|
||||
"""
|
||||
Matches strings of one or multiple `-` or `=` (but not mixed)
|
||||
optionally starting with `<` and/or ending with `>`.
|
||||
|
||||
Examples:
|
||||
<-, --, ->, <->
|
||||
<==, ==, ==>, <=>
|
||||
"""
|
||||
# regex by @shiraneyo
|
||||
return bool(
|
||||
re.match(r"^\s*(?P<leftHead><?)(?P<body>-+|=+)(?P<rightHead>>?)\s*$", inp)
|
||||
)
|
||||
|
||||
|
||||
def aspect_ratio(image_src):
|
||||
try:
|
||||
from PIL import Image
|
||||
|
||||
image = Image.open(image_src)
|
||||
if image.width > 0 and image.height > 0:
|
||||
return image.width / image.height
|
||||
print(f"aspect_ratio(): Invalid image size {image.width} x {image.height}")
|
||||
# ModuleNotFoundError and FileNotFoundError are the most expected, but all are handled equally.
|
||||
except Exception as error:
|
||||
print(f"aspect_ratio(): {type(error).__name__}: {error}")
|
||||
return 1 # Assume 1:1 when unable to read actual image size
|
||||
|
||||
|
||||
def smart_file_resolve(filename: str, possible_paths: (str, List[str])) -> Path:
|
||||
if not isinstance(possible_paths, List):
|
||||
possible_paths = [possible_paths]
|
||||
filename = Path(filename)
|
||||
if filename.is_absolute():
|
||||
if filename.exists():
|
||||
return filename
|
||||
else:
|
||||
raise Exception(f"{filename} does not exist.")
|
||||
else: # search all possible paths in decreasing order of precedence
|
||||
possible_paths = [
|
||||
Path(path).resolve() for path in possible_paths if path is not None
|
||||
]
|
||||
for possible_path in possible_paths:
|
||||
resolved_path = (possible_path / filename).resolve()
|
||||
if resolved_path.exists():
|
||||
return resolved_path
|
||||
else:
|
||||
raise Exception(
|
||||
f"{filename} was not found in any of the following locations: \n"
|
||||
+ "\n".join([str(x) for x in possible_paths])
|
||||
)
|
||||
8
tests/.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
*.gv
|
||||
*.html
|
||||
*.png
|
||||
*.svg
|
||||
*.tsv
|
||||
*.csv
|
||||
*.html
|
||||
*.pdf
|
||||
65
tests/bom/bomqty.yml
Normal file
@ -0,0 +1,65 @@
|
||||
connectors:
|
||||
X1:
|
||||
type: No additional components
|
||||
pincount: 6
|
||||
|
||||
X2:
|
||||
type: Contains additional components
|
||||
pincount: 6
|
||||
additional_components:
|
||||
-
|
||||
type: One, no unit
|
||||
-
|
||||
type: Two kilometers
|
||||
qty: 2 km
|
||||
-
|
||||
type: Takes pincount times seven
|
||||
qty: 7
|
||||
qty_multiplier: pincount
|
||||
-
|
||||
type: Takes 10 mm per populated pin
|
||||
qty: 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
|
||||
qty: 3 cm
|
||||
-
|
||||
type: Takes wirecount times two
|
||||
qty: 2
|
||||
qty_multiplier: wirecount
|
||||
-
|
||||
type: Takes length times three
|
||||
qty: 3 # adding unit here should cause error because the length already has a unit
|
||||
qty_multiplier: length
|
||||
-
|
||||
type: Takes total length times three
|
||||
qty: 2 # adding unit 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]
|
||||
26
tests/rendering/00_minimal.yml
Normal 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.
|
||||
32
tests/rendering/01_color_single.yml
Normal 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.
|
||||
35
tests/rendering/02_color_multi.yml
Normal 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.
|
||||