@windypro-rourou/dsh-eda 0.1.4 → 0.1.6

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.
Files changed (484) hide show
  1. package/README.md +1 -1
  2. package/lib/backend.js +49 -0
  3. package/lib/capabilities.js +6 -2
  4. package/lib/client.js +33 -0
  5. package/lib/index.js +197 -3
  6. package/package.json +10 -1
  7. package/skill/INDEX.md +10 -8
  8. package/skill/README.md +125 -0
  9. package/skill/README.zh-Hans.md +125 -0
  10. package/skill/SKILL.md +746 -746
  11. package/skill/format/index.md +152 -152
  12. package/skill/format/pcb/3d.md +166 -166
  13. package/skill/format/pcb/attr.md +63 -63
  14. package/skill/format/pcb/common.md +306 -306
  15. package/skill/format/pcb/component.md +132 -132
  16. package/skill/format/pcb/dimension.md +58 -58
  17. package/skill/format/pcb/index.md +17 -17
  18. package/skill/format/pcb/obj.md +43 -43
  19. package/skill/format/pcb/pad_via.md +151 -151
  20. package/skill/format/pcb/panel.md +64 -64
  21. package/skill/format/pcb/partition.md +43 -43
  22. package/skill/format/pcb/primitive.md +196 -196
  23. package/skill/format/pcb/rule.md +71 -71
  24. package/skill/format/pcb/shape.md +441 -441
  25. package/skill/format/pcb/text.md +62 -62
  26. package/skill/format/project/blob.md +30 -30
  27. package/skill/format/project/common.md +42 -42
  28. package/skill/format/project/group.md +62 -62
  29. package/skill/format/project/index.md +12 -12
  30. package/skill/format/project/instance.md +32 -32
  31. package/skill/format/project/meta.md +189 -189
  32. package/skill/format/project/variant.md +30 -30
  33. package/skill/format/schematic/attr.md +41 -41
  34. package/skill/format/schematic/common.md +47 -47
  35. package/skill/format/schematic/component.md +91 -91
  36. package/skill/format/schematic/index.md +14 -14
  37. package/skill/format/schematic/obj.md +41 -41
  38. package/skill/format/schematic/pin.md +59 -59
  39. package/skill/format/schematic/shape.md +231 -231
  40. package/skill/format/schematic/structure.md +53 -53
  41. package/skill/format/schematic/table.md +109 -109
  42. package/skill/format/schematic/text.md +47 -47
  43. package/skill/format/schematic/wire.md +132 -132
  44. package/skill/guide/ancillary-projects/easyeda-api-sdk.md +1 -0
  45. package/skill/guide/ancillary-projects/pro-api-types.md +5 -5
  46. package/skill/guide/ancillary-projects.md +10 -10
  47. package/skill/guide/cli.md +1510 -0
  48. package/skill/guide/error-handling.md +38 -38
  49. package/skill/guide/extension-json.md +135 -135
  50. package/skill/guide/extensions-marketplace.md +61 -61
  51. package/skill/guide/how-to-start.md +316 -301
  52. package/skill/guide/i18n.md +57 -57
  53. package/skill/guide/index.md +7 -7
  54. package/skill/guide/inline-frame.md +20 -20
  55. package/skill/guide/invoke-apis.md +81 -81
  56. package/skill/guide/stability.md +37 -37
  57. package/skill/references/_index.md +471 -398
  58. package/skill/references/_quick-reference.md +3103 -3028
  59. package/skill/references/classes/DMT_Board.md +537 -533
  60. package/skill/references/classes/DMT_EditorControl.md +1736 -1736
  61. package/skill/references/classes/DMT_Event.md +356 -356
  62. package/skill/references/classes/DMT_Folder.md +775 -775
  63. package/skill/references/classes/DMT_Panel.md +531 -531
  64. package/skill/references/classes/DMT_Pcb.md +579 -575
  65. package/skill/references/classes/DMT_Project.md +734 -573
  66. package/skill/references/classes/DMT_Schematic.md +1482 -1477
  67. package/skill/references/classes/DMT_SelectControl.md +96 -96
  68. package/skill/references/classes/DMT_Team.md +172 -172
  69. package/skill/references/classes/DMT_Workspace.md +198 -198
  70. package/skill/references/classes/EDA.md +1001 -961
  71. package/skill/references/classes/IPCB_ComplexPolygon.md +299 -299
  72. package/skill/references/classes/IPCB_Polygon.md +175 -175
  73. package/skill/references/classes/IPCB_PrimitiveArc.md +1901 -1901
  74. package/skill/references/classes/IPCB_PrimitiveAttribute.md +2993 -2993
  75. package/skill/references/classes/IPCB_PrimitiveComponent.md +2624 -2627
  76. package/skill/references/classes/IPCB_PrimitiveComponentPad.md +410 -410
  77. package/skill/references/classes/IPCB_PrimitiveDimension.md +1419 -1419
  78. package/skill/references/classes/IPCB_PrimitiveFill.md +1325 -1325
  79. package/skill/references/classes/IPCB_PrimitiveImage.md +1461 -1461
  80. package/skill/references/classes/IPCB_PrimitiveLine.md +1639 -1639
  81. package/skill/references/classes/IPCB_PrimitiveObject.md +1700 -1700
  82. package/skill/references/classes/IPCB_PrimitivePad.md +3155 -3155
  83. package/skill/references/classes/IPCB_PrimitivePolyline.md +1193 -1193
  84. package/skill/references/classes/IPCB_PrimitivePour.md +1858 -1858
  85. package/skill/references/classes/IPCB_PrimitivePoured.md +556 -556
  86. package/skill/references/classes/IPCB_PrimitiveRegion.md +1332 -1332
  87. package/skill/references/classes/IPCB_PrimitiveString.md +2315 -2315
  88. package/skill/references/classes/IPCB_PrimitiveVia.md +1588 -1588
  89. package/skill/references/classes/ISCH_PrimitiveArc.md +1676 -1676
  90. package/skill/references/classes/ISCH_PrimitiveAttribute.md +2541 -2541
  91. package/skill/references/classes/ISCH_PrimitiveBus.md +973 -973
  92. package/skill/references/classes/ISCH_PrimitiveCbbSymbolComponent.md +260 -260
  93. package/skill/references/classes/ISCH_PrimitiveCircle.md +1392 -1392
  94. package/skill/references/classes/ISCH_PrimitiveComponent.md +2910 -2913
  95. package/skill/references/classes/ISCH_PrimitiveComponentPin.md +155 -155
  96. package/skill/references/classes/ISCH_PrimitiveObject.md +960 -960
  97. package/skill/references/classes/ISCH_PrimitivePin.md +2402 -2402
  98. package/skill/references/classes/ISCH_PrimitivePolygon.md +1028 -1028
  99. package/skill/references/classes/ISCH_PrimitiveRectangle.md +1777 -1777
  100. package/skill/references/classes/ISCH_PrimitiveText.md +1771 -1771
  101. package/skill/references/classes/ISCH_PrimitiveWire.md +973 -973
  102. package/skill/references/classes/LIB_3DModel.md +782 -780
  103. package/skill/references/classes/LIB_Cbb.md +957 -957
  104. package/skill/references/classes/LIB_Classification.md +969 -965
  105. package/skill/references/classes/LIB_Device.md +1222 -1221
  106. package/skill/references/classes/LIB_Footprint.md +1298 -1153
  107. package/skill/references/classes/LIB_LibrariesList.md +361 -329
  108. package/skill/references/classes/LIB_PanelLibrary.md +855 -855
  109. package/skill/references/classes/LIB_SelectControl.md +89 -89
  110. package/skill/references/classes/LIB_SimulationModel.md +807 -821
  111. package/skill/references/classes/LIB_Symbol.md +1341 -1195
  112. package/skill/references/classes/PCB_Document.md +1770 -1754
  113. package/skill/references/classes/PCB_Drc.md +3379 -3375
  114. package/skill/references/classes/PCB_Event.md +1166 -1081
  115. package/skill/references/classes/PCB_ImageTool.md +363 -0
  116. package/skill/references/classes/PCB_Layer.md +1915 -1911
  117. package/skill/references/classes/PCB_ManufactureData.md +2968 -2968
  118. package/skill/references/classes/PCB_MathPolygon.md +916 -785
  119. package/skill/references/classes/PCB_Net.md +1128 -1128
  120. package/skill/references/classes/PCB_Primitive.md +217 -217
  121. package/skill/references/classes/PCB_PrimitiveArc.md +820 -894
  122. package/skill/references/classes/PCB_PrimitiveAttribute.md +635 -717
  123. package/skill/references/classes/PCB_PrimitiveComponent.md +1050 -1050
  124. package/skill/references/classes/PCB_PrimitiveDimension.md +789 -833
  125. package/skill/references/classes/PCB_PrimitiveFill.md +783 -861
  126. package/skill/references/classes/PCB_PrimitiveImage.md +803 -875
  127. package/skill/references/classes/PCB_PrimitiveLine.md +787 -858
  128. package/skill/references/classes/PCB_PrimitiveObject.md +796 -800
  129. package/skill/references/classes/PCB_PrimitivePad.md +947 -944
  130. package/skill/references/classes/PCB_PrimitivePolyline.md +744 -819
  131. package/skill/references/classes/PCB_PrimitivePour.md +808 -845
  132. package/skill/references/classes/PCB_PrimitivePoured.md +363 -363
  133. package/skill/references/classes/PCB_PrimitiveRegion.md +765 -799
  134. package/skill/references/classes/PCB_PrimitiveString.md +828 -910
  135. package/skill/references/classes/PCB_PrimitiveVia.md +761 -765
  136. package/skill/references/classes/PCB_RayTracerEngine.md +603 -263
  137. package/skill/references/classes/PCB_SelectControl.md +495 -495
  138. package/skill/references/classes/PCB_Tool.md +9 -0
  139. package/skill/references/classes/PNL_Document.md +83 -83
  140. package/skill/references/classes/SCH_Document.md +797 -809
  141. package/skill/references/classes/SCH_Drc.md +246 -242
  142. package/skill/references/classes/SCH_Event.md +583 -583
  143. package/skill/references/classes/SCH_ManufactureData.md +1209 -1205
  144. package/skill/references/classes/SCH_Net.md +200 -200
  145. package/skill/references/classes/SCH_Netlist.md +191 -191
  146. package/skill/references/classes/SCH_Primitive.md +337 -337
  147. package/skill/references/classes/SCH_PrimitiveArc.md +686 -692
  148. package/skill/references/classes/SCH_PrimitiveAttribute.md +579 -590
  149. package/skill/references/classes/SCH_PrimitiveBus.md +618 -624
  150. package/skill/references/classes/SCH_PrimitiveCircle.md +667 -683
  151. package/skill/references/classes/SCH_PrimitiveComponent.md +2256 -2240
  152. package/skill/references/classes/SCH_PrimitiveObject.md +666 -666
  153. package/skill/references/classes/SCH_PrimitivePin.md +737 -754
  154. package/skill/references/classes/SCH_PrimitivePolygon.md +621 -627
  155. package/skill/references/classes/SCH_PrimitiveRectangle.md +715 -731
  156. package/skill/references/classes/SCH_PrimitiveText.md +736 -746
  157. package/skill/references/classes/SCH_PrimitiveWire.md +701 -703
  158. package/skill/references/classes/SCH_SelectControl.md +520 -520
  159. package/skill/references/classes/SCH_SimulationEngine.md +133 -133
  160. package/skill/references/classes/SCH_Utils.md +121 -121
  161. package/skill/references/classes/SYS_ClientUrl.md +173 -173
  162. package/skill/references/classes/SYS_Dialog.md +825 -825
  163. package/skill/references/classes/SYS_Environment.md +640 -502
  164. package/skill/references/classes/SYS_ExternalApi.md +246 -0
  165. package/skill/references/classes/SYS_FileManager.md +1664 -1686
  166. package/skill/references/classes/SYS_FileSystem.md +1366 -1171
  167. package/skill/references/classes/SYS_FontManager.md +224 -224
  168. package/skill/references/classes/SYS_FormatConversion.md +349 -349
  169. package/skill/references/classes/SYS_HeaderMenu.md +480 -479
  170. package/skill/references/classes/SYS_Help.md +141 -0
  171. package/skill/references/classes/SYS_I18n.md +861 -861
  172. package/skill/references/classes/SYS_IFrame.md +541 -535
  173. package/skill/references/classes/SYS_LoadingAndProgressBar.md +246 -246
  174. package/skill/references/classes/SYS_Log.md +422 -424
  175. package/skill/references/classes/SYS_Math.md +1565 -1565
  176. package/skill/references/classes/SYS_Message.md +363 -363
  177. package/skill/references/classes/SYS_MessageBox.md +285 -285
  178. package/skill/references/classes/SYS_MessageBus.md +1618 -1618
  179. package/skill/references/classes/SYS_PanelControl.md +696 -696
  180. package/skill/references/classes/SYS_RightClickMenu.md +175 -175
  181. package/skill/references/classes/SYS_Setting.md +134 -85
  182. package/skill/references/classes/SYS_ShortcutKey.md +623 -623
  183. package/skill/references/classes/SYS_Storage.md +484 -484
  184. package/skill/references/classes/SYS_Timer.md +447 -447
  185. package/skill/references/classes/SYS_ToastMessage.md +194 -194
  186. package/skill/references/classes/SYS_Tool.md +317 -241
  187. package/skill/references/classes/SYS_Unit.md +594 -594
  188. package/skill/references/classes/SYS_WebSocket.md +401 -401
  189. package/skill/references/classes/SYS_Window.md +849 -850
  190. package/skill/references/enums/EDMT_EditorDocumentType.md +324 -278
  191. package/skill/references/enums/EDMT_EditorSplitScreenDirection.md +51 -47
  192. package/skill/references/enums/EDMT_EditorTabEventType.md +68 -62
  193. package/skill/references/enums/EDMT_IndicatorMarkerType.md +90 -80
  194. package/skill/references/enums/EDMT_ItemType.md +181 -157
  195. package/skill/references/enums/EDMT_ProjectCollaborationMode.md +51 -47
  196. package/skill/references/enums/EDMT_ProjectFileFormat.md +60 -0
  197. package/skill/references/enums/EDMT_ProjectReadyState.md +82 -0
  198. package/skill/references/enums/ELIB_DeviceJlcLibraryCategory.md +51 -47
  199. package/skill/references/enums/ELIB_LibraryType.md +129 -113
  200. package/skill/references/enums/ELIB_PreviewType.md +77 -69
  201. package/skill/references/enums/ELIB_SimulationModelType.md +51 -47
  202. package/skill/references/enums/ELIB_SymbolType.md +142 -124
  203. package/skill/references/enums/EPCB_AutoRoutingCornerStyle.md +51 -47
  204. package/skill/references/enums/EPCB_AutoRoutingExistingPrimitiveMode.md +51 -47
  205. package/skill/references/enums/EPCB_AutoRoutingOptimization.md +51 -47
  206. package/skill/references/enums/EPCB_DocumentCanvasUpdateCalculationActiveStatus.md +51 -47
  207. package/skill/references/enums/EPCB_DocumentRatlineCalculatingActiveStatus.md +55 -51
  208. package/skill/references/enums/EPCB_InactiveLayerDisplayMode.md +64 -58
  209. package/skill/references/enums/EPCB_LayerColorConfiguration.md +90 -80
  210. package/skill/references/enums/EPCB_LayerId.md +1169 -881
  211. package/skill/references/enums/EPCB_LayerStatus.md +64 -58
  212. package/skill/references/enums/EPCB_LayerType.md +129 -113
  213. package/skill/references/enums/EPCB_MouseEventType.md +64 -58
  214. package/skill/references/enums/EPCB_NetEventType.md +64 -58
  215. package/skill/references/enums/EPCB_PcbPlateType.md +51 -47
  216. package/skill/references/enums/EPCB_PdfOutputMethod.md +64 -58
  217. package/skill/references/enums/EPCB_PrimitiveArcInteractiveMode.md +51 -47
  218. package/skill/references/enums/EPCB_PrimitiveDimensionType.md +64 -58
  219. package/skill/references/enums/EPCB_PrimitiveEventType.md +64 -58
  220. package/skill/references/enums/EPCB_PrimitiveFillMode.md +68 -62
  221. package/skill/references/enums/EPCB_PrimitivePadHeatWeldingConnectionMethod.md +64 -58
  222. package/skill/references/enums/EPCB_PrimitivePadHoleType.md +64 -58
  223. package/skill/references/enums/EPCB_PrimitivePadShapeType.md +90 -80
  224. package/skill/references/enums/EPCB_PrimitivePadType.md +64 -58
  225. package/skill/references/enums/EPCB_PrimitivePourFillMethod.md +64 -58
  226. package/skill/references/enums/EPCB_PrimitiveRegionRuleType.md +107 -95
  227. package/skill/references/enums/EPCB_PrimitiveStringAlignMode.md +142 -124
  228. package/skill/references/enums/EPCB_PrimitiveType.md +233 -201
  229. package/skill/references/enums/EPCB_PrimitiveViaType.md +64 -58
  230. package/skill/references/enums/ESCH_DynamicSimulationEnginePullEventType.md +116 -102
  231. package/skill/references/enums/ESCH_DynamicSimulationEnginePushEventType.md +90 -80
  232. package/skill/references/enums/ESCH_ExportDocumentFileType.md +64 -58
  233. package/skill/references/enums/ESCH_MouseEventType.md +51 -47
  234. package/skill/references/enums/ESCH_PrimitiveComponentType.md +142 -124
  235. package/skill/references/enums/ESCH_PrimitiveEventType.md +77 -69
  236. package/skill/references/enums/ESCH_PrimitiveFillStyle.md +129 -113
  237. package/skill/references/enums/ESCH_PrimitiveLineType.md +77 -69
  238. package/skill/references/enums/ESCH_PrimitivePinShape.md +77 -69
  239. package/skill/references/enums/ESCH_PrimitivePinType.md +168 -146
  240. package/skill/references/enums/ESCH_PrimitiveTextAlignMode.md +142 -124
  241. package/skill/references/enums/ESCH_PrimitiveType.md +207 -179
  242. package/skill/references/enums/ESCH_SimulationNetlistType.md +38 -36
  243. package/skill/references/enums/ESCH_SpiceSimulationEnginePullEventType.md +51 -47
  244. package/skill/references/enums/ESCH_SpiceSimulationEnginePushEventType.md +77 -69
  245. package/skill/references/enums/ESYS_BottomPanelTab.md +94 -80
  246. package/skill/references/enums/ESYS_HeaderMenuEnvironment.md +181 -157
  247. package/skill/references/enums/ESYS_ImportProjectBoardOutlineSource.md +55 -51
  248. package/skill/references/enums/ESYS_ImportProjectImportOption.md +64 -58
  249. package/skill/references/enums/ESYS_ImportProjectSchematicObjectStyle.md +51 -47
  250. package/skill/references/enums/ESYS_ImportProjectViaSolderMaskExpansion.md +55 -51
  251. package/skill/references/enums/ESYS_JobState.md +95 -0
  252. package/skill/references/enums/ESYS_LeftPanelTab.md +94 -80
  253. package/skill/references/enums/ESYS_LogType.md +77 -102
  254. package/skill/references/enums/ESYS_NetlistType.md +129 -113
  255. package/skill/references/enums/ESYS_PanelPosition.md +69 -0
  256. package/skill/references/enums/ESYS_PanelTab.md +368 -0
  257. package/skill/references/enums/ESYS_RightPanelTab.md +237 -201
  258. package/skill/references/enums/ESYS_ShortcutKeyEffectiveEditorRange.md +220 -190
  259. package/skill/references/enums/ESYS_ShortcutKeyEffectiveEditorScene.md +103 -91
  260. package/skill/references/enums/ESYS_StartPageQuickStartItem.md +237 -205
  261. package/skill/references/enums/ESYS_Theme.md +51 -47
  262. package/skill/references/enums/ESYS_ToastMessageType.md +90 -80
  263. package/skill/references/enums/ESYS_Unit.md +116 -102
  264. package/skill/references/enums/ESYS_WindowEventType.md +64 -47
  265. package/skill/references/enums/ESYS_WindowOpenTarget.md +51 -47
  266. package/skill/references/enums/NetportDeviceName.md +146 -146
  267. package/skill/references/enums/SchToolBarDeviceName.md +278 -278
  268. package/skill/references/interfaces/BoardProps.md +169 -169
  269. package/skill/references/interfaces/BorderConfig.md +109 -0
  270. package/skill/references/interfaces/ButtonProps.md +196 -169
  271. package/skill/references/interfaces/CellClickInfo.md +142 -0
  272. package/skill/references/interfaces/CellCoord.md +88 -0
  273. package/skill/references/interfaces/CheckBoxProps.md +223 -196
  274. package/skill/references/interfaces/CheckChangeDetail.md +88 -0
  275. package/skill/references/interfaces/CheckboxEditConfig.md +159 -0
  276. package/skill/references/interfaces/ClipboardCellData.md +142 -0
  277. package/skill/references/interfaces/ClipboardConfig.md +115 -0
  278. package/skill/references/interfaces/ColorPickerProps.md +169 -0
  279. package/skill/references/interfaces/ColumnDef.md +605 -0
  280. package/skill/references/interfaces/ColumnEditTrigger.md +57 -0
  281. package/skill/references/interfaces/ColumnGroupDef.md +192 -0
  282. package/skill/references/interfaces/ColumnResizeConfig.md +142 -0
  283. package/skill/references/interfaces/ComponentPropsMap.md +517 -448
  284. package/skill/references/interfaces/CustomHeaderConfig.md +169 -0
  285. package/skill/references/interfaces/DialogProps.md +385 -385
  286. package/skill/references/interfaces/DragSortConfig.md +115 -0
  287. package/skill/references/interfaces/EditingConfig.md +196 -0
  288. package/skill/references/interfaces/FilteringConfig.md +250 -0
  289. package/skill/references/interfaces/FixedColumnConfig.md +88 -0
  290. package/skill/references/interfaces/FlexItemProps.md +116 -116
  291. package/skill/references/interfaces/FlexProps.md +224 -224
  292. package/skill/references/interfaces/GridItemProps.md +143 -143
  293. package/skill/references/interfaces/GridProps.md +143 -143
  294. package/skill/references/interfaces/IDMT_BoardItem.md +171 -171
  295. package/skill/references/interfaces/IDMT_BriefProjectItem.md +171 -171
  296. package/skill/references/interfaces/IDMT_EditorDocumentItem.md +169 -169
  297. package/skill/references/interfaces/IDMT_EditorSplitScreenItem.md +173 -173
  298. package/skill/references/interfaces/IDMT_EditorTabItem.md +169 -169
  299. package/skill/references/interfaces/IDMT_FolderItem.md +225 -225
  300. package/skill/references/interfaces/IDMT_IndicatorMarkerShape.md +393 -393
  301. package/skill/references/interfaces/IDMT_PanelItem.md +144 -144
  302. package/skill/references/interfaces/IDMT_PcbItem.md +171 -171
  303. package/skill/references/interfaces/IDMT_ProjectItem.md +143 -143
  304. package/skill/references/interfaces/IDMT_SchematicItem.md +225 -225
  305. package/skill/references/interfaces/IDMT_SchematicPageItem.md +198 -198
  306. package/skill/references/interfaces/IDMT_TeamItem.md +144 -144
  307. package/skill/references/interfaces/IDMT_WorkspaceItem.md +117 -117
  308. package/skill/references/interfaces/IDesignPortal.md +103 -103
  309. package/skill/references/interfaces/ILIB_3DModelItem.md +198 -198
  310. package/skill/references/interfaces/ILIB_3DModelSearchItem.md +277 -277
  311. package/skill/references/interfaces/ILIB_CbbItem.md +225 -225
  312. package/skill/references/interfaces/ILIB_CbbSearchItem.md +277 -277
  313. package/skill/references/interfaces/ILIB_ClassificationIndex.md +150 -150
  314. package/skill/references/interfaces/ILIB_ClassificationNode.md +98 -0
  315. package/skill/references/interfaces/ILIB_DeviceAssociationItem.md +210 -210
  316. package/skill/references/interfaces/ILIB_DeviceExtendPropertyItem.md +304 -304
  317. package/skill/references/interfaces/ILIB_DeviceItem.md +279 -279
  318. package/skill/references/interfaces/ILIB_DevicePropertiesForSearch.md +250 -250
  319. package/skill/references/interfaces/ILIB_DeviceSearchItem.md +521 -521
  320. package/skill/references/interfaces/ILIB_ExtendLibrary3DModelFunctions.md +64 -64
  321. package/skill/references/interfaces/ILIB_ExtendLibraryCbbFunctions.md +93 -99
  322. package/skill/references/interfaces/ILIB_ExtendLibraryClassificationIndex.md +150 -150
  323. package/skill/references/interfaces/ILIB_ExtendLibraryDeviceFunctions.md +143 -157
  324. package/skill/references/interfaces/ILIB_ExtendLibraryFootprintFunctions.md +63 -63
  325. package/skill/references/interfaces/ILIB_ExtendLibraryFunctions.md +123 -123
  326. package/skill/references/interfaces/ILIB_ExtendLibraryItem.md +97 -97
  327. package/skill/references/interfaces/ILIB_ExtendLibraryItemIndex.md +98 -98
  328. package/skill/references/interfaces/ILIB_ExtendLibrarySearchProperty.md +115 -115
  329. package/skill/references/interfaces/ILIB_ExtendLibrarySearchResult.md +169 -169
  330. package/skill/references/interfaces/ILIB_ExtendLibrarySearchResultDataLine.md +234 -234
  331. package/skill/references/interfaces/ILIB_ExtendLibrarySymbolFunctions.md +91 -105
  332. package/skill/references/interfaces/ILIB_ExtendLibraryUserIndex.md +96 -96
  333. package/skill/references/interfaces/ILIB_FootprintItem.md +256 -198
  334. package/skill/references/interfaces/ILIB_FootprintPropertiesForSearch.md +61 -61
  335. package/skill/references/interfaces/ILIB_FootprintSearchItem.md +277 -277
  336. package/skill/references/interfaces/ILIB_LibraryInfo.md +92 -92
  337. package/skill/references/interfaces/ILIB_LibraryItem.md +115 -115
  338. package/skill/references/interfaces/ILIB_PanelLibraryItem.md +198 -198
  339. package/skill/references/interfaces/ILIB_PanelLibrarySearchItem.md +277 -277
  340. package/skill/references/interfaces/ILIB_RegisterExtendLibraryProps.md +71 -0
  341. package/skill/references/interfaces/ILIB_SimulationModelItem.md +306 -306
  342. package/skill/references/interfaces/ILIB_SimulationModelSearchItem.md +304 -304
  343. package/skill/references/interfaces/ILIB_SymbolItem.md +306 -279
  344. package/skill/references/interfaces/ILIB_SymbolPropertiesForSearch.md +61 -61
  345. package/skill/references/interfaces/ILIB_SymbolSearchItem.md +304 -304
  346. package/skill/references/interfaces/IPCB_AutoLayoutResult.md +169 -169
  347. package/skill/references/interfaces/IPCB_AutoRoutingProps.md +220 -220
  348. package/skill/references/interfaces/IPCB_AutoRoutingResult.md +169 -169
  349. package/skill/references/interfaces/IPCB_BomPropertiesTableColumns.md +169 -169
  350. package/skill/references/interfaces/IPCB_DifferentialPairItem.md +115 -115
  351. package/skill/references/interfaces/IPCB_DiscretizeOptions.md +65 -65
  352. package/skill/references/interfaces/IPCB_DiscretizedPoint.md +88 -88
  353. package/skill/references/interfaces/IPCB_EqualLengthNetGroupItem.md +115 -115
  354. package/skill/references/interfaces/IPCB_LayerItem.md +277 -277
  355. package/skill/references/interfaces/IPCB_NetClassItem.md +115 -115
  356. package/skill/references/interfaces/IPCB_NetInfo.md +115 -115
  357. package/skill/references/interfaces/IPCB_PadPairGroupItem.md +88 -88
  358. package/skill/references/interfaces/IPCB_PadPairMinWireLengthItem.md +88 -88
  359. package/skill/references/interfaces/IPCB_PhysicalStackingConfiguration.md +115 -115
  360. package/skill/references/interfaces/IPCB_Primitive.md +218 -218
  361. package/skill/references/interfaces/IPCB_PrimitiveAPI.md +174 -175
  362. package/skill/references/interfaces/IPCB_PrimitivePadHeatWelding.md +151 -151
  363. package/skill/references/interfaces/IPCB_PrimitivePouredPourFill.md +142 -142
  364. package/skill/references/interfaces/IPCB_PrimitiveSolderMaskAndPasteMaskExpansion.md +154 -154
  365. package/skill/references/interfaces/IPCB_RayTracerBackgroundConfig.md +223 -0
  366. package/skill/references/interfaces/IPCB_RayTracerLightConfig.md +412 -0
  367. package/skill/references/interfaces/IPCB_RayTracerMaterialConfig.md +547 -0
  368. package/skill/references/interfaces/IPCB_RayTracerPcbMaterialConfig.md +196 -0
  369. package/skill/references/interfaces/IPCB_RayTracerRenderConfigurations.md +200 -0
  370. package/skill/references/interfaces/IPCB_RayTracerRendererConfig.md +196 -0
  371. package/skill/references/interfaces/IPCB_RayTracerSceneElement.md +115 -0
  372. package/skill/references/interfaces/IPCB_RayTracerSceneElementTransform.md +123 -0
  373. package/skill/references/interfaces/IPCB_RayTracerTexture.md +88 -0
  374. package/skill/references/interfaces/IPCB_SubstratePhysicalProperties.md +88 -88
  375. package/skill/references/interfaces/IRawNet.md +103 -103
  376. package/skill/references/interfaces/IRawPureSchematic.md +80 -80
  377. package/skill/references/interfaces/IRawSchematic.md +103 -103
  378. package/skill/references/interfaces/IRawWire.md +149 -149
  379. package/skill/references/interfaces/ISCH_DrcError.md +142 -142
  380. package/skill/references/interfaces/ISCH_DrcErrorPrimitive.md +142 -142
  381. package/skill/references/interfaces/ISCH_ExportPngResolution.md +94 -94
  382. package/skill/references/interfaces/ISCH_NetInfo.md +88 -88
  383. package/skill/references/interfaces/ISCH_Primitive.md +218 -219
  384. package/skill/references/interfaces/ISCH_PrimitiveAPI.md +174 -175
  385. package/skill/references/interfaces/ISCH_ProjectNetInfo.md +142 -142
  386. package/skill/references/interfaces/ISCH_WireInfo.md +169 -169
  387. package/skill/references/interfaces/ISYS_ComparisonResponse.md +115 -0
  388. package/skill/references/interfaces/ISYS_ExtensionExternalApiIndex.md +13 -0
  389. package/skill/references/interfaces/ISYS_ExtensionRegisteredExternalApis.md +13 -0
  390. package/skill/references/interfaces/ISYS_ExternalApiHelp.md +173 -0
  391. package/skill/references/interfaces/ISYS_ExternalApiRegistration.md +146 -0
  392. package/skill/references/interfaces/ISYS_FileSystemFileList.md +169 -169
  393. package/skill/references/interfaces/ISYS_HeaderMenuSub1MenuItem.md +205 -174
  394. package/skill/references/interfaces/ISYS_HeaderMenuSub2MenuItem.md +178 -147
  395. package/skill/references/interfaces/ISYS_HeaderMenuTopMenuItem.md +115 -115
  396. package/skill/references/interfaces/ISYS_HeaderMenus.md +408 -408
  397. package/skill/references/interfaces/ISYS_HelpAudienceEntry.md +92 -0
  398. package/skill/references/interfaces/ISYS_HelpClassSummary.md +205 -0
  399. package/skill/references/interfaces/ISYS_HelpData.md +92 -0
  400. package/skill/references/interfaces/ISYS_HelpMethodDetail.md +310 -0
  401. package/skill/references/interfaces/ISYS_JobHandle.md +65 -0
  402. package/skill/references/interfaces/ISYS_JobLogEntry.md +142 -0
  403. package/skill/references/interfaces/ISYS_JobStatus.md +176 -0
  404. package/skill/references/interfaces/ISYS_LogLine.md +115 -115
  405. package/skill/references/interfaces/ISYS_MathBBox.md +142 -142
  406. package/skill/references/interfaces/ISYS_MathPoint.md +88 -88
  407. package/skill/references/interfaces/ISYS_MathPolygonWithHoles.md +92 -92
  408. package/skill/references/interfaces/ISYS_MessageBusTask.md +115 -115
  409. package/skill/references/interfaces/ISYS_MultilingualLanguagesData.md +12 -12
  410. package/skill/references/interfaces/ISYS_RightClickMenuItem.md +174 -174
  411. package/skill/references/interfaces/ISYS_ShortcutKeyData.md +169 -169
  412. package/skill/references/interfaces/ISYS_ShortcutKeyDataWithCallFn.md +62 -62
  413. package/skill/references/interfaces/ISYS_ShortcutKeyDataWithUserDefinedShortcutKey.md +62 -62
  414. package/skill/references/interfaces/ISYS_WindowEventListenerRemovableObject.md +109 -109
  415. package/skill/references/interfaces/IconProps.md +88 -88
  416. package/skill/references/interfaces/ImageProps.md +115 -115
  417. package/skill/references/interfaces/InputEditConfig.md +182 -0
  418. package/skill/references/interfaces/InputProps.md +547 -520
  419. package/skill/references/interfaces/KeyboardConfig.md +61 -0
  420. package/skill/references/interfaces/ListChildren.md +223 -223
  421. package/skill/references/interfaces/ListProps.md +250 -223
  422. package/skill/references/interfaces/ModalProps.md +358 -358
  423. package/skill/references/interfaces/NumberEditConfig.md +234 -0
  424. package/skill/references/interfaces/RadioGroupProps.md +196 -196
  425. package/skill/references/interfaces/RadioItem.md +115 -115
  426. package/skill/references/interfaces/RichTableProps.md +1357 -0
  427. package/skill/references/interfaces/RowMetaConfig.md +142 -0
  428. package/skill/references/interfaces/ScrollerProps.md +169 -169
  429. package/skill/references/interfaces/SelectEditConfig.md +211 -0
  430. package/skill/references/interfaces/SelectListItem.md +142 -142
  431. package/skill/references/interfaces/SelectOption.md +142 -0
  432. package/skill/references/interfaces/SelectProps.md +169 -169
  433. package/skill/references/interfaces/SelectionConfig.md +358 -0
  434. package/skill/references/interfaces/SliderProps.md +142 -0
  435. package/skill/references/interfaces/SlotProps.md +88 -88
  436. package/skill/references/interfaces/SortState.md +88 -0
  437. package/skill/references/interfaces/SortingConfig.md +169 -0
  438. package/skill/references/interfaces/StyleProps.md +439 -385
  439. package/skill/references/interfaces/TextAreaProps.md +196 -196
  440. package/skill/references/interfaces/TextProps.md +169 -169
  441. package/skill/references/interfaces/TextareaEditConfig.md +182 -0
  442. package/skill/references/interfaces/ValidationRule.md +223 -0
  443. package/skill/references/interfaces/VirtualScrollConfig.md +115 -0
  444. package/skill/references/types/Align.md +9 -0
  445. package/skill/references/types/CellContentType.md +9 -0
  446. package/skill/references/types/ColumnDefOrGroup.md +12 -0
  447. package/skill/references/types/ColumnEditConfig.md +13 -0
  448. package/skill/references/types/ColumnType.md +9 -0
  449. package/skill/references/types/DataChangeType.md +9 -0
  450. package/skill/references/types/FilterMatchMode.md +9 -0
  451. package/skill/references/types/RichTableRow.md +12 -0
  452. package/skill/references/types/Serializable.md +10 -0
  453. package/skill/references/types/SerializablePrimitive.md +9 -0
  454. package/skill/references/types/SortOrder.md +9 -0
  455. package/skill/references/types/TPCB_LayerTypesOfInnerLayer.md +11 -11
  456. package/skill/references/types/TPCB_LayersInTheSelectable.md +42 -42
  457. package/skill/references/types/TPCB_LayersOfComponent.md +11 -11
  458. package/skill/references/types/TPCB_LayersOfCopper.md +15 -15
  459. package/skill/references/types/TPCB_LayersOfCustom.md +41 -41
  460. package/skill/references/types/TPCB_LayersOfDimension.md +16 -16
  461. package/skill/references/types/TPCB_LayersOfFill.md +28 -28
  462. package/skill/references/types/TPCB_LayersOfImage.md +22 -22
  463. package/skill/references/types/TPCB_LayersOfInner.md +41 -41
  464. package/skill/references/types/TPCB_LayersOfLine.md +25 -25
  465. package/skill/references/types/TPCB_LayersOfObject.md +12 -12
  466. package/skill/references/types/TPCB_LayersOfPad.md +11 -11
  467. package/skill/references/types/TPCB_LayersOfRegion.md +11 -11
  468. package/skill/references/types/TPCB_NumberOfCopperLayers.md +9 -9
  469. package/skill/references/types/TPCB_PolygonSourceArray.md +85 -83
  470. package/skill/references/types/TPCB_PrimitiveDimensionCoordinateSet.md +66 -66
  471. package/skill/references/types/TPCB_PrimitivePadHole.md +30 -30
  472. package/skill/references/types/TPCB_PrimitivePadShape.md +61 -61
  473. package/skill/references/types/TPCB_PrimitiveSpecialPadShape.md +19 -19
  474. package/skill/references/types/TSYS_ComparisonErrorCode.md +15 -0
  475. package/skill/references/types/TSYS_LanguageKeyValuePairs.md +13 -0
  476. package/skill/references/types/TSYS_MathPolygonGroup.md +15 -15
  477. package/skill/references/types/TSYS_MathPolygonInput.md +20 -20
  478. package/skill/references/types/TSYS_ShortcutKeys.md +96 -96
  479. package/skill/user-guide/using-extension.md +47 -47
  480. package/src/json-gen.test.js +430 -0
  481. package/skill/guide/ancillary-projects/pro-api-sdk.md +0 -1
  482. package/skill/references/interfaces/ISYS_PcbComparisonResponse.md +0 -115
  483. package/skill/references/types/ISYS_LanguageKeyValuePairs.md +0 -13
  484. package/skill/references/types/TSYS_PcbComparisonErrorCode.md +0 -10
