@tscircuit/pcb-viewer 1.11.296 → 1.11.297

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/dist/index.js CHANGED
@@ -6019,6 +6019,15 @@ var getBoundsOfPcbElements = (elements) => {
6019
6019
  let maxY = Number.NEGATIVE_INFINITY;
6020
6020
  for (const elm of elements) {
6021
6021
  if (!elm.type.startsWith("pcb_")) continue;
6022
+ if (elm.type === "pcb_smtpad" && elm.shape === "polygon" && Array.isArray(elm.points)) {
6023
+ for (const point of elm.points) {
6024
+ minX = Math.min(minX, point.x);
6025
+ minY = Math.min(minY, point.y);
6026
+ maxX = Math.max(maxX, point.x);
6027
+ maxY = Math.max(maxY, point.y);
6028
+ }
6029
+ continue;
6030
+ }
6022
6031
  let centerX;
6023
6032
  let centerY;
6024
6033
  let width;
@@ -8047,87 +8056,6 @@ var convertElementToPrimitives = (element, allElements) => {
8047
8056
  });
8048
8057
  return primitives;
8049
8058
  }
8050
- case "pcb_silkscreen_rect": {
8051
- return [
8052
- {
8053
- _pcb_drawing_object_id: `rect_${globalPcbDrawingObjectCount++}`,
8054
- pcb_drawing_type: "rect",
8055
- x: element.center.x,
8056
- y: element.center.y,
8057
- w: element.width,
8058
- h: element.height,
8059
- layer: element.layer === "bottom" ? "bottom_silkscreen" : "top_silkscreen",
8060
- stroke_width: element.stroke_width,
8061
- is_filled: element.is_filled,
8062
- has_stroke: element.has_stroke,
8063
- is_stroke_dashed: element.is_stroke_dashed,
8064
- roundness: element.corner_radius,
8065
- _element: element
8066
- }
8067
- ];
8068
- }
8069
- case "pcb_silkscreen_circle": {
8070
- return [
8071
- {
8072
- _pcb_drawing_object_id: `circle_${globalPcbDrawingObjectCount++}`,
8073
- pcb_drawing_type: "circle",
8074
- x: element.center.x,
8075
- y: element.center.y,
8076
- r: element.radius,
8077
- layer: element.layer === "bottom" ? "bottom_silkscreen" : "top_silkscreen"
8078
- }
8079
- ];
8080
- }
8081
- case "pcb_silkscreen_oval": {
8082
- return [
8083
- {
8084
- _pcb_drawing_object_id: `oval_${globalPcbDrawingObjectCount++}`,
8085
- pcb_drawing_type: "oval",
8086
- x: element.center.x,
8087
- y: element.center.y,
8088
- rX: element.radius_x / 2,
8089
- rY: element.radius_y / 2,
8090
- layer: element.layer === "bottom" ? "bottom_silkscreen" : "top_silkscreen"
8091
- }
8092
- ];
8093
- }
8094
- // @ts-ignore
8095
- case "pcb_silkscreen_pill": {
8096
- return [
8097
- {
8098
- _pcb_drawing_object_id: `pill_${globalPcbDrawingObjectCount++}`,
8099
- pcb_drawing_type: "pill",
8100
- // @ts-ignore
8101
- x: element.center.x,
8102
- // @ts-ignore
8103
- y: element.center.y,
8104
- // @ts-ignore
8105
- w: element.width,
8106
- // @ts-ignore
8107
- h: element.height,
8108
- layer: (
8109
- // @ts-ignore
8110
- element.layer === "bottom" ? "bottom_silkscreen" : "top_silkscreen"
8111
- )
8112
- }
8113
- ];
8114
- }
8115
- case "pcb_silkscreen_line": {
8116
- return [
8117
- {
8118
- _pcb_drawing_object_id: `line_${globalPcbDrawingObjectCount++}`,
8119
- pcb_drawing_type: "line",
8120
- x1: element.x1,
8121
- y1: element.y1,
8122
- x2: element.x2,
8123
- y2: element.y2,
8124
- width: 0.1,
8125
- // TODO add strokewidth
8126
- squareCap: false,
8127
- layer: element.layer === "bottom" ? "bottom_silkscreen" : "top_silkscreen"
8128
- }
8129
- ];
8130
- }
8131
8059
  case "pcb_fabrication_note_rect": {
8132
8060
  const rectElement = element;
8133
8061
  const layer = rectElement.layer === "bottom" ? "bottom_fabrication" : "top_fabrication";
@@ -8156,73 +8084,28 @@ var convertElementToPrimitives = (element, allElements) => {
8156
8084
  }
8157
8085
  ];
