altium-toolkit 0.1.22 → 1.0.1

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.
@@ -3,6 +3,7 @@
3
3
  // SPDX-License-Identifier: GPL-3.0-or-later
4
4
 
5
5
  import { PcbEdgeFacingGlyphNormalizer } from './PcbEdgeFacingGlyphNormalizer.mjs'
6
+ import { PcbScene3dBoardOutlineRefiner } from './PcbScene3dBoardOutlineRefiner.mjs'
6
7
  import { PcbScene3dDrillCutoutBuilder } from './PcbScene3dDrillCutoutBuilder.mjs'
7
8
  import { PcbFootprintPrimitiveSelector } from './PcbFootprintPrimitiveSelector.mjs'
8
9
  import { PcbScene3dPackages } from './PcbScene3dPackages.mjs'
@@ -99,7 +100,7 @@ export class PcbScene3dBuilder {
99
100
  appearance3d
100
101
  )
101
102
 
102
- return {
103
+ const sceneDescription = {
103
104
  sourceFormat: 'altium',
104
105
  board,
105
106
  components: components.map((component) =>
@@ -139,6 +140,11 @@ export class PcbScene3dBuilder {
139
140
  }
140
141
  }
141
142
  }
143
+
144
+ return PcbScene3dBoardOutlineRefiner.refine(
145
+ sceneDescription,
146
+ documentModel
147
+ )
142
148
  }
143
149
 
144
150
  /**
@@ -729,6 +735,11 @@ export class PcbScene3dBuilder {
729
735
  boardOutline
730
736
  )
731
737
 
738
+ const drillCutouts = PcbScene3dDrillCutoutBuilder.buildCutouts(
739
+ pads,
740
+ vias
741
+ )
742
+
732
743
  return {
733
744
  ...normalized,
734
745
  denseOverlayArtwork,
@@ -743,11 +754,11 @@ export class PcbScene3dBuilder {
743
754
  side
744
755
  ),
745
756
  tracks: normalized.tracks,
746
- fills: PcbScene3dDrillCutoutBuilder.clipFills(
757
+ fills: PcbScene3dDrillCutoutBuilder.clipFillsWithCutouts(
747
758
  fillsWithRegions,
748
- pads,
749
- vias
750
- )
759
+ drillCutouts
760
+ ),
761
+ drillCutouts: drillCutouts.map((cutout) => cutout.points)
751
762
  }
752
763
  }
753
764
 
@@ -10,6 +10,19 @@ export class PcbScene3dDrillCutoutBuilder {
10
10
  static #SLOT_CAP_SEGMENTS = 12
11
11
  static #EPSILON = 0.001
12
12
 
13
+ /**
14
+ * Builds all known drill cutout contours.
15
+ * @param {{ x?: number, y?: number, holeDiameter?: number, drillDiameter?: number, holeSlotLength?: number, slotLength?: number, rotation?: number, holeRotation?: number }[]} pads
16
+ * @param {{ x?: number, y?: number, holeDiameter?: number, drillDiameter?: number }[]} vias
17
+ * @returns {{ x: number, y: number, bounds: { minX: number, minY: number, maxX: number, maxY: number }, points: { x: number, y: number }[] }[]}
18
+ */
19
+ static buildCutouts(pads, vias) {
20
+ return [
21
+ ...PcbScene3dDrillCutoutBuilder.#buildPadCutouts(pads),
22
+ ...PcbScene3dDrillCutoutBuilder.#buildViaCutouts(vias)
23
+ ]
24
+ }
25
+
13
26
  /**
14
27
  * Adds drill-shaped holes to every fill intersected by a pad or via drill.
15
28
  * @param {{ points?: { x: number, y: number }[], holes?: { x: number, y: number }[][], x1?: number, y1?: number, x2?: number, y2?: number }[]} fills
@@ -18,9 +31,20 @@ export class PcbScene3dDrillCutoutBuilder {
18
31
  * @returns {{ points?: { x: number, y: number }[], holes?: { x: number, y: number }[][], x1?: number, y1?: number, x2?: number, y2?: number }[]}
19
32
  */
20
33
  static clipFills(fills, pads, vias) {
21
- const cutouts = PcbScene3dDrillCutoutBuilder.#buildCutouts(pads, vias)
34
+ return PcbScene3dDrillCutoutBuilder.clipFillsWithCutouts(
35
+ fills,
36
+ PcbScene3dDrillCutoutBuilder.buildCutouts(pads, vias)
37
+ )
38
+ }
22
39
 
23
- if (!cutouts.length) {
40
+ /**
41
+ * Adds drill-shaped holes from precomputed cutouts.
42
+ * @param {{ points?: { x: number, y: number }[], holes?: { x: number, y: number }[][], x1?: number, y1?: number, x2?: number, y2?: number }[]} fills
43
+ * @param {{ x: number, y: number, bounds: { minX: number, minY: number, maxX: number, maxY: number }, points: { x: number, y: number }[] }[]} cutouts
44
+ * @returns {{ points?: { x: number, y: number }[], holes?: { x: number, y: number }[][], x1?: number, y1?: number, x2?: number, y2?: number }[]}
45
+ */
46
+ static clipFillsWithCutouts(fills, cutouts) {
47
+ if (!Array.isArray(cutouts) || !cutouts.length) {
24
48
  return fills
25
49
  }
26
50
 
@@ -48,19 +72,6 @@ export class PcbScene3dDrillCutoutBuilder {
48
72
  })
49
73
  }
50
74
 
51
- /**
52
- * Builds all known drill cutout contours.
53
- * @param {{ x?: number, y?: number, holeDiameter?: number, drillDiameter?: number, holeSlotLength?: number, slotLength?: number, rotation?: number, holeRotation?: number }[]} pads
54
- * @param {{ x?: number, y?: number, holeDiameter?: number, drillDiameter?: number }[]} vias
55
- * @returns {{ x: number, y: number, bounds: { minX: number, minY: number, maxX: number, maxY: number }, points: { x: number, y: number }[] }[]}
56
- */
57
- static #buildCutouts(pads, vias) {
58
- return [
59
- ...PcbScene3dDrillCutoutBuilder.#buildPadCutouts(pads),
60
- ...PcbScene3dDrillCutoutBuilder.#buildViaCutouts(vias)
61
- ]
62
- }
63
-
64
75
  /**
65
76
  * Builds drill contours for drilled pads.
66
77
  * @param {{ x?: number, y?: number, holeDiameter?: number, drillDiameter?: number, holeSlotLength?: number, slotLength?: number, rotation?: number, holeRotation?: number }[]} pads