2017-10-31 7 views
1

GraphViz을 사용하여 일부 실제 문서를 내부 위키로 마이그레이션하려고합니다.GraphViz의 위치 및 화살표 방향

나는 도트 언어로 사용하고, 도움을 필요로하고 있지 않다

다음 예를 참조하십시오 :

Example of graph

나는 많은 실험이 있지만 가장 내가 지금까지 온을 여기까지입니다 : Resulting GraphViz

digraph CentralPmr { 
    fontname="Helvetica"; 
    shape=box; 
    node[shape=box]; 
    graph [splines=ortho] 

    sg [label="TTD storage group for\nthe logged values"] 
    vc [label="Value catalogue"] 
    tc1 [label="Time catalogoue (1)"] 
    tc2 [label="Time catalogoue (2)"] 
    sv_ [shape=point,width=0.01,height=0.01]; 
    sv [label=""] 
    ie [shape=none, label="Initiating event"] 
    c1 [shape=none, label="The set of values, defined\nby the value catalogue, which\nare freezed out of the TTD\nstorage group of the actual log."] 
    c2 [shape=none, label="Time catalogue defining\nat what time around the\ninitiating event values\nshould be collected."] 
    sgf [shape=record, label="{<f0> 1|2|3|4|..}|{ | | | | }"] 

    sg -> sv_ [penwidth=4, dir=none]; 
    sv_ -> sv -> tc2 [penwidth=4] 
    sv -> sgf:f0 [penwidth=4] 
    {vc, tc1} -> sg 
    c1 -> sv [style=dashed, arrowhead="open"]; 

    {rank=min; ie} 
    {rank=same; sg c1} 
    {rank=same; vc sgf} 
    {rank=max; rc2} 
} 

것은 그것은 원본과 정확히 일치 할 필요는 없습니다,하지만 난 WA 이해할 수 있도록.

문제점은 다음과 같습니다

  1. 어떻게 "값 목록"과 "시간 카탈로그 (1)"사이에있는 텍스트를 배치합니까?
  2. [편집] "PMR 고정 값을위한 TTD 저장소 그룹"에 화살표를 위 쪽이 아닌 옆쪽에서 이동하려면 어떻게해야합니까? 메모리 영역의 가상화이며 화살표는 특정 메모리 게시물을 가리 킵니다. 다른 이미지에서는 메모리 영역의 다른 메모리 포스트 (예 : 2, 3, 4 ..)를 가리킬 수 있습니다.
  3. "시작 이벤트"에서 지그재그 선을 만들 수 있습니까?
  4. 다른 유형의 선을 설명하는 범례를 아래쪽에 어떻게 배치합니까?
  5. [편집] 위의 "PMR 고정 값을위한 TTD 저장소 그룹"의 오른쪽 및 아래에 주석을 어떻게 추가합니까?
  6. [편집] "PMR 고정 값을위한 TTD 저장소 그룹"을 더 넓게 만들려면 어떻게해야합니까?

답변

2

를 얻을 수 있습니다. 나는 귀하의 모든 요구 사항을 고려하도록 노력했으며, 귀하가 splines=ortho 요구 사항을 포기할 때만 작동합니다 (나는 믿습니다). Pls 내 첫 번째 대답 아래의 의견을 참조하십시오. 여기에 우리가 간다 :

