Compare commits
No commits in common. "accba862de9dbbe9d427c86c5415b1364673f9a8" and "8c9aa13edfea997cb5cc5b3624b7cf54aab84994" have entirely different histories.
accba862de
...
8c9aa13edf
@ -32,7 +32,6 @@ import { useEvent } from '@/hooks/useEvent'
|
|||||||
import { compasDegAtom } from '@/store/orientationAtom'
|
import { compasDegAtom } from '@/store/orientationAtom'
|
||||||
import { hotkeyStore } from '@/store/hotkeyAtom'
|
import { hotkeyStore } from '@/store/hotkeyAtom'
|
||||||
import { usePopup } from '@/hooks/usePopup'
|
import { usePopup } from '@/hooks/usePopup'
|
||||||
import { outerLinePointsState } from '@/store/outerLineAtom'
|
|
||||||
|
|
||||||
export default function CanvasFrame() {
|
export default function CanvasFrame() {
|
||||||
const canvasRef = useRef(null)
|
const canvasRef = useRef(null)
|
||||||
@ -46,7 +45,6 @@ export default function CanvasFrame() {
|
|||||||
const totalDisplay = useRecoilValue(totalDisplaySelector) // 집계표 표시 여부
|
const totalDisplay = useRecoilValue(totalDisplaySelector) // 집계표 표시 여부
|
||||||
const { setIsGlobalLoading } = useContext(QcastContext)
|
const { setIsGlobalLoading } = useContext(QcastContext)
|
||||||
const resetModuleStatisticsState = useResetRecoilState(moduleStatisticsState)
|
const resetModuleStatisticsState = useResetRecoilState(moduleStatisticsState)
|
||||||
const resetOuterLinePoints = useResetRecoilState(outerLinePointsState)
|
|
||||||
const resetMakersState = useResetRecoilState(makersState)
|
const resetMakersState = useResetRecoilState(makersState)
|
||||||
const resetSelectedMakerState = useResetRecoilState(selectedMakerState)
|
const resetSelectedMakerState = useResetRecoilState(selectedMakerState)
|
||||||
const resetSeriesState = useResetRecoilState(seriesState)
|
const resetSeriesState = useResetRecoilState(seriesState)
|
||||||
@ -139,7 +137,6 @@ export default function CanvasFrame() {
|
|||||||
|
|
||||||
const resetRecoilData = () => {
|
const resetRecoilData = () => {
|
||||||
// resetModuleStatisticsState()
|
// resetModuleStatisticsState()
|
||||||
resetOuterLinePoints()
|
|
||||||
resetMakersState()
|
resetMakersState()
|
||||||
resetSelectedMakerState()
|
resetSelectedMakerState()
|
||||||
resetSeriesState()
|
resetSeriesState()
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useRef, useState } from 'react'
|
import { useState, useEffect, useRef } from 'react'
|
||||||
import { useMessage } from '@/hooks/useMessage'
|
import { useMessage } from '@/hooks/useMessage'
|
||||||
import WithDraggable from '@/components/common/draggable/WithDraggable'
|
import WithDraggable from '@/components/common/draggable/WithDraggable'
|
||||||
import { useRecoilValue } from 'recoil'
|
import { useRecoilValue } from 'recoil'
|
||||||
@ -15,8 +15,8 @@ export default function DormerOffset(props) {
|
|||||||
const { closePopup } = usePopup()
|
const { closePopup } = usePopup()
|
||||||
const [arrow1, setArrow1] = useState(null)
|
const [arrow1, setArrow1] = useState(null)
|
||||||
const [arrow2, setArrow2] = useState(null)
|
const [arrow2, setArrow2] = useState(null)
|
||||||
const arrow1LengthRef = useRef(0)
|
const arrow1LengthRef = useRef()
|
||||||
const arrow2LengthRef = useRef(0)
|
const arrow2LengthRef = useRef()
|
||||||
const [arrow1Length, setArrow1Length] = useState(0)
|
const [arrow1Length, setArrow1Length] = useState(0)
|
||||||
const [arrow2Length, setArrow2Length] = useState(0)
|
const [arrow2Length, setArrow2Length] = useState(0)
|
||||||
|
|
||||||
@ -59,12 +59,12 @@ export default function DormerOffset(props) {
|
|||||||
name=""
|
name=""
|
||||||
label=""
|
label=""
|
||||||
className="input-origin block"
|
className="input-origin block"
|
||||||
value={arrow1LengthRef.current.value ?? 0}
|
value={arrow1LengthRef.current.value}
|
||||||
ref={arrow1LengthRef}
|
ref={arrow1LengthRef}
|
||||||
onChange={(value) => setArrow1Length(value)}
|
onChange={(value) => setArrow1Length(value)}
|
||||||
options={{
|
options={{
|
||||||
allowNegative: false,
|
allowNegative: false,
|
||||||
allowDecimal: false,
|
allowDecimal: false
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -170,8 +170,8 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla
|
|||||||
|
|
||||||
setCurrentRoof({
|
setCurrentRoof({
|
||||||
...selectedRoofMaterial,
|
...selectedRoofMaterial,
|
||||||
// pitch: currentRoof?.pitch,
|
pitch: currentRoof?.pitch,
|
||||||
// angle: currentRoof?.angle,
|
angle: currentRoof?.angle,
|
||||||
index: 0,
|
index: 0,
|
||||||
planNo: currentRoof.planNo,
|
planNo: currentRoof.planNo,
|
||||||
roofSizeSet: String(currentRoof.roofSizeSet),
|
roofSizeSet: String(currentRoof.roofSizeSet),
|
||||||
@ -353,21 +353,19 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla
|
|||||||
value={index === 0 ? currentRoof?.pitch || '0' : currentRoof?.angle || '0'}
|
value={index === 0 ? currentRoof?.pitch || '0' : currentRoof?.angle || '0'}
|
||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
if (index === 0) {
|
if (index === 0) {
|
||||||
const pitch = value === '' ? '' : Number(value);
|
const num = value === '' ? '' : Number(value)
|
||||||
const angle = pitch === '' ? '' : getDegreeByChon(pitch);
|
|
||||||
setCurrentRoof(prev => ({
|
setCurrentRoof(prev => ({
|
||||||
...prev,
|
...prev,
|
||||||
pitch,
|
pitch: num === '' ? '' : num,
|
||||||
angle
|
angle: num === '' ? '' : getDegreeByChon(num),
|
||||||
}));
|
}))
|
||||||
} else {
|
} else {
|
||||||
const angle = value === '' ? '' : Number(value);
|
const num = value === '' ? '' : Number(value)
|
||||||
const pitch = angle === '' ? '' : getChonByDegree(angle);
|
setCurrentRoof( prev => ({
|
||||||
setCurrentRoof(prev => ({
|
|
||||||
...prev,
|
...prev,
|
||||||
pitch,
|
pitch: num === '' ? '' : getChonByDegree(num),
|
||||||
angle
|
angle: num === '' ? '' : num,
|
||||||
}));
|
}))
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
options={{
|
options={{
|
||||||
@ -516,17 +514,13 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla
|
|||||||
{/*/>*/}
|
{/*/>*/}
|
||||||
<CalculatorInput
|
<CalculatorInput
|
||||||
id=""
|
id=""
|
||||||
name="hajebichi"
|
name={'hajebichi'}
|
||||||
label=""
|
label=""
|
||||||
className="input-origin block"
|
className="input-origin block"
|
||||||
ref={roofRef.hajebichi}
|
ref={roofRef.hajebichi}
|
||||||
value={currentRoof?.hajebichi || '0'}
|
value={currentRoof?.hajebichi||0}
|
||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
const hajebichi = value === '' ? '' : Number(value);
|
setCurrentRoof({ ...currentRoof, value })
|
||||||
setCurrentRoof(prev => ({
|
|
||||||
...prev,
|
|
||||||
hajebichi
|
|
||||||
}));
|
|
||||||
}}
|
}}
|
||||||
readOnly={currentRoof?.roofPchAuth === 'R'}
|
readOnly={currentRoof?.roofPchAuth === 'R'}
|
||||||
disabled={currentRoof?.roofSizeSet === '3'}
|
disabled={currentRoof?.roofSizeSet === '3'}
|
||||||
|
|||||||
@ -264,6 +264,7 @@ export default function Simulator() {
|
|||||||
style={{ width: '30%' }}
|
style={{ width: '30%' }}
|
||||||
className="select-light"
|
className="select-light"
|
||||||
value={pwrGnrSimType}
|
value={pwrGnrSimType}
|
||||||
|
defaultValue={`D`}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
handleChartChangeData(e.target.value)
|
handleChartChangeData(e.target.value)
|
||||||
setPwrGnrSimType(e.target.value)
|
setPwrGnrSimType(e.target.value)
|
||||||
@ -333,31 +334,33 @@ export default function Simulator() {
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{moduleInfoList.length > 0 ? (
|
{moduleInfoList.length > 0 ? (
|
||||||
moduleInfoList.map((moduleInfo) => {
|
moduleInfoList.map((moduleInfo) => {
|
||||||
return (
|
return (
|
||||||
<tr key={moduleInfo.itemId}>
|
<>
|
||||||
{/* 지붕면 */}
|
<tr key={moduleInfo.itemId}>
|
||||||
<td>{moduleInfo.roofSurface}</td>
|
{/* 지붕면 */}
|
||||||
{/* 경사각 */}
|
<td>{moduleInfo.roofSurface}</td>
|
||||||
<td>
|
{/* 경사각 */}
|
||||||
{convertNumberToPriceDecimal(moduleInfo.slopeAngle)}
|
<td>
|
||||||
{moduleInfo.classType == 0 ? '寸' : 'º'}
|
{convertNumberToPriceDecimal(moduleInfo.slopeAngle)}
|
||||||
</td>
|
{moduleInfo.classType == 0 ? '寸' : 'º'}
|
||||||
{/* 방위각(도) */}
|
</td>
|
||||||
<td>{convertNumberToPriceDecimal(moduleInfo.azimuth)}</td>
|
{/* 방위각(도) */}
|
||||||
{/* 태양전지모듈 */}
|
<td>{convertNumberToPriceDecimal(moduleInfo.azimuth)}</td>
|
||||||
<td>
|
{/* 태양전지모듈 */}
|
||||||
<div className="overflow-lab">{moduleInfo.itemNo}</div>
|
<td>
|
||||||
</td>
|
<div className="overflow-lab">{moduleInfo.itemNo}</div>
|
||||||
{/* 매수 */}
|
</td>
|
||||||
<td>{convertNumberToPriceDecimal(moduleInfo.amount)}</td>
|
{/* 매수 */}
|
||||||
</tr>
|
<td>{convertNumberToPriceDecimal(moduleInfo.amount)}</td>
|
||||||
)
|
</tr>
|
||||||
})
|
</>
|
||||||
) : (
|
)
|
||||||
<tr>
|
})
|
||||||
<td colSpan={5}>{getMessage('common.message.no.data')}</td>
|
) : (
|
||||||
|
<tr>
|
||||||
|
<td colSpan={5}>{getMessage('common.message.no.data')}</td>
|
||||||
</tr>
|
</tr>
|
||||||
)}
|
)}
|
||||||
</tbody>
|
</tbody>
|
||||||
@ -382,23 +385,25 @@ export default function Simulator() {
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{pcsInfoList.length > 0 ? (
|
{pcsInfoList.length > 0 ? (
|
||||||
pcsInfoList.map((pcsInfo) => {
|
pcsInfoList.map((pcsInfo) => {
|
||||||
return (
|
return (
|
||||||
<tr key={pcsInfo.itemId}>
|
<>
|
||||||
{/* 파워컨디셔너 */}
|
<tr key={pcsInfo.itemId}>
|
||||||
<td className="al-l">
|
{/* 파워컨디셔너 */}
|
||||||
<div className="overflow-lab">{pcsInfo.itemNo}</div>
|
<td className="al-l">
|
||||||
</td>
|
<div className="overflow-lab">{pcsInfo.itemNo}</div>
|
||||||
{/* 대 */}
|
</td>
|
||||||
<td>{convertNumberToPriceDecimal(pcsInfo.amount)}</td>
|
{/* 대 */}
|
||||||
</tr>
|
<td>{convertNumberToPriceDecimal(pcsInfo.amount)}</td>
|
||||||
)
|
</tr>
|
||||||
})
|
</>
|
||||||
) : (
|
)
|
||||||
<tr>
|
})
|
||||||
<td colSpan={2}>{getMessage('common.message.no.data')}</td>
|
) : (
|
||||||
</tr>
|
<tr>
|
||||||
|
<td colSpan={2}>{getMessage('common.message.no.data')}</td>
|
||||||
|
</tr>
|
||||||
)}
|
)}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@ -42,7 +42,6 @@ import { useEvent } from '@/hooks/useEvent'
|
|||||||
import { logger } from '@/util/logger'
|
import { logger } from '@/util/logger'
|
||||||
import { useText } from '@/hooks/useText'
|
import { useText } from '@/hooks/useText'
|
||||||
import { usePolygon } from '@/hooks/usePolygon'
|
import { usePolygon } from '@/hooks/usePolygon'
|
||||||
import { getDegreeByChon } from '@/util/canvas-util'
|
|
||||||
|
|
||||||
const defaultDotLineGridSetting = {
|
const defaultDotLineGridSetting = {
|
||||||
INTERVAL: {
|
INTERVAL: {
|
||||||
@ -178,8 +177,8 @@ export function useCanvasSetting(executeEffect = true) {
|
|||||||
raft: item.raftBase && parseInt(item.raftBase),
|
raft: item.raftBase && parseInt(item.raftBase),
|
||||||
layout: ['ROOF_ID_SLATE', 'ROOF_ID_SINGLE'].includes(item.roofMatlCd) ? ROOF_MATERIAL_LAYOUT.STAIRS : ROOF_MATERIAL_LAYOUT.PARALLEL,
|
layout: ['ROOF_ID_SLATE', 'ROOF_ID_SINGLE'].includes(item.roofMatlCd) ? ROOF_MATERIAL_LAYOUT.STAIRS : ROOF_MATERIAL_LAYOUT.PARALLEL,
|
||||||
hajebichi: item.roofPchBase && parseInt(item.roofPchBase),
|
hajebichi: item.roofPchBase && parseInt(item.roofPchBase),
|
||||||
pitch: item.inclBase ? parseInt(item.inclBase) : 4,
|
pitch: item.pitch ? parseInt(item.pitch) : 4,
|
||||||
angle: getDegreeByChon(item.inclBase ? parseInt(item.inclBase): 4) //item.angle ? parseInt(item.angle) : 21.8,
|
angle: item.angle ? parseInt(item.angle) : 21.8,
|
||||||
}))
|
}))
|
||||||
setRoofMaterials(roofLists)
|
setRoofMaterials(roofLists)
|
||||||
return roofLists
|
return roofLists
|
||||||
|
|||||||
@ -114,54 +114,46 @@ export function useRoofAllocationSetting(id) {
|
|||||||
*/
|
*/
|
||||||
const fetchBasicSettings = async (planNo) => {
|
const fetchBasicSettings = async (planNo) => {
|
||||||
try {
|
try {
|
||||||
const response = await get({ url: `/api/canvas-management/canvas-basic-settings/by-object/${correntObjectNo}/${planNo}` });
|
await get({ url: `/api/canvas-management/canvas-basic-settings/by-object/${correntObjectNo}/${planNo}` }).then((res) => {
|
||||||
|
let roofsArray = {}
|
||||||
let roofsArray = [];
|
|
||||||
|
if (res.length > 0) {
|
||||||
// API에서 데이터를 성공적으로 가져온 경우
|
roofsArray = res.map((item) => {
|
||||||
if (response && response.length > 0) {
|
return {
|
||||||
roofsArray = response.map((item, index) => ({
|
planNo: item.planNo,
|
||||||
planNo: item.planNo,
|
roofApply: item.roofApply,
|
||||||
roofApply: item.roofApply,
|
roofSeq: item.roofSeq,
|
||||||
roofSeq: item.roofSeq || index,
|
roofMatlCd: item.roofMatlCd,
|
||||||
roofMatlCd: item.roofMatlCd,
|
roofWidth: item.roofWidth,
|
||||||
roofWidth: item.roofWidth,
|
roofHeight: item.roofHeight,
|
||||||
roofHeight: item.roofHeight,
|
roofHajebichi: item.roofHajebichi,
|
||||||
roofHajebichi: item.roofHajebichi,
|
roofGap: item.roofGap,
|
||||||
roofGap: item.roofGap,
|
roofLayout: item.roofLayout,
|
||||||
roofLayout: item.roofLayout,
|
roofPitch: item.roofPitch,
|
||||||
roofPitch: item.roofPitch,
|
roofAngle: item.roofAngle,
|
||||||
roofAngle: item.roofAngle,
|
}
|
||||||
selected: index === 0, // 첫 번째 항목을 기본 선택으로 설정
|
})
|
||||||
index: index
|
} else {
|
||||||
}));
|
if (roofList.length > 0) {
|
||||||
}
|
roofsArray = roofList
|
||||||
// API에서 데이터가 없고 기존 roofList가 있는 경우
|
} else {
|
||||||
else if (roofList && roofList.length > 0) {
|
roofsArray = [
|
||||||
roofsArray = roofList.map((roof, index) => ({
|
{
|
||||||
...roof,
|
planNo: planNo,
|
||||||
selected: index === 0 // 첫 번째 항목을 기본 선택으로 설정
|
roofApply: true,
|
||||||
}));
|
roofSeq: 0,
|
||||||
}
|
roofMatlCd: 'ROOF_ID_WA_53A',
|
||||||
// 둘 다 없는 경우 기본값 설정
|
roofWidth: 265,
|
||||||
else {
|
roofHeight: 235,
|
||||||
roofsArray = [
|
roofHajebichi: 0,
|
||||||
{
|
roofGap: 'HEI_455',
|
||||||
planNo: planNo,
|
roofLayout: 'P',
|
||||||
roofApply: true,
|
|
||||||
roofSeq: 0,
|
|
||||||
roofMatlCd: 'ROOF_ID_WA_53A',
|
|
||||||
roofWidth: 265,
|
|
||||||
roofHeight: 235,
|
|
||||||
roofHajebichi: 0,
|
|
||||||
roofGap: 'HEI_455',
|
|
||||||
roofLayout: 'P',
|
|
||||||
roofPitch: 4,
|
roofPitch: 4,
|
||||||
roofAngle: 21.8,
|
roofAngle: 21.8,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 데이터 설정
|
* 데이터 설정
|
||||||
@ -213,7 +205,7 @@ export function useRoofAllocationSetting(id) {
|
|||||||
angle: roof.angle ?? '',
|
angle: roof.angle ?? '',
|
||||||
}))
|
}))
|
||||||
setCurrentRoofList(normalizedRoofs)
|
setCurrentRoofList(normalizedRoofs)
|
||||||
|
})
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Data fetching error:', error)
|
console.error('Data fetching error:', error)
|
||||||
}
|
}
|
||||||
@ -382,18 +374,11 @@ export function useRoofAllocationSetting(id) {
|
|||||||
setBasicSetting((prev) => {
|
setBasicSetting((prev) => {
|
||||||
return { ...prev, selectedRoofMaterial: newRoofList.find((roof) => roof.selected) }
|
return { ...prev, selectedRoofMaterial: newRoofList.find((roof) => roof.selected) }
|
||||||
})
|
})
|
||||||
const selectedRoofMaterial = newRoofList.find((roof) => roof.selected)
|
|
||||||
const roofs = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF && obj.roofMaterial?.index === selectedRoofMaterial.index)
|
|
||||||
|
|
||||||
roofs.forEach((roof) => {
|
|
||||||
setSurfaceShapePattern(roof, roofDisplay.column, false, { ...selectedRoofMaterial }, true)
|
|
||||||
drawDirectionArrow(roof)
|
|
||||||
})
|
|
||||||
|
|
||||||
setRoofList(newRoofList)
|
setRoofList(newRoofList)
|
||||||
setRoofMaterials(newRoofList)
|
setRoofMaterials(newRoofList)
|
||||||
setRoofsStore(newRoofList)
|
setRoofsStore(newRoofList)
|
||||||
|
const selectedRoofMaterial = newRoofList.find((roof) => roof.selected)
|
||||||
setSurfaceShapePattern(currentObject, roofDisplay.column, false, selectedRoofMaterial, true)
|
setSurfaceShapePattern(currentObject, roofDisplay.column, false, selectedRoofMaterial, true)
|
||||||
drawDirectionArrow(currentObject)
|
drawDirectionArrow(currentObject)
|
||||||
modifyModuleSelectionData()
|
modifyModuleSelectionData()
|
||||||
|
|||||||
@ -29,39 +29,22 @@ fabric.Rect.prototype.getCurrentPoints = function () {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* fabric.Group에 getCurrentPoints 메서드를 추가 (도머 그룹용)
|
* fabric.Group에 getCurrentPoints 메서드를 추가 (도머 그룹용)
|
||||||
* 그룹 내 객체들의 점들을 수집하여 현재 월드 좌표를 반환
|
* 그룹의 groupPoints를 다시 계산하여 반환
|
||||||
*/
|
*/
|
||||||
fabric.Group.prototype.getCurrentPoints = function () {
|
fabric.Group.prototype.getCurrentPoints = function () {
|
||||||
// 그룹 내 객체들로부터 실시간으로 점들을 계산
|
// groupPoints를 다시 계산
|
||||||
if (this._objects && this._objects.length > 0) {
|
|
||||||
let allPoints = []
|
|
||||||
|
|
||||||
// 그룹 내 모든 객체의 점들을 수집
|
// 그룹에 groupPoints가 있으면 해당 점들을 사용 (도머의 경우)
|
||||||
this._objects.forEach(function (obj) {
|
if (this.groupPoints && Array.isArray(this.groupPoints)) {
|
||||||
if (obj.getCurrentPoints && typeof obj.getCurrentPoints === 'function') {
|
const matrix = this.calcTransformMatrix()
|
||||||
const objPoints = obj.getCurrentPoints()
|
console.log('this.groupPoints', this.groupPoints)
|
||||||
allPoints = allPoints.concat(objPoints)
|
return this.groupPoints.map(function (p) {
|
||||||
} else if (obj.points && Array.isArray(obj.points)) {
|
const point = new fabric.Point(p.x, p.y)
|
||||||
const pathOffset = obj.pathOffset || { x: 0, y: 0 }
|
return fabric.util.transformPoint(point, matrix)
|
||||||
const matrix = obj.calcTransformMatrix()
|
|
||||||
const transformedPoints = obj.points
|
|
||||||
.map(function (p) {
|
|
||||||
return new fabric.Point(p.x - pathOffset.x, p.y - pathOffset.y)
|
|
||||||
})
|
|
||||||
.map(function (p) {
|
|
||||||
return fabric.util.transformPoint(p, matrix)
|
|
||||||
})
|
|
||||||
allPoints = allPoints.concat(transformedPoints)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
if (allPoints.length > 0) {
|
|
||||||
// Convex Hull 알고리즘을 사용하여 외곽 점들만 반환
|
|
||||||
return this.getConvexHull(allPoints)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 객체가 없으면 바운딩 박스를 사용
|
// groupPoints가 없으면 바운딩 박스를 사용
|
||||||
const bounds = this.getBoundingRect()
|
const bounds = this.getBoundingRect()
|
||||||
const points = [
|
const points = [
|
||||||
{ x: bounds.left, y: bounds.top },
|
{ x: bounds.left, y: bounds.top },
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user