From 1e61e35471e2d458f6cb25c73ce83ed4630601ed Mon Sep 17 00:00:00 2001 From: Aaron Date: Thu, 4 Apr 2024 15:19:30 -0500 Subject: [PATCH] feat!: Reorganize NPM package --- bun.lockb | Bin 431304 -> 435672 bytes npm/src/geometry.ts | 53 +++++++++- npm/src/index.ts | 234 ++++++++++++++------------------------------ npm/src/onshape.ts | 179 ++++++++++++++++++++++++++++++--- npm/src/types.ts | 91 ++++++++++++++--- package.json | 3 +- 6 files changed, 373 insertions(+), 187 deletions(-) diff --git a/bun.lockb b/bun.lockb index 734267279e3516b69c83037d7af2a77ade12f0bc..85562e156e015a2cf9808294cd0489432375d6ab 100755 GIT binary patch delta 90730 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
    f0ywm82OL{~ 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 rB8FeVem>Qy;LS(ZLjLEbjoj1j{a8w5HVMC03_r { + /** + * In meters + */ x: number; + /** + * In meters + */ y: number; + /** + * In meters + */ width: number; + /** + * In meters + */ height: number; constructor( @@ -111,12 +123,19 @@ export class Rectangle { } export interface Point { + /** + * In meters + */ x: number; + /** + * In meters + */ y: number; } -export class BoardLayout { +export class BoardLayouter { readonly placements: Rectangle[] = []; + constructor( readonly stock: Rectangle, readonly config: Config, @@ -241,13 +260,13 @@ export class BoardLayout { }); } - reduceStock(allStock: Rectangle[]): BoardLayout { + reduceStock(allStock: Rectangle[]): BoardLayouter { const validStock = allStock.filter( (stock) => stock.data.material === this.stock.data.material, ); const validLayouts = validStock .map((stock) => { - const layout = new BoardLayout(stock, this.config); + const layout = new BoardLayouter(stock, this.config); this.placements.forEach(({ data: part }) => { layout.tryAddPart(part); }); @@ -257,4 +276,30 @@ export class BoardLayout { validLayouts.push(this); return validLayouts.toSorted((a, b) => a.stock.area - b.stock.area)[0]; } + + toBoardLayout(): BoardLayout { + return { + stock: { + material: this.stock.data.material, + widthM: this.stock.data.width, + lengthM: this.stock.data.length, + thicknessM: this.stock.data.thickness, + }, + placements: this.placements.map((item) => ({ + partNumber: item.data.partNumber, + instanceNumber: item.data.instanceNumber, + name: item.data.name, + material: item.data.material, + xM: item.x, + yM: item.y, + widthM: item.data.size.width, + lengthM: item.data.size.length, + thicknessM: item.data.size.thickness, + bottomM: item.bottom, + leftM: item.left, + rightM: item.right, + topM: item.top, + })), + }; + } } diff --git a/npm/src/index.ts b/npm/src/index.ts index 34f8d7d..7b411aa 100644 --- a/npm/src/index.ts +++ b/npm/src/index.ts @@ -1,175 +1,91 @@ -import type { OnshapeApiClient } from './onshape'; -import type { PartToCut, Project, Stock, StockMatrix, Config } from './types'; +import type { + PartToCut, + Stock, + StockMatrix, + Config, + BoardLayout, + BoardLayoutLeftover, +} from './types'; import consola from 'consola'; -import { p } from '@antfu/utils'; -import { BoardLayout, Rectangle } from './geometry'; +import { BoardLayouter, Rectangle } from './geometry'; import { Distance } from './units'; export * from './types'; export * from './units'; -export async function getBoardLayouts( - onshape: OnshapeApiClient, - project: Project, +/** + * Given a list of parts, stock, and some configuration, return the board + * layouts (where each part goes on stock) and all the leftover parts that + * couldn't be placed. + */ +export function generateBoardLayouts( + parts: PartToCut[], stock: StockMatrix[], config: Config, - debugObject?: (name: string, object: any) => Promise | void, -) { - const generator = createCutlistGenerator(onshape, config, debugObject); - const parts = await generator.getPartsToCut(project); - return await generator.generateBoardLayouts(parts, stock); -} +): { + layouts: BoardLayout[]; + leftovers: BoardLayoutLeftover[]; +} { + consola.info('Generating board layouts...'); + + // Create geometry for stock and parts + const boards = reduceStockMatrix(stock) + .map((stock) => new Rectangle(stock, 0, 0, stock.width, stock.length)) + .toSorted((a, b) => b.area - a.area); + if (boards.length === 0) { + throw Error('You must include at least 1 stock.'); + } + + // Generate the layouts + const partQueue = [...parts].sort( + (a, b) => b.size.width * b.size.length - b.size.width * a.size.length, + ); + const leftovers: PartToCut[] = []; + const layouts: BoardLayouter[] = []; + while (partQueue.length > 0) { + const part = partQueue.shift()!; + const addedToExisting = layouts.find((layout) => layout.tryAddPart(part)); + if (addedToExisting) { + continue; + } + + const matchingStock = boards.find( + (stock) => stock.data.material === part.material, + ); + if (matchingStock == null) { + consola.warn('Not stock found for ' + part.material); + leftovers.push(part); + continue; + } + + const newLayout = new BoardLayouter(matchingStock, config); + const addedToNew = newLayout.tryAddPart(part); + if (addedToNew) { + layouts.push(newLayout); + } else { + leftovers.push(part); + } + } -export function createCutlistGenerator( - onshape: OnshapeApiClient, - config: Config, - debugObject?: (name: string, object: any) => Promise | void, -) { return { - getPartsToCut: async (project: Project): Promise => { - const did = project.source.id; - - consola.info('Getting document info...'); - const document = await onshape.getDocument(did); - await debugObject?.('document', document); - const wvmid = document.defaultWorkspace.id; - - let eid = project.source.assemblyId; - if (!eid) { - consola.info('Assembly ID not provided, finding first assembly...'); - const assemblies = await onshape.getAssemblies(did, wvmid); - await debugObject?.('assemblies', assemblies); - consola.log(`Assemblies found: ${assemblies.length}`); - if (assemblies.length === 0) { - throw Error(`No assemblies found for ${document.name}`); - } - consola.info(`Using "${assemblies[0].name}"`); - eid = assemblies[0].id; - } - - const bom = await onshape.getAssemblyBom(did, wvmid, eid); - await debugObject?.('bom', bom); - - const quantityHeaderId = bom.headers.find( - (header) => header.propertyName === 'quantity', - )?.id; - if (quantityHeaderId == null) { - consola.log('Headers:', bom.headers); - throw Error('Could not find quantity column in BOM'); - } - - const nameHeaderId = bom.headers.find( - (header) => header.propertyName === 'name', - )?.id; - if (nameHeaderId == null) { - consola.log('Headers:', bom.headers); - throw Error('Could not find name column in BOM'); - } - - const materialHeaderId = bom.headers.find( - (header) => header.propertyName === 'material', - )?.id; - if (materialHeaderId == null) { - consola.log('Headers:', bom.headers); - throw Error('Could not find material column in BOM'); - } - - consola.info(`Loading part details: ${bom.rows.length}`); - const partGroups = await p(bom.rows) - .map(async ({ itemSource, headerIdToValue }) => { - const bounds = await onshape.getPartBoundingBox( - itemSource.documentId, - itemSource.wvmType, - itemSource.wvmId, - itemSource.elementId, - itemSource.partId, - ); - const material = headerIdToValue[materialHeaderId] as any; - return { - size: { - width: bounds.highY - bounds.lowY, - length: bounds.highX - bounds.lowX, - thickness: bounds.highZ - bounds.lowZ, - }, - quantity: Number(headerIdToValue[quantityHeaderId]), - name: String(headerIdToValue[nameHeaderId]), - material: material?.displayName ?? 'Unknown', - }; - }) - .map((info, infoI) => - Array.from({ length: info.quantity }).map((_, i) => ({ - name: info.name, - partNumber: infoI + 1, - instanceNumber: i + 1, - size: info.size, - material: info.material, - })), - ).promise; - const parts = partGroups.flat(); - await debugObject?.('parts', parts); - consola.info('Total parts:', parts.length); - return parts.flat(); - }, - - generateBoardLayouts: async ( - parts: PartToCut[], - availableStock: StockMatrix[], - ): Promise<{ layouts: BoardLayout[]; leftovers: PartToCut[] }> => { - consola.info('Generating board layouts...'); - - // Create geometry for stock and parts - const stockRectangles = reduceStockMatrix(availableStock) - .map((stock) => new Rectangle(stock, 0, 0, stock.width, stock.length)) - .toSorted((a, b) => b.area - a.area); - await debugObject?.('stock-rectangles', stockRectangles); - if (stockRectangles.length === 0) { - throw Error('You must include at least 1 stock.'); - } - - // Generate the layouts - const partQueue = [...parts].sort( - (a, b) => b.size.width * b.size.length - b.size.width * a.size.length, - ); - const leftovers: PartToCut[] = []; - const layouts: BoardLayout[] = []; - while (partQueue.length > 0) { - const part = partQueue.shift()!; - const addedToExisting = layouts.find((layout) => - layout.tryAddPart(part), - ); - if (addedToExisting) { - continue; - } - - const matchingStock = stockRectangles.find( - (stock) => stock.data.material === part.material, - ); - if (matchingStock == null) { - consola.warn('Not stock found for ' + part.material); - leftovers.push(part); - continue; - } - - const newLayout = new BoardLayout(matchingStock, config); - const addedToNew = newLayout.tryAddPart(part); - if (addedToNew) { - layouts.push(newLayout); - } else { - leftovers.push(part); - } - } - debugObject?.('layouts', layouts); - debugObject?.('leftovers', leftovers); - - const optimizedLayouts = layouts.map((layout) => - layout.reduceStock(stockRectangles), - ); - - return { layouts: optimizedLayouts, leftovers }; - }, + layouts: layouts.map((layout) => + layout.reduceStock(boards).toBoardLayout(), + ), + leftovers: leftovers.map((item) => ({ + instanceNumber: item.instanceNumber, + partNumber: item.partNumber, + name: item.name, + material: item.material, + lengthM: item.size.length, + widthM: item.size.width, + thicknessM: item.size.thickness, + })), }; } +/** + * Given a stock matrix, reduce it down to the individual boards available. + */ export function reduceStockMatrix(matrix: StockMatrix[]): Stock[] { return matrix.flatMap((item) => item.length.flatMap((length) => diff --git a/npm/src/onshape.ts b/npm/src/onshape.ts index 80cb9b6..1cfca69 100644 --- a/npm/src/onshape.ts +++ b/npm/src/onshape.ts @@ -1,16 +1,106 @@ +import type { PartToCut } from './types'; +import type { $Fetch } from 'ofetch'; import { createFetch } from 'ofetch'; import * as base64 from 'base64-js'; import consola from 'consola'; +import { p } from '@antfu/utils'; -export function defineOnshapeApi(config: { - baseUrl?: string; - auth?: { - accessKey: string; - secretKey: string; +export interface OnshapeLoader { + getParts(url: string): Promise; + getParts(ids: OnshapeProjectIds): Promise; + getDocument(did: string): Promise; + fetch: $Fetch; +} + +export function defineOnshapeLoader(config?: OnshapeApiConfig): OnshapeLoader { + const api = defineOnshapeApi(config); + + const getIds = (arg0: string | OnshapeProjectIds): OnshapeProjectIds => + typeof arg0 === 'string' ? parseOnshapeUrl(arg0) : arg0; + + const getBom = async (ids: OnshapeProjectIds) => { + if (ids.wvmid == null) { + const document = await api.getDocument(ids.did); + ids.wvmid = document.defaultWorkspace.id; + } + return await api.getAssemblyBom(ids.did, ids.wvmid, ids.eid); + }; + + const getPartsToCut = async (bom: Onshape.Bom): Promise => { + const quantityHeaderId = bom.headers.find( + (header) => header.propertyName === 'quantity', + )?.id; + if (quantityHeaderId == null) { + consola.log('Headers:', bom.headers); + throw Error('Could not find quantity column in BOM'); + } + + const nameHeaderId = bom.headers.find( + (header) => header.propertyName === 'name', + )?.id; + if (nameHeaderId == null) { + consola.log('Headers:', bom.headers); + throw Error('Could not find name column in BOM'); + } + + const materialHeaderId = bom.headers.find( + (header) => header.propertyName === 'material', + )?.id; + if (materialHeaderId == null) { + consola.log('Headers:', bom.headers); + throw Error('Could not find material column in BOM'); + } + + consola.info(`Loading part details: ${bom.rows.length}`); + const partGroups = await p(bom.rows) + .map(async ({ itemSource, headerIdToValue }) => { + const bounds = await api.getPartBoundingBox( + itemSource.documentId, + itemSource.wvmType, + itemSource.wvmId, + itemSource.elementId, + itemSource.partId, + ); + const material = headerIdToValue[materialHeaderId] as any; + return { + size: { + width: bounds.highY - bounds.lowY, + length: bounds.highX - bounds.lowX, + thickness: bounds.highZ - bounds.lowZ, + }, + quantity: Number(headerIdToValue[quantityHeaderId]), + name: String(headerIdToValue[nameHeaderId]), + material: material?.displayName ?? 'Unknown', + }; + }) + .map((info, infoI) => + Array.from({ length: info.quantity }).map((_, i) => ({ + name: info.name, + partNumber: infoI + 1, + instanceNumber: i + 1, + size: info.size, + material: info.material, + })), + ).promise; + const parts = partGroups.flat(); + consola.info('Total parts:', parts.length); + return parts.flat(); + }; + + return { + fetch: api.fetch, + getParts: async (arg0) => { + const ids = getIds(arg0); + const bom = await getBom(ids); + return await getPartsToCut(bom); + }, + getDocument: async (did) => api.getDocument(did), }; -}) { +} + +function defineOnshapeApi(config?: OnshapeApiConfig) { const getAuthHeaders = () => { - if (config.auth == null) return undefined; + if (config?.auth == null) return undefined; const encoded = base64.fromByteArray( Uint8Array.from( @@ -25,7 +115,7 @@ export function defineOnshapeApi(config: { }; const fetch = createFetch({ defaults: { - baseURL: config.baseUrl ?? 'https://cad.onshape.com/api/v6', + baseURL: config?.baseUrl ?? 'https://cad.onshape.com/api/v6', headers: getAuthHeaders(), onResponseError(context) { consola.error(context.response._data); @@ -59,15 +149,16 @@ export function defineOnshapeApi(config: { }; } -export type OnshapeApiClient = ReturnType; - -export namespace Onshape { +namespace Onshape { export interface Document { id: string; name: string; thumbnail: { href: string; }; + owner: { + name: string; + }; defaultWorkspace: { id: string; name: string; @@ -108,3 +199,69 @@ export namespace Onshape { lowX: number; } } + +/** + * Return the project IDs based on a URL, or throw an error if invalid. + */ +export function parseOnshapeUrl(url: string): OnshapeProjectIds { + const path = new URL(url).pathname; + const matches = + /^\/documents\/(?.*?)\/.*?\/(?.*?)\/e\/(?.*?)$/.exec(path); + if (matches?.groups == null) + throw Error('Onshape URL does not have a valid path: ' + path); + + return { + did: matches.groups.did, + wvmid: matches.groups.wvmid, + eid: matches.groups.eid, + }; +} + +/** + * Apart of the project's URL when opened in your browser: + * ``` + * https://cad.onshape.com/documents/{did}/w/{wvmid}/e/{eid} + * ``` + */ +export interface OnshapeProjectIds { + /** + * Apart of the project's URL when opened in your browser: + * ``` + * https://cad.onshape.com/documents/{did}/w/{wvmid}/e/{eid} + * ``` + */ + did: string; + /** + * Apart of the project's URL when opened in your browser: + * ``` + * https://cad.onshape.com/documents/{did}/w/{wvmid}/e/{eid} + * ``` + */ + wvmid?: string; + /** + * Apart of the project's URL when opened in your browser: + * ``` + * https://cad.onshape.com/documents/{did}/w/{wvmid}/e/{eid} + * ``` + */ + eid: string; +} + +/** + * Create or get from . + */ +export interface OnshapeAuth { + /** + * Create or get from . + */ + accessKey: string; + /** + * Create or get from . + */ + secretKey: string; +} + +export interface OnshapeApiConfig { + baseUrl?: string; + auth?: OnshapeAuth; +} diff --git a/npm/src/types.ts b/npm/src/types.ts index 2ec69ce..ab060d5 100644 --- a/npm/src/types.ts +++ b/npm/src/types.ts @@ -1,21 +1,37 @@ import { z } from 'zod'; -export const ProjectSource = z.object({ - type: z.literal('onshape'), - id: z.string(), - assemblyId: z.string().optional(), -}); -export type ProjectSource = z.infer; - +/** + * A number in meters or a string with unit suffix ("1in"). + */ const Distance = z.union([z.number(), z.string()]); +type Distance = z.infer; +/** + * Contains the material and dimensions for a single panel or board. + */ export interface Stock { + /** + * The material name, matching what is set in Onshape. + */ material: string; + /** + * In meters + */ thickness: number; + /** + * In meters + */ width: number; + /** + * In meters + */ length: number; } +/** + * For a material, define a combination of widths, lengths, and thicknesses + * that can be combined to form multiple stocks. + */ export const StockMatrix = z.object({ material: z.string(), thickness: z.array(Distance), @@ -24,25 +40,76 @@ export const StockMatrix = z.object({ }); export type StockMatrix = z.infer; -export const Project = z.object({ - source: ProjectSource, -}); -export type Project = z.infer; - +/** + * Part info, material, and size. Everything needed to know how to layout the board on stock. + */ export interface PartToCut { partNumber: number; instanceNumber: number; name: string; material: string; size: { + /** + * In meters + */ width: number; + /** + * In meters + */ length: number; + /** + * In meters + */ thickness: number; }; } +/** + * Options for generating the board layouts. + */ export const Config = z.object({ + /** + * The blade kerf, usually around 0.125 inches. + */ bladeWidth: Distance.default('0.125in'), + /** + * The optimization method when laying out the parts on the stock. + * - `"space"`: Pack as many parts onto each peice of stock as possible + * - `"cuts"`: Generate board layouts optimizing for a minimal number of + * cuts. This usually results in stacking peices with the same width in a + * column, making it easier to cut out. + */ optimize: z.union([z.literal('space'), z.literal('cuts')]).default('cuts'), }); export type Config = z.infer; + +export interface BoardLayout { + stock: BoardLayoutStock; + placements: BoardLayoutPlacement[]; +} + +export interface BoardLayoutStock { + material: string; + widthM: number; + lengthM: number; + thicknessM: number; +} + +export interface BoardLayoutLeftover { + partNumber: number; + instanceNumber: number; + name: string; + material: string; + widthM: number; + lengthM: number; + thicknessM: number; +} + +export interface BoardLayoutPlacement extends BoardLayoutLeftover { + xM: number; + yM: number; + leftM: number; + rightM: number; + topM: number; + bottomM: number; +} diff --git a/package.json b/package.json index 062c030..571fc0f 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ }, "dependencies": { "@aklinker1/check": "^1.3.1", - "standard-version": "^9.5.0" + "standard-version": "^9.5.0", + "vue-tsc": "^2.0.10" } }