Merge pull request 'dev' (#136) from dev into dev-deploy

Reviewed-on: #136
This commit is contained in:
ysCha 2025-06-20 17:07:23 +09:00
commit be4c6ecf65

View File

@ -5404,6 +5404,80 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => {
.toNumber(),
]
const oppositeHipPoints = []
const ridgeEdge = { vertex1: { x: points[0], y: points[1] }, vertex2: { x: points[2], y: points[3] } }
if (prevLine.attributes.type === LINE_TYPE.WALLLINE.EAVES && beforePrevLine.line.attributes.type === LINE_TYPE.WALLLINE.EAVES) {
let hipVector = getHalfAngleVector(prevLine, beforePrevLine.line)
/** 이전 라인과의 사이 추녀마루의 각도를 확인한다, 각도가 지붕안쪽으로 향하지 않을때 반대로 처리한다.*/
const checkPoint = {
x: Big(prevLine.x1).plus(Big(hipVector.x).times(10)),
y: Big(prevLine.y1).plus(Big(hipVector.y).times(10)),
}
if (!checkWallPolygon.inPolygon(checkPoint)) {
hipVector = { x: -hipVector.x, y: -hipVector.y }
}
const hipEdge = {
vertex1: { x: prevLine.x1, y: prevLine.y1 },
vertex2: {
x: Big(prevLine.x1).plus(Big(hipVector.x).times(prevLine.attributes.planeSize)).toNumber(),
y: Big(prevLine.y1).plus(Big(hipVector.y).times(prevLine.attributes.planeSize)).toNumber(),
},
}
const intersection = edgesIntersection(ridgeEdge, hipEdge)
if (intersection) {
const size = Big(points[0] - intersection.x)
.abs()
.pow(2)
.plus(
Big(points[1] - intersection.y)
.abs()
.pow(2),
)
.sqrt()
.toNumber()
oppositeHipPoints.push({ x: intersection.x, y: intersection.y, size })
}
}
if (nextLine.attributes.type === LINE_TYPE.WALLLINE.EAVES && afterNextLine.line.attributes.type === LINE_TYPE.WALLLINE.EAVES) {
let hipVector = getHalfAngleVector(nextLine, afterNextLine.line)
/** 이전 라인과의 사이 추녀마루의 각도를 확인한다, 각도가 지붕안쪽으로 향하지 않을때 반대로 처리한다.*/
const checkPoint = {
x: Big(nextLine.x1).plus(Big(hipVector.x).times(10)),
y: Big(nextLine.y1).plus(Big(hipVector.y).times(10)),
}
if (!checkWallPolygon.inPolygon(checkPoint)) {
hipVector = { x: -hipVector.x, y: -hipVector.y }
}
const hipEdge = {
vertex1: { x: nextLine.x2, y: nextLine.y2 },
vertex2: {
x: Big(nextLine.x2).plus(Big(hipVector.x).times(nextLine.attributes.planeSize)).toNumber(),
y: Big(nextLine.y2).plus(Big(hipVector.y).times(nextLine.attributes.planeSize)).toNumber(),
},
}
const intersection = edgesIntersection(ridgeEdge, hipEdge)
if (intersection) {
const size = Big(points[0] - intersection.x)
.abs()
.pow(2)
.plus(
Big(points[1] - intersection.y)
.abs()
.pow(2),
)
.sqrt()
.toNumber()
oppositeHipPoints.push({ x: intersection.x, y: intersection.y, size })
}
}
if (oppositeHipPoints.length > 0) {
const oppositeHipPoint = oppositeHipPoints.sort((a, b) => a.size - b.size)[0]
points[2] = oppositeHipPoint.x
points[3] = oppositeHipPoint.y
}
/** 동일 라인이 있는지 확인. */
if (
baseRidgeLines.filter((line) => {
@ -5423,7 +5497,10 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => {
}
const ridgeLine = drawRidgeLine(points, canvas, roof, textMode)
if (gableType.includes(beforePrevLine.line.attributes.type) || gableType.includes(afterNextLine.line.attributes.type)) {
if (
oppositeHipPoints.length === 0 &&
(gableType.includes(beforePrevLine.line.attributes.type) || gableType.includes(afterNextLine.line.attributes.type))
) {
baseGableRidgeLines.push(ridgeLine)
} else {
baseRidgeLines.push(ridgeLine)
@ -5453,7 +5530,10 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => {
nextHipLine.fire('modified')
canvas.renderAll()
if (gableType.includes(beforePrevLine.line.attributes.type) || gableType.includes(afterNextLine.line.attributes.type)) {
if (
oppositeHipPoints.length === 0 &&
(gableType.includes(beforePrevLine.line.attributes.type) || gableType.includes(afterNextLine.line.attributes.type))
) {
const oppositeLine = gableType.includes(beforePrevLine.line.attributes.type) ? beforePrevLine.line : afterNextLine.line
if (Math.sign(ridgeLine.x1 - ridgeLine.x2) === 0) {
const gableVector = Math.sign(ridgeLine.x1 - oppositeLine.x1)
@ -6072,22 +6152,12 @@ export const drawRidgeRoof = (roofId, canvas, textMode) => {
})
intersectRidgePoints.sort((prev, current) => prev.size.minus(current.size).toNumber())
if (intersectRidgePoints.length > 0) {
const oldPlaneSize = hipLine.line.attributes.planeSize
const oldActualSize = hipLine.line.attributes.actualSize
const theta = Big(Math.acos(Big(oldPlaneSize).div(oldActualSize)))
.times(180)
.div(Math.PI)
const planeSize = calcLinePlaneSize({
x1: hipLine.line.x1,
y1: hipLine.line.y1,
x2: hipLine.line.x2,
y2: hipLine.line.y2,
})
hipLine.x2 = intersectRidgePoints[0].x
hipLine.y2 = intersectRidgePoints[0].y
hipLine.line.set({ x2: intersectRidgePoints[0].x, y2: intersectRidgePoints[0].y })
hipLine.line.attributes.planeSize = planeSize
hipLine.line.attributes.actualSize = planeSize === oldActualSize ? 0 : Big(planeSize).div(theta).round(1).toNumber()
const hipSize = reCalculateSize(hipLine.line)
hipLine.line.attributes.planeSize = hipSize.planeSize
hipLine.line.attributes.actualSize = hipSize.actualSize
hipLine.line.fire('modified')
}
}