2017-03-29 13 views
1

私はここ数週間fabricjsで働いており、私が抱えている問題の解決策を見つけることができません。 私はオブジェクトを持っており、その周りの領域が "空"(オブジェクトがない)かどうかをプログラムで判断したいので、そこにオブジェクトを追加すると交差しません。ファブリック上で、オブジェクトが特定の座標にすでに存在するかどうかをどのように判断できますか?

私はcanvas.findTargetとさまざまな "仮想"オブジェクトで遊んでいましたが、何もできません。

これは私が見つけた解決策である:

var targetPoint = new fabric.Point(target.left + offset + 1, target.top + 1); 
      if (obj.containsPoint(targetPoint)) { 
      objectOnRight = obj; 
      } 

敬具、 アレックスは

答えて

1

これはかなり近い(過去に私が使用したいくつかのコードは、コンテキストメニューを表示するために取得する必要があります):

fabric.util.addListener(document.getElementsByClassName('upper-canvas')[0], 'contextmenu', function (env) { 
    var x = env.offsetX; 
    var y = env.offsetY; 
    var itemIndex = -1; 
    $.each(canvas.getObjects(), function (i, e) { 
     // e.left and e.top are the middle of the object use some "math" to find the outer edges 
     if (e.selectable && e.id != 'canvasNumbers') { 
      var d = e.width * e.scaleX/2; 
      var h = e.height * e.scaleY/2; 
      if (x >= (e.left - d) && x <= (e.left + d)) { 
       if (y >= (e.top - h) && y <= (e.top + h)) { 
        itemIndex = i; 
       } 
      } 
     } 
    }); 
    if (itemIndex > -1) { 
     canvas.setActiveObject(canvas.getObjects()[itemIndex]); 
     canvasSelectedItem = canvas.getObjects()[itemIndex]; 
     $('.contextmenu').css({ 
      top: env.pageY + 'px', 
      left: env.pageX + 'px' 
     }).show(); 
    } 
    env.preventDefault(); 
    return false; //stops the event propigation 
}); 

ご質問がある場合はお知らせください。より多くのことを助けて幸せ

+0

こんにちはTimと返信いただきありがとうございます。私が正しく理解していれば、このコードは既存の要素と重ならないコンテキストメニューを表示しますか?私はキャンバスオブジェクトを反復して同様のアプローチを試みていますが、あなたのコードで見たものに基づいた解決策があれば、私はあなたに戻ってきます。ありがとう! –

+0

あなたは正しいですが、心配はありません。コードを消化したら、私に連絡してください。私はうまくいっても助けてくれるでしょう。 –

+1

こんにちは、ティム!私はあなたが提示したものに基づいて解決策を見つけました。追加するオブジェクトに相対的な点を作成し、キャンバスオブジェクトのいずれかにその点が含まれているかどうかを確認します。元の投稿にサンプルコードを追加しました。 –

関連する問題