Merge branch 'dev' of https://git.hanasys.jp/qcast3/qcast-front into dev
This commit is contained in:
commit
45a4ac84de
@ -81,44 +81,35 @@ const cropImage = async (Key, width, height, left, top) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//크롭된 이미지를 가지고 높이 기준 -> 너비 기준으로 비율 변경 후 이미지에 추가
|
//크롭된 이미지를 배경 크기에 맞게 리사이즈
|
||||||
const resizeImage = async (image) => {
|
const resizeImage = async (image) => {
|
||||||
// //이미지를 cm로 변환
|
|
||||||
let imageHeightCm = Math.round((image.bitmap.height * 2.54) / 96) //원본 이미지 센치로 변환
|
|
||||||
let imageWidthCm = Math.round((image.bitmap.width * 2.54) / 96) //원본 이미지 센치로 변환
|
|
||||||
const calcWidthRatio = 12.89 / imageHeightCm //원본 비율 계산
|
|
||||||
|
|
||||||
let convertHeightCm = Math.round(imageHeightCm * calcWidthRatio) //변환된 이미지 CM
|
|
||||||
let convertWidthCm = Math.round(imageWidthCm * calcWidthRatio) //변환된 이미지 CM
|
|
||||||
|
|
||||||
let convertHeightBitmap = Math.round((convertHeightCm * 96) / 2.54) //비트맵 사이즈로 변환
|
|
||||||
let convertWidthBitmap = Math.round((convertWidthCm * 96) / 2.54) //비트맵 사이즈로 변환
|
|
||||||
|
|
||||||
//높이 기준으로 리사이즈를 함
|
|
||||||
image.resize({ w: convertWidthBitmap, h: convertHeightBitmap, mode: Jimp.RESIZE_BILINEAR })
|
|
||||||
|
|
||||||
//높이를 기준으로 변경 후에 가로 폭이 더 넓으면 가로폭 기준으로 다시 사이즈를 조절한다
|
|
||||||
if (convertWidthCm > 35.4) {
|
|
||||||
//너비가 더 클때
|
|
||||||
imageHeightCm = Math.round((image.bitmap.height * 2.54) / 96) //높이 기준으로 리사이즈된 이미지 크기
|
|
||||||
imageWidthCm = Math.round((image.bitmap.width * 2.54) / 96) //높이 기준으로 리사이즈된 이미지 크기
|
|
||||||
|
|
||||||
const calcWidthRatio = 35.4 / imageWidthCm //리사이즈된 이미지 가로 비율 계산
|
|
||||||
|
|
||||||
convertHeightCm = Math.round(imageHeightCm * calcWidthRatio) //너비 기준 이미지 비율 계산
|
|
||||||
convertWidthCm = Math.round(imageWidthCm * calcWidthRatio) //변환된 이미지 CM
|
|
||||||
|
|
||||||
convertHeightBitmap = Math.round((convertHeightCm * 96) / 2.54) //비트맵 사이즈로 변환
|
|
||||||
convertWidthBitmap = Math.round((convertWidthCm * 96) / 2.54) //비트맵 사이즈로 변환
|
|
||||||
|
|
||||||
image.resize({ w: convertWidthBitmap, h: convertHeightBitmap, mode: Jimp.RESIZE_BILINEAR }) //이미지 리사이즈
|
|
||||||
}
|
|
||||||
|
|
||||||
//엑셀 템플릿 너비 35.4cm, 높이 12.89cm
|
//엑셀 템플릿 너비 35.4cm, 높이 12.89cm
|
||||||
const convertStandardWidth = Math.round((35.4 * 96) / 2.54)
|
const convertStandardWidth = Math.round((35.4 * 96) / 2.54)
|
||||||
const convertStandardHeight = Math.round((12.89 * 96) / 2.54)
|
const convertStandardHeight = Math.round((12.89 * 96) / 2.54)
|
||||||
|
|
||||||
//엑셀 템플릿 사이즈로 배경 이미지를 생성
|
// 이미지를 배경의 98%까지 확대 (훨씬 더 크게)
|
||||||
|
const targetImageWidth = convertStandardWidth * 0.98
|
||||||
|
const targetImageHeight = convertStandardHeight * 0.98
|
||||||
|
|
||||||
|
const scaleX = targetImageWidth / image.bitmap.width
|
||||||
|
const scaleY = targetImageHeight / image.bitmap.height
|
||||||
|
let scale = Math.min(scaleX, scaleY) // 비율 유지하면서 최대한 크게
|
||||||
|
|
||||||
|
// scale 저장 (나중에 전체 확대에 사용)
|
||||||
|
const originalScale = scale
|
||||||
|
|
||||||
|
let finalWidth = Math.round(image.bitmap.width * scale)
|
||||||
|
let finalHeight = Math.round(image.bitmap.height * scale)
|
||||||
|
|
||||||
|
if (scale < 0.6) {
|
||||||
|
finalWidth = targetImageWidth
|
||||||
|
finalHeight = targetImageHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
// 실제 리사이즈 실행
|
||||||
|
image.resize({ w: finalWidth, h: finalHeight })
|
||||||
|
|
||||||
|
//배경 이미지를 생성
|
||||||
const mixedImage = new Jimp({ width: convertStandardWidth, height: convertStandardHeight, color: 0xffffffff })
|
const mixedImage = new Jimp({ width: convertStandardWidth, height: convertStandardHeight, color: 0xffffffff })
|
||||||
|
|
||||||
//이미지를 중앙에 배치
|
//이미지를 중앙에 배치
|
||||||
@ -127,11 +118,19 @@ const resizeImage = async (image) => {
|
|||||||
|
|
||||||
//이미지를 배경 이미지에 합성
|
//이미지를 배경 이미지에 합성
|
||||||
mixedImage.composite(image, x, y, {
|
mixedImage.composite(image, x, y, {
|
||||||
mode: Jimp.BLEND_SOURCE_OVER,
|
|
||||||
opacitySource: 1, // 원본 투명도 유지
|
opacitySource: 1, // 원본 투명도 유지
|
||||||
opacityDest: 1,
|
opacityDest: 1,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// scale이 0.8 이하인 경우 완성된 이미지를 전체적으로 확대
|
||||||
|
if (originalScale <= 0.8) {
|
||||||
|
const enlargeRatio = 1.5 // 50% 확대
|
||||||
|
const newWidth = Math.round(mixedImage.bitmap.width * enlargeRatio)
|
||||||
|
const newHeight = Math.round(mixedImage.bitmap.height * enlargeRatio)
|
||||||
|
|
||||||
|
mixedImage.resize({ w: newWidth, h: newHeight })
|
||||||
|
}
|
||||||
|
|
||||||
return mixedImage
|
return mixedImage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1458,7 +1458,7 @@ export default function Estimate({}) {
|
|||||||
<label htmlFor="YJOD">{getMessage('estimate.detail.estimateType.yjod')}</label>
|
<label htmlFor="YJOD">{getMessage('estimate.detail.estimateType.yjod')}</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{session?.storeLvl === '1' && agencyCustList.length > 0 ? (
|
{session?.storeLvl === '100000' && agencyCustList.length > 0 ? ( //일시적으로 1 => 100000로 정리
|
||||||
<div className="form-flex-select ml10">
|
<div className="form-flex-select ml10">
|
||||||
<label htmlFor="">{getMessage('estimate.detail.agency')}</label>
|
<label htmlFor="">{getMessage('estimate.detail.agency')}</label>
|
||||||
<div className="select-wrap" style={{ width: '400px' }}>
|
<div className="select-wrap" style={{ width: '400px' }}>
|
||||||
|
|||||||
@ -1,16 +1,13 @@
|
|||||||
import WithDraggable from '@/components/common/draggable/WithDraggable'
|
import WithDraggable from '@/components/common/draggable/WithDraggable'
|
||||||
import { useState, useEffect, useContext, useRef } from 'react'
|
import { useContext, useEffect, useRef, useState } from 'react'
|
||||||
import PowerConditionalSelect from '@/components/floor-plan/modal/circuitTrestle/step/PowerConditionalSelect'
|
import PowerConditionalSelect from '@/components/floor-plan/modal/circuitTrestle/step/PowerConditionalSelect'
|
||||||
import StepUp from '@/components/floor-plan/modal/circuitTrestle/step/StepUp'
|
import StepUp from '@/components/floor-plan/modal/circuitTrestle/step/StepUp'
|
||||||
import { useMessage } from '@/hooks/useMessage'
|
import { useMessage } from '@/hooks/useMessage'
|
||||||
import { usePopup } from '@/hooks/usePopup'
|
import { usePopup } from '@/hooks/usePopup'
|
||||||
import PassivityCircuitAllocation from './step/type/PassivityCircuitAllocation'
|
import PassivityCircuitAllocation from './step/type/PassivityCircuitAllocation'
|
||||||
import { useMasterController } from '@/hooks/common/useMasterController'
|
import { useMasterController } from '@/hooks/common/useMasterController'
|
||||||
import { correntObjectNoState } from '@/store/settingAtom'
|
import { useRecoilState, useRecoilValue } from 'recoil'
|
||||||
import { useRecoilValue } from 'recoil'
|
|
||||||
import { GlobalDataContext } from '@/app/GlobalDataProvider'
|
import { GlobalDataContext } from '@/app/GlobalDataProvider'
|
||||||
import { useRecoilState } from 'recoil'
|
|
||||||
import { makersState, modelsState, modelState, pcsCheckState, selectedMakerState, selectedModelsState, seriesState } from '@/store/circuitTrestleAtom'
|
|
||||||
import { POLYGON_TYPE } from '@/common/common'
|
import { POLYGON_TYPE } from '@/common/common'
|
||||||
import { useSwal } from '@/hooks/useSwal'
|
import { useSwal } from '@/hooks/useSwal'
|
||||||
import { canvasState, canvasZoomState } from '@/store/canvasAtom'
|
import { canvasState, canvasZoomState } from '@/store/canvasAtom'
|
||||||
@ -21,9 +18,7 @@ import { v4 as uuidv4 } from 'uuid'
|
|||||||
|
|
||||||
import { useEstimate } from '@/hooks/useEstimate'
|
import { useEstimate } from '@/hooks/useEstimate'
|
||||||
import { useCircuitTrestle } from '@/hooks/useCirCuitTrestle'
|
import { useCircuitTrestle } from '@/hooks/useCirCuitTrestle'
|
||||||
import { useCanvasPopupStatusController } from '@/hooks/common/useCanvasPopupStatusController'
|
|
||||||
import { useImgLoader } from '@/hooks/floorPlan/useImgLoader'
|
import { useImgLoader } from '@/hooks/floorPlan/useImgLoader'
|
||||||
import { usePlan } from '@/hooks/usePlan'
|
|
||||||
import { QcastContext } from '@/app/QcastProvider'
|
import { QcastContext } from '@/app/QcastProvider'
|
||||||
import { fabric } from 'fabric'
|
import { fabric } from 'fabric'
|
||||||
import { fontSelector } from '@/store/fontAtom'
|
import { fontSelector } from '@/store/fontAtom'
|
||||||
@ -107,10 +102,10 @@ export default function CircuitTrestleSetting({ id }) {
|
|||||||
}
|
}
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
const capture = (type) => {
|
const capture = async (type) => {
|
||||||
beforeCapture()
|
beforeCapture()
|
||||||
|
|
||||||
handleCanvasToPng(type)
|
await handleCanvasToPng(type)
|
||||||
|
|
||||||
afterCapture()
|
afterCapture()
|
||||||
|
|
||||||
@ -123,20 +118,15 @@ export default function CircuitTrestleSetting({ id }) {
|
|||||||
|
|
||||||
// 캡쳐 전 처리
|
// 캡쳐 전 처리
|
||||||
const beforeCapture = () => {
|
const beforeCapture = () => {
|
||||||
// setCanvasZoom(100)
|
setCanvasZoom(100)
|
||||||
const arrows = canvas.getObjects().filter((obj) => obj.name === 'arrow')
|
canvas.set({ zoom: 1 })
|
||||||
|
canvas.viewportTransform = [1, 0, 0, 1, 0, 0]
|
||||||
|
|
||||||
let x, y
|
let x, y
|
||||||
|
|
||||||
x = canvas.width / 2
|
x = canvas.width / 2
|
||||||
y = canvas.height / 2
|
y = canvas.height / 2
|
||||||
|
|
||||||
// 화살표가 음수 영역에 있을 경우 0,0 기준으로 50% 축소
|
|
||||||
if (arrows.some((arrow) => arrow.left < 0) || arrows.some((arrow) => arrow.top < 0)) {
|
|
||||||
x = 0
|
|
||||||
y = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
canvas.zoomToPoint(new fabric.Point(x, y), 0.5)
|
canvas.zoomToPoint(new fabric.Point(x, y), 0.5)
|
||||||
changeFontSize('lengthText', '28')
|
changeFontSize('lengthText', '28')
|
||||||
changeFontSize('circuitNumber', '28')
|
changeFontSize('circuitNumber', '28')
|
||||||
|
|||||||
@ -109,6 +109,7 @@ export default function StepUp(props) {
|
|||||||
/** 캔버스에 회로 정보 적용 */
|
/** 캔버스에 회로 정보 적용 */
|
||||||
// 병설일때 pcs 있으면 setSubOpsions, 없으면 setMainOptions
|
// 병설일때 pcs 있으면 setSubOpsions, 없으면 setMainOptions
|
||||||
console.log('stepUpListData', stepUpListData)
|
console.log('stepUpListData', stepUpListData)
|
||||||
|
let mChk = 0;
|
||||||
stepUpListData[0].pcsItemList.forEach((pcsItem, index) => {
|
stepUpListData[0].pcsItemList.forEach((pcsItem, index) => {
|
||||||
const optionList = formatOptionCodes(pcsItem.optionList)
|
const optionList = formatOptionCodes(pcsItem.optionList)
|
||||||
if (isMultiOptions()) {
|
if (isMultiOptions()) {
|
||||||
@ -164,6 +165,8 @@ export default function StepUp(props) {
|
|||||||
targetModule.pcsItemId = module.pcsItemId
|
targetModule.pcsItemId = module.pcsItemId
|
||||||
targetModule.circuitNumber = module.circuit
|
targetModule.circuitNumber = module.circuit
|
||||||
canvas.add(moduleCircuitText)
|
canvas.add(moduleCircuitText)
|
||||||
|
} else {
|
||||||
|
mChk++;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -172,6 +175,10 @@ export default function StepUp(props) {
|
|||||||
|
|
||||||
canvas.renderAll()
|
canvas.renderAll()
|
||||||
setModuleStatisticsData()
|
setModuleStatisticsData()
|
||||||
|
|
||||||
|
if (mChk > 0) {
|
||||||
|
swalFire({ text: getMessage('modal.circuit.trestle.setting.step.up.allocation.module.over.count') })
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
swalFire({ text: getMessage('common.message.send.error') })
|
swalFire({ text: getMessage('common.message.send.error') })
|
||||||
}
|
}
|
||||||
|
|||||||
@ -102,7 +102,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) {
|
|||||||
const pointer = getIntersectMousePoint(e)
|
const pointer = getIntersectMousePoint(e)
|
||||||
|
|
||||||
surfaceShapePolygons.forEach((surface) => {
|
surfaceShapePolygons.forEach((surface) => {
|
||||||
if (surface.inPolygon({ x: pointer.x, y: pointer.y })) {
|
if (surface.inPolygonImproved({ x: pointer.x, y: pointer.y })) {
|
||||||
selectedSurface = surface
|
selectedSurface = surface
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -212,7 +212,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) {
|
|||||||
const pointer = getIntersectMousePoint(e)
|
const pointer = getIntersectMousePoint(e)
|
||||||
|
|
||||||
surfaceShapePolygons.forEach((surface) => {
|
surfaceShapePolygons.forEach((surface) => {
|
||||||
if (surface.inPolygon({ x: pointer.x, y: pointer.y })) {
|
if (surface.inPolygonImproved({ x: pointer.x, y: pointer.y })) {
|
||||||
selectedSurface = surface
|
selectedSurface = surface
|
||||||
|
|
||||||
rect = new fabric.Rect({
|
rect = new fabric.Rect({
|
||||||
|
|||||||
@ -197,6 +197,7 @@
|
|||||||
"modal.circuit.trestle.setting.step.up.allocation.circuit.amount": "昇圧回路数",
|
"modal.circuit.trestle.setting.step.up.allocation.circuit.amount": "昇圧回路数",
|
||||||
"modal.circuit.trestle.setting.step.up.allocation.option": "昇圧オプション",
|
"modal.circuit.trestle.setting.step.up.allocation.option": "昇圧オプション",
|
||||||
"modal.circuit.trestle.setting.step.up.allocation.select.monitor": "オプションを選択",
|
"modal.circuit.trestle.setting.step.up.allocation.select.monitor": "オプションを選択",
|
||||||
|
"modal.circuit.trestle.setting.step.up.allocation.module.over.count": "一部モジュールに回路を構成できません",
|
||||||
"plan.menu.module.circuit.setting.plan.orientation": "図面方位の適用",
|
"plan.menu.module.circuit.setting.plan.orientation": "図面方位の適用",
|
||||||
"plan.menu.estimate": "見積書",
|
"plan.menu.estimate": "見積書",
|
||||||
"plan.menu.estimate.roof.alloc": "屋根面の割り当て",
|
"plan.menu.estimate.roof.alloc": "屋根面の割り当て",
|
||||||
|
|||||||
@ -197,6 +197,7 @@
|
|||||||
"modal.circuit.trestle.setting.step.up.allocation.circuit.amount": "승압회로수",
|
"modal.circuit.trestle.setting.step.up.allocation.circuit.amount": "승압회로수",
|
||||||
"modal.circuit.trestle.setting.step.up.allocation.option": "승압옵션",
|
"modal.circuit.trestle.setting.step.up.allocation.option": "승압옵션",
|
||||||
"modal.circuit.trestle.setting.step.up.allocation.select.monitor": "옵션선택",
|
"modal.circuit.trestle.setting.step.up.allocation.select.monitor": "옵션선택",
|
||||||
|
"modal.circuit.trestle.setting.step.up.allocation.module.over.count": "일부 모듈에서는 회로를 구성할 수 없습니다.",
|
||||||
"plan.menu.module.circuit.setting.plan.orientation": "도면 방위 적용",
|
"plan.menu.module.circuit.setting.plan.orientation": "도면 방위 적용",
|
||||||
"plan.menu.estimate": "견적서",
|
"plan.menu.estimate": "견적서",
|
||||||
"plan.menu.estimate.roof.alloc": "지붕면 할당",
|
"plan.menu.estimate.roof.alloc": "지붕면 할당",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user