@dssp/supervision 1.0.6 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-client/assets/ai-measurement/capture_guide.png +0 -0
- package/dist-client/assets/ai-measurement/picto-common-sweep.svg +11 -0
- package/dist-client/assets/ai-measurement/picto-member-corner.svg +11 -0
- package/dist-client/assets/ai-measurement/picto-rebar-parallel.svg +14 -0
- package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.d.ts +59 -13
- package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js +995 -223
- package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js.map +1 -1
- package/dist-client/pages/checklist/checklist-view.js +3 -4
- package/dist-client/pages/checklist/checklist-view.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
Binary file
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 290" width="480" height="290" role="img" aria-label="촬영 이동 방법" font-family='"IBM Plex Sans KR","Apple SD Gothic Neo","Malgun Gothic","Noto Sans KR",sans-serif'>
|
|
2
|
+
<title>촬영 이동 방법</title>
|
|
3
|
+
<text x="240" y="26" text-anchor="middle" font-size="16" font-weight="600" fill="#1A1D1B">공통 — 제자리에서 돌리지 말고, 옆으로 걸어간다</text>
|
|
4
|
+
<defs><marker id="w" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="#0E7A3C" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></marker><marker id="x" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="#B3261E" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></marker></defs>
|
|
5
|
+
<line x1="240" y1="48" x2="240" y2="248" stroke="#B9BFBA" stroke-width="1" stroke-dasharray="4 5"/>
|
|
6
|
+
<rect x="45" y="62" width="150" height="34" rx="3" fill="#EDEEEC" stroke="#B9BFBA" stroke-width="1.5"/><text x="120" y="84" text-anchor="middle" font-size="13" fill="#767D78">부재</text>
|
|
7
|
+
<rect x="285" y="62" width="150" height="34" rx="3" fill="#EDEEEC" stroke="#B9BFBA" stroke-width="1.5"/><text x="360" y="84" text-anchor="middle" font-size="13" fill="#767D78">부재</text>
|
|
8
|
+
<path d="M120 180 L82 100 L158 100 Z" fill="#B3261E" opacity=".15" transform="rotate(-32 120 190)"/><circle cx="120" cy="190" r="9" fill="#B3261E"/><path d="M120 180 L82 100 L158 100 Z" fill="#B3261E" opacity=".15"/><circle cx="120" cy="190" r="9" fill="#B3261E"/><path d="M120 180 L82 100 L158 100 Z" fill="#B3261E" opacity=".15" transform="rotate(32 120 190)"/><circle cx="120" cy="190" r="9" fill="#B3261E"/><path d="M152 192 A34 34 0 0 0 122 158" fill="none" stroke="#B3261E" stroke-width="2.5" marker-end="url(#x)"/>
|
|
9
|
+
<text x="120" y="252" text-anchor="middle" font-size="15" fill="#B3261E" font-weight="600">✗ 제자리에서 돌리기</text><text x="120" y="274" text-anchor="middle" font-size="13" fill="#767D78">거리를 알 수 없다</text>
|
|
10
|
+
<path d="M300 180 L262 100 L338 100 Z" fill="#0E7A3C" opacity=".15"/><circle cx="300" cy="190" r="9" fill="#0E7A3C"/><path d="M360 180 L322 100 L398 100 Z" fill="#0E7A3C" opacity=".15"/><circle cx="360" cy="190" r="9" fill="#0E7A3C"/><path d="M420 180 L382 100 L458 100 Z" fill="#0E7A3C" opacity=".15"/><circle cx="420" cy="190" r="9" fill="#0E7A3C"/><line x1="288" y1="214" x2="438" y2="214" stroke="#0E7A3C" stroke-width="2.5" marker-end="url(#w)"/><text x="360" y="252" text-anchor="middle" font-size="15" fill="#0E7A3C" font-weight="600">✓ 옆으로 걸어가기</text><text x="360" y="274" text-anchor="middle" font-size="13" fill="#767D78">몸이 실제로 옮겨가야 한다</text>
|
|
11
|
+
</svg>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 300" width="360" height="300" role="img" aria-label="기둥 벽체 촬영 자세" font-family='"IBM Plex Sans KR","Apple SD Gothic Neo","Malgun Gothic","Noto Sans KR",sans-serif'>
|
|
2
|
+
<title>기둥 벽체 촬영 자세</title>
|
|
3
|
+
<text x="180" y="26" text-anchor="middle" font-size="16" font-weight="600" fill="#1A1D1B">기둥·벽체 형상치수 — 모서리가 보이게</text>
|
|
4
|
+
<defs><marker id="b" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="#1C4F86" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></marker></defs>
|
|
5
|
+
<g transform="translate(10 30)">
|
|
6
|
+
<rect x="76" y="44" width="150" height="76" rx="3" fill="#1C4F86" fill-opacity=".07" stroke="#B9BFBA" stroke-width="1.5"/><text x="151" y="88" text-anchor="middle" font-size="13" fill="#767D78">기둥·벽</text>
|
|
7
|
+
<line x1="76" y1="120" x2="226" y2="120" stroke="#1C4F86" stroke-width="5"/><line x1="226" y1="44" x2="226" y2="120" stroke="#1C4F86" stroke-width="5"/><circle cx="226" cy="120" r="15" fill="none" stroke="#1C4F86" stroke-width="2" stroke-dasharray="4 3"/><text x="248" y="112" font-size="13" fill="#1C4F86" font-weight="600">모서리</text>
|
|
8
|
+
<line x1="44" y1="214" x2="312" y2="158" stroke="#1C4F86" stroke-width="2.5" marker-end="url(#b)"/>
|
|
9
|
+
<path d="M84 196 L54 134 L114 134 Z" fill="#1C4F86" opacity=".15" transform="rotate(44 84 206)"/><circle cx="84" cy="206" r="9" fill="#1C4F86"/><path d="M176 177 L146 115 L206 115 Z" fill="#1C4F86" opacity=".15" transform="rotate(30 176 187)"/><circle cx="176" cy="187" r="9" fill="#1C4F86"/><path d="M268 158 L238 96 L298 96 Z" fill="#1C4F86" opacity=".15" transform="rotate(-36 268 168)"/><circle cx="268" cy="168" r="9" fill="#1C4F86"/></g>
|
|
10
|
+
<text x="180" y="292" text-anchor="middle" font-size="13" fill="#767D78">세 위치 모두 모서리가 화면에 들어오게 한다</text>
|
|
11
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 300" width="360" height="300" role="img" aria-label="철근 배근 길이 촬영 자세" font-family='"IBM Plex Sans KR","Apple SD Gothic Neo","Malgun Gothic","Noto Sans KR",sans-serif'>
|
|
2
|
+
<title>철근 배근 길이 촬영 자세</title>
|
|
3
|
+
<text x="180" y="26" text-anchor="middle" font-size="16" font-weight="600" fill="#1A1D1B">철근의 배근 길이 — 변과 나란히</text>
|
|
4
|
+
<defs><marker id="a" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse"><path d="M2 1L8 5L2 9" fill="none" stroke="#0E7A3C" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></marker></defs>
|
|
5
|
+
<g transform="translate(10 30)">
|
|
6
|
+
<rect x="70" y="44" width="200" height="66" rx="3" fill="none" stroke="#B9BFBA" stroke-width="1.5"/><g fill="#B9BFBA"><circle cx="70" cy="44" r="4"/><circle cx="136" cy="44" r="4"/><circle cx="204" cy="44" r="4"/><circle cx="270" cy="44" r="4"/><circle cx="70" cy="77" r="4"/><circle cx="270" cy="77" r="4"/></g>
|
|
7
|
+
<g fill="#0E7A3C"><circle cx="70" cy="110" r="5"/><circle cx="103" cy="110" r="5"/><circle cx="137" cy="110" r="5"/><circle cx="170" cy="110" r="5"/><circle cx="203" cy="110" r="5"/><circle cx="236" cy="110" r="5"/><circle cx="270" cy="110" r="5"/></g>
|
|
8
|
+
<line x1="70" y1="128" x2="270" y2="128" stroke="#0E7A3C" stroke-width="4"/><line x1="70" y1="119" x2="70" y2="137" stroke="#0E7A3C" stroke-width="2"/><line x1="270" y1="119" x2="270" y2="137" stroke="#0E7A3C" stroke-width="2"/><text x="170" y="147" text-anchor="middle" font-size="13" fill="#0E7A3C" font-weight="600">이 변을 잰다</text>
|
|
9
|
+
<line x1="70" y1="137" x2="70" y2="200" stroke="#B9BFBA" stroke-width="1" stroke-dasharray="3 4"/>
|
|
10
|
+
<line x1="270" y1="137" x2="270" y2="200" stroke="#B9BFBA" stroke-width="1" stroke-dasharray="3 4"/>
|
|
11
|
+
<line x1="30" y1="212" x2="320" y2="212" stroke="#0E7A3C" stroke-width="2.5" marker-end="url(#a)"/>
|
|
12
|
+
<path d="M56 202 L32 156 L80 156 Z" fill="#0E7A3C" opacity=".15" transform="rotate(20 56 212)"/><circle cx="56" cy="212" r="9" fill="#0E7A3C"/><path d="M170 202 L146 156 L194 156 Z" fill="#0E7A3C" opacity=".15"/><circle cx="170" cy="212" r="9" fill="#0E7A3C"/><path d="M284 202 L260 156 L308 156 Z" fill="#0E7A3C" opacity=".15" transform="rotate(-20 284 212)"/><circle cx="284" cy="212" r="9" fill="#0E7A3C"/><text x="30" y="242" font-size="13" fill="#767D78">시작 — 끝보다 바깥</text><text x="320" y="242" text-anchor="end" font-size="13" fill="#767D78">끝</text></g>
|
|
13
|
+
<text x="180" y="292" text-anchor="middle" font-size="13" fill="#767D78">걸어간 방향이 어느 변을 잴지 정한다</text>
|
|
14
|
+
</svg>
|
package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.d.ts
CHANGED
|
@@ -1,41 +1,69 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 검측 관리 상세 - AI 자동 검측
|
|
2
|
+
* 검측 관리 상세 - AI 자동 검측 (동영상 세트 + 측정 모델 2종)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* 1) 촬영 가이드(plan-shots
|
|
6
|
-
* 2)
|
|
7
|
-
* 3)
|
|
8
|
-
* 4)
|
|
4
|
+
* 체크리스트 항목을 AI 엔진(inspection-ai)과 측정 서버(measure-engine)에 연동해:
|
|
5
|
+
* 1) 촬영 가이드(plan-shots, 동영상 최대 3건)를 표시하고
|
|
6
|
+
* 2) LidarInspector 앱이 만든 세트(video.mov/poses.jsonl/meta.json)를 업로드하면
|
|
7
|
+
* 3) 세트별 대표 3프레임으로 자동 판정(inspect, input_kind=video_frames)을 실행한 뒤
|
|
8
|
+
* 4) 「추가 작업 필요」(재촬영/기준값 입력/AI 미지원)를 분류해 측정 UI(철근 배근 길이·기둥벽체 두께)로 처리하고
|
|
9
|
+
* 5) 측정 결과는 apply-measurement로 판정 확정 → 검사 등록 시 감리자 적합/부적합 자동 반영 + 근거 첨부한다.
|
|
9
10
|
*/
|
|
10
11
|
import '@material/web/icon/icon.js';
|
|
11
12
|
import '@material/web/progress/circular-progress.js';
|
|
12
13
|
import { PageView } from '@operato/shell';
|
|
13
14
|
import { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view';
|
|
14
15
|
import './component/building-inspection-detail-header';
|
|
15
|
-
type PanelMode = 'none' | 'detail' | 'recapture' | 'report';
|
|
16
|
+
type PanelMode = 'none' | 'detail' | 'recapture' | 'measure' | 'report';
|
|
17
|
+
type SetInfo = {
|
|
18
|
+
setId: string;
|
|
19
|
+
technique?: string;
|
|
20
|
+
label: string;
|
|
21
|
+
warnings: string[];
|
|
22
|
+
};
|
|
16
23
|
export declare class BuildingInspectionAiMeasurement extends PageView {
|
|
17
24
|
static styles: import("lit").CSSResult[];
|
|
18
25
|
project: any;
|
|
19
26
|
buildingInspection: any;
|
|
20
27
|
buildingInspectionId: string;
|
|
21
28
|
guide: any;
|
|
29
|
+
sets: (SetInfo | null)[];
|
|
22
30
|
photos: {
|
|
23
31
|
file: File;
|
|
24
32
|
url: string;
|
|
33
|
+
setIndex: number;
|
|
25
34
|
}[];
|
|
26
35
|
result: any;
|
|
27
36
|
mainPhotoIndex: number;
|
|
28
37
|
panel: PanelMode;
|
|
29
38
|
selectedItem: any;
|
|
30
39
|
recaptureBase: number;
|
|
40
|
+
recaptureSet: SetInfo | null;
|
|
31
41
|
expandedReportId: string | null;
|
|
42
|
+
measureSetIndex: number;
|
|
43
|
+
measureInputs: Record<string, string>;
|
|
44
|
+
measureRunning: boolean;
|
|
45
|
+
measureMsg: string;
|
|
46
|
+
measureResult: any;
|
|
47
|
+
measureImageUrl: string;
|
|
48
|
+
thicknessFrames: {
|
|
49
|
+
slot: number;
|
|
50
|
+
index: number;
|
|
51
|
+
thumbUrl?: string;
|
|
52
|
+
}[];
|
|
53
|
+
thicknessSlot: number | null;
|
|
54
|
+
thicknessFrameUrl: string;
|
|
55
|
+
thicknessClick: {
|
|
56
|
+
x: number;
|
|
57
|
+
y: number;
|
|
58
|
+
} | null;
|
|
32
59
|
loading: boolean;
|
|
33
60
|
loadingText: string;
|
|
34
61
|
/** 뮤테이션 가능 여부('dcsp guest' 권한 보유 시 false) — 게스트에게는 생성/수정/삭제 버튼을 숨긴다 */
|
|
35
62
|
private canMutate;
|
|
36
|
-
private
|
|
63
|
+
private setInputEl;
|
|
64
|
+
private pendingSetIndex;
|
|
65
|
+
private objectUrls;
|
|
37
66
|
connectedCallback(): Promise<void>;
|
|
38
|
-
private pendingSlotIndex;
|
|
39
67
|
get context(): {
|
|
40
68
|
title: string;
|
|
41
69
|
};
|
|
@@ -44,31 +72,49 @@ export declare class BuildingInspectionAiMeasurement extends PageView {
|
|
|
44
72
|
category: string;
|
|
45
73
|
text: any;
|
|
46
74
|
}[];
|
|
75
|
+
get uploadedSets(): SetInfo[];
|
|
47
76
|
render(): import("lit-html").TemplateResult<1>;
|
|
48
77
|
private _renderGuide;
|
|
78
|
+
private _groupOf;
|
|
79
|
+
private _verdictLabel;
|
|
49
80
|
private _renderResult;
|
|
50
81
|
private _renderItemCard;
|
|
51
82
|
private _renderSidePane;
|
|
52
83
|
private _renderDetailPane;
|
|
53
84
|
private _renderRecapturePane;
|
|
85
|
+
private _renderMeasureFields;
|
|
86
|
+
private _renderMeasurePane;
|
|
87
|
+
private _renderThicknessPicker;
|
|
54
88
|
private _renderReportPane;
|
|
55
89
|
pageUpdated(changes: any, lifecycle: PageLifecycle): Promise<void>;
|
|
56
90
|
initBuildingInspection(buildingInspectionId?: string): Promise<void>;
|
|
57
91
|
private _getProjectByBuildingComplexId;
|
|
58
92
|
private _callEngine;
|
|
93
|
+
private _callMeasure;
|
|
94
|
+
private _fetchMeasureImage;
|
|
59
95
|
private _loadShotGuide;
|
|
96
|
+
private _openSetPicker;
|
|
97
|
+
private _onSetFilesSelected;
|
|
98
|
+
private _fetchVlmFrames;
|
|
60
99
|
private _runInspection;
|
|
61
|
-
private
|
|
62
|
-
private _openPhotoPicker;
|
|
63
|
-
private _onPhotosSelected;
|
|
64
|
-
private _resetPhotos;
|
|
100
|
+
private _mergeItems;
|
|
65
101
|
private _resetAll;
|
|
102
|
+
private _resetMeasureState;
|
|
66
103
|
private _openDetail;
|
|
67
104
|
private _openRecapture;
|
|
105
|
+
private _openMeasure;
|
|
106
|
+
private _onMeasureSetChange;
|
|
68
107
|
private _openReport;
|
|
69
108
|
private _toggleReportItem;
|
|
70
109
|
private _closePanel;
|
|
71
110
|
private _sortedItems;
|
|
111
|
+
private _runRebarMeasure;
|
|
112
|
+
private _loadThicknessFrames;
|
|
113
|
+
private _selectThicknessFrame;
|
|
114
|
+
private _onThicknessClick;
|
|
115
|
+
private _runThicknessMeasure;
|
|
116
|
+
private _applyMeasurement;
|
|
117
|
+
private _dataUrlToFile;
|
|
72
118
|
private _registerInspection;
|
|
73
119
|
}
|
|
74
120
|
export {};
|