Reputation: 35
I need to create instrument for draw polygon in my project with fabric js. I found a script https://github.com/taqimustafa/fabricjs-polygon it's perfect for me. But this script work with fabric 1.6.3 while I use 1.7.11.
And I have a small problem with fabric 1.7.11 and activeShape. ActiveShape draws only in area with 90 degrees between first and last point.
Here is example: https://codepen.io/daer_ru/pen/pdOMyX
var min = 99;
var max = 999999;
var polygonMode = true;
var pointArray = new Array();
var lineArray = new Array();
var activeLine;
var activeShape = false;
var canvas
$(window).load(function(){
prototypefabric.initCanvas();
$('#create-polygon').click(function() {
prototypefabric.polygon.drawPolygon();
});
});
var prototypefabric = new function () {
this.initCanvas = function () {
canvas = window._canvas = new fabric.Canvas('c');
canvas.setWidth($(window).width());
canvas.setHeight($(window).height()-$('#nav-bar').height());
//canvas.selection = false;
canvas.on('mouse:down', function (options) {
if(options.target && options.target.id == pointArray[0].id){
prototypefabric.polygon.generatePolygon(pointArray);
}
if(polygonMode){
prototypefabric.polygon.addPoint(options);
}
});
canvas.on('mouse:up', function (options) {
});
canvas.on('mouse:move', function (options) {
if(activeLine && activeLine.class == "line"){
var pointer = canvas.getPointer(options.e);
activeLine.set({ x2: pointer.x, y2: pointer.y });
var points = activeShape.get("points");
points[pointArray.length] = {
x:pointer.x,
y:pointer.y
}
activeShape.set({
points: points
});
canvas.renderAll();
}
canvas.renderAll();
});
};
};
prototypefabric.polygon = {
drawPolygon : function() {
polygonMode = true;
pointArray = new Array();
lineArray = new Array();
activeLine;
},
addPoint : function(options) {
var random = Math.floor(Math.random() * (max - min + 1)) + min;
var id = new Date().getTime() + random;
var circle = new fabric.Circle({
radius: 5,
fill: '#ffffff',
stroke: '#333333',
strokeWidth: 0.5,
left: (options.e.layerX/canvas.getZoom()),
top: (options.e.layerY/canvas.getZoom()),
selectable: false,
hasBorders: false,
hasControls: false,
originX:'center',
originY:'center',
id:id
});
if(pointArray.length == 0){
circle.set({
fill:'red'
})
}
var points = [(options.e.layerX/canvas.getZoom()),(options.e.layerY/canvas.getZoom()),(options.e.layerX/canvas.getZoom()),(options.e.layerY/canvas.getZoom())];
line = new fabric.Line(points, {
strokeWidth: 2,
fill: '#999999',
stroke: '#999999',
class:'line',
originX:'center',
originY:'center',
selectable: false,
hasBorders: false,
hasControls: false,
evented: false
});
if(activeShape){
var pos = canvas.getPointer(options.e);
var points = activeShape.get("points");
points.push({
x: pos.x,
y: pos.y
});
var polygon = new fabric.Polygon(points,{
stroke:'#333333',
strokeWidth:1,
fill: '#cccccc',
opacity: 0.3,
selectable: false,
hasBorders: false,
hasControls: false,
evented: false
});
canvas.remove(activeShape);
canvas.add(polygon);
activeShape = polygon;
canvas.renderAll();
}
else{
var polyPoint = [{x:(options.e.layerX/canvas.getZoom()),y:(options.e.layerY/canvas.getZoom())}];
var polygon = new fabric.Polygon(polyPoint,{
stroke:'#333333',
strokeWidth:1,
fill: '#cccccc',
opacity: 0.3,
selectable: false,
hasBorders: false,
hasControls: false,
evented: false
});
activeShape = polygon;
canvas.add(polygon);
}
activeLine = line;
pointArray.push(circle);
lineArray.push(line);
canvas.add(line);
canvas.add(circle);
canvas.selection = false;
},
generatePolygon : function(pointArray){
var points = new Array();
$.each(pointArray,function(index,point){
points.push({
x:point.left,
y:point.top
});
canvas.remove(point);
});
$.each(lineArray,function(index,line){
canvas.remove(line);
});
canvas.remove(activeShape).remove(activeLine);
var polygon = new fabric.Polygon(points,{
stroke:'#333333',
strokeWidth:0.5,
fill: 'red',
opacity: 1,
hasBorders: false,
hasControls: false
});
canvas.add(polygon);
activeLine = null;
activeShape = null;
polygonMode = false;
canvas.selection = true;
}
};
Upvotes: 1
Views: 10021
Reputation: 36
I have the exact need as the questioner. And just to add some information:
If you are doing this too, you may want to know the coordinates of the polygon points while the polygon is being moved, resized, rotated, etc.
But once the polygon is being created, the points
won't change again, so you cannot get correct coordinates directly.
Before fabric 2.0, polygon points are relative to its center, you want to calculate coordinates by following this: How to get polygon points in Fabric.js
After 2.0, polygon points are absolute to canvas, and you do: How does transforming points with a transformMatrix work in fabricJS?
Upvotes: 0