8158
8086
  }
8159
- case "pcb_fabrication_note_path":
8160
- case "pcb_silkscreen_path": {
8161
- const {
8162
- pcb_component_id,
8163
- route,
8164
- // Array<{ x: number, y: number }>
8165
- type
8166
- } = element;
8167
- let layer;
8168
- if (type === "pcb_silkscreen_path") {
8169
- layer = element.layer === "bottom" ? "bottom_silkscreen" : "top_silkscreen";
8170
- return route.slice(0, -1).map((point, index) => {
8171
- const nextPoint = route[index + 1];
8172
- return {
8173
- _pcb_drawing_object_id: `line_${globalPcbDrawingObjectCount++}`,
8174
- pcb_drawing_type: "line",
8175
- x1: point.x,
8176
- y1: point.y,
8177
- x2: nextPoint.x,
8178
- y2: nextPoint.y,
8179
- width: element.stroke_width ?? 0.1,
8180
- squareCap: false,
8181
- layer,
8182
- _element: element,
8183
- _parent_pcb_component,
8184
- _parent_source_component,
8185
- _source_port
8186
- };
8187
- }).filter(Boolean);
8188
- } else if (type === "pcb_fabrication_note_path") {
8189
- layer = "top_fabrication";
8190
- return route.slice(0, -1).map((point, index) => {
8191
- const nextPoint = route[index + 1];
8192
- return {
8193
- _pcb_drawing_object_id: `line_${globalPcbDrawingObjectCount++}`,
8194
- pcb_drawing_type: "line",
8195
- x1: point.x,
8196
- y1: point.y,
8197
- x2: nextPoint.x,
8198
- y2: nextPoint.y,
8199
- width: element.stroke_width ?? 0.1,
8200
- squareCap: false,
8201
- layer,
8202
- color: element.color,
8203
- _element: element,
8204
- _parent_pcb_component,
8205
- _parent_source_component,
8206
- _source_port
8207
- };
8208
- }).filter(Boolean);
8209
- }
8210
- }
8211
- case "pcb_silkscreen_text": {
8212
- return [
8213
- {
8214
- _pcb_drawing_object_id: `text_${globalPcbDrawingObjectCount++}`,
8215
- pcb_drawing_type: "text",
8216
- x: element.anchor_position.x,
8217
- y: element.anchor_position.y,
8218
- layer: element.layer === "bottom" ? "bottom_silkscreen" : "top_silkscreen",
8219
- align: element.anchor_alignment ?? "center",
8220
- text: element.text,
8221
- size: element.font_size,
8222
- // Add the required 'size' property
8223
- ccw_rotation: element.ccw_rotation
8224
- }
8225
- ];
8087
+ case "pcb_fabrication_note_path": {
8088
+ const { route } = element;
8089
+ const layer = "top_fabrication";
8090
+ return route.slice(0, -1).map((point, index) => {
8091
+ const nextPoint = route[index + 1];
8092
+ return {
8093
+ _pcb_drawing_object_id: `line_${globalPcbDrawingObjectCount++}`,
8094
+ pcb_drawing_type: "line",
8095
+ x1: point.x,
8096
+ y1: point.y,
8097
+ x2: nextPoint.x,
8098
+ y2: nextPoint.y,
8099
+ width: element.stroke_width ?? 0.1,
8100
+ squareCap: false,
8101
+ layer,
8102
+ color: element.color,
8103
+ _element: element,
8104
+ _parent_pcb_component,
8105
+ _parent_source_component,
8106
+ _source_port
8107
+ };
8108
+ }).filter(Boolean);
8226
8109
  }
8227
8110
  case "pcb_copper_text": {
8228
8111
  return convertPcbCopperTextToPrimitive(element, {
@@ -9859,6 +9742,27 @@ var drawPrimitives = (drawer, primitives) => {
9859
9742
  }
9860
9743
  };
9861
9744
 
9745
+ // src/lib/draw-silkscreen.ts
9746
+ import {
9747
+ DEFAULT_PCB_COLOR_MAP,
9748
+ CircuitToCanvasDrawer
9749
+ } from "circuit-to-canvas";
9750
+ var PCB_VIEWER_COLOR_MAP = {
9751
+ ...DEFAULT_PCB_COLOR_MAP,
9752
+ silkscreen: {
9753
+ top: colors_default.board.f_silks,
9754
+ bottom: colors_default.board.b_silks
9755
+ }
9756
+ };
9757
+ function drawSilkscreenElementsForLayer(canvas, elements, layer, realToCanvasMat) {
9758
+ const drawer = new CircuitToCanvasDrawer(canvas);
9759
+ drawer.configure({
9760
+ colorOverrides: PCB_VIEWER_COLOR_MAP
9761
+ });
9762
+ drawer.realToCanvasMat = realToCanvasMat;
9763
+ drawer.drawElements(elements, { layers: [layer] });
9764
+ }
9765
+
9862
9766
  // src/components/CanvasPrimitiveRenderer.tsx
9863
9767
  import { jsx as jsx3, jsxs } from "react/jsx-runtime";
9864
9768
  var orderedLayers = [
@@ -9883,6 +9787,7 @@ var orderedLayers = [
9883
9787
  ];
9884
9788
  var CanvasPrimitiveRenderer = ({
9885
9789
  primitives,
9790
+ elements,
9886
9791
  transform,
9887
9792
  grid,
9888
9793
  width = 500,
@@ -9910,8 +9815,28 @@ var CanvasPrimitiveRenderer = ({
9910
9815
  drawer.foregroundLayer = selectedLayer;
9911
9816
  const filteredPrimitives = isShowingSolderMask ? primitives : primitives.filter((p) => !p.layer?.includes("soldermask"));
9912
9817
  drawPrimitives(drawer, filteredPrimitives);
9818
+ if (transform) {
9819
+ const topSilkscreenCanvas = canvasRefs.current.top_silkscreen;
9820
+ if (topSilkscreenCanvas) {
9821
+ drawSilkscreenElementsForLayer(
9822
+ topSilkscreenCanvas,
9823
+ elements,
9824
+ "top_silkscreen",
9825
+ transform
9826
+ );
9827
+ }
9828
+ const bottomSilkscreenCanvas = canvasRefs.current.bottom_silkscreen;
9829
+ if (bottomSilkscreenCanvas) {
9830
+ drawSilkscreenElementsForLayer(
9831
+ bottomSilkscreenCanvas,
9832
+ elements,
9833
+ "bottom_silkscreen",
9834
+ transform
9835
+ );
9836
+ }
9837
+ }
9913
9838
  drawer.orderAndFadeLayers();
9914
- }, [primitives, transform, selectedLayer, isShowingSolderMask]);
9839
+ }, [primitives, elements, transform, selectedLayer, isShowingSolderMask]);
9915
9840
  return /* @__PURE__ */ jsxs(
9916
9841
  "div",
9917
9842
  {
@@ -13946,7 +13871,7 @@ import { css as css3 } from "@emotion/css";
13946
13871
  // package.json
13947
13872
  var package_default = {
13948
13873
  name: "@tscircuit/pcb-viewer",
13949
- version: "1.11.295",
13874
+ version: "1.11.296",
13950
13875
  main: "dist/index.js",
13951
13876
  type: "module",
13952
13877
  repository: "tscircuit/pcb-viewer",
@@ -13970,7 +13895,7 @@ var package_default = {
13970
13895
  "@semantic-release/npm": "^9.0.1",
13971
13896
  "@semantic-release/release-notes-generator": "^10.0.3",
13972
13897
  "@swc/core": "^1.4.12",
13973
- "@tscircuit/circuit-json-util": "^0.0.72",
13898
+ "@tscircuit/circuit-json-util": "^0.0.75",
13974
13899
  "@tscircuit/eagle-xml-converter": "^1.0.0",
13975
13900
  "@types/bun": "latest",
13976
13901
  "@types/color": "^3.0.6",
@@ -13999,7 +13924,8 @@ var package_default = {
13999
13924
  "@tscircuit/alphabet": "^0.0.9",
14000
13925
  "@tscircuit/math-utils": "^0.0.29",
14001
13926
  "@vitejs/plugin-react": "^5.0.2",
14002
- "circuit-json": "^0.0.342",
13927
+ "circuit-json": "^0.0.347",
13928
+ "circuit-to-canvas": "^0.0.31",
14003
13929
  "circuit-to-svg": "^0.0.271",
14004
13930
  color: "^4.2.3",
14005
13931
  "react-supergrid": "^1.0.10",
@@ -14944,6 +14870,7 @@ var CanvasElementsRenderer = (props) => {
14944
14870
  {
14945
14871
  transform,
14946
14872
  primitives,
14873
+ elements: elementsToRender,
14947
14874
  width: props.width,
14948
14875
  height: props.height,
14949
14876
  grid: props.grid