@@ -1,1565 +1,1565 @@
1
- # SYS\_Math class
2
-
3
- System / math class
4
-
5
- ## Signature
6
-
7
- ```typescript
8
- class SYS_Math
9
- ```
10
-
11
- ## Remarks
12
-
13
- Provides polygon geometry calculation methods, supporting discrete point coordinates and [TPCB\_PolygonSourceArray](../types/TPCB_PolygonSourceArray.md) polygon data
14
-
15
- ## Methods
16
-
17
- <table><thead><tr><th>
18
-
19
- Method
20
-
21
- </th><th>
22
-
23
- Modifiers
24
-
25
- </th><th>
26
-
27
- Description
28
-
29
- </th></tr></thead>
30
- <tbody><tr><td>
31
-
32
- [bboxIntersects(bbox1, bbox2)](./SYS_Math.md)
33
-
34
- </td><td>
35
-
36
- </td><td>
37
-
38
- Quickly determine whether two BBoxes intersect
39
-
40
- </td></tr>
41
- <tr><td>
42
-
43
- [calculateArea(polygon)](./SYS_Math.md)
44
-
45
- </td><td>
46
-
47
- </td><td>
48
-
49
- Calculate the area of a polygon
50
-
51
- </td></tr>
52
- <tr><td>
53
-
54
- [calculatePerimeter(polygon)](./SYS_Math.md)
55
-
56
- </td><td>
57
-
58
- </td><td>
59
-
60
- Calculate the perimeter of a polygon
61
-
62
- </td></tr>
63
- <tr><td>
64
-
65
- [contains(polygon1, polygon2)](./SYS_Math.md)
66
-
67
- </td><td>
68
-
69
- </td><td>
70
-
71
- Determine whether polygon1 completely contains polygon2
72
-
73
- </td></tr>
74
- <tr><td>
75
-
76
- [containsPoint(polygon, point)](./SYS_Math.md)
77
-
78
- </td><td>
79
-
80
- </td><td>
81
-
82
- Determine whether the point is inside the polygon
83
-
84
- </td></tr>
85
- <tr><td>
86
-
87
- [distanceToPoint(polygon, point)](./SYS_Math.md)
88
-
89
- </td><td>
90
-
91
- </td><td>
92
-
93
- Calculate the shortest distance from a point to the polygon boundary
94
-
95
- </td></tr>
96
- <tr><td>
97
-
98
- [getBBox(polygon)](./SYS_Math.md)
99
-
100
- </td><td>
101
-
102
- </td><td>
103
-
104
- Get the minimum bounding rectangle (BBox) of the polygon
105
-
106
- </td></tr>
107
- <tr><td>
108
-
109
- [getCentroid(polygon)](./SYS_Math.md)
110
-
111
- </td><td>
112
-
113
- </td><td>
114
-
115
- Calculate the centroid of the polygon
116
-
117
- </td></tr>
118
- <tr><td>
119
-
120
- [intersection(polygon1, polygon2)](./SYS_Math.md)
121
-
122
- </td><td>
123
-
124
- </td><td>
125
-
126
- Calculate the intersection of two polygons
127
-
128
- </td></tr>
129
- <tr><td>
130
-
131
- [intersects(polygon1, polygon2)](./SYS_Math.md)
132
-
133
- </td><td>
134
-
135
- </td><td>
136
-
137
- Determine whether two polygons intersect
138
-
139
- </td></tr>
140
- <tr><td>
141
-
142
- [rotate(polygon, angle, centerX, centerY)](./SYS_Math.md)
143
-
144
- </td><td>
145
-
146
- </td><td>
147
-
148
- Rotate the polygon
149
-
150
- </td></tr>
151
- <tr><td>
152
-
153
- [scale(polygon, scaleX, scaleY, centerX, centerY)](./SYS_Math.md)
154
-
155
- </td><td>
156
-
157
- </td><td>
158
-
159
- Scale the polygon
160
-
161
- </td></tr>
162
- <tr><td>
163
-
164
- [subtract(polygon1, polygon2)](./SYS_Math.md)
165
-
166
- </td><td>
167
-
168
- </td><td>
169
-
170
- Calculate the difference of two polygons (polygon1 - polygon2)
171
-
172
- </td></tr>
173
- <tr><td>
174
-
175
- [translate(polygon, dx, dy)](./SYS_Math.md)
176
-
177
- </td><td>
178
-
179
- </td><td>
180
-
181
- Translate the polygon
182
-
183
- </td></tr>
184
- <tr><td>
185
-
186
- [union(polygon1, polygon2)](./SYS_Math.md)
187
-
188
- </td><td>
189
-
190
- </td><td>
191
-
192
- Calculate the union of two polygons
193
-
194
- </td></tr>
195
- <tr><td>
196
-
197
- [xor(polygon1, polygon2)](./SYS_Math.md)
198
-
199
- </td><td>
200
-
201
- </td><td>
202
-
203
- Calculate the symmetric difference (XOR) of two polygons
204
-
205
- </td></tr>
206
- </tbody></table>
207
-
208
- ---
209
-
210
- ## 方法详情
211
-
212
- ### bboxintersects
213
-
214
- # SYS\_Math.bboxIntersects() method
215
-
216
- Quickly determine whether two BBoxes intersect
217
-
218
- ## Signature
219
-
220
- ```typescript
221
- function bboxIntersects(bbox1: ISYS_MathBBox, bbox2: ISYS_MathBBox): boolean;
222
- ```
223
-
224
- ## Parameters
225
-
226
- <table><thead><tr><th>
227
-
228
- Parameter
229
-
230
- </th><th>
231
-
232
- Type
233
-
234
- </th><th>
235
-
236
- Description
237
-
238
- </th></tr></thead>
239
- <tbody><tr><td>
240
-
241
- bbox1
242
-
243
- </td><td>
244
-
245
- [ISYS\_MathBBox](../interfaces/ISYS_MathBBox.md)
246
-
247
- </td><td>
248
-
249
- BBox 1
250
-
251
- </td></tr>
252
- <tr><td>
253
-
254
- bbox2
255
-
256
- </td><td>
257
-
258
- [ISYS\_MathBBox](../interfaces/ISYS_MathBBox.md)
259
-
260
- </td><td>
261
-
262
- BBox 2
263
-
264
- </td></tr>
265
- </tbody></table>
266
-
267
- ## Returns
268
-
269
- boolean
270
-
271
- Whether they intersect
272
-
273
- ## Example
274
-
275
- ```javascript
276
- // 1. 两块铺铜区域的外接矩形(部分重叠)
277
- const zoneA = { minX: 0, minY: 0, maxX: 100, maxY: 80 };
278
- const zoneB = { minX: 50, minY: 20, maxX: 150, maxY: 60 };
279
- console.log('区域 A 与区域 B 相交:', eda.sys_Math.bboxIntersects(zoneA, zoneB));
280
-
281
- // 2. 完全分离的两个矩形(不相交,粗筛即可排除)
282
- const zoneC = { minX: 200, minY: 200, maxX: 300, maxY: 280 };
283
- console.log('区域 A 与区域 C 相交:', eda.sys_Math.bboxIntersects(zoneA, zoneC));
284
-
285
- // 3. 仅有边界接触也算相交(贴合的两个矩形)
286
- const zoneD = { minX: 100, minY: 0, maxX: 180, maxY: 40 };
287
- console.log('区域 A 与区域 D 相交:', eda.sys_Math.bboxIntersects(zoneA, zoneD));
288
- ```
289
-
290
- ### calculatearea
291
-
292
- # SYS\_Math.calculateArea() method
293
-
294
- Calculate the area of a polygon
295
-
296
- ## Signature
297
-
298
- ```typescript
299
- function calculateArea(polygon: TSYS_MathPolygonInput): number;
300
- ```
301
-
302
- ## Parameters
303
-
304
- <table><thead><tr><th>
305
-
306
- Parameter
307
-
308
- </th><th>
309
-
310
- Type
311
-
312
- </th><th>
313
-
314
- Description
315
-
316
- </th></tr></thead>
317
- <tbody><tr><td>
318
-
319
- polygon
320
-
321
- </td><td>
322
-
323
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
324
-
325
- </td><td>
326
-
327
- Polygon or polygon group
328
-
329
- </td></tr>
330
- </tbody></table>
331
-
332
- ## Returns
333
-
334
- number
335
-
336
- Area (absolute area for a single polygon, net area for a polygon group)
337
-
338
- ## Remarks
339
-
340
- Calculated using the Shoelace formula: - When a single polygon is passed in, the absolute area of the polygon is returned - When a polygon group ([TSYS\_MathPolygonGroup](../types/TSYS_MathPolygonGroup.md)<!-- -->, such as the return value of Boolean operations) is passed in, the net area is obtained by subtracting the sum of all hole areas from the sum of all outer ring areas
341
-
342
- ## Example
343
-
344
- ```javascript
345
- // 1. 单个矩形 100 x 80(单位随输入坐标系,PCB 场景下通常是 mil)
346
- const rect = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
347
- console.log('矩形面积:', eda.sys_Math.calculateArea(rect));
348
-
349
- // 2. 单个三角形(底 100 高 60,面积应为 3000)
350
- const triangle = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 50, y: 60 }];
351
- console.log('三角形面积:', eda.sys_Math.calculateArea(triangle));
352
-
353
- // 3. 布尔运算返回的多边形组直接作为输入,得到净面积(含孔洞时自动扣除)
354
- const overlap = [{ x: 50, y: 20 }, { x: 150, y: 20 }, { x: 150, y: 60 }, { x: 50, y: 60 }];
355
- const merged = eda.sys_Math.union(rect, overlap);
356
- console.log('两矩形合并后的净面积:', eda.sys_Math.calculateArea(merged));
357
- ```
358
-
359
- ### calculateperimeter
360
-
361
- # SYS\_Math.calculatePerimeter() method
362
-
363
- Calculate the perimeter of a polygon
364
-
365
- ## Signature
366
-
367
- ```typescript
368
- function calculatePerimeter(polygon: TSYS_MathPolygonInput): number;
369
- ```
370
-
371
- ## Parameters
372
-
373
- <table><thead><tr><th>
374
-
375
- Parameter
376
-
377
- </th><th>
378
-
379
- Type
380
-
381
- </th><th>
382
-
383
- Description
384
-
385
- </th></tr></thead>
386
- <tbody><tr><td>
387
-
388
- polygon
389
-
390
- </td><td>
391
-
392
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
393
-
394
- </td><td>
395
-
396
- Polygon
397
-
398
- </td></tr>
399
- </tbody></table>
400
-
401
- ## Returns
402
-
403
- number
404
-
405
- Perimeter
406
-
407
- ## Example
408
-
409
- ```javascript
410
- // 1. 矩形 100 x 80,周长应为 360
411
- const rect = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
412
- console.log('矩形周长:', eda.sys_Math.calculatePerimeter(rect));
413
-
414
- // 2. L 形轮廓(缺口裁掉一个角,周长按实际边界累加)
415
- const lShape = [
416
- { x: 0, y: 0 },
417
- { x: 100, y: 0 },
418
- { x: 100, y: 40 },
419
- { x: 40, y: 40 },
420
- { x: 40, y: 80 },
421
- { x: 0, y: 80 },
422
- ];
423
- console.log('L 形轮廓周长:', eda.sys_Math.calculatePerimeter(lShape));
424
-
425
- // 3. 布尔运算返回的多边形组同样可以作为输入
426
- const hole = [{ x: 30, y: 20 }, { x: 70, y: 20 }, { x: 70, y: 60 }, { x: 30, y: 60 }];
427
- const cut = eda.sys_Math.subtract(rect, hole);
428
- console.log('挖孔后多边形组的周长:', eda.sys_Math.calculatePerimeter(cut));
429
- ```
430
-
431
- ### contains
432
-
433
- # SYS\_Math.contains() method
434
-
435
- Determine whether polygon1 completely contains polygon2
436
-
437
- ## Signature
438
-
439
- ```typescript
440
- function contains(polygon1: TSYS_MathPolygonInput, polygon2: TSYS_MathPolygonInput): boolean;
441
- ```
442
-
443
- ## Parameters
444
-
445
- <table><thead><tr><th>
446
-
447
- Parameter
448
-
449
- </th><th>
450
-
451
- Type
452
-
453
- </th><th>
454
-
455
- Description
456
-
457
- </th></tr></thead>
458
- <tbody><tr><td>
459
-
460
- polygon1
461
-
462
- </td><td>
463
-
464
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
465
-
466
- </td><td>
467
-
468
- Outer polygon
469
-
470
- </td></tr>
471
- <tr><td>
472
-
473
- polygon2
474
-
475
- </td><td>
476
-
477
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
478
-
479
- </td><td>
480
-
481
- Internal polygon
482
-
483
- </td></tr>
484
- </tbody></table>
485
-
486
- ## Returns
487
-
488
- boolean
489
-
490
- Whether polygon1 completely contains polygon2
491
-
492
- ## Example
493
-
494
- ```javascript
495
- // 1. 小矩形完全落在大矩形内部 → true
496
- const board = [{ x: 0, y: 0 }, { x: 200, y: 0 }, { x: 200, y: 120 }, { x: 0, y: 120 }];
497
- const device = [{ x: 50, y: 40 }, { x: 90, y: 40 }, { x: 90, y: 70 }, { x: 50, y: 70 }];
498
- console.log('板框完全包含器件:', eda.sys_Math.contains(board, device));
499
-
500
- // 2. 器件跨越板框边界(部分重叠,不是完全包含)→ false
501
- const overhang = [{ x: 150, y: 40 }, { x: 250, y: 40 }, { x: 250, y: 70 }, { x: 150, y: 70 }];
502
- console.log('板框完全包含越界器件:', eda.sys_Math.contains(board, overhang));
503
-
504
- // 3. 只关心区域重叠不关心完全包含时,配合 intersects 使用
505
- console.log('两器件区域有重叠:', eda.sys_Math.intersects(device, overhang));
506
- ```
507
-
508
- ### containspoint
509
-
510
- # SYS\_Math.containsPoint() method
511
-
512
- Determine whether the point is inside the polygon
513
-
514
- ## Signature
515
-
516
- ```typescript
517
- function containsPoint(polygon: TSYS_MathPolygonInput, point: ISYS_MathPoint): boolean;
518
- ```
519
-
520
- ## Parameters
521
-
522
- <table><thead><tr><th>
523
-
524
- Parameter
525
-
526
- </th><th>
527
-
528
- Type
529
-
530
- </th><th>
531
-
532
- Description
533
-
534
- </th></tr></thead>
535
- <tbody><tr><td>
536
-
537
- polygon
538
-
539
- </td><td>
540
-
541
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
542
-
543
- </td><td>
544
-
545
- Polygon
546
-
547
- </td></tr>
548
- <tr><td>
549
-
550
- point
551
-
552
- </td><td>
553
-
554
- [ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)
555
-
556
- </td><td>
557
-
558
- The point to determine
559
-
560
- </td></tr>
561
- </tbody></table>
562
-
563
- ## Returns
564
-
565
- boolean
566
-
567
- Whether In polygon internal
568
-
569
- ## Remarks
570
-
571
- Use the ray casting method to determine whether the point is inside the polygon
572
-
573
- Due to the characteristics of the ray casting method, points on the boundary behave inconsistently: some boundary points may return `true`<!-- -->, and some may return `false`<!-- -->, depending on the geometric relationship between the ray direction and the boundary
574
-
575
- To strictly determine whether the point is on the boundary, combine [SYS\_Math.distanceToPoint()](./SYS_Math.md) to check whether the distance is `0`
576
-
577
- ## Example
578
-
579
- ```javascript
580
- // 1. 定义一块禁布区,测试三个典型位置的点
581
- const keepout = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
582
- const inside = { x: 50, y: 40 }; // 区域中心,明显在内部
583
- const outside = { x: 150, y: 40 }; // 区域右侧,明显在外部
584
- const corner = { x: 0, y: 0 }; // 顶点,落在边界上
585
-
586
- console.log('中心点在禁布区内:', eda.sys_Math.containsPoint(keepout, inside));
587
- console.log('外部点在禁布区内:', eda.sys_Math.containsPoint(keepout, outside));
588
- console.log('顶点在禁布区内:', eda.sys_Math.containsPoint(keepout, corner));
589
-
590
- // 2. 严格判断边界点:距离为 0 说明点恰好在边界上
591
- console.log('顶点到边界的距离:', eda.sys_Math.distanceToPoint(keepout, corner));
592
- ```
593
-
594
- ### distancetopoint
595
-
596
- # SYS\_Math.distanceToPoint() method
597
-
598
- Calculate the shortest distance from a point to the polygon boundary
599
-
600
- ## Signature
601
-
602
- ```typescript
603
- function distanceToPoint(polygon: TSYS_MathPolygonInput, point: ISYS_MathPoint): number;
604
- ```
605
-
606
- ## Parameters
607
-
608
- <table><thead><tr><th>
609
-
610
- Parameter
611
-
612
- </th><th>
613
-
614
- Type
615
-
616
- </th><th>
617
-
618
- Description
619
-
620
- </th></tr></thead>
621
- <tbody><tr><td>
622
-
623
- polygon
624
-
625
- </td><td>
626
-
627
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
628
-
629
- </td><td>
630
-
631
- Polygon
632
-
633
- </td></tr>
634
- <tr><td>
635
-
636
- point
637
-
638
- </td><td>
639
-
640
- [ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)
641
-
642
- </td><td>
643
-
644
- The point to calculate
645
-
646
- </td></tr>
647
- </tbody></table>
648
-
649
- ## Returns
650
-
651
- number
652
-
653
- Shortest distance. If the point is inside the polygon, `0` is returned
654
-
655
- ## Example
656
-
657
- ```javascript
658
- // 1. 定义矩形区域(右边界在 x = 100)
659
- const zone = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
660
-
661
- // 2. 外部点:到右边界的水平距离为 50
662
- const outsidePoint = { x: 150, y: 40 };
663
- console.log('外部点到边界的最短距离:', eda.sys_Math.distanceToPoint(zone, outsidePoint));
664
-
665
- // 3. 内部点:在多边形内部时返回 0
666
- const insidePoint = { x: 50, y: 40 };
667
- console.log('内部点到边界的最短距离:', eda.sys_Math.distanceToPoint(zone, insidePoint));
668
-
669
- // 4. 斜向最近边不是正对的那条边时,结果取真实垂线距离
670
- const diagonalPoint = { x: 130, y: 110 };
671
- console.log('斜向点到边界的最短距离:', eda.sys_Math.distanceToPoint(zone, diagonalPoint));
672
- ```
673
-
674
- ### getbbox
675
-
676
- # SYS\_Math.getBBox() method
677
-
678
- Get the minimum bounding rectangle (BBox) of the polygon
679
-
680
- ## Signature
681
-
682
- ```typescript
683
- function getBBox(polygon: TSYS_MathPolygonInput): ISYS_MathBBox;
684
- ```
685
-
686
- ## Parameters
687
-
688
- <table><thead><tr><th>
689
-
690
- Parameter
691
-
692
- </th><th>
693
-
694
- Type
695
-
696
- </th><th>
697
-
698
- Description
699
-
700
- </th></tr></thead>
701
- <tbody><tr><td>
702
-
703
- polygon
704
-
705
- </td><td>
706
-
707
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
708
-
709
- </td><td>
710
-
711
- Polygon
712
-
713
- </td></tr>
714
- </tbody></table>
715
-
716
- ## Returns
717
-
718
- [ISYS\_MathBBox](../interfaces/ISYS_MathBBox.md)
719
-
720
- BBox
721
-
722
- ## Example
723
-
724
- ```javascript
725
- // 1. 斜置的三角形,外接矩形由三个顶点的极值决定
726
- const triangle = [{ x: 30, y: 10 }, { x: 120, y: 50 }, { x: 60, y: 90 }];
727
- const bbox = eda.sys_Math.getBBox(triangle);
728
- console.log('三角形的最小外接矩形:', JSON.stringify(bbox));
729
-
730
- // 2. 布尔运算得到的多边形组同样可以求 BBox(取整组的外包范围)
731
- const rectA = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
732
- const rectB = [{ x: 50, y: 20 }, { x: 150, y: 20 }, { x: 150, y: 60 }, { x: 50, y: 60 }];
733
- const merged = eda.sys_Math.union(rectA, rectB);
734
- console.log('合并区域的最小外接矩形:', JSON.stringify(eda.sys_Math.getBBox(merged)));
735
-
736
- // 3. BBox 直接作为 bboxIntersects() 的输入做快速相交预检
737
- const other = { minX: 200, minY: 0, maxX: 280, maxY: 40 };
738
- console.log('两区域外接矩形相交:', eda.sys_Math.bboxIntersects(bbox, other));
739
- ```
740
-
741
- ### getcentroid
742
-
743
- # SYS\_Math.getCentroid() method
744
-
745
- Calculate the centroid of the polygon
746
-
747
- ## Signature
748
-
749
- ```typescript
750
- function getCentroid(polygon: TSYS_MathPolygonInput): ISYS_MathPoint;
751
- ```
752
-
753
- ## Parameters
754
-
755
- <table><thead><tr><th>
756
-
757
- Parameter
758
-
759
- </th><th>
760
-
761
- Type
762
-
763
- </th><th>
764
-
765
- Description
766
-
767
- </th></tr></thead>
768
- <tbody><tr><td>
769
-
770
- polygon
771
-
772
- </td><td>
773
-
774
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
775
-
776
- </td><td>
777
-
778
- Polygon
779
-
780
- </td></tr>
781
- </tbody></table>
782
-
783
- ## Returns
784
-
785
- [ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)
786
-
787
- Centroid coordinate
788
-
789
- ## Example
790
-
791
- ```javascript
792
- // 1. 规则矩形:质心就是几何中心 (50, 40)
793
- const rect = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
794
- console.log('矩形质心:', JSON.stringify(eda.sys_Math.getCentroid(rect)));
795
-
796
- // 2. L 形轮廓:质心向材料厚的一侧偏移,不再等于外接矩形中心 (50, 40)
797
- const lShape = [
798
- { x: 0, y: 0 },
799
- { x: 100, y: 0 },
800
- { x: 100, y: 40 },
801
- { x: 40, y: 40 },
802
- { x: 40, y: 80 },
803
- { x: 0, y: 80 },
804
- ];
805
- const centroid = eda.sys_Math.getCentroid(lShape);
806
- console.log('L 形质心:', JSON.stringify(centroid));
807
-
808
- // 3. 以质心为中心做旋转,图形绕自身几何中心原地转动
809
- const rotated = eda.sys_Math.rotate(rect, 90);
810
- console.log('绕质心旋转 90 度后的第一个点:', JSON.stringify(rotated[0]));
811
- ```
812
-
813
- ### intersection
814
-
815
- # SYS\_Math.intersection() method
816
-
817
- Calculate the intersection of two polygons
818
-
819
- ## Signature
820
-
821
- ```typescript
822
- function intersection(
823
- polygon1: TSYS_MathPolygonInput,
824
- polygon2: TSYS_MathPolygonInput,
825
- ): TSYS_MathPolygonGroup;
826
- ```
827
-
828
- ## Parameters
829
-
830
- <table><thead><tr><th>
831
-
832
- Parameter
833
-
834
- </th><th>
835
-
836
- Type
837
-
838
- </th><th>
839
-
840
- Description
841
-
842
- </th></tr></thead>
843
- <tbody><tr><td>
844
-
845
- polygon1
846
-
847
- </td><td>
848
-
849
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
850
-
851
- </td><td>
852
-
853
- Polygon 1
854
-
855
- </td></tr>
856
- <tr><td>
857
-
858
- polygon2
859
-
860
- </td><td>
861
-
862
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
863
-
864
- </td><td>
865
-
866
- Polygon 2
867
-
868
- </td></tr>
869
- </tbody></table>
870
-
871
- ## Returns
872
-
873
- [TSYS\_MathPolygonGroup](../types/TSYS_MathPolygonGroup.md)
874
-
875
- Polygon group of the intersection result. An empty array means no intersection
876
-
877
- ## Example
878
-
879
- ```javascript
880
- // 1. 两块部分重叠的矩形区域
881
- const copperA = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
882
- const copperB = [{ x: 50, y: 20 }, { x: 150, y: 20 }, { x: 150, y: 60 }, { x: 50, y: 60 }];
883
-
884
- // 2. 求交集,结果为一个新的多边形组
885
- const overlap = eda.sys_Math.intersection(copperA, copperB);
886
- console.log('重叠区域个数:', overlap.length);
887
- console.log('重叠区域外环顶点:', overlap[0].outer.length, '个');
888
- console.log('重叠区域孔洞数:', overlap[0].holes.length);
889
-
890
- // 3. 交集面积:100 x 100 与 100 x 80 的重叠部分为 50 x 40 = 2000
891
- console.log('重叠区域面积:', eda.sys_Math.calculateArea(overlap));
892
-
893
- // 4. 完全分离的两个多边形没有交集,返回空数组
894
- const far = [{ x: 200, y: 0 }, { x: 280, y: 0 }, { x: 280, y: 40 }, { x: 200, y: 40 }];
895
- console.log('分离区域的交集个数:', eda.sys_Math.intersection(copperA, far).length);
896
- ```
897
-
898
- ### intersects
899
-
900
- # SYS\_Math.intersects() method
901
-
902
- Determine whether two polygons intersect
903
-
904
- ## Signature
905
-
906
- ```typescript
907
- function intersects(polygon1: TSYS_MathPolygonInput, polygon2: TSYS_MathPolygonInput): boolean;
908
- ```
909
-
910
- ## Parameters
911
-
912
- <table><thead><tr><th>
913
-
914
- Parameter
915
-
916
- </th><th>
917
-
918
- Type
919
-
920
- </th><th>
921
-
922
- Description
923
-
924
- </th></tr></thead>
925
- <tbody><tr><td>
926
-
927
- polygon1
928
-
929
- </td><td>
930
-
931
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
932
-
933
- </td><td>
934
-
935
- Polygon 1
936
-
937
- </td></tr>
938
- <tr><td>
939
-
940
- polygon2
941
-
942
- </td><td>
943
-
944
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
945
-
946
- </td><td>
947
-
948
- Polygon 2
949
-
950
- </td></tr>
951
- </tbody></table>
952
-
953
- ## Returns
954
-
955
- boolean
956
-
957
- Whether they intersect
958
-
959
- ## Remarks
960
-
961
- Determine whether the regions of two polygons have any overlap (including containment, partial intersection, and boundary contact)
962
-
963
- ## Example
964
-
965
- ```javascript
966
- // 1. 部分重叠的两个矩形 → true
967
- const trace = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
968
- const keepout = [{ x: 50, y: 20 }, { x: 150, y: 20 }, { x: 150, y: 60 }, { x: 50, y: 60 }];
969
- console.log('走线闯入禁布区:', eda.sys_Math.intersects(trace, keepout));
970
-
971
- // 2. 完全分离 → false
972
- const far = [{ x: 200, y: 0 }, { x: 280, y: 0 }, { x: 280, y: 40 }, { x: 200, y: 40 }];
973
- console.log('走线远离另一区域:', eda.sys_Math.intersects(trace, far));
974
-
975
- // 3. 完全包含也是相交的一种 → true
976
- const small = [{ x: 20, y: 20 }, { x: 60, y: 20 }, { x: 60, y: 50 }, { x: 20, y: 50 }];
977
- console.log('小区域整体在走线范围内:', eda.sys_Math.intersects(trace, small));
978
-
979
- // 4. 仅边界贴合同样算相交 → true
980
- const touching = [{ x: 100, y: 0 }, { x: 180, y: 0 }, { x: 180, y: 40 }, { x: 100, y: 40 }];
981
- console.log('两区域边界贴合:', eda.sys_Math.intersects(trace, touching));
982
- ```
983
-
984
- ### rotate
985
-
986
- # SYS\_Math.rotate() method
987
-
988
- Rotate the polygon
989
-
990
- ## Signature
991
-
992
- ```typescript
993
- function rotate(
994
- polygon: TSYS_MathPolygonInput,
995
- angle: number,
996
- centerX?: number,
997
- centerY?: number,
998
- ): Array<ISYS_MathPoint>;
999
- ```
1000
-
1001
- ## Parameters
1002
-
1003
- <table><thead><tr><th>
1004
-
1005
- Parameter
1006
-
1007
- </th><th>
1008
-
1009
- Type
1010
-
1011
- </th><th>
1012
-
1013
- Description
1014
-
1015
- </th></tr></thead>
1016
- <tbody><tr><td>
1017
-
1018
- polygon
1019
-
1020
- </td><td>
1021
-
1022
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1023
-
1024
- </td><td>
1025
-
1026
- Polygon
1027
-
1028
- </td></tr>
1029
- <tr><td>
1030
-
1031
- angle
1032
-
1033
- </td><td>
1034
-
1035
- number
1036
-
1037
- </td><td>
1038
-
1039
- Rotation angle (in degrees, positive values are counterclockwise)
1040
-
1041
- </td></tr>
1042
- <tr><td>
1043
-
1044
- centerX
1045
-
1046
- </td><td>
1047
-
1048
- number
1049
-
1050
- </td><td>
1051
-
1052
- _(Optional)_ X coordinate of the rotation center, defaulting to the centroid
1053
-
1054
- </td></tr>
1055
- <tr><td>
1056
-
1057
- centerY
1058
-
1059
- </td><td>
1060
-
1061
- number
1062
-
1063
- </td><td>
1064
-
1065
- _(Optional)_ Y coordinate of the rotation center, defaulting to the centroid
1066
-
1067
- </td></tr>
1068
- </tbody></table>
1069
-
1070
- ## Returns
1071
-
1072
- Array&lt;[ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)<!-- -->&gt;
1073
-
1074
- Array of discrete points after rotation
1075
-
1076
- ## Example
1077
-
1078
- ```javascript
1079
- // 1. 定义一个矩形安装座
1080
- const mount = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
1081
-
1082
- // 2. 不传中心:绕质心 (50, 40) 逆时针旋转 90 度,占位原地转身
1083
- const selfRotated = eda.sys_Math.rotate(mount, 90);
1084
- console.log('绕质心旋转后的顶点:', JSON.stringify(selfRotated));
1085
-
1086
- // 3. 传中心参数:绕坐标原点 (0, 0) 旋转 90 度,图形整体公转
1087
- // 逆时针 90 度把 (x, y) 映射为 (-y, x)
1088
- const originRotated = eda.sys_Math.rotate(mount, 90, 0, 0);
1089
- console.log('绕原点旋转后的顶点:', JSON.stringify(originRotated));
1090
-
1091
- // 4. 负角度顺时针旋转,与正角度互为逆变换
1092
- const back = eda.sys_Math.rotate(originRotated, -90, 0, 0);
1093
- console.log('再顺时针转回后的第一个点:', JSON.stringify(back[0]));
1094
- ```
1095
-
1096
- ### scale
1097
-
1098
- # SYS\_Math.scale() method
1099
-
1100
- Scale the polygon
1101
-
1102
- ## Signature
1103
-
1104
- ```typescript
1105
- function scale(
1106
- polygon: TSYS_MathPolygonInput,
1107
- scaleX: number,
1108
- scaleY?: number,
1109
- centerX?: number,
1110
- centerY?: number,
1111
- ): Array<ISYS_MathPoint>;
1112
- ```
1113
-
1114
- ## Parameters
1115
-
1116
- <table><thead><tr><th>
1117
-
1118
- Parameter
1119
-
1120
- </th><th>
1121
-
1122
- Type
1123
-
1124
- </th><th>
1125
-
1126
- Description
1127
-
1128
- </th></tr></thead>
1129
- <tbody><tr><td>
1130
-
1131
- polygon
1132
-
1133
- </td><td>
1134
-
1135
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1136
-
1137
- </td><td>
1138
-
1139
- Polygon
1140
-
1141
- </td></tr>
1142
- <tr><td>
1143
-
1144
- scaleX
1145
-
1146
- </td><td>
1147
-
1148
- number
1149
-
1150
- </td><td>
1151
-
1152
- X direction scale ratio
1153
-
1154
- </td></tr>
1155
- <tr><td>
1156
-
1157
- scaleY
1158
-
1159
- </td><td>
1160
-
1161
- number
1162
-
1163
- </td><td>
1164
-
1165
- _(Optional)_ Y direction scale ratio, defaulting to the same as scaleX
1166
-
1167
- </td></tr>
1168
- <tr><td>
1169
-
1170
- centerX
1171
-
1172
- </td><td>
1173
-
1174
- number
1175
-
1176
- </td><td>
1177
-
1178
- _(Optional)_ X coordinate of the scaling center, defaulting to the centroid
1179
-
1180
- </td></tr>
1181
- <tr><td>
1182
-
1183
- centerY
1184
-
1185
- </td><td>
1186
-
1187
- number
1188
-
1189
- </td><td>
1190
-
1191
- _(Optional)_ Y coordinate of the scaling center, defaulting to the centroid
1192
-
1193
- </td></tr>
1194
- </tbody></table>
1195
-
1196
- ## Returns
1197
-
1198
- Array&lt;[ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)<!-- -->&gt;
1199
-
1200
- Array of discrete points after scaling
1201
-
1202
- ## Example
1203
-
1204
- ```javascript
1205
- // 1. 定义一个矩形焊区
1206
- const pad = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
1207
-
1208
- // 2. 等比放大 1.5 倍:绕质心原地放大,面积变为 2.25 倍
1209
- const enlarged = eda.sys_Math.scale(pad, 1.5);
1210
- console.log('放大 1.5 倍后的顶点:', JSON.stringify(enlarged));
1211
- console.log('放大后的面积:', eda.sys_Math.calculateArea(enlarged));
1212
-
1213
- // 3. X、Y 采用不同比例:只在 X 方向拉宽 2 倍(绕质心,Y 不变)
1214
- const stretched = eda.sys_Math.scale(pad, 2, 1);
1215
- console.log('仅 X 方向放大 2 倍后的顶点:', JSON.stringify(stretched));
1216
-
1217
- // 4. 指定缩放中心 (0, 0):各点坐标直接乘以比例
1218
- const fromOrigin = eda.sys_Math.scale(pad, 2, 2, 0, 0);
1219
- console.log('绕原点放大后的第一个点:', JSON.stringify(fromOrigin[0]));
1220
- ```
1221
-
1222
- ### subtract
1223
-
1224
- # SYS\_Math.subtract() method
1225
-
1226
- Calculate the difference of two polygons (polygon1 - polygon2)
1227
-
1228
- ## Signature
1229
-
1230
- ```typescript
1231
- function subtract(
1232
- polygon1: TSYS_MathPolygonInput,
1233
- polygon2: TSYS_MathPolygonInput,
1234
- ): TSYS_MathPolygonGroup;
1235
- ```
1236
-
1237
- ## Parameters
1238
-
1239
- <table><thead><tr><th>
1240
-
1241
- Parameter
1242
-
1243
- </th><th>
1244
-
1245
- Type
1246
-
1247
- </th><th>
1248
-
1249
- Description
1250
-
1251
- </th></tr></thead>
1252
- <tbody><tr><td>
1253
-
1254
- polygon1
1255
-
1256
- </td><td>
1257
-
1258
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1259
-
1260
- </td><td>
1261
-
1262
- Minuend polygon
1263
-
1264
- </td></tr>
1265
- <tr><td>
1266
-
1267
- polygon2
1268
-
1269
- </td><td>
1270
-
1271
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1272
-
1273
- </td><td>
1274
-
1275
- Subtrahend polygon
1276
-
1277
- </td></tr>
1278
- </tbody></table>
1279
-
1280
- ## Returns
1281
-
1282
- [TSYS\_MathPolygonGroup](../types/TSYS_MathPolygonGroup.md)
1283
-
1284
- Polygon group of the difference result, preserving the association between outer rings and holes
1285
-
1286
- ## Example
1287
-
1288
- ```javascript
1289
- // 1. 大矩形铺铜区域与一个完全落在其内部的矩形开孔区
1290
- const copper = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
1291
- const hole = [{ x: 30, y: 20 }, { x: 70, y: 20 }, { x: 70, y: 60 }, { x: 30, y: 60 }];
1292
-
1293
- // 2. 挖孔:差集结果的多边形组里,开孔区被记为孔洞
1294
- const cut = eda.sys_Math.subtract(copper, hole);
1295
- console.log('差集结果多边形个数:', cut.length);
1296
- console.log('孔洞数:', cut[0].holes.length);
1297
-
1298
- // 3. 挖孔后的净面积:100 x 80 - 40 x 40 = 6400
1299
- console.log('挖孔后的净面积:', eda.sys_Math.calculateArea(cut));
1300
-
1301
- // 4. 减去完全分离的多边形不产生任何变化(结果仍是原形状的等价组)
1302
- const far = [{ x: 200, y: 0 }, { x: 280, y: 0 }, { x: 280, y: 40 }, { x: 200, y: 40 }];
1303
- const untouched = eda.sys_Math.subtract(copper, far);
1304
- console.log('减去分离区域后的面积:', eda.sys_Math.calculateArea(untouched));
1305
- ```
1306
-
1307
- ### translate
1308
-
1309
- # SYS\_Math.translate() method
1310
-
1311
- Translate the polygon
1312
-
1313
- ## Signature
1314
-
1315
- ```typescript
1316
- function translate(polygon: TSYS_MathPolygonInput, dx: number, dy: number): Array<ISYS_MathPoint>;
1317
- ```
1318
-
1319
- ## Parameters
1320
-
1321
- <table><thead><tr><th>
1322
-
1323
- Parameter
1324
-
1325
- </th><th>
1326
-
1327
- Type
1328
-
1329
- </th><th>
1330
-
1331
- Description
1332
-
1333
- </th></tr></thead>
1334
- <tbody><tr><td>
1335
-
1336
- polygon
1337
-
1338
- </td><td>
1339
-
1340
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1341
-
1342
- </td><td>
1343
-
1344
- Polygon
1345
-
1346
- </td></tr>
1347
- <tr><td>
1348
-
1349
- dx
1350
-
1351
- </td><td>
1352
-
1353
- number
1354
-
1355
- </td><td>
1356
-
1357
- X direction offset
1358
-
1359
- </td></tr>
1360
- <tr><td>
1361
-
1362
- dy
1363
-
1364
- </td><td>
1365
-
1366
- number
1367
-
1368
- </td><td>
1369
-
1370
- Y direction offset
1371
-
1372
- </td></tr>
1373
- </tbody></table>
1374
-
1375
- ## Returns
1376
-
1377
- Array&lt;[ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)<!-- -->&gt;
1378
-
1379
- Array of discrete points after translation
1380
-
1381
- ## Example
1382
-
1383
- ```javascript
1384
- // 1. 定义一个器件占位轮廓
1385
- const footprint = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
1386
-
1387
- // 2. 向右平移 200、向上平移 150(得到排布到新位置的轮廓)
1388
- const placed = eda.sys_Math.translate(footprint, 200, 150);
1389
- console.log('平移后的顶点:', JSON.stringify(placed));
1390
-
1391
- // 3. 负偏移向左下方平移
1392
- const back = eda.sys_Math.translate(placed, -200, -150);
1393
- console.log('再平移回原位后的第一个点:', JSON.stringify(back[0]));
1394
-
1395
- // 4. 平移前后形状不变,周长与面积保持一致
1396
- console.log('平移前后周长:', eda.sys_Math.calculatePerimeter(footprint), '/', eda.sys_Math.calculatePerimeter(placed));
1397
- ```
1398
-
1399
- ### union
1400
-
1401
- # SYS\_Math.union() method
1402
-
1403
- Calculate the union of two polygons
1404
-
1405
- ## Signature
1406
-
1407
- ```typescript
1408
- function union(
1409
- polygon1: TSYS_MathPolygonInput,
1410
- polygon2: TSYS_MathPolygonInput,
1411
- ): TSYS_MathPolygonGroup;
1412
- ```
1413
-
1414
- ## Parameters
1415
-
1416
- <table><thead><tr><th>
1417
-
1418
- Parameter
1419
-
1420
- </th><th>
1421
-
1422
- Type
1423
-
1424
- </th><th>
1425
-
1426
- Description
1427
-
1428
- </th></tr></thead>
1429
- <tbody><tr><td>
1430
-
1431
- polygon1
1432
-
1433
- </td><td>
1434
-
1435
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1436
-
1437
- </td><td>
1438
-
1439
- Polygon 1
1440
-
1441
- </td></tr>
1442
- <tr><td>
1443
-
1444
- polygon2
1445
-
1446
- </td><td>
1447
-
1448
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1449
-
1450
- </td><td>
1451
-
1452
- Polygon 2
1453
-
1454
- </td></tr>
1455
- </tbody></table>
1456
-
1457
- ## Returns
1458
-
1459
- [TSYS\_MathPolygonGroup](../types/TSYS_MathPolygonGroup.md)
1460
-
1461
- Polygon group of the union result, preserving the association between outer rings and holes
1462
-
1463
- ## Example
1464
-
1465
- ```javascript
1466
- // 1. 两块部分重叠的铺铜区域
1467
- const copperA = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
1468
- const copperB = [{ x: 50, y: 20 }, { x: 150, y: 20 }, { x: 150, y: 60 }, { x: 50, y: 60 }];
1469
-
1470
- // 2. 合并:结果是一个多边形组(重叠区域融合成单一外环,无孔洞)
1471
- const merged = eda.sys_Math.union(copperA, copperB);
1472
- console.log('合并后多边形个数:', merged.length);
1473
- console.log('合并后外环顶点数:', merged[0].outer.length);
1474
- console.log('合并后孔洞数:', merged[0].holes.length);
1475
-
1476
- // 3. 合并后的净面积:8000 + 4000 - 重叠的 2000 = 10000(重叠只算一次)
1477
- console.log('合并后面积:', eda.sys_Math.calculateArea(merged));
1478
-
1479
- // 4. 完全分离的两个多边形合并时仍是两个独立多边形
1480
- const far = [{ x: 200, y: 0 }, { x: 280, y: 0 }, { x: 280, y: 40 }, { x: 200, y: 40 }];
1481
- console.log('分离区域合并后个数:', eda.sys_Math.union(copperA, far).length);
1482
- ```
1483
-
1484
- ### xor
1485
-
1486
- # SYS\_Math.xor() method
1487
-
1488
- Calculate the symmetric difference (XOR) of two polygons
1489
-
1490
- ## Signature
1491
-
1492
- ```typescript
1493
- function xor(
1494
- polygon1: TSYS_MathPolygonInput,
1495
- polygon2: TSYS_MathPolygonInput,
1496
- ): TSYS_MathPolygonGroup;
1497
- ```
1498
-
1499
- ## Parameters
1500
-
1501
- <table><thead><tr><th>
1502
-
1503
- Parameter
1504
-
1505
- </th><th>
1506
-
1507
- Type
1508
-
1509
- </th><th>
1510
-
1511
- Description
1512
-
1513
- </th></tr></thead>
1514
- <tbody><tr><td>
1515
-
1516
- polygon1
1517
-
1518
- </td><td>
1519
-
1520
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1521
-
1522
- </td><td>
1523
-
1524
- Polygon 1
1525
-
1526
- </td></tr>
1527
- <tr><td>
1528
-
1529
- polygon2
1530
-
1531
- </td><td>
1532
-
1533
- [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1534
-
1535
- </td><td>
1536
-
1537
- Polygon 2
1538
-
1539
- </td></tr>
1540
- </tbody></table>
1541
-
1542
- ## Returns
1543
-
1544
- [TSYS\_MathPolygonGroup](../types/TSYS_MathPolygonGroup.md)
1545
-
1546
- Polygon group of the symmetric difference result, preserving the association between outer rings and holes
1547
-
1548
- ## Example
1549
-
1550
- ```javascript
1551
- // 1. 新旧两版部分重叠的板框轮廓
1552
- const oldOutline = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
1553
- const newOutline = [{ x: 50, y: 20 }, { x: 150, y: 20 }, { x: 150, y: 60 }, { x: 50, y: 60 }];
1554
-
1555
- // 2. 异或:重叠的中间区域被扣除,剩下两侧不重叠的部分
1556
- const diff = eda.sys_Math.xor(oldOutline, newOutline);
1557
- console.log('差异区域多边形个数:', diff.length);
1558
-
1559
- // 3. 异或面积:8000 + 4000 - 2 x 重叠 2000 = 8000(重叠部分两次都不算)
1560
- console.log('差异区域总面积:', eda.sys_Math.calculateArea(diff));
1561
-
1562
- // 4. 完全相同的两个多边形异或结果为空数组(无差异;空组不能再传给
1563
- // calculateArea,空输入会抛『无法识别的多边形输入格式』)
1564
- console.log('自身与自身异或的差异区域个数:', eda.sys_Math.xor(oldOutline, oldOutline).length);
1565
- ```
1
+ # SYS\_Math class
2
+
3
+ System / math class
4
+
5
+ ## Signature
6
+
7
+ ```typescript
8
+ class SYS_Math
9
+ ```
10
+
11
+ ## Remarks
12
+
13
+ Provides polygon geometry calculation methods, supporting discrete point coordinates and [TPCB\_PolygonSourceArray](../types/TPCB_PolygonSourceArray.md) polygon data
14
+
15
+ ## Methods
16
+
17
+ <table><thead><tr><th>
18
+
19
+ Method
20
+
21
+ </th><th>
22
+
23
+ Modifiers
24
+
25
+ </th><th>
26
+
27
+ Description
28
+
29
+ </th></tr></thead>
30
+ <tbody><tr><td>
31
+
32
+ [bboxIntersects(bbox1, bbox2)](./SYS_Math.md)
33
+
34
+ </td><td>
35
+
36
+ </td><td>
37
+
38
+ Quickly determine whether two BBoxes intersect
39
+
40
+ </td></tr>
41
+ <tr><td>
42
+
43
+ [calculateArea(polygon)](./SYS_Math.md)
44
+
45
+ </td><td>
46
+
47
+ </td><td>
48
+
49
+ Calculate the area of a polygon
50
+
51
+ </td></tr>
52
+ <tr><td>
53
+
54
+ [calculatePerimeter(polygon)](./SYS_Math.md)
55
+
56
+ </td><td>
57
+
58
+ </td><td>
59
+
60
+ Calculate the perimeter of a polygon
61
+
62
+ </td></tr>
63
+ <tr><td>
64
+
65
+ [contains(polygon1, polygon2)](./SYS_Math.md)
66
+
67
+ </td><td>
68
+
69
+ </td><td>
70
+
71
+ Determine whether polygon1 completely contains polygon2
72
+
73
+ </td></tr>
74
+ <tr><td>
75
+
76
+ [containsPoint(polygon, point)](./SYS_Math.md)
77
+
78
+ </td><td>
79
+
80
+ </td><td>
81
+
82
+ Determine whether the point is inside the polygon
83
+
84
+ </td></tr>
85
+ <tr><td>
86
+
87
+ [distanceToPoint(polygon, point)](./SYS_Math.md)
88
+
89
+ </td><td>
90
+
91
+ </td><td>
92
+
93
+ Calculate the shortest distance from a point to the polygon boundary
94
+
95
+ </td></tr>
96
+ <tr><td>
97
+
98
+ [getBBox(polygon)](./SYS_Math.md)
99
+
100
+ </td><td>
101
+
102
+ </td><td>
103
+
104
+ Get the minimum bounding rectangle (BBox) of the polygon
105
+
106
+ </td></tr>
107
+ <tr><td>
108
+
109
+ [getCentroid(polygon)](./SYS_Math.md)
110
+
111
+ </td><td>
112
+
113
+ </td><td>
114
+
115
+ Calculate the centroid of the polygon
116
+
117
+ </td></tr>
118
+ <tr><td>
119
+
120
+ [intersection(polygon1, polygon2)](./SYS_Math.md)
121
+
122
+ </td><td>
123
+
124
+ </td><td>
125
+
126
+ Calculate the intersection of two polygons
127
+
128
+ </td></tr>
129
+ <tr><td>
130
+
131
+ [intersects(polygon1, polygon2)](./SYS_Math.md)
132
+
133
+ </td><td>
134
+
135
+ </td><td>
136
+
137
+ Determine whether two polygons intersect
138
+
139
+ </td></tr>
140
+ <tr><td>
141
+
142
+ [rotate(polygon, angle, centerX, centerY)](./SYS_Math.md)
143
+
144
+ </td><td>
145
+
146
+ </td><td>
147
+
148
+ Rotate the polygon
149
+
150
+ </td></tr>
151
+ <tr><td>
152
+
153
+ [scale(polygon, scaleX, scaleY, centerX, centerY)](./SYS_Math.md)
154
+
155
+ </td><td>
156
+
157
+ </td><td>
158
+
159
+ Scale the polygon
160
+
161
+ </td></tr>
162
+ <tr><td>
163
+
164
+ [subtract(polygon1, polygon2)](./SYS_Math.md)
165
+
166
+ </td><td>
167
+
168
+ </td><td>
169
+
170
+ Calculate the difference of two polygons (polygon1 - polygon2)
171
+
172
+ </td></tr>
173
+ <tr><td>
174
+
175
+ [translate(polygon, dx, dy)](./SYS_Math.md)
176
+
177
+ </td><td>
178
+
179
+ </td><td>
180
+
181
+ Translate the polygon
182
+
183
+ </td></tr>
184
+ <tr><td>
185
+
186
+ [union(polygon1, polygon2)](./SYS_Math.md)
187
+
188
+ </td><td>
189
+
190
+ </td><td>
191
+
192
+ Calculate the union of two polygons
193
+
194
+ </td></tr>
195
+ <tr><td>
196
+
197
+ [xor(polygon1, polygon2)](./SYS_Math.md)
198
+
199
+ </td><td>
200
+
201
+ </td><td>
202
+
203
+ Calculate the symmetric difference (XOR) of two polygons
204
+
205
+ </td></tr>
206
+ </tbody></table>
207
+
208
+ ---
209
+
210
+ ## 方法详情
211
+
212
+ ### bboxintersects
213
+
214
+ # SYS\_Math.bboxIntersects() method
215
+
216
+ Quickly determine whether two BBoxes intersect
217
+
218
+ ## Signature
219
+
220
+ ```typescript
221
+ function bboxIntersects(bbox1: ISYS_MathBBox, bbox2: ISYS_MathBBox): boolean;
222
+ ```
223
+
224
+ ## Parameters
225
+
226
+ <table><thead><tr><th>
227
+
228
+ Parameter
229
+
230
+ </th><th>
231
+
232
+ Type
233
+
234
+ </th><th>
235
+
236
+ Description
237
+
238
+ </th></tr></thead>
239
+ <tbody><tr><td>
240
+
241
+ bbox1
242
+
243
+ </td><td>
244
+
245
+ [ISYS\_MathBBox](../interfaces/ISYS_MathBBox.md)
246
+
247
+ </td><td>
248
+
249
+ BBox 1
250
+
251
+ </td></tr>
252
+ <tr><td>
253
+
254
+ bbox2
255
+
256
+ </td><td>
257
+
258
+ [ISYS\_MathBBox](../interfaces/ISYS_MathBBox.md)
259
+
260
+ </td><td>
261
+
262
+ BBox 2
263
+
264
+ </td></tr>
265
+ </tbody></table>
266
+
267
+ ## Returns
268
+
269
+ boolean
270
+
271
+ Whether they intersect
272
+
273
+ ## Example
274
+
275
+ ```javascript
276
+ // 1. 两块铺铜区域的外接矩形(部分重叠)
277
+ const zoneA = { minX: 0, minY: 0, maxX: 100, maxY: 80 };
278
+ const zoneB = { minX: 50, minY: 20, maxX: 150, maxY: 60 };
279
+ console.log('区域 A 与区域 B 相交:', eda.sys_Math.bboxIntersects(zoneA, zoneB));
280
+
281
+ // 2. 完全分离的两个矩形(不相交,粗筛即可排除)
282
+ const zoneC = { minX: 200, minY: 200, maxX: 300, maxY: 280 };
283
+ console.log('区域 A 与区域 C 相交:', eda.sys_Math.bboxIntersects(zoneA, zoneC));
284
+
285
+ // 3. 仅有边界接触也算相交(贴合的两个矩形)
286
+ const zoneD = { minX: 100, minY: 0, maxX: 180, maxY: 40 };
287
+ console.log('区域 A 与区域 D 相交:', eda.sys_Math.bboxIntersects(zoneA, zoneD));
288
+ ```
289
+
290
+ ### calculatearea
291
+
292
+ # SYS\_Math.calculateArea() method
293
+
294
+ Calculate the area of a polygon
295
+
296
+ ## Signature
297
+
298
+ ```typescript
299
+ function calculateArea(polygon: TSYS_MathPolygonInput): number;
300
+ ```
301
+
302
+ ## Parameters
303
+
304
+ <table><thead><tr><th>
305
+
306
+ Parameter
307
+
308
+ </th><th>
309
+
310
+ Type
311
+
312
+ </th><th>
313
+
314
+ Description
315
+
316
+ </th></tr></thead>
317
+ <tbody><tr><td>
318
+
319
+ polygon
320
+
321
+ </td><td>
322
+
323
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
324
+
325
+ </td><td>
326
+
327
+ Polygon or polygon group
328
+
329
+ </td></tr>
330
+ </tbody></table>
331
+
332
+ ## Returns
333
+
334
+ number
335
+
336
+ Area (absolute area for a single polygon, net area for a polygon group)
337
+
338
+ ## Remarks
339
+
340
+ Calculated using the Shoelace formula: - When a single polygon is passed in, the absolute area of the polygon is returned - When a polygon group ([TSYS\_MathPolygonGroup](../types/TSYS_MathPolygonGroup.md)<!-- -->, such as the return value of Boolean operations) is passed in, the net area is obtained by subtracting the sum of all hole areas from the sum of all outer ring areas
341
+
342
+ ## Example
343
+
344
+ ```javascript
345
+ // 1. 单个矩形 100 x 80(单位随输入坐标系,PCB 场景下通常是 mil)
346
+ const rect = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
347
+ console.log('矩形面积:', eda.sys_Math.calculateArea(rect));
348
+
349
+ // 2. 单个三角形(底 100 高 60,面积应为 3000)
350
+ const triangle = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 50, y: 60 }];
351
+ console.log('三角形面积:', eda.sys_Math.calculateArea(triangle));
352
+
353
+ // 3. 布尔运算返回的多边形组直接作为输入,得到净面积(含孔洞时自动扣除)
354
+ const overlap = [{ x: 50, y: 20 }, { x: 150, y: 20 }, { x: 150, y: 60 }, { x: 50, y: 60 }];
355
+ const merged = eda.sys_Math.union(rect, overlap);
356
+ console.log('两矩形合并后的净面积:', eda.sys_Math.calculateArea(merged));
357
+ ```
358
+
359
+ ### calculateperimeter
360
+
361
+ # SYS\_Math.calculatePerimeter() method
362
+
363
+ Calculate the perimeter of a polygon
364
+
365
+ ## Signature
366
+
367
+ ```typescript
368
+ function calculatePerimeter(polygon: TSYS_MathPolygonInput): number;
369
+ ```
370
+
371
+ ## Parameters
372
+
373
+ <table><thead><tr><th>
374
+
375
+ Parameter
376
+
377
+ </th><th>
378
+
379
+ Type
380
+
381
+ </th><th>
382
+
383
+ Description
384
+
385
+ </th></tr></thead>
386
+ <tbody><tr><td>
387
+
388
+ polygon
389
+
390
+ </td><td>
391
+
392
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
393
+
394
+ </td><td>
395
+
396
+ Polygon
397
+
398
+ </td></tr>
399
+ </tbody></table>
400
+
401
+ ## Returns
402
+
403
+ number
404
+
405
+ Perimeter
406
+
407
+ ## Example
408
+
409
+ ```javascript
410
+ // 1. 矩形 100 x 80,周长应为 360
411
+ const rect = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
412
+ console.log('矩形周长:', eda.sys_Math.calculatePerimeter(rect));
413
+
414
+ // 2. L 形轮廓(缺口裁掉一个角,周长按实际边界累加)
415
+ const lShape = [
416
+ { x: 0, y: 0 },
417
+ { x: 100, y: 0 },
418
+ { x: 100, y: 40 },
419
+ { x: 40, y: 40 },
420
+ { x: 40, y: 80 },
421
+ { x: 0, y: 80 },
422
+ ];
423
+ console.log('L 形轮廓周长:', eda.sys_Math.calculatePerimeter(lShape));
424
+
425
+ // 3. 布尔运算返回的多边形组同样可以作为输入
426
+ const hole = [{ x: 30, y: 20 }, { x: 70, y: 20 }, { x: 70, y: 60 }, { x: 30, y: 60 }];
427
+ const cut = eda.sys_Math.subtract(rect, hole);
428
+ console.log('挖孔后多边形组的周长:', eda.sys_Math.calculatePerimeter(cut));
429
+ ```
430
+
431
+ ### contains
432
+
433
+ # SYS\_Math.contains() method
434
+
435
+ Determine whether polygon1 completely contains polygon2
436
+
437
+ ## Signature
438
+
439
+ ```typescript
440
+ function contains(polygon1: TSYS_MathPolygonInput, polygon2: TSYS_MathPolygonInput): boolean;
441
+ ```
442
+
443
+ ## Parameters
444
+
445
+ <table><thead><tr><th>
446
+
447
+ Parameter
448
+
449
+ </th><th>
450
+
451
+ Type
452
+
453
+ </th><th>
454
+
455
+ Description
456
+
457
+ </th></tr></thead>
458
+ <tbody><tr><td>
459
+
460
+ polygon1
461
+
462
+ </td><td>
463
+
464
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
465
+
466
+ </td><td>
467
+
468
+ Outer polygon
469
+
470
+ </td></tr>
471
+ <tr><td>
472
+
473
+ polygon2
474
+
475
+ </td><td>
476
+
477
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
478
+
479
+ </td><td>
480
+
481
+ Internal polygon
482
+
483
+ </td></tr>
484
+ </tbody></table>
485
+
486
+ ## Returns
487
+
488
+ boolean
489
+
490
+ Whether polygon1 completely contains polygon2
491
+
492
+ ## Example
493
+
494
+ ```javascript
495
+ // 1. 小矩形完全落在大矩形内部 → true
496
+ const board = [{ x: 0, y: 0 }, { x: 200, y: 0 }, { x: 200, y: 120 }, { x: 0, y: 120 }];
497
+ const device = [{ x: 50, y: 40 }, { x: 90, y: 40 }, { x: 90, y: 70 }, { x: 50, y: 70 }];
498
+ console.log('板框完全包含器件:', eda.sys_Math.contains(board, device));
499
+
500
+ // 2. 器件跨越板框边界(部分重叠,不是完全包含)→ false
501
+ const overhang = [{ x: 150, y: 40 }, { x: 250, y: 40 }, { x: 250, y: 70 }, { x: 150, y: 70 }];
502
+ console.log('板框完全包含越界器件:', eda.sys_Math.contains(board, overhang));
503
+
504
+ // 3. 只关心区域重叠不关心完全包含时,配合 intersects 使用
505
+ console.log('两器件区域有重叠:', eda.sys_Math.intersects(device, overhang));
506
+ ```
507
+
508
+ ### containspoint
509
+
510
+ # SYS\_Math.containsPoint() method
511
+
512
+ Determine whether the point is inside the polygon
513
+
514
+ ## Signature
515
+
516
+ ```typescript
517
+ function containsPoint(polygon: TSYS_MathPolygonInput, point: ISYS_MathPoint): boolean;
518
+ ```
519
+
520
+ ## Parameters
521
+
522
+ <table><thead><tr><th>
523
+
524
+ Parameter
525
+
526
+ </th><th>
527
+
528
+ Type
529
+
530
+ </th><th>
531
+
532
+ Description
533
+
534
+ </th></tr></thead>
535
+ <tbody><tr><td>
536
+
537
+ polygon
538
+
539
+ </td><td>
540
+
541
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
542
+
543
+ </td><td>
544
+
545
+ Polygon
546
+
547
+ </td></tr>
548
+ <tr><td>
549
+
550
+ point
551
+
552
+ </td><td>
553
+
554
+ [ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)
555
+
556
+ </td><td>
557
+
558
+ The point to determine
559
+
560
+ </td></tr>
561
+ </tbody></table>
562
+
563
+ ## Returns
564
+
565
+ boolean
566
+
567
+ Whether In polygon internal
568
+
569
+ ## Remarks
570
+
571
+ Use the ray casting method to determine whether the point is inside the polygon
572
+
573
+ Due to the characteristics of the ray casting method, points on the boundary behave inconsistently: some boundary points may return `true`<!-- -->, and some may return `false`<!-- -->, depending on the geometric relationship between the ray direction and the boundary
574
+
575
+ To strictly determine whether the point is on the boundary, combine [SYS\_Math.distanceToPoint()](./SYS_Math.md) to check whether the distance is `0`
576
+
577
+ ## Example
578
+
579
+ ```javascript
580
+ // 1. 定义一块禁布区,测试三个典型位置的点
581
+ const keepout = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
582
+ const inside = { x: 50, y: 40 }; // 区域中心,明显在内部
583
+ const outside = { x: 150, y: 40 }; // 区域右侧,明显在外部
584
+ const corner = { x: 0, y: 0 }; // 顶点,落在边界上
585
+
586
+ console.log('中心点在禁布区内:', eda.sys_Math.containsPoint(keepout, inside));
587
+ console.log('外部点在禁布区内:', eda.sys_Math.containsPoint(keepout, outside));
588
+ console.log('顶点在禁布区内:', eda.sys_Math.containsPoint(keepout, corner));
589
+
590
+ // 2. 严格判断边界点:距离为 0 说明点恰好在边界上
591
+ console.log('顶点到边界的距离:', eda.sys_Math.distanceToPoint(keepout, corner));
592
+ ```
593
+
594
+ ### distancetopoint
595
+
596
+ # SYS\_Math.distanceToPoint() method
597
+
598
+ Calculate the shortest distance from a point to the polygon boundary
599
+
600
+ ## Signature
601
+
602
+ ```typescript
603
+ function distanceToPoint(polygon: TSYS_MathPolygonInput, point: ISYS_MathPoint): number;
604
+ ```
605
+
606
+ ## Parameters
607
+
608
+ <table><thead><tr><th>
609
+
610
+ Parameter
611
+
612
+ </th><th>
613
+
614
+ Type
615
+
616
+ </th><th>
617
+
618
+ Description
619
+
620
+ </th></tr></thead>
621
+ <tbody><tr><td>
622
+
623
+ polygon
624
+
625
+ </td><td>
626
+
627
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
628
+
629
+ </td><td>
630
+
631
+ Polygon
632
+
633
+ </td></tr>
634
+ <tr><td>
635
+
636
+ point
637
+
638
+ </td><td>
639
+
640
+ [ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)
641
+
642
+ </td><td>
643
+
644
+ The point to calculate
645
+
646
+ </td></tr>
647
+ </tbody></table>
648
+
649
+ ## Returns
650
+
651
+ number
652
+
653
+ Shortest distance. If the point is inside the polygon, `0` is returned
654
+
655
+ ## Example
656
+
657
+ ```javascript
658
+ // 1. 定义矩形区域(右边界在 x = 100)
659
+ const zone = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
660
+
661
+ // 2. 外部点:到右边界的水平距离为 50
662
+ const outsidePoint = { x: 150, y: 40 };
663
+ console.log('外部点到边界的最短距离:', eda.sys_Math.distanceToPoint(zone, outsidePoint));
664
+
665
+ // 3. 内部点:在多边形内部时返回 0
666
+ const insidePoint = { x: 50, y: 40 };
667
+ console.log('内部点到边界的最短距离:', eda.sys_Math.distanceToPoint(zone, insidePoint));
668
+
669
+ // 4. 斜向最近边不是正对的那条边时,结果取真实垂线距离
670
+ const diagonalPoint = { x: 130, y: 110 };
671
+ console.log('斜向点到边界的最短距离:', eda.sys_Math.distanceToPoint(zone, diagonalPoint));
672
+ ```
673
+
674
+ ### getbbox
675
+
676
+ # SYS\_Math.getBBox() method
677
+
678
+ Get the minimum bounding rectangle (BBox) of the polygon
679
+
680
+ ## Signature
681
+
682
+ ```typescript
683
+ function getBBox(polygon: TSYS_MathPolygonInput): ISYS_MathBBox;
684
+ ```
685
+
686
+ ## Parameters
687
+
688
+ <table><thead><tr><th>
689
+
690
+ Parameter
691
+
692
+ </th><th>
693
+
694
+ Type
695
+
696
+ </th><th>
697
+
698
+ Description
699
+
700
+ </th></tr></thead>
701
+ <tbody><tr><td>
702
+
703
+ polygon
704
+
705
+ </td><td>
706
+
707
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
708
+
709
+ </td><td>
710
+
711
+ Polygon
712
+
713
+ </td></tr>
714
+ </tbody></table>
715
+
716
+ ## Returns
717
+
718
+ [ISYS\_MathBBox](../interfaces/ISYS_MathBBox.md)
719
+
720
+ BBox
721
+
722
+ ## Example
723
+
724
+ ```javascript
725
+ // 1. 斜置的三角形,外接矩形由三个顶点的极值决定
726
+ const triangle = [{ x: 30, y: 10 }, { x: 120, y: 50 }, { x: 60, y: 90 }];
727
+ const bbox = eda.sys_Math.getBBox(triangle);
728
+ console.log('三角形的最小外接矩形:', JSON.stringify(bbox));
729
+
730
+ // 2. 布尔运算得到的多边形组同样可以求 BBox(取整组的外包范围)
731
+ const rectA = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
732
+ const rectB = [{ x: 50, y: 20 }, { x: 150, y: 20 }, { x: 150, y: 60 }, { x: 50, y: 60 }];
733
+ const merged = eda.sys_Math.union(rectA, rectB);
734
+ console.log('合并区域的最小外接矩形:', JSON.stringify(eda.sys_Math.getBBox(merged)));
735
+
736
+ // 3. BBox 直接作为 bboxIntersects() 的输入做快速相交预检
737
+ const other = { minX: 200, minY: 0, maxX: 280, maxY: 40 };
738
+ console.log('两区域外接矩形相交:', eda.sys_Math.bboxIntersects(bbox, other));
739
+ ```
740
+
741
+ ### getcentroid
742
+
743
+ # SYS\_Math.getCentroid() method
744
+
745
+ Calculate the centroid of the polygon
746
+
747
+ ## Signature
748
+
749
+ ```typescript
750
+ function getCentroid(polygon: TSYS_MathPolygonInput): ISYS_MathPoint;
751
+ ```
752
+
753
+ ## Parameters
754
+
755
+ <table><thead><tr><th>
756
+
757
+ Parameter
758
+
759
+ </th><th>
760
+
761
+ Type
762
+
763
+ </th><th>
764
+
765
+ Description
766
+
767
+ </th></tr></thead>
768
+ <tbody><tr><td>
769
+
770
+ polygon
771
+
772
+ </td><td>
773
+
774
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
775
+
776
+ </td><td>
777
+
778
+ Polygon
779
+
780
+ </td></tr>
781
+ </tbody></table>
782
+
783
+ ## Returns
784
+
785
+ [ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)
786
+
787
+ Centroid coordinate
788
+
789
+ ## Example
790
+
791
+ ```javascript
792
+ // 1. 规则矩形:质心就是几何中心 (50, 40)
793
+ const rect = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
794
+ console.log('矩形质心:', JSON.stringify(eda.sys_Math.getCentroid(rect)));
795
+
796
+ // 2. L 形轮廓:质心向材料厚的一侧偏移,不再等于外接矩形中心 (50, 40)
797
+ const lShape = [
798
+ { x: 0, y: 0 },
799
+ { x: 100, y: 0 },
800
+ { x: 100, y: 40 },
801
+ { x: 40, y: 40 },
802
+ { x: 40, y: 80 },
803
+ { x: 0, y: 80 },
804
+ ];
805
+ const centroid = eda.sys_Math.getCentroid(lShape);
806
+ console.log('L 形质心:', JSON.stringify(centroid));
807
+
808
+ // 3. 以质心为中心做旋转,图形绕自身几何中心原地转动
809
+ const rotated = eda.sys_Math.rotate(rect, 90);
810
+ console.log('绕质心旋转 90 度后的第一个点:', JSON.stringify(rotated[0]));
811
+ ```
812
+
813
+ ### intersection
814
+
815
+ # SYS\_Math.intersection() method
816
+
817
+ Calculate the intersection of two polygons
818
+
819
+ ## Signature
820
+
821
+ ```typescript
822
+ function intersection(
823
+ polygon1: TSYS_MathPolygonInput,
824
+ polygon2: TSYS_MathPolygonInput,
825
+ ): TSYS_MathPolygonGroup;
826
+ ```
827
+
828
+ ## Parameters
829
+
830
+ <table><thead><tr><th>
831
+
832
+ Parameter
833
+
834
+ </th><th>
835
+
836
+ Type
837
+
838
+ </th><th>
839
+
840
+ Description
841
+
842
+ </th></tr></thead>
843
+ <tbody><tr><td>
844
+
845
+ polygon1
846
+
847
+ </td><td>
848
+
849
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
850
+
851
+ </td><td>
852
+
853
+ Polygon 1
854
+
855
+ </td></tr>
856
+ <tr><td>
857
+
858
+ polygon2
859
+
860
+ </td><td>
861
+
862
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
863
+
864
+ </td><td>
865
+
866
+ Polygon 2
867
+
868
+ </td></tr>
869
+ </tbody></table>
870
+
871
+ ## Returns
872
+
873
+ [TSYS\_MathPolygonGroup](../types/TSYS_MathPolygonGroup.md)
874
+
875
+ Polygon group of the intersection result. An empty array means no intersection
876
+
877
+ ## Example
878
+
879
+ ```javascript
880
+ // 1. 两块部分重叠的矩形区域
881
+ const copperA = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
882
+ const copperB = [{ x: 50, y: 20 }, { x: 150, y: 20 }, { x: 150, y: 60 }, { x: 50, y: 60 }];
883
+
884
+ // 2. 求交集,结果为一个新的多边形组
885
+ const overlap = eda.sys_Math.intersection(copperA, copperB);
886
+ console.log('重叠区域个数:', overlap.length);
887
+ console.log('重叠区域外环顶点:', overlap[0].outer.length, '个');
888
+ console.log('重叠区域孔洞数:', overlap[0].holes.length);
889
+
890
+ // 3. 交集面积:100 x 100 与 100 x 80 的重叠部分为 50 x 40 = 2000
891
+ console.log('重叠区域面积:', eda.sys_Math.calculateArea(overlap));
892
+
893
+ // 4. 完全分离的两个多边形没有交集,返回空数组
894
+ const far = [{ x: 200, y: 0 }, { x: 280, y: 0 }, { x: 280, y: 40 }, { x: 200, y: 40 }];
895
+ console.log('分离区域的交集个数:', eda.sys_Math.intersection(copperA, far).length);
896
+ ```
897
+
898
+ ### intersects
899
+
900
+ # SYS\_Math.intersects() method
901
+
902
+ Determine whether two polygons intersect
903
+
904
+ ## Signature
905
+
906
+ ```typescript
907
+ function intersects(polygon1: TSYS_MathPolygonInput, polygon2: TSYS_MathPolygonInput): boolean;
908
+ ```
909
+
910
+ ## Parameters
911
+
912
+ <table><thead><tr><th>
913
+
914
+ Parameter
915
+
916
+ </th><th>
917
+
918
+ Type
919
+
920
+ </th><th>
921
+
922
+ Description
923
+
924
+ </th></tr></thead>
925
+ <tbody><tr><td>
926
+
927
+ polygon1
928
+
929
+ </td><td>
930
+
931
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
932
+
933
+ </td><td>
934
+
935
+ Polygon 1
936
+
937
+ </td></tr>
938
+ <tr><td>
939
+
940
+ polygon2
941
+
942
+ </td><td>
943
+
944
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
945
+
946
+ </td><td>
947
+
948
+ Polygon 2
949
+
950
+ </td></tr>
951
+ </tbody></table>
952
+
953
+ ## Returns
954
+
955
+ boolean
956
+
957
+ Whether they intersect
958
+
959
+ ## Remarks
960
+
961
+ Determine whether the regions of two polygons have any overlap (including containment, partial intersection, and boundary contact)
962
+
963
+ ## Example
964
+
965
+ ```javascript
966
+ // 1. 部分重叠的两个矩形 → true
967
+ const trace = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
968
+ const keepout = [{ x: 50, y: 20 }, { x: 150, y: 20 }, { x: 150, y: 60 }, { x: 50, y: 60 }];
969
+ console.log('走线闯入禁布区:', eda.sys_Math.intersects(trace, keepout));
970
+
971
+ // 2. 完全分离 → false
972
+ const far = [{ x: 200, y: 0 }, { x: 280, y: 0 }, { x: 280, y: 40 }, { x: 200, y: 40 }];
973
+ console.log('走线远离另一区域:', eda.sys_Math.intersects(trace, far));
974
+
975
+ // 3. 完全包含也是相交的一种 → true
976
+ const small = [{ x: 20, y: 20 }, { x: 60, y: 20 }, { x: 60, y: 50 }, { x: 20, y: 50 }];
977
+ console.log('小区域整体在走线范围内:', eda.sys_Math.intersects(trace, small));
978
+
979
+ // 4. 仅边界贴合同样算相交 → true
980
+ const touching = [{ x: 100, y: 0 }, { x: 180, y: 0 }, { x: 180, y: 40 }, { x: 100, y: 40 }];
981
+ console.log('两区域边界贴合:', eda.sys_Math.intersects(trace, touching));
982
+ ```
983
+
984
+ ### rotate
985
+
986
+ # SYS\_Math.rotate() method
987
+
988
+ Rotate the polygon
989
+
990
+ ## Signature
991
+
992
+ ```typescript
993
+ function rotate(
994
+ polygon: TSYS_MathPolygonInput,
995
+ angle: number,
996
+ centerX?: number,
997
+ centerY?: number,
998
+ ): Array<ISYS_MathPoint>;
999
+ ```
1000
+
1001
+ ## Parameters
1002
+
1003
+ <table><thead><tr><th>
1004
+
1005
+ Parameter
1006
+
1007
+ </th><th>
1008
+
1009
+ Type
1010
+
1011
+ </th><th>
1012
+
1013
+ Description
1014
+
1015
+ </th></tr></thead>
1016
+ <tbody><tr><td>
1017
+
1018
+ polygon
1019
+
1020
+ </td><td>
1021
+
1022
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1023
+
1024
+ </td><td>
1025
+
1026
+ Polygon
1027
+
1028
+ </td></tr>
1029
+ <tr><td>
1030
+
1031
+ angle
1032
+
1033
+ </td><td>
1034
+
1035
+ number
1036
+
1037
+ </td><td>
1038
+
1039
+ Rotation angle (in degrees, positive values are counterclockwise)
1040
+
1041
+ </td></tr>
1042
+ <tr><td>
1043
+
1044
+ centerX
1045
+
1046
+ </td><td>
1047
+
1048
+ number
1049
+
1050
+ </td><td>
1051
+
1052
+ _(Optional)_ X coordinate of the rotation center, defaulting to the centroid
1053
+
1054
+ </td></tr>
1055
+ <tr><td>
1056
+
1057
+ centerY
1058
+
1059
+ </td><td>
1060
+
1061
+ number
1062
+
1063
+ </td><td>
1064
+
1065
+ _(Optional)_ Y coordinate of the rotation center, defaulting to the centroid
1066
+
1067
+ </td></tr>
1068
+ </tbody></table>
1069
+
1070
+ ## Returns
1071
+
1072
+ Array&lt;[ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)<!-- -->&gt;
1073
+
1074
+ Array of discrete points after rotation
1075
+
1076
+ ## Example
1077
+
1078
+ ```javascript
1079
+ // 1. 定义一个矩形安装座
1080
+ const mount = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
1081
+
1082
+ // 2. 不传中心:绕质心 (50, 40) 逆时针旋转 90 度,占位原地转身
1083
+ const selfRotated = eda.sys_Math.rotate(mount, 90);
1084
+ console.log('绕质心旋转后的顶点:', JSON.stringify(selfRotated));
1085
+
1086
+ // 3. 传中心参数:绕坐标原点 (0, 0) 旋转 90 度,图形整体公转
1087
+ // 逆时针 90 度把 (x, y) 映射为 (-y, x)
1088
+ const originRotated = eda.sys_Math.rotate(mount, 90, 0, 0);
1089
+ console.log('绕原点旋转后的顶点:', JSON.stringify(originRotated));
1090
+
1091
+ // 4. 负角度顺时针旋转,与正角度互为逆变换
1092
+ const back = eda.sys_Math.rotate(originRotated, -90, 0, 0);
1093
+ console.log('再顺时针转回后的第一个点:', JSON.stringify(back[0]));
1094
+ ```
1095
+
1096
+ ### scale
1097
+
1098
+ # SYS\_Math.scale() method
1099
+
1100
+ Scale the polygon
1101
+
1102
+ ## Signature
1103
+
1104
+ ```typescript
1105
+ function scale(
1106
+ polygon: TSYS_MathPolygonInput,
1107
+ scaleX: number,
1108
+ scaleY?: number,
1109
+ centerX?: number,
1110
+ centerY?: number,
1111
+ ): Array<ISYS_MathPoint>;
1112
+ ```
1113
+
1114
+ ## Parameters
1115
+
1116
+ <table><thead><tr><th>
1117
+
1118
+ Parameter
1119
+
1120
+ </th><th>
1121
+
1122
+ Type
1123
+
1124
+ </th><th>
1125
+
1126
+ Description
1127
+
1128
+ </th></tr></thead>
1129
+ <tbody><tr><td>
1130
+
1131
+ polygon
1132
+
1133
+ </td><td>
1134
+
1135
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1136
+
1137
+ </td><td>
1138
+
1139
+ Polygon
1140
+
1141
+ </td></tr>
1142
+ <tr><td>
1143
+
1144
+ scaleX
1145
+
1146
+ </td><td>
1147
+
1148
+ number
1149
+
1150
+ </td><td>
1151
+
1152
+ X direction scale ratio
1153
+
1154
+ </td></tr>
1155
+ <tr><td>
1156
+
1157
+ scaleY
1158
+
1159
+ </td><td>
1160
+
1161
+ number
1162
+
1163
+ </td><td>
1164
+
1165
+ _(Optional)_ Y direction scale ratio, defaulting to the same as scaleX
1166
+
1167
+ </td></tr>
1168
+ <tr><td>
1169
+
1170
+ centerX
1171
+
1172
+ </td><td>
1173
+
1174
+ number
1175
+
1176
+ </td><td>
1177
+
1178
+ _(Optional)_ X coordinate of the scaling center, defaulting to the centroid
1179
+
1180
+ </td></tr>
1181
+ <tr><td>
1182
+
1183
+ centerY
1184
+
1185
+ </td><td>
1186
+
1187
+ number
1188
+
1189
+ </td><td>
1190
+
1191
+ _(Optional)_ Y coordinate of the scaling center, defaulting to the centroid
1192
+
1193
+ </td></tr>
1194
+ </tbody></table>
1195
+
1196
+ ## Returns
1197
+
1198
+ Array&lt;[ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)<!-- -->&gt;
1199
+
1200
+ Array of discrete points after scaling
1201
+
1202
+ ## Example
1203
+
1204
+ ```javascript
1205
+ // 1. 定义一个矩形焊区
1206
+ const pad = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
1207
+
1208
+ // 2. 等比放大 1.5 倍:绕质心原地放大,面积变为 2.25 倍
1209
+ const enlarged = eda.sys_Math.scale(pad, 1.5);
1210
+ console.log('放大 1.5 倍后的顶点:', JSON.stringify(enlarged));
1211
+ console.log('放大后的面积:', eda.sys_Math.calculateArea(enlarged));
1212
+
1213
+ // 3. X、Y 采用不同比例:只在 X 方向拉宽 2 倍(绕质心,Y 不变)
1214
+ const stretched = eda.sys_Math.scale(pad, 2, 1);
1215
+ console.log('仅 X 方向放大 2 倍后的顶点:', JSON.stringify(stretched));
1216
+
1217
+ // 4. 指定缩放中心 (0, 0):各点坐标直接乘以比例
1218
+ const fromOrigin = eda.sys_Math.scale(pad, 2, 2, 0, 0);
1219
+ console.log('绕原点放大后的第一个点:', JSON.stringify(fromOrigin[0]));
1220
+ ```
1221
+
1222
+ ### subtract
1223
+
1224
+ # SYS\_Math.subtract() method
1225
+
1226
+ Calculate the difference of two polygons (polygon1 - polygon2)
1227
+
1228
+ ## Signature
1229
+
1230
+ ```typescript
1231
+ function subtract(
1232
+ polygon1: TSYS_MathPolygonInput,
1233
+ polygon2: TSYS_MathPolygonInput,
1234
+ ): TSYS_MathPolygonGroup;
1235
+ ```
1236
+
1237
+ ## Parameters
1238
+
1239
+ <table><thead><tr><th>
1240
+
1241
+ Parameter
1242
+
1243
+ </th><th>
1244
+
1245
+ Type
1246
+
1247
+ </th><th>
1248
+
1249
+ Description
1250
+
1251
+ </th></tr></thead>
1252
+ <tbody><tr><td>
1253
+
1254
+ polygon1
1255
+
1256
+ </td><td>
1257
+
1258
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1259
+
1260
+ </td><td>
1261
+
1262
+ Minuend polygon
1263
+
1264
+ </td></tr>
1265
+ <tr><td>
1266
+
1267
+ polygon2
1268
+
1269
+ </td><td>
1270
+
1271
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1272
+
1273
+ </td><td>
1274
+
1275
+ Subtrahend polygon
1276
+
1277
+ </td></tr>
1278
+ </tbody></table>
1279
+
1280
+ ## Returns
1281
+
1282
+ [TSYS\_MathPolygonGroup](../types/TSYS_MathPolygonGroup.md)
1283
+
1284
+ Polygon group of the difference result, preserving the association between outer rings and holes
1285
+
1286
+ ## Example
1287
+
1288
+ ```javascript
1289
+ // 1. 大矩形铺铜区域与一个完全落在其内部的矩形开孔区
1290
+ const copper = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
1291
+ const hole = [{ x: 30, y: 20 }, { x: 70, y: 20 }, { x: 70, y: 60 }, { x: 30, y: 60 }];
1292
+
1293
+ // 2. 挖孔:差集结果的多边形组里,开孔区被记为孔洞
1294
+ const cut = eda.sys_Math.subtract(copper, hole);
1295
+ console.log('差集结果多边形个数:', cut.length);
1296
+ console.log('孔洞数:', cut[0].holes.length);
1297
+
1298
+ // 3. 挖孔后的净面积:100 x 80 - 40 x 40 = 6400
1299
+ console.log('挖孔后的净面积:', eda.sys_Math.calculateArea(cut));
1300
+
1301
+ // 4. 减去完全分离的多边形不产生任何变化(结果仍是原形状的等价组)
1302
+ const far = [{ x: 200, y: 0 }, { x: 280, y: 0 }, { x: 280, y: 40 }, { x: 200, y: 40 }];
1303
+ const untouched = eda.sys_Math.subtract(copper, far);
1304
+ console.log('减去分离区域后的面积:', eda.sys_Math.calculateArea(untouched));
1305
+ ```
1306
+
1307
+ ### translate
1308
+
1309
+ # SYS\_Math.translate() method
1310
+
1311
+ Translate the polygon
1312
+
1313
+ ## Signature
1314
+
1315
+ ```typescript
1316
+ function translate(polygon: TSYS_MathPolygonInput, dx: number, dy: number): Array<ISYS_MathPoint>;
1317
+ ```
1318
+
1319
+ ## Parameters
1320
+
1321
+ <table><thead><tr><th>
1322
+
1323
+ Parameter
1324
+
1325
+ </th><th>
1326
+
1327
+ Type
1328
+
1329
+ </th><th>
1330
+
1331
+ Description
1332
+
1333
+ </th></tr></thead>
1334
+ <tbody><tr><td>
1335
+
1336
+ polygon
1337
+
1338
+ </td><td>
1339
+
1340
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1341
+
1342
+ </td><td>
1343
+
1344
+ Polygon
1345
+
1346
+ </td></tr>
1347
+ <tr><td>
1348
+
1349
+ dx
1350
+
1351
+ </td><td>
1352
+
1353
+ number
1354
+
1355
+ </td><td>
1356
+
1357
+ X direction offset
1358
+
1359
+ </td></tr>
1360
+ <tr><td>
1361
+
1362
+ dy
1363
+
1364
+ </td><td>
1365
+
1366
+ number
1367
+
1368
+ </td><td>
1369
+
1370
+ Y direction offset
1371
+
1372
+ </td></tr>
1373
+ </tbody></table>
1374
+
1375
+ ## Returns
1376
+
1377
+ Array&lt;[ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)<!-- -->&gt;
1378
+
1379
+ Array of discrete points after translation
1380
+
1381
+ ## Example
1382
+
1383
+ ```javascript
1384
+ // 1. 定义一个器件占位轮廓
1385
+ const footprint = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
1386
+
1387
+ // 2. 向右平移 200、向上平移 150(得到排布到新位置的轮廓)
1388
+ const placed = eda.sys_Math.translate(footprint, 200, 150);
1389
+ console.log('平移后的顶点:', JSON.stringify(placed));
1390
+
1391
+ // 3. 负偏移向左下方平移
1392
+ const back = eda.sys_Math.translate(placed, -200, -150);
1393
+ console.log('再平移回原位后的第一个点:', JSON.stringify(back[0]));
1394
+
1395
+ // 4. 平移前后形状不变,周长与面积保持一致
1396
+ console.log('平移前后周长:', eda.sys_Math.calculatePerimeter(footprint), '/', eda.sys_Math.calculatePerimeter(placed));
1397
+ ```
1398
+
1399
+ ### union
1400
+
1401
+ # SYS\_Math.union() method
1402
+
1403
+ Calculate the union of two polygons
1404
+
1405
+ ## Signature
1406
+
1407
+ ```typescript
1408
+ function union(
1409
+ polygon1: TSYS_MathPolygonInput,
1410
+ polygon2: TSYS_MathPolygonInput,
1411
+ ): TSYS_MathPolygonGroup;
1412
+ ```
1413
+
1414
+ ## Parameters
1415
+
1416
+ <table><thead><tr><th>
1417
+
1418
+ Parameter
1419
+
1420
+ </th><th>
1421
+
1422
+ Type
1423
+
1424
+ </th><th>
1425
+
1426
+ Description
1427
+
1428
+ </th></tr></thead>
1429
+ <tbody><tr><td>
1430
+
1431
+ polygon1
1432
+
1433
+ </td><td>
1434
+
1435
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1436
+
1437
+ </td><td>
1438
+
1439
+ Polygon 1
1440
+
1441
+ </td></tr>
1442
+ <tr><td>
1443
+
1444
+ polygon2
1445
+
1446
+ </td><td>
1447
+
1448
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1449
+
1450
+ </td><td>
1451
+
1452
+ Polygon 2
1453
+
1454
+ </td></tr>
1455
+ </tbody></table>
1456
+
1457
+ ## Returns
1458
+
1459
+ [TSYS\_MathPolygonGroup](../types/TSYS_MathPolygonGroup.md)
1460
+
1461
+ Polygon group of the union result, preserving the association between outer rings and holes
1462
+
1463
+ ## Example
1464
+
1465
+ ```javascript
1466
+ // 1. 两块部分重叠的铺铜区域
1467
+ const copperA = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
1468
+ const copperB = [{ x: 50, y: 20 }, { x: 150, y: 20 }, { x: 150, y: 60 }, { x: 50, y: 60 }];
1469
+
1470
+ // 2. 合并:结果是一个多边形组(重叠区域融合成单一外环,无孔洞)
1471
+ const merged = eda.sys_Math.union(copperA, copperB);
1472
+ console.log('合并后多边形个数:', merged.length);
1473
+ console.log('合并后外环顶点数:', merged[0].outer.length);
1474
+ console.log('合并后孔洞数:', merged[0].holes.length);
1475
+
1476
+ // 3. 合并后的净面积:8000 + 4000 - 重叠的 2000 = 10000(重叠只算一次)
1477
+ console.log('合并后面积:', eda.sys_Math.calculateArea(merged));
1478
+
1479
+ // 4. 完全分离的两个多边形合并时仍是两个独立多边形
1480
+ const far = [{ x: 200, y: 0 }, { x: 280, y: 0 }, { x: 280, y: 40 }, { x: 200, y: 40 }];
1481
+ console.log('分离区域合并后个数:', eda.sys_Math.union(copperA, far).length);
1482
+ ```
1483
+
1484
+ ### xor
1485
+
1486
+ # SYS\_Math.xor() method
1487
+
1488
+ Calculate the symmetric difference (XOR) of two polygons
1489
+
1490
+ ## Signature
1491
+
1492
+ ```typescript
1493
+ function xor(
1494
+ polygon1: TSYS_MathPolygonInput,
1495
+ polygon2: TSYS_MathPolygonInput,
1496
+ ): TSYS_MathPolygonGroup;
1497
+ ```
1498
+
1499
+ ## Parameters
1500
+
1501
+ <table><thead><tr><th>
1502
+
1503
+ Parameter
1504
+
1505
+ </th><th>
1506
+
1507
+ Type
1508
+
1509
+ </th><th>
1510
+
1511
+ Description
1512
+
1513
+ </th></tr></thead>
1514
+ <tbody><tr><td>
1515
+
1516
+ polygon1
1517
+
1518
+ </td><td>
1519
+
1520
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1521
+
1522
+ </td><td>
1523
+
1524
+ Polygon 1
1525
+
1526
+ </td></tr>
1527
+ <tr><td>
1528
+
1529
+ polygon2
1530
+
1531
+ </td><td>
1532
+
1533
+ [TSYS\_MathPolygonInput](../types/TSYS_MathPolygonInput.md)
1534
+
1535
+ </td><td>
1536
+
1537
+ Polygon 2
1538
+
1539
+ </td></tr>
1540
+ </tbody></table>
1541
+
1542
+ ## Returns
1543
+
1544
+ [TSYS\_MathPolygonGroup](../types/TSYS_MathPolygonGroup.md)
1545
+
1546
+ Polygon group of the symmetric difference result, preserving the association between outer rings and holes
1547
+
1548
+ ## Example
1549
+
1550
+ ```javascript
1551
+ // 1. 新旧两版部分重叠的板框轮廓
1552
+ const oldOutline = [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 100, y: 80 }, { x: 0, y: 80 }];
1553
+ const newOutline = [{ x: 50, y: 20 }, { x: 150, y: 20 }, { x: 150, y: 60 }, { x: 50, y: 60 }];
1554
+
1555
+ // 2. 异或:重叠的中间区域被扣除,剩下两侧不重叠的部分
1556
+ const diff = eda.sys_Math.xor(oldOutline, newOutline);
1557
+ console.log('差异区域多边形个数:', diff.length);
1558
+
1559
+ // 3. 异或面积:8000 + 4000 - 2 x 重叠 2000 = 8000(重叠部分两次都不算)
1560
+ console.log('差异区域总面积:', eda.sys_Math.calculateArea(diff));
1561
+
1562
+ // 4. 完全相同的两个多边形异或结果为空数组(无差异;空组不能再传给
1563
+ // calculateArea,空输入会抛『无法识别的多边形输入格式』)
1564
+ console.log('自身与自身异或的差异区域个数:', eda.sys_Math.xor(oldOutline, oldOutline).length);
1565
+ ```