Merge pull request #2044 from freesewing/joost-pathsplitonstartend
fix(core): Handle path split on start/end of path segments
This commit is contained in:
commit
027ce3d290
1 changed files with 65 additions and 35 deletions
|
@ -747,12 +747,26 @@ Path.prototype.split = function (point) {
|
||||||
if (point instanceof Point !== true)
|
if (point instanceof Point !== true)
|
||||||
this.raise.error('Called `Path.split(point)` but `point` is not a `Point` object')
|
this.raise.error('Called `Path.split(point)` but `point` is not a `Point` object')
|
||||||
let divided = this.divide()
|
let divided = this.divide()
|
||||||
let firstHalf = false
|
let firstHalf = []
|
||||||
let secondHalf = false
|
let secondHalf = []
|
||||||
for (let pi = 0; pi < divided.length; pi++) {
|
for (let pi = 0; pi < divided.length; pi++) {
|
||||||
let path = divided[pi]
|
let path = divided[pi]
|
||||||
if (path.ops[1].type === 'line') {
|
if (path.ops[1].type === 'line') {
|
||||||
if (pointOnLine(path.ops[0].to, path.ops[1].to, point)) {
|
if (path.ops[0].to.sitsRoughlyOn(point)) {
|
||||||
|
secondHalf.push(new Path(this.debug)
|
||||||
|
.withRaise(this.raise)
|
||||||
|
.move(path.ops[0].to)
|
||||||
|
.line(path.ops[1].to)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
else if (path.ops[1].to.sitsRoughlyOn(point)) {
|
||||||
|
firstHalf.push(new Path(this.debug)
|
||||||
|
.withRaise(this.raise)
|
||||||
|
.move(path.ops[0].to)
|
||||||
|
.line(path.ops[1].to)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
else if (pointOnLine(path.ops[0].to, path.ops[1].to, point)) {
|
||||||
firstHalf = divided.slice(0, pi)
|
firstHalf = divided.slice(0, pi)
|
||||||
firstHalf.push(new Path(this.debug).withRaise(this.raise).move(path.ops[0].to).line(point))
|
firstHalf.push(new Path(this.debug).withRaise(this.raise).move(path.ops[0].to).line(point))
|
||||||
pi++
|
pi++
|
||||||
|
@ -762,6 +776,21 @@ Path.prototype.split = function (point) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} else if (path.ops[1].type === 'curve') {
|
} else if (path.ops[1].type === 'curve') {
|
||||||
|
if (path.ops[0].to.sitsRoughlyOn(point)) {
|
||||||
|
secondHalf.push(new Path(this.debug)
|
||||||
|
.withRaise(this.raise)
|
||||||
|
.move(path.ops[0].to)
|
||||||
|
.curve(path.ops[1].cp1, path.ops[1].cp2, path.ops[1].to)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
else if (path.ops[1].to.sitsRoughlyOn(point)) {
|
||||||
|
firstHalf.push(new Path(this.debug)
|
||||||
|
.withRaise(this.raise)
|
||||||
|
.move(path.ops[0].to)
|
||||||
|
.curve(path.ops[1].cp1, path.ops[1].cp2, path.ops[1].to)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
else {
|
||||||
let t = pointOnCurve(path.ops[0].to, path.ops[1].cp1, path.ops[1].cp2, path.ops[1].to, point)
|
let t = pointOnCurve(path.ops[0].to, path.ops[1].cp1, path.ops[1].cp2, path.ops[1].to, point)
|
||||||
if (t !== false) {
|
if (t !== false) {
|
||||||
let curve = new Bezier(
|
let curve = new Bezier(
|
||||||
|
@ -797,8 +826,9 @@ Path.prototype.split = function (point) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (firstHalf) firstHalf = joinPaths(firstHalf, false, this.raise)
|
}
|
||||||
if (secondHalf) secondHalf = joinPaths(secondHalf, false, this.raise)
|
if (firstHalf.length > 0) firstHalf = joinPaths(firstHalf, false, this.raise)
|
||||||
|
if (secondHalf.length > 0) secondHalf = joinPaths(secondHalf, false, this.raise)
|
||||||
|
|
||||||
return [firstHalf, secondHalf]
|
return [firstHalf, secondHalf]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue