1
0
Fork 0

Merge pull request #2044 from freesewing/joost-pathsplitonstartend

fix(core): Handle path split on start/end of path segments
This commit is contained in:
Joost De Cock 2022-03-30 18:21:33 +02:00 committed by GitHub
commit 027ce3d290
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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]
} }