@windypro-rourou/dsh-eda 0.1.4 → 0.1.5

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 (483) hide show
  1. package/README.md +1 -1
  2. package/lib/capabilities.js +3 -2
  3. package/lib/client.js +33 -0
  4. package/lib/index.js +89 -2
  5. package/package.json +10 -1
  6. package/skill/INDEX.md +10 -8
  7. package/skill/README.md +125 -0
  8. package/skill/README.zh-Hans.md +125 -0
  9. package/skill/SKILL.md +746 -746
  10. package/skill/format/index.md +152 -152
  11. package/skill/format/pcb/3d.md +166 -166
  12. package/skill/format/pcb/attr.md +63 -63
  13. package/skill/format/pcb/common.md +306 -306
  14. package/skill/format/pcb/component.md +132 -132
  15. package/skill/format/pcb/dimension.md +58 -58
  16. package/skill/format/pcb/index.md +17 -17
  17. package/skill/format/pcb/obj.md +43 -43
  18. package/skill/format/pcb/pad_via.md +151 -151
  19. package/skill/format/pcb/panel.md +64 -64
  20. package/skill/format/pcb/partition.md +43 -43
  21. package/skill/format/pcb/primitive.md +196 -196
  22. package/skill/format/pcb/rule.md +71 -71
  23. package/skill/format/pcb/shape.md +441 -441
  24. package/skill/format/pcb/text.md +62 -62
  25. package/skill/format/project/blob.md +30 -30
  26. package/skill/format/project/common.md +42 -42
  27. package/skill/format/project/group.md +62 -62
  28. package/skill/format/project/index.md +12 -12
  29. package/skill/format/project/instance.md +32 -32
  30. package/skill/format/project/meta.md +189 -189
  31. package/skill/format/project/variant.md +30 -30
  32. package/skill/format/schematic/attr.md +41 -41
  33. package/skill/format/schematic/common.md +47 -47
  34. package/skill/format/schematic/component.md +91 -91
  35. package/skill/format/schematic/index.md +14 -14
  36. package/skill/format/schematic/obj.md +41 -41
  37. package/skill/format/schematic/pin.md +59 -59
  38. package/skill/format/schematic/shape.md +231 -231
  39. package/skill/format/schematic/structure.md +53 -53
  40. package/skill/format/schematic/table.md +109 -109
  41. package/skill/format/schematic/text.md +47 -47
  42. package/skill/format/schematic/wire.md +132 -132
  43. package/skill/guide/ancillary-projects/easyeda-api-sdk.md +1 -0
  44. package/skill/guide/ancillary-projects/pro-api-types.md +5 -5
  45. package/skill/guide/ancillary-projects.md +10 -10
  46. package/skill/guide/cli.md +1510 -0
  47. package/skill/guide/error-handling.md +38 -38
  48. package/skill/guide/extension-json.md +135 -135
  49. package/skill/guide/extensions-marketplace.md +61 -61
  50. package/skill/guide/how-to-start.md +316 -301
  51. package/skill/guide/i18n.md +57 -57
  52. package/skill/guide/index.md +7 -7
  53. package/skill/guide/inline-frame.md +20 -20
  54. package/skill/guide/invoke-apis.md +81 -81
  55. package/skill/guide/stability.md +37 -37
  56. package/skill/references/_index.md +471 -398
  57. package/skill/references/_quick-reference.md +3103 -3028
  58. package/skill/references/classes/DMT_Board.md +537 -533
  59. package/skill/references/classes/DMT_EditorControl.md +1736 -1736
  60. package/skill/references/classes/DMT_Event.md +356 -356
  61. package/skill/references/classes/DMT_Folder.md +775 -775
  62. package/skill/references/classes/DMT_Panel.md +531 -531
  63. package/skill/references/classes/DMT_Pcb.md +579 -575
  64. package/skill/references/classes/DMT_Project.md +734 -573
  65. package/skill/references/classes/DMT_Schematic.md +1482 -1477
  66. package/skill/references/classes/DMT_SelectControl.md +96 -96
  67. package/skill/references/classes/DMT_Team.md +172 -172
  68. package/skill/references/classes/DMT_Workspace.md +198 -198
  69. package/skill/references/classes/EDA.md +1001 -961
  70. package/skill/references/classes/IPCB_ComplexPolygon.md +299 -299
  71. package/skill/references/classes/IPCB_Polygon.md +175 -175
  72. package/skill/references/classes/IPCB_PrimitiveArc.md +1901 -1901
  73. package/skill/references/classes/IPCB_PrimitiveAttribute.md +2993 -2993
  74. package/skill/references/classes/IPCB_PrimitiveComponent.md +2624 -2627
  75. package/skill/references/classes/IPCB_PrimitiveComponentPad.md +410 -410
  76. package/skill/references/classes/IPCB_PrimitiveDimension.md +1419 -1419
  77. package/skill/references/classes/IPCB_PrimitiveFill.md +1325 -1325
  78. package/skill/references/classes/IPCB_PrimitiveImage.md +1461 -1461
  79. package/skill/references/classes/IPCB_PrimitiveLine.md +1639 -1639
  80. package/skill/references/classes/IPCB_PrimitiveObject.md +1700 -1700
  81. package/skill/references/classes/IPCB_PrimitivePad.md +3155 -3155
  82. package/skill/references/classes/IPCB_PrimitivePolyline.md +1193 -1193
  83. package/skill/references/classes/IPCB_PrimitivePour.md +1858 -1858
  84. package/skill/references/classes/IPCB_PrimitivePoured.md +556 -556
  85. package/skill/references/classes/IPCB_PrimitiveRegion.md +1332 -1332
  86. package/skill/references/classes/IPCB_PrimitiveString.md +2315 -2315
  87. package/skill/references/classes/IPCB_PrimitiveVia.md +1588 -1588
  88. package/skill/references/classes/ISCH_PrimitiveArc.md +1676 -1676
  89. package/skill/references/classes/ISCH_PrimitiveAttribute.md +2541 -2541
  90. package/skill/references/classes/ISCH_PrimitiveBus.md +973 -973
  91. package/skill/references/classes/ISCH_PrimitiveCbbSymbolComponent.md +260 -260
  92. package/skill/references/classes/ISCH_PrimitiveCircle.md +1392 -1392
  93. package/skill/references/classes/ISCH_PrimitiveComponent.md +2910 -2913
  94. package/skill/references/classes/ISCH_PrimitiveComponentPin.md +155 -155
  95. package/skill/references/classes/ISCH_PrimitiveObject.md +960 -960
  96. package/skill/references/classes/ISCH_PrimitivePin.md +2402 -2402
  97. package/skill/references/classes/ISCH_PrimitivePolygon.md +1028 -1028
  98. package/skill/references/classes/ISCH_PrimitiveRectangle.md +1777 -1777
  99. package/skill/references/classes/ISCH_PrimitiveText.md +1771 -1771
  100. package/skill/references/classes/ISCH_PrimitiveWire.md +973 -973
  101. package/skill/references/classes/LIB_3DModel.md +782 -780
  102. package/skill/references/classes/LIB_Cbb.md +957 -957
  103. package/skill/references/classes/LIB_Classification.md +969 -965
  104. package/skill/references/classes/LIB_Device.md +1222 -1221
  105. package/skill/references/classes/LIB_Footprint.md +1298 -1153
  106. package/skill/references/classes/LIB_LibrariesList.md +361 -329
  107. package/skill/references/classes/LIB_PanelLibrary.md +855 -855
  108. package/skill/references/classes/LIB_SelectControl.md +89 -89
  109. package/skill/references/classes/LIB_SimulationModel.md +807 -821
  110. package/skill/references/classes/LIB_Symbol.md +1341 -1195
  111. package/skill/references/classes/PCB_Document.md +1770 -1754
  112. package/skill/references/classes/PCB_Drc.md +3379 -3375
  113. package/skill/references/classes/PCB_Event.md +1166 -1081
  114. package/skill/references/classes/PCB_ImageTool.md +363 -0
  115. package/skill/references/classes/PCB_Layer.md +1915 -1911
  116. package/skill/references/classes/PCB_ManufactureData.md +2968 -2968
  117. package/skill/references/classes/PCB_MathPolygon.md +916 -785
  118. package/skill/references/classes/PCB_Net.md +1128 -1128
  119. package/skill/references/classes/PCB_Primitive.md +217 -217
  120. package/skill/references/classes/PCB_PrimitiveArc.md +820 -894
  121. package/skill/references/classes/PCB_PrimitiveAttribute.md +635 -717
  122. package/skill/references/classes/PCB_PrimitiveComponent.md +1050 -1050
  123. package/skill/references/classes/PCB_PrimitiveDimension.md +789 -833
  124. package/skill/references/classes/PCB_PrimitiveFill.md +783 -861
  125. package/skill/references/classes/PCB_PrimitiveImage.md +803 -875
  126. package/skill/references/classes/PCB_PrimitiveLine.md +787 -858
  127. package/skill/references/classes/PCB_PrimitiveObject.md +796 -800
  128. package/skill/references/classes/PCB_PrimitivePad.md +947 -944
  129. package/skill/references/classes/PCB_PrimitivePolyline.md +744 -819
  130. package/skill/references/classes/PCB_PrimitivePour.md +808 -845
  131. package/skill/references/classes/PCB_PrimitivePoured.md +363 -363
  132. package/skill/references/classes/PCB_PrimitiveRegion.md +765 -799
  133. package/skill/references/classes/PCB_PrimitiveString.md +828 -910
  134. package/skill/references/classes/PCB_PrimitiveVia.md +761 -765
  135. package/skill/references/classes/PCB_RayTracerEngine.md +603 -263
  136. package/skill/references/classes/PCB_SelectControl.md +495 -495
  137. package/skill/references/classes/PCB_Tool.md +9 -0
  138. package/skill/references/classes/PNL_Document.md +83 -83
  139. package/skill/references/classes/SCH_Document.md +797 -809
  140. package/skill/references/classes/SCH_Drc.md +246 -242
  141. package/skill/references/classes/SCH_Event.md +583 -583
  142. package/skill/references/classes/SCH_ManufactureData.md +1209 -1205
  143. package/skill/references/classes/SCH_Net.md +200 -200
  144. package/skill/references/classes/SCH_Netlist.md +191 -191
  145. package/skill/references/classes/SCH_Primitive.md +337 -337
  146. package/skill/references/classes/SCH_PrimitiveArc.md +686 -692
  147. package/skill/references/classes/SCH_PrimitiveAttribute.md +579 -590
  148. package/skill/references/classes/SCH_PrimitiveBus.md +618 -624
  149. package/skill/references/classes/SCH_PrimitiveCircle.md +667 -683
  150. package/skill/references/classes/SCH_PrimitiveComponent.md +2256 -2240
  151. package/skill/references/classes/SCH_PrimitiveObject.md +666 -666
  152. package/skill/references/classes/SCH_PrimitivePin.md +737 -754
  153. package/skill/references/classes/SCH_PrimitivePolygon.md +621 -627
  154. package/skill/references/classes/SCH_PrimitiveRectangle.md +715 -731
  155. package/skill/references/classes/SCH_PrimitiveText.md +736 -746
  156. package/skill/references/classes/SCH_PrimitiveWire.md +701 -703
  157. package/skill/references/classes/SCH_SelectControl.md +520 -520
  158. package/skill/references/classes/SCH_SimulationEngine.md +133 -133
  159. package/skill/references/classes/SCH_Utils.md +121 -121
  160. package/skill/references/classes/SYS_ClientUrl.md +173 -173
  161. package/skill/references/classes/SYS_Dialog.md +825 -825
  162. package/skill/references/classes/SYS_Environment.md +640 -502
  163. package/skill/references/classes/SYS_ExternalApi.md +246 -0
  164. package/skill/references/classes/SYS_FileManager.md +1664 -1686
  165. package/skill/references/classes/SYS_FileSystem.md +1366 -1171
  166. package/skill/references/classes/SYS_FontManager.md +224 -224
  167. package/skill/references/classes/SYS_FormatConversion.md +349 -349
  168. package/skill/references/classes/SYS_HeaderMenu.md +480 -479
  169. package/skill/references/classes/SYS_Help.md +141 -0
  170. package/skill/references/classes/SYS_I18n.md +861 -861
  171. package/skill/references/classes/SYS_IFrame.md +541 -535
  172. package/skill/references/classes/SYS_LoadingAndProgressBar.md +246 -246
  173. package/skill/references/classes/SYS_Log.md +422 -424
  174. package/skill/references/classes/SYS_Math.md +1565 -1565
  175. package/skill/references/classes/SYS_Message.md +363 -363
  176. package/skill/references/classes/SYS_MessageBox.md +285 -285
  177. package/skill/references/classes/SYS_MessageBus.md +1618 -1618
  178. package/skill/references/classes/SYS_PanelControl.md +696 -696
  179. package/skill/references/classes/SYS_RightClickMenu.md +175 -175
  180. package/skill/references/classes/SYS_Setting.md +134 -85
  181. package/skill/references/classes/SYS_ShortcutKey.md +623 -623
  182. package/skill/references/classes/SYS_Storage.md +484 -484
  183. package/skill/references/classes/SYS_Timer.md +447 -447
  184. package/skill/references/classes/SYS_ToastMessage.md +194 -194
  185. package/skill/references/classes/SYS_Tool.md +317 -241
  186. package/skill/references/classes/SYS_Unit.md +594 -594
  187. package/skill/references/classes/SYS_WebSocket.md +401 -401
  188. package/skill/references/classes/SYS_Window.md +849 -850
  189. package/skill/references/enums/EDMT_EditorDocumentType.md +324 -278
  190. package/skill/references/enums/EDMT_EditorSplitScreenDirection.md +51 -47
  191. package/skill/references/enums/EDMT_EditorTabEventType.md +68 -62
  192. package/skill/references/enums/EDMT_IndicatorMarkerType.md +90 -80
  193. package/skill/references/enums/EDMT_ItemType.md +181 -157
  194. package/skill/references/enums/EDMT_ProjectCollaborationMode.md +51 -47
  195. package/skill/references/enums/EDMT_ProjectFileFormat.md +60 -0
  196. package/skill/references/enums/EDMT_ProjectReadyState.md +82 -0
  197. package/skill/references/enums/ELIB_DeviceJlcLibraryCategory.md +51 -47
  198. package/skill/references/enums/ELIB_LibraryType.md +129 -113
  199. package/skill/references/enums/ELIB_PreviewType.md +77 -69
  200. package/skill/references/enums/ELIB_SimulationModelType.md +51 -47
  201. package/skill/references/enums/ELIB_SymbolType.md +142 -124
  202. package/skill/references/enums/EPCB_AutoRoutingCornerStyle.md +51 -47
  203. package/skill/references/enums/EPCB_AutoRoutingExistingPrimitiveMode.md +51 -47
  204. package/skill/references/enums/EPCB_AutoRoutingOptimization.md +51 -47
  205. package/skill/references/enums/EPCB_DocumentCanvasUpdateCalculationActiveStatus.md +51 -47
  206. package/skill/references/enums/EPCB_DocumentRatlineCalculatingActiveStatus.md +55 -51
  207. package/skill/references/enums/EPCB_InactiveLayerDisplayMode.md +64 -58
  208. package/skill/references/enums/EPCB_LayerColorConfiguration.md +90 -80
  209. package/skill/references/enums/EPCB_LayerId.md +1169 -881
  210. package/skill/references/enums/EPCB_LayerStatus.md +64 -58
  211. package/skill/references/enums/EPCB_LayerType.md +129 -113
  212. package/skill/references/enums/EPCB_MouseEventType.md +64 -58
  213. package/skill/references/enums/EPCB_NetEventType.md +64 -58
  214. package/skill/references/enums/EPCB_PcbPlateType.md +51 -47
  215. package/skill/references/enums/EPCB_PdfOutputMethod.md +64 -58
  216. package/skill/references/enums/EPCB_PrimitiveArcInteractiveMode.md +51 -47
  217. package/skill/references/enums/EPCB_PrimitiveDimensionType.md +64 -58
  218. package/skill/references/enums/EPCB_PrimitiveEventType.md +64 -58
  219. package/skill/references/enums/EPCB_PrimitiveFillMode.md +68 -62
  220. package/skill/references/enums/EPCB_PrimitivePadHeatWeldingConnectionMethod.md +64 -58
  221. package/skill/references/enums/EPCB_PrimitivePadHoleType.md +64 -58
  222. package/skill/references/enums/EPCB_PrimitivePadShapeType.md +90 -80
  223. package/skill/references/enums/EPCB_PrimitivePadType.md +64 -58
  224. package/skill/references/enums/EPCB_PrimitivePourFillMethod.md +64 -58
  225. package/skill/references/enums/EPCB_PrimitiveRegionRuleType.md +107 -95
  226. package/skill/references/enums/EPCB_PrimitiveStringAlignMode.md +142 -124
  227. package/skill/references/enums/EPCB_PrimitiveType.md +233 -201
  228. package/skill/references/enums/EPCB_PrimitiveViaType.md +64 -58
  229. package/skill/references/enums/ESCH_DynamicSimulationEnginePullEventType.md +116 -102
  230. package/skill/references/enums/ESCH_DynamicSimulationEnginePushEventType.md +90 -80
  231. package/skill/references/enums/ESCH_ExportDocumentFileType.md +64 -58
  232. package/skill/references/enums/ESCH_MouseEventType.md +51 -47
  233. package/skill/references/enums/ESCH_PrimitiveComponentType.md +142 -124
  234. package/skill/references/enums/ESCH_PrimitiveEventType.md +77 -69
  235. package/skill/references/enums/ESCH_PrimitiveFillStyle.md +129 -113
  236. package/skill/references/enums/ESCH_PrimitiveLineType.md +77 -69
  237. package/skill/references/enums/ESCH_PrimitivePinShape.md +77 -69
  238. package/skill/references/enums/ESCH_PrimitivePinType.md +168 -146
  239. package/skill/references/enums/ESCH_PrimitiveTextAlignMode.md +142 -124
  240. package/skill/references/enums/ESCH_PrimitiveType.md +207 -179
  241. package/skill/references/enums/ESCH_SimulationNetlistType.md +38 -36
  242. package/skill/references/enums/ESCH_SpiceSimulationEnginePullEventType.md +51 -47
  243. package/skill/references/enums/ESCH_SpiceSimulationEnginePushEventType.md +77 -69
  244. package/skill/references/enums/ESYS_BottomPanelTab.md +94 -80
  245. package/skill/references/enums/ESYS_HeaderMenuEnvironment.md +181 -157
  246. package/skill/references/enums/ESYS_ImportProjectBoardOutlineSource.md +55 -51
  247. package/skill/references/enums/ESYS_ImportProjectImportOption.md +64 -58
  248. package/skill/references/enums/ESYS_ImportProjectSchematicObjectStyle.md +51 -47
  249. package/skill/references/enums/ESYS_ImportProjectViaSolderMaskExpansion.md +55 -51
  250. package/skill/references/enums/ESYS_JobState.md +95 -0
  251. package/skill/references/enums/ESYS_LeftPanelTab.md +94 -80
  252. package/skill/references/enums/ESYS_LogType.md +77 -102
  253. package/skill/references/enums/ESYS_NetlistType.md +129 -113
  254. package/skill/references/enums/ESYS_PanelPosition.md +69 -0
  255. package/skill/references/enums/ESYS_PanelTab.md +368 -0
  256. package/skill/references/enums/ESYS_RightPanelTab.md +237 -201
  257. package/skill/references/enums/ESYS_ShortcutKeyEffectiveEditorRange.md +220 -190
  258. package/skill/references/enums/ESYS_ShortcutKeyEffectiveEditorScene.md +103 -91
  259. package/skill/references/enums/ESYS_StartPageQuickStartItem.md +237 -205
  260. package/skill/references/enums/ESYS_Theme.md +51 -47
  261. package/skill/references/enums/ESYS_ToastMessageType.md +90 -80
  262. package/skill/references/enums/ESYS_Unit.md +116 -102
  263. package/skill/references/enums/ESYS_WindowEventType.md +64 -47
  264. package/skill/references/enums/ESYS_WindowOpenTarget.md +51 -47
  265. package/skill/references/enums/NetportDeviceName.md +146 -146
  266. package/skill/references/enums/SchToolBarDeviceName.md +278 -278
  267. package/skill/references/interfaces/BoardProps.md +169 -169
  268. package/skill/references/interfaces/BorderConfig.md +109 -0
  269. package/skill/references/interfaces/ButtonProps.md +196 -169
  270. package/skill/references/interfaces/CellClickInfo.md +142 -0
  271. package/skill/references/interfaces/CellCoord.md +88 -0
  272. package/skill/references/interfaces/CheckBoxProps.md +223 -196
  273. package/skill/references/interfaces/CheckChangeDetail.md +88 -0
  274. package/skill/references/interfaces/CheckboxEditConfig.md +159 -0
  275. package/skill/references/interfaces/ClipboardCellData.md +142 -0
  276. package/skill/references/interfaces/ClipboardConfig.md +115 -0
  277. package/skill/references/interfaces/ColorPickerProps.md +169 -0
  278. package/skill/references/interfaces/ColumnDef.md +605 -0
  279. package/skill/references/interfaces/ColumnEditTrigger.md +57 -0
  280. package/skill/references/interfaces/ColumnGroupDef.md +192 -0
  281. package/skill/references/interfaces/ColumnResizeConfig.md +142 -0
  282. package/skill/references/interfaces/ComponentPropsMap.md +517 -448
  283. package/skill/references/interfaces/CustomHeaderConfig.md +169 -0
  284. package/skill/references/interfaces/DialogProps.md +385 -385
  285. package/skill/references/interfaces/DragSortConfig.md +115 -0
  286. package/skill/references/interfaces/EditingConfig.md +196 -0
  287. package/skill/references/interfaces/FilteringConfig.md +250 -0
  288. package/skill/references/interfaces/FixedColumnConfig.md +88 -0
  289. package/skill/references/interfaces/FlexItemProps.md +116 -116
  290. package/skill/references/interfaces/FlexProps.md +224 -224
  291. package/skill/references/interfaces/GridItemProps.md +143 -143
  292. package/skill/references/interfaces/GridProps.md +143 -143
  293. package/skill/references/interfaces/IDMT_BoardItem.md +171 -171
  294. package/skill/references/interfaces/IDMT_BriefProjectItem.md +171 -171
  295. package/skill/references/interfaces/IDMT_EditorDocumentItem.md +169 -169
  296. package/skill/references/interfaces/IDMT_EditorSplitScreenItem.md +173 -173
  297. package/skill/references/interfaces/IDMT_EditorTabItem.md +169 -169
  298. package/skill/references/interfaces/IDMT_FolderItem.md +225 -225
  299. package/skill/references/interfaces/IDMT_IndicatorMarkerShape.md +393 -393
  300. package/skill/references/interfaces/IDMT_PanelItem.md +144 -144
  301. package/skill/references/interfaces/IDMT_PcbItem.md +171 -171
  302. package/skill/references/interfaces/IDMT_ProjectItem.md +143 -143
  303. package/skill/references/interfaces/IDMT_SchematicItem.md +225 -225
  304. package/skill/references/interfaces/IDMT_SchematicPageItem.md +198 -198
  305. package/skill/references/interfaces/IDMT_TeamItem.md +144 -144
  306. package/skill/references/interfaces/IDMT_WorkspaceItem.md +117 -117
  307. package/skill/references/interfaces/IDesignPortal.md +103 -103
  308. package/skill/references/interfaces/ILIB_3DModelItem.md +198 -198
  309. package/skill/references/interfaces/ILIB_3DModelSearchItem.md +277 -277
  310. package/skill/references/interfaces/ILIB_CbbItem.md +225 -225
  311. package/skill/references/interfaces/ILIB_CbbSearchItem.md +277 -277
  312. package/skill/references/interfaces/ILIB_ClassificationIndex.md +150 -150
  313. package/skill/references/interfaces/ILIB_ClassificationNode.md +98 -0
  314. package/skill/references/interfaces/ILIB_DeviceAssociationItem.md +210 -210
  315. package/skill/references/interfaces/ILIB_DeviceExtendPropertyItem.md +304 -304
  316. package/skill/references/interfaces/ILIB_DeviceItem.md +279 -279
  317. package/skill/references/interfaces/ILIB_DevicePropertiesForSearch.md +250 -250
  318. package/skill/references/interfaces/ILIB_DeviceSearchItem.md +521 -521
  319. package/skill/references/interfaces/ILIB_ExtendLibrary3DModelFunctions.md +64 -64
  320. package/skill/references/interfaces/ILIB_ExtendLibraryCbbFunctions.md +93 -99
  321. package/skill/references/interfaces/ILIB_ExtendLibraryClassificationIndex.md +150 -150
  322. package/skill/references/interfaces/ILIB_ExtendLibraryDeviceFunctions.md +143 -157
  323. package/skill/references/interfaces/ILIB_ExtendLibraryFootprintFunctions.md +63 -63
  324. package/skill/references/interfaces/ILIB_ExtendLibraryFunctions.md +123 -123
  325. package/skill/references/interfaces/ILIB_ExtendLibraryItem.md +97 -97
  326. package/skill/references/interfaces/ILIB_ExtendLibraryItemIndex.md +98 -98
  327. package/skill/references/interfaces/ILIB_ExtendLibrarySearchProperty.md +115 -115
  328. package/skill/references/interfaces/ILIB_ExtendLibrarySearchResult.md +169 -169
  329. package/skill/references/interfaces/ILIB_ExtendLibrarySearchResultDataLine.md +234 -234
  330. package/skill/references/interfaces/ILIB_ExtendLibrarySymbolFunctions.md +91 -105
  331. package/skill/references/interfaces/ILIB_ExtendLibraryUserIndex.md +96 -96
  332. package/skill/references/interfaces/ILIB_FootprintItem.md +256 -198
  333. package/skill/references/interfaces/ILIB_FootprintPropertiesForSearch.md +61 -61
  334. package/skill/references/interfaces/ILIB_FootprintSearchItem.md +277 -277
  335. package/skill/references/interfaces/ILIB_LibraryInfo.md +92 -92
  336. package/skill/references/interfaces/ILIB_LibraryItem.md +115 -115
  337. package/skill/references/interfaces/ILIB_PanelLibraryItem.md +198 -198
  338. package/skill/references/interfaces/ILIB_PanelLibrarySearchItem.md +277 -277
  339. package/skill/references/interfaces/ILIB_RegisterExtendLibraryProps.md +71 -0
  340. package/skill/references/interfaces/ILIB_SimulationModelItem.md +306 -306
  341. package/skill/references/interfaces/ILIB_SimulationModelSearchItem.md +304 -304
  342. package/skill/references/interfaces/ILIB_SymbolItem.md +306 -279
  343. package/skill/references/interfaces/ILIB_SymbolPropertiesForSearch.md +61 -61
  344. package/skill/references/interfaces/ILIB_SymbolSearchItem.md +304 -304
  345. package/skill/references/interfaces/IPCB_AutoLayoutResult.md +169 -169
  346. package/skill/references/interfaces/IPCB_AutoRoutingProps.md +220 -220
  347. package/skill/references/interfaces/IPCB_AutoRoutingResult.md +169 -169
  348. package/skill/references/interfaces/IPCB_BomPropertiesTableColumns.md +169 -169
  349. package/skill/references/interfaces/IPCB_DifferentialPairItem.md +115 -115
  350. package/skill/references/interfaces/IPCB_DiscretizeOptions.md +65 -65
  351. package/skill/references/interfaces/IPCB_DiscretizedPoint.md +88 -88
  352. package/skill/references/interfaces/IPCB_EqualLengthNetGroupItem.md +115 -115
  353. package/skill/references/interfaces/IPCB_LayerItem.md +277 -277
  354. package/skill/references/interfaces/IPCB_NetClassItem.md +115 -115
  355. package/skill/references/interfaces/IPCB_NetInfo.md +115 -115
  356. package/skill/references/interfaces/IPCB_PadPairGroupItem.md +88 -88
  357. package/skill/references/interfaces/IPCB_PadPairMinWireLengthItem.md +88 -88
  358. package/skill/references/interfaces/IPCB_PhysicalStackingConfiguration.md +115 -115
  359. package/skill/references/interfaces/IPCB_Primitive.md +218 -218
  360. package/skill/references/interfaces/IPCB_PrimitiveAPI.md +174 -175
  361. package/skill/references/interfaces/IPCB_PrimitivePadHeatWelding.md +151 -151
  362. package/skill/references/interfaces/IPCB_PrimitivePouredPourFill.md +142 -142
  363. package/skill/references/interfaces/IPCB_PrimitiveSolderMaskAndPasteMaskExpansion.md +154 -154
  364. package/skill/references/interfaces/IPCB_RayTracerBackgroundConfig.md +223 -0
  365. package/skill/references/interfaces/IPCB_RayTracerLightConfig.md +412 -0
  366. package/skill/references/interfaces/IPCB_RayTracerMaterialConfig.md +547 -0
  367. package/skill/references/interfaces/IPCB_RayTracerPcbMaterialConfig.md +196 -0
  368. package/skill/references/interfaces/IPCB_RayTracerRenderConfigurations.md +200 -0
  369. package/skill/references/interfaces/IPCB_RayTracerRendererConfig.md +196 -0
  370. package/skill/references/interfaces/IPCB_RayTracerSceneElement.md +115 -0
  371. package/skill/references/interfaces/IPCB_RayTracerSceneElementTransform.md +123 -0
  372. package/skill/references/interfaces/IPCB_RayTracerTexture.md +88 -0
  373. package/skill/references/interfaces/IPCB_SubstratePhysicalProperties.md +88 -88
  374. package/skill/references/interfaces/IRawNet.md +103 -103
  375. package/skill/references/interfaces/IRawPureSchematic.md +80 -80
  376. package/skill/references/interfaces/IRawSchematic.md +103 -103
  377. package/skill/references/interfaces/IRawWire.md +149 -149
  378. package/skill/references/interfaces/ISCH_DrcError.md +142 -142
  379. package/skill/references/interfaces/ISCH_DrcErrorPrimitive.md +142 -142
  380. package/skill/references/interfaces/ISCH_ExportPngResolution.md +94 -94
  381. package/skill/references/interfaces/ISCH_NetInfo.md +88 -88
  382. package/skill/references/interfaces/ISCH_Primitive.md +218 -219
  383. package/skill/references/interfaces/ISCH_PrimitiveAPI.md +174 -175
  384. package/skill/references/interfaces/ISCH_ProjectNetInfo.md +142 -142
  385. package/skill/references/interfaces/ISCH_WireInfo.md +169 -169
  386. package/skill/references/interfaces/ISYS_ComparisonResponse.md +115 -0
  387. package/skill/references/interfaces/ISYS_ExtensionExternalApiIndex.md +13 -0
  388. package/skill/references/interfaces/ISYS_ExtensionRegisteredExternalApis.md +13 -0
  389. package/skill/references/interfaces/ISYS_ExternalApiHelp.md +173 -0
  390. package/skill/references/interfaces/ISYS_ExternalApiRegistration.md +146 -0
  391. package/skill/references/interfaces/ISYS_FileSystemFileList.md +169 -169
  392. package/skill/references/interfaces/ISYS_HeaderMenuSub1MenuItem.md +205 -174
  393. package/skill/references/interfaces/ISYS_HeaderMenuSub2MenuItem.md +178 -147
  394. package/skill/references/interfaces/ISYS_HeaderMenuTopMenuItem.md +115 -115
  395. package/skill/references/interfaces/ISYS_HeaderMenus.md +408 -408
  396. package/skill/references/interfaces/ISYS_HelpAudienceEntry.md +92 -0
  397. package/skill/references/interfaces/ISYS_HelpClassSummary.md +205 -0
  398. package/skill/references/interfaces/ISYS_HelpData.md +92 -0
  399. package/skill/references/interfaces/ISYS_HelpMethodDetail.md +310 -0
  400. package/skill/references/interfaces/ISYS_JobHandle.md +65 -0
  401. package/skill/references/interfaces/ISYS_JobLogEntry.md +142 -0
  402. package/skill/references/interfaces/ISYS_JobStatus.md +176 -0
  403. package/skill/references/interfaces/ISYS_LogLine.md +115 -115
  404. package/skill/references/interfaces/ISYS_MathBBox.md +142 -142
  405. package/skill/references/interfaces/ISYS_MathPoint.md +88 -88
  406. package/skill/references/interfaces/ISYS_MathPolygonWithHoles.md +92 -92
  407. package/skill/references/interfaces/ISYS_MessageBusTask.md +115 -115
  408. package/skill/references/interfaces/ISYS_MultilingualLanguagesData.md +12 -12
  409. package/skill/references/interfaces/ISYS_RightClickMenuItem.md +174 -174
  410. package/skill/references/interfaces/ISYS_ShortcutKeyData.md +169 -169
  411. package/skill/references/interfaces/ISYS_ShortcutKeyDataWithCallFn.md +62 -62
  412. package/skill/references/interfaces/ISYS_ShortcutKeyDataWithUserDefinedShortcutKey.md +62 -62
  413. package/skill/references/interfaces/ISYS_WindowEventListenerRemovableObject.md +109 -109
  414. package/skill/references/interfaces/IconProps.md +88 -88
  415. package/skill/references/interfaces/ImageProps.md +115 -115
  416. package/skill/references/interfaces/InputEditConfig.md +182 -0
  417. package/skill/references/interfaces/InputProps.md +547 -520
  418. package/skill/references/interfaces/KeyboardConfig.md +61 -0
  419. package/skill/references/interfaces/ListChildren.md +223 -223
  420. package/skill/references/interfaces/ListProps.md +250 -223
  421. package/skill/references/interfaces/ModalProps.md +358 -358
  422. package/skill/references/interfaces/NumberEditConfig.md +234 -0
  423. package/skill/references/interfaces/RadioGroupProps.md +196 -196
  424. package/skill/references/interfaces/RadioItem.md +115 -115
  425. package/skill/references/interfaces/RichTableProps.md +1357 -0
  426. package/skill/references/interfaces/RowMetaConfig.md +142 -0
  427. package/skill/references/interfaces/ScrollerProps.md +169 -169
  428. package/skill/references/interfaces/SelectEditConfig.md +211 -0
  429. package/skill/references/interfaces/SelectListItem.md +142 -142
  430. package/skill/references/interfaces/SelectOption.md +142 -0
  431. package/skill/references/interfaces/SelectProps.md +169 -169
  432. package/skill/references/interfaces/SelectionConfig.md +358 -0
  433. package/skill/references/interfaces/SliderProps.md +142 -0
  434. package/skill/references/interfaces/SlotProps.md +88 -88
  435. package/skill/references/interfaces/SortState.md +88 -0
  436. package/skill/references/interfaces/SortingConfig.md +169 -0
  437. package/skill/references/interfaces/StyleProps.md +439 -385
  438. package/skill/references/interfaces/TextAreaProps.md +196 -196
  439. package/skill/references/interfaces/TextProps.md +169 -169
  440. package/skill/references/interfaces/TextareaEditConfig.md +182 -0
  441. package/skill/references/interfaces/ValidationRule.md +223 -0
  442. package/skill/references/interfaces/VirtualScrollConfig.md +115 -0
  443. package/skill/references/types/Align.md +9 -0
  444. package/skill/references/types/CellContentType.md +9 -0
  445. package/skill/references/types/ColumnDefOrGroup.md +12 -0
  446. package/skill/references/types/ColumnEditConfig.md +13 -0
  447. package/skill/references/types/ColumnType.md +9 -0
  448. package/skill/references/types/DataChangeType.md +9 -0
  449. package/skill/references/types/FilterMatchMode.md +9 -0
  450. package/skill/references/types/RichTableRow.md +12 -0
  451. package/skill/references/types/Serializable.md +10 -0
  452. package/skill/references/types/SerializablePrimitive.md +9 -0
  453. package/skill/references/types/SortOrder.md +9 -0
  454. package/skill/references/types/TPCB_LayerTypesOfInnerLayer.md +11 -11
  455. package/skill/references/types/TPCB_LayersInTheSelectable.md +42 -42
  456. package/skill/references/types/TPCB_LayersOfComponent.md +11 -11
  457. package/skill/references/types/TPCB_LayersOfCopper.md +15 -15
  458. package/skill/references/types/TPCB_LayersOfCustom.md +41 -41
  459. package/skill/references/types/TPCB_LayersOfDimension.md +16 -16
  460. package/skill/references/types/TPCB_LayersOfFill.md +28 -28
  461. package/skill/references/types/TPCB_LayersOfImage.md +22 -22
  462. package/skill/references/types/TPCB_LayersOfInner.md +41 -41
  463. package/skill/references/types/TPCB_LayersOfLine.md +25 -25
  464. package/skill/references/types/TPCB_LayersOfObject.md +12 -12
  465. package/skill/references/types/TPCB_LayersOfPad.md +11 -11
  466. package/skill/references/types/TPCB_LayersOfRegion.md +11 -11
  467. package/skill/references/types/TPCB_NumberOfCopperLayers.md +9 -9
  468. package/skill/references/types/TPCB_PolygonSourceArray.md +85 -83
  469. package/skill/references/types/TPCB_PrimitiveDimensionCoordinateSet.md +66 -66
  470. package/skill/references/types/TPCB_PrimitivePadHole.md +30 -30
  471. package/skill/references/types/TPCB_PrimitivePadShape.md +61 -61
  472. package/skill/references/types/TPCB_PrimitiveSpecialPadShape.md +19 -19
  473. package/skill/references/types/TSYS_ComparisonErrorCode.md +15 -0
  474. package/skill/references/types/TSYS_LanguageKeyValuePairs.md +13 -0
  475. package/skill/references/types/TSYS_MathPolygonGroup.md +15 -15
  476. package/skill/references/types/TSYS_MathPolygonInput.md +20 -20
  477. package/skill/references/types/TSYS_ShortcutKeys.md +96 -96
  478. package/skill/user-guide/using-extension.md +47 -47
  479. package/src/json-gen.test.js +430 -0
  480. package/skill/guide/ancillary-projects/pro-api-sdk.md +0 -1
  481. package/skill/references/interfaces/ISYS_PcbComparisonResponse.md +0 -115
  482. package/skill/references/types/ISYS_LanguageKeyValuePairs.md +0 -13
  483. 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
+ ```