Merge branch 'dev' of https://git.jetbrains.space/nalpari/q-cast-iii/qcast-front into dev-ds
This commit is contained in:
commit
696d4211e5
@ -10,5 +10,5 @@ SESSION_SECRET="i3iHH1yp2/2SpQSIySQ4bpyc4g0D+zCF9FAn5xUG0+Y="
|
|||||||
|
|
||||||
NEXT_PUBLIC_CONVERTER_API_URL="https://v2.convertapi.com/convert/dwg/to/png?Secret=secret_bV5zuYMyyIYFlOb3"
|
NEXT_PUBLIC_CONVERTER_API_URL="https://v2.convertapi.com/convert/dwg/to/png?Secret=secret_bV5zuYMyyIYFlOb3"
|
||||||
|
|
||||||
NEXT_PUBLIC_Q_ORDER_AUTO_LOGIN_URL="http://q-order-local.q-cells.jp:8120/eos/login/autoLogin"
|
NEXT_PUBLIC_Q_ORDER_AUTO_LOGIN_URL="http://q-order-qa.q-cells.jp:8120/eos/login/autoLogin"
|
||||||
NEXT_PUBLIC_Q_MUSUBI_AUTO_LOGIN_URL="http://q-musubi-local.q-cells.jp:8120/qm/login/autoLogin"
|
NEXT_PUBLIC_Q_MUSUBI_AUTO_LOGIN_URL="http://q-musubi-qa.q-cells.jp:8120/qm/login/autoLogin"
|
||||||
@ -8,5 +8,5 @@ SESSION_SECRET="i3iHH1yp2/2SpQSIySQ4bpyc4g0D+zCF9FAn5xUG0+Y="
|
|||||||
|
|
||||||
NEXT_PUBLIC_CONVERTER_API_URL="https://v2.convertapi.com/convert/dwg/to/png?Secret=secret_bV5zuYMyyIYFlOb3"
|
NEXT_PUBLIC_CONVERTER_API_URL="https://v2.convertapi.com/convert/dwg/to/png?Secret=secret_bV5zuYMyyIYFlOb3"
|
||||||
|
|
||||||
NEXT_PUBLIC_Q_ORDER_AUTO_LOGIN_URL="http://q-order-local.q-cells.jp:8120/eos/login/autoLogin"
|
NEXT_PUBLIC_Q_ORDER_AUTO_LOGIN_URL="https://q-order.q-cells.jp/eos/login/autoLogin"
|
||||||
NEXT_PUBLIC_Q_MUSUBI_AUTO_LOGIN_URL="http://q-musubi-local.q-cells.jp:8120/qm/login/autoLogin"
|
NEXT_PUBLIC_Q_MUSUBI_AUTO_LOGIN_URL="https://q-musubi.q-cells.jp/qm/login/autoLogin"
|
||||||
@ -66,8 +66,13 @@ export const LINE_TYPE = {
|
|||||||
},
|
},
|
||||||
SUBLINE: {
|
SUBLINE: {
|
||||||
/**
|
/**
|
||||||
*
|
* 추녀 / 마루 / 박공 / 지붕골 / 박공단
|
||||||
*/
|
*/
|
||||||
|
HIP: 'hip',
|
||||||
|
RIDGE: 'ridge',
|
||||||
|
GABLE: 'gable',
|
||||||
|
VALLEY: 'valley',
|
||||||
|
VERGE: 'verge',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,13 @@
|
|||||||
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 { globalPitchState } from '@/store/canvasAtom'
|
||||||
|
import { useRecoilState } from 'recoil'
|
||||||
|
import { useRef } from 'react'
|
||||||
|
|
||||||
export default function Slope({ setShowSlopeSettingModal }) {
|
export default function Slope({ setShowSlopeSettingModal }) {
|
||||||
const { getMessage } = useMessage()
|
const { getMessage } = useMessage()
|
||||||
|
const [globalPitch, setGlobalPitch] = useRecoilState(globalPitchState)
|
||||||
|
const inputRef = useRef()
|
||||||
return (
|
return (
|
||||||
<WithDraggable isShow={true} pos={{ x: 50, y: -950 }}>
|
<WithDraggable isShow={true} pos={{ x: 50, y: -950 }}>
|
||||||
<div className={`modal-pop-wrap xxxm`}>
|
<div className={`modal-pop-wrap xxxm`}>
|
||||||
@ -19,13 +24,21 @@ export default function Slope({ setShowSlopeSettingModal }) {
|
|||||||
{getMessage('slope')}
|
{getMessage('slope')}
|
||||||
</span>
|
</span>
|
||||||
<div className="input-grid mr5">
|
<div className="input-grid mr5">
|
||||||
<input type="text" className="input-origin block" defaultValue={300} />
|
<input type="text" className="input-origin block" defaultValue={globalPitch} ref={inputRef} />
|
||||||
</div>
|
</div>
|
||||||
<span className="thin">{getMessage('size.angle')}</span>
|
<span className="thin">{getMessage('size.angle')}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="grid-btn-wrap">
|
<div className="grid-btn-wrap">
|
||||||
<button className="btn-frame modal act">{getMessage('modal.common.save')}</button>
|
<button
|
||||||
|
className="btn-frame modal act"
|
||||||
|
onClick={() => {
|
||||||
|
setGlobalPitch(inputRef.current.value)
|
||||||
|
setShowSlopeSettingModal(false)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{getMessage('modal.common.save')}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -16,6 +16,8 @@ import FindAddressPop from './popup/FindAddressPop'
|
|||||||
import PlanRequestPop from './popup/PlanRequestPop'
|
import PlanRequestPop from './popup/PlanRequestPop'
|
||||||
import WindSelectPop from './popup/WindSelectPop'
|
import WindSelectPop from './popup/WindSelectPop'
|
||||||
export default function StuffDetail() {
|
export default function StuffDetail() {
|
||||||
|
const [selOptions, setSelOptions] = useState('')
|
||||||
|
|
||||||
const sessionState = useRecoilValue(sessionStore)
|
const sessionState = useRecoilValue(sessionStore)
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
@ -107,14 +109,18 @@ export default function StuffDetail() {
|
|||||||
|
|
||||||
// 임시 1차점 판매점코드 saleStoreId=201TES01
|
// 임시 1차점 판매점코드 saleStoreId=201TES01
|
||||||
// T01
|
// T01
|
||||||
//1차점 : X167
|
//1차점 : X167 T01
|
||||||
get({ url: `/api/object/saleStore/T01/list` }).then((res) => {
|
// get({ url: `/api/object/saleStore/TEMP02/list` }).then((res) => {
|
||||||
// get({ url: `/api/object/saleStore/${sessionState?.storeId}/list` }).then((res) => {
|
get({ url: `/api/object/saleStore/${sessionState?.storeId}/list` }).then((res) => {
|
||||||
if (!isEmptyArray(res)) {
|
if (!isEmptyArray(res)) {
|
||||||
const firstList = res.filter((row) => row.saleStoreLevel === '1')
|
const firstList = res.filter((row) => row.saleStoreLevel === '1')
|
||||||
const otherList = res.filter((row) => row.saleStoreLevel !== '1')
|
const otherList = res.filter((row) => row.saleStoreLevel !== '1')
|
||||||
//1차점 셀렉트박스
|
//1차점 셀렉트박스
|
||||||
setSaleStoreList(firstList)
|
setSaleStoreList(firstList)
|
||||||
|
setSelOptions(sessionState?.storeId)
|
||||||
|
form.setValue('saleStoreId', sessionState?.storeId)
|
||||||
|
form.setValue('saleStoreLevel', sessionState?.storeLvl)
|
||||||
|
|
||||||
//1차점 아닌 판매점 셀렉트박스
|
//1차점 아닌 판매점 셀렉트박스
|
||||||
setOriginOtherSaleStoreList(otherList)
|
setOriginOtherSaleStoreList(otherList)
|
||||||
setOtherSaleStoreList(otherList)
|
setOtherSaleStoreList(otherList)
|
||||||
@ -125,8 +131,6 @@ export default function StuffDetail() {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isObjectNotEmpty(detailData)) {
|
if (isObjectNotEmpty(detailData)) {
|
||||||
console.log('상세데이타:::::::', detailData)
|
|
||||||
|
|
||||||
// 도도부현API
|
// 도도부현API
|
||||||
get({ url: '/api/object/prefecture/list' }).then((res) => {
|
get({ url: '/api/object/prefecture/list' }).then((res) => {
|
||||||
if (!isEmptyArray(res)) {
|
if (!isEmptyArray(res)) {
|
||||||
@ -151,6 +155,8 @@ export default function StuffDetail() {
|
|||||||
setOtherSaleStoreList(otherList)
|
setOtherSaleStoreList(otherList)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
console.log('상세데이타::세팅:::::', detailData)
|
||||||
}
|
}
|
||||||
}, [detailData])
|
}, [detailData])
|
||||||
|
|
||||||
@ -161,12 +167,14 @@ export default function StuffDetail() {
|
|||||||
form.setValue('saleStoreId', key.saleStoreId)
|
form.setValue('saleStoreId', key.saleStoreId)
|
||||||
form.setValue('saleStoreName', key.saleStoreName)
|
form.setValue('saleStoreName', key.saleStoreName)
|
||||||
form.setValue('saleStoreLevel', key.saleStoreLevel)
|
form.setValue('saleStoreLevel', key.saleStoreLevel)
|
||||||
|
setSelOptions(key.saleStoreId)
|
||||||
//선택한 1차점 정보로 2차점 list 추리기
|
//선택한 1차점 정보로 2차점 list 추리기
|
||||||
//長府工産株式会社 大阪支社
|
//長府工産株式会社 大阪支社
|
||||||
let newOtherSaleStoreList = originOtherSaleStoreList.filter((row) => row.firstAgentId === key.saleStoreId)
|
let newOtherSaleStoreList = originOtherSaleStoreList.filter((row) => row.firstAgentId === key.saleStoreId)
|
||||||
setOtherSaleStoreList(newOtherSaleStoreList)
|
setOtherSaleStoreList(newOtherSaleStoreList)
|
||||||
} else {
|
} else {
|
||||||
//X누름
|
//X누름
|
||||||
|
setSelOptions('')
|
||||||
form.setValue('saleStoreId', '')
|
form.setValue('saleStoreId', '')
|
||||||
form.setValue('saleStoreName', '')
|
form.setValue('saleStoreName', '')
|
||||||
form.setValue('saleStoreLevel', '')
|
form.setValue('saleStoreLevel', '')
|
||||||
@ -212,6 +220,12 @@ export default function StuffDetail() {
|
|||||||
//팝업에서 넘어온 설계의뢰 정보로 바꾸기
|
//팝업에서 넘어온 설계의뢰 정보로 바꾸기
|
||||||
const setPlanReqInfo = (info) => {
|
const setPlanReqInfo = (info) => {
|
||||||
console.log('팝업에서 넘어온 설계의뢰 정보::: ', info)
|
console.log('팝업에서 넘어온 설계의뢰 정보::: ', info)
|
||||||
|
//building : 신축 기축
|
||||||
|
//planReqName : 물건명
|
||||||
|
//zipNo : 우편번호
|
||||||
|
//도도부현 :address1 주소 : address2 미세팅
|
||||||
|
//기준풍속 팝업열려면 setPrefValue(info.prefId) 필요
|
||||||
|
//기준풍속 :
|
||||||
// form.setValue('dispCompanyName', info.planReqName)
|
// form.setValue('dispCompanyName', info.planReqName)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -549,6 +563,9 @@ export default function StuffDetail() {
|
|||||||
getOptionLabel={(x) => x.saleStoreName}
|
getOptionLabel={(x) => x.saleStoreName}
|
||||||
getOptionValue={(x) => x.saleStoreId}
|
getOptionValue={(x) => x.saleStoreId}
|
||||||
isClearable={true}
|
isClearable={true}
|
||||||
|
value={saleStoreList.filter(function (option) {
|
||||||
|
return option.saleStoreId === selOptions
|
||||||
|
})}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="input-wrap" style={{ width: '216px' }}>
|
<div className="input-wrap" style={{ width: '216px' }}>
|
||||||
|
|||||||
@ -18,7 +18,6 @@ import { useMessage } from '@/hooks/useMessage'
|
|||||||
import { isObjectNotEmpty } from '@/util/common-utils'
|
import { isObjectNotEmpty } from '@/util/common-utils'
|
||||||
export default function StuffSearchCondition() {
|
export default function StuffSearchCondition() {
|
||||||
const sessionState = useRecoilValue(sessionStore)
|
const sessionState = useRecoilValue(sessionStore)
|
||||||
|
|
||||||
const [appMessageState, setAppMessageState] = useRecoilState(appMessageStore)
|
const [appMessageState, setAppMessageState] = useRecoilState(appMessageStore)
|
||||||
const globalLocaleState = useRecoilValue(globalLocaleStore)
|
const globalLocaleState = useRecoilValue(globalLocaleStore)
|
||||||
const { getMessage } = useMessage()
|
const { getMessage } = useMessage()
|
||||||
@ -74,10 +73,6 @@ export default function StuffSearchCondition() {
|
|||||||
startRow: stuffSearch?.startRow ? stuffSearch.startRow : 1,
|
startRow: stuffSearch?.startRow ? stuffSearch.startRow : 1,
|
||||||
endRow: stuffSearch?.endRow ? stuffSearch.endRow : 100,
|
endRow: stuffSearch?.endRow ? stuffSearch.endRow : 100,
|
||||||
schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R',
|
schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R',
|
||||||
selObject: {
|
|
||||||
label: stuffSearch.selObject.label,
|
|
||||||
value: stuffSearch.selObject.value,
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,7 +95,7 @@ export default function StuffSearchCondition() {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isObjectNotEmpty(sessionState)) {
|
if (isObjectNotEmpty(sessionState)) {
|
||||||
// storeId가 T01 이거나 1차점일때만 판매대리점 선택 활성화
|
// storeId가 T01 이거나 1차점일때만 판매대리점 선택 활성화
|
||||||
// get({ url: `/api/object/saleStore/201TES01/list` }).then((res) => {
|
// get({ url: `/api/object/saleStore/TEMP02/list` }).then((res) => {
|
||||||
get({ url: `/api/object/saleStore/${sessionState?.storeId}/list` }).then((res) => {
|
get({ url: `/api/object/saleStore/${sessionState?.storeId}/list` }).then((res) => {
|
||||||
if (!isEmptyArray(res)) {
|
if (!isEmptyArray(res)) {
|
||||||
res.map((row) => {
|
res.map((row) => {
|
||||||
@ -128,7 +123,6 @@ export default function StuffSearchCondition() {
|
|||||||
...stuffSearch,
|
...stuffSearch,
|
||||||
code: 'S',
|
code: 'S',
|
||||||
schSelSaleStoreId: key.saleStoreId,
|
schSelSaleStoreId: key.saleStoreId,
|
||||||
selObject: { value: key.saleStoreId, label: key.saleStoreName },
|
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
setSchSelSaleStoreId('')
|
setSchSelSaleStoreId('')
|
||||||
@ -268,7 +262,21 @@ export default function StuffSearchCondition() {
|
|||||||
onChange={onSelectionChange}
|
onChange={onSelectionChange}
|
||||||
getOptionLabel={(x) => x.saleStoreName}
|
getOptionLabel={(x) => x.saleStoreName}
|
||||||
getOptionValue={(x) => x.saleStoreId}
|
getOptionValue={(x) => x.saleStoreId}
|
||||||
defaultValue={stuffSearch?.selObject?.value ? stuffSearch?.selObject : null}
|
value={schSelSaleStoreList.filter(function (option) {
|
||||||
|
if (stuffSearch?.code === 'S' && schSelSaleStoreId === '') {
|
||||||
|
return false
|
||||||
|
} else if (stuffSearch?.code === 'S' && schSelSaleStoreId !== '') {
|
||||||
|
return option.saleStoreId === schSelSaleStoreId
|
||||||
|
} else if (stuffSearch?.code === 'E' && schSelSaleStoreId !== '') {
|
||||||
|
return option.saleStoreId === schSelSaleStoreId
|
||||||
|
} else {
|
||||||
|
if (stuffSearch?.schSelSaleStoreId !== '') {
|
||||||
|
return option.saleStoreId === stuffSearch.schSelSaleStoreId
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})}
|
||||||
isDisabled={sessionState?.storeLvl === '1' ? false : true}
|
isDisabled={sessionState?.storeLvl === '1' ? false : true}
|
||||||
isClearable={true}
|
isClearable={true}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -607,10 +607,15 @@ export function useAuxiliaryDrawing(setShowAuxiliaryModal) {
|
|||||||
* 일변전으로 돌아가기
|
* 일변전으로 돌아가기
|
||||||
*/
|
*/
|
||||||
const handleRollback = () => {
|
const handleRollback = () => {
|
||||||
const lastLine = lineHistory.current.pop()
|
const innerPoint = canvas.getObjects().find((obj) => obj.name === 'innerPoint')
|
||||||
mousePointerArr.current = []
|
if (innerPoint) {
|
||||||
canvas.remove(...canvas.getObjects().filter((obj) => obj.name === 'innerPoint'))
|
mousePointerArr.current = []
|
||||||
|
canvas.remove(innerPoint)
|
||||||
|
canvas.renderAll()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const lastLine = lineHistory.current.pop()
|
||||||
if (lastLine) {
|
if (lastLine) {
|
||||||
roofAdsorptionPoints.current = roofAdsorptionPoints.current.filter(
|
roofAdsorptionPoints.current = roofAdsorptionPoints.current.filter(
|
||||||
(point) => point.x !== lastLine.intersectionPoint?.x && point.y !== lastLine.intersectionPoint?.y,
|
(point) => point.x !== lastLine.intersectionPoint?.x && point.y !== lastLine.intersectionPoint?.y,
|
||||||
@ -640,6 +645,7 @@ export function useAuxiliaryDrawing(setShowAuxiliaryModal) {
|
|||||||
const inPolygon2 = booleanPointInPolygon([line.x2, line.y2], turfPolygon)
|
const inPolygon2 = booleanPointInPolygon([line.x2, line.y2], turfPolygon)
|
||||||
|
|
||||||
if (inPolygon1 && inPolygon2) {
|
if (inPolygon1 && inPolygon2) {
|
||||||
|
line.attributes = { ...line.attributes, roofId: roofBase.id }
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@ -34,8 +34,14 @@ import { QLine } from '@/components/fabric/QLine'
|
|||||||
//외벽선 그리기
|
//외벽선 그리기
|
||||||
export function useOuterLineWall(setShowOutlineModal) {
|
export function useOuterLineWall(setShowOutlineModal) {
|
||||||
const canvas = useRecoilValue(canvasState)
|
const canvas = useRecoilValue(canvasState)
|
||||||
const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } =
|
const {
|
||||||
useEvent()
|
initEvent,
|
||||||
|
addCanvasMouseEventListener,
|
||||||
|
addDocumentEventListener,
|
||||||
|
removeAllMouseEventListeners,
|
||||||
|
removeAllDocumentEventListeners,
|
||||||
|
removeMouseEvent,
|
||||||
|
} = useEvent()
|
||||||
const { getIntersectMousePoint } = useMouse()
|
const { getIntersectMousePoint } = useMouse()
|
||||||
const { addLine, removeLine } = useLine()
|
const { addLine, removeLine } = useLine()
|
||||||
const { tempGridMode } = useTempGrid()
|
const { tempGridMode } = useTempGrid()
|
||||||
@ -76,6 +82,9 @@ export function useOuterLineWall(setShowOutlineModal) {
|
|||||||
|
|
||||||
addCanvasMouseEventListener('mouse:down', mouseDown)
|
addCanvasMouseEventListener('mouse:down', mouseDown)
|
||||||
clear()
|
clear()
|
||||||
|
return () => {
|
||||||
|
initEvent()
|
||||||
|
}
|
||||||
}, [verticalHorizontalMode, points, adsorptionPointAddMode, adsorptionPointMode, adsorptionRange, interval, tempGridMode])
|
}, [verticalHorizontalMode, points, adsorptionPointAddMode, adsorptionPointMode, adsorptionRange, interval, tempGridMode])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@ -209,10 +209,12 @@ export function useRoofShapePassivitySetting(setShowRoofShapePassivitySettingMod
|
|||||||
|
|
||||||
wall.lines = [...lines]
|
wall.lines = [...lines]
|
||||||
// 기존 그려진 지붕이 없다면
|
// 기존 그려진 지붕이 없다면
|
||||||
if (roofBases.length === 0) {
|
|
||||||
return
|
if (isFix.current) {
|
||||||
|
// 완료 한 경우에는 지붕까지 그려줌
|
||||||
|
const roof = drawRoofPolygon(wall)
|
||||||
}
|
}
|
||||||
const roof = drawRoofPolygon(wall)
|
|
||||||
canvas.renderAll()
|
canvas.renderAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import { useEffect, useRef } from 'react'
|
|||||||
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'
|
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'
|
||||||
import { canvasState, canvasZoomState, currentMenuState, textModeState } from '@/store/canvasAtom'
|
import { canvasState, canvasZoomState, currentMenuState, textModeState } from '@/store/canvasAtom'
|
||||||
import { fabric } from 'fabric'
|
import { fabric } from 'fabric'
|
||||||
import { calculateDistance, distanceBetweenPoints, findClosestPoint } from '@/util/canvas-util'
|
import { calculateDistance, calculateIntersection, distanceBetweenPoints, findClosestPoint, polygonToTurfPolygon } from '@/util/canvas-util'
|
||||||
import { useAdsorptionPoint } from '@/hooks/useAdsorptionPoint'
|
import { useAdsorptionPoint } from '@/hooks/useAdsorptionPoint'
|
||||||
import { useDotLineGrid } from '@/hooks/useDotLineGrid'
|
import { useDotLineGrid } from '@/hooks/useDotLineGrid'
|
||||||
import { useTempGrid } from '@/hooks/useTempGrid'
|
import { useTempGrid } from '@/hooks/useTempGrid'
|
||||||
@ -151,6 +151,17 @@ export function useEvent() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const helpGuideLines = canvas.getObjects().filter((obj) => obj.name === 'helpGuideLine')
|
||||||
|
if (helpGuideLines.length === 2) {
|
||||||
|
const guideIntersectionPoint = calculateIntersection(helpGuideLines[0], helpGuideLines[1])
|
||||||
|
|
||||||
|
if (guideIntersectionPoint && distanceBetweenPoints(guideIntersectionPoint, pointer) <= adsorptionRange) {
|
||||||
|
arrivalPoint = guideIntersectionPoint
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
const horizontalLine = new fabric.Line([-1 * canvas.width, arrivalPoint.y, 2 * canvas.width, arrivalPoint.y], {
|
const horizontalLine = new fabric.Line([-1 * canvas.width, arrivalPoint.y, 2 * canvas.width, arrivalPoint.y], {
|
||||||
stroke: 'red',
|
stroke: 'red',
|
||||||
strokeWidth: 1,
|
strokeWidth: 1,
|
||||||
|
|||||||
@ -289,3 +289,8 @@ export const canGridOptionSeletor = selector({
|
|||||||
return points.length === 0 || outerLineFix
|
return points.length === 0 || outerLineFix
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
export const globalPitchState = atom({
|
||||||
|
key: 'globalPitch',
|
||||||
|
default: 4,
|
||||||
|
})
|
||||||
|
|||||||
@ -18,10 +18,6 @@ export const stuffSearchState = atom({
|
|||||||
startRow: 1,
|
startRow: 1,
|
||||||
endRow: 100,
|
endRow: 100,
|
||||||
schSortType: 'R', //정렬조건 (R:최근등록일 U:최근수정일)
|
schSortType: 'R', //정렬조건 (R:최근등록일 U:최근수정일)
|
||||||
selObject: {
|
|
||||||
value: '',
|
|
||||||
label: '',
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
dangerouslyAllowMutability: true,
|
dangerouslyAllowMutability: true,
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user