From 1ca15457e4ad680809537a583f9a89656db3ae61 Mon Sep 17 00:00:00 2001 From: ferris Date: Wed, 2 Oct 2024 15:38:12 +0200 Subject: [PATCH 1/3] Add ability to do recursive loading --- src/kicanvas/elements/kicanvas-embed.ts | 4 +++- src/kicanvas/project.ts | 21 ++++++++++++++++- src/kicanvas/services/vfs.ts | 31 +++++++++++++++++++++---- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/kicanvas/elements/kicanvas-embed.ts b/src/kicanvas/elements/kicanvas-embed.ts index a25d8a83..f5f30549 100644 --- a/src/kicanvas/elements/kicanvas-embed.ts +++ b/src/kicanvas/elements/kicanvas-embed.ts @@ -83,6 +83,8 @@ class KiCanvasEmbedElement extends KCUIElement { @attribute({ type: String }) zoom: "objects" | "page" | string | null; + custom_resolver: ((name: string) => URL) | null = null; + #schematic_app: KCSchematicAppElement; #board_app: KCBoardAppElement; @@ -115,7 +117,7 @@ class KiCanvasEmbedElement extends KCUIElement { return; } - const vfs = new FetchFileSystem(sources); + const vfs = new FetchFileSystem(sources, this.custom_resolver); await this.#setup_project(vfs); } diff --git a/src/kicanvas/project.ts b/src/kicanvas/project.ts index 164df91e..e3130c8f 100644 --- a/src/kicanvas/project.ts +++ b/src/kicanvas/project.ts @@ -42,7 +42,7 @@ export class Project extends EventTarget implements IDisposable { this.#fs = fs; - const promises = []; + let promises = []; for (const filename of this.#fs.list()) { promises.push(this.#load_file(filename)); @@ -50,6 +50,25 @@ export class Project extends EventTarget implements IDisposable { await Promise.all(promises); + while (promises.length) { + // 'Recursively' resolve all schematics until none are remaining + promises = []; + for (const schematic of this.schematics()) { + for (const sheet of schematic.sheets) { + const sheet_sch = this.#files_by_name.get( + sheet.sheetfile ?? "", + ) as KicadSch; + + if (!sheet_sch && sheet.sheetfile) { + // Missing schematic, attempt to fetch + promises.push(this.#load_file(sheet.sheetfile)); + } + + } + } + await Promise.all(promises); + } + this.#determine_schematic_hierarchy(); this.loaded.open(); diff --git a/src/kicanvas/services/vfs.ts b/src/kicanvas/services/vfs.ts index 3710848e..8a0470cc 100644 --- a/src/kicanvas/services/vfs.ts +++ b/src/kicanvas/services/vfs.ts @@ -46,14 +46,35 @@ export abstract class VirtualFileSystem { */ export class FetchFileSystem extends VirtualFileSystem { private urls: Map = new Map(); + private resolver!: (name: string) => URL; - constructor(urls: (string | URL)[]) { + #default_resolver(name: string): URL { + const url = new URL(name, window.location.toString()); + return url; + } + + #resolve(filepath: string | URL): URL { + if (typeof filepath === 'string') { + let cached_url = this.urls.get(filepath); + if (cached_url) { + return cached_url; + } else { + const url = this.resolver(filepath) + const name = basename(url); + this.urls.set(name, url); + return url; + } + } + return filepath; + } + + constructor(urls: (string | URL)[], resolve_file: ((name: string) => URL) | null = null) { super(); + this.resolver = resolve_file ?? this.#default_resolver + for (const item of urls) { - const url = new URL(item, window.location.toString()); - const name = basename(url); - this.urls.set(name, url); + this.#resolve(item) } } @@ -66,7 +87,7 @@ export class FetchFileSystem extends VirtualFileSystem { } public override async get(name: string): Promise { - const url = this.urls.get(name); + const url = this.#resolve(name); if (!url) { throw new Error(`File ${name} not found!`); From 3bb35d020da6e597292519e349646e683ea8b38d Mon Sep 17 00:00:00 2001 From: C2D <50617709+i404788@users.noreply.github.com> Date: Thu, 17 Oct 2024 21:06:15 +0200 Subject: [PATCH 2/3] Fix lint --- src/kicanvas/services/vfs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kicanvas/services/vfs.ts b/src/kicanvas/services/vfs.ts index 8a0470cc..e8686e0e 100644 --- a/src/kicanvas/services/vfs.ts +++ b/src/kicanvas/services/vfs.ts @@ -55,7 +55,7 @@ export class FetchFileSystem extends VirtualFileSystem { #resolve(filepath: string | URL): URL { if (typeof filepath === 'string') { - let cached_url = this.urls.get(filepath); + const cached_url = this.urls.get(filepath); if (cached_url) { return cached_url; } else { From f5c58c1b96241e42f98df5606a6ae6a596e23445 Mon Sep 17 00:00:00 2001 From: ferris Date: Sat, 19 Oct 2024 02:44:45 +0200 Subject: [PATCH 3/3] Prettier --- src/kicanvas/project.ts | 1 - src/kicanvas/services/vfs.ts | 15 +++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/kicanvas/project.ts b/src/kicanvas/project.ts index e3130c8f..32c78822 100644 --- a/src/kicanvas/project.ts +++ b/src/kicanvas/project.ts @@ -63,7 +63,6 @@ export class Project extends EventTarget implements IDisposable { // Missing schematic, attempt to fetch promises.push(this.#load_file(sheet.sheetfile)); } - } } await Promise.all(promises); diff --git a/src/kicanvas/services/vfs.ts b/src/kicanvas/services/vfs.ts index e8686e0e..75948360 100644 --- a/src/kicanvas/services/vfs.ts +++ b/src/kicanvas/services/vfs.ts @@ -54,12 +54,12 @@ export class FetchFileSystem extends VirtualFileSystem { } #resolve(filepath: string | URL): URL { - if (typeof filepath === 'string') { + if (typeof filepath === "string") { const cached_url = this.urls.get(filepath); if (cached_url) { - return cached_url; + return cached_url; } else { - const url = this.resolver(filepath) + const url = this.resolver(filepath); const name = basename(url); this.urls.set(name, url); return url; @@ -68,13 +68,16 @@ export class FetchFileSystem extends VirtualFileSystem { return filepath; } - constructor(urls: (string | URL)[], resolve_file: ((name: string) => URL) | null = null) { + constructor( + urls: (string | URL)[], + resolve_file: ((name: string) => URL) | null = null, + ) { super(); - this.resolver = resolve_file ?? this.#default_resolver + this.resolver = resolve_file ?? this.#default_resolver; for (const item of urls) { - this.#resolve(item) + this.#resolve(item); } }