feat(pdf-import): 외벽선 자동 확정(auto fix) 토글 추가 — 전역 옵션·기본 ON

배치면 초기설정 PDF 입력 화면에 '외벽선 자동 확정' 토글을 추가한다.
- autoOuterLineFixState 전역 atom 신설(기본값 true), outerLineFixState 와 별개의 옵션 플래그
- ko/ja i18n 라벨·설명 키 추가
- toggle-btn 스위치를 읽기 페이지 설정 행 아래 배치, 분석 중에는 비활성화

실제 PDF 자동 확정 동작 연결(usePdfImport)은 별도 작업으로 분리.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
sangwook yoo 2026-06-21 21:34:55 +09:00
parent ce295dd8ff
commit fafee78c8a
4 changed files with 33 additions and 0 deletions

View File

@ -13,6 +13,7 @@ import { addedRoofsState, roofDisplaySelector, roofMaterialsAtom } from '@/store
import { useCommonCode } from '@/hooks/common/useCommonCode' import { useCommonCode } from '@/hooks/common/useCommonCode'
import QSelectBox from '@/components/common/select/QSelectBox' import QSelectBox from '@/components/common/select/QSelectBox'
import { globalLocaleStore } from '@/store/localeAtom' import { globalLocaleStore } from '@/store/localeAtom'
import { autoOuterLineFixState } from '@/store/outerLineAtom'
import { getChonByDegree, getDegreeByChon } from '@/util/canvas-util' import { getChonByDegree, getDegreeByChon } from '@/util/canvas-util'
import { usePolygon } from '@/hooks/usePolygon' import { usePolygon } from '@/hooks/usePolygon'
@ -107,6 +108,8 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla
const [pdfFacadePages, setPdfFacadePages] = useState('') const [pdfFacadePages, setPdfFacadePages] = useState('')
const [pdfFloorPages, setPdfFloorPages] = useState('') const [pdfFloorPages, setPdfFloorPages] = useState('')
const [pdfAnalyzing, setPdfAnalyzing] = useState(false) const [pdfAnalyzing, setPdfAnalyzing] = useState(false)
// (auto fix) ON
const [autoOuterLineFix, setAutoOuterLineFix] = useRecoilState(autoOuterLineFixState)
const { setIsGlobalLoading } = useContext(QcastContext) const { setIsGlobalLoading } = useContext(QcastContext)
const pdfInputRef = useRef(null) const pdfInputRef = useRef(null)
// PDF ( ) abort , // PDF ( ) abort ,
@ -633,6 +636,23 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla
</div> </div>
</td> </td>
</tr> </tr>
<tr>
<th>{getMessage('modal.placement.initial.setting.size.pdf.autofix.label')}</th>
<td>
<label className="toggle-btn">
<input
type="checkbox"
checked={autoOuterLineFix}
disabled={pdfAnalyzing}
onChange={(e) => setAutoOuterLineFix(e.target.checked)}
/>
<span className="slider"></span>
</label>
<div style={{ fontSize: '12px', color: '#bbb', marginTop: '4px' }}>
{getMessage('modal.placement.initial.setting.size.pdf.autofix.info')}
</div>
</td>
</tr>
</> </>
)} )}
<tr> <tr>

View File

