@things-factory/board-import 10.0.0-beta.71 → 10.0.0-beta.73
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-server/index.d.ts +1 -1
- package/dist-server/index.js +1 -1
- package/dist-server/index.js.map +1 -1
- package/dist-server/service/adapters/dxf-adapter.d.ts +1 -1
- package/dist-server/service/adapters/dxf-adapter.js +18 -4
- package/dist-server/service/adapters/dxf-adapter.js.map +1 -1
- package/dist-server/service/adapters/image-adapter.d.ts +32 -0
- package/dist-server/service/adapters/image-adapter.js +420 -0
- package/dist-server/service/adapters/image-adapter.js.map +1 -0
- package/dist-server/service/ai/types.d.ts +96 -4
- package/dist-server/service/ai/types.js +221 -12
- package/dist-server/service/ai/types.js.map +1 -1
- package/dist-server/service/converters/generic-to.d.ts +17 -8
- package/dist-server/service/converters/generic-to.js +44 -44
- package/dist-server/service/converters/generic-to.js.map +1 -1
- package/dist-server/service/import-session/import-actions.d.ts +79 -0
- package/dist-server/service/import-session/import-actions.js +98 -0
- package/dist-server/service/import-session/import-actions.js.map +1 -0
- package/dist-server/service/import-session/import-session-resolver.d.ts +22 -1
- package/dist-server/service/import-session/import-session-resolver.js +166 -38
- package/dist-server/service/import-session/import-session-resolver.js.map +1 -1
- package/dist-server/service/import-session/import-worker.js +55 -13
- package/dist-server/service/import-session/import-worker.js.map +1 -1
- package/dist-server/service/import-session/index.d.ts +5 -3
- package/dist-server/service/import-session/index.js +16 -9
- package/dist-server/service/import-session/index.js.map +1 -1
- package/dist-server/service/import-session/materialize-from-session.d.ts +66 -0
- package/dist-server/service/import-session/materialize-from-session.js +104 -0
- package/dist-server/service/import-session/materialize-from-session.js.map +1 -0
- package/dist-server/service/import-session/suggest-board-name.d.ts +80 -0
- package/dist-server/service/import-session/suggest-board-name.js +195 -0
- package/dist-server/service/import-session/suggest-board-name.js.map +1 -0
- package/dist-server/service/import-tools.d.ts +10 -0
- package/dist-server/service/import-tools.js +227 -0
- package/dist-server/service/import-tools.js.map +1 -0
- package/dist-server/service/index.d.ts +22 -19
- package/dist-server/service/index.js +46 -36
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/pipeline/index.d.ts +42 -9
- package/dist-server/service/pipeline/index.js +92 -23
- package/dist-server/service/pipeline/index.js.map +1 -1
- package/dist-server/service/pipeline/stage2-mapping.d.ts +20 -5
- package/dist-server/service/pipeline/stage2-mapping.js +84 -26
- package/dist-server/service/pipeline/stage2-mapping.js.map +1 -1
- package/dist-server/service/pipeline/stage3-board.d.ts +2 -2
- package/dist-server/service/pipeline/stage3-board.js +65 -10
- package/dist-server/service/pipeline/stage3-board.js.map +1 -1
- package/dist-server/service/pipeline/stage4-binding.d.ts +1 -1
- package/dist-server/service/pipeline/stage4-binding.js +2 -2
- package/dist-server/service/pipeline/stage4-binding.js.map +1 -1
- package/dist-server/service/registry/index.d.ts +1 -1
- package/dist-server/service/registry/index.js.map +1 -1
- package/dist-server/service/types/index.d.ts +35 -0
- package/dist-server/service/types/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -6
- package/server/index.ts +1 -1
- package/server/service/adapters/dxf-adapter.ts +17 -4
- package/server/service/adapters/image-adapter.test.ts +545 -0
- package/server/service/adapters/image-adapter.ts +464 -0
- package/server/service/ai/types.ts +354 -19
- package/server/service/converters/generic-to.test.ts +91 -0
- package/server/service/converters/generic-to.ts +66 -49
- package/server/service/import-session/import-actions.test.ts +185 -0
- package/server/service/import-session/import-actions.ts +164 -0
- package/server/service/import-session/import-session-resolver.ts +171 -39
- package/server/service/import-session/import-worker.ts +56 -12
- package/server/service/import-session/index.ts +19 -3
- package/server/service/import-session/materialize-from-session.test.ts +274 -0
- package/server/service/import-session/materialize-from-session.ts +158 -0
- package/server/service/import-session/suggest-board-name.test.ts +271 -0
- package/server/service/import-session/suggest-board-name.ts +279 -0
- package/server/service/import-tools.test.ts +137 -0
- package/server/service/import-tools.ts +255 -0
- package/server/service/index.ts +35 -18
- package/server/service/pipeline/index.ts +118 -23
- package/server/service/pipeline/stage2-mapping.test.ts +204 -0
- package/server/service/pipeline/stage2-mapping.ts +102 -27
- package/server/service/pipeline/stage3-board.test.ts +133 -0
- package/server/service/pipeline/stage3-board.ts +76 -11
- package/server/service/pipeline/stage4-binding.ts +2 -2
- package/server/service/registry/index.ts +1 -1
- package/server/service/types/index.ts +36 -0
|
@@ -5,7 +5,7 @@ exports.applyDataBinding = applyDataBinding;
|
|
|
5
5
|
* Stage 4 — 보드 모델에 데이터 바인딩 자동 설정.
|
|
6
6
|
* 컴포넌트 type 에 등록된 SubscriptionRule 을 찾아 subscriptionTag 등 부여.
|
|
7
7
|
*/
|
|
8
|
-
const
|
|
8
|
+
const index_1 = require("../registry/index");
|
|
9
9
|
/**
|
|
10
10
|
* 보드 모델의 모든 컴포넌트에 subscription 정보를 주입.
|
|
11
11
|
* things-factory 의 dataSubscriptionProvider 가 인식하는 형태로.
|
|
@@ -15,7 +15,7 @@ function applyDataBinding(model, options = {}) {
|
|
|
15
15
|
return { ...model, components };
|
|
16
16
|
}
|
|
17
17
|
function bindComponent(c, options) {
|
|
18
|
-
const rule = (0,
|
|
18
|
+
const rule = (0, index_1.findSubscriptionRule)(c.type, options.scopes);
|
|
19
19
|
if (!rule)
|
|
20
20
|
return c;
|
|
21
21
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stage4-binding.js","sourceRoot":"","sources":["../../../server/service/pipeline/stage4-binding.ts"],"names":[],"mappings":";;AAeA,4CAGC;AAlBD;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"stage4-binding.js","sourceRoot":"","sources":["../../../server/service/pipeline/stage4-binding.ts"],"names":[],"mappings":";;AAeA,4CAGC;AAlBD;;;GAGG;AACH,6CAAwD;AAOxD;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,KAAiB,EAAE,UAA0B,EAAE;IAC9E,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;IACvE,OAAO,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,CAAA;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,CAAiB,EAAE,OAAuB;IAC/D,MAAM,IAAI,GAAG,IAAA,4BAAoB,EAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAA;IAEnB,OAAO;QACL,GAAG,CAAC;QACJ,eAAe,EAAE,IAAI,CAAC,GAAG;QACzB,mBAAmB,EAAE,IAAI,CAAC,OAAO,IAAI,MAAM;QAC3C,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,yBAAyB,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;KAC7E,CAAA;AACH,CAAC","sourcesContent":["/**\n * Stage 4 — 보드 모델에 데이터 바인딩 자동 설정.\n * 컴포넌트 type 에 등록된 SubscriptionRule 을 찾아 subscriptionTag 등 부여.\n */\nimport { findSubscriptionRule } from '../registry/index'\nimport type { BoardComponent, BoardModel } from './stage3-board'\n\nexport interface BindingOptions {\n scopes?: string[]\n}\n\n/**\n * 보드 모델의 모든 컴포넌트에 subscription 정보를 주입.\n * things-factory 의 dataSubscriptionProvider 가 인식하는 형태로.\n */\nexport function applyDataBinding(model: BoardModel, options: BindingOptions = {}): BoardModel {\n const components = model.components.map(c => bindComponent(c, options))\n return { ...model, components }\n}\n\nfunction bindComponent(c: BoardComponent, options: BindingOptions): BoardComponent {\n const rule = findSubscriptionRule(c.type, options.scopes)\n if (!rule) return c\n\n return {\n ...c,\n subscriptionTag: rule.tag,\n subscriptionIdField: rule.idField ?? 'NAME',\n ...(rule.fieldMappings && { subscriptionFieldMappings: rule.fieldMappings })\n }\n}\n"]}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* 백엔드 단일 프로세스 안에서 in-memory 로 유지된다. 모듈 부트스트랩 시 등록.
|
|
6
6
|
*/
|
|
7
|
-
import type { ComponentCategory, ImportRule, SubscriptionRule, ThreeDPreset } from '../types/registry
|
|
7
|
+
import type { ComponentCategory, ImportRule, SubscriptionRule, ThreeDPreset } from '../types/registry';
|
|
8
8
|
export declare function registerImportRules(scope: string, rules: ImportRule[]): void;
|
|
9
9
|
export declare function getImportRules(scopes?: string[]): ImportRule[];
|
|
10
10
|
export declare function clearImportRules(scope: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/registry/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 앱이 자기 도메인 매핑을 등록하는 Registry.\n * scope 별로 분리 보관 (예: 'fmsim', 'mms', 'wms').\n *\n * 백엔드 단일 프로세스 안에서 in-memory 로 유지된다. 모듈 부트스트랩 시 등록.\n */\nimport type { ComponentCategory, ImportRule, SubscriptionRule, ThreeDPreset } from '../types/registry
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/registry/index.ts"],"names":[],"mappings":";;AAoCA,kDAEC;AAED,wCAKC;AAED,4CAEC;AAID,8CAEC;AAED,oCAKC;AAUD,oCAoBC;AAED,wCAEC;AAID,8DAEC;AAED,oDAKC;AAED,oDAKC;AAED,wDAEC;AAED,gDAIC;AAtHD;;;;;GAKG;AACH,MAAM,gCAAgC,GAA4C;IAChF,SAAS,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC/I,OAAO,EAAI,EAAE,QAAQ,EAAE,SAAS,EAAI,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAG,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC/H,IAAI,EAAO,EAAE,QAAQ,EAAE,MAAM,EAAO,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAC/G,MAAM,EAAK,EAAE,QAAQ,EAAE,QAAQ,EAAK,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,EAAG,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;IAC7H,SAAS,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC/H,EAAE,EAAS,EAAE,QAAQ,EAAE,IAAI,EAAS,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAG,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC/H,MAAM,EAAK,EAAE,QAAQ,EAAE,QAAQ,EAAK,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAG,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAC7G,SAAS,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;IAChJ,OAAO,EAAI,EAAE,QAAQ,EAAE,SAAS,EAAI,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAG,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;CAC9I,CAAA;AAMD,MAAM,kBAAkB,GAA+B,EAAE,CAAA;AACzD,MAAM,oBAAoB,GAAiC,EAAE,CAAA;AAC7D,MAAM,wBAAwB,GAAqC,EAAE,CAAA;AAErE,sEAAsE;AAEtE,SAAgB,mBAAmB,CAAC,KAAa,EAAE,KAAmB;IACpE,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,SAAgB,cAAc,CAAC,MAAiB;IAC9C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,CAAA;IACjD,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AACzD,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAa;IAC5C,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAA;AAClC,CAAC;AAED,sEAAsE;AAEtE,SAAgB,iBAAiB,CAAC,KAAa,EAAE,OAAuB;IACtE,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AACnF,CAAC;AAED,SAAgB,YAAY,CAAC,MAAiB;IAC5C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE,CAAA;IACnD,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAC3D,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,YAAY,CAC1B,aAAqB,EACrB,QAA4B,EAC5B,MAAiB;IAEjB,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IAEvC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,aAAa,CAAC,CAAA;IACrE,IAAI,KAAK;QAAE,OAAO,KAAK,CAAA;IAEvB,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;QACpF,IAAI,UAAU;YAAE,OAAO,UAAU,CAAA;QAEjC,IAAI,gCAAgC,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/C,OAAO,gCAAgC,CAAC,QAAQ,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;IAED,OAAO,gCAAgC,CAAC,OAAO,CAAA;AACjD,CAAC;AAED,SAAgB,cAAc,CAAC,KAAa;IAC1C,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAA;AACpC,CAAC;AAED,sEAAsE;AAEtE,SAAgB,yBAAyB,CAAC,KAAa,EAAE,KAAyB;IAChF,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACzF,CAAC;AAED,SAAgB,oBAAoB,CAAC,MAAiB;IACpD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,IAAI,EAAE,CAAA;IACvD,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAC/D,CAAC;AAED,SAAgB,oBAAoB,CAClC,aAAqB,EACrB,MAAiB;IAEjB,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,aAAa,CAAC,CAAA;AAClF,CAAC;AAED,SAAgB,sBAAsB,CAAC,KAAa;IAClD,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAA;AACxC,CAAC;AAED,SAAgB,kBAAkB;IAChC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC;QAAE,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAA;IAC7E,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC;QAAE,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAAA;IACjF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC;QAAE,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAAA;AAC3F,CAAC","sourcesContent":["/**\n * 앱이 자기 도메인 매핑을 등록하는 Registry.\n * scope 별로 분리 보관 (예: 'fmsim', 'mms', 'wms').\n *\n * 백엔드 단일 프로세스 안에서 in-memory 로 유지된다. 모듈 부트스트랩 시 등록.\n */\nimport type { ComponentCategory, ImportRule, SubscriptionRule, ThreeDPreset } from '../types/registry'\n\n/**\n * 코어가 제공하는 카테고리별 기본 3D Preset.\n * 앱이 자기 도메인 preset 을 등록 안 해도, 카테고리만 정의되면 합리적 3D 표현.\n *\n * 매칭 우선순위: app preset(componentType) → app preset(category) → 이 디폴트(category) → unknown 디폴트\n */\nconst CORE_DEFAULT_PRESETS_BY_CATEGORY: Record<ComponentCategory, ThreeDPreset> = {\n container: { category: 'container', geometry: { kind: 'box', height: 3000 }, material: { color: '#888888', roughness: 0.7 }, origin: 'bottom' },\n vehicle: { category: 'vehicle', geometry: { kind: 'box', height: 800 }, material: { color: '#3a8c5e' }, origin: 'bottom' },\n path: { category: 'path', geometry: { kind: 'extrude', depth: 100 }, material: { color: '#bccfe0' } },\n region: { category: 'region', geometry: { kind: 'extrude', depth: 10 }, material: { color: '#a3d9ff', opacity: 0.4 } },\n equipment: { category: 'equipment', geometry: { kind: 'box', height: 2000 }, material: { color: '#777777' }, origin: 'bottom' },\n io: { category: 'io', geometry: { kind: 'box', height: 200 }, material: { color: '#ffcc66' }, origin: 'bottom' },\n marker: { category: 'marker', geometry: { kind: 'box', height: 100 }, material: { color: '#ffffff' } },\n structure: { category: 'structure', geometry: { kind: 'extrude', depth: 4000 }, material: { color: '#dddddd', opacity: 0.3 }, origin: 'bottom' },\n unknown: { category: 'unknown', geometry: { kind: 'box', height: 500 }, material: { color: '#aaaaaa', opacity: 0.7 }, origin: 'bottom' }\n}\n\ninterface ScopedRegistry<T> {\n [scope: string]: T[]\n}\n\nconst importRulesByScope: ScopedRegistry<ImportRule> = {}\nconst threeDPresetsByScope: ScopedRegistry<ThreeDPreset> = {}\nconst subscriptionRulesByScope: ScopedRegistry<SubscriptionRule> = {}\n\n// ── ImportRule ─────────────────────────────────────────────────────\n\nexport function registerImportRules(scope: string, rules: ImportRule[]): void {\n importRulesByScope[scope] = (importRulesByScope[scope] || []).concat(rules)\n}\n\nexport function getImportRules(scopes?: string[]): ImportRule[] {\n if (!scopes || scopes.length === 0) {\n return Object.values(importRulesByScope).flat()\n }\n return scopes.flatMap(s => importRulesByScope[s] || [])\n}\n\nexport function clearImportRules(scope: string): void {\n delete importRulesByScope[scope]\n}\n\n// ── 3D Preset ──────────────────────────────────────────────────────\n\nexport function register3DPresets(scope: string, presets: ThreeDPreset[]): void {\n threeDPresetsByScope[scope] = (threeDPresetsByScope[scope] || []).concat(presets)\n}\n\nexport function get3DPresets(scopes?: string[]): ThreeDPreset[] {\n if (!scopes || scopes.length === 0) {\n return Object.values(threeDPresetsByScope).flat()\n }\n return scopes.flatMap(s => threeDPresetsByScope[s] || [])\n}\n\n/**\n * 컴포넌트 type + category 로 3D preset 을 찾는다.\n * 우선순위:\n * 1) 앱 등록 preset 중 componentType 정확 일치\n * 2) 앱 등록 preset 중 category 일치\n * 3) 코어 디폴트 카테고리 preset\n * 4) 코어 디폴트 'unknown' preset\n */\nexport function find3DPreset(\n componentType: string,\n category?: ComponentCategory,\n scopes?: string[]\n): ThreeDPreset {\n const appPresets = get3DPresets(scopes)\n\n const exact = appPresets.find(p => p.componentType === componentType)\n if (exact) return exact\n\n if (category) {\n const byCategory = appPresets.find(p => p.category === category && !p.componentType)\n if (byCategory) return byCategory\n\n if (CORE_DEFAULT_PRESETS_BY_CATEGORY[category]) {\n return CORE_DEFAULT_PRESETS_BY_CATEGORY[category]\n }\n }\n\n return CORE_DEFAULT_PRESETS_BY_CATEGORY.unknown\n}\n\nexport function clear3DPresets(scope: string): void {\n delete threeDPresetsByScope[scope]\n}\n\n// ── Subscription Rule ──────────────────────────────────────────────\n\nexport function registerSubscriptionRules(scope: string, rules: SubscriptionRule[]): void {\n subscriptionRulesByScope[scope] = (subscriptionRulesByScope[scope] || []).concat(rules)\n}\n\nexport function getSubscriptionRules(scopes?: string[]): SubscriptionRule[] {\n if (!scopes || scopes.length === 0) {\n return Object.values(subscriptionRulesByScope).flat()\n }\n return scopes.flatMap(s => subscriptionRulesByScope[s] || [])\n}\n\nexport function findSubscriptionRule(\n componentType: string,\n scopes?: string[]\n): SubscriptionRule | undefined {\n return getSubscriptionRules(scopes).find(r => r.componentType === componentType)\n}\n\nexport function clearSubscriptionRules(scope: string): void {\n delete subscriptionRulesByScope[scope]\n}\n\nexport function clearAllRegistries(): void {\n for (const k of Object.keys(importRulesByScope)) delete importRulesByScope[k]\n for (const k of Object.keys(threeDPresetsByScope)) delete threeDPresetsByScope[k]\n for (const k of Object.keys(subscriptionRulesByScope)) delete subscriptionRulesByScope[k]\n}\n"]}
|
|
@@ -56,6 +56,12 @@ export interface EntityAttribs {
|
|
|
56
56
|
text?: string;
|
|
57
57
|
/** 도면 모양 종류 (rect/circle/polyline 등) */
|
|
58
58
|
shape?: 'rect' | 'circle' | 'polyline' | 'polygon';
|
|
59
|
+
/**
|
|
60
|
+
* 카테고리 힌트 — AI 분류기 / 매처가 구체 type 까지는 못 정해도 카테고리만 줄 때 사용.
|
|
61
|
+
* Stage2 매핑이 ImportRule 매치에 실패하면 이 값을 보고 카테고리별 generic-* placeholder
|
|
62
|
+
* 로 폴백한다 (`MappingOptions.categoryFallback`).
|
|
63
|
+
*/
|
|
64
|
+
categoryHint?: import('./registry').ComponentCategory;
|
|
59
65
|
/** 임의 추가 속성 */
|
|
60
66
|
[k: string]: any;
|
|
61
67
|
}
|
|
@@ -66,6 +72,10 @@ export interface EntityRelation {
|
|
|
66
72
|
}
|
|
67
73
|
/**
|
|
68
74
|
* Adapter 결과 — 정규화된 entity 목록 + 메타데이터.
|
|
75
|
+
*
|
|
76
|
+
* 단일 변형이 default. AI/VLM 어댑터는 추가로 `variants` (다중 시안) 를 줄 수 있음 —
|
|
77
|
+
* 같은 도면을 다르게 해석한 후보들. 사용자가 review 단계에서 선택. variants[0] 와
|
|
78
|
+
* 최상위 entities 는 동일 (default 시안).
|
|
69
79
|
*/
|
|
70
80
|
export interface ParseResult {
|
|
71
81
|
entities: UniversalEntity[];
|
|
@@ -73,6 +83,31 @@ export interface ParseResult {
|
|
|
73
83
|
bbox: BoundingBox;
|
|
74
84
|
/** 도면 단위 (mm/m/inch 등). 명시되지 않으면 'unknown' */
|
|
75
85
|
units?: 'mm' | 'cm' | 'm' | 'inch' | 'unknown';
|
|
86
|
+
/**
|
|
87
|
+
* 다중 시안 (AI 가 같은 도면을 다른 관점으로 해석). 미지정 시 단일 변형 (default 만).
|
|
88
|
+
* 각 시안은 자기 entities + 자기 subjectName/Description + 자기 importStrategy.
|
|
89
|
+
*/
|
|
90
|
+
variants?: ParseVariant[];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* AI 가 제공하는 다중 해석 시안 — 같은 도면, 다른 관점/분류 전략.
|
|
94
|
+
* 예: "장비 중심" / "운송 중심" / "영역 중심" — 또는 "보수적" / "균형" / "공격적".
|
|
95
|
+
*/
|
|
96
|
+
export interface ParseVariant {
|
|
97
|
+
/** URL 친화적 short id — materialize 시 사용. */
|
|
98
|
+
id: string;
|
|
99
|
+
/** 사용자에게 보여줄 한글 라벨. 예: "장비 중심", "운송 중심". */
|
|
100
|
+
label: string;
|
|
101
|
+
/** 짧은 한 줄 설명 (선택) — 이 시안이 뭘 강조하는가. */
|
|
102
|
+
description?: string;
|
|
103
|
+
entities: UniversalEntity[];
|
|
104
|
+
bbox?: BoundingBox;
|
|
105
|
+
/** 도면 정체성 — 짧은 제목 (보드 name 추천 기반). */
|
|
106
|
+
subjectName?: string;
|
|
107
|
+
/** 도면 정체성 — 1-2 문장 설명 (보드 description 추천 기반). */
|
|
108
|
+
subjectDescription?: string;
|
|
109
|
+
/** AI 의 의도 narrative — 왜 이 시안을 이렇게 해석했나. review 카드 표시. */
|
|
110
|
+
importStrategy?: string;
|
|
76
111
|
}
|
|
77
112
|
export interface AdapterMetadata {
|
|
78
113
|
format: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/types/index.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Universal Entity — 도면 형식(DXF/IFC/이미지/SVG/glTF)에 무관한 통일 모델.\n * 모든 Format Adapter 가 이 타입으로 정규화한다.\n */\nexport type EntityKind = 'group' | 'shape' | 'path' | 'text' | 'mesh3d' | 'image-region'\n\nexport interface Vec2 {\n x: number\n y: number\n}\n\nexport interface Vec3 {\n x: number\n y: number\n z: number\n}\n\nexport interface Size2 {\n width: number\n height: number\n}\n\nexport interface Size3 {\n width: number\n height: number\n depth: number\n}\n\nexport interface BoundingBox {\n min: Vec2\n max: Vec2\n}\n\nexport interface UniversalEntity {\n /** 도면 내 고유 ID */\n uid: string\n /** 엔티티 종류 */\n kind: EntityKind\n /** 위치 (좌상단 또는 중심 — 어댑터별로 정규화 정책 명시) */\n position: Vec2\n /** 크기 (없을 수도 있음, e.g. text) */\n size?: Size2\n /** 회전 (도수, 시계방향) */\n rotation?: number\n /** 이 엔티티의 bounding box */\n bbox: BoundingBox\n /** 의미적 단서 — 가능한 만큼 채움 */\n attribs: EntityAttribs\n /** 공간 관계 (선택) */\n neighbors?: EntityRelation[]\n /** 3D 자산 참조 (3D 형식만) */\n meshRef?: string\n}\n\nexport interface EntityAttribs {\n /** 블록 이름, IFC GlobalId, 식별자 */\n name?: string\n /** CAD 레이어 이름 */\n layer?: string\n /** IFC 의미 클래스 (예: 'IfcStockerStorage') */\n semanticType?: string\n /** 텍스트 내용 (text 종류일 때) */\n text?: string\n /** 도면 모양 종류 (rect/circle/polyline 등) */\n shape?: 'rect' | 'circle' | 'polyline' | 'polygon'\n /** 임의 추가 속성 */\n [k: string]: any\n}\n\nexport interface EntityRelation {\n uid: string\n relation: 'adjacent' | 'inside' | 'connected' | 'labeled-by'\n distance?: number\n}\n\n/**\n * Adapter 결과 — 정규화된 entity 목록 + 메타데이터.\n */\nexport interface ParseResult {\n entities: UniversalEntity[]\n metadata: AdapterMetadata\n bbox: BoundingBox\n /** 도면 단위 (mm/m/inch 등). 명시되지 않으면 'unknown' */\n units?: 'mm' | 'cm' | 'm' | 'inch' | 'unknown'\n}\n\nexport interface AdapterMetadata {\n format: string\n formatVersion?: string\n source?: string\n /** 어댑터가 알아낸 추가 메타 (예: DXF $INSUNITS) */\n [k: string]: any\n}\n\nexport interface ParseOptions {\n /** 최대 entity 수 (성능 가드) */\n maxEntities?: number\n /** 무시할 레이어 이름들 */\n excludeLayers?: string[]\n /** 추가 옵션 */\n [k: string]: any\n}\n\n/**\n * Adapter 입력 — 백엔드/프론트엔드 양쪽에서 사용 가능하도록 최대한 폭넓게 수용.\n * - string: DXF 등 텍스트 포맷의 본문\n * - Buffer: Node 환경의 파일 바이너리\n * - ArrayBuffer / Uint8Array: 바이너리 페이로드\n */\nexport type AdapterInput = string | ArrayBuffer | Uint8Array | Buffer\n\n/**\n * Format Adapter — 형식별 파서. 모든 어댑터는 동일 인터페이스 구현.\n */\nexport interface FormatAdapter {\n readonly format: string\n readonly supportedExtensions: string[]\n readonly capabilities: AdapterCapabilities\n\n /** 파일이 이 어댑터로 처리 가능한지 빠른 검사 (확장자 + 시그니처) */\n detect(file: AdapterInput, filename?: string): Promise<boolean>\n\n /** 실제 파싱 → UniversalEntity 목록 */\n parse(file: AdapterInput, options?: ParseOptions): Promise<ParseResult>\n}\n\nexport interface AdapterCapabilities {\n has2D: boolean\n has3D: boolean\n hasSemanticLabels: boolean\n hasTextLabels: boolean\n hasAttributes: boolean\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/types/index.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Universal Entity — 도면 형식(DXF/IFC/이미지/SVG/glTF)에 무관한 통일 모델.\n * 모든 Format Adapter 가 이 타입으로 정규화한다.\n */\nexport type EntityKind = 'group' | 'shape' | 'path' | 'text' | 'mesh3d' | 'image-region'\n\nexport interface Vec2 {\n x: number\n y: number\n}\n\nexport interface Vec3 {\n x: number\n y: number\n z: number\n}\n\nexport interface Size2 {\n width: number\n height: number\n}\n\nexport interface Size3 {\n width: number\n height: number\n depth: number\n}\n\nexport interface BoundingBox {\n min: Vec2\n max: Vec2\n}\n\nexport interface UniversalEntity {\n /** 도면 내 고유 ID */\n uid: string\n /** 엔티티 종류 */\n kind: EntityKind\n /** 위치 (좌상단 또는 중심 — 어댑터별로 정규화 정책 명시) */\n position: Vec2\n /** 크기 (없을 수도 있음, e.g. text) */\n size?: Size2\n /** 회전 (도수, 시계방향) */\n rotation?: number\n /** 이 엔티티의 bounding box */\n bbox: BoundingBox\n /** 의미적 단서 — 가능한 만큼 채움 */\n attribs: EntityAttribs\n /** 공간 관계 (선택) */\n neighbors?: EntityRelation[]\n /** 3D 자산 참조 (3D 형식만) */\n meshRef?: string\n}\n\nexport interface EntityAttribs {\n /** 블록 이름, IFC GlobalId, 식별자 */\n name?: string\n /** CAD 레이어 이름 */\n layer?: string\n /** IFC 의미 클래스 (예: 'IfcStockerStorage') */\n semanticType?: string\n /** 텍스트 내용 (text 종류일 때) */\n text?: string\n /** 도면 모양 종류 (rect/circle/polyline 등) */\n shape?: 'rect' | 'circle' | 'polyline' | 'polygon'\n /**\n * 카테고리 힌트 — AI 분류기 / 매처가 구체 type 까지는 못 정해도 카테고리만 줄 때 사용.\n * Stage2 매핑이 ImportRule 매치에 실패하면 이 값을 보고 카테고리별 generic-* placeholder\n * 로 폴백한다 (`MappingOptions.categoryFallback`).\n */\n categoryHint?: import('./registry').ComponentCategory\n /** 임의 추가 속성 */\n [k: string]: any\n}\n\nexport interface EntityRelation {\n uid: string\n relation: 'adjacent' | 'inside' | 'connected' | 'labeled-by'\n distance?: number\n}\n\n/**\n * Adapter 결과 — 정규화된 entity 목록 + 메타데이터.\n *\n * 단일 변형이 default. AI/VLM 어댑터는 추가로 `variants` (다중 시안) 를 줄 수 있음 —\n * 같은 도면을 다르게 해석한 후보들. 사용자가 review 단계에서 선택. variants[0] 와\n * 최상위 entities 는 동일 (default 시안).\n */\nexport interface ParseResult {\n entities: UniversalEntity[]\n metadata: AdapterMetadata\n bbox: BoundingBox\n /** 도면 단위 (mm/m/inch 등). 명시되지 않으면 'unknown' */\n units?: 'mm' | 'cm' | 'm' | 'inch' | 'unknown'\n /**\n * 다중 시안 (AI 가 같은 도면을 다른 관점으로 해석). 미지정 시 단일 변형 (default 만).\n * 각 시안은 자기 entities + 자기 subjectName/Description + 자기 importStrategy.\n */\n variants?: ParseVariant[]\n}\n\n/**\n * AI 가 제공하는 다중 해석 시안 — 같은 도면, 다른 관점/분류 전략.\n * 예: \"장비 중심\" / \"운송 중심\" / \"영역 중심\" — 또는 \"보수적\" / \"균형\" / \"공격적\".\n */\nexport interface ParseVariant {\n /** URL 친화적 short id — materialize 시 사용. */\n id: string\n /** 사용자에게 보여줄 한글 라벨. 예: \"장비 중심\", \"운송 중심\". */\n label: string\n /** 짧은 한 줄 설명 (선택) — 이 시안이 뭘 강조하는가. */\n description?: string\n entities: UniversalEntity[]\n bbox?: BoundingBox\n /** 도면 정체성 — 짧은 제목 (보드 name 추천 기반). */\n subjectName?: string\n /** 도면 정체성 — 1-2 문장 설명 (보드 description 추천 기반). */\n subjectDescription?: string\n /** AI 의 의도 narrative — 왜 이 시안을 이렇게 해석했나. review 카드 표시. */\n importStrategy?: string\n}\n\nexport interface AdapterMetadata {\n format: string\n formatVersion?: string\n source?: string\n /** 어댑터가 알아낸 추가 메타 (예: DXF $INSUNITS) */\n [k: string]: any\n}\n\nexport interface ParseOptions {\n /** 최대 entity 수 (성능 가드) */\n maxEntities?: number\n /** 무시할 레이어 이름들 */\n excludeLayers?: string[]\n /** 추가 옵션 */\n [k: string]: any\n}\n\n/**\n * Adapter 입력 — 백엔드/프론트엔드 양쪽에서 사용 가능하도록 최대한 폭넓게 수용.\n * - string: DXF 등 텍스트 포맷의 본문\n * - Buffer: Node 환경의 파일 바이너리\n * - ArrayBuffer / Uint8Array: 바이너리 페이로드\n */\nexport type AdapterInput = string | ArrayBuffer | Uint8Array | Buffer\n\n/**\n * Format Adapter — 형식별 파서. 모든 어댑터는 동일 인터페이스 구현.\n */\nexport interface FormatAdapter {\n readonly format: string\n readonly supportedExtensions: string[]\n readonly capabilities: AdapterCapabilities\n\n /** 파일이 이 어댑터로 처리 가능한지 빠른 검사 (확장자 + 시그니처) */\n detect(file: AdapterInput, filename?: string): Promise<boolean>\n\n /** 실제 파싱 → UniversalEntity 목록 */\n parse(file: AdapterInput, options?: ParseOptions): Promise<ParseResult>\n}\n\nexport interface AdapterCapabilities {\n has2D: boolean\n has3D: boolean\n hasSemanticLabels: boolean\n hasTextLabels: boolean\n hasAttributes: boolean\n}\n"]}
|