three-slicer 0.1.0 → 0.1.1
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/README.md +342 -24
- package/components/README.md +1 -1
- package/components/dist/SettingsPanel.js +3 -4
- package/engine/index.d.ts +3 -1
- package/engine/src/data.js +12 -0
- package/engine/src/settings.js +1 -1
- package/engine/src/slicer.worker.js +2 -1
- package/engine/src/slicer_core.js +0 -0
- package/engine/src/slicer_core.mt.js +0 -0
- package/engine/src/toggle_eval.js +1 -2
- package/package.json +54 -26
- package/types/components.d.ts +19 -0
- package/types/data/config-schema.json.d.ts +55 -0
- package/types/data/invalidation-map.json.d.ts +15 -0
- package/types/data/toggle-rules.json.d.ts +20 -0
- package/types/data/ui-tree.json.d.ts +19 -0
- package/types/data.d.ts +17 -0
- package/types/gen_settings_types.mjs +70 -0
- package/types/settings-keys.d.ts +1704 -0
- package/types/settings.d.ts +19 -0
- package/types/toggle.d.ts +22 -0
- package/types/viewer-loaders.d.ts +33 -0
- package/types/viewer-toolpath.d.ts +105 -0
- package/types/viewer.d.ts +15 -0
- package/types/wasm.d.ts +5 -0
- package/types/worker.d.ts +3 -0
- package/viewer/README.md +1 -1
- package/viewer/dist/Viewport.js +674 -617
- package/viewer/dist/model_loaders.js +220 -108
- package/viewer/styles.css +2 -0
- package/data/config-schema-builddump.json +0 -12921
- package/viewer/src/Viewport.jsx +0 -1353
- package/viewer/src/assets/add.svg +0 -1
- package/viewer/src/assets/arrange.svg +0 -1
- package/viewer/src/assets/boolean.svg +0 -1
- package/viewer/src/assets/cut.svg +0 -1
- package/viewer/src/assets/delete.svg +0 -1
- package/viewer/src/assets/deleteall.svg +0 -1
- package/viewer/src/assets/duplicate.svg +0 -1
- package/viewer/src/assets/measure.svg +0 -1
- package/viewer/src/assets/mmu.svg +0 -1
- package/viewer/src/assets/move.svg +0 -1
- package/viewer/src/assets/negative.svg +0 -1
- package/viewer/src/assets/onbed.svg +0 -1
- package/viewer/src/assets/open.svg +0 -1
- package/viewer/src/assets/orient.svg +0 -1
- package/viewer/src/assets/paint.svg +0 -1
- package/viewer/src/assets/rotate.svg +0 -1
- package/viewer/src/assets/scale.svg +0 -1
- package/viewer/src/assets/seam.svg +0 -1
- package/viewer/src/assets/split.svg +0 -1
- package/viewer/src/assets/textmark.svg +0 -1
- package/viewer/src/assets/varlayer.svg +0 -1
- package/viewer/src/icons.js +0 -23
- package/viewer/src/make_worker.js +0 -9
- package/viewer/src/model_loaders.js +0 -178
- package/viewer/src/shadow_host.jsx +0 -30
- package/viewer/src/toolpath_gpu.js +0 -430
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// three-slicer/settings
|
|
2
|
+
import type { SlicerSettings, SettingKey, Point } from './settings-keys.d.ts'
|
|
3
|
+
export type { SlicerSettings, SettingKey, Point }
|
|
4
|
+
|
|
5
|
+
/** config-schema 의 default 값 (없는 키면 undefined) */
|
|
6
|
+
export function schemaDefault(key: string): unknown
|
|
7
|
+
|
|
8
|
+
/** settings 맵 우선, 없으면 스키마 default. 벡터형은 벡터 그대로 돌려준다. */
|
|
9
|
+
export function settingRaw(settings: SlicerSettings | null | undefined, key: string): unknown
|
|
10
|
+
|
|
11
|
+
/** settingRaw 를 스칼라로 정규화 — 벡터면 [0]. */
|
|
12
|
+
export function settingScalar(settings: SlicerSettings | null | undefined, key: string): unknown
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 설정 맵 → 커널 슬라이스 파라미터. 스키마 키에서 유도하며 누락 키는 내부 기본값으로 채운다.
|
|
16
|
+
* ponytail: 반환 키가 53개라 개별 나열 대신 Record — 커널 파라미터는 slice() 에 그대로 넘기는 용도지
|
|
17
|
+
* 소비자가 필드 단위로 읽는 API 가 아니다. 필드 접근이 필요해지면 그때 펼칠 것.
|
|
18
|
+
*/
|
|
19
|
+
export function deriveKernelParams(settings: SlicerSettings | null | undefined): Record<string, unknown>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// three-slicer/toggle — toggle-rules.json 의 enable_if 조건식 부분 평가.
|
|
2
|
+
import type { SlicerSettings } from './settings-keys.d.ts'
|
|
3
|
+
|
|
4
|
+
/** 설정 접근기 — 값이 없으면 스키마 default, 벡터형은 [0]. */
|
|
5
|
+
export interface ToggleCfg {
|
|
6
|
+
bool(key: string): boolean
|
|
7
|
+
int(key: string): number
|
|
8
|
+
float(key: string): number
|
|
9
|
+
/** 키가 config-schema 에 존재하는가 */
|
|
10
|
+
has(key: string): boolean
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function makeCfg(settings: SlicerSettings | null | undefined): ToggleCfg
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* enable_if 조건식 1개 평가. 번역 불가한 식은 `null`(= fail-open, 활성 유지) 을 돌려준다 —
|
|
17
|
+
* `false` 와 반드시 구분해서 다룰 것.
|
|
18
|
+
*/
|
|
19
|
+
export function evalEnableIf(expr: string, locals: Record<string, unknown>, cfg: ToggleCfg): boolean | null
|
|
20
|
+
|
|
21
|
+
/** 현재 설정에서 비활성이어야 하는 키 → 그렇게 만든 enable_if 조건식. 조건이 명확히 false 인 규칙만. */
|
|
22
|
+
export function disabledKeys(cfg: ToggleCfg): Record<string, string>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// three-slicer/viewer/loaders — 커널 무관 순수 로더.
|
|
2
|
+
|
|
3
|
+
/** 내장 5종 + `registerLoader()` 로 등록된 확장자. 등록 시 이 배열에 push 된다. */
|
|
4
|
+
export const SUPPORTED_EXT: string[]
|
|
5
|
+
|
|
6
|
+
/** 소문자 확장자. 점이 없으면 빈 문자열. */
|
|
7
|
+
export function fileExt(name: string): string
|
|
8
|
+
|
|
9
|
+
export interface LoadedObject {
|
|
10
|
+
name: string
|
|
11
|
+
/** 삼각형 정점 좌표 (N*9, model z-up) */
|
|
12
|
+
modelPos: Float32Array
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** 파일 1개에 여러 오브젝트가 들어있을 수 있다(3mf/amf/step) → 항상 배열. */
|
|
16
|
+
export function loadModel(name: string, buffer: ArrayBuffer): Promise<LoadedObject[]>
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 확장 포맷 등록. 무거운 의존성이 필요한 포맷(STEP=OCCT WASM 등)은 패키지에 넣지 않으므로
|
|
20
|
+
* 앱에서 직접 붙인다. `<Viewport/>` 의 파일 대화상자·드래그앤드롭 필터에 자동 반영된다.
|
|
21
|
+
*
|
|
22
|
+
* ```js
|
|
23
|
+
* import { registerLoader } from 'three-slicer/viewer/loaders'
|
|
24
|
+
* registerLoader('step,stp', async (buffer, name) => [{ name, modelPos }])
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function registerLoader(
|
|
28
|
+
exts: string | string[],
|
|
29
|
+
fn: (buffer: ArrayBuffer, name: string) => LoadedObject[] | Promise<LoadedObject[]>,
|
|
30
|
+
): void
|
|
31
|
+
|
|
32
|
+
/** 연결 성분 분리. 성분이 1개뿐이면 `null`(분리 불가) — 빈 배열이 아니다. */
|
|
33
|
+
export function splitConnectedComponents(localPos: Float32Array): Float32Array[] | null
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// three-slicer/viewer/toolpath — 커널 레이어 → GPU 인스턴싱 툴패스.
|
|
2
|
+
// three 를 import 하지 않는다: makeToolpath 가 THREE 네임스페이스를 인자로 받는다(단일 인스턴스 보장).
|
|
3
|
+
|
|
4
|
+
/** 8정점 다이아몬드 단면의 24 삼각형 인덱스 (SegmentTemplate.cpp:18 원본) */
|
|
5
|
+
export const VERTEX_DATA: number[]
|
|
6
|
+
|
|
7
|
+
/** 툴패스 타입 → 색. 0=travel, 1=wall … 11=prime */
|
|
8
|
+
export const TYPE_COLOR: Record<number, number[]>
|
|
9
|
+
export const TYPE_LABEL: Record<number, string>
|
|
10
|
+
|
|
11
|
+
/** 파랑→빨강 11색 히트맵 (libvgcode ColorRange.hpp:14) */
|
|
12
|
+
export const DEFAULT_RANGES_COLORS: number[][]
|
|
13
|
+
|
|
14
|
+
export interface ViewTypeDef {
|
|
15
|
+
key: 'feature' | 'speed' | 'height' | 'width' | 'fan' | 'temp'
|
|
16
|
+
label: string
|
|
17
|
+
/** 연속값(히트맵)인가. false 면 고정색. */
|
|
18
|
+
cont: boolean
|
|
19
|
+
unit: string
|
|
20
|
+
}
|
|
21
|
+
export const VIEW_TYPES: ViewTypeDef[]
|
|
22
|
+
|
|
23
|
+
/** per-vertex 부가 정보 */
|
|
24
|
+
export interface SegmentMeta {
|
|
25
|
+
vType: Uint8Array
|
|
26
|
+
vWidth: Float32Array
|
|
27
|
+
vHeight: Float32Array
|
|
28
|
+
vLayer: Int32Array
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface SegmentData {
|
|
32
|
+
position: Float32Array
|
|
33
|
+
hwa: Float32Array
|
|
34
|
+
segIndex: Uint32Array
|
|
35
|
+
nV: number
|
|
36
|
+
nSeg: number
|
|
37
|
+
layerSegPrefix: Uint32Array
|
|
38
|
+
travelPos: Float32Array
|
|
39
|
+
travelPrefix: Uint32Array
|
|
40
|
+
nTrav: number
|
|
41
|
+
layerCount: number
|
|
42
|
+
maxAbs: number
|
|
43
|
+
hasNaN: boolean
|
|
44
|
+
meta: SegmentMeta
|
|
45
|
+
/** 타입별 총 압출 길이 (index = 툴패스 타입, 길이 16) */
|
|
46
|
+
typeLengths: Float64Array
|
|
47
|
+
/** 정점이 하나도 없으면 null */
|
|
48
|
+
bbox: { min: [number, number, number]; max: [number, number, number] } | null
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** 커널 layers[{z, paths(stride8), widths[]}] → GPU 스트림. */
|
|
52
|
+
export function buildSegmentData(layers: unknown[], defaultLineWidth: number): SegmentData
|
|
53
|
+
|
|
54
|
+
/** 타입별 길이 비율(%), pct 내림차순. 시간은 커널이 role 별로 노출하지 않아 길이로 근사한다. */
|
|
55
|
+
export function roleRatios(typeLengths: Float64Array | number[]): Array<{
|
|
56
|
+
type: number
|
|
57
|
+
label: string
|
|
58
|
+
pct: number
|
|
59
|
+
color: number[]
|
|
60
|
+
}>
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* speed/fan/temp 는 커널 툴패스에 없어 설정값에서 유도한다 — 그 유도에 쓰는 값들.
|
|
64
|
+
*/
|
|
65
|
+
export interface ColorContext {
|
|
66
|
+
speedByType?: Record<number, number>
|
|
67
|
+
firstLayerSpeed?: number
|
|
68
|
+
fanByType?: Record<number, number>
|
|
69
|
+
fanFirstLayers?: number
|
|
70
|
+
tempNormal?: number
|
|
71
|
+
tempFirst?: number
|
|
72
|
+
closeFanLayers?: number
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface ColorResult {
|
|
76
|
+
/** per-vertex RGBA (nV*4). `.r` 에 색이 packed 돼 있다. */
|
|
77
|
+
color: Float32Array
|
|
78
|
+
min: number
|
|
79
|
+
max: number
|
|
80
|
+
viewType: ViewTypeDef['key']
|
|
81
|
+
label: string
|
|
82
|
+
unit: string
|
|
83
|
+
/** false 면 고정색 — min/max 는 0 이고 범례를 그리면 안 된다. */
|
|
84
|
+
cont: boolean
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function computeColors(data: SegmentData, viewType: ViewTypeDef['key'], ctx: ColorContext): ColorResult
|
|
88
|
+
|
|
89
|
+
export interface ToolpathHandle {
|
|
90
|
+
/** THREE.Mesh — 인자로 넘긴 THREE 네임스페이스의 타입 */
|
|
91
|
+
mesh: any
|
|
92
|
+
/** THREE.LineSegments (travel) */
|
|
93
|
+
travLines: any
|
|
94
|
+
setLayerRange(lo: number, hi: number): void
|
|
95
|
+
/** 하위호환 — setLayerRange(0, n-1) 과 같다. */
|
|
96
|
+
setVisibleLayers(n: number): void
|
|
97
|
+
setTravelVisible(visible: boolean): void
|
|
98
|
+
setColors(color: Float32Array): void
|
|
99
|
+
dispose(): void
|
|
100
|
+
nSeg: number
|
|
101
|
+
layerCount: number
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** @param THREE - `import * as THREE from 'three'` 네임스페이스. 소비자 인스턴스를 그대로 쓴다. */
|
|
105
|
+
export function makeToolpath(THREE: any, data: SegmentData): ToolpathHandle
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// three-slicer/viewer
|
|
2
|
+
import type * as React from 'react'
|
|
3
|
+
import type { SlicerSettings } from './settings-keys.d.ts'
|
|
4
|
+
|
|
5
|
+
export interface ViewportProps {
|
|
6
|
+
/** sparse 설정 맵. 기본 `{}`. */
|
|
7
|
+
settings?: SlicerSettings
|
|
8
|
+
/** React setState 형태. 기본 no-op. */
|
|
9
|
+
setSettings?: React.Dispatch<React.SetStateAction<SlicerSettings>>
|
|
10
|
+
/** 좌측 프로세스 패널 슬롯 — 보통 `<SettingsPanel embedded/>`. 기본 null. */
|
|
11
|
+
processPanel?: React.ReactNode
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
declare const Viewport: React.FC<ViewportProps>
|
|
15
|
+
export default Viewport
|
package/types/wasm.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// three-slicer/wasm, three-slicer/wasm-mt — emscripten 글루(생성물, 3.5MB+).
|
|
2
|
+
// ponytail: 여기에 정확한 타입을 쓰지 않는다. 글루는 재빌드 때마다 바뀌고, 공개 API 는
|
|
3
|
+
// three-slicer 의 createSlicer() 다. 직접 쓰는 쪽은 이미 커널 내부를 아는 쪽.
|
|
4
|
+
declare const factory: (opts?: Record<string, unknown>) => Promise<any>
|
|
5
|
+
export default factory
|
package/viewer/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# three-slicer/viewer
|
|
2
2
|
|
|
3
|
-
3D slicer viewer as a React component: three.js viewport (orbit/transform gizmos), model import (STL/OBJ/3MF/AMF/PLY, multi-object, drag & drop), Web Worker slicing via `three-slicer`, support painting, multi-plate, and a GPU-instanced volumetric toolpath preview ported from OrcaSlicer's libvgcode (millions of segments in a single draw path, per-feature colors, layer range slider, G-code export).
|
|
3
|
+
3D slicer viewer as a React component: three.js viewport (orbit/transform gizmos), model import (STL/OBJ/3MF/AMF/PLY + pluggable formats such as STEP, multi-object, drag & drop), Web Worker slicing via `three-slicer`, support painting, multi-plate, and a GPU-instanced volumetric toolpath preview ported from OrcaSlicer's libvgcode (millions of segments in a single draw path, per-feature colors, layer range slider, G-code export).
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
npm i three-slicer/viewer react react-dom three@^0.160.0
|