Compare commits

...

17 Commits

Author SHA1 Message Date
김민식
29ccf72c5e 수동으로 방위설정 안되던 버그 수정 2025-04-17 14:13:05 +09:00
김민식
4c219ddce9 validation 방식 수정 2025-04-17 14:12:50 +09:00
김민식
ed721f36d0 Merge branch 'feature/yj-layoutSetup' of https://git.hanasys.jp/qcast3/qcast-front into qcast-pub 2025-04-17 14:12:16 +09:00
김민식
30414568e0 다국어 추가 2025-04-17 14:11:55 +09:00
06812b77af Merge branch 'dev' into feature/yj-layoutSetup 2025-04-16 17:17:50 +09:00
bcc91e7609 반대 2025-04-16 15:53:54 +09:00
bdcacd5542 변별로 설정 후 한쪽흐름과 같이 변 속성을 선택할 경우 처리 추가 2025-04-16 15:39:48 +09:00
51e1f70c24 Merge pull request '견적서 저장시 체크' (#21) from feature/qcast-886 into dev
Reviewed-on: #21
2025-04-15 18:08:55 +09:00
3c14f5de52 견적서 저장시 체크 2025-04-15 18:08:05 +09:00
8f4e53c759 #982 표시 문자 변경 2025-04-14 18:14:49 +09:00
a1871e105f Merge pull request '975- 아이템(양단케이블) 타입 코드 추가에 따른 아이템 목록 수정' (#20) from feature/ysCha into dev
Reviewed-on: #20
2025-04-14 15:03:34 +09:00
ed69943dc6 975- 아이템(양단케이블) 타입 코드 추가에 따른 아이템 목록 수정 2025-04-14 15:01:18 +09:00
김민식
2897dc26e3 Orientation에서 nextstep시 compas 매개변수 추가 2025-04-11 16:41:28 +09:00
61f1036a24 변별로 설정 - 한쪽흐름 출폭 적용 추가 2025-04-11 10:58:04 +09:00
김민식
08a29aec26 cvrCheck, snowCheck 수정 2025-04-10 14:23:43 +09:00
김민식
a742fc1f9c Merge remote-tracking branch 'origin/qcast-pub' into feature/yj-layoutSetup
# Conflicts:
#	src/hooks/module/useModuleTrestle.js
2025-04-10 13:55:13 +09:00
김민식
e2b8bc19b1 lenBase 버그 수정 2025-04-10 13:33:42 +09:00
10 changed files with 170 additions and 44 deletions

View File

@ -717,7 +717,7 @@ export default function Estimate({}) {
/* 케이블 select 변경시 */ /* 케이블 select 변경시 */
const onChangeDisplayCableItem = (value, itemList) => { const onChangeDisplayCableItem = (value, itemList) => {
itemList.map((item, index) => { itemList.map((item, index) => {
if (item.dispCableFlg === '1') { if (item.dispCableFlg === '1' && item.itemTpCd !== 'M12') {
if (value !== '') { if (value !== '') {
onChangeDisplayItem(value, item.dispOrder, index, true) onChangeDisplayItem(value, item.dispOrder, index, true)
} }
@ -1146,7 +1146,7 @@ export default function Estimate({}) {
dispCableFlgCnt++ dispCableFlgCnt++
} }
if (item.dispCableFlg === '1') { if (item.dispCableFlg === '1' && item.itemTpCd !== 'M12') {
setCableItem(item.itemId) setCableItem(item.itemId)
} }
} }
@ -1968,13 +1968,13 @@ export default function Estimate({}) {
getOptionValue={(x) => x.clRefChr1} getOptionValue={(x) => x.clRefChr1}
components={{ components={{
SingleValue: ({ children, ...props }) => { SingleValue: ({ children, ...props }) => {
return <components.SingleValue {...props}>{props.data.clRefChr3}</components.SingleValue> return <components.SingleValue {...props}>{(item.itemTpCd === 'M12')? item.itemName : props.data.clRefChr3}</components.SingleValue>
}, },
}} }}
isClearable={false} isClearable={false}
isDisabled={true} isDisabled={true}
value={cableItemList.filter(function (option) { value={cableItemList.filter(function (option) {
return option.clRefChr1 === item.itemId return (item.itemTpCd === 'M12')? item.itemId : option.clRefChr1 === item.itemId
})} })}
/> />
)} )}

View File

@ -186,15 +186,7 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) {
// return // return
// } // }
trestleRef.current.isComplete().then((res) => { trestleRef.current.isComplete().then((res) => {
if (!res) { if (!res) return
Swal.fire({
title: getMessage('construction.length.difference'),
icon: 'warning',
})
return
} else {
// setTabNum(tabNum + 1)
}
}) })
// //
} else { } else {

View File

@ -125,7 +125,7 @@ export const Orientation = forwardRef((props, ref) => {
setVerticalSnowCover(inputVerticalSnowCover) setVerticalSnowCover(inputVerticalSnowCover)
setSelectedSurfaceType(inputRoughness) setSelectedSurfaceType(inputRoughness)
setStandardWindSpeed(inputStandardWindSpeed) setStandardWindSpeed(inputStandardWindSpeed)
nextStep() nextStep(inputCompasDeg)
setManagementState({ setManagementState({
...managementState, ...managementState,
installHeight: inputInstallHeight, installHeight: inputInstallHeight,
@ -175,15 +175,15 @@ export const Orientation = forwardRef((props, ref) => {
return return
} }
if (e === '0-') { if (e === '0-') {
setCompasDeg('-0') setInputCompasDeg('-0')
return return
} }
if (Number(e) >= -180 && Number(e) <= 180) { if (Number(e) >= -180 && Number(e) <= 180) {
if (numberCheck(Number(e))) { if (numberCheck(Number(e))) {
setCompasDeg(Number(e)) setInputCompasDeg(Number(e))
} }
} else { } else {
setCompasDeg(compasDeg) setInputCompasDeg(compasDeg)
} }
} }

View File

@ -8,6 +8,7 @@ import { roofsState } from '@/store/roofAtom'
import { moduleSelectionDataState, selectedModuleState } from '@/store/selectedModuleOptions' import { moduleSelectionDataState, selectedModuleState } from '@/store/selectedModuleOptions'
import { forwardRef, useContext, useEffect, useImperativeHandle, useRef, useState } from 'react' import { forwardRef, useContext, useEffect, useImperativeHandle, useRef, useState } from 'react'
import { useRecoilState, useRecoilValue } from 'recoil' import { useRecoilState, useRecoilValue } from 'recoil'
import Swal from 'sweetalert2'
const Trestle = forwardRef((props, ref) => { const Trestle = forwardRef((props, ref) => {
const { tabNum, setTabNum, trestleTrigger, roofs, setRoofs, moduleSelectionData, setModuleSelectionData, setRoofsStore } = props const { tabNum, setTabNum, trestleTrigger, roofs, setRoofs, moduleSelectionData, setModuleSelectionData, setRoofsStore } = props
@ -303,30 +304,122 @@ const Trestle = forwardRef((props, ref) => {
}) })
let result = true let result = true
newAddedRoofs.forEach((roof) => { console.log(newAddedRoofs)
if (!roof?.eavesMargin || !roof?.ridgeMargin || !roof?.kerabaMargin) result = false for (let i = 0; i < newAddedRoofs.length; i++) {
if (!roof.trestle?.trestleMkrCd) result = false const roof = newAddedRoofs[i]
if (!roof.trestle?.constMthdCd) result = false
if (!roof.trestle?.roofBaseCd) result = false if (!roof.trestle?.trestleMkrCd) {
if (!roof.construction?.constTp) result = false Swal.fire({
title: getMessage('modal.module.basic.settting.module.error1', [roof.nameJp]), // .
icon: 'warning',
})
result = false
return false
}
if (!roof.trestle?.constMthdCd) {
Swal.fire({
title: getMessage('modal.module.basic.settting.module.error2', [roof.nameJp]), // .
icon: 'warning',
})
result = false
return false
}
if (!roof.trestle?.roofBaseCd) {
Swal.fire({
title: getMessage('modal.module.basic.settting.module.error3', [roof.nameJp]), // .
icon: 'warning',
})
result = false
return false
}
if (!roof.construction?.constTp) {
Swal.fire({
title: getMessage('modal.module.basic.settting.module.error4', [roof.nameJp]), // .
icon: 'warning',
})
result = false
return false
}
if (roof.lenAuth === 'C') { if (roof.lenAuth === 'C') {
if (!roof.trestle?.length) result = false if (!roof.trestle?.length) {
Swal.fire({
title: getMessage('modal.module.basic.settting.module.error5', [roof.nameJp]), // L .
icon: 'warning',
})
result = false
return false
}
} }
if (['C', 'R'].includes(roof.raftAuth)) { if (['C', 'R'].includes(roof.raftAuth)) {
if (!roof?.raftBaseCd) result = false if (!roof?.raftBaseCd) {
Swal.fire({
title: getMessage('modal.module.basic.settting.module.error6', [roof.nameJp]), // .
icon: 'warning',
})
result = false
return false
}
} }
if (['C', 'R'].includes(roof.roofPchAuth)) { if (['C', 'R'].includes(roof.roofPchAuth)) {
if (!roof?.roofPchBase) result = false if (!roof?.roofPchBase) {
Swal.fire({
title: getMessage('modal.module.basic.settting.module.error7', [roof.nameJp]), // .
icon: 'warning',
})
result = false
return false
}
} }
})
const newRoofs = newAddedRoofs.map((roof) => { if (!roof?.eavesMargin || !roof?.ridgeMargin || !roof?.kerabaMargin) {
const { addRoof, construction, trestle, trestleDetail, roofConstructions, ...rest } = roof Swal.fire({
return rest title: getMessage('modal.module.basic.settting.module.error8', [roof.nameJp]), // .
}) icon: 'warning',
})
result = false
return false
}
if (roof.trestle.trestleMkrCd !== 'NO_DATA') {
//
if (roof.trestleDetail?.eaveIntvl > roof.eavesMargin) {
Swal.fire({
title: getMessage('modal.module.basic.settting.module.error9', [roof.trestleDetail?.eaveIntvl, roof.nameJp]), // {0}mm .
icon: 'warning',
})
result = false
return false
}
if (roof.trestleDetail?.ridgeIntvl > roof.ridgeMargin) {
Swal.fire({
title: getMessage('modal.module.basic.settting.module.error10', [roof.trestleDetail?.ridgeIntvl, roof.nameJp]), // {0}mm .
icon: 'warning',
})
result = false
return false
}
if (roof.trestleDetail?.kerabaIntvl > roof.kerabaMargin) {
Swal.fire({
title: getMessage('modal.module.basic.settting.module.error11', [roof.trestleDetail?.kerabaIntvl, roof.nameJp]), // {0}mm .
icon: 'warning',
})
result = false
return false
}
}
}
if (result) { if (result) {
const newRoofs = newAddedRoofs.map((roof) => {
const { addRoof, construction, trestle, trestleDetail, roofConstructions, ...rest } = roof
return rest
})
setModuleSelectionData({ setModuleSelectionData({
...moduleSelectionData, ...moduleSelectionData,
roofConstructions: newAddedRoofs.map((roof, index) => ({ roofConstructions: newAddedRoofs.map((roof, index) => ({
@ -369,8 +462,6 @@ const Trestle = forwardRef((props, ref) => {
// ...constructionList.find((construction) => newAddedRoofs[index].construction.constTp === construction.constTp), // ...constructionList.find((construction) => newAddedRoofs[index].construction.constTp === construction.constTp),
...roof.construction, ...roof.construction,
roofIndex: roof.index, roofIndex: roof.index,
setupCover: cvrChecked,
setupSnowCover: snowGdChecked,
selectedIndex: roof.index, selectedIndex: roof.index,
}, },
trestleDetail: roof.trestleDetail, trestleDetail: roof.trestleDetail,
@ -390,6 +481,8 @@ const Trestle = forwardRef((props, ref) => {
return false return false
} }
const onMarginCheck = (target, data) => {}
useImperativeHandle(ref, () => ({ useImperativeHandle(ref, () => ({
isComplete, isComplete,
})) }))
@ -582,7 +675,7 @@ const Trestle = forwardRef((props, ref) => {
className="input-origin block" className="input-origin block"
value={eavesMargin ?? 0} value={eavesMargin ?? 0}
// onChange={(e) => dispatch({ type: 'SET_TRESTLE_DETAIL', roof: { ...trestleState, eavesMargin: e.target.value } })} // onChange={(e) => dispatch({ type: 'SET_TRESTLE_DETAIL', roof: { ...trestleState, eavesMargin: e.target.value } })}
onChange={(e) => setEavesMargin(e.target.value)} onChange={(e) => setEavesMargin(+e.target.value)}
/> />
</div> </div>
<span className="thin">mm</span> <span className="thin">mm</span>
@ -595,7 +688,7 @@ const Trestle = forwardRef((props, ref) => {
className="input-origin block" className="input-origin block"
value={ridgeMargin ?? 0} value={ridgeMargin ?? 0}
// onChange={(e) => dispatch({ type: 'SET_TRESTLE_DETAIL', roof: { ...trestleState, ridgeMargin: e.target.value } })} // onChange={(e) => dispatch({ type: 'SET_TRESTLE_DETAIL', roof: { ...trestleState, ridgeMargin: e.target.value } })}
onChange={(e) => setRidgeMargin(e.target.value)} onChange={(e) => setRidgeMargin(+e.target.value)}
/> />
</div> </div>
<span className="thin">mm</span> <span className="thin">mm</span>
@ -608,7 +701,7 @@ const Trestle = forwardRef((props, ref) => {
className="input-origin block" className="input-origin block"
value={kerabaMargin ?? 0} value={kerabaMargin ?? 0}
// onChange={(e) => dispatch({ type: 'SET_TRESTLE_DETAIL', roof: { ...trestleState, kerabaMargin: e.target.value } })} // onChange={(e) => dispatch({ type: 'SET_TRESTLE_DETAIL', roof: { ...trestleState, kerabaMargin: e.target.value } })}
onChange={(e) => setKerabaMargin(e.target.value)} onChange={(e) => setKerabaMargin(+e.target.value)}
/> />
</div> </div>
<span className="thin">mm</span> <span className="thin">mm</span>

View File

@ -130,6 +130,7 @@ export const useEstimateController = (planNo, flag) => {
addFlg: true, addFlg: true,
paDispOrder: null, paDispOrder: null,
dispCableFlg: '0', dispCableFlg: '0',
itemTpCd: '',
}, },
], ],
}) })
@ -321,6 +322,7 @@ export const useEstimateController = (planNo, flag) => {
} }
}) })
if (delCnt === estimateData.itemList.length) { if (delCnt === estimateData.itemList.length) {
itemFlg = false
setIsGlobalLoading(false) setIsGlobalLoading(false)
return swalFire({ text: getMessage('estimate.detail.save.requiredItem'), type: 'alert', icon: 'warning' }) return swalFire({ text: getMessage('estimate.detail.save.requiredItem'), type: 'alert', icon: 'warning' })
} }

View File

@ -409,7 +409,7 @@ export function useModuleBasicSetting(tabNum) {
useEffect(() => { useEffect(() => {
if (canvasSetting.roofSizeSet != '3') { if (canvasSetting.roofSizeSet != '3') {
if (isObjectNotEmpty(moduleSelectionData) && moduleSelectionData.common.saleStoreNorthFlg === '1') { if (isObjectNotEmpty(moduleSelectionData) && moduleSelectionData?.common?.saleStoreNorthFlg === '1') {
setSaleStoreNorthFlg(true) setSaleStoreNorthFlg(true)
} }
} }

View File

@ -22,8 +22,8 @@ export function useOrientation() {
}) })
}, [])*/ }, [])*/
const nextStep = () => { const nextStep = (compas = compasDeg) => {
if (isNaN(compasDeg)) { if (isNaN(compas)) {
setCompasDeg(0) setCompasDeg(0)
} }
const roofs = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF) const roofs = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF)
@ -36,7 +36,7 @@ export function useOrientation() {
roofs.forEach((roof) => { roofs.forEach((roof) => {
roof.set({ roof.set({
moduleCompass: isNaN(compasDeg) ? 0 : compasDeg, moduleCompass: isNaN(compas) ? 0 : compas,
}) })
drawDirectionArrow(roof) drawDirectionArrow(roof)
}) })

View File

@ -231,6 +231,21 @@ export function useRoofShapeSetting(id) {
pitch: pitchRef.current, pitch: pitchRef.current,
onlyOffset: true, onlyOffset: true,
} }
switch (line.direction) {
case 'bottom':
direction = 'east'
break
case 'top':
direction = 'west'
break
case 'left':
direction = 'south'
break
case 'right':
direction = 'north'
break
}
} }
}) })
} }
@ -716,6 +731,7 @@ export function useRoofShapeSetting(id) {
type: LINE_TYPE.WALLLINE.SHED, type: LINE_TYPE.WALLLINE.SHED,
pitch: shedPitchRef.current, pitch: shedPitchRef.current,
width: shedWidth / 10, width: shedWidth / 10,
offset: shedWidth / 10,
} }
selectedLine.attributes = { ...attributes, isFixed: true } selectedLine.attributes = { ...attributes, isFixed: true }
addPitchText(currentObject) addPitchText(currentObject)

View File

@ -37,7 +37,7 @@
"modal.roof.shape.setting.ridge": "棟", "modal.roof.shape.setting.ridge": "棟",
"modal.roof.shape.setting.patten.a": "Aパターン", "modal.roof.shape.setting.patten.a": "Aパターン",
"modal.roof.shape.setting.patten.b": "Bパターン", "modal.roof.shape.setting.patten.b": "Bパターン",
"modal.roof.shape.setting.side": "別に設定", "modal.roof.shape.setting.side": "別に設定",
"plan.menu.roof.cover": "伏せ図入力", "plan.menu.roof.cover": "伏せ図入力",
"plan.menu.roof.cover.outline.drawing": "外壁線を描く", "plan.menu.roof.cover.outline.drawing": "外壁線を描く",
"plan.menu.roof.cover.roof.shape.setting": "屋根形状の設定", "plan.menu.roof.cover.roof.shape.setting": "屋根形状の設定",
@ -114,6 +114,17 @@
"modal.module.basic.setting.module.eaves.bar.fitting": "軒カバーの設置", "modal.module.basic.setting.module.eaves.bar.fitting": "軒カバーの設置",
"modal.module.basic.setting.module.blind.metal.fitting": "落雪防止金具設置", "modal.module.basic.setting.module.blind.metal.fitting": "落雪防止金具設置",
"modal.module.basic.setting.module.select": "モジュール/架台選択", "modal.module.basic.setting.module.select": "モジュール/架台選択",
"modal.module.basic.settting.module.error1": "가대메이커를 선택해주세요.(지붕재: {0})(JA)",
"modal.module.basic.settting.module.error2": "공법를 선택해주세요.(지붕재: {0})(JA)",
"modal.module.basic.settting.module.error3": "지붕밑바탕을 선택해주세요.(지붕재: {0})(JA)",
"modal.module.basic.settting.module.error4": "시공법을 선택해주세요.(지붕재: {0})(JA)",
"modal.module.basic.settting.module.error5": "L 을 입력해주세요.(지붕재: {0})(JA)",
"modal.module.basic.settting.module.error6": "서까래 간격을 입력해주세요.(지붕재: {0})(JA)",
"modal.module.basic.settting.module.error7": "하제비치를 입력해주세요.(지붕재: {0})(JA)",
"modal.module.basic.settting.module.error8": "모듈 배치 영영 값을 입력해주세요.(지붕재: {0})(JA)",
"modal.module.basic.settting.module.error9": "처마쪽 값은 {0}mm 이상이어야 합니다.(지붕재: {1})(JA)",
"modal.module.basic.settting.module.error10": "용마루쪽 값은 {0}mm 이상이어야 합니다.(지붕재: {1})(JA)",
"modal.module.basic.settting.module.error11": "케라바쪽 값은 {0}mm 이상이어야 합니다.(지붕재: {1})(JA)",
"modal.module.basic.setting.module.placement": "モジュールの配置", "modal.module.basic.setting.module.placement": "モジュールの配置",
"modal.module.basic.setting.module.placement.select.fitting.type": "設置形態を選択してください。", "modal.module.basic.setting.module.placement.select.fitting.type": "設置形態を選択してください。",
"modal.module.basic.setting.module.placement.waterfowl.arrangement": "千鳥配置", "modal.module.basic.setting.module.placement.waterfowl.arrangement": "千鳥配置",
@ -125,8 +136,8 @@
"modal.module.basic.setting.module.placement.do.not": "しない", "modal.module.basic.setting.module.placement.do.not": "しない",
"modal.module.basic.setting.module.placement.arrangement.standard": "配置基準", "modal.module.basic.setting.module.placement.arrangement.standard": "配置基準",
"modal.module.basic.setting.module.placement.arrangement.standard.center": "中央", "modal.module.basic.setting.module.placement.arrangement.standard.center": "中央",
"modal.module.basic.setting.module.placement.arrangement.standard.eaves": "軒側", "modal.module.basic.setting.module.placement.arrangement.standard.eaves": "軒側",
"modal.module.basic.setting.module.placement.arrangement.standard.ridge": "龍丸側", "modal.module.basic.setting.module.placement.arrangement.standard.ridge": "側",
"modal.module.basic.setting.module.placement.maximum": "最大配置", "modal.module.basic.setting.module.placement.maximum": "最大配置",
"modal.module.basic.setting.pitch.module.placement.standard.setting": "配置基準の設定", "modal.module.basic.setting.pitch.module.placement.standard.setting": "配置基準の設定",
"modal.module.basic.setting.pitch.module.placement.standard.setting.south": "南向きに設置す", "modal.module.basic.setting.pitch.module.placement.standard.setting.south": "南向きに設置す",
@ -852,7 +863,7 @@
"has.not.sleeve": "袖なし", "has.not.sleeve": "袖なし",
"jerkinhead.width": "半切妻幅", "jerkinhead.width": "半切妻幅",
"jerkinhead.slope": "半切妻傾斜", "jerkinhead.slope": "半切妻傾斜",
"shed.width": "片流幅", "shed.width": "片流れの出幅",
"windage": "片流れ", "windage": "片流れ",
"windage.width": "片流れの出幅", "windage.width": "片流れの出幅",
"write": "作成", "write": "作成",

View File

@ -114,6 +114,17 @@
"modal.module.basic.setting.module.eaves.bar.fitting": "처마커버설치", "modal.module.basic.setting.module.eaves.bar.fitting": "처마커버설치",
"modal.module.basic.setting.module.blind.metal.fitting": "적설방지금구설치", "modal.module.basic.setting.module.blind.metal.fitting": "적설방지금구설치",
"modal.module.basic.setting.module.select": "모듈/가대 선택", "modal.module.basic.setting.module.select": "모듈/가대 선택",
"modal.module.basic.settting.module.error1": "가대메이커를 선택해주세요.(지붕재: {0})",
"modal.module.basic.settting.module.error2": "공법를 선택해주세요.(지붕재: {0})",
"modal.module.basic.settting.module.error3": "지붕밑바탕을 선택해주세요.(지붕재: {0})",
"modal.module.basic.settting.module.error4": "시공법을 선택해주세요.(지붕재: {0})",
"modal.module.basic.settting.module.error5": "L 을 입력해주세요.(지붕재: {0})",
"modal.module.basic.settting.module.error6": "서까래 간격을 입력해주세요.(지붕재: {0})",
"modal.module.basic.settting.module.error7": "하제비치를 입력해주세요.(지붕재: {0})",
"modal.module.basic.settting.module.error8": "모듈 배치 영영 값을 입력해주세요.(지붕재: {0})",
"modal.module.basic.settting.module.error9": "처마쪽 값은 {0}mm 이상이어야 합니다.(지붕재: {1})",
"modal.module.basic.settting.module.error10": "용마루쪽 값은 {0}mm 이상이어야 합니다.(지붕재: {1})",
"modal.module.basic.settting.module.error11": "케라바쪽 값은 {0}mm 이상이어야 합니다.(지붕재: {1})",
"modal.module.basic.setting.module.placement": "모듈 배치", "modal.module.basic.setting.module.placement": "모듈 배치",
"modal.module.basic.setting.module.placement.select.fitting.type": "설치형태를 선택합니다.", "modal.module.basic.setting.module.placement.select.fitting.type": "설치형태를 선택합니다.",
"modal.module.basic.setting.module.placement.waterfowl.arrangement": "물떼새 배치", "modal.module.basic.setting.module.placement.waterfowl.arrangement": "물떼새 배치",
@ -128,6 +139,7 @@
"modal.module.basic.setting.module.placement.arrangement.standard.eaves": "처마쪽", "modal.module.basic.setting.module.placement.arrangement.standard.eaves": "처마쪽",
"modal.module.basic.setting.module.placement.arrangement.standard.ridge": "용마루쪽", "modal.module.basic.setting.module.placement.arrangement.standard.ridge": "용마루쪽",
"modal.module.basic.setting.module.placement.maximum": "최대배치", "modal.module.basic.setting.module.placement.maximum": "최대배치",
"modal.module.basic.setting.module.placement.margin.check1": "가대메이커를 선택해주세요.",
"modal.module.basic.setting.pitch.module.placement.standard.setting": "배치기준 설정", "modal.module.basic.setting.pitch.module.placement.standard.setting": "배치기준 설정",
"modal.module.basic.setting.pitch.module.placement.standard.setting.south": "남향설치", "modal.module.basic.setting.pitch.module.placement.standard.setting.south": "남향설치",
"modal.module.basic.setting.pitch.module.placement.standard.setting.select": "지정한 변을 기준으로 설치", "modal.module.basic.setting.pitch.module.placement.standard.setting.select": "지정한 변을 기준으로 설치",