mirror of
https://github.com/octoleo/plantuml.git
synced 2024-12-22 10:59:01 +00:00
fix: improve smetana support
https://github.com/plantuml/plantuml/issues/1348
This commit is contained in:
parent
897a4736bc
commit
cdec3380ec
@ -61,10 +61,10 @@ final public class ST_Agedge_s extends ST_Agobj_s {
|
|||||||
|
|
||||||
public String NAME;
|
public String NAME;
|
||||||
|
|
||||||
@Override
|
// @Override
|
||||||
public String toString() {
|
// public String toString() {
|
||||||
return NAME;
|
// return NAME;
|
||||||
}
|
// }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void ___(__struct__ arg) {
|
public void ___(__struct__ arg) {
|
||||||
|
@ -59,14 +59,14 @@ final public class ST_Agnode_s extends ST_Agobj_s {
|
|||||||
|
|
||||||
public String NAME;
|
public String NAME;
|
||||||
|
|
||||||
@Override
|
// @Override
|
||||||
public String toString() {
|
// public String toString() {
|
||||||
try {
|
// try {
|
||||||
return NAME + " rank=" + ND_rank(this) + " order=" + ND_order(this);
|
// return NAME + " rank=" + ND_rank(this) + " order=" + ND_order(this);
|
||||||
} catch (Exception e) {
|
// } catch (Exception e) {
|
||||||
return NAME;
|
// return NAME;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void ___(__struct__ arg) {
|
public void ___(__struct__ arg) {
|
||||||
|
@ -68,10 +68,10 @@ final public class ST_Agraph_s extends ST_Agobj_s {
|
|||||||
public String NAME;
|
public String NAME;
|
||||||
private static int CPT = 0;
|
private static int CPT = 0;
|
||||||
|
|
||||||
@Override
|
// @Override
|
||||||
public String toString() {
|
// public String toString() {
|
||||||
return super.toString() + " " + NAME;
|
// return super.toString() + " " + NAME;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public ST_Agraph_s() {
|
public ST_Agraph_s() {
|
||||||
this.NAME = "G" + CPT;
|
this.NAME = "G" + CPT;
|
||||||
|
@ -541,4 +541,8 @@ public class Link extends WithLinkType implements Hideable, Removeable {
|
|||||||
return getLinkArg().getVisibilityModifier();
|
return getLinkArg().getVisibilityModifier();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final boolean isOpale() {
|
||||||
|
return opale;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,7 @@ import java.util.Collection;
|
|||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
import java.util.concurrent.locks.Lock;
|
import java.util.concurrent.locks.Lock;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
@ -100,6 +101,7 @@ import net.sourceforge.plantuml.svek.GeneralImageBuilder;
|
|||||||
import net.sourceforge.plantuml.svek.GraphvizCrash;
|
import net.sourceforge.plantuml.svek.GraphvizCrash;
|
||||||
import net.sourceforge.plantuml.svek.IEntityImage;
|
import net.sourceforge.plantuml.svek.IEntityImage;
|
||||||
import net.sourceforge.plantuml.svek.SvekNode;
|
import net.sourceforge.plantuml.svek.SvekNode;
|
||||||
|
import net.sourceforge.plantuml.svek.image.EntityImageNote;
|
||||||
import net.sourceforge.plantuml.svek.image.EntityImageNoteLink;
|
import net.sourceforge.plantuml.svek.image.EntityImageNoteLink;
|
||||||
import net.sourceforge.plantuml.utils.Position;
|
import net.sourceforge.plantuml.utils.Position;
|
||||||
import smetana.core.CString;
|
import smetana.core.CString;
|
||||||
@ -117,6 +119,7 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
private final Map<Entity, ST_Agnode_s> nodes = new LinkedHashMap<Entity, ST_Agnode_s>();
|
private final Map<Entity, ST_Agnode_s> nodes = new LinkedHashMap<Entity, ST_Agnode_s>();
|
||||||
private final Map<Entity, ST_Agnode_s> coreNodes = new LinkedHashMap<Entity, ST_Agnode_s>();
|
private final Map<Entity, ST_Agnode_s> coreNodes = new LinkedHashMap<Entity, ST_Agnode_s>();
|
||||||
private final Map<Link, ST_Agedge_s> edges = new LinkedHashMap<Link, ST_Agedge_s>();
|
private final Map<Link, ST_Agedge_s> edges = new LinkedHashMap<Link, ST_Agedge_s>();
|
||||||
|
private final Map<Link, SmetanaPath> smetanaPathes = new LinkedHashMap<Link, SmetanaPath>();
|
||||||
private final Map<Entity, ST_Agraph_s> clusters = new LinkedHashMap<Entity, ST_Agraph_s>();
|
private final Map<Entity, ST_Agraph_s> clusters = new LinkedHashMap<Entity, ST_Agraph_s>();
|
||||||
|
|
||||||
private final DotStringFactory dotStringFactory;
|
private final DotStringFactory dotStringFactory;
|
||||||
@ -155,8 +158,22 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
|
|
||||||
|
smetanaPathes.clear();
|
||||||
|
|
||||||
ug = ug.apply(new UTranslate(6, 6 - minMax.getMinY()));
|
ug = ug.apply(new UTranslate(6, 6 - minMax.getMinY()));
|
||||||
|
|
||||||
|
for (Map.Entry<Link, ST_Agedge_s> ent : edges.entrySet()) {
|
||||||
|
final Link link = ent.getKey();
|
||||||
|
if (link.isInvis())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
final ST_Agedge_s edge = ent.getValue();
|
||||||
|
final SmetanaPath smetanaPath = new SmetanaPath(link, edge, ymirror, diagram, getLabel(link),
|
||||||
|
getQuantifier(link, 1), getQuantifier(link, 2), dotStringFactory.getBibliotekon());
|
||||||
|
smetanaPathes.put(link, smetanaPath);
|
||||||
|
}
|
||||||
|
|
||||||
for (Map.Entry<Entity, ST_Agraph_s> ent : clusters.entrySet())
|
for (Map.Entry<Entity, ST_Agraph_s> ent : clusters.entrySet())
|
||||||
drawGroup(ug, ymirror, ent.getKey(), ent.getValue());
|
drawGroup(ug, ymirror, ent.getKey(), ent.getValue());
|
||||||
|
|
||||||
@ -166,19 +183,16 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
final XPoint2D corner = getCorner(agnode);
|
final XPoint2D corner = getCorner(agnode);
|
||||||
|
|
||||||
final SvekNode node = dotStringFactory.getBibliotekon().getNode(leaf);
|
final SvekNode node = dotStringFactory.getBibliotekon().getNode(leaf);
|
||||||
|
node.resetMoveSvek();
|
||||||
|
node.moveSvek(corner.getX(), corner.getY());
|
||||||
final IEntityImage image = node.getImage();
|
final IEntityImage image = node.getImage();
|
||||||
image.drawU(ug.apply(UTranslate.point(corner)));
|
image.drawU(ug.apply(UTranslate.point(corner)));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Map.Entry<Link, ST_Agedge_s> ent : edges.entrySet()) {
|
for (Entry<Link, SmetanaPath> ent : smetanaPathes.entrySet())
|
||||||
final Link link = ent.getKey();
|
if (ent.getKey().isOpale() == false)
|
||||||
if (link.isInvis())
|
ent.getValue().drawU(ug);
|
||||||
continue;
|
|
||||||
|
|
||||||
final ST_Agedge_s edge = ent.getValue();
|
|
||||||
new SmetanaPath(link, edge, ymirror, diagram, getLabel(link), getQuantifier(link, 1),
|
|
||||||
getQuantifier(link, 2), dotStringFactory.getBibliotekon()).drawU(ug);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public XDimension2D calculateDimension(StringBounder stringBounder) {
|
public XDimension2D calculateDimension(StringBounder stringBounder) {
|
||||||
@ -205,6 +219,59 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
printAllSubgroups(diagram.getRootGroup());
|
printAllSubgroups(diagram.getRootGroup());
|
||||||
printEntities(getUnpackagedEntities());
|
printEntities(getUnpackagedEntities());
|
||||||
|
|
||||||
|
for (Link link : diagram.getLinks()) {
|
||||||
|
if (link.isRemoved())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (isOpalisable(link.getEntity1())) {
|
||||||
|
final SvekNode node = dotStringFactory.getBibliotekon().getNode(link.getEntity1());
|
||||||
|
final SvekNode other = dotStringFactory.getBibliotekon().getNode(link.getEntity2());
|
||||||
|
if (other != null) {
|
||||||
|
((EntityImageNote) node.getImage()).setOpaleLink(link, node, other, smetanaPathes);
|
||||||
|
link.setOpale(true);
|
||||||
|
}
|
||||||
|
} else if (isOpalisable(link.getEntity2())) {
|
||||||
|
final SvekNode node = dotStringFactory.getBibliotekon().getNode(link.getEntity2());
|
||||||
|
final SvekNode other = dotStringFactory.getBibliotekon().getNode(link.getEntity1());
|
||||||
|
if (other != null) {
|
||||||
|
((EntityImageNote) node.getImage()).setOpaleLink(link, node, other, smetanaPathes);
|
||||||
|
link.setOpale(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Duplicate GeneralImageBuilder
|
||||||
|
private boolean isOpalisable(Entity entity) {
|
||||||
|
if (entity.isGroup())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (entity.getLeafType() != LeafType.NOTE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
final Link single = onlyOneLink(entity);
|
||||||
|
if (single == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return single.getOther(entity).getLeafType() != LeafType.NOTE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Duplicate GeneralImageBuilder
|
||||||
|
private Link onlyOneLink(Entity ent) {
|
||||||
|
Link single = null;
|
||||||
|
for (Link link : diagram.getLinks()) {
|
||||||
|
if (link.isInvis())
|
||||||
|
continue;
|
||||||
|
if (link.contains(ent) == false)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (single != null)
|
||||||
|
return null;
|
||||||
|
single = link;
|
||||||
|
}
|
||||||
|
return single;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawGroup(UGraphic ug, YMirror ymirror, Entity group, ST_Agraph_s gr) {
|
private void drawGroup(UGraphic ug, YMirror ymirror, Entity group, ST_Agraph_s gr) {
|
||||||
@ -240,7 +307,6 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
|
|
||||||
if (diagram.isEmpty(g) && g.getGroupType() == GroupType.PACKAGE) {
|
if (diagram.isEmpty(g) && g.getGroupType() == GroupType.PACKAGE) {
|
||||||
g.muteToType(LeafType.EMPTY_PACKAGE);
|
g.muteToType(LeafType.EMPTY_PACKAGE);
|
||||||
printEntityNew(g);
|
|
||||||
} else {
|
} else {
|
||||||
printSingleGroup(g);
|
printSingleGroup(g);
|
||||||
}
|
}
|
||||||
@ -307,7 +373,7 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
System.err.println("CANNOT FIND NODE");
|
System.err.println("CANNOT FIND NODE");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// System.err.println("exportEntity " + leaf);
|
System.err.println("exportEntity " + leaf);
|
||||||
final ST_Agnode_s agnode = agnode(zz, cluster, new CString(node.getUid()), true);
|
final ST_Agnode_s agnode = agnode(zz, cluster, new CString(node.getUid()), true);
|
||||||
agsafeset(zz, agnode, new CString("shape"), new CString("box"), new CString(""));
|
agsafeset(zz, agnode, new CString("shape"), new CString("box"), new CString(""));
|
||||||
final XDimension2D dim = getDim(node);
|
final XDimension2D dim = getDim(node);
|
||||||
@ -337,19 +403,6 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// private void printCluster(Globals zz, ST_Agraph_s g, Cluster cluster) {
|
|
||||||
// for (SvekNode node : cluster.getNodes()) {
|
|
||||||
// final ST_Agnode_s agnode = agnode(zz, g, new CString(node.getUid()), true);
|
|
||||||
// agsafeset(zz, agnode, new CString("shape"), new CString("box"), new CString(""));
|
|
||||||
// final String width = "" + (node.getWidth() / 72);
|
|
||||||
// final String height = "" + (node.getHeight() / 72);
|
|
||||||
// agsafeset(zz, agnode, new CString("width"), new CString(width), new CString(""));
|
|
||||||
// agsafeset(zz, agnode, new CString("height"), new CString(height), new CString(""));
|
|
||||||
// final Entity leaf = dotStringFactory.getBibliotekon().getLeaf(node);
|
|
||||||
// nodes.put(leaf, agnode);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
private static final Lock lock = new ReentrantLock();
|
private static final Lock lock = new ReentrantLock();
|
||||||
|
|
||||||
public ImageData createFile(OutputStream os, List<String> dotStrings, FileFormatOption fileFormatOption)
|
public ImageData createFile(OutputStream os, List<String> dotStrings, FileFormatOption fileFormatOption)
|
||||||
@ -364,9 +417,6 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createOneGraphic(UGraphic ug) {
|
public void createOneGraphic(UGraphic ug) {
|
||||||
for (Entity leaf : diagram.getEntityFactory().leafs())
|
|
||||||
printEntityNew(leaf);
|
|
||||||
|
|
||||||
final Globals zz = Globals.open();
|
final Globals zz = Globals.open();
|
||||||
try {
|
try {
|
||||||
final TextBlock textBlock = getTextBlock(zz);
|
final TextBlock textBlock = getTextBlock(zz);
|
||||||
@ -381,9 +431,6 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
private ImageData createFileLocked(OutputStream os, List<String> dotStrings, FileFormatOption fileFormatOption)
|
private ImageData createFileLocked(OutputStream os, List<String> dotStrings, FileFormatOption fileFormatOption)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
||||||
for (Entity leaf : diagram.getEntityFactory().leafs())
|
|
||||||
printEntityNew(leaf);
|
|
||||||
|
|
||||||
final Globals zz = Globals.open();
|
final Globals zz = Globals.open();
|
||||||
try {
|
try {
|
||||||
final TextBlock drawable = getTextBlock(zz);
|
final TextBlock drawable = getTextBlock(zz);
|
||||||
@ -544,7 +591,8 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
node2 = getAgnodeFromLeaf(link.getEntity2());
|
node2 = getAgnodeFromLeaf(link.getEntity2());
|
||||||
|
|
||||||
if (node1 == null || node2 == null)
|
if (node1 == null || node2 == null)
|
||||||
throw new IllegalStateException();
|
return null;
|
||||||
|
// throw new IllegalStateException();
|
||||||
|
|
||||||
final ST_Agedge_s e = agedge(zz, g, node1, node2, null, true);
|
final ST_Agedge_s e = agedge(zz, g, node1, node2, null, true);
|
||||||
agsafeset(zz, e, new CString("arrowtail"), new CString("none"), new CString(""));
|
agsafeset(zz, e, new CString("arrowtail"), new CString("none"), new CString(""));
|
||||||
@ -591,17 +639,6 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
return strings;
|
return strings;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printEntityNew(Entity ent) {
|
|
||||||
if (ent.isRemoved()) {
|
|
||||||
System.err.println("Jdot STRANGE: entity is removed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final IEntityImage image = printEntityInternal(ent);
|
|
||||||
final SvekNode shape = getBibliotekon().createNode(ent, image, dotStringFactory.getColorSequence(),
|
|
||||||
stringBounder);
|
|
||||||
// dotStringFactory.addShape(shape);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Bibliotekon getBibliotekon() {
|
private Bibliotekon getBibliotekon() {
|
||||||
return dotStringFactory.getBibliotekon();
|
return dotStringFactory.getBibliotekon();
|
||||||
}
|
}
|
||||||
@ -619,8 +656,11 @@ public class CucaDiagramFileMakerSmetana implements CucaDiagramFileMaker {
|
|||||||
// skinParam = new SkinParamSameClassWidth(dotData.getSkinParam(), width);
|
// skinParam = new SkinParamSameClassWidth(dotData.getSkinParam(), width);
|
||||||
}
|
}
|
||||||
|
|
||||||
return GeneralImageBuilder.createEntityImageBlock(ent, skinParam, diagram.isHideEmptyDescriptionForState(),
|
final IEntityImage result = GeneralImageBuilder.createEntityImageBlock(ent, skinParam,
|
||||||
diagram, getBibliotekon(), null, diagram.getUmlDiagramType(), diagram.getLinks());
|
diagram.isHideEmptyDescriptionForState(), diagram, getBibliotekon(), null,
|
||||||
|
diagram.getUmlDiagramType(), diagram.getLinks());
|
||||||
|
ent.setSvekImage(result);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
return ent.getSvekImage();
|
return ent.getSvekImage();
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ public class SmetanaPath implements UDrawable {
|
|||||||
} else if (this.link.getSpecificColor() != null)
|
} else if (this.link.getSpecificColor() != null)
|
||||||
color = this.link.getSpecificColor();
|
color = this.link.getSpecificColor();
|
||||||
|
|
||||||
DotPath dotPath = getDotPath();
|
DotPath dotPath = getDotPathInternal();
|
||||||
if (ymirror != null && dotPath != null)
|
if (ymirror != null && dotPath != null)
|
||||||
dotPath = ymirror.getMirrored(dotPath);
|
dotPath = ymirror.getMirrored(dotPath);
|
||||||
|
|
||||||
@ -142,15 +142,33 @@ public class SmetanaPath implements UDrawable {
|
|||||||
.getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder());
|
.getMergedStyle(diagram.getSkinParam().getCurrentStyleBuilder());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public XPoint2D getStartPoint() {
|
||||||
|
final DotPath dotPath = getDotPathInternal();
|
||||||
|
XPoint2D pt = dotPath.getStartPoint();
|
||||||
|
if (ymirror != null)
|
||||||
|
pt = ymirror.getMirrored(pt);
|
||||||
|
|
||||||
|
return pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public XPoint2D getEndPoint() {
|
||||||
|
final DotPath dotPath = getDotPathInternal();
|
||||||
|
XPoint2D pt = dotPath.getEndPoint();
|
||||||
|
if (ymirror != null)
|
||||||
|
pt = ymirror.getMirrored(pt);
|
||||||
|
|
||||||
|
return pt;
|
||||||
|
}
|
||||||
|
|
||||||
private void printExtremityAtStart(UGraphic ug) {
|
private void printExtremityAtStart(UGraphic ug) {
|
||||||
final ExtremityFactory extremityFactory2 = link.getType().getDecor2()
|
final ExtremityFactory extremityFactory2 = link.getType().getDecor2()
|
||||||
.getExtremityFactoryComplete(diagram.getSkinParam().getBackgroundColor());
|
.getExtremityFactoryComplete(diagram.getSkinParam().getBackgroundColor());
|
||||||
if (extremityFactory2 == null)
|
if (extremityFactory2 == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DotPath s = getDotPath();
|
final DotPath dotPath = getDotPathInternal();
|
||||||
XPoint2D p0 = s.getStartPoint();
|
XPoint2D p0 = dotPath.getStartPoint();
|
||||||
double startAngle = s.getStartAngle();
|
double startAngle = dotPath.getStartAngle();
|
||||||
if (ymirror != null) {
|
if (ymirror != null) {
|
||||||
p0 = ymirror.getMirrored(p0);
|
p0 = ymirror.getMirrored(p0);
|
||||||
startAngle = -startAngle + Math.PI;
|
startAngle = -startAngle + Math.PI;
|
||||||
@ -172,9 +190,9 @@ public class SmetanaPath implements UDrawable {
|
|||||||
if (extremityFactory1 == null)
|
if (extremityFactory1 == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DotPath s = getDotPath();
|
final DotPath dotPath = getDotPathInternal();
|
||||||
XPoint2D p0 = s.getEndPoint();
|
XPoint2D p0 = dotPath.getEndPoint();
|
||||||
double endAngle = s.getEndAngle();
|
double endAngle = dotPath.getEndAngle();
|
||||||
if (ymirror != null) {
|
if (ymirror != null) {
|
||||||
p0 = ymirror.getMirrored(p0);
|
p0 = ymirror.getMirrored(p0);
|
||||||
endAngle = -endAngle;
|
endAngle = -endAngle;
|
||||||
@ -242,7 +260,7 @@ public class SmetanaPath implements UDrawable {
|
|||||||
|
|
||||||
private DotPath dotPath;
|
private DotPath dotPath;
|
||||||
|
|
||||||
private DotPath getDotPath() {
|
private DotPath getDotPathInternal() {
|
||||||
if (dotPath != null)
|
if (dotPath != null)
|
||||||
return dotPath;
|
return dotPath;
|
||||||
|
|
||||||
@ -267,7 +285,8 @@ public class SmetanaPath implements UDrawable {
|
|||||||
if (link.getEntity2().isGroup()) {
|
if (link.getEntity2().isGroup()) {
|
||||||
final Cluster cluster2 = bibliotekon.getCluster(link.getEntity2());
|
final Cluster cluster2 = bibliotekon.getCluster(link.getEntity2());
|
||||||
// System.err.println("WARNING: a group " + cluster2.getRectangleArea());
|
// System.err.println("WARNING: a group " + cluster2.getRectangleArea());
|
||||||
// dotPath = dotPath.simulateCompound(cluster2.getRectangleArea(), cluster2.getRectangleArea());
|
// dotPath = dotPath.simulateCompound(cluster2.getRectangleArea(),
|
||||||
|
// cluster2.getRectangleArea());
|
||||||
}
|
}
|
||||||
return dotPath;
|
return dotPath;
|
||||||
}
|
}
|
||||||
|
@ -40,8 +40,6 @@ import java.util.Objects;
|
|||||||
import net.sourceforge.plantuml.abel.Entity;
|
import net.sourceforge.plantuml.abel.Entity;
|
||||||
import net.sourceforge.plantuml.klimt.color.HColor;
|
import net.sourceforge.plantuml.klimt.color.HColor;
|
||||||
import net.sourceforge.plantuml.klimt.font.StringBounder;
|
import net.sourceforge.plantuml.klimt.font.StringBounder;
|
||||||
import net.sourceforge.plantuml.klimt.geom.MagneticBorder;
|
|
||||||
import net.sourceforge.plantuml.klimt.geom.MagneticBorderNone;
|
|
||||||
import net.sourceforge.plantuml.klimt.shape.AbstractTextBlock;
|
import net.sourceforge.plantuml.klimt.shape.AbstractTextBlock;
|
||||||
import net.sourceforge.plantuml.stereo.Stereotype;
|
import net.sourceforge.plantuml.stereo.Stereotype;
|
||||||
import net.sourceforge.plantuml.style.ISkinParam;
|
import net.sourceforge.plantuml.style.ISkinParam;
|
||||||
|
@ -57,6 +57,12 @@ public class Bibliotekon {
|
|||||||
private final List<SvekLine> lines1 = new ArrayList<>();
|
private final List<SvekLine> lines1 = new ArrayList<>();
|
||||||
private final List<SvekLine> allLines = new ArrayList<>();
|
private final List<SvekLine> allLines = new ArrayList<>();
|
||||||
|
|
||||||
|
private final Collection<Link> links;
|
||||||
|
|
||||||
|
public Bibliotekon(Collection<Link> links) {
|
||||||
|
this.links = links;
|
||||||
|
}
|
||||||
|
|
||||||
public SvekNode createNode(Entity ent, IEntityImage image, ColorSequence colorSequence,
|
public SvekNode createNode(Entity ent, IEntityImage image, ColorSequence colorSequence,
|
||||||
StringBounder stringBounder) {
|
StringBounder stringBounder) {
|
||||||
final SvekNode node = new SvekNode(ent, image, colorSequence, stringBounder);
|
final SvekNode node = new SvekNode(ent, image, colorSequence, stringBounder);
|
||||||
@ -190,8 +196,9 @@ public class Bibliotekon {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Entity getOnlyOther(Entity entity) {
|
public Entity getOnlyOther(Entity entity) {
|
||||||
for (SvekLine line : allLines) {
|
for (Link link : links)
|
||||||
final Entity other = line.getOther(entity);
|
if (link.contains(entity)) {
|
||||||
|
final Entity other = link.getOther(entity);
|
||||||
if (other != null)
|
if (other != null)
|
||||||
return other;
|
return other;
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ import net.sourceforge.plantuml.vizjs.GraphvizJsRuntimeException;
|
|||||||
|
|
||||||
public class DotStringFactory implements Moveable {
|
public class DotStringFactory implements Moveable {
|
||||||
|
|
||||||
private final Bibliotekon bibliotekon = new Bibliotekon();
|
private final Bibliotekon bibliotekon;
|
||||||
|
|
||||||
private final ColorSequence colorSequence;
|
private final ColorSequence colorSequence;
|
||||||
private final Cluster root;
|
private final Cluster root;
|
||||||
@ -92,6 +92,7 @@ public class DotStringFactory implements Moveable {
|
|||||||
this.root = new Cluster(dotData.getEntityFactory().getDiagram(), colorSequence, skinParam,
|
this.root = new Cluster(dotData.getEntityFactory().getDiagram(), colorSequence, skinParam,
|
||||||
dotData.getRootGroup());
|
dotData.getRootGroup());
|
||||||
this.current = root;
|
this.current = root;
|
||||||
|
this.bibliotekon = new Bibliotekon(dotData.getLinks());
|
||||||
}
|
}
|
||||||
|
|
||||||
public DotStringFactory(StringBounder stringBounder, ICucaDiagram diagram) {
|
public DotStringFactory(StringBounder stringBounder, ICucaDiagram diagram) {
|
||||||
@ -103,6 +104,7 @@ public class DotStringFactory implements Moveable {
|
|||||||
this.stringBounder = stringBounder;
|
this.stringBounder = stringBounder;
|
||||||
this.root = new Cluster(diagram, colorSequence, skinParam, diagram.getEntityFactory().getRootGroup());
|
this.root = new Cluster(diagram, colorSequence, skinParam, diagram.getEntityFactory().getRootGroup());
|
||||||
this.current = root;
|
this.current = root;
|
||||||
|
this.bibliotekon = new Bibliotekon(diagram.getLinks());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addNode(SvekNode node) {
|
public void addNode(SvekNode node) {
|
||||||
|
@ -1084,12 +1084,12 @@ public class SvekLine implements Moveable, Hideable, GuideLine {
|
|||||||
return new XPoint2D(dx + end.getX(), dy + end.getY());
|
return new XPoint2D(dx + end.getX(), dy + end.getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Entity getOther(Entity entity) {
|
// public Entity getOther(Entity entity) {
|
||||||
if (link.contains(entity))
|
// if (link.contains(entity))
|
||||||
return link.getOther(entity);
|
// return link.getOther(entity);
|
||||||
|
//
|
||||||
return null;
|
// return null;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public StyleBuilder getCurrentStyleBuilder() {
|
public StyleBuilder getCurrentStyleBuilder() {
|
||||||
return link.getStyleBuilder();
|
return link.getStyleBuilder();
|
||||||
|
@ -378,6 +378,11 @@ public class SvekNode implements Positionable, Hideable {
|
|||||||
return shield().isZero() == false;
|
return shield().isZero() == false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void resetMoveSvek() {
|
||||||
|
this.minX = 0;
|
||||||
|
this.minY = 0;
|
||||||
|
}
|
||||||
|
|
||||||
public void moveSvek(double deltaX, double deltaY) {
|
public void moveSvek(double deltaX, double deltaY) {
|
||||||
this.minX += deltaX;
|
this.minX += deltaX;
|
||||||
this.minY += deltaY;
|
this.minY += deltaY;
|
||||||
|
@ -40,6 +40,7 @@ import java.util.Map;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import net.sourceforge.plantuml.abel.Entity;
|
import net.sourceforge.plantuml.abel.Entity;
|
||||||
|
import net.sourceforge.plantuml.abel.Link;
|
||||||
import net.sourceforge.plantuml.cucadiagram.BodyFactory;
|
import net.sourceforge.plantuml.cucadiagram.BodyFactory;
|
||||||
import net.sourceforge.plantuml.klimt.UGroupType;
|
import net.sourceforge.plantuml.klimt.UGroupType;
|
||||||
import net.sourceforge.plantuml.klimt.UPath;
|
import net.sourceforge.plantuml.klimt.UPath;
|
||||||
@ -61,6 +62,7 @@ import net.sourceforge.plantuml.klimt.geom.XPoint2D;
|
|||||||
import net.sourceforge.plantuml.klimt.shape.DotPath;
|
import net.sourceforge.plantuml.klimt.shape.DotPath;
|
||||||
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
import net.sourceforge.plantuml.klimt.shape.TextBlock;
|
||||||
import net.sourceforge.plantuml.klimt.shape.TextBlockEmpty;
|
import net.sourceforge.plantuml.klimt.shape.TextBlockEmpty;
|
||||||
|
import net.sourceforge.plantuml.sdot.SmetanaPath;
|
||||||
import net.sourceforge.plantuml.skin.ColorParam;
|
import net.sourceforge.plantuml.skin.ColorParam;
|
||||||
import net.sourceforge.plantuml.skin.CornerParam;
|
import net.sourceforge.plantuml.skin.CornerParam;
|
||||||
import net.sourceforge.plantuml.skin.SkinParamBackcolored;
|
import net.sourceforge.plantuml.skin.SkinParamBackcolored;
|
||||||
@ -201,7 +203,37 @@ public class EntityImageNote extends AbstractEntityImage implements Stencil {
|
|||||||
ug.startUrl(url);
|
ug.startUrl(url);
|
||||||
|
|
||||||
final UGraphic ug2 = UGraphicStencil.create(ug, this, UStroke.simple());
|
final UGraphic ug2 = UGraphicStencil.create(ug, this, UStroke.simple());
|
||||||
if (opaleLine == null || opaleLine.isOpale() == false) {
|
if (opaleLink != null) {
|
||||||
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
|
|
||||||
|
final SmetanaPath smetanaEdged = smetanaPathes.get(opaleLink);
|
||||||
|
final UTranslate move = new UTranslate(-node.getMinX(), -node.getMinY());
|
||||||
|
|
||||||
|
final XPoint2D startPoint = move.getTranslated(smetanaEdged.getStartPoint());
|
||||||
|
final XPoint2D endPoint = move.getTranslated(smetanaEdged.getEndPoint());
|
||||||
|
|
||||||
|
final UTranslate force1 = getMagneticBorder().getForceAt(stringBounder, smetanaEdged.getStartPoint());
|
||||||
|
final UTranslate force2 = other.getMagneticBorder().getForceAt(stringBounder, smetanaEdged.getEndPoint());
|
||||||
|
|
||||||
|
final double textWidth = getTextWidth(stringBounder);
|
||||||
|
final double textHeight = getTextHeight(stringBounder);
|
||||||
|
final XPoint2D center = new XPoint2D(textWidth / 2, textHeight / 2);
|
||||||
|
|
||||||
|
XPoint2D pp1 = force2.getTranslated(startPoint);
|
||||||
|
XPoint2D pp2 = force1.getTranslated(endPoint);
|
||||||
|
if (pp1.distance(center) < pp2.distance(center)) {
|
||||||
|
pp1 = force1.getTranslated(endPoint);
|
||||||
|
pp2 = force2.getTranslated(startPoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
final Direction strategy = getOpaleStrategy(textWidth, textHeight, pp2);
|
||||||
|
final Opale opale = new Opale(shadowing, borderColor, noteBackgroundColor, textBlock, true, getStroke());
|
||||||
|
opale.setRoundCorner(getRoundCorner());
|
||||||
|
opale.setOpale(strategy, pp2, pp1);
|
||||||
|
final UGraphic stroked = applyStroke(ug2);
|
||||||
|
opale.drawU(Colors.applyStroke(stroked, getEntity().getColors()));
|
||||||
|
|
||||||
|
} else if (opaleLine == null || opaleLine.isOpale() == false) {
|
||||||
drawNormal(ug2);
|
drawNormal(ug2);
|
||||||
} else {
|
} else {
|
||||||
final StringBounder stringBounder = ug.getStringBounder();
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
@ -306,8 +338,10 @@ public class EntityImageNote extends AbstractEntityImage implements Stencil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private SvekLine opaleLine;
|
private SvekLine opaleLine;
|
||||||
|
private Link opaleLink;
|
||||||
private SvekNode node;
|
private SvekNode node;
|
||||||
private SvekNode other;
|
private SvekNode other;
|
||||||
|
private Map<Link, SmetanaPath> smetanaPathes;
|
||||||
|
|
||||||
public void setOpaleLine(SvekLine line, SvekNode node, SvekNode other) {
|
public void setOpaleLine(SvekLine line, SvekNode node, SvekNode other) {
|
||||||
this.opaleLine = line;
|
this.opaleLine = line;
|
||||||
@ -315,6 +349,13 @@ public class EntityImageNote extends AbstractEntityImage implements Stencil {
|
|||||||
this.other = Objects.requireNonNull(other);
|
this.other = Objects.requireNonNull(other);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setOpaleLink(Link link, SvekNode node, SvekNode other, Map<Link, SmetanaPath> edges) {
|
||||||
|
this.opaleLink = link;
|
||||||
|
this.node = node;
|
||||||
|
this.other = Objects.requireNonNull(other);
|
||||||
|
this.smetanaPathes = edges;
|
||||||
|
}
|
||||||
|
|
||||||
public double getStartingX(StringBounder stringBounder, double y) {
|
public double getStartingX(StringBounder stringBounder, double y) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -125,19 +125,24 @@ public class EntityImageTips extends AbstractEntityImage {
|
|||||||
public void drawU(UGraphic ug) {
|
public void drawU(UGraphic ug) {
|
||||||
final StringBounder stringBounder = ug.getStringBounder();
|
final StringBounder stringBounder = ug.getStringBounder();
|
||||||
|
|
||||||
final Entity other = bibliotekon.getOnlyOther(getEntity());
|
final Entity tmp = getEntity();
|
||||||
|
final Entity other = bibliotekon.getOnlyOther(tmp);
|
||||||
|
if (other == null) {
|
||||||
|
System.err.println("Error1 in EntityImageTips");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
final SvekNode nodeMe = bibliotekon.getNode(getEntity());
|
final SvekNode nodeMe = bibliotekon.getNode(getEntity());
|
||||||
final SvekNode nodeOther = bibliotekon.getNode(other);
|
final SvekNode nodeOther = bibliotekon.getNode(other);
|
||||||
final XPoint2D positionMe = nodeMe.getPosition();
|
|
||||||
if (nodeOther == null) {
|
if (nodeOther == null) {
|
||||||
System.err.println("Error in EntityImageTips");
|
System.err.println("Error2 in EntityImageTips");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final XPoint2D positionOther = nodeOther.getPosition();
|
final XPoint2D positionOther = nodeOther.getPosition();
|
||||||
bibliotekon.getNode(getEntity());
|
bibliotekon.getNode(getEntity());
|
||||||
final Position position = getPosition();
|
final Position position = getPosition();
|
||||||
Direction direction = position.reverseDirection();
|
Direction direction = position.reverseDirection();
|
||||||
|
final XPoint2D positionMe = nodeMe.getPosition();
|
||||||
double height = 0;
|
double height = 0;
|
||||||
for (Map.Entry<String, Display> ent : getEntity().getTips().entrySet()) {
|
for (Map.Entry<String, Display> ent : getEntity().getTips().entrySet()) {
|
||||||
final Display display = ent.getValue();
|
final Display display = ent.getValue();
|
||||||
|
@ -82,7 +82,7 @@ public class Version {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static int beta() {
|
public static int beta() {
|
||||||
final int beta = 5;
|
final int beta = 6;
|
||||||
return beta;
|
return beta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user