Codementor Events

Combine Multiple paths to Single path

Published Nov 28, 2020
Combine Multiple paths to Single path

Combine Multiple paths to single paths

Recently i was searching for a simple logic to combine multiple path data to single path, and i come up with the final solution to combine multiple paths as follows.

combinePaths(paths) {
    if (!paths.length) {
        return null;
    }
    let singlePath = paths[0];
    for (let i = 1; i < paths.length; i++) {
        if(paths[i][0][0] === "M") {
          paths[i][0][0] = "Q";
          paths[i][0][3] = paths[i][0][1];
          paths[i][0][4] = paths[i][0][2];
        }
        singlePath = [...singlePath, ...paths[i]];
    }
    return singlePath;
}

In fabric js we can combine and pass multiple paths data to fabric.path class to generate single fabric js object as follows.

combinePaths(paths, strokeColor, strokeWidth) {
    if (!paths.length) {
        return null;
    }
    let singlePath = paths[0];
    for (let i = 1; i < paths.length; i++) {
        if(paths[i][0][0] === "M") {
          paths[i][0][0] = "Q";
          paths[i][0][3] = paths[i][0][1];
          paths[i][0][4] = paths[i][0][2];
        }
        //To combine the last path with first path
        // we can update the logic as below 
        if(i === paths.length-1) {
          var len = paths[i].length;  
          paths[i][len] = [];
          paths[i][len].push("Q");
          paths[i][len].push(paths[i][len-1][1]);
          paths[i][len].push(paths[i][len-1][2]);
          paths[i][len].push(paths[0][0][1]);
          paths[i][len].push(paths[0][0][2]);
        }
        singlePath = [...singlePath, ...paths[i]];
    }
    return new fabric.Path(singlePath, {
        fill: '',
        stroke: strokeColor,
        strokeWidth: strokeWidth,
        strokeLineCap: 'round',
        strokeDashOffset: 0,
    });
}

Using above simple function we can combine multiple seperate paths into single path.

Discover and read more posts from Frederic Anand
get started
post commentsBe the first to share your opinion
Show more replies