mirror of
https://github.com/yeicor-3d/yet-another-cad-viewer.git
synced 2025-12-20 14:37:03 +01:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5308ececae | ||
|
|
64e2622954 | ||
|
|
2e8b8bd65f | ||
|
|
854de26695 | ||
|
|
e0503983f1 | ||
|
|
021cfd89a1 | ||
|
|
9d96effb30 | ||
|
|
dff2d36b44 | ||
|
|
810647276b | ||
|
|
a54b91f704 | ||
|
|
099726035a | ||
|
|
c383b8573a |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -11,3 +11,4 @@
|
|||||||
|
|
||||||
*.iml
|
*.iml
|
||||||
venv/
|
venv/
|
||||||
|
__pycache__/
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ in a web browser.
|
|||||||
- All [GLTF 2.0](https://www.khronos.org/gltf/) features (textures, PBR materials, animations...).
|
- All [GLTF 2.0](https://www.khronos.org/gltf/) features (textures, PBR materials, animations...).
|
||||||
- All [model-viewer](https://modelviewer.dev/) features (smooth controls, augmented reality...).
|
- All [model-viewer](https://modelviewer.dev/) features (smooth controls, augmented reality...).
|
||||||
- Load multiple models at once, load external models and even images as quads.
|
- Load multiple models at once, load external models and even images as quads.
|
||||||
- Control clipping planes and transparency of each model.
|
- Control clipping planes, transparency, edge/vertex sizes and explode each model.
|
||||||
- View and interact with topological entities: faces, edges, vertices and locations.
|
- View and interact with topological entities: faces, edges, vertices and locations.
|
||||||
- Select any entity and measure bounding box size and distances.
|
- Select any entity and measure bounding box size and distances.
|
||||||
- Hot reloading while editing the CAD model (using the `yacv-server` package).
|
- Hot reloading while editing the CAD model (using the `yacv-server` package).
|
||||||
@@ -23,9 +23,9 @@ in a web browser.
|
|||||||
The [example](example) is a fully working project that shows how to use the viewer.
|
The [example](example) is a fully working project that shows how to use the viewer.
|
||||||
|
|
||||||
You can play with the latest
|
You can play with the latest
|
||||||
demo [here](https://yeicor-3d.github.io/yet-another-cad-viewer/?preload=logo.glb&preload=logo_hl.glb&preload=logo_hl_tex.glb&preload=fox.glb&preload=img.jpg.glb&preload=location.glb)
|
demo [here](https://yeicor-3d.github.io/yet-another-cad-viewer/?preload=logo.glb&preload=logo_hl.glb&preload=logo_hl_tex.glb&preload=fox.glb&preload=img.glb&preload=location.glb)
|
||||||
(or
|
(or
|
||||||
[without animation](https://yeicor-3d.github.io/yet-another-cad-viewer/?autoplay=false&preload=logo.glb&preload=logo_hl.glb&preload=logo_hl_tex.glb&preload=fox.glb&preload=img.jpg.glb&preload=location.glb)).
|
[without animation](https://yeicor-3d.github.io/yet-another-cad-viewer/?autoplay=false&preload=logo.glb&preload=logo_hl.glb&preload=logo_hl_tex.glb&preload=fox.glb&preload=img.glb&preload=location.glb)).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -36,3 +36,6 @@ demo [here](https://yeicor-3d.github.io/yet-another-cad-viewer/?preload=logo.glb
|
|||||||
Uses the same backend and frontend behind the scenes.
|
Uses the same backend and frontend behind the scenes.
|
||||||
- [build123d-docker](https://github.com/derhuerst/build123d-docker/pkgs/container/build123d) provides docker images for
|
- [build123d-docker](https://github.com/derhuerst/build123d-docker/pkgs/container/build123d) provides docker images for
|
||||||
Yet Another CAD Viewer and other projects, with automatic updates.
|
Yet Another CAD Viewer and other projects, with automatic updates.
|
||||||
|
- [OCP.wasm](https://github.com/yeicor/OCP.wasm/) ports OCP (OpenCASCADE for Python) and supporting libraries to
|
||||||
|
WebAssembly, enabling full in-browser CAD model generation and manipulation. This powers the build123d playground
|
||||||
|
provided by this viewer.
|
||||||
@@ -1011,7 +1011,7 @@ third-party archives.
|
|||||||
|
|
||||||
The following npm package may be included in this product:
|
The following npm package may be included in this product:
|
||||||
|
|
||||||
- typescript@5.8.3
|
- typescript@5.9.2
|
||||||
|
|
||||||
This package contains the following license:
|
This package contains the following license:
|
||||||
|
|
||||||
|
|||||||
@@ -109,6 +109,12 @@ async function loadModelManual() {
|
|||||||
if (modelUrl) await networkMgr.load(modelUrl);
|
if (modelUrl) await networkMgr.load(modelUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function loadDemoModels() {
|
||||||
|
for (let name of ['fox.glb', 'img.glb', 'location.glb', 'logo.glb', 'logo_hl.glb', 'logo_hl_tex.glb']) {
|
||||||
|
networkMgr.load(`https://yeicor-3d.github.io/yet-another-cad-viewer/${name}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Detect dropped .glb files and load them manually
|
// Detect dropped .glb files and load them manually
|
||||||
document.body.addEventListener("dragover", e => {
|
document.body.addEventListener("dragover", e => {
|
||||||
e.preventDefault(); // Allow drop
|
e.preventDefault(); // Allow drop
|
||||||
@@ -124,7 +130,6 @@ document.body.addEventListener("drop", async e => {
|
|||||||
await networkMgr.load(file);
|
await networkMgr.load(file);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -139,9 +144,8 @@ document.body.addEventListener("drop", async e => {
|
|||||||
<v-btn @click="() => tools?.openPlayground()" class="mx-auto d-block my-4">
|
<v-btn @click="() => tools?.openPlayground()" class="mx-auto d-block my-4">
|
||||||
<svg-icon :path="mdiScriptTextPlay" type="mdi"/> Open playground...
|
<svg-icon :path="mdiScriptTextPlay" type="mdi"/> Open playground...
|
||||||
</v-btn>
|
</v-btn>
|
||||||
<v-btn @click="networkMgr.load('https://yeicor-3d.github.io/yet-another-cad-viewer/logo.glb')"
|
<v-btn @click="loadDemoModels" class="mx-auto d-block my-4">
|
||||||
class="mx-auto d-block my-4">
|
<svg-icon :path="mdiCube" type="mdi"/> Load demo models...
|
||||||
<svg-icon :path="mdiCube" type="mdi"/> Load demo model...
|
|
||||||
</v-btn>
|
</v-btn>
|
||||||
<v-btn @click="loadModelManual" class="mx-auto d-block my-4">
|
<v-btn @click="loadModelManual" class="mx-auto d-block my-4">
|
||||||
<svg-icon :path="mdiPlus" type="mdi"/> Load model manually...
|
<svg-icon :path="mdiPlus" type="mdi"/> Load model manually...
|
||||||
|
|||||||
@@ -56,8 +56,13 @@ export class NetworkManager extends EventTarget {
|
|||||||
name = name.replace('.glb', '').replace('.gltf', '');
|
name = name.replace('.glb', '').replace('.gltf', '');
|
||||||
} else {
|
} else {
|
||||||
// If there is a #name parameter in the URL, use it as the name
|
// If there is a #name parameter in the URL, use it as the name
|
||||||
let urlObj = new URL(url);
|
let hashParams: URLSearchParams
|
||||||
let hashParams = new URLSearchParams(urlObj.hash.slice(1));
|
try {
|
||||||
|
let urlObj = new URL(url, window.location.href);
|
||||||
|
hashParams = new URLSearchParams(urlObj.hash.slice(1));
|
||||||
|
} catch (e) {
|
||||||
|
hashParams = new URLSearchParams();
|
||||||
|
}
|
||||||
if (hashParams.has("name")) {
|
if (hashParams.has("name")) {
|
||||||
name = hashParams.get("name") || `unknown-${Math.random()}`;
|
name = hashParams.get("name") || `unknown-${Math.random()}`;
|
||||||
} else { // Default to the last part of the URL as the "name" of the model
|
} else { // Default to the last part of the URL as the "name" of the model
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ export class SceneMgr {
|
|||||||
let transform = (new Matrix4()).makeTranslation(bb.getCenter(new Vector3()));
|
let transform = (new Matrix4()).makeTranslation(bb.getCenter(new Vector3()));
|
||||||
newAxes(helpersDoc, bb.getSize(new Vector3()).multiplyScalar(0.5), transform);
|
newAxes(helpersDoc, bb.getSize(new Vector3()).multiplyScalar(0.5), transform);
|
||||||
newGridBox(helpersDoc, bb.getSize(new Vector3()), transform);
|
newGridBox(helpersDoc, bb.getSize(new Vector3()), transform);
|
||||||
let helpersUrl = URL.createObjectURL(new Blob([await toBuffer(helpersDoc)]));
|
let helpersUrl = URL.createObjectURL(new Blob([await toBuffer(helpersDoc) as ArrayBufferView<ArrayBuffer>]));
|
||||||
let newDocument = await SceneMgr.loadModel(sceneUrl, document, extrasNameValueHelpers, helpersUrl, false, reloadScene);
|
let newDocument = await SceneMgr.loadModel(sceneUrl, document, extrasNameValueHelpers, helpersUrl, false, reloadScene);
|
||||||
URL.revokeObjectURL(helpersUrl);
|
URL.revokeObjectURL(helpersUrl);
|
||||||
return newDocument;
|
return newDocument;
|
||||||
@@ -112,7 +112,7 @@ export class SceneMgr {
|
|||||||
|
|
||||||
// Serialize the document into a GLB and update the viewerSrc
|
// Serialize the document into a GLB and update the viewerSrc
|
||||||
let buffer = await toBuffer(document);
|
let buffer = await toBuffer(document);
|
||||||
let blob = new Blob([buffer], {type: 'model/gltf-binary'});
|
let blob = new Blob([buffer as ArrayBufferView<ArrayBuffer>], {type: 'model/gltf-binary'});
|
||||||
console.debug("Showing current doc", document, "with", buffer.length, "total bytes");
|
console.debug("Showing current doc", document, "with", buffer.length, "total bytes");
|
||||||
if (sceneUrl.value.startsWith("blob:")) URL.revokeObjectURL(sceneUrl.value);
|
if (sceneUrl.value.startsWith("blob:")) URL.revokeObjectURL(sceneUrl.value);
|
||||||
sceneUrl.value = URL.createObjectURL(blob);
|
sceneUrl.value = URL.createObjectURL(blob);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ export const settings = (async () => {
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
// new URL('../../assets/logo_build/location.glb', import.meta.url).href,
|
// new URL('../../assets/logo_build/location.glb', import.meta.url).href,
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
// new URL('../../assets/logo_build/img.jpg.glb', import.meta.url).href,
|
// new URL('../../assets/logo_build/img.glb', import.meta.url).href,
|
||||||
// Websocket URLs automatically listen for new models from the python backend
|
// Websocket URLs automatically listen for new models from the python backend
|
||||||
'<auto>', // Get the default preload URL if not overridden
|
'<auto>', // Get the default preload URL if not overridden
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -13,9 +13,10 @@ import {
|
|||||||
} from "vuetify/lib/components/index.mjs";
|
} from "vuetify/lib/components/index.mjs";
|
||||||
import {extrasNameKey, extrasNameValueHelpers} from "../misc/gltf";
|
import {extrasNameKey, extrasNameValueHelpers} from "../misc/gltf";
|
||||||
import {Mesh} from "@gltf-transform/core";
|
import {Mesh} from "@gltf-transform/core";
|
||||||
import {ref, watch} from "vue";
|
import {nextTick, ref, watch} from "vue";
|
||||||
import type ModelViewerWrapper from "../viewer/ModelViewerWrapper.vue";
|
import type ModelViewerWrapper from "../viewer/ModelViewerWrapper.vue";
|
||||||
import {
|
import {
|
||||||
|
mdiArrowExpand,
|
||||||
mdiCircleOpacity,
|
mdiCircleOpacity,
|
||||||
mdiCube,
|
mdiCube,
|
||||||
mdiDelete,
|
mdiDelete,
|
||||||
@@ -58,7 +59,12 @@ const clipPlaneY = ref(1);
|
|||||||
const clipPlaneSwappedY = ref(false);
|
const clipPlaneSwappedY = ref(false);
|
||||||
const clipPlaneZ = ref(1);
|
const clipPlaneZ = ref(1);
|
||||||
const clipPlaneSwappedZ = ref(false);
|
const clipPlaneSwappedZ = ref(false);
|
||||||
|
|
||||||
const edgeWidth = ref(0);
|
const edgeWidth = ref(0);
|
||||||
|
const explodeStrength = ref(0);
|
||||||
|
const explodeSwapped = ref(false);
|
||||||
|
|
||||||
|
// Load the settings for the default edge width
|
||||||
(async () => {
|
(async () => {
|
||||||
let s = await settings;
|
let s = await settings;
|
||||||
edgeWidth.value = s.edgeWidth;
|
edgeWidth.value = s.edgeWidth;
|
||||||
@@ -246,6 +252,76 @@ function onEdgeWidthChange(newEdgeWidth: number) {
|
|||||||
|
|
||||||
watch(edgeWidth, onEdgeWidthChange);
|
watch(edgeWidth, onEdgeWidthChange);
|
||||||
|
|
||||||
|
// Explode the model
|
||||||
|
function onExplodeChange(newExplodeStrength: number) {
|
||||||
|
let scene = props.viewer?.scene;
|
||||||
|
let sceneModel = (scene as any)?._model;
|
||||||
|
if (!scene || !sceneModel) return;
|
||||||
|
|
||||||
|
// Get direction and size of the explosion in a first pass
|
||||||
|
const meBbox = new Box3();
|
||||||
|
const othersBbox = new Box3();
|
||||||
|
sceneModel.traverse((child: MObject3D) => {
|
||||||
|
if (child == sceneModel) return; // Skip the scene itself
|
||||||
|
const isMe = child.userData[extrasNameKey] === modelName;
|
||||||
|
if ((child.type === 'Mesh' || child.type === 'SkinnedMesh' ||
|
||||||
|
child.type === 'Line' || child.type === 'LineSegments' ||
|
||||||
|
child.type === 'Points') && !child.userData.noHit) {
|
||||||
|
if (isMe) {
|
||||||
|
meBbox.expandByObject(child);
|
||||||
|
} else if (!isMe && child.userData[extrasNameKey]) {
|
||||||
|
othersBbox.expandByObject(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const modelSize = new Vector3();
|
||||||
|
meBbox.getSize(modelSize);
|
||||||
|
const maxDimension = Math.max(modelSize.x, modelSize.y, modelSize.z);
|
||||||
|
const pushDirection = new Vector3().subVectors(meBbox.getCenter(new Vector3()), othersBbox.getCenter(new Vector3())).normalize();
|
||||||
|
|
||||||
|
|
||||||
|
// Use absolute value for strength calculation
|
||||||
|
let strength = Math.abs(newExplodeStrength);
|
||||||
|
if (explodeSwapped.value) strength = -strength;
|
||||||
|
|
||||||
|
// Apply explosion
|
||||||
|
sceneModel.traverse((child: MObject3D) => {
|
||||||
|
if (child.userData[extrasNameKey] === modelName) {
|
||||||
|
if ((child.type === 'Mesh' || child.type === 'SkinnedMesh' ||
|
||||||
|
child.type === 'Line' || child.type === 'LineSegments' ||
|
||||||
|
child.type === 'Points')) {
|
||||||
|
|
||||||
|
// Handle zero vector case (if object is at origin)
|
||||||
|
const direction = pushDirection.clone();
|
||||||
|
if (direction.lengthSq() < 0.0001) {
|
||||||
|
direction.set(0, 1, 0);
|
||||||
|
console.warn("Explode direction was zero, using (0, 1, 0) instead");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate new position based on model size
|
||||||
|
const factor = strength * maxDimension;
|
||||||
|
const newPosition = new Vector3().add(direction.multiplyScalar(factor));
|
||||||
|
|
||||||
|
// Apply new position
|
||||||
|
child.position.copy(newPosition);
|
||||||
|
|
||||||
|
// Update related objects (back is automatically updated)
|
||||||
|
if (child.userData.niceLine) {
|
||||||
|
child.userData.niceLine.position.copy(newPosition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
scene.queueRender();
|
||||||
|
onClipPlanesChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add watchers for explode variables
|
||||||
|
watch(explodeStrength, (newVal) => onExplodeChange(newVal));
|
||||||
|
watch(explodeSwapped, () => onExplodeChange(explodeStrength.value));
|
||||||
|
|
||||||
|
|
||||||
function onModelLoad() {
|
function onModelLoad() {
|
||||||
let scene = props.viewer?.scene;
|
let scene = props.viewer?.scene;
|
||||||
let sceneModel = (scene as any)?._model;
|
let sceneModel = (scene as any)?._model;
|
||||||
@@ -312,15 +388,17 @@ function onModelLoad() {
|
|||||||
|
|
||||||
// Furthermore...
|
// Furthermore...
|
||||||
// Enabled features may have been reset after a reload
|
// Enabled features may have been reset after a reload
|
||||||
onEnabledFeaturesChange(enabledFeatures.value)
|
onEnabledFeaturesChange(enabledFeatures.value);
|
||||||
// Opacity may have been reset after a reload
|
// Opacity may have been reset after a reload
|
||||||
onOpacityChange(opacity.value)
|
onOpacityChange(opacity.value);
|
||||||
// Wireframe may have been reset after a reload
|
// Wireframe may have been reset after a reload
|
||||||
onWireframeChange(wireframe.value)
|
onWireframeChange(wireframe.value);
|
||||||
// Clip planes may have been reset after a reload
|
// Clip planes may have been reset after a reload
|
||||||
onClipPlanesChange()
|
onClipPlanesChange();
|
||||||
// Edge width may have been reset after a reload
|
// Edge width may have been reset after a reload
|
||||||
onEdgeWidthChange(edgeWidth.value)
|
onEdgeWidthChange(edgeWidth.value);
|
||||||
|
// Explode may have been reset after a reload
|
||||||
|
if (explodeStrength.value > 0) nextTick(() => onExplodeChange(explodeStrength.value));
|
||||||
|
|
||||||
scene.queueRender()
|
scene.queueRender()
|
||||||
}
|
}
|
||||||
@@ -370,6 +448,21 @@ if (props.viewer) onViewerReady(props.viewer); else watch((() => props.viewer) a
|
|||||||
<v-checkbox-btn v-model="wireframe" falseIcon="mdi-triangle" trueIcon="mdi-triangle-outline"></v-checkbox-btn>
|
<v-checkbox-btn v-model="wireframe" falseIcon="mdi-triangle" trueIcon="mdi-triangle-outline"></v-checkbox-btn>
|
||||||
</template>
|
</template>
|
||||||
</v-slider>
|
</v-slider>
|
||||||
|
<v-slider v-model="explodeStrength" hide-details max="1" min="0">
|
||||||
|
<template v-slot:prepend>
|
||||||
|
<v-tooltip activator="parent">Explode model</v-tooltip>
|
||||||
|
<svg-icon :path="mdiArrowExpand" type="mdi"></svg-icon>
|
||||||
|
</template>
|
||||||
|
<template v-slot:append>
|
||||||
|
<v-tooltip activator="parent">Swap explode direction (may go crazy)</v-tooltip>
|
||||||
|
<v-checkbox-btn v-model="explodeSwapped" falseIcon="mdi-checkbox-blank-outline"
|
||||||
|
trueIcon="mdi-checkbox-marked-outline">
|
||||||
|
<template v-slot:label>
|
||||||
|
<svg-icon :path="mdiSwapHorizontal" type="mdi"></svg-icon>
|
||||||
|
</template>
|
||||||
|
</v-checkbox-btn>
|
||||||
|
</template>
|
||||||
|
</v-slider>
|
||||||
<v-slider v-if="edgeCount > 0 || vertexCount > 0" v-model="edgeWidth" hide-details max="1" min="0">
|
<v-slider v-if="edgeCount > 0 || vertexCount > 0" v-model="edgeWidth" hide-details max="1" min="0">
|
||||||
<template v-slot:prepend>
|
<template v-slot:prepend>
|
||||||
<v-tooltip activator="parent">Edge and vertex sizes</v-tooltip>
|
<v-tooltip activator="parent">Edge and vertex sizes</v-tooltip>
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ function onModelData(modelData: string) {
|
|||||||
// - Save for upload and share link feature
|
// - Save for upload and share link feature
|
||||||
builtModelsGlb[modelMetadata.name] = binaryData;
|
builtModelsGlb[modelMetadata.name] = binaryData;
|
||||||
// - Create a Blob from the binary data to be used as a URL
|
// - Create a Blob from the binary data to be used as a URL
|
||||||
const blob = new Blob([binaryData], {type: 'model/gltf-binary'});
|
const blob = new Blob([binaryData as ArrayBufferView<ArrayBuffer>], {type: 'model/gltf-binary'});
|
||||||
modelMetadata.url = URL.createObjectURL(blob); // Set the hacked URL in the model metadata XXX: revoked on App.vue
|
modelMetadata.url = URL.createObjectURL(blob); // Set the hacked URL in the model metadata XXX: revoked on App.vue
|
||||||
} else {
|
} else {
|
||||||
delete builtModelsGlb[modelMetadata.name]; // Remove from built models if it's a remove request
|
delete builtModelsGlb[modelMetadata.name]; // Remove from built models if it's a remove request
|
||||||
@@ -165,13 +165,21 @@ function resetWorker(loadSnapshot: Uint8Array | undefined = undefined) {
|
|||||||
setupPyodide(false, loadSnapshot); // Reinitialize Pyodide
|
setupPyodide(false, loadSnapshot); // Reinitialize Pyodide
|
||||||
}
|
}
|
||||||
|
|
||||||
function shareLinkCommon(added: Record<string, string>, forgotten: Array<string>) {
|
function shareLinkCommon(added: Record<string, Array<string> | string>, forgotten: Array<string>) {
|
||||||
const baseUrl = window.location
|
const baseUrl = window.location
|
||||||
const searchParams = new URLSearchParams(baseUrl.search);
|
const searchParams = new URLSearchParams(baseUrl.search);
|
||||||
for (const k of forgotten) searchParams.delete(k);
|
for (const k of forgotten) searchParams.delete(k);
|
||||||
const hashParams = new URLSearchParams(baseUrl.hash.slice(1)); // Keep all previous URL parameters
|
const hashParams = new URLSearchParams(baseUrl.hash.slice(1)); // Keep all previous URL parameters
|
||||||
for (const k of forgotten) hashParams.delete(k);
|
for (const k of forgotten) hashParams.delete(k);
|
||||||
for (const k in added) hashParams.append(k, added[k]); // Prefer hash to GET
|
for (const k in added) {
|
||||||
|
if (Array.isArray(added[k])) {
|
||||||
|
for (const v of added[k]) {
|
||||||
|
hashParams.append(k, v); // Prefer hash to GET
|
||||||
|
}
|
||||||
|
} else if (typeof added[k] === 'string') {
|
||||||
|
hashParams.set(k, added[k]); // Prefer hash to GET
|
||||||
|
}
|
||||||
|
}
|
||||||
const shareUrl = `${baseUrl.origin}${baseUrl.pathname}?${searchParams}#${hashParams}`;
|
const shareUrl = `${baseUrl.origin}${baseUrl.pathname}?${searchParams}#${hashParams}`;
|
||||||
output(`Share link ready: ${shareUrl}\n`)
|
output(`Share link ready: ${shareUrl}\n`)
|
||||||
if (navigator.clipboard?.writeText === undefined) {
|
if (navigator.clipboard?.writeText === undefined) {
|
||||||
@@ -195,14 +203,16 @@ async function uploadAndShareLink() {
|
|||||||
|
|
||||||
// Upload code.py
|
// Upload code.py
|
||||||
const codeBlob = new Blob([model.value.code], {type: 'text/x-python'});
|
const codeBlob = new Blob([model.value.code], {type: 'text/x-python'});
|
||||||
const newParams: Record<string, string> = {
|
const newParams: Record<string, string | Array<string>> = {
|
||||||
'pg_code': await uploadFile('code.py', new Uint8Array(await codeBlob.arrayBuffer()))
|
'pg_code': await uploadFile('code.py', new Uint8Array(await codeBlob.arrayBuffer()))
|
||||||
};
|
};
|
||||||
|
|
||||||
// Upload all models
|
// Upload all models
|
||||||
|
newParams['preload'] = []
|
||||||
for (const name in builtModelsGlb) {
|
for (const name in builtModelsGlb) {
|
||||||
const glb: any = builtModelsGlb[name];
|
const glb: any = builtModelsGlb[name];
|
||||||
newParams['preload'] = await uploadFile(name + '.glb', glb);
|
const url = await uploadFile(name + '.glb', glb)
|
||||||
|
newParams['preload'].push(url); // Add to preload list
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build share URL
|
// Build share URL
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import encryptCode from "tanmayo7lock/dist/index.js?raw";
|
//@ts-expect-error
|
||||||
|
import encryptCode from "tanmayo7lock?raw";
|
||||||
|
|
||||||
function encrypt(msg: string, secret: string = "hudfhgd8fghdfgh3uhuifdgh"): string {
|
function encrypt(msg: string, secret: string = "hudfhgd8fghdfgh3uhuifdgh"): string {
|
||||||
let exports: any = {};
|
let exports: any = {};
|
||||||
@@ -52,7 +53,7 @@ export async function uploadFile(name: string, data: Uint8Array): Promise<string
|
|||||||
// Upload file to the locker
|
// Upload file to the locker
|
||||||
const uploadUrl = `https://vouz-backend.onrender.com/api/upload`;
|
const uploadUrl = `https://vouz-backend.onrender.com/api/upload`;
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
formData.append('file', new Blob([data], {type: 'application/octet-stream'}), name);
|
formData.append('file', new Blob([data as ArrayBufferView<ArrayBuffer>], {type: 'application/octet-stream'}), name);
|
||||||
formData.append("name", encrypt(lockerName));
|
formData.append("name", encrypt(lockerName));
|
||||||
formData.append("passkey", encrypt(lockerName));
|
formData.append("passkey", encrypt(lockerName));
|
||||||
const response = await fetch(uploadUrl, {
|
const response = await fetch(uploadUrl, {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "yet-another-cad-viewer",
|
"name": "yet-another-cad-viewer",
|
||||||
"version": "0.10.6",
|
"version": "0.10.10",
|
||||||
"description": "",
|
"description": "",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"private": true,
|
"private": true,
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
"generate-license-file": "^4.0.0",
|
"generate-license-file": "^4.0.0",
|
||||||
"npm-run-all2": "^8.0.0",
|
"npm-run-all2": "^8.0.0",
|
||||||
"terser": "^5.36.0",
|
"terser": "^5.36.0",
|
||||||
"typescript": "~5.8.0",
|
"typescript": "^5.9.2",
|
||||||
"vite": "^7.0.0",
|
"vite": "^7.0.0",
|
||||||
"vite-plugin-static-copy": "^3.1.1",
|
"vite-plugin-static-copy": "^3.1.1",
|
||||||
"vue-tsc": "^3.0.0"
|
"vue-tsc": "^3.0.0"
|
||||||
|
|||||||
91
poetry.lock
generated
91
poetry.lock
generated
@@ -569,46 +569,67 @@ tests = ["pytest", "simplejson"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "matplotlib"
|
name = "matplotlib"
|
||||||
version = "3.10.3"
|
version = "3.10.5"
|
||||||
description = "Python plotting package"
|
description = "Python plotting package"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.10"
|
python-versions = ">=3.10"
|
||||||
groups = ["main"]
|
groups = ["main"]
|
||||||
files = [
|
files = [
|
||||||
{file = "matplotlib-3.10.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:213fadd6348d106ca7db99e113f1bea1e65e383c3ba76e8556ba4a3054b65ae7"},
|
{file = "matplotlib-3.10.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5d4773a6d1c106ca05cb5a5515d277a6bb96ed09e5c8fab6b7741b8fcaa62c8f"},
|
||||||
{file = "matplotlib-3.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3bec61cb8221f0ca6313889308326e7bb303d0d302c5cc9e523b2f2e6c73deb"},
|
{file = "matplotlib-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc88af74e7ba27de6cbe6faee916024ea35d895ed3d61ef6f58c4ce97da7185a"},
|
||||||
{file = "matplotlib-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c21ae75651c0231b3ba014b6d5e08fb969c40cdb5a011e33e99ed0c9ea86ecb"},
|
{file = "matplotlib-3.10.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:64c4535419d5617f7363dad171a5a59963308e0f3f813c4bed6c9e6e2c131512"},
|
||||||
{file = "matplotlib-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e39755580b08e30e3620efc659330eac5d6534ab7eae50fa5e31f53ee4e30"},
|
{file = "matplotlib-3.10.5-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a277033048ab22d34f88a3c5243938cef776493f6201a8742ed5f8b553201343"},
|
||||||
{file = "matplotlib-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf4636203e1190871d3a73664dea03d26fb019b66692cbfd642faafdad6208e8"},
|
{file = "matplotlib-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e4a6470a118a2e93022ecc7d3bd16b3114b2004ea2bf014fff875b3bc99b70c6"},
|
||||||
{file = "matplotlib-3.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:fd5641a9bb9d55f4dd2afe897a53b537c834b9012684c8444cc105895c8c16fd"},
|
{file = "matplotlib-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:7e44cada61bec8833c106547786814dd4a266c1b2964fd25daa3804f1b8d4467"},
|
||||||
{file = "matplotlib-3.10.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0ef061f74cd488586f552d0c336b2f078d43bc00dc473d2c3e7bfee2272f3fa8"},
|
{file = "matplotlib-3.10.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:dcfc39c452c6a9f9028d3e44d2d721484f665304857188124b505b2c95e1eecf"},
|
||||||
{file = "matplotlib-3.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96985d14dc5f4a736bbea4b9de9afaa735f8a0fc2ca75be2fa9e96b2097369d"},
|
{file = "matplotlib-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:903352681b59f3efbf4546985142a9686ea1d616bb054b09a537a06e4b892ccf"},
|
||||||
{file = "matplotlib-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5f0283da91e9522bdba4d6583ed9d5521566f63729ffb68334f86d0bb98049"},
|
{file = "matplotlib-3.10.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:080c3676a56b8ee1c762bcf8fca3fe709daa1ee23e6ef06ad9f3fc17332f2d2a"},
|
||||||
{file = "matplotlib-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdfa07c0ec58035242bc8b2c8aae37037c9a886370eef6850703d7583e19964b"},
|
{file = "matplotlib-3.10.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b4984d5064a35b6f66d2c11d668565f4389b1119cc64db7a4c1725bc11adffc"},
|
||||||
{file = "matplotlib-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c0b9849a17bce080a16ebcb80a7b714b5677d0ec32161a2cc0a8e5a6030ae220"},
|
{file = "matplotlib-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3967424121d3a46705c9fa9bdb0931de3228f13f73d7bb03c999c88343a89d89"},
|
||||||
{file = "matplotlib-3.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:eef6ed6c03717083bc6d69c2d7ee8624205c29a8e6ea5a31cd3492ecdbaee1e1"},
|
{file = "matplotlib-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:33775bbeb75528555a15ac29396940128ef5613cf9a2d31fb1bfd18b3c0c0903"},
|
||||||
{file = "matplotlib-3.10.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ab1affc11d1f495ab9e6362b8174a25afc19c081ba5b0775ef00533a4236eea"},
|
{file = "matplotlib-3.10.5-cp311-cp311-win_arm64.whl", hash = "sha256:c61333a8e5e6240e73769d5826b9a31d8b22df76c0778f8480baf1b4b01c9420"},
|
||||||
{file = "matplotlib-3.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a818d8bdcafa7ed2eed74487fdb071c09c1ae24152d403952adad11fa3c65b4"},
|
{file = "matplotlib-3.10.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:00b6feadc28a08bd3c65b2894f56cf3c94fc8f7adcbc6ab4516ae1e8ed8f62e2"},
|
||||||
{file = "matplotlib-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748ebc3470c253e770b17d8b0557f0aa85cf8c63fd52f1a61af5b27ec0b7ffee"},
|
{file = "matplotlib-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee98a5c5344dc7f48dc261b6ba5d9900c008fc12beb3fa6ebda81273602cc389"},
|
||||||
{file = "matplotlib-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed70453fd99733293ace1aec568255bc51c6361cb0da94fa5ebf0649fdb2150a"},
|
{file = "matplotlib-3.10.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a17e57e33de901d221a07af32c08870ed4528db0b6059dce7d7e65c1122d4bea"},
|
||||||
{file = "matplotlib-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbed9917b44070e55640bd13419de83b4c918e52d97561544814ba463811cbc7"},
|
{file = "matplotlib-3.10.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97b9d6443419085950ee4a5b1ee08c363e5c43d7176e55513479e53669e88468"},
|
||||||
{file = "matplotlib-3.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05"},
|
{file = "matplotlib-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ceefe5d40807d29a66ae916c6a3915d60ef9f028ce1927b84e727be91d884369"},
|
||||||
{file = "matplotlib-3.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9f2efccc8dcf2b86fc4ee849eea5dcaecedd0773b30f47980dc0cbeabf26ec84"},
|
{file = "matplotlib-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:c04cba0f93d40e45b3c187c6c52c17f24535b27d545f757a2fffebc06c12b98b"},
|
||||||
{file = "matplotlib-3.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ddbba06a6c126e3301c3d272a99dcbe7f6c24c14024e80307ff03791a5f294e"},
|
{file = "matplotlib-3.10.5-cp312-cp312-win_arm64.whl", hash = "sha256:a41bcb6e2c8e79dc99c5511ae6f7787d2fb52efd3d805fff06d5d4f667db16b2"},
|
||||||
{file = "matplotlib-3.10.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748302b33ae9326995b238f606e9ed840bf5886ebafcb233775d946aa8107a15"},
|
{file = "matplotlib-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:354204db3f7d5caaa10e5de74549ef6a05a4550fdd1c8f831ab9bca81efd39ed"},
|
||||||
{file = "matplotlib-3.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80fcccbef63302c0efd78042ea3c2436104c5b1a4d3ae20f864593696364ac7"},
|
{file = "matplotlib-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b072aac0c3ad563a2b3318124756cb6112157017f7431626600ecbe890df57a1"},
|
||||||
{file = "matplotlib-3.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55e46cbfe1f8586adb34f7587c3e4f7dedc59d5226719faf6cb54fc24f2fd52d"},
|
{file = "matplotlib-3.10.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d52fd5b684d541b5a51fb276b2b97b010c75bee9aa392f96b4a07aeb491e33c7"},
|
||||||
{file = "matplotlib-3.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93"},
|
{file = "matplotlib-3.10.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee7a09ae2f4676276f5a65bd9f2bd91b4f9fbaedf49f40267ce3f9b448de501f"},
|
||||||
{file = "matplotlib-3.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c26dd9834e74d164d06433dc7be5d75a1e9890b926b3e57e74fa446e1a62c3e2"},
|
{file = "matplotlib-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ba6c3c9c067b83481d647af88b4e441d532acdb5ef22178a14935b0b881188f4"},
|
||||||
{file = "matplotlib-3.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:24853dad5b8c84c8c2390fc31ce4858b6df504156893292ce8092d190ef8151d"},
|
{file = "matplotlib-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:07442d2692c9bd1cceaa4afb4bbe5b57b98a7599de4dabfcca92d3eea70f9ebe"},
|
||||||
{file = "matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f7878214d369d7d4215e2a9075fef743be38fa401d32e6020bab2dfabaa566"},
|
{file = "matplotlib-3.10.5-cp313-cp313-win_arm64.whl", hash = "sha256:48fe6d47380b68a37ccfcc94f009530e84d41f71f5dae7eda7c4a5a84aa0a674"},
|
||||||
{file = "matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6929fc618cb6db9cb75086f73b3219bbb25920cb24cee2ea7a12b04971a4158"},
|
{file = "matplotlib-3.10.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b80eb8621331449fc519541a7461987f10afa4f9cfd91afcd2276ebe19bd56c"},
|
||||||
{file = "matplotlib-3.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c7818292a5cc372a2dc4c795e5c356942eb8350b98ef913f7fda51fe175ac5d"},
|
{file = "matplotlib-3.10.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47a388908e469d6ca2a6015858fa924e0e8a2345a37125948d8e93a91c47933e"},
|
||||||
{file = "matplotlib-3.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4f23ffe95c5667ef8a2b56eea9b53db7f43910fa4a2d5472ae0f72b64deab4d5"},
|
{file = "matplotlib-3.10.5-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8b6b49167d208358983ce26e43aa4196073b4702858670f2eb111f9a10652b4b"},
|
||||||
{file = "matplotlib-3.10.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:86ab63d66bbc83fdb6733471d3bff40897c1e9921cba112accd748eee4bce5e4"},
|
{file = "matplotlib-3.10.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a8da0453a7fd8e3da114234ba70c5ba9ef0e98f190309ddfde0f089accd46ea"},
|
||||||
{file = "matplotlib-3.10.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a48f9c08bf7444b5d2391a83e75edb464ccda3c380384b36532a0962593a1751"},
|
{file = "matplotlib-3.10.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52c6573dfcb7726a9907b482cd5b92e6b5499b284ffacb04ffbfe06b3e568124"},
|
||||||
{file = "matplotlib-3.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb73d8aa75a237457988f9765e4dfe1c0d2453c5ca4eabc897d4309672c8e014"},
|
{file = "matplotlib-3.10.5-cp313-cp313t-win_amd64.whl", hash = "sha256:a23193db2e9d64ece69cac0c8231849db7dd77ce59c7b89948cf9d0ce655a3ce"},
|
||||||
{file = "matplotlib-3.10.3.tar.gz", hash = "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0"},
|
{file = "matplotlib-3.10.5-cp313-cp313t-win_arm64.whl", hash = "sha256:56da3b102cf6da2776fef3e71cd96fcf22103a13594a18ac9a9b31314e0be154"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:96ef8f5a3696f20f55597ffa91c28e2e73088df25c555f8d4754931515512715"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:77fab633e94b9da60512d4fa0213daeb76d5a7b05156840c4fd0399b4b818837"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27f52634315e96b1debbfdc5c416592edcd9c4221bc2f520fd39c33db5d9f202"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:525f6e28c485c769d1f07935b660c864de41c37fd716bfa64158ea646f7084bb"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1f5f3ec4c191253c5f2b7c07096a142c6a1c024d9f738247bfc8e3f9643fc975"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314-win_amd64.whl", hash = "sha256:707f9c292c4cd4716f19ab8a1f93f26598222cd931e0cd98fbbb1c5994bf7667"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314-win_arm64.whl", hash = "sha256:21a95b9bf408178d372814de7baacd61c712a62cae560b5e6f35d791776f6516"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a6b310f95e1102a8c7c817ef17b60ee5d1851b8c71b63d9286b66b177963039e"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:94986a242747a0605cb3ff1cb98691c736f28a59f8ffe5175acaeb7397c49a5a"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ff10ea43288f0c8bab608a305dc6c918cc729d429c31dcbbecde3b9f4d5b569"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f6adb644c9d040ffb0d3434e440490a66cf73dbfa118a6f79cd7568431f7a012"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4fa40a8f98428f789a9dcacd625f59b7bc4e3ef6c8c7c80187a7a709475cf592"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314t-win_amd64.whl", hash = "sha256:95672a5d628b44207aab91ec20bf59c26da99de12b88f7e0b1fb0a84a86ff959"},
|
||||||
|
{file = "matplotlib-3.10.5-cp314-cp314t-win_arm64.whl", hash = "sha256:2efaf97d72629e74252e0b5e3c46813e9eeaa94e011ecf8084a971a31a97f40b"},
|
||||||
|
{file = "matplotlib-3.10.5-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b5fa2e941f77eb579005fb804026f9d0a1082276118d01cc6051d0d9626eaa7f"},
|
||||||
|
{file = "matplotlib-3.10.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1fc0d2a3241cdcb9daaca279204a3351ce9df3c0e7e621c7e04ec28aaacaca30"},
|
||||||
|
{file = "matplotlib-3.10.5-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8dee65cb1424b7dc982fe87895b5613d4e691cc57117e8af840da0148ca6c1d7"},
|
||||||
|
{file = "matplotlib-3.10.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:160e125da27a749481eaddc0627962990f6029811dbeae23881833a011a0907f"},
|
||||||
|
{file = "matplotlib-3.10.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac3d50760394d78a3c9be6b28318fe22b494c4fcf6407e8fd4794b538251899b"},
|
||||||
|
{file = "matplotlib-3.10.5-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c49465bf689c4d59d174d0c7795fb42a21d4244d11d70e52b8011987367ac61"},
|
||||||
|
{file = "matplotlib-3.10.5.tar.gz", hash = "sha256:352ed6ccfb7998a00881692f38b4ca083c691d3e275b4145423704c34c909076"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|||||||
|
|
||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "yacv-server"
|
name = "yacv-server"
|
||||||
version = "0.10.6"
|
version = "0.10.10"
|
||||||
description = "Yet Another CAD Viewer (server)"
|
description = "Yet Another CAD Viewer (server)"
|
||||||
authors = ["Yeicor <4929005+Yeicor@users.noreply.github.com>"]
|
authors = ["Yeicor <4929005+Yeicor@users.noreply.github.com>"]
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ def image_to_gltf(source: str | bytes, center: any, width: Optional[float] = Non
|
|||||||
# Handle arguments
|
# Handle arguments
|
||||||
if name is None:
|
if name is None:
|
||||||
if isinstance(source, str):
|
if isinstance(source, str):
|
||||||
name = os.path.basename(source)
|
name, _ = os.path.splitext(os.path.basename(source))
|
||||||
else:
|
else:
|
||||||
hasher = hashlib.md5()
|
hasher = hashlib.md5()
|
||||||
hasher.update(source)
|
hasher.update(source)
|
||||||
|
|||||||
@@ -2965,6 +2965,7 @@ three-mesh-bvh@^0.9.0:
|
|||||||
|
|
||||||
"three-orientation-gizmo@git+https://github.com/jrj2211/three-orientation-gizmo.git":
|
"three-orientation-gizmo@git+https://github.com/jrj2211/three-orientation-gizmo.git":
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
|
uid "000281f0559c316f72cdd23a1885d63ae6901095"
|
||||||
resolved "git+https://github.com/jrj2211/three-orientation-gizmo.git#000281f0559c316f72cdd23a1885d63ae6901095"
|
resolved "git+https://github.com/jrj2211/three-orientation-gizmo.git#000281f0559c316f72cdd23a1885d63ae6901095"
|
||||||
dependencies:
|
dependencies:
|
||||||
three "^0.125.0"
|
three "^0.125.0"
|
||||||
@@ -3013,10 +3014,10 @@ tuf-js@^3.0.1:
|
|||||||
debug "^4.4.1"
|
debug "^4.4.1"
|
||||||
make-fetch-happen "^14.0.3"
|
make-fetch-happen "^14.0.3"
|
||||||
|
|
||||||
typescript@~5.8.0:
|
typescript@^5.9.2:
|
||||||
version "5.8.3"
|
version "5.9.2"
|
||||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e"
|
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.2.tgz#d93450cddec5154a2d5cabe3b8102b83316fb2a6"
|
||||||
integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
|
integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==
|
||||||
|
|
||||||
undici-types@~6.21.0:
|
undici-types@~6.21.0:
|
||||||
version "6.21.0"
|
version "6.21.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user