如何使用Fabric.js来做Visio,就像连接图纸一样?

moj*_*000 7 javascript canvas fabricjs

我最近开始使用Fabric.js进行项目,这很棒.它为画布提供了一个抽象层,并且每个对象都有一个完整的"对象操作层/掩码".

我想更进一步,利用它来制作实际的图表,以及对象之间的连接,以及每个对象附带的更多"元数据".有人已经这样做了吗?Fabric.js是正确的选择吗?

有关如何在两个对象之间创建"连接器"对象的任何想法,这两个对象响应来自它们所附着的对象的事件?

kol*_*nda 9

在fabricjs中它是可能的 - 事实上我已经做了类似的东西,但更简单.

在我的项目中,我需要实现一个可编辑的行,但不是Fabric内置行,它可以通过边界框进行编辑,但是可以拖动其一端的行,就像在每个矢量绘图应用程序中一样.

只用一个物体似乎是不可能的,所以我最终创造了三个物体 - 两端有一条线和两个小圆圈.然后我设置从线到圆以及从圆到线的参考 - 这样我就可以找到附加到我正在移动的对象的所有对象.

现在,在每个对象移动过程中,我检查对象是否有对附加行/圆的引用,如果有 - 我需要运行特殊的行移动代码来更新所有附加对象.

演示:

您可以在这里找到简单的技术演示: www.drawee.kolenda.me/techdemo.

只需单击"直线",在框架中拖动鼠标,单击"编辑" - 您就可以看到在工作中拖动线条.您可以拖动线本身或其中一个端点.

-

在您的特定情况下,您可能希望禁用选择或拖动连接,您可能还想更新连接形状,因此它是某种动态曲线,而不是直线,但我认为核心功能将是相同的.

元数据:

如果你想添加一些额外的数据,它就不会更简单 - 每个JS对象都是一个存储键值对的字典,所以你只需要在对象中添加另一个键值对.请记住,JS和Fabric会在内部使用一些键名,因此请保持您的键名与现有键名不同.我在此演示中的自定义键名称是"line","circle1"和"circle2" - 您可以在源代码中找到它们.


小智 6

是的,在fabric js中是可能的。我刚刚试用了一个带有连接器连接的盒子的示例。请在这里检查。 http://kpomservices.com/HTML5CanvasCampaign/visual.html

使用连接器创建形状的简单演示。使用形状位置可以轻松创建连接器,当形状移动时,在事件处理程序中我们还需要更新连接器的位置。

完整的演示在这里。 http://kpomservices.com/HTML5CanvasCampaign/campaign.html 此处连接器也可以与其他框一起移动(拖放)。