Compare commits

..

6 Commits

Author SHA1 Message Date
Yeicor
d3fbe254cb improve release asset 2 2024-03-03 20:47:29 +01:00
Yeicor
2475a00622 improve release asset 2024-03-03 20:45:12 +01:00
Yeicor
4bd025e7d5 fix launching backend without a built frontend 2024-03-03 20:41:44 +01:00
Yeicor
94e316472a fix selection 2024-03-03 20:38:56 +01:00
Yeicor
258256912b optimize CI times 2024-03-03 20:34:52 +01:00
Yeicor
075682ff18 fix for frontend parsing settings 2024-03-03 20:30:03 +01:00
8 changed files with 38 additions and 31 deletions

View File

@@ -37,8 +37,8 @@ jobs:
with:
python-version: "3.11"
cache: "poetry"
- run: "poetry install"
- run: "poetry build"
- run: "SKIP_BUILD_FRONTEND=true poetry install"
- run: "SKIP_BUILD_FRONTEND=true poetry build"
build-logo:
name: "Build logo"
@@ -53,7 +53,7 @@ jobs:
with:
python-version: "3.11"
cache: "poetry"
- run: "poetry install"
- run: "SKIP_BUILD_FRONTEND=true poetry install"
- run: "poetry run python yacv_server/logo.py"
- run: "cp assets/fox.glb assets/logo_build/fox.glb"
- uses: "actions/upload-artifact@v4"

View File

@@ -17,7 +17,7 @@ concurrency:
cancel-in-progress: false
jobs:
deploy:
deploy-frontend:
runs-on: "ubuntu-latest"
environment:
name: "github-pages"
@@ -35,18 +35,18 @@ jobs:
name: "logo"
path: "./public"
allow_forks: false
- uses: "svenstaro/upload-release-action@v2"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
file: "./public/*"
asset_name: "frontend"
tag: "${{ github.ref }}"
overwrite: true
file_glob: true
- uses: "actions/configure-pages@v4"
- uses: "actions/upload-pages-artifact@v3"
with:
path: 'public'
- id: "deployment"
uses: "actions/deploy-pages@v4"
- run: 'zip -r frontend.zip public'
- uses: "svenstaro/upload-release-action@v2"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
file: "frontend.zip"
tag: "${{ github.ref }}"
overwrite: true
# TODO: deploy-backend

View File

@@ -24,7 +24,7 @@ The [logo](yacv_server/logo.py) also works as an example of how to use the viewe
To see the live updates you will need to run the [yacv_server](yacv_server) and
open [the viewer](https://yeicor-3d.github.io/yet-another-cad-viewer/) with
the `preloadModels=ws://<host>:32323/` query parameter (by default it already tries localhost).
the `preload=ws://<host>:32323/` query parameter (by default it already tries localhost).
Note that [yacv_server](yacv_server) also hosts the frontend at `http://localhost:32323/` if you have no access to the
internet.
@@ -32,13 +32,13 @@ internet.
### Static deployment
To deploy the viewer and models as a static website you can simply copy the latest build directory to your server.
To load models use the `preloadModels=...` query parameter in the URL.
To load models use the `preload=...` query parameter in the URL.
It can be set multiple times to load multiple models.
Note that you can simply reuse the [main deployment](https://yeicor-3d.github.io/yet-another-cad-viewer/) and host only
your own models (linking them from the viewer with the `preloadModels` query parameter).
your own models (linking them from the viewer with the `preload` query parameter).
To see a working example of a static deployment you can check out
the [demo](https://yeicor-3d.github.io/yet-another-cad-viewer/?preloadModels=base.glb&preloadModels=fox.glb&preloadModels=img.jpg.glb&preloadModels=location.glb).
the [demo](https://yeicor-3d.github.io/yet-another-cad-viewer/?preload=base.glb&preload=fox.glb&preload=img.jpg.glb&preload=location.glb).
![Demo](assets/screenshot.png)

View File

@@ -2,6 +2,7 @@ import os
import subprocess
if __name__ == "__main__":
if os.getenv('SKIP_BUILD_FRONTEND') is None:
# When building the backend, make sure the frontend is built first
subprocess.run(['yarn', 'install'], check=True)
subprocess.run(['yarn', 'build', '--outDir', 'yacv_server/frontend'], check=True)

View File

@@ -46,7 +46,7 @@ async function onModelRemoveRequest(name: string) {
let networkMgr = new NetworkManager();
networkMgr.addEventListener('update', (e) => onModelLoadRequest(e as NetworkUpdateEvent));
// Start loading all configured models ASAP
for (let model of settings.preloadModels) {
for (let model of settings.preload) {
networkMgr.load(model);
}

View File

@@ -1,6 +1,6 @@
// These are the default values for the settings, which are overridden below
export const settings = {
preloadModels: [
preload: [
// @ts-ignore
// new URL('../../assets/fox.glb', import.meta.url).href,
// @ts-ignore
@@ -29,7 +29,8 @@ function parseSetting(name: string, value: string): any {
if (arrayElem) name = name.slice(0, -2);
let prevValue = (settings as any)[name];
if (prevValue === undefined) throw new Error(`Unknown setting: ${name}`);
if (Array.isArray(prevValue) && !arrayElem) {
if (Array.isArray(prevValue)) {
if (!arrayElem) {
let toExtend = []
if (!firstTimeNames.includes(name)) {
firstTimeNames.push(name);
@@ -38,6 +39,9 @@ function parseSetting(name: string, value: string): any {
}
toExtend.push(parseSetting(name + ".0", value));
return toExtend;
} else {
prevValue = prevValue[0];
}
}
switch (typeof prevValue) {
case 'boolean':
@@ -47,7 +51,7 @@ function parseSetting(name: string, value: string): any {
case 'string':
return value;
default:
throw new Error(`Unknown setting type: ${typeof prevValue}`);
throw new Error(`Unknown setting type: ${typeof prevValue} -- ${prevValue}`);
}
}

View File

@@ -88,7 +88,7 @@ let selectionListener = (event: MouseEvent) => {
// Find all hit objects and select the wanted one based on the filter
const hits = raycaster.intersectObject(scene, true);
let hit = hits.find((hit: Intersection<Object3D>) => {
if (!hit.object || !(hit.object as any).isMesh) return false;
if (!hit.object) return false;
const kind = hit.object.type
let isFace = kind === 'Mesh' || kind === 'SkinnedMesh';
let isEdge = kind === 'Line' || kind === 'LineSegments';

View File

@@ -28,6 +28,7 @@ if not os.path.exists(FRONTEND_BASE_PATH):
FRONTEND_BASE_PATH = os.path.join(FILE_DIR, '..', 'dist')
else:
logger.warning('Frontend not found at %s', FRONTEND_BASE_PATH)
FRONTEND_BASE_PATH = None
# Define the API paths (also available at the root path for simplicity)
UPDATES_API_PATH = '/api/updates'
@@ -84,6 +85,7 @@ class Server:
self.app.router.add_get('/', self._entrypoint)
# - Static files from the frontend
self.app.router.add_get('/{path:(.*/|)}', _index_handler) # Any folder -> index.html
if FRONTEND_BASE_PATH is not None:
self.app.router.add_static('/', path=FRONTEND_BASE_PATH, name='static_frontend')
# --- CORS ---
cors = aiohttp_cors.setup(self.app, defaults={