모듈 자동 레이아웃 설치 validate 작업중

This commit is contained in:
yjnoh 2025-04-29 13:09:46 +09:00
parent 1c7b81c99f
commit ed27f2ed93
4 changed files with 140 additions and 67 deletions

View File

@ -125,6 +125,11 @@ export const TRESTLE_MATERIAL = {
BRACKET: 'bracket',
}
export const MODULE_SETUP_TYPE = {
LAYOUT: 'layout',
AUTO: 'auto',
}
export const SAVE_KEY = [
'selectable',
'name',

View File

@ -1,4 +1,4 @@
import { POLYGON_TYPE } from '@/common/common'
import { POLYGON_TYPE, MODULE_SETUP_TYPE } from '@/common/common'
import WithDraggable from '@/components/common/draggable/WithDraggable'
import { Orientation } from '@/components/floor-plan/modal/basic/step/Orientation'
import PitchPlacement from '@/components/floor-plan/modal/basic/step/pitch/PitchPlacement'
@ -334,10 +334,10 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
<button className={`btn-frame modal mr5 ${isManualModuleSetup ? 'act' : ''}`} onClick={handleManualModuleSetup}>
{getMessage('modal.module.basic.setting.passivity.placement')}
</button>
<button className="btn-frame modal act mr5" onClick={() => autoModuleSetup('auto')}>
<button className="btn-frame modal act mr5" onClick={() => autoModuleSetup(MODULE_SETUP_TYPE.AUTO)}>
{getMessage('modal.module.basic.setting.auto.placement')}
</button>
<button className="btn-frame modal act" onClick={() => autoModuleSetup('layout', layoutSetup)}>
<button className="btn-frame modal act" onClick={() => autoModuleSetup(MODULE_SETUP_TYPE.LAYOUT, layoutSetup)}>
{getMessage('modal.module.basic.setting.auto.row.batch')}
</button>
</>

View File

@ -64,9 +64,9 @@ const Placement = forwardRef((props, refs) => {
}
}, [])
useEffect(() => {
console.log('moduleRowColArray', moduleRowColArray)
}, [moduleRowColArray])
// useEffect(() => {
// console.log('moduleRowColArray', moduleRowColArray)
// }, [moduleRowColArray])
//
useEffect(() => {

View File

@ -19,7 +19,7 @@ import offsetPolygon, { calculateAngle, createLinesFromPolygon } from '@/util/qp
import { QPolygon } from '@/components/fabric/QPolygon'
import { moduleSetupSurfaceState } from '@/store/canvasAtom'
import { useEvent } from '@/hooks/useEvent'
import { POLYGON_TYPE, BATCH_TYPE, LINE_TYPE } from '@/common/common'
import { POLYGON_TYPE, BATCH_TYPE, LINE_TYPE, MODULE_SETUP_TYPE } from '@/common/common'
import * as turf from '@turf/turf'
import { useSwal } from '@/hooks/useSwal'
import { compasDegAtom } from '@/store/orientationAtom'
@ -1772,6 +1772,8 @@ export function useModuleBasicSetting(tabNum) {
const autoModuleSetup = (type, layoutSetupRef) => {
initEvent() //마우스 이벤트 초기화
console.log('checkedModule', checkedModule)
//실패한 지붕재 배열
let failAutoSetupRoof = []
@ -1780,7 +1782,7 @@ export function useModuleBasicSetting(tabNum) {
/**
* 자동 레이아웃일때 0 있거나 혼합이 있는지 확인하는 로직
*/
if (type === 'layout') {
if (type === MODULE_SETUP_TYPE.LAYOUT) {
checkedLayoutData = layoutSetupRef.filter((module) => module.checked)
const hasZeroLength = checkedLayoutData.some((module) => module.row === 0 || module.col === 0)
@ -1789,15 +1791,15 @@ export function useModuleBasicSetting(tabNum) {
return
}
//혼합 가능 모듈과 혼합 불가능 모듈을 선택했을때 카운트를 해서 확인
const mixAsgY = checkedModule.filter((obj) => obj.mixAsgYn === 'Y')
const mixAsgN = checkedModule.filter((obj) => obj.mixAsgYn === 'N')
// //혼합 가능 모듈과 혼합 불가능 모듈을 선택했을때 카운트를 해서 확인
// const mixAsgY = checkedModule.filter((obj) => obj.mixAsgYn === 'Y')
// const mixAsgN = checkedModule.filter((obj) => obj.mixAsgYn === 'N')
//Y인 모듈과 N인 모듈이 둘다 존재하면 설치 불가
if (mixAsgY.length > 0 && mixAsgN.length > 0) {
swalFire({ text: getMessage('modal.module.basic.setting.module.placement.mix.asg.yn.error'), icon: 'warning' })
return
}
// //Y인 모듈과 N인 모듈이 둘다 존재하면 설치 불가
// if (mixAsgY.length > 0 && mixAsgN.length > 0) {
// swalFire({ text: getMessage('modal.module.basic.setting.module.placement.mix.asg.yn.error'), icon: 'warning' })
// return
// }
}
if (checkedModule.length === 0) {
@ -1805,16 +1807,6 @@ export function useModuleBasicSetting(tabNum) {
return
}
// //혼합 가능 모듈과 혼합 불가능 모듈을 선택했을때 카운트를 해서 확인
// const mixAsgY = checkedModule.filter((obj) => obj.mixAsgYn === 'Y')
// const mixAsgN = checkedModule.filter((obj) => obj.mixAsgYn === 'N')
// //Y인 모듈과 N인 모듈이 둘다 존재하면 설치 불가
// if (mixAsgY.length > 0 && mixAsgN.length > 0) {
// swalFire({ text: getMessage('modal.module.basic.setting.module.placement.mix.asg.yn.error') })
// return
// }
const isChidori = moduleSetupOption.isChidori
const setupLocation = moduleSetupOption.setupLocation
const isMaxSetup = false
@ -1859,6 +1851,9 @@ export function useModuleBasicSetting(tabNum) {
name: POLYGON_TYPE.MODULE,
}
//체크된 모듈 중에 북면 모듈이 있는지 확인하는 로직
const isIncludeNorthModule = checkedModule.some((module) => module.northModuleYn === 'Y')
//선택된 지붕안에 오브젝트(도머, 개구등)이 있는지 확인하는 로직 포함되면 배열 반환
const objectsIncludeSurface = (turfModuleSetupSurface) => {
let containsBatchObjects = []
@ -1891,32 +1886,108 @@ export function useModuleBasicSetting(tabNum) {
* @returns
*/
const checkAutoLayoutModuleSetup = (moduleSetupSurface, trestleDetailData) => {
const isMultipleModules = checkedModule.length > 1 //모듈이 여러개면
const maxCol = trestleDetailData.moduleMaxCols //최대 열수 -> 얘는 멀티랑 관계없음
const maxRow = isMultipleModules
? trestleDetailData.moduleMaxRows
: trestleDetailData.module.find((item) => item.moduleTpCd === checkedModule[0].moduleTpCd).moduleMaxRows //멀티모듈이면 밖에 maxRows로 판단 아니면 module->itemmList를 가지고 판단
/**
* 체크된 모듈중에 북면 모듈이 있으면 북면 모듈만 따로 계산하고 아니면 전체 모듈을 계산
* 북면 모듈이 있고 북면이 들어오면 북면의 row를 계산한다
*
*/
//단수 합단수
const sumRowCount = isMultipleModules
? layoutSetupRef.filter((item) => item.checked).reduce((acc, cur) => acc + cur.row, 0)
: layoutSetupRef.find((item) => item.moduleId === checkedModule[0].itemId).row //멀티모듈이면 전체 합, 체크된 한개의 열
//북면 모듈이 없을때
if (!isIncludeNorthModule) {
const isMultipleModules = checkedModule.length > 1 //모듈이 여러개면
const maxCol = trestleDetailData.moduleMaxCols //최대 열수 -> 얘는 멀티랑 관계없음
const maxRow = isMultipleModules
? trestleDetailData.moduleMaxRows
: trestleDetailData.module.find((item) => item.moduleTpCd === checkedModule[0].moduleTpCd).moduleMaxRows //멀티모듈이면 밖에 maxRows로 판단 아니면 module->itemmList를 가지고 판단
//
const sumColCount = layoutSetupRef.filter((item) => item.col).some((item) => item.col > maxCol)
//단수 합단수
const sumRowCount = isMultipleModules
? layoutSetupRef.filter((item) => item.checked).reduce((acc, cur) => acc + cur.row, 0)
: layoutSetupRef.find((item) => item.moduleId === checkedModule[0].itemId).row //멀티모듈이면 전체 합, 체크된 한개의 열
if (sumRowCount > maxRow || sumColCount) {
failAutoSetupRoof.push(moduleSetupSurface)
return false
}
//
const sumColCount = layoutSetupRef.filter((item) => item.col).some((item) => item.col > maxCol)
// 혼합일때 모듈 개별의 row를 체크함
const isPassedObject =
isMultipleModules && layoutSetupRef.find((item, index) => item.checked && item.row > trestleDetailData.module[index].mixModuleMaxRows)
if (sumRowCount > maxRow || sumColCount) {
failAutoSetupRoof.push(moduleSetupSurface)
return false
}
if (isPassedObject) {
failAutoSetupRoof.push(moduleSetupSurface)
return false
// 혼합일때 모듈 개별의 row를 체크함
const isPassedObject =
isMultipleModules && layoutSetupRef.find((item, index) => item.checked && item.row > trestleDetailData.module[index].mixModuleMaxRows)
if (isPassedObject) {
failAutoSetupRoof.push(moduleSetupSurface)
return false
}
} else {
//북면 모듈만 선택했을때
if (checkedModule.length === 1) {
const maxCol = trestleDetailData.moduleMaxCols //최대 열수 -> 얘는 멀티랑 관계없음
const maxRow = trestleDetailData.module.find((item) => item.moduleTpCd === checkedModule[0].moduleTpCd).moduleMaxRows //멀티모듈이면 밖에 maxRows로 판단 아니면 module->itemmList를 가지고 판단
//단수 합단수
const sumRowCount = layoutSetupRef.find((item) => item.moduleId === checkedModule[0].itemId).row //멀티모듈이면 전체 합, 체크된 한개의 열
const sumColCount = layoutSetupRef.filter((item) => item.col).some((item) => item.col > maxCol)
if (sumRowCount > maxRow || sumColCount) {
failAutoSetupRoof.push(moduleSetupSurface)
return false
}
} else {
const normalModule = checkedModule.filter((item) => item.northModuleYn === 'N')
const northModule = checkedModule.filter((item) => item.northModuleYn === 'Y')
//만약 북면 모듈이 2개면 이 하위 로직 가져다가 쓰면됨 northModule === 만 바꾸면 될듯
// northModule을 배열로 만들고 include로 해서 체크 해야됨
if (normalModule.length > 0 && !moduleSetupSurface.isNorth) {
const isMultipleModules = normalModule.length > 1 //모듈이 여러개면
const maxCol = trestleDetailData.moduleMaxCols //최대 열수 -> 얘는 멀티랑 관계없음
const maxRow = isMultipleModules
? trestleDetailData.moduleMaxRows
: trestleDetailData.module.find((item) => item.moduleTpCd === normalModule[0].moduleTpCd).moduleMaxRows //멀티모듈이면 밖에 maxRows로 판단 아니면 module->itemmList를 가지고 판단
//단수 합단수
const sumRowCount = isMultipleModules
? layoutSetupRef.filter((item) => item.checked && item.moduleId !== northModule[0].itemId).reduce((acc, cur) => acc + cur.row, 0)
: layoutSetupRef.find((item) => item.moduleId === normalModule[0].itemId).row //멀티모듈이면 전체 합, 체크된 한개의 열
//
const sumColCount = layoutSetupRef.filter((item) => item.col && item.moduleId !== northModule[0].itemId).some((item) => item.col > maxCol)
if (sumRowCount > maxRow || sumColCount) {
failAutoSetupRoof.push(moduleSetupSurface)
return false
}
// 혼합일때 모듈 개별의 row를 체크함
const isPassedObject =
isMultipleModules &&
layoutSetupRef.find(
(item, index) =>
item.checked && item.moduleId !== northModule[0].itemId && item.row > trestleDetailData.module[index].mixModuleMaxRows,
)
if (isPassedObject) {
failAutoSetupRoof.push(moduleSetupSurface)
return false
}
}
if (northModule.length > 0 && moduleSetupSurface.isNorth) {
const maxCol = trestleDetailData.moduleMaxCols //최대 열수 -> 얘는 멀티랑 관계없음
const maxRow = trestleDetailData.module.find((item) => item.moduleTpCd === checkedModule[0].moduleTpCd).moduleMaxRows //멀티모듈이면 밖에 maxRows로 판단 아니면 module->itemmList를 가지고 판단
const sumRowCount = layoutSetupRef.find((item) => item.moduleId === northModule[0].itemId).row
const sumColCount = layoutSetupRef.filter((item) => item.col && item.moduleId !== northModule[0].itemId).some((item) => item.col > maxCol)
if (sumRowCount > maxRow || sumColCount) {
failAutoSetupRoof.push(moduleSetupSurface)
return false
}
}
}
}
return true
}
@ -1943,12 +2014,11 @@ export function useModuleBasicSetting(tabNum) {
let flowLines
let installedModuleMixYn
const isNorthSurface = moduleSetupSurface.isNorth
const isIncludeNorthModule = checkedModule.some((module) => module.northModuleYn === 'Y') //체크된 모듈 중에 북면 모듈이 있는지 확인하는 로직
let layoutRow = 0
let layoutCol = 0
if (type === 'layout') {
if (type === MODULE_SETUP_TYPE.LAYOUT) {
const isPassed = checkAutoLayoutModuleSetup(moduleSetupSurface, trestleDetailData)
if (!isPassed) {
return
@ -1958,7 +2028,7 @@ export function useModuleBasicSetting(tabNum) {
for (let moduleIndex = 0; moduleIndex < checkedModule.length; moduleIndex++) {
const module = checkedModule[moduleIndex]
if (type === 'layout' && checkedLayoutData) {
if (type === MODULE_SETUP_TYPE.LAYOUT && checkedLayoutData) {
const layout = checkedLayoutData.find((item) => module.itemId === item.moduleId)
layoutRow = layout.row
layoutCol = layout.col
@ -2009,7 +2079,7 @@ export function useModuleBasicSetting(tabNum) {
let calcAreaHeight = flowLines.bottom.y1 - flowLines.top.y1
let calcModuleHeightCount = calcAreaHeight / (height + intvVer + 1)
if (type === 'layout') {
if (type === MODULE_SETUP_TYPE.LAYOUT) {
calcModuleWidthCount = layoutCol > calcModuleWidthCount ? calcModuleWidthCount : layoutCol
calcModuleHeightCount = layoutRow
}
@ -2095,9 +2165,9 @@ export function useModuleBasicSetting(tabNum) {
installedLastHeightCoord = moduleY - height - heightMargin
} else {
//디버깅용
tempModule.set({ fill: 'transparent', stroke: 'red', strokeWidth: 1 })
canvas?.add(tempModule)
canvas.renderAll()
// tempModule.set({ fill: 'transparent', stroke: 'red', strokeWidth: 1 })
// canvas?.add(tempModule)
// canvas.renderAll()
}
}
if (isInstall) {
@ -2136,7 +2206,7 @@ export function useModuleBasicSetting(tabNum) {
let layoutRow = 0
let layoutCol = 0
if (type === 'layout') {
if (type === MODULE_SETUP_TYPE.LAYOUT) {
const isPassed = checkAutoLayoutModuleSetup(moduleSetupSurface, trestleDetailData)
if (!isPassed) {
return
@ -2146,7 +2216,7 @@ export function useModuleBasicSetting(tabNum) {
for (let moduleIndex = 0; moduleIndex < checkedModule.length; moduleIndex++) {
const module = checkedModule[moduleIndex]
if (type === 'layout' && checkedLayoutData) {
if (type === MODULE_SETUP_TYPE.LAYOUT && checkedLayoutData) {
const layout = checkedLayoutData.find((item) => module.itemId === item.moduleId)
layoutRow = layout.row
layoutCol = layout.col
@ -2204,7 +2274,7 @@ export function useModuleBasicSetting(tabNum) {
let calcModuleHeightCount = calcAreaHeight / (height + intvVer + 1)
//단수지정 자동이면
if (type === 'layout') {
if (type === MODULE_SETUP_TYPE.LAYOUT) {
calcModuleWidthCount = layoutCol > calcModuleWidthCount ? calcModuleWidthCount : layoutCol
calcModuleHeightCount = layoutRow
}
@ -2325,7 +2395,7 @@ export function useModuleBasicSetting(tabNum) {
let layoutRow = 0
let layoutCol = 0
if (type === 'layout') {
if (type === MODULE_SETUP_TYPE.LAYOUT) {
const isPassed = checkAutoLayoutModuleSetup(moduleSetupSurface, trestleDetailData)
if (!isPassed) {
return
@ -2336,7 +2406,7 @@ export function useModuleBasicSetting(tabNum) {
const module = checkedModule[moduleIndex]
//단수 지정이면
if (type === 'layout' && checkedLayoutData) {
if (type === MODULE_SETUP_TYPE.LAYOUT && checkedLayoutData) {
const layout = checkedLayoutData.find((item) => module.itemId === item.moduleId)
layoutRow = layout.row
layoutCol = layout.col
@ -2397,7 +2467,7 @@ export function useModuleBasicSetting(tabNum) {
let calcModuleHeightCount = calcAreaHeight / (width + intvVer + 1)
//단수지정 자동이면
if (type === 'layout') {
if (type === MODULE_SETUP_TYPE.LAYOUT) {
calcModuleWidthCount = layoutCol > calcModuleWidthCount ? calcModuleWidthCount : layoutCol
calcModuleHeightCount = layoutRow
}
@ -2518,7 +2588,7 @@ export function useModuleBasicSetting(tabNum) {
let layoutRow = 0
let layoutCol = 0
if (type === 'layout') {
if (type === MODULE_SETUP_TYPE.LAYOUT) {
const isPassed = checkAutoLayoutModuleSetup(moduleSetupSurface, trestleDetailData)
if (!isPassed) {
return
@ -2528,7 +2598,7 @@ export function useModuleBasicSetting(tabNum) {
for (let moduleIndex = 0; moduleIndex < checkedModule.length; moduleIndex++) {
const module = checkedModule[moduleIndex]
if (type === 'layout' && checkedLayoutData) {
if (type === MODULE_SETUP_TYPE.LAYOUT && checkedLayoutData) {
const layout = checkedLayoutData.find((item) => module.itemId === item.moduleId)
layoutRow = layout.row
layoutCol = layout.col
@ -2588,7 +2658,7 @@ export function useModuleBasicSetting(tabNum) {
let calcModuleHeightCount = calcAreaHeight / (width + intvVer + 1)
//단수지정 자동이면
if (type === 'layout') {
if (type === MODULE_SETUP_TYPE.LAYOUT) {
calcModuleWidthCount = layoutCol > calcModuleWidthCount ? calcModuleWidthCount : layoutCol
calcModuleHeightCount = layoutRow
}
@ -2778,16 +2848,14 @@ export function useModuleBasicSetting(tabNum) {
/**
* 자동 레이아웃일떄 설치 가능한 애들은 설치 해주고 실패한 애들은 이름, 최대 설치 가능한 높이 알려줄라고
*/
if (type === 'layout' && failAutoSetupRoof.length > 0) {
if (type === MODULE_SETUP_TYPE.LAYOUT && failAutoSetupRoof.length > 0) {
const roofNamesList = failAutoSetupRoof.map((roof) => ({
roofName: roof.roofMaterial.roofMatlNmJp,
moduleMaxRows: roof.trestleDetail.moduleMaxRows,
}))
const alertString = roofNamesList.map((item, index) => `${item.roofName}(${item.moduleMaxRows})`)
console.log('alertString', alertString)
// swalFire({ text: alertString, icon: 'warning' })
swalFire({ text: alertString, icon: 'warning' })
}
}