Support
Quality
Security
License
Reuse
kandi has reviewed plantuml and discovered the below as its top functions. This is intended to give you an instant insight into plantuml implemented functionality, and help decide if they suit your requirements.
[Sequence diagram](http://plantuml.com/sequence-diagram),
[Use case diagram](http://plantuml.com/use-case-diagram),
[Class diagram](http://plantuml.com/class-diagram),
[Object diagram](http://plantuml.com/object-diagram),
[Activity diagram](http://plantuml.com/activity-diagram-beta) (here is [the legacy syntax](http://plantuml.com/activity-diagram-legacy)),
[Component diagram](http://plantuml.com/component-diagram),
[Deployment diagram](http://plantuml.com/deployment-diagram),
[State diagram](http://plantuml.com/state-diagram),
[Timing diagram](http://plantuml.com/timing-diagram).
ANTLR Grammar to get a Sentence as Single Token
@startuml
Alice -> Alice: This is a signal to self.\nIt also demonstrates\nmultiline \ntext
@enduml
action:
left=ident
arrow
right=ident
LABEL
;
LABEL: ‘:’ ~[\r\n]*;
-----------------------
@startuml
Alice -> Alice: This is a signal to self.\nIt also demonstrates\nmultiline \ntext
@enduml
action:
left=ident
arrow
right=ident
LABEL
;
LABEL: ‘:’ ~[\r\n]*;
plantuml: Right to left arrows, grouped components
@startuml
left to right direction
rectangle Foo1
rectangle Foo2
rectangle Foo3
node Bar1
node Bar2
node Bar3
storage Baz1
storage Baz2
storage Baz3
Foo1 --> Bar2
Foo2 --> Bar1
Bar1 --> Baz3
Bar2 --> Baz1
Foo3 -[hidden]-> Bar3
Bar3 -[hidden]-> Baz2
@enduml
hide Foo1
-----------------------
@startuml
left to right direction
rectangle Foo1
rectangle Foo2
rectangle Foo3
node Bar1
node Bar2
node Bar3
storage Baz1
storage Baz2
storage Baz3
Foo1 --> Bar2
Foo2 --> Bar1
Bar1 --> Baz3
Bar2 --> Baz1
Foo3 -[hidden]-> Bar3
Bar3 -[hidden]-> Baz2
@enduml
hide Foo1
How to differentiate usage and inheritance in a layered architecture?
@ArchTest
ArchRule adapter_should_not_inherit_from_port = noClasses()
.that().resideInAPackage("….adapter")
.should().beAssignableTo(JavaClass.Predicates.resideInAPackage("….port"));
@ArchTest
ArchRule service_should_not_access_port = noClasses()
.that().resideInAPackage("….service")
.should().accessClassesThat().resideInAPackage("….port");
Syntax Error inside map, but works on the online webservice
public class PlantUMLDemo {
public static void main (String[] args) throws IOException {
String source = "@startuml\r\n"
+ "left to right direction\r\n"
+ "' Horizontal lines: -->, <--, <-->\r\n"
+ "' Vertical lines: ->, <-, <->\r\n"
+ "map Transport.Personnel{\r\n"
+ "ID => 38\r\n"
+ "}\r\n"
+ "map Airplane1{\r\n"
+ "ID => 39\r\n"
+ "}\r\n"
+ "map Airplane2{\r\n"
+ "ID => 40\r\n"
+ "}\r\n"
+ "map Lathe1{\r\n"
+ "ID => 41\r\n"
+ "}\r\n"
+ "map Lathe2{\r\n"
+ "ID => 42\r\n"
+ "}\r\n"
+ "map Production.from.Mold1{\r\n"
+ "ID => 43\r\n"
+ "}\r\n"
+ "map Production.from.Mold2{\r\n"
+ "ID => 44\r\n"
+ "}\r\n"
+ "map Assembly.Line1{\r\n"
+ "ID => 45\r\n"
+ "}\r\n"
+ "map Assembly.Line2{\r\n"
+ "ID => 46\r\n"
+ "}\r\n"
+ "map Assembly.Line3{\r\n"
+ "ID => 47\r\n"
+ "}\r\n"
+ "@enduml";
byte[] bytes = source.getBytes(StandardCharsets.UTF_8);
String utf8EncodedString = new String(bytes, StandardCharsets.UTF_8);
System.out.println(utf8EncodedString);
SourceStringReader reader = new SourceStringReader(utf8EncodedString);
final ByteArrayOutputStream os = new ByteArrayOutputStream();
// Write the first image to "os"
reader.generateImage(os, new FileFormatOption(FileFormat.SVG));
os.close();
// The XML is stored into svg
final String svg = new String(os.toByteArray(), Charset.forName("UTF-8"));
System.out.println(svg);
// return svg;
}
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="290px" preserveAspectRatio="none" style="width:539px;height:290px;background:#FFFFFF;" version="1.1" viewBox="0 0 539 290" width="539px" zoomAndPan="magnify"><defs><filter height="300%" id="fxvmrbp5q73dl" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="127" x="7" y="7"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="113" x="14" y="21.457">Transport.Personnel</text><line style="stroke:#A80036;stroke-width:1.0;" x1="7" x2="134" y1="26.0938" y2="26.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="12" y="38.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="32" y="38.4746">38</text><line style="stroke:#A80036;stroke-width:1.0;" x1="27" x2="27" y1="26.0938" y2="42.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="66" x="37.5" y="85"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="52" x="44.5" y="99.457">Airplane1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="37.5" x2="103.5" y1="104.0938" y2="104.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="42.5" y="116.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="62.5" y="116.4746">39</text><line style="stroke:#A80036;stroke-width:1.0;" x1="57.5" x2="57.5" y1="104.0938" y2="120.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="66" x="37.5" y="163"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="52" x="44.5" y="177.457">Airplane2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="37.5" x2="103.5" y1="182.0938" y2="182.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="42.5" y="194.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="62.5" y="194.4746">40</text><line style="stroke:#A80036;stroke-width:1.0;" x1="57.5" x2="57.5" y1="182.0938" y2="198.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="52" x="44.5" y="241"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="38" x="51.5" y="255.457">Lathe1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="44.5" x2="96.5" y1="260.0938" y2="260.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="49.5" y="272.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="69.5" y="272.4746">41</text><line style="stroke:#A80036;stroke-width:1.0;" x1="64.5" x2="64.5" y1="260.0938" y2="276.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="52" x="252.5" y="7"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="38" x="259.5" y="21.457">Lathe2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="252.5" x2="304.5" y1="26.0938" y2="26.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="257.5" y="38.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="277.5" y="38.4746">42</text><line style="stroke:#A80036;stroke-width:1.0;" x1="272.5" x2="272.5" y1="26.0938" y2="42.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="137" x="210" y="85"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="123" x="217" y="99.457">Production.from.Mold1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="210" x2="347" y1="104.0938" y2="104.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="215" y="116.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="235" y="116.4746">43</text><line style="stroke:#A80036;stroke-width:1.0;" x1="230" x2="230" y1="104.0938" y2="120.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="137" x="210" y="163"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="123" x="217" y="177.457">Production.from.Mold2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="210" x2="347" y1="182.0938" y2="182.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="215" y="194.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="235" y="194.4746">44</text><line style="stroke:#A80036;stroke-width:1.0;" x1="230" x2="230" y1="182.0938" y2="198.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="102" x="227.5" y="241"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="88" x="234.5" y="255.457">Assembly.Line1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="227.5" x2="329.5" y1="260.0938" y2="260.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="232.5" y="272.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="252.5" y="272.4746">45</text><line style="stroke:#A80036;stroke-width:1.0;" x1="247.5" x2="247.5" y1="260.0938" y2="276.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="102" x="423" y="7"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="88" x="430" y="21.457">Assembly.Line2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="423" x2="525" y1="26.0938" y2="26.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="428" y="38.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="448" y="38.4746">46</text><line style="stroke:#A80036;stroke-width:1.0;" x1="443" x2="443" y1="26.0938" y2="42.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="102" x="423" y="85"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="88" x="430" y="99.457">Assembly.Line3</text><line style="stroke:#A80036;stroke-width:1.0;" x1="423" x2="525" y1="104.0938" y2="104.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="428" y="116.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="448" y="116.4746">47</text><line style="stroke:#A80036;stroke-width:1.0;" x1="443" x2="443" y1="104.0938" y2="120.6719"/><!--MD5=[ff82272a54b0608060e06faff60c0c6f]
link Transport.Personnel to Airplane1--><!--MD5=[c202e95eecfc418b5501e2a8947e8feb]
link Airplane1 to Airplane2--><!--MD5=[636ba822349036c737d84d06f0729b92]
link Airplane2 to Lathe1--><!--MD5=[b9280dfb35d92cd40bcce7a3234b7f39]
link Transport.Personnel to Lathe2--><!--MD5=[771b27f758c2865dd959173aec72d1ef]
link Lathe2 to Production.from.Mold1--><!--MD5=[77de6294656f35161f6e03883c63e876]
link Production.from.Mold1 to Production.from.Mold2--><!--MD5=[73d5fa06c8330ee70fe1a2a0b8f7f067]
link Production.from.Mold2 to Assembly.Line1--><!--MD5=[8053d5220acde5e9c8d637bbcdec0086]
link Lathe2 to Assembly.Line2--><!--MD5=[b61908b6fd80267801bee0bc115ff909]
link Assembly.Line2 to Assembly.Line3--><!--MD5=[83bc2a7ae5b567adf58816b4879445c0]
@startuml
left to right direction
' Horizontal lines: - ->, <- -, <- ->
' Vertical lines: ->, <-, <->
map Transport.Personnel{
ID => 38
}
map Airplane1{
ID => 39
}
map Airplane2{
ID => 40
}
map Lathe1{
ID => 41
}
map Lathe2{
ID => 42
}
map Production.from.Mold1{
ID => 43
}
map Production.from.Mold2{
ID => 44
}
map Assembly.Line1{
ID => 45
}
map Assembly.Line2{
ID => 46
}
map Assembly.Line3{
ID => 47
}
@enduml
@startuml
left to right direction
map Transport.Personnel{
ID => 38
}
map Airplane1{
ID => 39
}
map Airplane2{
ID => 40
}
map Lathe1{
ID => 41
}
map Lathe2{
ID => 42
}
map Production.from.Mold1{
ID => 43
}
map Production.from.Mold2{
ID => 44
}
map Assembly.Line1{
ID => 45
}
map Assembly.Line2{
ID => 46
}
map Assembly.Line3{
ID => 47
}
@enduml
PlantUML version 1.2021.9(Sun Jul 25 05:13:56 CDT 2021)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Default Encoding: Cp1252
Language: en
Country: US
--></g></svg>
-----------------------
public class PlantUMLDemo {
public static void main (String[] args) throws IOException {
String source = "@startuml\r\n"
+ "left to right direction\r\n"
+ "' Horizontal lines: -->, <--, <-->\r\n"
+ "' Vertical lines: ->, <-, <->\r\n"
+ "map Transport.Personnel{\r\n"
+ "ID => 38\r\n"
+ "}\r\n"
+ "map Airplane1{\r\n"
+ "ID => 39\r\n"
+ "}\r\n"
+ "map Airplane2{\r\n"
+ "ID => 40\r\n"
+ "}\r\n"
+ "map Lathe1{\r\n"
+ "ID => 41\r\n"
+ "}\r\n"
+ "map Lathe2{\r\n"
+ "ID => 42\r\n"
+ "}\r\n"
+ "map Production.from.Mold1{\r\n"
+ "ID => 43\r\n"
+ "}\r\n"
+ "map Production.from.Mold2{\r\n"
+ "ID => 44\r\n"
+ "}\r\n"
+ "map Assembly.Line1{\r\n"
+ "ID => 45\r\n"
+ "}\r\n"
+ "map Assembly.Line2{\r\n"
+ "ID => 46\r\n"
+ "}\r\n"
+ "map Assembly.Line3{\r\n"
+ "ID => 47\r\n"
+ "}\r\n"
+ "@enduml";
byte[] bytes = source.getBytes(StandardCharsets.UTF_8);
String utf8EncodedString = new String(bytes, StandardCharsets.UTF_8);
System.out.println(utf8EncodedString);
SourceStringReader reader = new SourceStringReader(utf8EncodedString);
final ByteArrayOutputStream os = new ByteArrayOutputStream();
// Write the first image to "os"
reader.generateImage(os, new FileFormatOption(FileFormat.SVG));
os.close();
// The XML is stored into svg
final String svg = new String(os.toByteArray(), Charset.forName("UTF-8"));
System.out.println(svg);
// return svg;
}
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="290px" preserveAspectRatio="none" style="width:539px;height:290px;background:#FFFFFF;" version="1.1" viewBox="0 0 539 290" width="539px" zoomAndPan="magnify"><defs><filter height="300%" id="fxvmrbp5q73dl" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="127" x="7" y="7"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="113" x="14" y="21.457">Transport.Personnel</text><line style="stroke:#A80036;stroke-width:1.0;" x1="7" x2="134" y1="26.0938" y2="26.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="12" y="38.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="32" y="38.4746">38</text><line style="stroke:#A80036;stroke-width:1.0;" x1="27" x2="27" y1="26.0938" y2="42.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="66" x="37.5" y="85"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="52" x="44.5" y="99.457">Airplane1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="37.5" x2="103.5" y1="104.0938" y2="104.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="42.5" y="116.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="62.5" y="116.4746">39</text><line style="stroke:#A80036;stroke-width:1.0;" x1="57.5" x2="57.5" y1="104.0938" y2="120.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="66" x="37.5" y="163"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="52" x="44.5" y="177.457">Airplane2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="37.5" x2="103.5" y1="182.0938" y2="182.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="42.5" y="194.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="62.5" y="194.4746">40</text><line style="stroke:#A80036;stroke-width:1.0;" x1="57.5" x2="57.5" y1="182.0938" y2="198.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="52" x="44.5" y="241"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="38" x="51.5" y="255.457">Lathe1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="44.5" x2="96.5" y1="260.0938" y2="260.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="49.5" y="272.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="69.5" y="272.4746">41</text><line style="stroke:#A80036;stroke-width:1.0;" x1="64.5" x2="64.5" y1="260.0938" y2="276.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="52" x="252.5" y="7"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="38" x="259.5" y="21.457">Lathe2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="252.5" x2="304.5" y1="26.0938" y2="26.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="257.5" y="38.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="277.5" y="38.4746">42</text><line style="stroke:#A80036;stroke-width:1.0;" x1="272.5" x2="272.5" y1="26.0938" y2="42.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="137" x="210" y="85"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="123" x="217" y="99.457">Production.from.Mold1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="210" x2="347" y1="104.0938" y2="104.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="215" y="116.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="235" y="116.4746">43</text><line style="stroke:#A80036;stroke-width:1.0;" x1="230" x2="230" y1="104.0938" y2="120.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="137" x="210" y="163"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="123" x="217" y="177.457">Production.from.Mold2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="210" x2="347" y1="182.0938" y2="182.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="215" y="194.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="235" y="194.4746">44</text><line style="stroke:#A80036;stroke-width:1.0;" x1="230" x2="230" y1="182.0938" y2="198.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="102" x="227.5" y="241"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="88" x="234.5" y="255.457">Assembly.Line1</text><line style="stroke:#A80036;stroke-width:1.0;" x1="227.5" x2="329.5" y1="260.0938" y2="260.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="232.5" y="272.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="252.5" y="272.4746">45</text><line style="stroke:#A80036;stroke-width:1.0;" x1="247.5" x2="247.5" y1="260.0938" y2="276.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="102" x="423" y="7"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="88" x="430" y="21.457">Assembly.Line2</text><line style="stroke:#A80036;stroke-width:1.0;" x1="423" x2="525" y1="26.0938" y2="26.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="428" y="38.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="448" y="38.4746">46</text><line style="stroke:#A80036;stroke-width:1.0;" x1="443" x2="443" y1="26.0938" y2="42.6719"/><rect fill="#FEFECE" filter="url(#fxvmrbp5q73dl)" height="35.6719" style="stroke:#A80036;stroke-width:1.5;" width="102" x="423" y="85"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacing" textLength="88" x="430" y="99.457">Assembly.Line3</text><line style="stroke:#A80036;stroke-width:1.0;" x1="423" x2="525" y1="104.0938" y2="104.0938"/><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="10" x="428" y="116.4746">ID</text><text fill="#000000" font-family="sans-serif" font-size="10" lengthAdjust="spacing" textLength="12" x="448" y="116.4746">47</text><line style="stroke:#A80036;stroke-width:1.0;" x1="443" x2="443" y1="104.0938" y2="120.6719"/><!--MD5=[ff82272a54b0608060e06faff60c0c6f]
link Transport.Personnel to Airplane1--><!--MD5=[c202e95eecfc418b5501e2a8947e8feb]
link Airplane1 to Airplane2--><!--MD5=[636ba822349036c737d84d06f0729b92]
link Airplane2 to Lathe1--><!--MD5=[b9280dfb35d92cd40bcce7a3234b7f39]
link Transport.Personnel to Lathe2--><!--MD5=[771b27f758c2865dd959173aec72d1ef]
link Lathe2 to Production.from.Mold1--><!--MD5=[77de6294656f35161f6e03883c63e876]
link Production.from.Mold1 to Production.from.Mold2--><!--MD5=[73d5fa06c8330ee70fe1a2a0b8f7f067]
link Production.from.Mold2 to Assembly.Line1--><!--MD5=[8053d5220acde5e9c8d637bbcdec0086]
link Lathe2 to Assembly.Line2--><!--MD5=[b61908b6fd80267801bee0bc115ff909]
link Assembly.Line2 to Assembly.Line3--><!--MD5=[83bc2a7ae5b567adf58816b4879445c0]
@startuml
left to right direction
' Horizontal lines: - ->, <- -, <- ->
' Vertical lines: ->, <-, <->
map Transport.Personnel{
ID => 38
}
map Airplane1{
ID => 39
}
map Airplane2{
ID => 40
}
map Lathe1{
ID => 41
}
map Lathe2{
ID => 42
}
map Production.from.Mold1{
ID => 43
}
map Production.from.Mold2{
ID => 44
}
map Assembly.Line1{
ID => 45
}
map Assembly.Line2{
ID => 46
}
map Assembly.Line3{
ID => 47
}
@enduml
@startuml
left to right direction
map Transport.Personnel{
ID => 38
}
map Airplane1{
ID => 39
}
map Airplane2{
ID => 40
}
map Lathe1{
ID => 41
}
map Lathe2{
ID => 42
}
map Production.from.Mold1{
ID => 43
}
map Production.from.Mold2{
ID => 44
}
map Assembly.Line1{
ID => 45
}
map Assembly.Line2{
ID => 46
}
map Assembly.Line3{
ID => 47
}
@enduml
PlantUML version 1.2021.9(Sun Jul 25 05:13:56 CDT 2021)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Default Encoding: Cp1252
Language: en
Country: US
--></g></svg>
PlantUML Getting Syntax Error (Flutter/Dart)
"covid19stats::dateRangeDialog.dart::DateRangeDialog" o-- "flutter::src::material::date.dart::DateTimeR
ange"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::dateRangeDialog.dart::DateR
angeDialog"
@startuml
set namespaceSeparator ::
class "covid19stats::chartsData.dart::ChartsData" {
+ChartData* total
+ChartData* recovered
+ChartData* deaths
+ChartData* vaccine
}
"covid19stats::chartsData.dart::ChartsData" o-- "covid19stats::chartsData.dart::ChartData"
class "covid19stats::chartsData.dart::ChartData" {
+bool* daily
+bool* available
+List<String*>* labels
+List<int*>* values
+List<Color*>* gradientColors
}
class "covid19stats::counter.dart::Counter" {
+Animation<int*>* animation
+TextStyle* textStyle
+Widget* build()
}
"covid19stats::counter.dart::Counter" o-- "flutter::src::animation::animation.dart::Animation<int>"
"covid19stats::counter.dart::Counter" o-- "flutter::src::painting::text_style.dart::TextStyle"
"flutter::src::widgets::transitions.dart::AnimatedWidget" <|-- "covid19stats::counter.dart::Counter"
class "covid19stats::countryData.dart::CountryData" {
+int* totalTests
+int* testsPerMln
+int* totalCases
+double* casesPerMln
+int* newCases
+int* totalRecovered
+int* newRecovered
+int* activeCases
+int* totalDeaths
+double* deathsPerMln
+int* criticalCases
+int* newDeaths
+String* link
+int* vacTotal
+int* vacDaily
+int* vactotalPerHundred
+int* vacdailyPerMillion
}
class "covid19stats::countryDataVac.dart::CountryDataVac" {
+int* vacTotal
+int* vacDaily
+int* vactotalPerHundred
+int* vacdailyPerMillion
+String* date
+Map<String*, dynamic>* toJson()
}
class "covid19stats::dateRangeDialog.dart::DateRangeDialog" {
+DateTimeRange* availableRange
+DateTimeRange* currentRange
+_DateRangeDialogState* createState()
}
"covid19stats::dateRangeDialog.dart::DateRangeDialog" o-- "flutter::src::material::date.dart::DateTimeRange"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::dateRangeDialog.dart::DateRangeDialog"
class "covid19stats::dateRangeDialog.dart::_DateRangeDialogState" {
+TextEditingController* fromController
+TextEditingController* toController
+DateFormat* dateFormat
+DateTimeRange* selectedRange
+int* selectedOption
+DateTimeRange* preset7
+DateTimeRange* preset28
+void initState()
+Widget* build()
+void checkForPresets()
}
"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "flutter::src::widgets::editable_text.dart::TextEditingController"
"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "intl::intl.dart::DateFormat"
"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "flutter::src::material::date.dart::DateTimeRange"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::dateRangeDialog.dart::_DateRangeDialogState"
class "covid19stats::main.dart::MyApp" {
+Widget* build()
}
"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "covid19stats::main.dart::MyApp"
class "covid19stats::main.dart::MyHomePage" {
+_MyHomePageState* createState()
}
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::main.dart::MyHomePage"
class "covid19stats::main.dart::_MyHomePageState" {
-GlobalKey<State<StatefulWidget*>*>* _refreshIndicatorKey
-GlobalKey<ScaffoldState*>* _scaffoldKey
+Map<String*, CountryData*>* countryData
+Map<String*, CountryDataVac*>* countryDataVac
+Map<String*, ChartsData*>* chartsData
+Map<String*, ChartsData*>* chartsDataVac
+String* country
+bool* justStarted
+int* springAnimationDuration
-AnimationController* _controller
+ThemeData* datePickerTheme
+DateTimeRange* selectedDateRange
+Settings* settings
+void initState()
-void _triggerLiquidPullRefresh()
+Future<void>* refreshData()
+void dispose()
+Widget* build()
+dynamic navigateToSelection()
+Future<void>* showDateDialog()
+Future<void>* showSettingsDialog()
+void checkRangeSetting()
+Widget* createGraph()
}
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::widgets::framework.dart::GlobalKey<State<StatefulWidget>>"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::widgets::framework.dart::GlobalKey<ScaffoldState>"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::animation::animation_controller.dart::AnimationController"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::material::theme_data.dart::ThemeData"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::material::date.dart::DateTimeRange"
"covid19stats::main.dart::_MyHomePageState" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::main.dart::_MyHomePageState"
"flutter::src::widgets::ticker_provider.dart::TickerProviderStateMixin" <|-- "covid19stats::main.dart::_MyHomePageState"
class "covid19stats::parser.dart::Parser" {
{static} +CountryData* parseRow()
{static} +CountryDataVac* parseRowVac()
{static} +int* parseInteger()
{static} +double* parseDouble()
{static} +String* getInnerString()
{static} +String* normalizeName()
{static} +Map<String*, CountryData*>* getCountryData()
{static} +String* capitalize()
{static} +Map<String*, CountryDataVac*>* getCountryDataVac()
{static} +List<String*>* getCategories()
{static} +List<int*>* getDataPoints()
{static} +List<String*>* getVacDates()
{static} +List<int*>* getVacDataPoints()
{static} +ChartsData* getChartsData()
}
class "covid19stats::selectCountry.dart::SelectionScreen" {
+List<dynamic>* countries
+String* selectedCountry
+_SelectionScreenState* createState()
}
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::selectCountry.dart::SelectionScreen"
class "covid19stats::selectCountry.dart::_SelectionScreenState" {
+ScrollController* scrollController
+GlobalKey<State<StatefulWidget*>*>* key
+Map<String*, String*>* countryFlags
-TextEditingController* _controller
+FocusNode* textFieldFocusNode
+bool* searchFieldVisible
+List<dynamic>* filteredCountries
+bool* newSearch
+void initState()
+void dispose()
+void toggleSearchField()
+Widget* build()
+Widget* getListTile()
}
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::scroll_controller.dart::ScrollController"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::framework.dart::GlobalKey<State<StatefulWidget>>"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::editable_text.dart::TextEditingController"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::focus_manager.dart::FocusNode"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::selectCountry.dart::_SelectionScreenState"
class "covid19stats::settingsDialog.dart::Settings" {
+bool* defaultDailyView
+bool* alwaysLoadCharts
+int* rangeSetting
+bool* loaded
+Future<void>* load()
+Future<bool*>* save()
+Settings* clone()
+dynamic []()
}
class "covid19stats::settingsDialog.dart::SettingsDialog" {
+Settings* settings
+_SettingsDialogState* createState()
}
"covid19stats::settingsDialog.dart::SettingsDialog" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::settingsDialog.dart::SettingsDialog"
class "covid19stats::settingsDialog.dart::_SettingsDialogState" {
+Settings* newSettings
+void initState()
+Widget* build()
+Row* getSwitchRow()
}
"covid19stats::settingsDialog.dart::_SettingsDialogState" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::settingsDialog.dart::_SettingsDialogState"
class "covid19stats::vaccineCountry.dart::VaccineCountry" {
+String* country
+List<Timeline*>* timeline
+Map<String*, dynamic>* toJson()
}
class "covid19stats::vaccineCountry.dart::Timeline" {
+int* total
+int* daily
+int* totalPerHundred
+int* dailyPerMillion
+String* date
+Map<String*, dynamic>* toJson()
}
class "covid19stats::vaccineData.dart::VaccineData" {
+int* total
+int* daily
+double* totalPerHundred
+double* dailyPerMillion
+String* link
}
@enduml
-----------------------
"covid19stats::dateRangeDialog.dart::DateRangeDialog" o-- "flutter::src::material::date.dart::DateTimeR
ange"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::dateRangeDialog.dart::DateR
angeDialog"
@startuml
set namespaceSeparator ::
class "covid19stats::chartsData.dart::ChartsData" {
+ChartData* total
+ChartData* recovered
+ChartData* deaths
+ChartData* vaccine
}
"covid19stats::chartsData.dart::ChartsData" o-- "covid19stats::chartsData.dart::ChartData"
class "covid19stats::chartsData.dart::ChartData" {
+bool* daily
+bool* available
+List<String*>* labels
+List<int*>* values
+List<Color*>* gradientColors
}
class "covid19stats::counter.dart::Counter" {
+Animation<int*>* animation
+TextStyle* textStyle
+Widget* build()
}
"covid19stats::counter.dart::Counter" o-- "flutter::src::animation::animation.dart::Animation<int>"
"covid19stats::counter.dart::Counter" o-- "flutter::src::painting::text_style.dart::TextStyle"
"flutter::src::widgets::transitions.dart::AnimatedWidget" <|-- "covid19stats::counter.dart::Counter"
class "covid19stats::countryData.dart::CountryData" {
+int* totalTests
+int* testsPerMln
+int* totalCases
+double* casesPerMln
+int* newCases
+int* totalRecovered
+int* newRecovered
+int* activeCases
+int* totalDeaths
+double* deathsPerMln
+int* criticalCases
+int* newDeaths
+String* link
+int* vacTotal
+int* vacDaily
+int* vactotalPerHundred
+int* vacdailyPerMillion
}
class "covid19stats::countryDataVac.dart::CountryDataVac" {
+int* vacTotal
+int* vacDaily
+int* vactotalPerHundred
+int* vacdailyPerMillion
+String* date
+Map<String*, dynamic>* toJson()
}
class "covid19stats::dateRangeDialog.dart::DateRangeDialog" {
+DateTimeRange* availableRange
+DateTimeRange* currentRange
+_DateRangeDialogState* createState()
}
"covid19stats::dateRangeDialog.dart::DateRangeDialog" o-- "flutter::src::material::date.dart::DateTimeRange"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::dateRangeDialog.dart::DateRangeDialog"
class "covid19stats::dateRangeDialog.dart::_DateRangeDialogState" {
+TextEditingController* fromController
+TextEditingController* toController
+DateFormat* dateFormat
+DateTimeRange* selectedRange
+int* selectedOption
+DateTimeRange* preset7
+DateTimeRange* preset28
+void initState()
+Widget* build()
+void checkForPresets()
}
"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "flutter::src::widgets::editable_text.dart::TextEditingController"
"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "intl::intl.dart::DateFormat"
"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "flutter::src::material::date.dart::DateTimeRange"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::dateRangeDialog.dart::_DateRangeDialogState"
class "covid19stats::main.dart::MyApp" {
+Widget* build()
}
"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "covid19stats::main.dart::MyApp"
class "covid19stats::main.dart::MyHomePage" {
+_MyHomePageState* createState()
}
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::main.dart::MyHomePage"
class "covid19stats::main.dart::_MyHomePageState" {
-GlobalKey<State<StatefulWidget*>*>* _refreshIndicatorKey
-GlobalKey<ScaffoldState*>* _scaffoldKey
+Map<String*, CountryData*>* countryData
+Map<String*, CountryDataVac*>* countryDataVac
+Map<String*, ChartsData*>* chartsData
+Map<String*, ChartsData*>* chartsDataVac
+String* country
+bool* justStarted
+int* springAnimationDuration
-AnimationController* _controller
+ThemeData* datePickerTheme
+DateTimeRange* selectedDateRange
+Settings* settings
+void initState()
-void _triggerLiquidPullRefresh()
+Future<void>* refreshData()
+void dispose()
+Widget* build()
+dynamic navigateToSelection()
+Future<void>* showDateDialog()
+Future<void>* showSettingsDialog()
+void checkRangeSetting()
+Widget* createGraph()
}
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::widgets::framework.dart::GlobalKey<State<StatefulWidget>>"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::widgets::framework.dart::GlobalKey<ScaffoldState>"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::animation::animation_controller.dart::AnimationController"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::material::theme_data.dart::ThemeData"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::material::date.dart::DateTimeRange"
"covid19stats::main.dart::_MyHomePageState" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::main.dart::_MyHomePageState"
"flutter::src::widgets::ticker_provider.dart::TickerProviderStateMixin" <|-- "covid19stats::main.dart::_MyHomePageState"
class "covid19stats::parser.dart::Parser" {
{static} +CountryData* parseRow()
{static} +CountryDataVac* parseRowVac()
{static} +int* parseInteger()
{static} +double* parseDouble()
{static} +String* getInnerString()
{static} +String* normalizeName()
{static} +Map<String*, CountryData*>* getCountryData()
{static} +String* capitalize()
{static} +Map<String*, CountryDataVac*>* getCountryDataVac()
{static} +List<String*>* getCategories()
{static} +List<int*>* getDataPoints()
{static} +List<String*>* getVacDates()
{static} +List<int*>* getVacDataPoints()
{static} +ChartsData* getChartsData()
}
class "covid19stats::selectCountry.dart::SelectionScreen" {
+List<dynamic>* countries
+String* selectedCountry
+_SelectionScreenState* createState()
}
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::selectCountry.dart::SelectionScreen"
class "covid19stats::selectCountry.dart::_SelectionScreenState" {
+ScrollController* scrollController
+GlobalKey<State<StatefulWidget*>*>* key
+Map<String*, String*>* countryFlags
-TextEditingController* _controller
+FocusNode* textFieldFocusNode
+bool* searchFieldVisible
+List<dynamic>* filteredCountries
+bool* newSearch
+void initState()
+void dispose()
+void toggleSearchField()
+Widget* build()
+Widget* getListTile()
}
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::scroll_controller.dart::ScrollController"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::framework.dart::GlobalKey<State<StatefulWidget>>"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::editable_text.dart::TextEditingController"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::focus_manager.dart::FocusNode"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::selectCountry.dart::_SelectionScreenState"
class "covid19stats::settingsDialog.dart::Settings" {
+bool* defaultDailyView
+bool* alwaysLoadCharts
+int* rangeSetting
+bool* loaded
+Future<void>* load()
+Future<bool*>* save()
+Settings* clone()
+dynamic []()
}
class "covid19stats::settingsDialog.dart::SettingsDialog" {
+Settings* settings
+_SettingsDialogState* createState()
}
"covid19stats::settingsDialog.dart::SettingsDialog" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::settingsDialog.dart::SettingsDialog"
class "covid19stats::settingsDialog.dart::_SettingsDialogState" {
+Settings* newSettings
+void initState()
+Widget* build()
+Row* getSwitchRow()
}
"covid19stats::settingsDialog.dart::_SettingsDialogState" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::settingsDialog.dart::_SettingsDialogState"
class "covid19stats::vaccineCountry.dart::VaccineCountry" {
+String* country
+List<Timeline*>* timeline
+Map<String*, dynamic>* toJson()
}
class "covid19stats::vaccineCountry.dart::Timeline" {
+int* total
+int* daily
+int* totalPerHundred
+int* dailyPerMillion
+String* date
+Map<String*, dynamic>* toJson()
}
class "covid19stats::vaccineData.dart::VaccineData" {
+int* total
+int* daily
+double* totalPerHundred
+double* dailyPerMillion
+String* link
}
@enduml
How can I exclude packages with Plant UML yaml
package "Common Layer" {
[SomethingCommon] <<..common.something..>>
[Something] <<com.xxx.yyy.common.somepkgs>>
}
[somethingElse] --> [Common]
[somethingElse] --> [SomethingCommon]
[somethingElse] --> [Something]
-----------------------
package "Common Layer" {
[SomethingCommon] <<..common.something..>>
[Something] <<com.xxx.yyy.common.somepkgs>>
}
[somethingElse] --> [Common]
[somethingElse] --> [SomethingCommon]
[somethingElse] --> [Something]
-----------------------
package "Common Layer" {
[SomethingCommon] <<..common.something..>>
[Something] <<com.xxx.yyy.common.somepkgs>>
}
[somethingElse] --> [Common]
[somethingElse] --> [SomethingCommon]
[somethingElse] --> [Something]
How to create PlantUML diagram using Java API without using PlantUML diagram code?
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.SourceStringReader;
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.sequencediagram.Message;
import net.sourceforge.plantuml.sequencediagram.Participant;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagramFactory;
import net.sourceforge.plantuml.skin.ArrowConfiguration;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import static com.google.common.base.Preconditions.checkState;
public class PlantUMLDemoMain {
public static void main(String[] args) throws Exception {
generateFromStringSource(new File("from-string.png"));
generateFromApi(new File("from-api.png"));
}
private static void generateFromApi(File file) throws IOException {
// 1. setup:
SequenceDiagramFactory f = new SequenceDiagramFactory();
SequenceDiagram diagram = f.createEmptyDiagram();
// 2. Build the diagram:
// "Bob -> Alice : hello"
// See net.sourceforge.plantuml.sequencediagram.command.CommandArrow#executeArg
Display bobD = Display.getWithNewlines("Bob");
Participant bobP = diagram.getOrCreateParticipant("Bob", bobD);
Display aliceD = Display.getWithNewlines("Alice");
Participant aliceP = diagram.getOrCreateParticipant("Alice", aliceD);
Display label = Display.getWithNewlines("hello");
ArrowConfiguration config = ArrowConfiguration.withDirectionNormal();
Message msg = new Message(bobP, aliceP, label, config, diagram.getNextMessageNumber());
checkState(null == diagram.addMessage(msg));
// 3. Output the diagram
// See net.sourceforge.plantuml.SourceStringReader#generateImage
diagram.makeDiagramReady();
checkState(1 == diagram.getNbImages());
try (OutputStream os = new FileOutputStream(file)) {
ImageData imageData = diagram.exportDiagram(os, 0, new FileFormatOption(FileFormat.PNG));
System.out.println("generateFromApi: " + diagram.getDescription().getDescription());
}
}
private static void generateFromStringSource(File file) throws IOException {
String source = "@startuml\n";
source += "Bob -> Alice : hello\n";
source += "@enduml\n";
SourceStringReader reader = new SourceStringReader(source);
// Write the first image to "png"
String desc = reader.generateImage(file);
// Return a null string if no generation
System.out.println("generateFromStringSource: " + desc);
}
}
libraryDependencies += "net.sourceforge.plantuml" % "plantuml" % "8059"
libraryDependencies += "com.google.guava" % "guava" % "31.0.1-jre"
-----------------------
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.SourceStringReader;
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.cucadiagram.Display;
import net.sourceforge.plantuml.sequencediagram.Message;
import net.sourceforge.plantuml.sequencediagram.Participant;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagram;
import net.sourceforge.plantuml.sequencediagram.SequenceDiagramFactory;
import net.sourceforge.plantuml.skin.ArrowConfiguration;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import static com.google.common.base.Preconditions.checkState;
public class PlantUMLDemoMain {
public static void main(String[] args) throws Exception {
generateFromStringSource(new File("from-string.png"));
generateFromApi(new File("from-api.png"));
}
private static void generateFromApi(File file) throws IOException {
// 1. setup:
SequenceDiagramFactory f = new SequenceDiagramFactory();
SequenceDiagram diagram = f.createEmptyDiagram();
// 2. Build the diagram:
// "Bob -> Alice : hello"
// See net.sourceforge.plantuml.sequencediagram.command.CommandArrow#executeArg
Display bobD = Display.getWithNewlines("Bob");
Participant bobP = diagram.getOrCreateParticipant("Bob", bobD);
Display aliceD = Display.getWithNewlines("Alice");
Participant aliceP = diagram.getOrCreateParticipant("Alice", aliceD);
Display label = Display.getWithNewlines("hello");
ArrowConfiguration config = ArrowConfiguration.withDirectionNormal();
Message msg = new Message(bobP, aliceP, label, config, diagram.getNextMessageNumber());
checkState(null == diagram.addMessage(msg));
// 3. Output the diagram
// See net.sourceforge.plantuml.SourceStringReader#generateImage
diagram.makeDiagramReady();
checkState(1 == diagram.getNbImages());
try (OutputStream os = new FileOutputStream(file)) {
ImageData imageData = diagram.exportDiagram(os, 0, new FileFormatOption(FileFormat.PNG));
System.out.println("generateFromApi: " + diagram.getDescription().getDescription());
}
}
private static void generateFromStringSource(File file) throws IOException {
String source = "@startuml\n";
source += "Bob -> Alice : hello\n";
source += "@enduml\n";
SourceStringReader reader = new SourceStringReader(source);
// Write the first image to "png"
String desc = reader.generateImage(file);
// Return a null string if no generation
System.out.println("generateFromStringSource: " + desc);
}
}
libraryDependencies += "net.sourceforge.plantuml" % "plantuml" % "8059"
libraryDependencies += "com.google.guava" % "guava" % "31.0.1-jre"
PlantUML java automation
<plugin>
<artifactId>plantuml-generator-maven-plugin</artifactId>
<groupId>de.elnarion.maven</groupId>
<version>1.1.2</version>
<executions>
<execution>
<id>generate-simple-diagram</id>
<goals>
<goal>generate</goal>
</goals>
<phase>generate-test-sources</phase>
<configuration>
<outputFilename>testdiagram1.txt</outputFilename>
<scanPackages>
<scanPackage>
some.package.to.process
</scanPackage>
</scanPackages>
</configuration>
</execution>
</executions>
</plugin>
Doxygen: \include test.dox in mainpage.dox adds as a text
\mainpage
# Introduction
\include{doc} introduction.dox
# Architecture
\include{doc} architecture.dox
This is an architecture description
This is an introduction about this package description
INPUT=mainpage.dox
EXTENSION_MAPPING = dox=md
QUIET=YES
EXAMPLE_PATH=.
-----------------------
\mainpage
# Introduction
\include{doc} introduction.dox
# Architecture
\include{doc} architecture.dox
This is an architecture description
This is an introduction about this package description
INPUT=mainpage.dox
EXTENSION_MAPPING = dox=md
QUIET=YES
EXAMPLE_PATH=.
-----------------------
\mainpage
# Introduction
\include{doc} introduction.dox
# Architecture
\include{doc} architecture.dox
This is an architecture description
This is an introduction about this package description
INPUT=mainpage.dox
EXTENSION_MAPPING = dox=md
QUIET=YES
EXAMPLE_PATH=.
-----------------------
\mainpage
# Introduction
\include{doc} introduction.dox
# Architecture
\include{doc} architecture.dox
This is an architecture description
This is an introduction about this package description
INPUT=mainpage.dox
EXTENSION_MAPPING = dox=md
QUIET=YES
EXAMPLE_PATH=.
Allow multi-line strings in XML/Javascript tooltip
<svg onload="init(evt)"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="453px" preserveAspectRatio="none" style="width:484px;height:453px;background:#FFFFFF;" version="1.1" viewBox="0 0 484 453" width="484px" zoomAndPan="magnify">
<defs>
<filter height="300%" id="f15vc1a2o1fe31" width="300%" x="-1" y="-1">
<feGaussianBlur result="blurOut" stdDeviation="2.0"/>
<feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/>
<feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/>
<feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/>
</filter>
</defs>
<style>
.tooltip{
font-family: Arial;
font-size: 13px;
fill:black;
}
.tooltip_bg{
fill: yellow;
opacity: 1;
}
</style>
<script type="text/ecmascript">
<![CDATA[
function init(evt){
if ( window.svgDocument == null ){
svgDocument = evt.target.ownerDocument;
}
tooltip = svgDocument.getElementById('tooltip');
tooltip_bg = svgDocument.getElementById('tooltip_bg');
}
function ShowTooltip(evt, mouseovertext){
var el = evt.target;
var bbox = el.getBBox();
tooltip.setAttributeNS(null,"x",bbox.x + bbox.width +11);
tooltip.setAttributeNS(null,"y",bbox.y + bbox.height+27);
const lines = mouseovertext.split('\n');
if (lines.length === 1)
tooltip.textContent = mouseovertext;
else {
tooltip.textContent = '';
lines.map((s, p) => { const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan'); tspan.textContent = s; tspan.setAttributeNS(null, 'x', bbox.x + bbox.width +11); tspan.setAttributeNS(null, 'dy', (p === 0 ? 0 : 15).toString()); return tspan; }).forEach(tspan => tooltip.appendChild(tspan));
}
tooltip.setAttributeNS(null,"visibility","visible");
const tooltipBBox = tooltip.getBBox();
tooltip_bg.setAttributeNS(null,"height",tooltipBBox.height+8);
tooltip_bg.setAttributeNS(null,"width",tooltipBBox.width+8);
tooltip_bg.setAttributeNS(null,"x",bbox.x + bbox.width +8);
tooltip_bg.setAttributeNS(null,"y",bbox.y + bbox.height+11);
tooltip_bg.setAttributeNS(null,"visibility","visibile");
}
function HideTooltip(evt){
tooltip.setAttributeNS(null,"visibility","hidden");
tooltip_bg.setAttributeNS(null,"visibility","hidden");
}
]]>
</script>
<g>
<rect fill="#FFFFFF" filter="url(#f15vc1a2o1fe31)" height="64.7031" style="stroke:#A80036;stroke-width:1.0;" width="10" x="208.5" y="118.3125"/>
<rect fill="#FFFFFF" filter="url(#f15vc1a2o1fe31)" height="64.7031" style="stroke:#A80036;stroke-width:1.0;" width="10" x="408.5" y="292.0703"/>
<line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="90" x2="90" y1="41.6094" y2="409.125"/>
<line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="213" x2="213" y1="41.6094" y2="409.125"/>
<line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="413" x2="413" y1="41.6094" y2="409.125"/>
<rect fill="#FEFECE" filter="url(#f15vc1a2o1fe31)" height="31.6094" style="stroke:#A80036;stroke-width:1.5;" width="106" x="35" y="5"/>
<text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="92" x="42" y="26.5332">testExportSVG</text>
<rect fill="#FEFECE" filter="url(#f15vc1a2o1fe31)" height="31.6094" style="stroke:#A80036;stroke-width:1.5;" width="106" x="35" y="408.125"/>
<text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="92" x="42" y="429.6582">testExportSVG</text>
<rect fill="#FEFECE" filter="url(#f15vc1a2o1fe31)" height="31.6094" style="stroke:#A80036;stroke-width:1.5;" width="113" x="155" y="5"/>
<text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="99" x="162" y="26.5332">Web API Step 1</text>
<rect fill="#FEFECE" filter="url(#f15vc1a2o1fe31)" height="31.6094" style="stroke:#A80036;stroke-width:1.5;" width="113" x="155" y="408.125"/>
<text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="99" x="162" y="429.6582">Web API Step 1</text>
<rect fill="#FEFECE" filter="url(#f15vc1a2o1fe31)" height="31.6094" style="stroke:#A80036;stroke-width:1.5;" width="113" x="355" y="5"/>
<text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="99" x="362" y="26.5332">Web API Step 2</text>
<rect fill="#FEFECE" filter="url(#f15vc1a2o1fe31)" height="31.6094" style="stroke:#A80036;stroke-width:1.5;" width="113" x="355" y="408.125"/>
<text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="99" x="362" y="429.6582">Web API Step 2</text>
<rect fill="#FFFFFF" filter="url(#f15vc1a2o1fe31)" height="64.7031" style="stroke:#A80036;stroke-width:1.0;" width="10" x="208.5" y="118.3125"/>
<rect fill="#FFFFFF" filter="url(#f15vc1a2o1fe31)" height="64.7031" style="stroke:#A80036;stroke-width:1.0;" width="10" x="408.5" y="292.0703"/>
<rect fill="#EEEEEE" filter="url(#f15vc1a2o1fe31)" height="3" style="stroke:#EEEEEE;stroke-width:1.0;" width="477" x="0" y="72.7852"/>
<line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="477" y1="72.7852" y2="72.7852"/>
<line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="477" y1="75.7852" y2="75.7852"/>
<rect fill="#EEEEEE" filter="url(#f15vc1a2o1fe31)" height="24.3516" style="stroke:#000000;stroke-width:2.0;" width="207" x="135" y="61.6094"/>
<text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="193" x="141" y="79.1045">step 1: Account.Account Credit</text>
<polygon fill="#A80036" points="196.5,114.3125,206.5,118.3125,196.5,122.3125,200.5,118.3125" style="stroke:#A80036;stroke-width:1.0;"/>
<line style="stroke:#A80036;stroke-width:1.0;" x1="90" x2="202.5" y1="118.3125" y2="118.3125"/>
<text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="7" x="97" y="113.4561">1</text>
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="79" x="108" y="113.4561">xecmPayload</text>
<rect fill="#FBFB77" filter="url(#f15vc1a2o1fe31)" height="24" style="stroke:#A80036;stroke-width:1.0;" width="80" x="5" y="131.3125"/>
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="72" x="9" y="148.8076">
<a onmousemove="ShowTooltip(evt, 'input = data;')" onmouseout="HideTooltip(evt)">
static data 1</a>
</text>
<polygon fill="#A80036" points="101,179.0156,91,183.0156,101,187.0156,97,183.0156" style="stroke:#A80036;stroke-width:1.0;"/>
<line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:2.0,2.0;" x1="95" x2="212.5" y1="183.0156" y2="183.0156"/>
<text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="7" x="107" y="178.1592">2</text>
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="29" x="118" y="178.1592">[200]</text>
<rect fill="#FBFB77" filter="url(#f15vc1a2o1fe31)" height="24" style="stroke:#A80036;stroke-width:1.0;" width="101" x="39" y="196.0156"/>
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="93" x="43" y="213.5107">
<a onmousemove="ShowTooltip(evt, 'otherVar ← other/path;\nsaveV ← /xml/path;')" onmouseout="HideTooltip(evt)">
validation data 1</a>
<a onmousemove="ShowTooltip(evt, 'otherVar ← other/path;\nsaveV ← /xml/path;')" onmouseout="HideTooltip(evt)">
validation data 1</a>
</text>
<rect fill="#EEEEEE" filter="url(#f15vc1a2o1fe31)" height="3" style="stroke:#EEEEEE;stroke-width:1.0;" width="477" x="0" y="246.543"/>
<line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="477" y1="246.543" y2="246.543"/>
<line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="477" y1="249.543" y2="249.543"/>
<rect fill="#EEEEEE" filter="url(#f15vc1a2o1fe31)" height="24.3516" style="stroke:#000000;stroke-width:2.0;" width="296" x="90.5" y="235.3672"/>
<text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="282" x="96.5" y="252.8623">step 2: Abstraction.loan_bundles_abstraction</text>
<polygon fill="#A80036" points="396.5,288.0703,406.5,292.0703,396.5,296.0703,400.5,292.0703" style="stroke:#A80036;stroke-width:1.0;"/>
<line style="stroke:#A80036;stroke-width:1.0;" x1="213.5" x2="402.5" y1="292.0703" y2="292.0703"/>
<text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="7" x="220.5" y="287.2139">3</text>
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="165" x="231.5" y="287.2139">create_loan_sanitywatercost</text>
<rect fill="#FBFB77" filter="url(#f15vc1a2o1fe31)" height="24" style="stroke:#A80036;stroke-width:1.0;" width="80" x="128" y="305.0703"/>
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="72" x="132" y="322.5654">
<a onmousemove="ShowTooltip(evt, 'some = data')" onmouseout="HideTooltip(evt)">
static data 2</a>
</text>
<polygon fill="#A80036" points="224.5,352.7734,214.5,356.7734,224.5,360.7734,220.5,356.7734" style="stroke:#A80036;stroke-width:1.0;"/>
<line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:2.0,2.0;" x1="218.5" x2="412.5" y1="356.7734" y2="356.7734"/>
<text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="7" x="230.5" y="351.917">4</text>
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="29" x="241.5" y="351.917">[204]</text>
<rect fill="#FBFB77" filter="url(#f15vc1a2o1fe31)" height="24" style="stroke:#A80036;stroke-width:1.0;" width="101" x="163" y="369.7734"/>
<text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="93" x="167" y="387.2686">
<a onmousemove="ShowTooltip(evt, 'saveJson ← json.path;\n')" onmouseout="HideTooltip(evt)">
validation data 2</a>
</text>
<!--MD5=[4d7fcf74e484c9aebaed7917263f6fd7]
@startuml
autonumber
==step 1: Account.Account Credit==
"testExportSVG"->"Web API Step 1": xecmPayload
rnote left "testExportSVG"
static data 1
endrnote
activate "Web API Step 1"
"testExportSVG" <- - "Web API Step 1": [200]
rnote over "testExportSVG"
validation data 1
endrnote
deactivate "Web API Step 1"
==step 2: Abstraction.loan_bundles_abstraction==
"Web API Step 1"->"Web API Step 2": create_loan_sanitywatercost
rnote left "Web API Step 1"
static data 2
endrnote
activate "Web API Step 2"
"Web API Step 1" <- - "Web API Step 2": [204]
rnote over "Web API Step 1"
validation data 2
endrnote
deactivate "Web API Step 2"
@enduml
PlantUML version 1.2021.8(Sat Jun 26 01:20:59 PDT 2021)
(GPL source distribution)
Java Runtime: Java(TM) SE Runtime Environment
JVM: Java HotSpot(TM) 64-Bit Server VM
Default Encoding: UTF-8
Language: en
Country: US
-->
</g>
<rect class="tooltip_bg" id="tooltip_bg" x="0" y="0" ry="2" width="55" height="21" visibility="hidden"/>
<text class="tooltip" id="tooltip" x="0" y="0" visibility="hidden">Tooltip</text>
</svg>
QUESTION
How to configure AsciidocFX with Path to PlantUML
Asked 2022-Apr-09 at 15:40I am using AsciidocFX version 1.7.4 to edit Asciidoc documents. When working on PlantUML diagrams and creating a syntax error, which is caused by using syntax that is not supported in older versions, I see the following message
PlantUML 1.2021.2
This version of PlantUML is 398 days old, so you should consider upgrading...
I have the following version installed on my system:
PlantUML version 1.2022.3 (Tue Mar 29 09:10:57 PDT 2022)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Obviously, AsciidocFX finds a different version. How can I configure AsciidocFX to use my latest locally install version? I went through the Settings dialogs as well as looked in the ~/.AsciidocFX-1.7.4 folder but could not find any clue.
ANSWER
Answered 2022-Apr-09 at 15:40planumtl consist of a single plantuml.jar file. You should find a plantuml-1.2021.2.jar
file in your installation folder, under lib
, delete it and replace it with your own version.
Community Discussions, Code Snippets contain sources that include Stack Exchange Network
No vulnerabilities reported
Save this library and start creating your kit
Explore Related Topics
Save this library and start creating your kit