gpt4 book ai didi

java - 如何将图形导出为 svg/graphml

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:51:51 27 4
gpt4 key购买 nike

我对如何将图形导出为 svg 或 graphml 有点困惑。直到现在,forum.jgraph.com 上的 API、示例或线程都没有帮助我。

我需要将图表导出为 svg 和 graphml。我得到了 svg 以显示节点和边缘,即使布局正确,但我缺少节点名称和分配的颜色等信息。

对于 graphml,我还不知道如何获取正确的 xml 代码以显示功能图。

是否有任何指南/工作流程可以帮助我在 JGraphX 中导出?

在此先感谢您的帮助,

克里斯

最佳答案

为了保存您的图表,您必须调用 mxCellRendered 将您的图表渲染到您从中获取文档(dom 文档)的 mxicanvas。从渲染器它是这样的:mxGraph.drawCell() -> mxGraph.drawState() -> mxICanvas.drawCell() -> mxICanvas.drawShape()mxICanvas 只知道单元格的几何形状和样式。

我也想在 svg 文件中添加 cell id 属性,所以我做了以下操作

  1. 扩展 mxGraph 以覆盖 drawCell() 以便在单元格样式中添加单元格 ID,并且
  2. 扩展了 mxSvgCanvas 以添加我感兴趣的形状的 id 属性

保存为 svg 图形的函数如下:

// use the extended svg canvas, where the cell id is added as attribute
public void createSVG(mxGraphExtended g) {
String filename = "\home\koula\graph.svg";
mxSvgCanvasExtended canvas = (mxSvgCanvasExtended) mxCellRenderer.drawCells(
g, null, 1, null, new CanvasFactory() {
public mxICanvas createCanvas(int width, int height) {
mxSvgCanvasExtended canvas = new mxSvgCanvasExtended(mxDomUtils
.createSvgDocument(width, height));
canvas.setEmbedded(true);
return canvas;
}
});
try {
mxUtils.writeFile(mxXmlUtils.getXml(canvas.getDocument()), filename);
} catch (IOException e) {
e.printStackTrace();
}
}

覆盖的 drawCell():

public class mxGraphExtended extends mxGraph {

@Override
public void drawCell(mxICanvas canvas, Object cell) {
// add the cell's id as a style attribute
// cause canvas only get the style and geometry
mxCellState state = this.getView().getState(cell);
state.getStyle().put("cellid", ((mxCell)cell).getId());

super.drawCell(canvas, cell);
}
}

重写的 drawShape() 是这样的:

public class mxSvgCanvasExtended extends mxSvgCanvas {

//... have coppied only the related code

@Override
public Element drawShape(int x, int y, int w, int h,
Map<String, Object> style)
{
//...

// Draws the shape
String shape = mxUtils.getString(style, mxConstants.STYLE_SHAPE, "");
String cellid = mxUtils.getString(style, "cellid", "");
Element elem = null;
// ...

// e.g. if image, add the cell id
if (shape.equals(mxConstants.SHAPE_IMAGE)) {
String img = getImageForStyle(style);
if (img != null) {
// Vertical and horizontal image flipping
boolean flipH = mxUtils.isTrue(style,
mxConstants.STYLE_IMAGE_FLIPH, false);
boolean flipV = mxUtils.isTrue(style,
mxConstants.STYLE_IMAGE_FLIPV, false);
elem = createImageElement(x, y, w, h, img,
PRESERVE_IMAGE_ASPECT, flipH, flipV, isEmbedded());
/* so here we are */
// add the cell id atribute
if(!cellid.equals("")) {
elem.setAttribute("id", cellid);
}
}
} else if (shape.equals(mxConstants.SHAPE_LINE))
// ...
}// end drawShape

} // end class

希望对您有所帮助。

关于java - 如何将图形导出为 svg/graphml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17398443/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com