Compare commits

...

10 Commits

Author SHA1 Message Date
cec871fb70 그리드 이동 단위 수정 2025-05-20 10:52:22 +09:00
46dc8123df 임의그리드 이벤트 수정 2025-05-20 10:34:24 +09:00
d4ae092ae5 흡착점 작동 관련 수정 2025-05-20 10:23:36 +09:00
김민식
70a4c85149 [1049] : [【HANASYS DESIGN】文字修正]
[작업내용] : 다국어 수정
2025-05-19 13:57:34 +09:00
김민식
51acb561b8 Merge remote-tracking branch 'origin/qcast-pub' into dev 2025-05-19 13:52:45 +09:00
김민식
e482538dec [995] : [【HANASYS DESIGN】回路組について]
[작업내용] : 수동 회로 할당 시 동일면/경사인 지붕면 일 경우 불가하게 수정 및 관련 다국어 메시지 추가
2025-05-19 13:50:39 +09:00
김민식
ec48350c05 Merge branch 'dev' of https://git.hanasys.jp/qcast3/qcast-front into qcast-pub
# Conflicts:
#	src/locales/ja.json
2025-05-19 13:48:15 +09:00
김민식
69c48cecf8 Merge branch 'dev' of https://git.hanasys.jp/qcast3/qcast-front into dev
# Conflicts:
#	src/locales/ja.json
2025-05-19 10:32:43 +09:00
김민식
46cc507e6d Merge remote-tracking branch 'origin/qcast-pub' into dev 2025-05-19 10:30:47 +09:00
김민식
98f87553e6 [1049] : [【HANASYS DESIGN】文字修正]
[작업내용] : 일본어 번역 수정
2025-05-19 10:30:15 +09:00
9 changed files with 96 additions and 62 deletions

View File

