Maintainer | Ivan.Miljenovic@gmail.com |
---|
If you are just using graphviz to create basic Dot graphs, then you probably want to use Data.GraphViz.Attributes rather than this module.
This module defines the various attributes that different parts of a Graphviz graph can have. These attributes are based on the documentation found at: http://graphviz.org/doc/info/attrs.html
For more information on usage, etc. please see that document.
A summary of known current constraints/limitations/differences:
- Note that for an edge, in Dot parlance if the edge goes from A to B, then A is the tail node and B is the head node (since A is at the tail end of the arrow).
-
ColorList
,DoubleList
andPointfList
are defined as actual lists (
needs a newtype for other reasons). All of these are assumed to be non-empty lists. Note that for theLayerList
Color
Attribute
for node values, only a single Color is valid; edges are allowed multiple colors with one spline/arrow per color in the list (but you must have at least oneColor
in the list). This might be changed in future. - Style is implemented as a list of
StyleItem
values; note that empty lists are not allowed. - A lot of values have a possible value of
none
. These now have custom constructors. In fact, most constructors have been expanded upon to give an idea of what they represent rather than using generic terms. -
PointF
andPoint
have been combined. The optional!
and third value for Point are also available. -
Rect
uses twoPoint
values to denote the lower-left and top-right corners. - The two
LabelLoc
attributes have been combined. -
SplineType
has been replaced with[
.Spline
] - Only polygon-based
Shape
s are available. - Not every
Attribute
is fully documented/described. However, all those which have specific allowed values should be covered. - Deprecated
Overlap
algorithms are not defined. - The global
Orientation
attribute is not defined, as it is difficult to distinguish from the node-basedOrientation
Attribute
; also, its behaviour is duplicated byRotate
. - The
charset
attribute is not available, as graphviz only supports UTF-8 encoding (as it is not currently feasible nor needed to also support Latin1 encoding).
- data Attribute
- = Damping Double
- | K Double
- | URL EscString
- | ArrowHead ArrowType
- | ArrowSize Double
- | ArrowTail ArrowType
- | Aspect AspectType
- | Bb Rect
- | BgColor Color
- | Center Bool
- | ClusterRank ClusterMode
- | ColorScheme ColorScheme
- | Color [Color]
- | Comment Text
- | Compound Bool
- | Concentrate Bool
- | Constraint Bool
- | Decorate Bool
- | DefaultDist Double
- | Dimen Int
- | Dim Int
- | Dir DirType
- | DirEdgeConstraints DEConstraints
- | Distortion Double
- | DPI Double
- | EdgeURL EscString
- | EdgeTarget EscString
- | EdgeTooltip EscString
- | Epsilon Double
- | ESep DPoint
- | FillColor Color
- | FixedSize Bool
- | FontColor Color
- | FontName Text
- | FontNames Text
- | FontPath Text
- | FontSize Double
- | Group Text
- | HeadURL EscString
- | HeadClip Bool
- | HeadLabel Label
- | HeadPort PortPos
- | HeadTarget EscString
- | HeadTooltip EscString
- | Height Double
- | ID Label
- | Image Text
- | ImageScale ScaleType
- | LabelURL EscString
- | LabelAngle Double
- | LabelDistance Double
- | LabelFloat Bool
- | LabelFontColor Color
- | LabelFontName Text
- | LabelFontSize Double
- | LabelJust Justification
- | LabelLoc VerticalPlacement
- | LabelTarget EscString
- | LabelTooltip EscString
- | Label Label
- | Landscape Bool
- | LayerSep LayerSep
- | Layers LayerList
- | Layer LayerRange
- | Layout Text
- | Len Double
- | LevelsGap Double
- | Levels Int
- | LHead Text
- | LPos Point
- | LTail Text
- | Margin DPoint
- | MaxIter Int
- | MCLimit Double
- | MinDist Double
- | MinLen Int
- | Model Model
- | Mode ModeType
- | Mosek Bool
- | NodeSep Double
- | NoJustify Bool
- | Normalize Bool
- | Nslimit1 Double
- | Nslimit Double
- | Ordering Text
- | Orientation Double
- | OutputOrder OutputMode
- | OverlapScaling Double
- | Overlap Overlap
- | PackMode PackMode
- | Pack Pack
- | Pad DPoint
- | PageDir PageDir
- | Page Point
- | PenColor Color
- | PenWidth Double
- | Peripheries Int
- | Pin Bool
- | Pos Pos
- | QuadTree QuadType
- | Quantum Double
- | RankDir RankDir
- | RankSep [Double]
- | Rank RankType
- | Ratio Ratios
- | Rects [Rect]
- | Regular Bool
- | ReMinCross Bool
- | RepulsiveForce Double
- | Root Root
- | Rotate Int
- | SameHead Text
- | SameTail Text
- | SamplePoints Int
- | SearchSize Int
- | Sep DPoint
- | ShapeFile Text
- | Shape Shape
- | ShowBoxes Int
- | Sides Int
- | Size Point
- | Skew Double
- | Smoothing SmoothType
- | SortV Word16
- | Splines EdgeType
- | Start StartType
- | StyleSheet Text
- | Style [StyleItem]
- | TailURL EscString
- | TailClip Bool
- | TailLabel Label
- | TailPort PortPos
- | TailTarget EscString
- | TailTooltip EscString
- | Target EscString
- | Tooltip EscString
- | TrueColor Bool
- | Vertices [Point]
- | ViewPort ViewPort
- | VoroMargin Double
- | Weight Double
- | Width Double
- | Z Double
- | UnknownAttribute AttributeName Text
- type Attributes = [Attribute]
- sameAttribute :: Attribute -> Attribute -> Bool
- defaultAttributeValue :: Attribute -> Maybe Attribute
- usedByGraphs :: Attribute -> Bool
- usedBySubGraphs :: Attribute -> Bool
- usedByClusters :: Attribute -> Bool
- usedByNodes :: Attribute -> Bool
- usedByEdges :: Attribute -> Bool
- validUnknown :: AttributeName -> Bool
- type AttributeName = Text
- type CustomAttribute = Attribute
- customAttribute :: AttributeName -> Text -> CustomAttribute
- isCustom :: Attribute -> Bool
- isSpecifiedCustom :: AttributeName -> Attribute -> Bool
- customValue :: CustomAttribute -> Text
- customName :: CustomAttribute -> AttributeName
- findCustoms :: Attributes -> ([CustomAttribute], Attributes)
- findSpecifiedCustom :: AttributeName -> Attributes -> Maybe (CustomAttribute, Attributes)
- deleteCustomAttributes :: Attributes -> Attributes
- deleteSpecifiedCustom :: AttributeName -> Attributes -> Attributes
- module Data.GraphViz.Attributes.Colors
- type EscString = Text
- data Label
- data VerticalPlacement
- module Data.GraphViz.Attributes.HTML
- type RecordFields = [RecordField]
- data RecordField
- data Rect = Rect Point Point
- data Justification
- data Shape
- = BoxShape
- | Polygon
- | Ellipse
- | Circle
- | PointShape
- | Egg
- | Triangle
- | PlainText
- | DiamondShape
- | Trapezium
- | Parallelogram
- | House
- | Pentagon
- | Hexagon
- | Septagon
- | Octagon
- | DoubleCircle
- | DoubleOctagon
- | TripleOctagon
- | InvTriangle
- | InvTrapezium
- | InvHouse
- | MDiamond
- | MSquare
- | MCircle
- | Note
- | Tab
- | Folder
- | Box3D
- | Component
- | Record
- | MRecord
- data ScaleType
- = UniformScale
- | NoScale
- | FillWidth
- | FillHeight
- | FillBoth
- data DirType
- data EdgeType
- = SplineEdges
- | LineEdges
- | NoEdges
- | PolyLine
- | CompoundEdge
- newtype PortName = PN {}
- data PortPos
- data CompassPoint
- newtype ArrowType = AType [(ArrowModifier, ArrowShape)]
- data ArrowShape
- data ArrowModifier = ArrMod {}
- data ArrowFill
- = OpenArrow
- | FilledArrow
- data ArrowSide
- noMods :: ArrowModifier
- openMod :: ArrowModifier
- data Point = Point {}
- createPoint :: Double -> Double -> Point
- data Pos
- data Spline = Spline (Maybe Point) (Maybe Point) [Point]
- data DPoint
- data AspectType
- data ClusterMode
- data Model
- data Overlap
- data Root
- = IsCentral
- | NotCentral
- | NodeName Text
- data OutputMode
- = BreadthFirst
- | NodesFirst
- | EdgesFirst
- data Pack
- = DoPack
- | DontPack
- | PackMargin Int
- data PackMode
- data PageDir
- data QuadType
- data RankType
- = SameRank
- | MinRank
- | SourceRank
- | MaxRank
- | SinkRank
- data RankDir
- = FromTop
- | FromLeft
- | FromBottom
- | FromRight
- data StartType
- data ViewPort = VP {}
- data FocusType
- data Ratios
- = AspectRatio Double
- | FillRatio
- | CompressRatio
- | ExpandRatio
- | AutoRatio
- data ModeType
- data DEConstraints
- newtype LayerSep = LSep Text
- data LayerRange
- data LayerID
- newtype LayerList = LL [LayerID]
- data SmoothType
- data STStyle
- = RegularStyle
- | SelfStyle
- | RandomStyle
- data StyleItem = SItem StyleName [Text]
- data StyleName
The actual Dot attributes.
These attributes have been implemented in a permissive manner: that is, rather than split them up based on which type of value they are allowed, they have all been included in the one data type, with functions to determine if they are indeed valid for what they're being applied to.
To interpret the Valid for listings:
G
- Valid for Graphs.
C
- Valid for Clusters.
S
- Valid for Sub-Graphs (and also Clusters).
N
- Valid for Nodes.
E
- Valid for Edges.
The Default listings are those that the various Graphviz commands
use if that Attribute
isn't specified (in cases where this is
none, this is equivalent to a Nothing
value; that is, no value
is used). The Parsing Default listings represent what value is
used (i.e. corresponds to True
) when the Attribute
name is
listed on its own in Dot source code.
Please note that the UnknownAttribute
Attribute
is defined
primarily for backwards-compatibility purposes. It is possible to use
it directly for custom purposes; for more information, please see
CustomAttribute
. The deleteCustomAttributes
can be used to delete
these values.
Attributes are used to customise the layout and design of Dot graphs. Care must be taken to ensure that the attribute you use is valid, as not all attributes can be used everywhere.
Damping Double | Valid for: G; Default: |
K Double | Valid for: GC; Default: |
URL EscString | Valid for: ENGC; Default: none; Notes: svg, postscript, map only |
ArrowHead ArrowType | Valid for: E; Default: |
ArrowSize Double | Valid for: E; Default: |
ArrowTail ArrowType | Valid for: E; Default: |
Aspect AspectType | Valid for: G; Notes: dot only |
Bb Rect | Valid for: G; Notes: write only |
BgColor Color | Valid for: GC; Default: |
Center Bool | |
ClusterRank ClusterMode | Valid for: G; Default: |
ColorScheme ColorScheme | Valid for: ENCG; Default: |
Color [Color] | |
Comment Text | Valid for: ENG; Default: |
Compound Bool | Valid for: G; Default: |
Concentrate Bool | |
Constraint Bool | Valid for: E; Default: |
Decorate Bool | |
DefaultDist Double | Valid for: G; Default: |
Dimen Int | Valid for: G; Default: |
Dim Int | Valid for: G; Default: |
Dir DirType | Valid for: E; Default: |
DirEdgeConstraints DEConstraints | Valid for: G; Default: |
Distortion Double | Valid for: N; Default: |
DPI Double | Valid for: G; Default: |
EdgeURL EscString | Valid for: E; Default: |
EdgeTarget EscString | Valid for: E; Default: none; Notes: svg, map only |
EdgeTooltip EscString | Valid for: E; Default: |
Epsilon Double | Valid for: G; Default: |
ESep DPoint | Valid for: G; Default: |
FillColor Color | Valid for: NC; Default: |
FixedSize Bool | |
FontColor Color | |
FontName Text | Valid for: ENGC; Default: |
FontNames Text | Valid for: G; Default: |
FontPath Text | Valid for: G; Default: system dependent |
FontSize Double | Valid for: ENGC; Default: |
Group Text | Valid for: N; Default: |
HeadURL EscString | Valid for: E; Default: |
HeadClip Bool | |
HeadLabel Label | Valid for: E; Default: |
HeadPort PortPos | Valid for: E; Default: |
HeadTarget EscString | Valid for: E; Default: none; Notes: svg, map only |
HeadTooltip EscString | Valid for: E; Default: |
Height Double | Valid for: N; Default: |
ID Label | Valid for: GNE; Default: |
Image Text | Valid for: N; Default: |
ImageScale ScaleType | Valid for: N; Default: |
LabelURL EscString | Valid for: E; Default: |
LabelAngle Double | Valid for: E; Default: |
LabelDistance Double | Valid for: E; Default: |
LabelFloat Bool | |
LabelFontColor Color | |
LabelFontName Text | Valid for: E; Default: |
LabelFontSize Double | Valid for: E; Default: |
LabelJust Justification | Valid for: GC; Default: |
LabelLoc VerticalPlacement | Valid for: GCN; Default: |
LabelTarget EscString | Valid for: E; Default: none; Notes: svg, map only |
LabelTooltip EscString | Valid for: E; Default: |
Label Label | Valid for: ENGC; Default: |
Landscape Bool | |
LayerSep LayerSep | Valid for: G; Default: |
Layers LayerList | Valid for: G; Default: |
Layer LayerRange | Valid for: EN |
Layout Text | Valid for: G; Default: |
Len Double | Valid for: E; Default: |
LevelsGap Double | Valid for: G; Default: |
Levels Int | Valid for: G; Default: |
LHead Text | Valid for: E; Default: |
LPos Point | Valid for: EGC; Notes: write only |
LTail Text | Valid for: E; Default: |
Margin DPoint | Valid for: NG; Default: device dependent |
MaxIter Int | Valid for: G; Default: |
MCLimit Double | Valid for: G; Default: |
MinDist Double | Valid for: G; Default: |
MinLen Int | Valid for: E; Default: |
Model Model | Valid for: G; Default: |
Mode ModeType | Valid for: G; Default: |
Mosek Bool | Valid for: G; Default: |
NodeSep Double | Valid for: G; Default: |
NoJustify Bool | |
Normalize Bool | Valid for: G; Default: |
Nslimit1 Double | Valid for: G; Notes: dot only |
Nslimit Double | Valid for: G; Notes: dot only |
Ordering Text | Valid for: G; Default: |
Orientation Double | Valid for: N; Default: |
OutputOrder OutputMode | Valid for: G; Default: |
OverlapScaling Double | Valid for: G; Default: |
Overlap Overlap | Valid for: G; Default: |
PackMode PackMode | Valid for: G; Default: |
Pack Pack | Valid for: G; Default: |
Pad DPoint | Valid for: G; Default: |
PageDir PageDir | Valid for: G; Default: |
Page Point | Valid for: G |
PenColor Color | |
PenWidth Double | Valid for: CNE; Default: |
Peripheries Int | Valid for: NC; Default: shape default (nodes), |
Pin Bool | Valid for: N; Default: |
Pos Pos | Valid for: EN |
QuadTree QuadType | Valid for: G; Default: |
Quantum Double | Valid for: G; Default: |
RankDir RankDir | Valid for: G; Default: |
RankSep [Double] | Valid for: G; Default: |
Rank RankType | Valid for: S; Notes: dot only |
Ratio Ratios | Valid for: G |
Rects [Rect] | Valid for: N; Notes: write only |
Regular Bool | |
ReMinCross Bool | Valid for: G; Default: |
RepulsiveForce Double | Valid for: G; Default: |
Root Root | Valid for: GN; Default: |
Rotate Int | Valid for: G; Default: |
SameHead Text | Valid for: E; Default: |
SameTail Text | Valid for: E; Default: |
SamplePoints Int | Valid for: N; Default: |
SearchSize Int | Valid for: G; Default: |
Sep DPoint | Valid for: G; Default: |
ShapeFile Text | Valid for: N; Default: |
Shape Shape | Valid for: N; Default: |
ShowBoxes Int | Valid for: ENG; Default: |
Sides Int | Valid for: N; Default: |
Size Point | Valid for: G |
Skew Double | Valid for: N; Default: |
Smoothing SmoothType | Valid for: G; Default: |
SortV Word16 | Valid for: GCN; Default: |
Splines EdgeType | Valid for: G; Parsing Default: |
Start StartType | Valid for: G; Notes: fdp, neato only |
StyleSheet Text | Valid for: G; Default: |
Style [StyleItem] | Valid for: ENC |
TailURL EscString | Valid for: E; Default: |
TailClip Bool | |
TailLabel Label | Valid for: E; Default: |
TailPort PortPos | Valid for: E; Default: |
TailTarget EscString | Valid for: E; Default: none; Notes: svg, map only |
TailTooltip EscString | Valid for: E; Default: |
Target EscString | Valid for: ENGC; Default: none; Notes: svg, map only |
Tooltip EscString | Valid for: NEC; Default: |
TrueColor Bool | Valid for: G; Parsing Default: |
Vertices [Point] | Valid for: N; Notes: write only |
ViewPort ViewPort | Valid for: G; Default: none |
VoroMargin Double | Valid for: G; Default: |
Weight Double | Valid for: E; Default: |
Width Double | Valid for: N; Default: |
Z Double | Valid for: N; Default: |
UnknownAttribute AttributeName Text | Valid for: Assumed valid for all; the fields are |
type Attributes = [Attribute]Source
sameAttribute :: Attribute -> Attribute -> BoolSource
Determine if two Attributes
are the same type of Attribute
.
defaultAttributeValue :: Attribute -> Maybe AttributeSource
Return the default value for a specific Attribute
if possible; graphcluster values are preferred over nodeedge values.
Validity functions on Attribute
values.
usedByGraphs :: Attribute -> BoolSource
Determine if this Attribute
is valid for use with Graphs.
usedBySubGraphs :: Attribute -> BoolSource
Determine if this Attribute
is valid for use with SubGraphs.
usedByClusters :: Attribute -> BoolSource
Determine if this Attribute
is valid for use with Clusters.
usedByNodes :: Attribute -> BoolSource
Determine if this Attribute
is valid for use with Nodes.
usedByEdges :: Attribute -> BoolSource
Determine if this Attribute
is valid for use with Edges.
validUnknown :: AttributeName -> BoolSource
Determine if the provided Text
value is a valid name for an UnknownAttribute
.
Custom attributes.
type AttributeName = TextSource
The name for an UnknownAttribute; must satisfy validUnknown
.
type CustomAttribute = AttributeSource
If performing any custom pre-/post-processing on Dot code, you
may wish to utilise some custom Attributes
. These are wrappers
around the UnknownAttribute
constructor (and thus CustomAttribute
is just an alias for Attribute
).
You should ensure that validUnknown
is True
for any potential
custom attribute name.
customAttribute :: AttributeName -> Text -> CustomAttributeSource
Create a custom attribute.
customValue :: CustomAttribute -> TextSource
The value of a custom attribute. Will throw a
GraphvizException
if the provided Attribute
isn't a custom
one.
customName :: CustomAttribute -> AttributeNameSource
The name of a custom attribute. Will throw a
GraphvizException
if the provided Attribute
isn't a custom
one.
findCustoms :: Attributes -> ([CustomAttribute], Attributes)Source
Returns all custom attributes and the list of non-custom Attributes.
findSpecifiedCustom :: AttributeName -> Attributes -> Maybe (CustomAttribute, Attributes)Source
Find the (first instance of the) specified custom attribute and returns it along with all other Attributes.
deleteCustomAttributes :: Attributes -> AttributesSource
Delete all custom attributes (actually, this will delete all
UnknownAttribute
values; as such it can also be used to remove
legacy attributes).
deleteSpecifiedCustom :: AttributeName -> Attributes -> AttributesSource
Removes all instances of the specified custom attribute.
Value types for Attribute
s.
Labels
Some Attribute
s (mainly label-like ones) take a String
argument
that allows for extra escape codes. This library doesn't do any
extra checks or special parsing for these escape codes, but usage
of EscString
rather than Text
indicates that the Graphviz
tools will recognise these extra escape codes for these
Attribute
s.
The extra escape codes include (note that these are all Strings):
\N
- Replace with the name of the node (for Node
Attribute
s). \G
- Replace with the name of the graph (for Node
Attribute
s) or the name of the graph or cluster, whichever is applicable (for Graph, Cluster and EdgeAttribute
s). \E
- Replace with the name of the edge, formed by the two
adjoining nodes and the edge type (for Edge
Attribute
s). \T
- Replace with the name of the tail node (for Edge
Attribute
s). \H
- Replace with the name of the head node (for Edge
Attribute
s). \L
- Replace with the object's label (for all
Attribute
s).
Also, if the Attribute
in question is Label
, HeadLabel
or
TailLabel
, then \n
, \l
and \r
split the label into lines
centered, left-justified and right-justified respectively.
StrLabel EscString | |
HtmlLabel HtmlLabel | If |
RecordLabel RecordFields | For nodes only; requires
either |
data VerticalPlacement Source
Types representing the Dot grammar for records.
type RecordFields = [RecordField]Source
A RecordFields value should never be empty.
data RecordField Source
Specifies the sub-values of a record-based label. By default,
the cells are laid out horizontally; use FlipFields
to change
the orientation of the fields (can be applied recursively). To
change the default orientation, use RankDir
.
LabelledTarget PortName EscString | |
PortName PortName | Will result in no label for that cell. |
FieldLabel EscString | |
FlipFields RecordFields |
Should only have 2D points (i.e. created with createPoint
).
data Justification Source
Nodes
BoxShape | Has synonyms of rect and rectangle. |
Polygon | |
Ellipse | |
Circle | |
PointShape | |
Egg | |
Triangle | |
PlainText | Has synonym of none. |
DiamondShape | |
Trapezium | |
Parallelogram | |
House | |
Pentagon | |
Hexagon | |
Septagon | |
Octagon | |
DoubleCircle | |
DoubleOctagon | |
TripleOctagon | |
InvTriangle | |
InvTrapezium | |
InvHouse | |
MDiamond | |
MSquare | |
MCircle | |
Note | |
Tab | |
Folder | |
Box3D | |
Component | |
Record | Must specify the record shape with a |
MRecord | Must specify the record shape with a |
Edges
Specify where to place arrow heads on an edge.
Controls how (and if) edges are represented.
SplineEdges | |
LineEdges | |
NoEdges | |
PolyLine | |
CompoundEdge | fdp only |
Modifying where edges point
Specifies a name for ports (used also in record-based and
HTML-like labels). Note that it is not valid for a PortName
value to contain a colon (:
) character; it is assumed that it
doesn't.
Eq PortName | |
Ord PortName | |
Read PortName | |
Show PortName | |
ParseDot PortName | |
PrintDot PortName | |
Labellable PortName | A shorter variant than using |
Labellable (PortName, EscString) | A shorter variant than using |
data CompassPoint Source
Arrows
Dot has a basic grammar of arrow shapes which allows usage of
up to 1,544,761 different shapes from 9 different basic
ArrowShape
s. Note that whilst an explicit list is used in the
definition of ArrowType
, there must be at least one tuple and a
maximum of 4 (since that is what is required by Dot). For more
information, see: http://graphviz.org/doc/info/arrows.html
The 19 basic arrows shown on the overall attributes page have been defined below as a convenience. Parsing of the 5 backward-compatible special cases is also supported.
AType [(ArrowModifier, ArrowShape)] |
data ArrowShape Source
data ArrowModifier Source
What modifications to apply to an ArrowShape
.
Represents which side (when looking towards the node the arrow is pointing to) is drawn.
ArrowModifier
values
Apply no modifications to an ArrowShape
.
Positioning
createPoint :: Double -> Double -> PointSource
Create a point with only x
and y
values.
The number of points in the list must be equivalent to 1 mod 3; note that this is not checked.
Either a Double
or a (2D) Point
(i.e. created with
createPoint
).
Layout
data AspectType Source
data ClusterMode Source
KeepOverlaps | |
RemoveOverlaps | |
ScaleOverlaps | |
ScaleXYOverlaps | |
PrismOverlap (Maybe Word16) | Only when sfdp is
available, |
CompressOverlap | |
VpscOverlap | |
IpsepOverlap | Only when |
Specify the root node either as a Node attribute or a Graph attribute.
IsCentral | For Nodes only |
NotCentral | For Nodes only |
NodeName Text | For Graphs only |
data OutputMode Source
DoPack | |
DontPack | |
PackMargin Int | If non-negative, then packs; otherwise doesn't. |
Upper-case first character is major order; lower-case second character is minor order.
For use with ViewPort
.
Modes
data DEConstraints Source
Only when mode ==
.
IpSep
Layers
data LayerRange Source
You should not have any layer separator characters for the
LRName
option, as they won't be parseable.
A list of layer names. The names should all be LRName
values,
and when printed will use an arbitrary character from
defLayerSep
.
Stylistic
data SmoothType Source