digraph CentralPmr { 
    fontname="Helvetica"; 
    shape=box; 
    node[shape=box]; 
    // graph [splines=ortho] 

    sg [label="TTD storage group for\nthe logged values", width = 2.5] 
    sv[ label="", width = 2] 
    ie [ shape=none, label="Initiating event", fontsize = 18 ] 
    c1 [ shape=none, label="The set of values, defined\nby the value catalogue, which\nare freezed out of the TTD\nstorage group of the actual log." ] 

    sgf[shape=box, margin=0, label=< 
    <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4"> 
     <TR> 
      <TD BORDER="0" COLSPAN="2">TTD storage group for<BR/>PMR freezed values</TD> 
     </TR> 
     <TR> 
      <TD PORT="f1">1</TD> 
      <TD BORDER="0" ROWSPAN="6">The set of<BR/>values is<BR/>stored in<BR/>the TTD<BR/>storage<BR/>group</TD> 
     </TR> 
     <TR> 
      <TD>2</TD> 
     </TR> 
       <TR> 
      <TD>3</TD> 
     </TR> 
       <TR> 
      <TD>4</TD> 
     </TR> 
       <TR> 
      <TD>-</TD> 
     </TR> 
     <TR> 
      <TD>-</TD> 
     </TR> 
     <TR> 
      <TD BORDER="0" COLSPAN="2">Up to nine freezing areas<BR/>for defined central PMR</TD> 
     </TR> 
    </TABLE>>]; 

    TTD [shape=none, margin=0, label=< 
    <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="12"> 
     <TR> 
      <TD PORT="f1">Value catalogue</TD> 
     </TR> 
     <TR> 
      <TD BORDER="0"></TD> 
     </TR> 
     <TR> 
      <TD PORT="f2">Time catalogue (1)</TD> 
     </TR> 
     <TR> 
      <TD BORDER="0">Time catalogue defining<BR/>at what time around the<BR/>initiating event values<BR/>should be collected</TD> 
     </TR> 
     <TR> 
      <TD PORT="f3">Time catalogue (2)</TD> 
     </TR> 
    </TABLE>>]; 


    connector_1[ shape = point height = 0 width = 0 margin = 0 ] 
    ie -> connector_1[ style = dotted, arrowhead = none ]; 
    { rank = same; connector_1 c1 } 
    connector_1 -> c1[ style = invis, minlen = 4 ]; 
    c1 -> sv[ style = dashed, arrowhead = open ]; 
    connector_2[ shape = point height = 0 width = 0 margin = 0 ] 
    connector_1 -> connector_2[ style = dotted ]; 
    { rank = same; sg connector_2 sv } 
    sg -> connector_2[ minlen = 3, penwidth = 4, arrowhead = none ]; 
    connector_2 -> sv[ minlen = 3, penwidth = 4 ]; 

    sg:sw -> TTD:f1:nw[ weight = 5 ]; 
    sg:w -> TTD:f2:w; 
    sv:sw -> TTD:f3:e[ penwidth = 4 ]; 
    sv:sw -> sgf:f1:w[ penwidth = 4 ]; 

    node[ shape = plaintext ]; 
    leg2[ label = "Data flow" ]; 
    leg4[ label = "Reference" ]; 
    leg6[ label = "Comment" ]; 

    node [ shape = point height = 0 width = 0 margin = 0 ]; 
    leg1 leg3 leg5 

    TTD:sw -> leg1[ style = invis ]; 

    { rank = same; leg1 leg2 leg3 leg4 leg5 leg6 } 
    edge[ minlen = 2 ]; 
    leg1 -> leg2[ penwidth = 4 ]; 
    leg3 -> leg4[ style = dotted ]; 
    leg5 -> leg6[ style = dashed, arrowhead = open ]; 
} 

enter image description here

+0

당신이 내려 놓은 직업에 정말 감사드립니다. 내가 예상했던 것보다 훨씬 더 훌륭하고 멋져 보인다. 이제 나머지 문서를 디지털화해야 할 필요가 있다고 생각합니다. 고맙습니다. – magol

+1

행운을 빈다, 도와 드리겠습니다! – vaettchen

+1