@ -86,6 +86,26 @@ export default function PassivityCircuitAllocation(props) {
.map((obj) => obj.circuitNumber),
),
]
const surfaceList = targetModules.map((module) => {
return canvas.getObjects().filter((obj) => obj.id === canvas.getObjects().filter((obj) => obj.id === module)[0].surfaceId)[0]
})
if (surfaceList.length > 1) {
let surfaceType = {}
surfaceList.forEach((surface) => {
surfaceType[`${surface.direction}-${surface.roofMaterial.pitch}`] = surface
})
if (Object.keys(surfaceType).length > 1) {
swalFire({
text: getMessage('module.circuit.fix.not.same.roof.error'),
type: 'alert',
icon: 'warning',
})
return
}
}
if (!circuitNumber || circuitNumber === 0) {
swalFire({
text: getMessage('module.circuit.minimun.error'),

View File

@ -17,7 +17,7 @@ export default function GridCopy(props) {
const currentObject = useRecoilValue(currentObjectState)
const { copy } = useGrid()
const handleApply = () => {
copy(currentObject, ['↑', '←'].includes(arrow) ? +length * -1 : +length)
copy(currentObject, ['↑', '←'].includes(arrow) ? (+length * -1) / 10 : +length / 10)
}
return (
<WithDraggable isShow={true} pos={pos} className="xm">

View File

@ -54,15 +54,15 @@ export default function GridMove(props) {
.forEach((grid) => {
move(
grid,
arrow2 === '←' ? Number(horizonSize) * -1 : Number(horizonSize),
arrow1 === '↑' ? Number(verticalSize) * -1 : Number(verticalSize),
arrow2 === '←' ? (Number(horizonSize) * -1) / 10 : Number(horizonSize) / 10,
arrow1 === '↑' ? (Number(verticalSize) * -1) / 10 : Number(verticalSize) / 10,
)
})
} else {
move(
currentObject,
arrow2 === '←' ? Number(horizonSize) * -1 : Number(horizonSize),
arrow1 === '↑' ? Number(verticalSize) * -1 : Number(verticalSize),
arrow2 === '←' ? (Number(horizonSize) * -1) / 10 : Number(horizonSize) / 10,
arrow1 === '↑' ? (Number(verticalSize) * -1) / 10 : Number(verticalSize) / 10,
)
}
canvas.renderAll()

View File

@ -185,7 +185,7 @@ export default function SecondOption(props) {
const onClickOption = async (item) => {
let option4Data = settingModalSecondOptions?.option4
let adsorpPointData = adsorptionPointMode.adsorptionPoint
let adsorpPointData = adsorptionPointMode
// ( )
if (
@ -203,11 +203,9 @@ export default function SecondOption(props) {
//
setAdsorptionRange(item.range)
setAdsorptionPointMode({ ...adsorptionPointMode, adsorptionPoint: adsorpPointData })
setAdsorptionPointMode(adsorpPointData)
} else if (item === 'adsorpPoint') {
setAdsorptionPointMode({ ...adsorptionPointMode, adsorptionPoint: !adsorpPointData })
adsorpPointData = !adsorpPointData
setAdsorptionPointMode(!adsorpPointData)
}
setSettingsData({ ...settingsData, option4: [...option4Data], adsorptionPoint: adsorpPointData })
@ -257,7 +255,7 @@ export default function SecondOption(props) {
}}
>
<span>{getMessage('modal.canvas.setting.font.plan.absorption.point')}</span>
<i>{adsorptionPointMode.adsorptionPoint ? 'ON' : 'OFF'}</i>
<i>{adsorptionPointMode ? 'ON' : 'OFF'}</i>
</button>
</div>
</div>

View File

@ -609,7 +609,7 @@ export function useCanvasSetting(executeEffect = true) {
const optionData5 = settingModalFirstOptions.dimensionDisplay.map((item) => ({ ...item }))
/** 흡착점 ON/OFF */
setAdsorptionPointMode({ ...adsorptionPointMode, adsorptionPoint: res.adsorpPoint })
setAdsorptionPointMode(res.adsorpPoint)
/** 치수선 설정 */
setDimensionLineSettings({ ...dimensionLineSettings, pixel: res.originPixel, color: res.originColor })
@ -695,7 +695,7 @@ export function useCanvasSetting(executeEffect = true) {
/** 조회된 글꼴 데이터가 없는 경우 (데이터 초기화) */
/** 흡착점 ON/OFF */
setAdsorptionPointMode({ ...adsorptionPointMode, adsorptionPoint: false })
setAdsorptionPointMode(false)
/** 치수선 설정 */
resetDimensionLineSettings()
@ -775,7 +775,7 @@ export function useCanvasSetting(executeEffect = true) {
adsorpRangeMedium: dataToSend.secondOption2[2].selected,
adsorpRangeLarge: dataToSend.secondOption2[3].selected,
/** 흡착점 ON/OFF */
adsorpPoint: adsorptionPointMode.adsorptionPoint,
adsorpPoint: adsorptionPointMode,
//??: adsorptionRange, 사용여부 확인 필요
/** 문자 글꼴 설정 */

View File

@ -6,6 +6,8 @@ import { calculateDistance, calculateDistancePoint, calculateIntersection, dista
import { useAdsorptionPoint } from '@/hooks/useAdsorptionPoint'
import { useDotLineGrid } from '@/hooks/useDotLineGrid'
import { useTempGrid } from '@/hooks/useTempGrid'
import { gridColorState } from '@/store/gridAtom'
import { gridDisplaySelector } from '@/store/settingAtom'
export function useEvent() {
const canvas = useRecoilValue(canvasState)
@ -13,10 +15,12 @@ export function useEvent() {
const documentEventListeners = useRef([])
const mouseEventListeners = useRef([])
const setCanvasZoom = useSetRecoilState(canvasZoomState)
const gridColor = useRecoilValue(gridColorState)
const isGridDisplay = useRecoilValue(gridDisplaySelector)
const { adsorptionPointAddMode, adsorptionPointMode, adsorptionRange, getAdsorptionPoints, adsorptionPointAddModeStateEvent } = useAdsorptionPoint()
const { dotLineGridSetting, interval, getClosestLineGrid } = useDotLineGrid()
const { tempGridModeStateLeftClickEvent, tempGridMode, tempGridRightClickEvent } = useTempGrid()
const { tempGridModeStateLeftClickEvent, tempGridMode } = useTempGrid()
const textMode = useRecoilValue(textModeState)
@ -104,24 +108,35 @@ export function useEvent() {
if (dotLineGridSetting.LINE || canvas.getObjects().filter((obj) => ['lineGrid', 'tempGrid'].includes(obj.name)).length > 0) {
const closestLine = getClosestLineGrid(pointer)
const horizonLines = canvas.getObjects().filter((obj) => obj.name === 'lineGrid' && obj.direction === 'horizontal')
const verticalLines = canvas.getObjects().filter((obj) => obj.name === 'lineGrid' && obj.direction === 'vertical')
const horizonLines = canvas.getObjects().filter((obj) => ['lineGrid', 'tempGrid'].includes(obj.name) && obj.direction === 'horizontal')
const verticalLines = canvas.getObjects().filter((obj) => ['lineGrid', 'tempGrid'].includes(obj.name) && obj.direction === 'vertical')
if (!horizonLines || !verticalLines) {
return
}
const closestHorizontalLine = horizonLines.reduce((prev, curr) => {
const prevDistance = calculateDistance(pointer, prev)
const currDistance = calculateDistance(pointer, curr)
return prevDistance < currDistance ? prev : curr
})
let closestHorizontalLine = null
let closestVerticalLine = null
const closestVerticalLine = verticalLines.reduce((prev, curr) => {
const prevDistance = calculateDistance(pointer, prev)
const currDistance = calculateDistance(pointer, curr)
return prevDistance < currDistance ? prev : curr
})
if (horizonLines && horizonLines.length > 0) {
closestHorizontalLine = horizonLines.reduce((prev, curr) => {
const prevDistance = calculateDistance(pointer, prev)
const currDistance = calculateDistance(pointer, curr)
return prevDistance < currDistance ? prev : curr
})
}
if (verticalLines && verticalLines.length > 0) {
closestVerticalLine = verticalLines.reduce((prev, curr) => {
const prevDistance = calculateDistance(pointer, prev)
const currDistance = calculateDistance(pointer, curr)
return prevDistance < currDistance ? prev : curr
})
}
if (!closestVerticalLine || !closestHorizontalLine) {
return
}
const closestIntersectionPoint = calculateIntersection(closestHorizontalLine, closestVerticalLine)
@ -238,6 +253,34 @@ export function useEvent() {
})
}
const tempGridRightClickEvent = (e) => {
e.preventDefault()
e.stopPropagation()
//임의 그리드 모드일 경우
let pointer = { x: e.offsetX, y: e.offsetY }
const tempGrid = new fabric.Line([-1500, pointer.y, 2500, pointer.y], {
stroke: gridColor,
strokeWidth: 1,
selectable: true,
lockMovementX: true,
lockMovementY: true,
lockRotation: true,
lockScalingX: true,
lockScalingY: true,
strokeDashArray: [5, 2],
opacity: 0.3,
padding: 5,
name: 'tempGrid',
visible: isGridDisplay,
direction: 'horizontal',
})
canvas.add(tempGrid)
canvas.renderAll()
}
const defaultKeyboardEvent = (e) => {
if (e.key === 'Escape') {
console.log('defaultKeyboardEvent')

View File

@ -7,8 +7,9 @@ const GRID_PADDING = 5
export function useTempGrid() {
const canvas = useRecoilValue(canvasState)
const gridColor = useRecoilValue(gridColorState)
const [tempGridMode, setTempGridMode] = useRecoilState(tempGridModeState)
const isGridDisplay = useRecoilValue(gridDisplaySelector)
const [tempGridMode, setTempGridMode] = useRecoilState(tempGridModeState)
const tempGridModeStateLeftClickEvent = (e) => {
//임의 그리드 모드일 경우
let pointer = canvas.getPointer(e.e)
@ -35,37 +36,8 @@ export function useTempGrid() {
canvas.renderAll()
}
const tempGridRightClickEvent = (e) => {
e.preventDefault()
e.stopPropagation()
//임의 그리드 모드일 경우
let pointer = { x: e.offsetX, y: e.offsetY }
const tempGrid = new fabric.Line([-1500, pointer.y, 2500, pointer.y], {
stroke: gridColor,
strokeWidth: 1,
selectable: true,
lockMovementX: true,
lockMovementY: true,
lockRotation: true,
lockScalingX: true,
lockScalingY: true,
strokeDashArray: [5, 2],
opacity: 0.3,
padding: GRID_PADDING,
name: 'tempGrid',
visible: isGridDisplay,
direction: 'horizontal',
})
canvas.add(tempGrid)
canvas.renderAll()
}
return {
tempGridModeStateLeftClickEvent,
tempGridRightClickEvent,
tempGridMode,
setTempGridMode,
}

View File

@ -126,8 +126,8 @@
"modal.module.basic.settting.module.error7": "下在ビーチを入力してください。\n(屋根材: {0})",
"modal.module.basic.settting.module.error8": "モジュール配置領域の値を入力してください。\n(屋根材: {0})",
"modal.module.basic.settting.module.error9": "軒側の配置領域の値を{0} mm以上に変更してください。\n(屋根材: {1})",
"modal.module.basic.settting.module.error10": "棟側の配置領域の値を{0} mm上に変更してください。\n(屋根材: {1})",
"modal.module.basic.settting.module.error11": "ケラバ側の配置領域の値を{0} mm上に変更してください。\n(屋根材: {1})",
"modal.module.basic.settting.module.error10": "棟側の配置領域の値を{0} mm上に変更してください。\n(屋根材: {1})",
"modal.module.basic.settting.module.error11": "ケラバ側の配置領域の値を{0} mm上に変更してください。\n(屋根材: {1})",
"modal.module.basic.settting.module.error12": "施工方法を選択してください。\n(屋根材: {0})",
"modal.module.basic.setting.module.placement": "モジュールの配置",
"modal.module.basic.setting.module.placement.select.fitting.type": "設置形態を選択してください。",
@ -346,9 +346,9 @@
"modal.actual.size.setting.not.exist.size": "実際の寸法の長さを入力してください",
"modal.actual.size.setting.plane.size.length": "廊下寸法の長さ",
"modal.actual.size.setting.actual.size.length": "実寸長",
"plan.message.confirm.save": "プラン保存しますか?",
"plan.message.confirm.copy": "プランコピーしますか?",
"plan.message.confirm.delete": "プラン削除しますか?",
"plan.message.confirm.save": "プラン保存しますか?",
"plan.message.confirm.copy": "プランコピーしますか?",
"plan.message.confirm.delete": "プラン削除しますか?",
"plan.message.save": "保存されました。",
"plan.message.delete": "削除されました。",
"plan.message.leave": "物件状況(リスト)に移動しますか? [はい]を選択した場合は保存して移動します。",

View File

@ -1052,6 +1052,7 @@
"module.not.found": "모듈을 선택하세요.",
"module.circuit.minimun.error": "회로번호는 1 이상입력해주세요.",
"module.already.exist.error": "회로번호가 같은 다른 파워 컨디셔너 모듈이 있습니다. 다른 회로번호를 설정하십시오.",
"module.circuit.fix.not.same.roof.error": "다른 지붕면의 모듈이 선택되어 있습니다. 모듈 선택을 다시 하세요.",
"construction.length.difference": "지붕면 공법을 모두 선택하십시오.",
"menu.validation.canvas.roof": "패널을 배치하려면 지붕면을 입력해야 합니다.",
"batch.object.outside.roof": "오브젝트는 지붕내에 설치해야 합니다.",