2017-01-24 2 views
1

Я работаю над проектом с тканью js. Я попытался свести к минимуму мою проблему, поэтому я надеюсь, что код не слишком запутан. Я создаю некоторые объекты, которые связаны друг с другом:FabricJS оптический вид линий

  • линия, которая содержит начальную и конечную точку,
  • круга, который является StartPoint 1 линии и конечной точка другой линии

с этой комбинацией я могу создать различные формы (например, многоугольник) и изменить свои функции перемещения для них тоже.

При перемещении круга связанные линии также масштабируются и перемещаются. (в моем коде вы можете перемещать строки тоже, и форма изменилась после этого, но я не включил его в этот пример, bc этот короткий отрывок должен быть достаточным, чтобы показать, в чем моя проблема.)

Я получил немного пример в jsfiddle: https://jsfiddle.net/bxgox7cr/

Когда вы смотрите на концах линий, вы можете четко видеть разрез, так что глаза скоро признают, что это не связная форма, а скорее некоторые линии, которые расположены близко друг к Другие. Есть ли способ изменить внешний вид линий, что форма выглядит «закрытой»?

Вот мой код, я пытался поставить некоторые комментарии, которые легко читать:

var canvas = new fabric.Canvas('canvas'); 

fabric.Object.prototype.originX = fabric.Object.prototype.originY = 'center'; 
document.getElementById("canvas").tabIndex = 1000; 

/** ------------creating a Line Object, which contains a start and an endpoint ------------**/ 
fabric.LineWithPoints = fabric.util.createClass(fabric.Line, { 
    initialize: function(points, options) { 
    options || (options = {}); 
    this.callSuper('initialize', points, options); 
    options && 
     this.set('type', options.type), 
     this.set('name', options.name), 
     this.set('start_point', options.start_point), 
     this.set('end_point', options.end_point), 
     this.set('current_x', options.current_x), 
     this.set('current_y', options.current_y) 
    }, 
    setStartPointAndEndPoint: function(start_point, end_point) { 
    this.set({ 
     start_point: start_point, 
     end_point: end_point 
    }); 
    }, 
    setValues: function(new_x1, new_y1, new_x2, new_y2) { 
    //  console.log(this); 
    this.set({ 
     x1: new_x1, 
     x2: new_x2, 
     y1: new_y1, 
     y2: new_y2 
    }); 
    this.setCoords(); 
    } 
}); 

/**--- modifie the circle element, adding new functions for the movement of the object-------*/ 
fabric.LinePoint = fabric.util.createClass(fabric.Circle, { 
    initialize: function(options) { 
    options || (options = {}); 
    this.callSuper('initialize', options); 
    options && 
     this.set('subtype', 'line_point'), 
     this.set('x', this.left), 
     this.set('y', this.top) 
    }, 
    setPointCoordinates: function(new_left, new_top) { 
    this.set({ 
     x: new_left, 
     y: new_top, 
     left: new_left, 
     top: new_top 
    }); 
    this.setCoords(); 
    }, 
    move: function(new_left, new_top) { 
    var wall_1 = this.line1; 
    var wall_2 = this.line2; 

    this.setPointCoordinates(new_left, new_top); 
    wall_1.setValues(wall_1.x1, wall_1.y1, this.getLeft(), this.getTop()); 
    wall_2.setValues(this.getLeft(), this.getTop(), wall_2.x2, wall_2.y2); 
    canvas.renderAll(); 
    }, 
}); 

/**------------------- Moving Function------------------------------------------------- */ 

canvas.on('object:moving', function(event) { 
    var object = event.target; 

    if (object.subtype == "line_point") { 
    object.move(object.getLeft(), object.getTop()); 
    } 
}); 


/**------------------------------ create functions for the objects -----------------------*/ 

function newCircleObject(left, top, wall_1, wall_2) { 
    var circle = new fabric.LinePoint({ 
    left: left, 
    top: top, 
    strokeWidth: 2, 
    radius: 15, 
    fill: 'grey', 
    stroke: 'black', 
    opacity: 0.1, 
    perPixelTargetFind: true, 
    subtype: 'line_point', 
    includeDefaultValues: false 
    }); 

    circle.hasControls = false; 
    circle.hasBorders = false; 
    circle.line1 = wall_1; 
    circle.line2 = wall_2; 

    return circle; 
} 

function newWallObject(coords) { 
    var wall = new fabric.LineWithPoints(coords, { 
    stroke: 'black', 
    strokeWidth: 6, 
    lockScalingX: true, 
    lockScalingY: true, 
    perPixelTargetFind: true, 
    subtype: 'line', 
    type: 'line', 
    padding: 10, 
    includeDefaultValues: false 
    }); 

    wall.hasControls = false; 
    wall.hasBorders = false; 
    return wall; 
} 


/**------------------------------ adding the shapes--------------------------------*/ 

var wall_1 = newWallObject([100, 100, 100, 500]); 
var wall_2 = newWallObject([100, 500, 500, 500]); 
var wall_3 = newWallObject([500, 500, 500, 100]); 
var wall_4 = newWallObject([500, 100, 100, 100]); 

var end_point_1 = newCircleObject(wall_1.x1, wall_1.y1, wall_4, wall_1); 
var end_point_2 = newCircleObject(wall_2.x1, wall_2.y1, wall_1, wall_2); 
var end_point_3 = newCircleObject(wall_3.x1, wall_3.y1, wall_2, wall_3); 
var end_point_4 = newCircleObject(wall_4.x1, wall_4.y1, wall_3, wall_4); 

wall_1.setStartPointAndEndPoint(end_point_1.name, end_point_2.name); 
wall_2.setStartPointAndEndPoint(end_point_2.name, end_point_3.name); 
wall_3.setStartPointAndEndPoint(end_point_3.name, end_point_4.name); 
wall_4.setStartPointAndEndPoint(end_point_4.name, end_point_1.name); 

canvas.add(wall_1, wall_2, wall_3, wall_4, end_point_1, end_point_2, end_point_3, end_point_4); 

ответ

1

Добавить strokeLineCap: 'round',:

function newWallObject(coords) { 
    var wall = new fabric.LineWithPoints(coords, { 
    stroke: 'black', 
    strokeWidth: 6, 
    lockScalingX: true, 
    lockScalingY: true, 
    perPixelTargetFind: true, 
    strokeLineCap: 'round', 
    subtype: 'line', 
    type: 'line', 
    padding: 10, 
    includeDefaultValues: false 
    }); 

    wall.hasControls = false; 
    wall.hasBorders = false; 
    return wall; 
} 

Я посмотрел: http://fabricjs.com/docs/fabric.Object.html#strokeLineCap

Смежные вопросы