blockdiag(edge_layout=flowchart)에게 말을 듣습니다.
blockdiag로 플로우차트를 그려도 콜레자나이 출력이 얻어지는 것이 적지 않다.
여러가지 사용해 보는 가운데 해결할 수 있었다·할 수 없었던 사례에 대해서, 기록을 남겨 간다.
약간의 수정으로 고칠 수있는 것
if 분기가 옆에서 나오지 않음
상황
edge_layout=flowchart
를 설정했음에도 불구하고 if 분기가 다이아몬드 아래에서 나옵니다.해결 방법
더미 노드
d
를 b0
와 정렬합니다.이것은 옆에서 분기를 내기 위해서는 두 개의 노드가 늘어서 있어야 하기 때문.
더미 노드는
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_width
및 node_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
정의보다는 「정답하지 않는다」로서 사용하는 것이 바람직할지도 모른다.bp
와 ep
의 라벨이 깨져 있지만, 이것도 적절한 width
를 설정하면 고칠 수 있다.어쩔 수없는 것 같습니다.
반환 화살표가 그릴 수 없음
기본적으로 아래에서 위 (왼쪽에서 오른쪽) 노드로 화살표를 그릴 것으로 예상되지 않는 패턴.
원래 돌아가는 화살표 어쩐지 사용하지 않는 노력을 해야 할지도.
flowchart.loopin(loopout)
를 사용하여 쓴다 folded
)은 사용하지 않고 terminator
등을 사용하여 둘 이상으로 구분합니다 왼쪽에서 돌아갈 수 없다.
만약 할 수 있는 방법이 있으면 진짜로 가르쳐 주었으면 한다.
다만, 실제로 하면 매핑의 난이도적인 의미로 개발자에게의 부하가 폭상할 것 같다.
문자 수 제한이 힘들다.
특히
flowchart.condition
등이 그렇지만, 문자수 제한이 힘들다.또, 엣지의 라벨도 마찬가지(T라든지 F정도 밖에 쓰지 않지만).
가로 긴 노드가 싫다면
height
를 늘려 텍스트를 개행하는 것이 무난한가.개행은
label="1行目\n2行目"
와 같이 쓰면 보통 할 수 있다.요약
잘 사용하지 않기 때문에 힘들다.
Reference
이 문제에 관하여(blockdiag(edge_layout=flowchart)에게 말을 듣습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/noribentooooooh/items/e4787d389341b6e9e3d0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)