Open tobiasfalk opened 3 months ago
So the wertical lines also work:
they work by the following:
edge [color="#000000" headclip=false, tailclip=false, style="dashed", constraint=false]
X2:p3J:c -- X2:p4J:c[straight=true]
edge [color="#0066ff" headclip=false, tailclip=false, style="dashed", constraint=false]
X2:p1J:c -- X2:p5J:c[straight=true]
X2:p5J:c -- X2:p9J:c[straight=true]
edge [color="#000000" headclip=false, tailclip=false, style="dashed", constraint=false]
X2:p2J:c -- X2:p6J:c[straight=true]
headclip=false
& tailclip=false
to make the lince start and stop in the center of the "port"/circlestyle="dashed"
to make the line dashed(duh)constraint=false
just to prevent any problems with ranking, do not know if it realy is needed but better safe than sorry[straight=true]
adds the atribute straight
to a line, this is later needed by gvpr to straiten out all the lines that have this attribut, setting it false does nothing so maybe doing it by [straight=straight]
would be betterfor this one needs to create a "filter"/process file(do not know the thermology) with the following in it(pin2pin.gvpr
):
/*******************************************************************
see https://forum.graphviz.org/t/straitening-one-line-throu-a-table/2196
input must include pos values (must be output from one of the engines w/ -Tdot)
*******************************************************************/
BEG_G{
string tok[int];
int cnt;
/***************************************
$G.bb="";
$G.nodesep="";
$G.ranksep="";
$G.splines="true";
****************************************/
}
/********************************************************
the weakness is in the head==tail test
it would be better to mark every target edge with a new attribute and test for that attribute
*********************************************************/
E[$.head==$.tail] {
cnt=tokens($.pos,tok," ");
$.oldpos=$.pos;
pos=tok[0]+" " + tok[0]+" "+tok[cnt-1]+" "+tok[cnt-1];
$.label=""; // remove pesky label
$.lp=""; // remove peskier label pos
}
this is some magic I do not understand but I think it removes all the cureved point in a line that has the attribute straight
.
this is done by the folloing Comand: dot .\test.gv | gvpr -cf pin2pin.gvpr | neato -n2 -Tpng -o file.png
dot .\test.gv
your typical dot comandgvpr -cf pin2pin.gvpr
takes the output of the dot comand and process it with the pin2pin.gvpr
fileneato -n2 -Tpng -o file.png
takes the output of gvpr and converts it in to the wished output format (in this case png)As mentioned I do not know how to Implement this in python but it works manualy at least.
the input gb file:
graph {
// Graph generated by WireViz 0.3.2
// 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 label=" "]
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">P1</td>
<td balign="left">9-pin</td>
</tr></table>
</td></tr>
<tr><td>
<table border="0" cellspacing="0" cellpadding="3" cellborder="1">
<tr>
<td port="p1l">1</td>
<td>+28VDC</td>
<td></td>
<td port="p1J"><FONT FACE="Sans Not-Rotated 14" POINT-SIZE="13.0" COLOR="#0066ff">⬤</FONT></td>
<td></td>
</tr>
<tr>
<td port="p2l">2</td>
<td>+28VDC RTN</td>
<td></td>
<td></td>
<td port="p2J"><FONT FACE="Sans Not-Rotated 14" POINT-SIZE="13.0">⬤</FONT></td>
</tr>
<tr>
<td port="p3l">3</td>
<td>Token-In REF</td>
<td port="p3J"><FONT FACE="Sans Not-Rotated 14" POINT-SIZE="13.0">⬤</FONT></td>
<td></td>
<td></td>
</tr>
<tr>
<td port="p4l">4</td>
<td>Token-In</td>
<td port="p4J"><FONT FACE="Sans Not-Rotated 14" POINT-SIZE="13.0">⬤</FONT></td>
<td></td>
<td></td>
</tr>
<tr>
<td port="p5l">5</td>
<td>NC</td>
<td></td>
<td port="p5J"><FONT FACE="Sans Not-Rotated 14" POINT-SIZE="13.0" COLOR="#0066ff">⬤</FONT></td>
<td></td>
</tr>
<tr>
<td port="p6l">6</td>
<td>NC</td>
<td></td>
<td></td>
<td port="p6J"><FONT FACE="Sans Not-Rotated 14" POINT-SIZE="13.0">⬤</FONT></td>
</tr>
<tr>
<td port="p7l">7</td>
<td>RS-485+</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td port="p8l">8</td>
<td>RS-485-</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td port="p9l">9</td>
<td>RS-485 Shield</td>
<td></td>
<td port="p9J"><FONT FACE="Sans Not-Rotated 14" POINT-SIZE="13.0" COLOR="#0066ff">⬤</FONT></td>
<td></td>
</tr>
</table>
</td></tr>
</table>
> fillcolor="#FFFFFF" shape=box style=filled]
edge [color="#000000:#ff0000:#000000" label=" "]
W1:w1:e -- X2:p1l:w
edge [color="#000000:#000000:#000000" label=" "]
W1:w2:e -- X2:p2l:w
edge [color="#000000:#f5f0d0:#000000" label=" "]
W1:w3:e -- X2:p7l:w
edge [color="#000000:#0066ff:#000000" label=" "]
W1:w4:e -- X2:p8l:w
edge [color="#000000:#00ff00:#000000" label=" "]
W1:w5:e -- X2:p9l:w
edge [color="#000000" headclip=false, tailclip=false, style="dashed", constraint=false]
X2:p3J:c -- X2:p4J:c[straight=true]
edge [color="#0066ff" headclip=false, tailclip=false, style="dashed", constraint=false]
X2:p1J:c -- X2:p5J:c[straight=true]
X2:p5J:c -- X2:p9J:c[straight=true]
edge [color="#000000" headclip=false, tailclip=false, style="dashed", constraint=false]
X2:p2J:c -- X2:p6J:c[straight=true]
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">5x</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:RD
</td>
<td>X2:1:+28VDC</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>
2:BK
</td>
<td>X2:2:+28VDC RTN</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>
3:IV
</td>
<td>X2:7:RS-485+</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="#f5f0d0" 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:BU
</td>
<td>X2:8:RS-485-</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="#0066ff" border="0"></td></tr>
<tr><td colspan="3" cellpadding="0" height="2" bgcolor="#000000" border="0"></td></tr>
</table>
</td>
</tr>
<tr>
<td><!-- 5_in --></td>
<td>
5:GN
</td>
<td>X2:9:RS-485 Shield</td>
</tr>
<tr>
<td colspan="3" border="0" cellspacing="0" cellpadding="0" port="w5" 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]
}
I'm curious - when do you need to specify font face, point-size, and color? Is it for neato
only? It seems to work without in my simple test to PNG with dot - not adding your filter commands.
I'm curious - when do you need to specify font face, point-size, and color? Is it for
neato
only? It seems to work without in my simple test to PNG with dot - not adding your filter commands.
When I not specified the Font and point size the bloke circle was cut of at the bottom. The color would be if one wants to habe the different jumpers in different colors, I would leave the standard black, this was just for when the feature is needed/requested/wanted I am not at home but when I am, I will send a picture
The first (Pin 3) is <FONT FACE="Sans Not-Rotated 14" POINT-SIZE="13.0">⬤</FONT>
The second (Pin 4) is <FONT>⬤</FONT>
The third (Pin 5) is ><FONT FACE="Sans Not-Rotated 14">⬤</FONT>
Done with dot .\test.gv | gvpr -cf pin2pin.gvpr | neato -n2 -Tpng -o file.png
Ok, the FACE="Sans Not-Rotated 14"
can be changed to FACE="Sans"
One problem that exist, is that the Text in a Table in SVGs is not completely centered. For more details read here: https://forum.graphviz.org/t/text-in-table-in-svg-output-not-completly-centered/2199
Updated the code of pin2pin.gvpr
above, to prevent creation of white/not used space
Very new user of WireViz, and I already love it. This is exactly one big thing I miss at the moment too, so +1 from me <3
The very ongoing documentation happens https://github.com/vaasahacklab/gatekeeper/tree/new_hardware_docs/docs and indeed all the current "jumpers" would be really jumpers, so this would be so spot on :)
@olmari - Be aware that both #286 and #48 might be worth visiting. Please try the work-around I suggested in https://github.com/wireviz/WireViz/issues/286#issuecomment-2094309143 that might help you while waiting for better solutions.
@tobiasfalk - I'm grateful and impressed by your effort with this issue, and obtaining a great result in such a short time!
I'm sorry that I have not yet had time to play with your solutions. I help maintaining this on my spare time (which in some periods is very limited), and have lately given priority to all the bugs after releasing v0.4.
I didn't want to give you any critical comments in your creative process, because the work you have done here is highly valuable for this project - also beyond this issue. I guess #3, #120, #330, and maybe others can benefit from your work on post processing the dot output.
However, now when you have a complete solution, I must mention a small concern I have about the dashed lines. During my work on #330, I realized dashed lines are used a lot for shielding in the relevant IEEE and IEC standards, and I wonder if a solid line would be better for your straight jumpers - maybe a bit thicker than the table border lines? I know it's simple to implement such a change, but can you first find references to how such jumpers are drawn in other diagrams, so we can compare this to any established practice?
However, now when you have a complete solution, I must mention a small concern I have about the dashed lines. During my work on #330, I realized dashed lines are used a lot for shielding in the relevant IEEE and IEC standards, and I wonder if a solid line would be better for your straight jumpers - maybe a bit thicker than the table border lines?
I understand, I will compile some examples with different line styles and post them here.
I know it's simple to implement such a change, but can you first find references to how such jumpers are drawn in other diagrams, so we can compare this to any established practice?
I have done this at the beginning but also just now I did a short search again, and did not find any reference to Jumpers/Interconnects/Shorting pins in the IEEE/IEC/ISO standards, but it could be that I am just not searching with the right terms.
Solid Bold seams quite good
Solid Bold seams quite good
I agree, and it's also a good fit to https://github.com/wireviz/WireViz/issues/48#issuecomment-656802355, but I hope we also can get opinions from several others before deciding. We are not in hurry.
Some details that have not been discussed in this issue yet are:
internal_shorts
and external_shorts
were suggested in #48, and the latter ended up as loops
. Should we still keep internal_shorts
for this new feature? Or is e.g. shorts
precise enough? If internal short is an established term, then we should keep it, I guess.populated
? I guess so, but please argue for use cases when that could be wrong. It depends on whether we count at the mating end or at the wire terminal end of the connector. If both can be useful in different use cases, then we might perhaps add the new multipliers connected
and unconnected
for the wire terminal count?
- About the YAML input syntax: I know that
internal_shorts
andexternal_shorts
were suggested in #48, and the latter ended up asloops
. Should we still keepinternal_shorts
for this new feature? Or is e.g.shorts
precise enough? If internal short is an established term, then we should keep it, I guess.
I think the "internal" emphasis that this short/connection is inside the Connector housing and not a wire loop that may go outside and than back in again.
One thing that could be done are synonyms. For the internal_shorts
, shorts
and for loops
, external_shorts
.
- Should unconnected pins (no external wire connected) with an internal short count as
populated
? I guess so, but please argue for use cases when that could be wrong.
I agree.
@tobiasfalk wrote:
[...] I think the "internal" emphasis that this short/connection is inside the Connector housing and not a wire loop that may go outside and than back in again. One thing that could be done are synonyms. For the
internal_shorts
,shorts
and forloops
,external_shorts
.
It makes sense, but such synonyms deserves a separate issue (there might be more synonym candidates, e.g. in #331).
Are internal shorts always short wires inside the connector housing, or does it also exist connectors with optional shorts integrated?
When the shorts need wires, they also should be counted in the BOM, but then we need more information than their colors. See also https://github.com/wireviz/WireViz/pull/288#issuecomment-1559722149 where I suggest the same for loops
. Maybe we need a common solution for shorts and loops to enable their BOM entries?
- Should unconnected pins (no external wire connected) with an internal short count as
populated
? I guess so, but please argue for use cases when that could be wrong.I agree.
See also the latest update of my question with a follow-up that I wrote before my browser detected your answer.
@kvid yes I think we should most likely decide for either loops or shorts, since they are practically the same. Personally I like this representation more, since it does not interveres with any wires and for me connected pins are something that is part of the connector and not of wires.
As for representation of options/description for a short, I would just add a row directly under the jumpers and in the colom of the jumper, text is added that describes the jumper. The color was more of a thought to make a differentiation on the drawing easier and less to describe the collor of the actual jumper(physically).
AFAIK sometimes there are literal loops for connectors that can't have literal jumpers, so as concepts they're different... Both have place and should exists as general thing..
I think the "internal" emphasis that this short/connection is inside the Connector housing and not a wire loop that may go outside and than back in again.
Yep!
Should unconnected pins (no external wire connected) with an internal short count as populated? I guess so, but please argue for use cases when that could be wrong.
I'd "vote" for not populated, as "shortcut jumpers" are specific to.. hmm.. how to describe it best... kind of self-explanatory already here described as internal to connection blocks, so no wires are attached to them at any point alone... AFAIK even with my old job as building these things, shortcut blocks were never treated as "external" not "populated" in context of wiring connections...
ADD/EDIT: (current way of) loop is populated, as it reserves an spot from connector wiring spot, internal jumper is not populated, as it does not cater to wiring itself, and no wire can change is there jumper block or not.
The problem with shorts in the BOM is that it highly depends on the connector, one connector can only be shorted with a with short wires that goes directly from one pin to the next(maybe even blanknwires), like good old DB9 or DB25 connector(most of them at least). Than there are those where the manufacturer provides way of shorting. And lastly there are Crimp connectors, where with most of them you need to do a wire loop and can not realy short pins "inside" the connector housing.
One way could be to provide it as a option for the Connector to say that part XY is as often needed as shorts. I also have no Problem with a more complicated short syntax where one can define with the short what is on the BOM, if it is a peace of wire or something else. And than wire vice counts these.
X1:
shorts:
-Sh1:
pins:[1,5,7]
color: PK
manufacturerPn: 42A5Z42
description: 3 pin Short over 5 pins, name of the part
-Sh2:
pins:[2,8,10]
color:GR
wireLength: 10mm
description: some additional information for the BOM
These are generally what I think of shorts in this context https://www.starelec.fi/product_info.php?products_id=32067, these yellow things... While there can be all sorts of things in random connector to make similar thing happen, the gist is that if it is "internal" like in my example, it should not count as populated, if it does occupy an place for wire to go, it should be populated... aka as loop does at the very moment...
Rest is semantics and can be described already in wireviz "language"...
EDIT: I mean sure if we can have sane method of describing BOM-wise an jumpshort connector, okay fine, but we already can aslo describe additional parts etc... So adding specific internal jumper block to BOM isn't exactly new issue
Deciding whether shorts should count as populated
or not is not a philosophical question. The populated
multiplier is e.g. used as the number of crimps or pins (at the mating side) to include as additional components, but maybe also as the number of heat shrink pieces (at the wire terminal side). The unpopulated
multiplier is e.g. used as the number of seals for a watertight connector (probably at the mating side, but maybe there exist connectors with separate seals at the wire side too?) Maybe we need separate multipliers for the wire terminal side and the mating side, like I suggested above in https://github.com/wireviz/WireViz/issues/350#issuecomment-2143813935, so the user can select which multiplier that fits best with each use case?
@kvid mm... I see what you do say... All I can say for my "stance" is that what I linked in previous message is the thing... That thing does not happen on either side of where wires or (physical) connector mates into, it is specific within the connector or connector bloc, neither side of wiring nor possible mating is in consideration...
...Again I'm not specifically against if user can describe the internal short any way possible, would always be more flexible that way, just describing the thoughtprocess of why we generally even consider separate things for "loops" and "shorts" and their core meaning...
@olmari wrote:
@kvid mm... I see what you do say... All I can say for my "stance" is that what I linked in previous message is the thing... That thing does not happen on either side of where wires or (physical) connector mates into, it is specific within the connector or connector bloc, neither side of wiring nor possible mating is in consideration...
Maybe the term mating side doesn't fit very well with your connection block, but I still believe the functionality I suggest will fit your use case as well:
populated
= count of pins with wire connection, loop, or short (count at mating side of mating connectors).connected
= count of pins with wire connection or loop (count at wire terminal side).Your connection block doesn't have a mating side, only a wire terminal side, so using the connected
multiplier should fit your use case, but please prove me wrong. WireViz is used for a huge number of different use cases with different types of connectors, so I try to use a generic terminology, but please suggest alternative terms.
@kvid now with your explanation 'populated' makes even more sense for shorts, since they require a Pin in the connector and not a plug or something else.
Mm... I don't have exact suggestion to exact terms to use. Nor I kind of even care in the ultimate picture. All I really care is the thought process of what I had for "short" or "jumper", and how it was described in this issue originally (or as I understood it in the premise of what I personally need).
@kvid that explanation or difference of populated vs connected does make sense when you put it like that... :)
My suggestion of populated
and connected
counting doesn't fit well with the term used for the hide_disconnected_pins
option, so we might need a general discussion about terminology and create definitions to use consistently in our application. Then we probably also should include the #331 suggestions.
This gives me the question, do we change things so that the user needs to rewrite its yaml file with a version updated? Since I would propose to remove the loop parameter and replace it with this short displaying.
In the broad context in any and all types of connections / connectors, I tend to think that short / jumper is internal to any connector, whereas loop is.. well.. exactly what it is now...
@tobiasfalk loop and short is not the same... or... loop is "always" wire connecting between two points in connector wire connections, whereas short/jumper is internal to connector in any sense of wiring... Sure there are N+1 types of connectors, but they all can have between 0 + infinity amount of both loops and shorts as concept.
Did some work on #369 , where I changed the syntax to alowe more options for the shorts
@kvid I did some work on #369, like giving it a better syntax and having short types, like the "internal" that is proposed here and loop what practically does what already exists (it does not replace not the loops) but with "more" fetures
@kvid
The way you want to combine internal shorts and loops, might also need a discussion in https://github.com/wireviz/WireViz/issues/350 because I fear it will be too complicated for the simplest use cases.
I do not think so, since this is an option that can be set by the user and is entirely optional. The standard behavior is how I proposed here and if the used sets it to 'type: loop' than the short is not drawn like it is here but the same way the loops are.
in #286 I suggested a way to implement Jumpers/Interconnects, this is a summery/spinoff on the request of @kvid.
The Idea how it could look (very similar to https://github.com/wireviz/WireViz/issues/48#issuecomment-656802355):![test_edited](https://github.com/wireviz/WireViz/assets/56540480/c711e474-3486-4429-bdbd-ae29c68363c8)
Black Circles ⬤
The Black circles can be implemented by adding the following to the table in the corresponding Pin/Way row:
(not very good, since the symbol can get "lost" in the process) or
The later one(
⬤
) is better sinze it cases less problems.Doing this will lead to the following:![test_gv](https://github.com/wireviz/WireViz/assets/56540480/fedc5033-cd32-4cb2-a82e-e10e3715d5e0)
Vertical dashed lines
This is more complicated and would require a change in how the output is generated, and I do not know how to implement this in Python. The way I was told to do it(asked about it in the GrapghViz Forum ) would require the use of gvpr and neato, with are post processors for the dot output. I is currently not working, but I am working on it. Some examples of my current Output:![test_gv](https://github.com/wireviz/WireViz/assets/56540480/0c5b5924-0deb-4ce6-863f-ad9126ef0cf4)