blockdiag(edge_layout=flowchart)에게 말을 듣습니다.

개요
blockdiag로 플로우차트를 그려도 콜레자나이 출력이 얻어지는 것이 적지 않다.
여러가지 사용해 보는 가운데 해결할 수 있었다·할 수 없었던 사례에 대해서, 기록을 남겨 간다.

약간의 수정으로 고칠 수있는 것



if 분기가 옆에서 나오지 않음



상황


edge_layout=flowchart 를 설정했음에도 불구하고 if 분기가 다이아몬드 아래에서 나옵니다.


해결 방법



더미 노드 db0와 정렬합니다.
이것은 옆에서 분기를 내기 위해서는 두 개의 노드가 늘어서 있어야 하기 때문.
더미 노드는 shape=none 를 사용하는 것이 무난. 클래스화해 두면 사용하기 쉽다.
더미 노드에는 화살표가 붙고 싶지 않기 때문에, 분기측의 엣지는 dir=none 로서 머리를 지워 둔다.

break_1.diag
blockdiag{
    orientation = portrait;
    edge_layout = flowchart;

    bp [shape=beginpoint];
    lin [shape=flowchart.loopin];
    c [shape=flowchart.condition];
    b0 [shape=box];
    lout [shape=flowchart.loopout];
    ep [shape=endpoint];

    class dummy [shape=none];
    d [class=dummy];

    // main
    bp -> lin -> c -> b0 -> lout -> ep;

    // break
    c -> d -> ep [dir=none];
}



if 분기의 좌우가 예상대로 되지 않는다



상황



if의 「그쪽이 아닌 분( b0 )」이 아래로 분기해, 매우 불모호하게 된다.
루프를 말려들거나 하면 좌우로 어긋나 버려, 이제 눈도 맞을 수 없는 사태가 된다.



해결 방법



무려, 분기의 좌우는 노드를 정의한 순서에 의존하고 있는 모양.
따라서 "분기 바로 아래에 배치하려는 노드 (b1)"는 분기 (c) 바로 다음에 정의됩니다.
이런 것, 제대로 코드를 읽고 낚시하고 정보를 모으는 편이 좋을지도 모른다.



if_1.diag
blockdiag{
    orientation = portrait;
    edge_layout = flowchart;

    bp [shape=beginpoint];
    lin [shape=flowchart.loopin];
    c [shape=flowchart.condition];

    // b1 -> b0
    b1 [shape=box];
    b0 [shape=box];

    lout [shape=flowchart.loopout];
    ep [shape=endpoint];

    bp -> lin -> c -> b1 -> lout -> ep;
    c -> b0 -> ep;
}

엄청 옆으로 부풀어 오르다



상황



분기의 방법이나 수에 따라서는 플로우차트가 옆으로 부풀어 가는 경우가 있다.
슬라이드의 가장자리에 조금 싣는다든가, 세로 길이가 기쁜 경우에 조금 고치고 싶어진다.
이하의 종단이 복수인 플로우차트를 소재로 해 보자.


해결 방법 1: 아래로 돌아가기



첫 번째 터미네이션 ( hoge )에서 두 번째 터미네이션으로 분기 시작점 ( b1 )으로 보이지 않는 가장자리 ( style=none )를 뺍니다.
이 2 노드가 세로로 정렬됨으로써 레이아웃이 바뀝니다.



end2_1
blockdiag{
    orientation = portrait;
    edge_layout = flowchart;

    bp [shape=beginpoint];
    lin [shape=flowchart.loopin];
    c [shape=flowchart.condition];
    b0 [shape=box];
    b1 [shape=box];
    lout [shape=flowchart.loopout];
    ep0 [shape=endpoint, label="hoge"];
    ep1 [shape=endpoint, label="fuga"];

    // dummy
    class dummy [shape=none];
    d [class=dummy];

    // main
    bp -> lin -> c -> b0 -> lout -> ep0;

    // break
    c -> d [dir=none];
    d -> b1 -> ep1;

    // invisible edge
    ep0 -> b1 [style=none];
}

해결 방법 2: 길을 좁히기



위 그림이지만, 길의 화살표가 부풀어 오르고 별로 다이어트 할 수 없다.
이 "회전 상태"는 span_widthnode_width 의존적이므로 이들을 작게 설정합니다.
다만, node_width 를 줄여 노드까지 가늘어져는 의미가 없기 때문에,
노드의 사이즈 설정에 관해서는 class 를 정의해 그쪽에 정리해 쓰면 좋다.



end2_2.diag
blockdiag{
    orientation = portrait;
    edge_layout = flowchart;

    node_width = 20;
    span_width = 20;

    class box [shape=box, width=128];
    class if [shape=flowchart.condition, width=128];
    class lin [shape=flowchart.loopin, width=128];
    class lout [shape=flowchart.loopout, width=128];

    bp [shape=beginpoint];
    lin [class=lin];
    c [class=if];
    b0 [class=box];
    b1 [class=box];
    lout [class=lin];
    ep0 [shape=endpoint, label="hoge"];
    ep1 [shape=endpoint, label="fuga"];

    class dummy [shape=none];
    d [class=dummy, width=10];

    // main
    bp -> lin -> c -> b0 -> lout -> ep0;

    // break
    c -> d [dir=none];
    d -> b1 -> ep1;

    // invisible edge
    ep0 -> b1 [style=none];
}
class 정의보다는 「정답하지 않는다」로서 사용하는 것이 바람직할지도 모른다.bpep 의 라벨이 깨져 있지만, 이것도 적절한 width 를 설정하면 고칠 수 있다.

어쩔 수없는 것 같습니다.



반환 화살표가 그릴 수 없음



기본적으로 아래에서 위 (왼쪽에서 오른쪽) 노드로 화살표를 그릴 것으로 예상되지 않는 패턴.
원래 돌아가는 화살표 어쩐지 사용하지 않는 노력을 해야 할지도.
  • 루프는 flowchart.loopin(loopout) 를 사용하여 쓴다
  • 줄 바꿈 ( folded )은 사용하지 않고 terminator 등을 사용하여 둘 이상으로 구분합니다

  • 왼쪽에서 돌아갈 수 없다.



    만약 할 수 있는 방법이 있으면 진짜로 가르쳐 주었으면 한다.
    다만, 실제로 하면 매핑의 난이도적인 의미로 개발자에게의 부하가 폭상할 것 같다.

    문자 수 제한이 힘들다.



    특히 flowchart.condition 등이 그렇지만, 문자수 제한이 힘들다.
    또, 엣지의 라벨도 마찬가지(T라든지 F정도 밖에 쓰지 않지만).
    가로 긴 노드가 싫다면 height 를 늘려 텍스트를 개행하는 것이 무난한가.
    개행은 label="1行目\n2行目" 와 같이 쓰면 보통 할 수 있다.

    요약



    잘 사용하지 않기 때문에 힘들다.

    좋은 웹페이지 즐겨찾기