3

グラフをsvgまたはgraphmlにエクスポートする方法に少し固執しています。これまで、forum.jgraph.com の API、サンプル、またはスレッドのいずれも役に立ちませんでした。

グラフをsvgとgraphmlの両方にエクスポートする必要があります。正しいレイアウトでもノードとエッジを表示するように svg を取得しましたが、ノードの名前や割り当てられた色などの情報がありません。

graphml を使用すると、機能するグラフを表示するための正しい xml コードを取得する方法がまだわかりません。

JGraphX でのエクスポートに役立つガイドラインやワークフローはありますか?

助けてくれてありがとう、

クリス

4

1 に答える 1

3

グラフを保存するには、mxCellRendered を呼び出して、ドキュメント (dom ドキュメント) を取得する mxicanvas にグラフをレンダリングする必要があります。mxGraph.drawCell() -> mxGraph.drawState() -> mxICanvas.drawCell() -> mxICanvas.drawShape() mxICanvas は、セルのジオメトリとスタイルのみを認識します。

svgファイルにもセルID属性を追加したかったので、次のようにしました

  1. セルのスタイルにセル ID を追加するために、mxGraph を拡張して drawCell() をオーバーライドし、
  2. 興味のある形状の id 属性を追加するために mxSvgCanvas を拡張しました

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

この助けを願っています。

于 2014-09-13T18:51:24.410 に答える