@ -42,6 +42,8 @@
"modal.placement.initial.setting.size.pdf.page.example.floor": "例) 3, 4", "modal.placement.initial.setting.size.pdf.page.example.floor": "例) 3, 4",
"modal.placement.initial.setting.size.pdf.page.all.info": "全ページを解析するため処理時間が長くなる場合があります。図面内の立面図·平面図ページが特定できる場合はページ指定を推奨します。", "modal.placement.initial.setting.size.pdf.page.all.info": "全ページを解析するため処理時間が長くなる場合があります。図面内の立面図·平面図ページが特定できる場合はページ指定を推奨します。",
"modal.placement.initial.setting.size.pdf.page.specify.info": "立面図·平面図が含まれるページ番号をそれぞれ入力してください。指定したページのみ読み込み素早く屋根を自動作成します。", "modal.placement.initial.setting.size.pdf.page.specify.info": "立面図·平面図が含まれるページ番号をそれぞれ入力してください。指定したページのみ読み込み素早く屋根を自動作成します。",
"modal.placement.initial.setting.size.pdf.autofix.label": "外壁線の自動確定",
"modal.placement.initial.setting.size.pdf.autofix.info": "オンにするとPDF解析後、外壁線を自動で確定し屋根形状設定へ進みます。",
"modal.placement.initial.setting.size.pdf.error.mime": "PDF ファイルのみアップロード可能です。", "modal.placement.initial.setting.size.pdf.error.mime": "PDF ファイルのみアップロード可能です。",
"modal.placement.initial.setting.size.pdf.error.too.large": "ファイルサイズが 20MB を超えています。", "modal.placement.initial.setting.size.pdf.error.too.large": "ファイルサイズが 20MB を超えています。",
"modal.placement.initial.setting.size.pdf.error.no.file": "先に PDF ファイルをアップロードしてください。", "modal.placement.initial.setting.size.pdf.error.no.file": "先に PDF ファイルをアップロードしてください。",

View File

@ -42,6 +42,8 @@
"modal.placement.initial.setting.size.pdf.page.example.floor": "예) 3, 4", "modal.placement.initial.setting.size.pdf.page.example.floor": "예) 3, 4",
"modal.placement.initial.setting.size.pdf.page.all.info": "모든 페이지를 분석하므로 처리 시간이 길어질 수 있습니다. 도면 내 입면도·평면도 페이지가 확인되면 페이지 지정을 권장합니다.", "modal.placement.initial.setting.size.pdf.page.all.info": "모든 페이지를 분석하므로 처리 시간이 길어질 수 있습니다. 도면 내 입면도·평면도 페이지가 확인되면 페이지 지정을 권장합니다.",
"modal.placement.initial.setting.size.pdf.page.specify.info": "입면도·평면도가 포함된 페이지 번호를 각각 입력해주세요. 지정한 페이지만 읽어 빠르게 지붕을 자동 작성합니다.", "modal.placement.initial.setting.size.pdf.page.specify.info": "입면도·평면도가 포함된 페이지 번호를 각각 입력해주세요. 지정한 페이지만 읽어 빠르게 지붕을 자동 작성합니다.",
"modal.placement.initial.setting.size.pdf.autofix.label": "외벽선 자동 확정",
"modal.placement.initial.setting.size.pdf.autofix.info": "켜면 PDF 분석 후 외벽선을 자동으로 확정하고 지붕형상 설정 단계로 넘어갑니다.",
"modal.placement.initial.setting.size.pdf.error.mime": "PDF 파일만 업로드할 수 있습니다.", "modal.placement.initial.setting.size.pdf.error.mime": "PDF 파일만 업로드할 수 있습니다.",
"modal.placement.initial.setting.size.pdf.error.too.large": "파일 크기가 20MB 를 초과합니다.", "modal.placement.initial.setting.size.pdf.error.too.large": "파일 크기가 20MB 를 초과합니다.",
"modal.placement.initial.setting.size.pdf.error.no.file": "PDF 파일을 먼저 업로드해 주세요.", "modal.placement.initial.setting.size.pdf.error.no.file": "PDF 파일을 먼저 업로드해 주세요.",

View File

@ -68,3 +68,12 @@ export const outerLineFixState = atom({
key: 'outerLineFixState', key: 'outerLineFixState',
default: false, default: false,
}) })
/**
* PDF 도면 임포트 외벽선 자동 확정(auto fix) 여부 전역 설정, 기본 ON
* (런타임 확정 상태인 outerLineFixState 와는 별개의 옵션 플래그)
*/
export const autoOuterLineFixState = atom({
key: 'autoOuterLineFixState',
default: true,
})