I am using PlantUML to make simple class diagrams and the tool is awesome, but I couldn't find any way to align classes with each other except putting them into packages or using relationships like Alice -left-* Bob. What I need is something like:
#startuml
class Bob
class Alice
class Dan
**Dan aligned Alice: horizontally**
'or using a grid?
**Bob at grid (2, 3)**
#enduml
Is there a way?
UPDATES Aug.08.2019
From Rotsiser's comment, by combining changing the length of lines with together keyword, it can align elements
#startuml
class A
A ..> B
C ---> B
D ...> B
together {
class E
class F
class G
}
E ----> B
#enduml
OUTDATED
You are able to align elements by changing the number of line's character, such as '-', '.', and so on.
#startuml
class A
A ..> B
C ---> B
D ...> B
E ----> B
F ----> B
G ----> B
#enduml
Using a -[hidden] relation can do the job :
#startuml
class Bob
class Alice
class Dan
class Foo
class Bar
class Foobar
Bob -[hidden] Alice
Bar -[hidden] Foobar
#enduml
No, there's no way to do that, sorry :( The idea behind PlantUML is that you should not care too much about the layout rendering.
Actually, early versions of PlantUML use to align classes, but it was an issue: When there were many unrelated classes, diagrams tended to be very large and very thin. So a patch was added to organize classes in a square.
How many classes do you want to have in your diagram? Sure it would be possible to disable the organizing patch for e.g. 3 to 5 classes. You could post a suggestion to the forum to see what other users think about it.
Here is a solution.
The documentation:
"It is also possible to change arrow direction by adding left, right, up or down keywords inside the arrow:"
#startuml
foo -left-> dummyLeft
foo -right-> dummyRight
foo -up-> dummyUp
foo -down-> dummyDown
#enduml
To your question:
#startuml
class Bob
class Alice
class Dan
Alice -left[hidden]-> Bob
Alice -right[hidden]-> Dan
#enduml
It may also be useful:
#startuml
class Bob
class Alice
class Dan
Bob -right-|> Alice
Alice -right-> Dan
interface Friend
Dan -up..> Friend
interface Person
Friend -left-> Person
interface Object
Person -down-> Object
interface Native
Object -right-> Native
#enduml
You don't need a hidden package, use the together keyword:
together {
class A
class B
}
A cleaner approach is to put them in a hidden package, which is more logical.
#startuml
skinparam shadowing false
skinparam package<<Layout>> {
borderColor Transparent
backgroundColor Transparent
fontColor Transparent
stereotypeFontColor Transparent
}
package x <<Layout>>{
class A
class B
}
A .. D
B .. C
C .. D
A1 .. D1
B1 .. C1
C1 .. D1
#end
Related
I'm struggling to understand the multiplicity of a relation.
In general how should one interpret this
is this every entity of type P has between a and b entities of type C or between x and y or something else. All explanations I've found so for only adres the cases a,x = 0,1 and b,y = *
It's vice versa. P has x..y entities of type C in access and C has a..b of P.
As a side note: the multiplicity labels should not be placed to hide parts of the association.
Every Association contains two independent statements:
Every instance of P is linked to x..y instances of C
Every instance of C is linked to a..b instances of P
Being linked could mean, that P or C have an attribute of type C or P. This is the most common incarnation of a link, but UML does not prescribe this.
I want to represent the following case using UML class diagram:
a class A that has some elements of C
a class B that is a subclass of A that contain 1 element of D that is subclass of C
Something like:
Example
Basically (in my mind), the class A has a collection of C but the subclass B only allows (at maximum) one element in that collection that should be instance of D.
What is the best way of representing it?
To change (limit) a cardinality or to specialise the type of element in a subclass you have to use a "redefines" constraint.
In your case your if your attribute in class A is
anAttribute:C[*]
Then in class B you'll have
anAttribute:D[0..1] {redefines anAttribute}
Of course you can use the same on an attribute shown as association (like in your diagram), then just add {redefines anAttribute} near the end of association (and of course association ends should both be named anAttribute then).
How would I go about showing that class A inherits a vector of pointers to Class B? Would I have an inheritance arrowhead to Vector, or to Class B?
There is no such thing as "class A inherits some resource to class B". Either class B inherits from class A - in this case B specializes A (or, alternatively, A generalizes B); or class A and class B share a resource - in this case it's called aggregation.
I can't decide how to show constant class properties in Uml Diagram. Can you suggest me how to do it?
I would do it like this:
CONSTANT_NAME : constant_type = value
E. g.:
PI : double = 3.1415
<< enumeration>> E1 | .RED .GREEN .BLUE |
I have the above as an enumeration class in a UML diagram. I associate it with another class say House. I now need a method on House say +getColor() which returns a color from the above enumeration.
How would I depict this in UML?
would it be like : +getColor(): E1 ?
Yes, your suggestion is right and depending on the level of detail, you could also add dependency from House to E1.