물건이 더 있으면 처리 도구가 마음에 든다. 전처리기로 m4를 사용하면 원본 파일을 작고 깨끗하게 유지할 수 있습니다. 보십시오 [여기] (https://github.com/vaettchen/m4gv). – vaettchen

1

내가 원하는 것을 완전히 이해하고 있는지는 모르지만 내 취해야 할 조치는 확실하지 않습니다. 이것은 단지 첫 번째 시도이며 훨씬 더 미세한 튜닝이 가능합니다. 텍스트와 "상자"가 더 가까워 야 할 필요가있는 HTML과 같은 노드를 사용할 것입니다. 특히 원본 그래프에서 "PMR 고정 값을위한 TTD 저장소 그룹"에 더 가깝습니다. 질문에 대한

내 대답은 다음과 같습니다 나는 "값 목록"과 "시간 카탈로그 (1)"사이의 텍스트를 어떻게

?

--- 아래를 참조하십시오. 원래 그래프처럼 두 개의 시간 카탈로그 사이에 놓았지만 쉽게 움직일 수 있습니다.

화살표를 레코드쪽으로 강제로 이동하려면 어떻게해야합니까?

--- 아래를 참조하십시오. 귀하의 질문 인 경우 rankdir = LR;을 사용하여 오리엔테이션을 변경할 수도 있습니다.

"시작 이벤트"에서 지그재그 라인을 만들 수 있습니까?

--- 방법은 있지만 맞춤 모양 만들기와 같은 많은 노력이 필요합니다.내 지식을 최대한 활용하여 "즉시 사용할 수있는"것은 아닙니다.

어떻게하면 아래쪽에 범례를 배치 할 수 있습니까?

나는 정말로 이해하지 못하지만 일반적으로 노드에 관해 말할 때 HTML과 비슷한 레이블이 사용됩니다.

그녀는 내가 무엇을했는지 있습니다 :

digraph CentralPmr 
{ 
    fontname="Helvetica"; 
    shape=box; 
    node[shape=box]; 
    graph [splines=ortho] 

    sg [label="TTD storage group for\nthe logged values"] 
    vc [label="Value catalogue"] 
    tc1 [label="Time catalogoue (1)"] 
    tc2 [label="Time catalogoue (2)"] 
    sv_ [shape=point,width=0.01,height=0.01]; 
    sv [label="", width = 2] 
    ie [shape=none, label="Initiating event"] 
    c1 [shape=none, label="The set of values, defined\nby the value catalogue, which\nare freezed out of the TTD\nstorage group of the actual log."] 
    c2 [shape=none, label="Time catalogue defining\nat what time around the\ninitiating event values\nshould be collected."] 
    sgf [shape=record, label="{<f0> 1|2|3|4|..}|{ | | | | }"] 

    connector_1[ shape = point height = 0 width = 0 margin = 0 ] 
    ie -> connector_1[ style = dotted, arrowhead = none ]; 
    { rank = same; connector_1 c1 } 
    connector_1 -> c1[ style = invis ]; 
    c1 -> sv[ style = dashed, arrowhead = open ]; 
    connector_2[ shape = point height = 0 width = 0 margin = 0 ] 
    connector_1 -> connector_2[ style = dotted ]; 
    { rank = same; sg connector_2 sv } 
    sg -> connector_2[ minlen = 3, penwidth = 4, arrowhead = none ]; 
    connector_2 -> sv[ minlen = 3, penwidth = 4 ]; 

    vc -> tc1 -> c2 -> tc2[ style = invis, weight = 10 ]; 
    sg -> vc; 
    sg -> tc1; 
    sv -> tc2[ penwidth = 4 ]; 
    sv -> sgf; 
} 

이 편집 한 너무 많은 혼란을 만들 것이라고 방식으로 내 첫 번째 대답의 상단에

enter image description here

+0

오 대단히 감사합니다 얻을 수 있습니다. 내 시도에 비해 크게 개선되었습니다. * 두 번째 질문에서 다소 불분명했습니다. 지금 내가 더 분명하게 만들었 으면합니다. * "가치 카탈로그", "시간 카탈로그 1/2"및 댓글을 서로 더 가깝게 만들 수 있습니까? * "PMR없는 값을위한 TTD 저장소 그룹"주위의 텍스트가 없습니다 (원래 질문에 추가되었습니다). * 전설에서 다른 행의 의미를 설명하는 의미입니다. – magol

+1

저녁 식사 후 모든 할아버지가 보입니다. – vaettchen

+1

나는 지나친 약속을 두려워합니다. 텍스트 상자를 올바르게 가져 왔지만 가장자리를 제어 할 수 없거나 반대 방향으로 제어 할 수 없습니다. 어쨌든 graphviz가해야 할 일을 살펴보면 놀랍지 않습니다. 좀 더 많은 작업을하고 나중에 여기에 github 링크로 게시 할 것이지만 완벽한 솔루션은 아닙니다. – vaettchen