@cadview/vue 0.1.0
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/LICENSE +21 -0
- package/README.md +73 -0
- package/dist/index.cjs +136 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +145 -0
- package/dist/index.d.ts +145 -0
- package/dist/index.js +133 -0
- package/dist/index.js.map +1 -0
- package/package.json +66 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Wisnu Wicaksono
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# @cadview/vue
|
|
2
|
+
|
|
3
|
+
Vue 3 wrapper for `@cadview/core` — a CAD/DXF file viewer.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @cadview/core @cadview/vue
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```vue
|
|
14
|
+
<template>
|
|
15
|
+
<input type="file" accept=".dxf" @change="onFileChange" />
|
|
16
|
+
<CadViewer
|
|
17
|
+
:file="file"
|
|
18
|
+
theme="dark"
|
|
19
|
+
tool="pan"
|
|
20
|
+
@select="onSelect"
|
|
21
|
+
@measure="onMeasure"
|
|
22
|
+
/>
|
|
23
|
+
</template>
|
|
24
|
+
|
|
25
|
+
<script setup>
|
|
26
|
+
import { ref } from 'vue';
|
|
27
|
+
import { CadViewer } from '@cadview/vue';
|
|
28
|
+
|
|
29
|
+
const file = ref(null);
|
|
30
|
+
|
|
31
|
+
function onFileChange(e) {
|
|
32
|
+
file.value = e.target.files?.[0] ?? null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function onSelect(e) {
|
|
36
|
+
console.log('Selected:', e.entity.type);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function onMeasure(e) {
|
|
40
|
+
console.log('Distance:', e.distance);
|
|
41
|
+
}
|
|
42
|
+
</script>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Props
|
|
46
|
+
|
|
47
|
+
| Prop | Type | Default | Description |
|
|
48
|
+
|------|------|---------|-------------|
|
|
49
|
+
| `file` | `File \| null` | — | DXF file to load |
|
|
50
|
+
| `theme` | `'dark' \| 'light'` | `'dark'` | Color theme |
|
|
51
|
+
| `tool` | `'pan' \| 'select' \| 'measure'` | `'pan'` | Active tool |
|
|
52
|
+
| `options` | `CadViewerOptions` | — | Additional viewer options |
|
|
53
|
+
|
|
54
|
+
## Events
|
|
55
|
+
|
|
56
|
+
| Event | Payload | Description |
|
|
57
|
+
|-------|---------|-------------|
|
|
58
|
+
| `select` | `SelectEvent` | Entity selected |
|
|
59
|
+
| `measure` | `MeasureEvent` | Measurement completed |
|
|
60
|
+
| `viewchange` | `ViewTransform` | View panned/zoomed |
|
|
61
|
+
| `layersloaded` | `DxfLayer[]` | Layers loaded from DXF |
|
|
62
|
+
|
|
63
|
+
## Composable
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import { useCadViewer } from '@cadview/vue';
|
|
67
|
+
|
|
68
|
+
const { canvasRef, viewer } = useCadViewer({ theme: 'dark' });
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## License
|
|
72
|
+
|
|
73
|
+
MIT
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var vue = require('vue');
|
|
4
|
+
var core = require('@cadview/core');
|
|
5
|
+
|
|
6
|
+
// src/CadViewer.tsx
|
|
7
|
+
var CadViewer = vue.defineComponent({
|
|
8
|
+
name: "CadViewer",
|
|
9
|
+
props: {
|
|
10
|
+
file: {
|
|
11
|
+
type: [File, ArrayBuffer, String],
|
|
12
|
+
default: null
|
|
13
|
+
},
|
|
14
|
+
theme: {
|
|
15
|
+
type: String,
|
|
16
|
+
default: "dark"
|
|
17
|
+
},
|
|
18
|
+
tool: {
|
|
19
|
+
type: String,
|
|
20
|
+
default: "pan"
|
|
21
|
+
},
|
|
22
|
+
options: {
|
|
23
|
+
type: Object,
|
|
24
|
+
default: () => ({})
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
emits: ["select", "measure", "viewchange", "layers-loaded"],
|
|
28
|
+
setup(props, { emit, expose }) {
|
|
29
|
+
const canvasRef = vue.ref(null);
|
|
30
|
+
const viewerRef = vue.ref(null);
|
|
31
|
+
vue.onMounted(() => {
|
|
32
|
+
if (!canvasRef.value) return;
|
|
33
|
+
const viewer = new core.CadViewer(canvasRef.value, {
|
|
34
|
+
theme: props.theme,
|
|
35
|
+
initialTool: props.tool,
|
|
36
|
+
...props.options
|
|
37
|
+
});
|
|
38
|
+
viewerRef.value = viewer;
|
|
39
|
+
viewer.on("select", (e) => emit("select", e));
|
|
40
|
+
viewer.on("measure", (e) => emit("measure", e));
|
|
41
|
+
viewer.on("viewchange", (vt) => emit("viewchange", vt));
|
|
42
|
+
});
|
|
43
|
+
vue.onUnmounted(() => {
|
|
44
|
+
viewerRef.value?.destroy();
|
|
45
|
+
viewerRef.value = null;
|
|
46
|
+
});
|
|
47
|
+
vue.watch(
|
|
48
|
+
() => props.theme,
|
|
49
|
+
(newTheme) => {
|
|
50
|
+
viewerRef.value?.setTheme(newTheme);
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
vue.watch(
|
|
54
|
+
() => props.tool,
|
|
55
|
+
(newTool) => {
|
|
56
|
+
viewerRef.value?.setTool(newTool);
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
vue.watch(
|
|
60
|
+
() => props.file,
|
|
61
|
+
async (newFile) => {
|
|
62
|
+
const viewer = viewerRef.value;
|
|
63
|
+
if (!viewer || !newFile) return;
|
|
64
|
+
try {
|
|
65
|
+
if (newFile instanceof File) {
|
|
66
|
+
await viewer.loadFile(newFile);
|
|
67
|
+
} else if (newFile instanceof ArrayBuffer) {
|
|
68
|
+
viewer.loadArrayBuffer(newFile);
|
|
69
|
+
} else if (typeof newFile === "string") {
|
|
70
|
+
viewer.loadString(newFile);
|
|
71
|
+
}
|
|
72
|
+
emit("layers-loaded", viewer.getLayers());
|
|
73
|
+
} catch (err) {
|
|
74
|
+
console.error("CadViewer: failed to load file", err);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
expose({
|
|
79
|
+
getViewer: () => viewerRef.value,
|
|
80
|
+
fitToView: () => viewerRef.value?.fitToView(),
|
|
81
|
+
getLayers: () => viewerRef.value?.getLayers() ?? [],
|
|
82
|
+
setLayerVisible: (name, visible) => viewerRef.value?.setLayerVisible(name, visible)
|
|
83
|
+
});
|
|
84
|
+
return () => vue.h(
|
|
85
|
+
"div",
|
|
86
|
+
{ style: { position: "relative", overflow: "hidden" } },
|
|
87
|
+
[
|
|
88
|
+
vue.h("canvas", {
|
|
89
|
+
ref: canvasRef,
|
|
90
|
+
style: { display: "block", width: "100%", height: "100%" }
|
|
91
|
+
})
|
|
92
|
+
]
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
function useCadViewer(canvasRef, options) {
|
|
97
|
+
const viewer = vue.ref(null);
|
|
98
|
+
const layers = vue.ref([]);
|
|
99
|
+
const isLoaded = vue.ref(false);
|
|
100
|
+
vue.onMounted(() => {
|
|
101
|
+
if (!canvasRef.value) return;
|
|
102
|
+
viewer.value = new core.CadViewer(canvasRef.value, options);
|
|
103
|
+
});
|
|
104
|
+
vue.onUnmounted(() => {
|
|
105
|
+
viewer.value?.destroy();
|
|
106
|
+
viewer.value = null;
|
|
107
|
+
});
|
|
108
|
+
const loadFile = async (file) => {
|
|
109
|
+
if (!viewer.value) return;
|
|
110
|
+
await viewer.value.loadFile(file);
|
|
111
|
+
layers.value = viewer.value.getLayers();
|
|
112
|
+
isLoaded.value = true;
|
|
113
|
+
};
|
|
114
|
+
const loadString = (dxf) => {
|
|
115
|
+
if (!viewer.value) return;
|
|
116
|
+
viewer.value.loadString(dxf);
|
|
117
|
+
layers.value = viewer.value.getLayers();
|
|
118
|
+
isLoaded.value = true;
|
|
119
|
+
};
|
|
120
|
+
return {
|
|
121
|
+
viewer,
|
|
122
|
+
layers,
|
|
123
|
+
isLoaded,
|
|
124
|
+
loadFile,
|
|
125
|
+
loadString,
|
|
126
|
+
fitToView: () => viewer.value?.fitToView(),
|
|
127
|
+
setLayerVisible: (name, visible) => viewer.value?.setLayerVisible(name, visible),
|
|
128
|
+
setTheme: (theme) => viewer.value?.setTheme(theme),
|
|
129
|
+
setTool: (tool) => viewer.value?.setTool(tool)
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
exports.CadViewer = CadViewer;
|
|
134
|
+
exports.useCadViewer = useCadViewer;
|
|
135
|
+
//# sourceMappingURL=index.cjs.map
|
|
136
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/CadViewer.tsx","../src/useCadViewer.ts"],"names":["defineComponent","ref","onMounted","CoreCadViewer","onUnmounted","watch","h","CadViewer"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n defineComponent,\n ref,\n onMounted,\n onUnmounted,\n watch,\n h,\n type PropType,\n} from 'vue';\nimport {\n CadViewer as CoreCadViewer,\n type CadViewerOptions,\n type DxfLayer,\n type SelectEvent,\n type MeasureEvent,\n type ViewTransform,\n type Tool,\n type Theme,\n} from '@cadview/core';\n\nexport const CadViewer = defineComponent({\n name: 'CadViewer',\n\n props: {\n file: {\n type: [File, ArrayBuffer, String] as PropType<File | ArrayBuffer | string | null>,\n default: null,\n },\n theme: {\n type: String as PropType<Theme>,\n default: 'dark',\n },\n tool: {\n type: String as PropType<Tool>,\n default: 'pan',\n },\n options: {\n type: Object as PropType<Omit<CadViewerOptions, 'theme' | 'initialTool'>>,\n default: () => ({}),\n },\n },\n\n emits: ['select', 'measure', 'viewchange', 'layers-loaded'],\n\n setup(props, { emit, expose }) {\n const canvasRef = ref<HTMLCanvasElement | null>(null);\n const viewerRef = ref<CoreCadViewer | null>(null);\n\n onMounted(() => {\n if (!canvasRef.value) return;\n\n const viewer = new CoreCadViewer(canvasRef.value, {\n theme: props.theme,\n initialTool: props.tool,\n ...props.options,\n });\n viewerRef.value = viewer;\n\n viewer.on('select', (e: SelectEvent) => emit('select', e));\n viewer.on('measure', (e: MeasureEvent) => emit('measure', e));\n viewer.on('viewchange', (vt: ViewTransform) => emit('viewchange', vt));\n });\n\n onUnmounted(() => {\n viewerRef.value?.destroy();\n viewerRef.value = null;\n });\n\n watch(\n () => props.theme,\n (newTheme) => {\n viewerRef.value?.setTheme(newTheme);\n },\n );\n\n watch(\n () => props.tool,\n (newTool) => {\n viewerRef.value?.setTool(newTool);\n },\n );\n\n watch(\n () => props.file,\n async (newFile) => {\n const viewer = viewerRef.value;\n if (!viewer || !newFile) return;\n\n try {\n if (newFile instanceof File) {\n await viewer.loadFile(newFile);\n } else if (newFile instanceof ArrayBuffer) {\n viewer.loadArrayBuffer(newFile);\n } else if (typeof newFile === 'string') {\n viewer.loadString(newFile);\n }\n\n emit('layers-loaded', viewer.getLayers() as DxfLayer[]);\n } catch (err) {\n console.error('CadViewer: failed to load file', err);\n }\n },\n );\n\n expose({\n getViewer: () => viewerRef.value,\n fitToView: () => viewerRef.value?.fitToView(),\n getLayers: () => viewerRef.value?.getLayers() ?? [],\n setLayerVisible: (name: string, visible: boolean) =>\n viewerRef.value?.setLayerVisible(name, visible),\n });\n\n return () =>\n h(\n 'div',\n { style: { position: 'relative', overflow: 'hidden' } },\n [\n h('canvas', {\n ref: canvasRef,\n style: { display: 'block', width: '100%', height: '100%' },\n }),\n ],\n );\n },\n});\n","import { ref, onMounted, onUnmounted, type Ref } from 'vue';\nimport {\n CadViewer,\n type CadViewerOptions,\n type DxfLayer,\n type Theme,\n type Tool,\n} from '@cadview/core';\n\nexport function useCadViewer(\n canvasRef: Ref<HTMLCanvasElement | null>,\n options?: CadViewerOptions,\n) {\n const viewer = ref<CadViewer | null>(null);\n const layers = ref<DxfLayer[]>([]);\n const isLoaded = ref(false);\n\n onMounted(() => {\n if (!canvasRef.value) return;\n viewer.value = new CadViewer(canvasRef.value, options);\n });\n\n onUnmounted(() => {\n viewer.value?.destroy();\n viewer.value = null;\n });\n\n const loadFile = async (file: File) => {\n if (!viewer.value) return;\n await viewer.value.loadFile(file);\n layers.value = viewer.value.getLayers();\n isLoaded.value = true;\n };\n\n const loadString = (dxf: string) => {\n if (!viewer.value) return;\n viewer.value.loadString(dxf);\n layers.value = viewer.value.getLayers();\n isLoaded.value = true;\n };\n\n return {\n viewer,\n layers,\n isLoaded,\n loadFile,\n loadString,\n fitToView: () => viewer.value?.fitToView(),\n setLayerVisible: (name: string, visible: boolean) =>\n viewer.value?.setLayerVisible(name, visible),\n setTheme: (theme: Theme) => viewer.value?.setTheme(theme),\n setTool: (tool: Tool) => viewer.value?.setTool(tool),\n };\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as vue from 'vue';
|
|
2
|
+
import { PropType, Ref } from 'vue';
|
|
3
|
+
import * as _cadview_core from '@cadview/core';
|
|
4
|
+
import { Theme, Tool, CadViewerOptions, DxfLayer, CadViewer as CadViewer$1 } from '@cadview/core';
|
|
5
|
+
export { CadViewerOptions, DxfDocument, DxfEntity, DxfLayer, MeasureEvent, SelectEvent, Theme, Tool, ViewTransform } from '@cadview/core';
|
|
6
|
+
|
|
7
|
+
declare const CadViewer: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
8
|
+
file: {
|
|
9
|
+
type: PropType<File | ArrayBuffer | string | null>;
|
|
10
|
+
default: null;
|
|
11
|
+
};
|
|
12
|
+
theme: {
|
|
13
|
+
type: PropType<Theme>;
|
|
14
|
+
default: string;
|
|
15
|
+
};
|
|
16
|
+
tool: {
|
|
17
|
+
type: PropType<Tool>;
|
|
18
|
+
default: string;
|
|
19
|
+
};
|
|
20
|
+
options: {
|
|
21
|
+
type: PropType<Omit<CadViewerOptions, "theme" | "initialTool">>;
|
|
22
|
+
default: () => {};
|
|
23
|
+
};
|
|
24
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
25
|
+
[key: string]: any;
|
|
26
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("select" | "measure" | "viewchange" | "layers-loaded")[], "select" | "measure" | "viewchange" | "layers-loaded", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
27
|
+
file: {
|
|
28
|
+
type: PropType<File | ArrayBuffer | string | null>;
|
|
29
|
+
default: null;
|
|
30
|
+
};
|
|
31
|
+
theme: {
|
|
32
|
+
type: PropType<Theme>;
|
|
33
|
+
default: string;
|
|
34
|
+
};
|
|
35
|
+
tool: {
|
|
36
|
+
type: PropType<Tool>;
|
|
37
|
+
default: string;
|
|
38
|
+
};
|
|
39
|
+
options: {
|
|
40
|
+
type: PropType<Omit<CadViewerOptions, "theme" | "initialTool">>;
|
|
41
|
+
default: () => {};
|
|
42
|
+
};
|
|
43
|
+
}>> & Readonly<{
|
|
44
|
+
onSelect?: ((...args: any[]) => any) | undefined;
|
|
45
|
+
onMeasure?: ((...args: any[]) => any) | undefined;
|
|
46
|
+
onViewchange?: ((...args: any[]) => any) | undefined;
|
|
47
|
+
"onLayers-loaded"?: ((...args: any[]) => any) | undefined;
|
|
48
|
+
}>, {
|
|
49
|
+
theme: Theme;
|
|
50
|
+
file: string | File | ArrayBuffer | null;
|
|
51
|
+
tool: Tool;
|
|
52
|
+
options: Omit<CadViewerOptions, "theme" | "initialTool">;
|
|
53
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
54
|
+
|
|
55
|
+
declare function useCadViewer(canvasRef: Ref<HTMLCanvasElement | null>, options?: CadViewerOptions): {
|
|
56
|
+
viewer: Ref<{
|
|
57
|
+
loadFile: (file: File) => Promise<void>;
|
|
58
|
+
loadString: (dxf: string) => void;
|
|
59
|
+
loadArrayBuffer: (buffer: ArrayBuffer) => void;
|
|
60
|
+
clearDocument: () => void;
|
|
61
|
+
fitToView: () => void;
|
|
62
|
+
zoomTo: (scale: number) => void;
|
|
63
|
+
panTo: (worldX: number, worldY: number) => void;
|
|
64
|
+
getViewTransform: () => _cadview_core.ViewTransform;
|
|
65
|
+
getZoomSpeed: () => number;
|
|
66
|
+
getLayers: () => DxfLayer[];
|
|
67
|
+
setLayerVisible: (name: string, visible: boolean) => void;
|
|
68
|
+
setLayerColor: (name: string, color: string) => void;
|
|
69
|
+
setTheme: (theme: Theme) => void;
|
|
70
|
+
getTheme: () => Theme;
|
|
71
|
+
setBackgroundColor: (color: string) => void;
|
|
72
|
+
setTool: (tool: Tool) => void;
|
|
73
|
+
getTool: () => Tool;
|
|
74
|
+
on: <K extends keyof _cadview_core.CadViewerEventMap>(event: K, callback: (data: _cadview_core.CadViewerEventMap[K]) => void) => void;
|
|
75
|
+
off: <K extends keyof _cadview_core.CadViewerEventMap>(event: K, callback: (data: _cadview_core.CadViewerEventMap[K]) => void) => void;
|
|
76
|
+
getDocument: () => _cadview_core.DxfDocument | null;
|
|
77
|
+
getEntities: () => _cadview_core.DxfEntity[];
|
|
78
|
+
resize: () => void;
|
|
79
|
+
destroy: () => void;
|
|
80
|
+
requestRender: () => void;
|
|
81
|
+
handlePan: (dx: number, dy: number) => void;
|
|
82
|
+
handleZoom: (screenX: number, screenY: number, factor: number) => void;
|
|
83
|
+
handleClick: (screenX: number, screenY: number) => void;
|
|
84
|
+
handleMouseMove: (screenX: number, screenY: number) => void;
|
|
85
|
+
} | null, CadViewer$1 | {
|
|
86
|
+
loadFile: (file: File) => Promise<void>;
|
|
87
|
+
loadString: (dxf: string) => void;
|
|
88
|
+
loadArrayBuffer: (buffer: ArrayBuffer) => void;
|
|
89
|
+
clearDocument: () => void;
|
|
90
|
+
fitToView: () => void;
|
|
91
|
+
zoomTo: (scale: number) => void;
|
|
92
|
+
panTo: (worldX: number, worldY: number) => void;
|
|
93
|
+
getViewTransform: () => _cadview_core.ViewTransform;
|
|
94
|
+
getZoomSpeed: () => number;
|
|
95
|
+
getLayers: () => DxfLayer[];
|
|
96
|
+
setLayerVisible: (name: string, visible: boolean) => void;
|
|
97
|
+
setLayerColor: (name: string, color: string) => void;
|
|
98
|
+
setTheme: (theme: Theme) => void;
|
|
99
|
+
getTheme: () => Theme;
|
|
100
|
+
setBackgroundColor: (color: string) => void;
|
|
101
|
+
setTool: (tool: Tool) => void;
|
|
102
|
+
getTool: () => Tool;
|
|
103
|
+
on: <K extends keyof _cadview_core.CadViewerEventMap>(event: K, callback: (data: _cadview_core.CadViewerEventMap[K]) => void) => void;
|
|
104
|
+
off: <K extends keyof _cadview_core.CadViewerEventMap>(event: K, callback: (data: _cadview_core.CadViewerEventMap[K]) => void) => void;
|
|
105
|
+
getDocument: () => _cadview_core.DxfDocument | null;
|
|
106
|
+
getEntities: () => _cadview_core.DxfEntity[];
|
|
107
|
+
resize: () => void;
|
|
108
|
+
destroy: () => void;
|
|
109
|
+
requestRender: () => void;
|
|
110
|
+
handlePan: (dx: number, dy: number) => void;
|
|
111
|
+
handleZoom: (screenX: number, screenY: number, factor: number) => void;
|
|
112
|
+
handleClick: (screenX: number, screenY: number) => void;
|
|
113
|
+
handleMouseMove: (screenX: number, screenY: number) => void;
|
|
114
|
+
} | null>;
|
|
115
|
+
layers: Ref<{
|
|
116
|
+
name: string;
|
|
117
|
+
color: number;
|
|
118
|
+
lineType: string;
|
|
119
|
+
flags: number;
|
|
120
|
+
lineWeight: number;
|
|
121
|
+
trueColor?: number | undefined;
|
|
122
|
+
isOff: boolean;
|
|
123
|
+
isFrozen: boolean;
|
|
124
|
+
isLocked: boolean;
|
|
125
|
+
}[], DxfLayer[] | {
|
|
126
|
+
name: string;
|
|
127
|
+
color: number;
|
|
128
|
+
lineType: string;
|
|
129
|
+
flags: number;
|
|
130
|
+
lineWeight: number;
|
|
131
|
+
trueColor?: number | undefined;
|
|
132
|
+
isOff: boolean;
|
|
133
|
+
isFrozen: boolean;
|
|
134
|
+
isLocked: boolean;
|
|
135
|
+
}[]>;
|
|
136
|
+
isLoaded: Ref<boolean, boolean>;
|
|
137
|
+
loadFile: (file: File) => Promise<void>;
|
|
138
|
+
loadString: (dxf: string) => void;
|
|
139
|
+
fitToView: () => void | undefined;
|
|
140
|
+
setLayerVisible: (name: string, visible: boolean) => void | undefined;
|
|
141
|
+
setTheme: (theme: Theme) => void | undefined;
|
|
142
|
+
setTool: (tool: Tool) => void | undefined;
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
export { CadViewer, useCadViewer };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as vue from 'vue';
|
|
2
|
+
import { PropType, Ref } from 'vue';
|
|
3
|
+
import * as _cadview_core from '@cadview/core';
|
|
4
|
+
import { Theme, Tool, CadViewerOptions, DxfLayer, CadViewer as CadViewer$1 } from '@cadview/core';
|
|
5
|
+
export { CadViewerOptions, DxfDocument, DxfEntity, DxfLayer, MeasureEvent, SelectEvent, Theme, Tool, ViewTransform } from '@cadview/core';
|
|
6
|
+
|
|
7
|
+
declare const CadViewer: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
8
|
+
file: {
|
|
9
|
+
type: PropType<File | ArrayBuffer | string | null>;
|
|
10
|
+
default: null;
|
|
11
|
+
};
|
|
12
|
+
theme: {
|
|
13
|
+
type: PropType<Theme>;
|
|
14
|
+
default: string;
|
|
15
|
+
};
|
|
16
|
+
tool: {
|
|
17
|
+
type: PropType<Tool>;
|
|
18
|
+
default: string;
|
|
19
|
+
};
|
|
20
|
+
options: {
|
|
21
|
+
type: PropType<Omit<CadViewerOptions, "theme" | "initialTool">>;
|
|
22
|
+
default: () => {};
|
|
23
|
+
};
|
|
24
|
+
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
25
|
+
[key: string]: any;
|
|
26
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("select" | "measure" | "viewchange" | "layers-loaded")[], "select" | "measure" | "viewchange" | "layers-loaded", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
27
|
+
file: {
|
|
28
|
+
type: PropType<File | ArrayBuffer | string | null>;
|
|
29
|
+
default: null;
|
|
30
|
+
};
|
|
31
|
+
theme: {
|
|
32
|
+
type: PropType<Theme>;
|
|
33
|
+
default: string;
|
|
34
|
+
};
|
|
35
|
+
tool: {
|
|
36
|
+
type: PropType<Tool>;
|
|
37
|
+
default: string;
|
|
38
|
+
};
|
|
39
|
+
options: {
|
|
40
|
+
type: PropType<Omit<CadViewerOptions, "theme" | "initialTool">>;
|
|
41
|
+
default: () => {};
|
|
42
|
+
};
|
|
43
|
+
}>> & Readonly<{
|
|
44
|
+
onSelect?: ((...args: any[]) => any) | undefined;
|
|
45
|
+
onMeasure?: ((...args: any[]) => any) | undefined;
|
|
46
|
+
onViewchange?: ((...args: any[]) => any) | undefined;
|
|
47
|
+
"onLayers-loaded"?: ((...args: any[]) => any) | undefined;
|
|
48
|
+
}>, {
|
|
49
|
+
theme: Theme;
|
|
50
|
+
file: string | File | ArrayBuffer | null;
|
|
51
|
+
tool: Tool;
|
|
52
|
+
options: Omit<CadViewerOptions, "theme" | "initialTool">;
|
|
53
|
+
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
54
|
+
|
|
55
|
+
declare function useCadViewer(canvasRef: Ref<HTMLCanvasElement | null>, options?: CadViewerOptions): {
|
|
56
|
+
viewer: Ref<{
|
|
57
|
+
loadFile: (file: File) => Promise<void>;
|
|
58
|
+
loadString: (dxf: string) => void;
|
|
59
|
+
loadArrayBuffer: (buffer: ArrayBuffer) => void;
|
|
60
|
+
clearDocument: () => void;
|
|
61
|
+
fitToView: () => void;
|
|
62
|
+
zoomTo: (scale: number) => void;
|
|
63
|
+
panTo: (worldX: number, worldY: number) => void;
|
|
64
|
+
getViewTransform: () => _cadview_core.ViewTransform;
|
|
65
|
+
getZoomSpeed: () => number;
|
|
66
|
+
getLayers: () => DxfLayer[];
|
|
67
|
+
setLayerVisible: (name: string, visible: boolean) => void;
|
|
68
|
+
setLayerColor: (name: string, color: string) => void;
|
|
69
|
+
setTheme: (theme: Theme) => void;
|
|
70
|
+
getTheme: () => Theme;
|
|
71
|
+
setBackgroundColor: (color: string) => void;
|
|
72
|
+
setTool: (tool: Tool) => void;
|
|
73
|
+
getTool: () => Tool;
|
|
74
|
+
on: <K extends keyof _cadview_core.CadViewerEventMap>(event: K, callback: (data: _cadview_core.CadViewerEventMap[K]) => void) => void;
|
|
75
|
+
off: <K extends keyof _cadview_core.CadViewerEventMap>(event: K, callback: (data: _cadview_core.CadViewerEventMap[K]) => void) => void;
|
|
76
|
+
getDocument: () => _cadview_core.DxfDocument | null;
|
|
77
|
+
getEntities: () => _cadview_core.DxfEntity[];
|
|
78
|
+
resize: () => void;
|
|
79
|
+
destroy: () => void;
|
|
80
|
+
requestRender: () => void;
|
|
81
|
+
handlePan: (dx: number, dy: number) => void;
|
|
82
|
+
handleZoom: (screenX: number, screenY: number, factor: number) => void;
|
|
83
|
+
handleClick: (screenX: number, screenY: number) => void;
|
|
84
|
+
handleMouseMove: (screenX: number, screenY: number) => void;
|
|
85
|
+
} | null, CadViewer$1 | {
|
|
86
|
+
loadFile: (file: File) => Promise<void>;
|
|
87
|
+
loadString: (dxf: string) => void;
|
|
88
|
+
loadArrayBuffer: (buffer: ArrayBuffer) => void;
|
|
89
|
+
clearDocument: () => void;
|
|
90
|
+
fitToView: () => void;
|
|
91
|
+
zoomTo: (scale: number) => void;
|
|
92
|
+
panTo: (worldX: number, worldY: number) => void;
|
|
93
|
+
getViewTransform: () => _cadview_core.ViewTransform;
|
|
94
|
+
getZoomSpeed: () => number;
|
|
95
|
+
getLayers: () => DxfLayer[];
|
|
96
|
+
setLayerVisible: (name: string, visible: boolean) => void;
|
|
97
|
+
setLayerColor: (name: string, color: string) => void;
|
|
98
|
+
setTheme: (theme: Theme) => void;
|
|
99
|
+
getTheme: () => Theme;
|
|
100
|
+
setBackgroundColor: (color: string) => void;
|
|
101
|
+
setTool: (tool: Tool) => void;
|
|
102
|
+
getTool: () => Tool;
|
|
103
|
+
on: <K extends keyof _cadview_core.CadViewerEventMap>(event: K, callback: (data: _cadview_core.CadViewerEventMap[K]) => void) => void;
|
|
104
|
+
off: <K extends keyof _cadview_core.CadViewerEventMap>(event: K, callback: (data: _cadview_core.CadViewerEventMap[K]) => void) => void;
|
|
105
|
+
getDocument: () => _cadview_core.DxfDocument | null;
|
|
106
|
+
getEntities: () => _cadview_core.DxfEntity[];
|
|
107
|
+
resize: () => void;
|
|
108
|
+
destroy: () => void;
|
|
109
|
+
requestRender: () => void;
|
|
110
|
+
handlePan: (dx: number, dy: number) => void;
|
|
111
|
+
handleZoom: (screenX: number, screenY: number, factor: number) => void;
|
|
112
|
+
handleClick: (screenX: number, screenY: number) => void;
|
|
113
|
+
handleMouseMove: (screenX: number, screenY: number) => void;
|
|
114
|
+
} | null>;
|
|
115
|
+
layers: Ref<{
|
|
116
|
+
name: string;
|
|
117
|
+
color: number;
|
|
118
|
+
lineType: string;
|
|
119
|
+
flags: number;
|
|
120
|
+
lineWeight: number;
|
|
121
|
+
trueColor?: number | undefined;
|
|
122
|
+
isOff: boolean;
|
|
123
|
+
isFrozen: boolean;
|
|
124
|
+
isLocked: boolean;
|
|
125
|
+
}[], DxfLayer[] | {
|
|
126
|
+
name: string;
|
|
127
|
+
color: number;
|
|
128
|
+
lineType: string;
|
|
129
|
+
flags: number;
|
|
130
|
+
lineWeight: number;
|
|
131
|
+
trueColor?: number | undefined;
|
|
132
|
+
isOff: boolean;
|
|
133
|
+
isFrozen: boolean;
|
|
134
|
+
isLocked: boolean;
|
|
135
|
+
}[]>;
|
|
136
|
+
isLoaded: Ref<boolean, boolean>;
|
|
137
|
+
loadFile: (file: File) => Promise<void>;
|
|
138
|
+
loadString: (dxf: string) => void;
|
|
139
|
+
fitToView: () => void | undefined;
|
|
140
|
+
setLayerVisible: (name: string, visible: boolean) => void | undefined;
|
|
141
|
+
setTheme: (theme: Theme) => void | undefined;
|
|
142
|
+
setTool: (tool: Tool) => void | undefined;
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
export { CadViewer, useCadViewer };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { defineComponent, ref, onMounted, onUnmounted, watch, h } from 'vue';
|
|
2
|
+
import { CadViewer as CadViewer$1 } from '@cadview/core';
|
|
3
|
+
|
|
4
|
+
// src/CadViewer.tsx
|
|
5
|
+
var CadViewer = defineComponent({
|
|
6
|
+
name: "CadViewer",
|
|
7
|
+
props: {
|
|
8
|
+
file: {
|
|
9
|
+
type: [File, ArrayBuffer, String],
|
|
10
|
+
default: null
|
|
11
|
+
},
|
|
12
|
+
theme: {
|
|
13
|
+
type: String,
|
|
14
|
+
default: "dark"
|
|
15
|
+
},
|
|
16
|
+
tool: {
|
|
17
|
+
type: String,
|
|
18
|
+
default: "pan"
|
|
19
|
+
},
|
|
20
|
+
options: {
|
|
21
|
+
type: Object,
|
|
22
|
+
default: () => ({})
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
emits: ["select", "measure", "viewchange", "layers-loaded"],
|
|
26
|
+
setup(props, { emit, expose }) {
|
|
27
|
+
const canvasRef = ref(null);
|
|
28
|
+
const viewerRef = ref(null);
|
|
29
|
+
onMounted(() => {
|
|
30
|
+
if (!canvasRef.value) return;
|
|
31
|
+
const viewer = new CadViewer$1(canvasRef.value, {
|
|
32
|
+
theme: props.theme,
|
|
33
|
+
initialTool: props.tool,
|
|
34
|
+
...props.options
|
|
35
|
+
});
|
|
36
|
+
viewerRef.value = viewer;
|
|
37
|
+
viewer.on("select", (e) => emit("select", e));
|
|
38
|
+
viewer.on("measure", (e) => emit("measure", e));
|
|
39
|
+
viewer.on("viewchange", (vt) => emit("viewchange", vt));
|
|
40
|
+
});
|
|
41
|
+
onUnmounted(() => {
|
|
42
|
+
viewerRef.value?.destroy();
|
|
43
|
+
viewerRef.value = null;
|
|
44
|
+
});
|
|
45
|
+
watch(
|
|
46
|
+
() => props.theme,
|
|
47
|
+
(newTheme) => {
|
|
48
|
+
viewerRef.value?.setTheme(newTheme);
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
watch(
|
|
52
|
+
() => props.tool,
|
|
53
|
+
(newTool) => {
|
|
54
|
+
viewerRef.value?.setTool(newTool);
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
watch(
|
|
58
|
+
() => props.file,
|
|
59
|
+
async (newFile) => {
|
|
60
|
+
const viewer = viewerRef.value;
|
|
61
|
+
if (!viewer || !newFile) return;
|
|
62
|
+
try {
|
|
63
|
+
if (newFile instanceof File) {
|
|
64
|
+
await viewer.loadFile(newFile);
|
|
65
|
+
} else if (newFile instanceof ArrayBuffer) {
|
|
66
|
+
viewer.loadArrayBuffer(newFile);
|
|
67
|
+
} else if (typeof newFile === "string") {
|
|
68
|
+
viewer.loadString(newFile);
|
|
69
|
+
}
|
|
70
|
+
emit("layers-loaded", viewer.getLayers());
|
|
71
|
+
} catch (err) {
|
|
72
|
+
console.error("CadViewer: failed to load file", err);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
expose({
|
|
77
|
+
getViewer: () => viewerRef.value,
|
|
78
|
+
fitToView: () => viewerRef.value?.fitToView(),
|
|
79
|
+
getLayers: () => viewerRef.value?.getLayers() ?? [],
|
|
80
|
+
setLayerVisible: (name, visible) => viewerRef.value?.setLayerVisible(name, visible)
|
|
81
|
+
});
|
|
82
|
+
return () => h(
|
|
83
|
+
"div",
|
|
84
|
+
{ style: { position: "relative", overflow: "hidden" } },
|
|
85
|
+
[
|
|
86
|
+
h("canvas", {
|
|
87
|
+
ref: canvasRef,
|
|
88
|
+
style: { display: "block", width: "100%", height: "100%" }
|
|
89
|
+
})
|
|
90
|
+
]
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
function useCadViewer(canvasRef, options) {
|
|
95
|
+
const viewer = ref(null);
|
|
96
|
+
const layers = ref([]);
|
|
97
|
+
const isLoaded = ref(false);
|
|
98
|
+
onMounted(() => {
|
|
99
|
+
if (!canvasRef.value) return;
|
|
100
|
+
viewer.value = new CadViewer$1(canvasRef.value, options);
|
|
101
|
+
});
|
|
102
|
+
onUnmounted(() => {
|
|
103
|
+
viewer.value?.destroy();
|
|
104
|
+
viewer.value = null;
|
|
105
|
+
});
|
|
106
|
+
const loadFile = async (file) => {
|
|
107
|
+
if (!viewer.value) return;
|
|
108
|
+
await viewer.value.loadFile(file);
|
|
109
|
+
layers.value = viewer.value.getLayers();
|
|
110
|
+
isLoaded.value = true;
|
|
111
|
+
};
|
|
112
|
+
const loadString = (dxf) => {
|
|
113
|
+
if (!viewer.value) return;
|
|
114
|
+
viewer.value.loadString(dxf);
|
|
115
|
+
layers.value = viewer.value.getLayers();
|
|
116
|
+
isLoaded.value = true;
|
|
117
|
+
};
|
|
118
|
+
return {
|
|
119
|
+
viewer,
|
|
120
|
+
layers,
|
|
121
|
+
isLoaded,
|
|
122
|
+
loadFile,
|
|
123
|
+
loadString,
|
|
124
|
+
fitToView: () => viewer.value?.fitToView(),
|
|
125
|
+
setLayerVisible: (name, visible) => viewer.value?.setLayerVisible(name, visible),
|
|
126
|
+
setTheme: (theme) => viewer.value?.setTheme(theme),
|
|
127
|
+
setTool: (tool) => viewer.value?.setTool(tool)
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export { CadViewer, useCadViewer };
|
|
132
|
+
//# sourceMappingURL=index.js.map
|
|
133
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/CadViewer.tsx","../src/useCadViewer.ts"],"names":["CoreCadViewer","ref","onMounted","CadViewer","onUnmounted"],"mappings":";;;;AAoBO,IAAM,YAAY,eAAA,CAAgB;AAAA,EACvC,IAAA,EAAM,WAAA;AAAA,EAEN,KAAA,EAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,CAAC,IAAA,EAAM,WAAA,EAAa,MAAM,CAAA;AAAA,MAChC,OAAA,EAAS;AAAA,KACX;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,OAAO,EAAC;AAAA;AACnB,GACF;AAAA,EAEA,KAAA,EAAO,CAAC,QAAA,EAAU,SAAA,EAAW,cAAc,eAAe,CAAA;AAAA,EAE1D,KAAA,CAAM,KAAA,EAAO,EAAE,IAAA,EAAM,QAAO,EAAG;AAC7B,IAAA,MAAM,SAAA,GAAY,IAA8B,IAAI,CAAA;AACpD,IAAA,MAAM,SAAA,GAAY,IAA0B,IAAI,CAAA;AAEhD,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AAEtB,MAAA,MAAM,MAAA,GAAS,IAAIA,WAAA,CAAc,SAAA,CAAU,KAAA,EAAO;AAAA,QAChD,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,aAAa,KAAA,CAAM,IAAA;AAAA,QACnB,GAAG,KAAA,CAAM;AAAA,OACV,CAAA;AACD,MAAA,SAAA,CAAU,KAAA,GAAQ,MAAA;AAElB,MAAA,MAAA,CAAO,GAAG,QAAA,EAAU,CAAC,MAAmB,IAAA,CAAK,QAAA,EAAU,CAAC,CAAC,CAAA;AACzD,MAAA,MAAA,CAAO,GAAG,SAAA,EAAW,CAAC,MAAoB,IAAA,CAAK,SAAA,EAAW,CAAC,CAAC,CAAA;AAC5D,MAAA,MAAA,CAAO,GAAG,YAAA,EAAc,CAAC,OAAsB,IAAA,CAAK,YAAA,EAAc,EAAE,CAAC,CAAA;AAAA,IACvE,CAAC,CAAA;AAED,IAAA,WAAA,CAAY,MAAM;AAChB,MAAA,SAAA,CAAU,OAAO,OAAA,EAAQ;AACzB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAAA,IACpB,CAAC,CAAA;AAED,IAAA,KAAA;AAAA,MACE,MAAM,KAAA,CAAM,KAAA;AAAA,MACZ,CAAC,QAAA,KAAa;AACZ,QAAA,SAAA,CAAU,KAAA,EAAO,SAAS,QAAQ,CAAA;AAAA,MACpC;AAAA,KACF;AAEA,IAAA,KAAA;AAAA,MACE,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,CAAC,OAAA,KAAY;AACX,QAAA,SAAA,CAAU,KAAA,EAAO,QAAQ,OAAO,CAAA;AAAA,MAClC;AAAA,KACF;AAEA,IAAA,KAAA;AAAA,MACE,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAO,OAAA,KAAY;AACjB,QAAA,MAAM,SAAS,SAAA,CAAU,KAAA;AACzB,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS;AAEzB,QAAA,IAAI;AACF,UAAA,IAAI,mBAAmB,IAAA,EAAM;AAC3B,YAAA,MAAM,MAAA,CAAO,SAAS,OAAO,CAAA;AAAA,UAC/B,CAAA,MAAA,IAAW,mBAAmB,WAAA,EAAa;AACzC,YAAA,MAAA,CAAO,gBAAgB,OAAO,CAAA;AAAA,UAChC,CAAA,MAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AACtC,YAAA,MAAA,CAAO,WAAW,OAAO,CAAA;AAAA,UAC3B;AAEA,UAAA,IAAA,CAAK,eAAA,EAAiB,MAAA,CAAO,SAAA,EAAyB,CAAA;AAAA,QACxD,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,GAAG,CAAA;AAAA,QACrD;AAAA,MACF;AAAA,KACF;AAEA,IAAA,MAAA,CAAO;AAAA,MACL,SAAA,EAAW,MAAM,SAAA,CAAU,KAAA;AAAA,MAC3B,SAAA,EAAW,MAAM,SAAA,CAAU,KAAA,EAAO,SAAA,EAAU;AAAA,MAC5C,WAAW,MAAM,SAAA,CAAU,KAAA,EAAO,SAAA,MAAe,EAAC;AAAA,MAClD,eAAA,EAAiB,CAAC,IAAA,EAAc,OAAA,KAC9B,UAAU,KAAA,EAAO,eAAA,CAAgB,MAAM,OAAO;AAAA,KACjD,CAAA;AAED,IAAA,OAAO,MACL,CAAA;AAAA,MACE,KAAA;AAAA,MACA,EAAE,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,QAAA,EAAU,UAAS,EAAE;AAAA,MACtD;AAAA,QACE,EAAE,QAAA,EAAU;AAAA,UACV,GAAA,EAAK,SAAA;AAAA,UACL,OAAO,EAAE,OAAA,EAAS,SAAS,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAA;AAAO,SAC1D;AAAA;AACH,KACF;AAAA,EACJ;AACF,CAAC;ACnHM,SAAS,YAAA,CACd,WACA,OAAA,EACA;AACA,EAAA,MAAM,MAAA,GAASC,IAAsB,IAAI,CAAA;AACzC,EAAA,MAAM,MAAA,GAASA,GAAAA,CAAgB,EAAE,CAAA;AACjC,EAAA,MAAM,QAAA,GAAWA,IAAI,KAAK,CAAA;AAE1B,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AACtB,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAIC,WAAAA,CAAU,SAAA,CAAU,OAAO,OAAO,CAAA;AAAA,EACvD,CAAC,CAAA;AAED,EAAAC,YAAY,MAAM;AAChB,IAAA,MAAA,CAAO,OAAO,OAAA,EAAQ;AACtB,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AAAA,EACjB,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,OAAO,IAAA,KAAe;AACrC,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACnB,IAAA,MAAM,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AAChC,IAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,SAAA,EAAU;AACtC,IAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAgB;AAClC,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACnB,IAAA,MAAA,CAAO,KAAA,CAAM,WAAW,GAAG,CAAA;AAC3B,IAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,SAAA,EAAU;AACtC,IAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AAAA,EACnB,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,MAAM,MAAA,CAAO,KAAA,EAAO,SAAA,EAAU;AAAA,IACzC,eAAA,EAAiB,CAAC,IAAA,EAAc,OAAA,KAC9B,OAAO,KAAA,EAAO,eAAA,CAAgB,MAAM,OAAO,CAAA;AAAA,IAC7C,UAAU,CAAC,KAAA,KAAiB,MAAA,CAAO,KAAA,EAAO,SAAS,KAAK,CAAA;AAAA,IACxD,SAAS,CAAC,IAAA,KAAe,MAAA,CAAO,KAAA,EAAO,QAAQ,IAAI;AAAA,GACrD;AACF","file":"index.js","sourcesContent":["import {\n defineComponent,\n ref,\n onMounted,\n onUnmounted,\n watch,\n h,\n type PropType,\n} from 'vue';\nimport {\n CadViewer as CoreCadViewer,\n type CadViewerOptions,\n type DxfLayer,\n type SelectEvent,\n type MeasureEvent,\n type ViewTransform,\n type Tool,\n type Theme,\n} from '@cadview/core';\n\nexport const CadViewer = defineComponent({\n name: 'CadViewer',\n\n props: {\n file: {\n type: [File, ArrayBuffer, String] as PropType<File | ArrayBuffer | string | null>,\n default: null,\n },\n theme: {\n type: String as PropType<Theme>,\n default: 'dark',\n },\n tool: {\n type: String as PropType<Tool>,\n default: 'pan',\n },\n options: {\n type: Object as PropType<Omit<CadViewerOptions, 'theme' | 'initialTool'>>,\n default: () => ({}),\n },\n },\n\n emits: ['select', 'measure', 'viewchange', 'layers-loaded'],\n\n setup(props, { emit, expose }) {\n const canvasRef = ref<HTMLCanvasElement | null>(null);\n const viewerRef = ref<CoreCadViewer | null>(null);\n\n onMounted(() => {\n if (!canvasRef.value) return;\n\n const viewer = new CoreCadViewer(canvasRef.value, {\n theme: props.theme,\n initialTool: props.tool,\n ...props.options,\n });\n viewerRef.value = viewer;\n\n viewer.on('select', (e: SelectEvent) => emit('select', e));\n viewer.on('measure', (e: MeasureEvent) => emit('measure', e));\n viewer.on('viewchange', (vt: ViewTransform) => emit('viewchange', vt));\n });\n\n onUnmounted(() => {\n viewerRef.value?.destroy();\n viewerRef.value = null;\n });\n\n watch(\n () => props.theme,\n (newTheme) => {\n viewerRef.value?.setTheme(newTheme);\n },\n );\n\n watch(\n () => props.tool,\n (newTool) => {\n viewerRef.value?.setTool(newTool);\n },\n );\n\n watch(\n () => props.file,\n async (newFile) => {\n const viewer = viewerRef.value;\n if (!viewer || !newFile) return;\n\n try {\n if (newFile instanceof File) {\n await viewer.loadFile(newFile);\n } else if (newFile instanceof ArrayBuffer) {\n viewer.loadArrayBuffer(newFile);\n } else if (typeof newFile === 'string') {\n viewer.loadString(newFile);\n }\n\n emit('layers-loaded', viewer.getLayers() as DxfLayer[]);\n } catch (err) {\n console.error('CadViewer: failed to load file', err);\n }\n },\n );\n\n expose({\n getViewer: () => viewerRef.value,\n fitToView: () => viewerRef.value?.fitToView(),\n getLayers: () => viewerRef.value?.getLayers() ?? [],\n setLayerVisible: (name: string, visible: boolean) =>\n viewerRef.value?.setLayerVisible(name, visible),\n });\n\n return () =>\n h(\n 'div',\n { style: { position: 'relative', overflow: 'hidden' } },\n [\n h('canvas', {\n ref: canvasRef,\n style: { display: 'block', width: '100%', height: '100%' },\n }),\n ],\n );\n },\n});\n","import { ref, onMounted, onUnmounted, type Ref } from 'vue';\nimport {\n CadViewer,\n type CadViewerOptions,\n type DxfLayer,\n type Theme,\n type Tool,\n} from '@cadview/core';\n\nexport function useCadViewer(\n canvasRef: Ref<HTMLCanvasElement | null>,\n options?: CadViewerOptions,\n) {\n const viewer = ref<CadViewer | null>(null);\n const layers = ref<DxfLayer[]>([]);\n const isLoaded = ref(false);\n\n onMounted(() => {\n if (!canvasRef.value) return;\n viewer.value = new CadViewer(canvasRef.value, options);\n });\n\n onUnmounted(() => {\n viewer.value?.destroy();\n viewer.value = null;\n });\n\n const loadFile = async (file: File) => {\n if (!viewer.value) return;\n await viewer.value.loadFile(file);\n layers.value = viewer.value.getLayers();\n isLoaded.value = true;\n };\n\n const loadString = (dxf: string) => {\n if (!viewer.value) return;\n viewer.value.loadString(dxf);\n layers.value = viewer.value.getLayers();\n isLoaded.value = true;\n };\n\n return {\n viewer,\n layers,\n isLoaded,\n loadFile,\n loadString,\n fitToView: () => viewer.value?.fitToView(),\n setLayerVisible: (name: string, visible: boolean) =>\n viewer.value?.setLayerVisible(name, visible),\n setTheme: (theme: Theme) => viewer.value?.setTheme(theme),\n setTool: (tool: Tool) => viewer.value?.setTool(tool),\n };\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cadview/vue",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"description": "Vue 3 wrapper for @cadview/core — CAD/DXF file viewer component",
|
|
7
|
+
"author": "Wisnu Wicaksono",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"cad",
|
|
10
|
+
"dxf",
|
|
11
|
+
"viewer",
|
|
12
|
+
"vue",
|
|
13
|
+
"vue3",
|
|
14
|
+
"component",
|
|
15
|
+
"canvas"
|
|
16
|
+
],
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/wiscaksono/cadview.git",
|
|
20
|
+
"directory": "packages/vue"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/wiscaksono/cadview/tree/main/packages/vue#readme",
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/wiscaksono/cadview/issues"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18"
|
|
28
|
+
},
|
|
29
|
+
"main": "./dist/index.cjs",
|
|
30
|
+
"module": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"exports": {
|
|
33
|
+
".": {
|
|
34
|
+
"import": {
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"default": "./dist/index.js"
|
|
37
|
+
},
|
|
38
|
+
"require": {
|
|
39
|
+
"types": "./dist/index.d.cts",
|
|
40
|
+
"default": "./dist/index.cjs"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"LICENSE",
|
|
47
|
+
"README.md"
|
|
48
|
+
],
|
|
49
|
+
"peerDependencies": {
|
|
50
|
+
"vue": "^3.5.0",
|
|
51
|
+
"@cadview/core": "0.1.0"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"vue": "^3.5.0",
|
|
55
|
+
"vue-tsc": "^2.0.0",
|
|
56
|
+
"tsup": "^8.0.0",
|
|
57
|
+
"typescript": "^5.7.0",
|
|
58
|
+
"@cadview/core": "0.1.0"
|
|
59
|
+
},
|
|
60
|
+
"sideEffects": false,
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "tsup",
|
|
63
|
+
"dev": "tsup --watch",
|
|
64
|
+
"typecheck": "vue-tsc --noEmit"
|
|
65
|
+
}
|
|
66
|
+
}
|