【问题标题】:Make Cytoscape.js container just wide enough and just long enough使 Cytoscape.js 容器足够宽和足够长
【发布时间】:2018-04-07 03:45:51
【问题描述】:

我正在使用 Cytoscape.js 在单独的画布中渲染几个树布局。

目前,每个画布都被一个具有设定尺寸(例如 400x400)的容器 div 包围。 Cytoscape 提供了一种设置,可将每棵树放入其容器中,并将每棵树放大到必要的程度,以使整棵树在给定尺寸内可见。

我不想让每个布局适应容器,而是调整每个容器的大小以完美适应其子画布。换句话说,我需要一种方法来询问 Cytoscape 画布的每个实例,“在 0 缩放时你的宽度和高度是多少”,或者“在每个方向上需要多少像素才能完全绘制”,然后调整每个适当的容器。

Cytoscape 确实提供了获取画布的 width()height() 的方法,但这些最终是实际尺寸(可能不适合容器),而不是“所需”/需要的尺寸。

我突然想到,我可以想出一些启发式方法来根据节点和边的数量来设置容器的宽度和高度,但是这种方法还没有被证明是有效的;节点和边的数量几乎不能告诉我最终的布局和排列,仅此一项就可以决定所需的宽度和高度。

【问题讨论】:

    标签: javascript html5-canvas cytoscape.js


    【解决方案1】:

    您是否尝试过使用:

    eles.boundingBox(options);
    

    或:

    eles.renderedBoundingBox();
    

    'eles' 必须是这样的:

    var eles = cy.elements();
    

    您可以通过 cytoscape 方法获取有关节点的两个信息: cytoscape 中的实际位置及其渲染位置,请阅读本文了解更多信息:

    http://js.cytoscape.org/#notation/position

    关于你的第二个问题:

    只需调用即可对齐树非常容易

    cy.fit(/*eles, padding*/); // Pan and zoom fitted to the tree
    cy.center(/*eles*/); // Moves the graph to the exact center of your tree
    cy.elements().shift('x', offset); // Moves the nodes to the right, offset must be negative to move them to the left 
    

    【讨论】:

    • 谢谢,成功了。有趣的是它并没有将树一直对齐到左边——在某些情况下,树的左边有高达 100px 的边距——这仍然导致右边的树的其余部分被覆盖.我通过调用cy.fit() 来缓解这种情况 - 然而,这似乎很笨拙,特别是考虑到它需要任意超时,即使在布局的ready 回调中调用也是如此。有没有更好的方法将整个树与画布的左边缘对齐?
    • 我在上面添加了答案,如果有帮助请告诉我:)
    • 还没试过,但你确定它把树向左对齐吗?听起来它会将它们与中心对齐,而且它已经这样做了。
    • 哦,你是对的......我编辑了答案,你需要找出偏移量有多大才能将图形移动到正确的位置。
    • 你有图形的边界框和 cytoscape 的宽度,从盒子中减去宽度并除以 2,你就有了偏移量 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2011-02-09
    • 2021-12-26
    相关资源
    最近更新 更多