平移和缩放后,鼠标单击转换为svg

时间:2015-11-25 14:48:36

标签: javascript svg snap.svg jquery.panzoom

我正在使用snap.svg一个snap.svg.zpd库。如果我使用snap.svg和jQuery panzoom库组合我也有同样的问题。

您可以找到代码示例here

var mySvg = $("#plan")[0];
var snap = Snap("#plan");
//create an image
var imagePlan = snap.image("http://upload.wikimedia.org/wikipedia/commons/4/42/Cathedral_schematic_plan_fr_vectorial.svg", 10, 10, 900, 500);

var group = snap.group(imagePlan);

snap.zpd();

var pt = mySvg.createSVGPoint(); // create the point;

imagePlan.click(function(evt)
        {
    console.log(evt);
            pt.x = evt.x;
            pt.y = evt.y;

            console.log(mySvg.getScreenCTM().inverse());
            //When click, create a rect
            var transformed =   pt.matrixTransform(mySvg.getScreenCTM().inverse());
            var rect1 = snap.rect(transformed.x, transformed.y, 40, 40);

            group.add(rect1);

        });

问题是......如果点击初始svg,它会将矩形添加到鼠标位置。如果您平移/缩放图像然后添加矩形,它将会被删除。

看起来问题出在方法mySvg.getScreenCTM()。inverse()中。返回的矩阵始终是相同的,平移和缩放不会改变它。它始终使用initialy渲染的svg中的矩阵。但是,如果我检查svg元素,我可以直接在元素上看到pann / zoom更改矩阵(下图)。

enter image description here

有谁知道如何解决这个问题。我的要求是能够在任何缩放比例或平移上下文中将svg外的元素拖放到svg中,因此我需要从鼠标单击点转换为svg偏移坐标。如果您知道任何其他方法或任何其他库组合可以做到这一点,那对我来说没问题。

提前致谢。

1 个答案:

答案 0 :(得分:3)

问题是,转换不在mySvg中。它位于svg内部的'g'组元素上。据我所知,Zpd将创建一个可以操作的组,所以你想看看它。

要高亮显示,请查看

console.log(mySvg.firstElementChild.getScreenCTM().inverse());

在这种情况下,它是g元素(有更多直接的访问方式,取决于你是想在js中工作,还是在snap或svg.js中工作)。

jsfiddle

从你的描述中你不太清楚你想要的矩形(在svg内,单独的或什么样的)以及在什么尺度等等,如果你想让它成为缩放/平移的一部分,或静态或随你。所以我不确定你是否需要这个。

我猜你想要像this

这样的东西
var tpt = pt.matrixTransform( mySvg.firstElementChild.getScreenCTM().inverse()  )

var rect1 = snap.rect(tpt.x, tpt.y, 40, 40);