altium-toolkit 1.0.8 → 1.0.9
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/README.md +18 -6
- package/docs/api.md +78 -16
- package/docs/model-format.md +229 -8
- package/docs/schemas/altium_toolkit/netlist_a1.schema.json +47 -0
- package/docs/schemas/altium_toolkit/normalized_model_a1.schema.json +1661 -104
- package/docs/schemas/altium_toolkit/pcb_svg_semantics_a1.schema.json +59 -0
- package/docs/schemas/altium_toolkit/project_bundle_a1.schema.json +57 -0
- package/docs/schemas/altium_toolkit/schematic_svg_semantics_a1.schema.json +50 -0
- package/docs/testing.md +9 -3
- package/package.json +1 -1
- package/spec/library-scope.md +7 -1
- package/src/core/altium/AltiumLayoutParser.mjs +104 -8
- package/src/core/altium/AltiumParser.mjs +191 -45
- package/src/core/altium/EmbeddedFileInventoryBuilder.mjs +255 -0
- package/src/core/altium/IntLibModelParser.mjs +240 -0
- package/src/core/altium/IntLibStreamExtractor.mjs +366 -0
- package/src/core/altium/LibraryRenderManifestBuilder.mjs +417 -0
- package/src/core/altium/LibrarySearchIndex.mjs +215 -0
- package/src/core/altium/NormalizedModelSchema.mjs +36 -0
- package/src/core/altium/PcbCustomPadShapeParser.mjs +244 -0
- package/src/core/altium/PcbDefaultsParser.mjs +171 -0
- package/src/core/altium/PcbDimensionParser.mjs +229 -0
- package/src/core/altium/PcbEmbeddedModelExtractor.mjs +232 -6
- package/src/core/altium/PcbExtendedPrimitiveInformationParser.mjs +256 -0
- package/src/core/altium/PcbLibModelParser.mjs +235 -14
- package/src/core/altium/PcbLibStreamExtractor.mjs +62 -4
- package/src/core/altium/PcbMaskPasteResolver.mjs +354 -0
- package/src/core/altium/PcbMechanicalLayerPairParser.mjs +204 -0
- package/src/core/altium/PcbModelParser.mjs +466 -28
- package/src/core/altium/PcbOwnershipGraphBuilder.mjs +245 -0
- package/src/core/altium/PcbPadPrimitiveParser.mjs +78 -65
- package/src/core/altium/PcbPadStackParser.mjs +58 -0
- package/src/core/altium/PcbPickPlacePositionResolver.mjs +217 -0
- package/src/core/altium/PcbPrimitiveParameterParser.mjs +3 -2
- package/src/core/altium/PcbRawRecordRegistry.mjs +121 -130
- package/src/core/altium/PcbRegionPrimitiveParser.mjs +5 -1
- package/src/core/altium/PcbRuleParser.mjs +354 -33
- package/src/core/altium/PcbSidecarRecordParser.mjs +177 -0
- package/src/core/altium/PcbSpecialStringResolver.mjs +220 -0
- package/src/core/altium/PcbStatisticsBuilder.mjs +532 -0
- package/src/core/altium/PcbStreamExtractor.mjs +111 -4
- package/src/core/altium/PcbTextPrimitiveParser.mjs +60 -0
- package/src/core/altium/PcbUnionParser.mjs +307 -0
- package/src/core/altium/PcbViaStackParser.mjs +98 -10
- package/src/core/altium/PcbViaStructureParser.mjs +335 -0
- package/src/core/altium/PrintableTextDecoder.mjs +53 -3
- package/src/core/altium/PrjPcbModelParser.mjs +257 -5
- package/src/core/altium/ProjectAnnotationParser.mjs +205 -0
- package/src/core/altium/ProjectDesignBundleBuilder.mjs +477 -0
- package/src/core/altium/ProjectNetlistExporter.mjs +499 -0
- package/src/core/altium/ProjectOutJobDigestBuilder.mjs +109 -0
- package/src/core/altium/ProjectVariantViewBuilder.mjs +334 -0
- package/src/core/altium/SchematicBindingProvenanceParser.mjs +223 -0
- package/src/core/altium/SchematicComponentOwnerTextResolver.mjs +312 -0
- package/src/core/altium/SchematicComponentTextResolver.mjs +72 -19
- package/src/core/altium/SchematicConnectivityQaBuilder.mjs +271 -0
- package/src/core/altium/SchematicCrossSheetConnectorParser.mjs +140 -0
- package/src/core/altium/SchematicDirectiveParser.mjs +312 -0
- package/src/core/altium/SchematicDisplayModeCatalogParser.mjs +231 -0
- package/src/core/altium/SchematicHarnessParser.mjs +302 -0
- package/src/core/altium/SchematicImageParser.mjs +474 -3
- package/src/core/altium/SchematicImplementationParser.mjs +518 -0
- package/src/core/altium/SchematicNetlistBuilder.mjs +15 -2
- package/src/core/altium/SchematicOwnershipGraphParser.mjs +195 -0
- package/src/core/altium/SchematicPinParser.mjs +84 -1
- package/src/core/altium/SchematicPrimitiveParser.mjs +301 -0
- package/src/core/altium/SchematicProjectParameterResolver.mjs +361 -0
- package/src/core/altium/SchematicQaReportBuilder.mjs +284 -0
- package/src/core/altium/SchematicRecordTypeRegistry.mjs +137 -0
- package/src/core/altium/SchematicRepeatedChannelParser.mjs +229 -0
- package/src/core/altium/SchematicStreamExtractor.mjs +10 -1
- package/src/core/altium/SchematicTemplateParser.mjs +256 -0
- package/src/core/altium/SchematicTextParser.mjs +123 -0
- package/src/core/ole/OleCompoundDocument.mjs +20 -0
- package/src/parser.mjs +29 -0
- package/src/styles/altium-renderers.css +19 -0
- package/src/ui/PcbBarcodeTextRenderer.mjs +436 -0
- package/src/ui/PcbInteractionIndex.mjs +9 -4
- package/src/ui/PcbScene3dBuilder.mjs +137 -3
- package/src/ui/PcbScene3dModelRegistry.mjs +74 -0
- package/src/ui/PcbSvgRenderer.mjs +1187 -34
- package/src/ui/PcbTextPrimitiveRenderer.mjs +193 -7
- package/src/ui/SchematicNoteRenderer.mjs +9 -2
- package/src/ui/SchematicOwnerPinLabelLayout.mjs +206 -0
- package/src/ui/SchematicShapeRenderer.mjs +362 -0
- package/src/ui/SchematicSvgRenderer.mjs +1442 -92
- package/src/ui/SchematicTypography.mjs +48 -5
- package/src/ui/TextGeometrySidecarBuilder.mjs +147 -0
|
@@ -208,6 +208,49 @@ export class PcbScene3dModelRegistry {
|
|
|
208
208
|
return this.#resolveExplicitMatch(componentBody?.name)
|
|
209
209
|
}
|
|
210
210
|
|
|
211
|
+
/**
|
|
212
|
+
* Resolves a project-level full board assembly model for one PCB document.
|
|
213
|
+
* @param {{ fileName?: string }} documentModel
|
|
214
|
+
* @returns {{ origin: 'board-assembly', file?: File | Blob | null, name: string, relativePath: string, format: string } | null}
|
|
215
|
+
*/
|
|
216
|
+
resolveBoardAssemblyModel(documentModel) {
|
|
217
|
+
const normalizedBoardBaseName = PcbScene3dModelRegistry.#normalizeToken(
|
|
218
|
+
PcbScene3dModelRegistry.#basenameWithoutExtension(
|
|
219
|
+
documentModel?.fileName
|
|
220
|
+
)
|
|
221
|
+
)
|
|
222
|
+
if (!normalizedBoardBaseName) {
|
|
223
|
+
return null
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const rankedMatches = this.#modelFiles
|
|
227
|
+
.filter(
|
|
228
|
+
(file) =>
|
|
229
|
+
file.normalizedBaseName === normalizedBoardBaseName &&
|
|
230
|
+
PcbScene3dModelRegistry.#isBoardAssemblyPath(
|
|
231
|
+
file.relativePath
|
|
232
|
+
)
|
|
233
|
+
)
|
|
234
|
+
.sort(
|
|
235
|
+
(left, right) =>
|
|
236
|
+
PcbScene3dModelRegistry.#formatRank(left.format) -
|
|
237
|
+
PcbScene3dModelRegistry.#formatRank(right.format)
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
if (!rankedMatches.length) {
|
|
241
|
+
return null
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const matchedFile = rankedMatches[0]
|
|
245
|
+
return {
|
|
246
|
+
origin: 'board-assembly',
|
|
247
|
+
file: matchedFile.file,
|
|
248
|
+
name: matchedFile.name,
|
|
249
|
+
relativePath: matchedFile.relativePath,
|
|
250
|
+
format: matchedFile.format
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
211
254
|
/**
|
|
212
255
|
* Normalizes one embedded payload for registry lookup.
|
|
213
256
|
* @param {{ id?: string, checksum?: number | null, name?: string, format?: string, payloadText?: string, sourceStream?: string }} model
|
|
@@ -295,6 +338,37 @@ export class PcbScene3dModelRegistry {
|
|
|
295
338
|
return format === 'wrl' ? 0 : 1
|
|
296
339
|
}
|
|
297
340
|
|
|
341
|
+
/**
|
|
342
|
+
* Checks whether one model path is in a conventional board model folder.
|
|
343
|
+
* @param {string | undefined} relativePath
|
|
344
|
+
* @returns {boolean}
|
|
345
|
+
*/
|
|
346
|
+
static #isBoardAssemblyPath(relativePath) {
|
|
347
|
+
return String(relativePath || '')
|
|
348
|
+
.replaceAll('\\', '/')
|
|
349
|
+
.split('/')
|
|
350
|
+
.some(
|
|
351
|
+
(part) =>
|
|
352
|
+
PcbScene3dModelRegistry.#normalizeToken(part) === '3dbodies'
|
|
353
|
+
)
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Returns one path basename without its extension.
|
|
358
|
+
* @param {string | undefined} filePath
|
|
359
|
+
* @returns {string}
|
|
360
|
+
*/
|
|
361
|
+
static #basenameWithoutExtension(filePath) {
|
|
362
|
+
const baseName =
|
|
363
|
+
String(filePath || '')
|
|
364
|
+
.replaceAll('\\', '/')
|
|
365
|
+
.split('/')
|
|
366
|
+
.filter(Boolean)
|
|
367
|
+
.at(-1) || ''
|
|
368
|
+
|
|
369
|
+
return baseName.replace(/\.[^.]+$/u, '')
|
|
370
|
+
}
|
|
371
|
+
|
|
298
372
|
/**
|
|
299
373
|
* Normalizes one lookup token.
|
|
300
374
|
* @param {string | undefined} value
|