【问题标题】:Graphviz focus on a nodeGraphviz 关注一个节点
【发布时间】:2011-04-22 01:11:23
【问题描述】:

我正在创建一个从 XML 文件(节点+边)创建图形的场景。该图在 iframe 内生成为 SVG。我想要做的是能够单击一个节点并使该节点聚焦(不同的颜色,滚动到位)。

我得到的是,我在传递给 graphviz 的属性中传递了一个 URL,该 URL 在查询字符串中具有焦点节点,因此 my-url.php?focus=2 将焦点节点 id 为 2。然后,在属性创建,我把焦点节点的颜色改成亮黄色。

问题是我找不到向下滚动到此节点的方法。我必须通过向下滚动来手动搜索节点。有没有办法获得焦点节点的坐标并将其传递给托管 iframe 的窗口?这样,我就可以使用 Javascript 向下(或向右)滚动。

有什么想法吗?我不是在寻找一个完整的解决方案。如果可行,我可以接受一个策略(并且可以在最新的浏览器上工作。它不必向后兼容)。

谢谢。

【问题讨论】:

    标签: php javascript iframe graphviz


    【解决方案1】:

    您可以通过调用不带 -T 选项的 dot 来检索 SVG 中节点的位置(它会生成 dot 文件,其中节点使用“pos”属性进行注释,指示它们的绘制位置。然后,当 $_GET[ 'focus'] 为 42(即请求 my-url.php?focus=42),my-url.php 应生成 Javascript 代码,该代码将 iframe 滚动到节点 42 的位置,使用类似 scrollTo(http: //stackoverflow.com/questions/1192228/scrolling-an-iframe-with-javascript)。

    为确保即使图像已缩放(它是 SVG,对)也能正常工作,您需要将滚动到的位置乘以 SVG 的总宽度与点图宽度之间的比率由“大小”图形属性设置(高度相同)。

    【讨论】:

    • 我目前正在使用 Image_Graphviz 来创建 SVG ...所以我根本没有调用 dot 命令。也许我可以使用相同的选项并将它们直接传递给 dot 以分别创建 dot 文件。在这种情况下,我将不得不运行两次图形生成。
    • 我认为您应该首先生成带注释的点,然后从中生成 SVG。因此,真正的绘图计算只发生在第一步;在第二步,Graphviz 应该只使用已经存在的位置信息。 (如果它不自发地切换,可能会有一个选项。)使用 Image_Graphviz,看起来你想要的是 $format = 'dot' 的 fetch 方法。
    • 啊,所以我首先生成点文件(使用 image() 函数的 output = 'dot'),然后在完成位置所需的任何操作后,使用 renderDotFile() 函数渲染文件.完美的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-11-03
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2018-08-23
    • 1970-01-01
    • 2014-05-25
    相关资源
    最近更新 更多