@windypro-rourou/dsh-eda 0.1.3 → 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.
- package/README.md +3 -1
- package/lib/capabilities.js +3 -2
- package/lib/client.js +576 -452
- package/lib/index.js +89 -2
- package/package.json +10 -1
- package/skill/INDEX.md +10 -8
- package/skill/README.md +125 -0
- package/skill/README.zh-Hans.md +125 -0
- package/skill/SKILL.md +746 -746
- package/skill/format/index.md +152 -152
- package/skill/format/pcb/3d.md +166 -166
- package/skill/format/pcb/attr.md +63 -63
- package/skill/format/pcb/common.md +306 -306
- package/skill/format/pcb/component.md +132 -132
- package/skill/format/pcb/dimension.md +58 -58
- package/skill/format/pcb/index.md +17 -17
- package/skill/format/pcb/obj.md +43 -43
- package/skill/format/pcb/pad_via.md +151 -151
- package/skill/format/pcb/panel.md +64 -64
- package/skill/format/pcb/partition.md +43 -43
- package/skill/format/pcb/primitive.md +196 -196
- package/skill/format/pcb/rule.md +71 -71
- package/skill/format/pcb/shape.md +441 -441
- package/skill/format/pcb/text.md +62 -62
- package/skill/format/project/blob.md +30 -30
- package/skill/format/project/common.md +42 -42
- package/skill/format/project/group.md +62 -62
- package/skill/format/project/index.md +12 -12
- package/skill/format/project/instance.md +32 -32
- package/skill/format/project/meta.md +189 -189
- package/skill/format/project/variant.md +30 -30
- package/skill/format/schematic/attr.md +41 -41
- package/skill/format/schematic/common.md +47 -47
- package/skill/format/schematic/component.md +91 -91
- package/skill/format/schematic/index.md +14 -14
- package/skill/format/schematic/obj.md +41 -41
- package/skill/format/schematic/pin.md +59 -59
- package/skill/format/schematic/shape.md +231 -231
- package/skill/format/schematic/structure.md +53 -53
- package/skill/format/schematic/table.md +109 -109
- package/skill/format/schematic/text.md +47 -47
- package/skill/format/schematic/wire.md +132 -132
- package/skill/guide/ancillary-projects/easyeda-api-sdk.md +1 -0
- package/skill/guide/ancillary-projects/pro-api-types.md +5 -5
- package/skill/guide/ancillary-projects.md +10 -10
- package/skill/guide/cli.md +1510 -0
- package/skill/guide/error-handling.md +38 -38
- package/skill/guide/extension-json.md +135 -135
- package/skill/guide/extensions-marketplace.md +61 -61
- package/skill/guide/how-to-start.md +316 -301
- package/skill/guide/i18n.md +57 -57
- package/skill/guide/index.md +7 -7
- package/skill/guide/inline-frame.md +20 -20
- package/skill/guide/invoke-apis.md +81 -81
- package/skill/guide/stability.md +37 -37
- package/skill/references/_index.md +471 -398
- package/skill/references/_quick-reference.md +3103 -3028
- package/skill/references/classes/DMT_Board.md +537 -533
- package/skill/references/classes/DMT_EditorControl.md +1736 -1736
- package/skill/references/classes/DMT_Event.md +356 -356
- package/skill/references/classes/DMT_Folder.md +775 -775
- package/skill/references/classes/DMT_Panel.md +531 -531
- package/skill/references/classes/DMT_Pcb.md +579 -575
- package/skill/references/classes/DMT_Project.md +734 -573
- package/skill/references/classes/DMT_Schematic.md +1482 -1477
- package/skill/references/classes/DMT_SelectControl.md +96 -96
- package/skill/references/classes/DMT_Team.md +172 -172
- package/skill/references/classes/DMT_Workspace.md +198 -198
- package/skill/references/classes/EDA.md +1001 -961
- package/skill/references/classes/IPCB_ComplexPolygon.md +299 -299
- package/skill/references/classes/IPCB_Polygon.md +175 -175
- package/skill/references/classes/IPCB_PrimitiveArc.md +1901 -1901
- package/skill/references/classes/IPCB_PrimitiveAttribute.md +2993 -2993
- package/skill/references/classes/IPCB_PrimitiveComponent.md +2624 -2627
- package/skill/references/classes/IPCB_PrimitiveComponentPad.md +410 -410
- package/skill/references/classes/IPCB_PrimitiveDimension.md +1419 -1419
- package/skill/references/classes/IPCB_PrimitiveFill.md +1325 -1325
- package/skill/references/classes/IPCB_PrimitiveImage.md +1461 -1461
- package/skill/references/classes/IPCB_PrimitiveLine.md +1639 -1639
- package/skill/references/classes/IPCB_PrimitiveObject.md +1700 -1700
- package/skill/references/classes/IPCB_PrimitivePad.md +3155 -3155
- package/skill/references/classes/IPCB_PrimitivePolyline.md +1193 -1193
- package/skill/references/classes/IPCB_PrimitivePour.md +1858 -1858
- package/skill/references/classes/IPCB_PrimitivePoured.md +556 -556
- package/skill/references/classes/IPCB_PrimitiveRegion.md +1332 -1332
- package/skill/references/classes/IPCB_PrimitiveString.md +2315 -2315
- package/skill/references/classes/IPCB_PrimitiveVia.md +1588 -1588
- package/skill/references/classes/ISCH_PrimitiveArc.md +1676 -1676
- package/skill/references/classes/ISCH_PrimitiveAttribute.md +2541 -2541
- package/skill/references/classes/ISCH_PrimitiveBus.md +973 -973
- package/skill/references/classes/ISCH_PrimitiveCbbSymbolComponent.md +260 -260
- package/skill/references/classes/ISCH_PrimitiveCircle.md +1392 -1392
- package/skill/references/classes/ISCH_PrimitiveComponent.md +2910 -2913
- package/skill/references/classes/ISCH_PrimitiveComponentPin.md +155 -155
- package/skill/references/classes/ISCH_PrimitiveObject.md +960 -960
- package/skill/references/classes/ISCH_PrimitivePin.md +2402 -2402
- package/skill/references/classes/ISCH_PrimitivePolygon.md +1028 -1028
- package/skill/references/classes/ISCH_PrimitiveRectangle.md +1777 -1777
- package/skill/references/classes/ISCH_PrimitiveText.md +1771 -1771
- package/skill/references/classes/ISCH_PrimitiveWire.md +973 -973
- package/skill/references/classes/LIB_3DModel.md +782 -780
- package/skill/references/classes/LIB_Cbb.md +957 -957
- package/skill/references/classes/LIB_Classification.md +969 -965
- package/skill/references/classes/LIB_Device.md +1222 -1221
- package/skill/references/classes/LIB_Footprint.md +1298 -1153
- package/skill/references/classes/LIB_LibrariesList.md +361 -329
- package/skill/references/classes/LIB_PanelLibrary.md +855 -855
- package/skill/references/classes/LIB_SelectControl.md +89 -89
- package/skill/references/classes/LIB_SimulationModel.md +807 -821
- package/skill/references/classes/LIB_Symbol.md +1341 -1195
- package/skill/references/classes/PCB_Document.md +1770 -1754
- package/skill/references/classes/PCB_Drc.md +3379 -3375
- package/skill/references/classes/PCB_Event.md +1166 -1081
- package/skill/references/classes/PCB_ImageTool.md +363 -0
- package/skill/references/classes/PCB_Layer.md +1915 -1911
- package/skill/references/classes/PCB_ManufactureData.md +2968 -2968
- package/skill/references/classes/PCB_MathPolygon.md +916 -785
- package/skill/references/classes/PCB_Net.md +1128 -1128
- package/skill/references/classes/PCB_Primitive.md +217 -217
- package/skill/references/classes/PCB_PrimitiveArc.md +820 -894
- package/skill/references/classes/PCB_PrimitiveAttribute.md +635 -717
- package/skill/references/classes/PCB_PrimitiveComponent.md +1050 -1050
- package/skill/references/classes/PCB_PrimitiveDimension.md +789 -833
- package/skill/references/classes/PCB_PrimitiveFill.md +783 -861
- package/skill/references/classes/PCB_PrimitiveImage.md +803 -875
- package/skill/references/classes/PCB_PrimitiveLine.md +787 -858
- package/skill/references/classes/PCB_PrimitiveObject.md +796 -800
- package/skill/references/classes/PCB_PrimitivePad.md +947 -944
- package/skill/references/classes/PCB_PrimitivePolyline.md +744 -819
- package/skill/references/classes/PCB_PrimitivePour.md +808 -845
- package/skill/references/classes/PCB_PrimitivePoured.md +363 -363
- package/skill/references/classes/PCB_PrimitiveRegion.md +765 -799
- package/skill/references/classes/PCB_PrimitiveString.md +828 -910
- package/skill/references/classes/PCB_PrimitiveVia.md +761 -765
- package/skill/references/classes/PCB_RayTracerEngine.md +603 -263
- package/skill/references/classes/PCB_SelectControl.md +495 -495
- package/skill/references/classes/PCB_Tool.md +9 -0
- package/skill/references/classes/PNL_Document.md +83 -83
- package/skill/references/classes/SCH_Document.md +797 -809
- package/skill/references/classes/SCH_Drc.md +246 -242
- package/skill/references/classes/SCH_Event.md +583 -583
- package/skill/references/classes/SCH_ManufactureData.md +1209 -1205
- package/skill/references/classes/SCH_Net.md +200 -200
- package/skill/references/classes/SCH_Netlist.md +191 -191
- package/skill/references/classes/SCH_Primitive.md +337 -337
- package/skill/references/classes/SCH_PrimitiveArc.md +686 -692
- package/skill/references/classes/SCH_PrimitiveAttribute.md +579 -590
- package/skill/references/classes/SCH_PrimitiveBus.md +618 -624
- package/skill/references/classes/SCH_PrimitiveCircle.md +667 -683
- package/skill/references/classes/SCH_PrimitiveComponent.md +2256 -2240
- package/skill/references/classes/SCH_PrimitiveObject.md +666 -666
- package/skill/references/classes/SCH_PrimitivePin.md +737 -754
- package/skill/references/classes/SCH_PrimitivePolygon.md +621 -627
- package/skill/references/classes/SCH_PrimitiveRectangle.md +715 -731
- package/skill/references/classes/SCH_PrimitiveText.md +736 -746
- package/skill/references/classes/SCH_PrimitiveWire.md +701 -703
- package/skill/references/classes/SCH_SelectControl.md +520 -520
- package/skill/references/classes/SCH_SimulationEngine.md +133 -133
- package/skill/references/classes/SCH_Utils.md +121 -121
- package/skill/references/classes/SYS_ClientUrl.md +173 -173
- package/skill/references/classes/SYS_Dialog.md +825 -825
- package/skill/references/classes/SYS_Environment.md +640 -502
- package/skill/references/classes/SYS_ExternalApi.md +246 -0
- package/skill/references/classes/SYS_FileManager.md +1664 -1686
- package/skill/references/classes/SYS_FileSystem.md +1366 -1171
- package/skill/references/classes/SYS_FontManager.md +224 -224
- package/skill/references/classes/SYS_FormatConversion.md +349 -349
- package/skill/references/classes/SYS_HeaderMenu.md +480 -479
- package/skill/references/classes/SYS_Help.md +141 -0
- package/skill/references/classes/SYS_I18n.md +861 -861
- package/skill/references/classes/SYS_IFrame.md +541 -535
- package/skill/references/classes/SYS_LoadingAndProgressBar.md +246 -246
- package/skill/references/classes/SYS_Log.md +422 -424
- package/skill/references/classes/SYS_Math.md +1565 -1565
- package/skill/references/classes/SYS_Message.md +363 -363
- package/skill/references/classes/SYS_MessageBox.md +285 -285
- package/skill/references/classes/SYS_MessageBus.md +1618 -1618
- package/skill/references/classes/SYS_PanelControl.md +696 -696
- package/skill/references/classes/SYS_RightClickMenu.md +175 -175
- package/skill/references/classes/SYS_Setting.md +134 -85
- package/skill/references/classes/SYS_ShortcutKey.md +623 -623
- package/skill/references/classes/SYS_Storage.md +484 -484
- package/skill/references/classes/SYS_Timer.md +447 -447
- package/skill/references/classes/SYS_ToastMessage.md +194 -194
- package/skill/references/classes/SYS_Tool.md +317 -241
- package/skill/references/classes/SYS_Unit.md +594 -594
- package/skill/references/classes/SYS_WebSocket.md +401 -401
- package/skill/references/classes/SYS_Window.md +849 -850
- package/skill/references/enums/EDMT_EditorDocumentType.md +324 -278
- package/skill/references/enums/EDMT_EditorSplitScreenDirection.md +51 -47
- package/skill/references/enums/EDMT_EditorTabEventType.md +68 -62
- package/skill/references/enums/EDMT_IndicatorMarkerType.md +90 -80
- package/skill/references/enums/EDMT_ItemType.md +181 -157
- package/skill/references/enums/EDMT_ProjectCollaborationMode.md +51 -47
- package/skill/references/enums/EDMT_ProjectFileFormat.md +60 -0
- package/skill/references/enums/EDMT_ProjectReadyState.md +82 -0
- package/skill/references/enums/ELIB_DeviceJlcLibraryCategory.md +51 -47
- package/skill/references/enums/ELIB_LibraryType.md +129 -113
- package/skill/references/enums/ELIB_PreviewType.md +77 -69
- package/skill/references/enums/ELIB_SimulationModelType.md +51 -47
- package/skill/references/enums/ELIB_SymbolType.md +142 -124
- package/skill/references/enums/EPCB_AutoRoutingCornerStyle.md +51 -47
- package/skill/references/enums/EPCB_AutoRoutingExistingPrimitiveMode.md +51 -47
- package/skill/references/enums/EPCB_AutoRoutingOptimization.md +51 -47
- package/skill/references/enums/EPCB_DocumentCanvasUpdateCalculationActiveStatus.md +51 -47
- package/skill/references/enums/EPCB_DocumentRatlineCalculatingActiveStatus.md +55 -51
- package/skill/references/enums/EPCB_InactiveLayerDisplayMode.md +64 -58
- package/skill/references/enums/EPCB_LayerColorConfiguration.md +90 -80
- package/skill/references/enums/EPCB_LayerId.md +1169 -881
- package/skill/references/enums/EPCB_LayerStatus.md +64 -58
- package/skill/references/enums/EPCB_LayerType.md +129 -113
- package/skill/references/enums/EPCB_MouseEventType.md +64 -58
- package/skill/references/enums/EPCB_NetEventType.md +64 -58
- package/skill/references/enums/EPCB_PcbPlateType.md +51 -47
- package/skill/references/enums/EPCB_PdfOutputMethod.md +64 -58
- package/skill/references/enums/EPCB_PrimitiveArcInteractiveMode.md +51 -47
- package/skill/references/enums/EPCB_PrimitiveDimensionType.md +64 -58
- package/skill/references/enums/EPCB_PrimitiveEventType.md +64 -58
- package/skill/references/enums/EPCB_PrimitiveFillMode.md +68 -62
- package/skill/references/enums/EPCB_PrimitivePadHeatWeldingConnectionMethod.md +64 -58
- package/skill/references/enums/EPCB_PrimitivePadHoleType.md +64 -58
- package/skill/references/enums/EPCB_PrimitivePadShapeType.md +90 -80
- package/skill/references/enums/EPCB_PrimitivePadType.md +64 -58
- package/skill/references/enums/EPCB_PrimitivePourFillMethod.md +64 -58
- package/skill/references/enums/EPCB_PrimitiveRegionRuleType.md +107 -95
- package/skill/references/enums/EPCB_PrimitiveStringAlignMode.md +142 -124
- package/skill/references/enums/EPCB_PrimitiveType.md +233 -201
- package/skill/references/enums/EPCB_PrimitiveViaType.md +64 -58
- package/skill/references/enums/ESCH_DynamicSimulationEnginePullEventType.md +116 -102
- package/skill/references/enums/ESCH_DynamicSimulationEnginePushEventType.md +90 -80
- package/skill/references/enums/ESCH_ExportDocumentFileType.md +64 -58
- package/skill/references/enums/ESCH_MouseEventType.md +51 -47
- package/skill/references/enums/ESCH_PrimitiveComponentType.md +142 -124
- package/skill/references/enums/ESCH_PrimitiveEventType.md +77 -69
- package/skill/references/enums/ESCH_PrimitiveFillStyle.md +129 -113
- package/skill/references/enums/ESCH_PrimitiveLineType.md +77 -69
- package/skill/references/enums/ESCH_PrimitivePinShape.md +77 -69
- package/skill/references/enums/ESCH_PrimitivePinType.md +168 -146
- package/skill/references/enums/ESCH_PrimitiveTextAlignMode.md +142 -124
- package/skill/references/enums/ESCH_PrimitiveType.md +207 -179
- package/skill/references/enums/ESCH_SimulationNetlistType.md +38 -36
- package/skill/references/enums/ESCH_SpiceSimulationEnginePullEventType.md +51 -47
- package/skill/references/enums/ESCH_SpiceSimulationEnginePushEventType.md +77 -69
- package/skill/references/enums/ESYS_BottomPanelTab.md +94 -80
- package/skill/references/enums/ESYS_HeaderMenuEnvironment.md +181 -157
- package/skill/references/enums/ESYS_ImportProjectBoardOutlineSource.md +55 -51
- package/skill/references/enums/ESYS_ImportProjectImportOption.md +64 -58
- package/skill/references/enums/ESYS_ImportProjectSchematicObjectStyle.md +51 -47
- package/skill/references/enums/ESYS_ImportProjectViaSolderMaskExpansion.md +55 -51
- package/skill/references/enums/ESYS_JobState.md +95 -0
- package/skill/references/enums/ESYS_LeftPanelTab.md +94 -80
- package/skill/references/enums/ESYS_LogType.md +77 -102
- package/skill/references/enums/ESYS_NetlistType.md +129 -113
- package/skill/references/enums/ESYS_PanelPosition.md +69 -0
- package/skill/references/enums/ESYS_PanelTab.md +368 -0
- package/skill/references/enums/ESYS_RightPanelTab.md +237 -201
- package/skill/references/enums/ESYS_ShortcutKeyEffectiveEditorRange.md +220 -190
- package/skill/references/enums/ESYS_ShortcutKeyEffectiveEditorScene.md +103 -91
- package/skill/references/enums/ESYS_StartPageQuickStartItem.md +237 -205
- package/skill/references/enums/ESYS_Theme.md +51 -47
- package/skill/references/enums/ESYS_ToastMessageType.md +90 -80
- package/skill/references/enums/ESYS_Unit.md +116 -102
- package/skill/references/enums/ESYS_WindowEventType.md +64 -47
- package/skill/references/enums/ESYS_WindowOpenTarget.md +51 -47
- package/skill/references/enums/NetportDeviceName.md +146 -146
- package/skill/references/enums/SchToolBarDeviceName.md +278 -278
- package/skill/references/interfaces/BoardProps.md +169 -169
- package/skill/references/interfaces/BorderConfig.md +109 -0
- package/skill/references/interfaces/ButtonProps.md +196 -169
- package/skill/references/interfaces/CellClickInfo.md +142 -0
- package/skill/references/interfaces/CellCoord.md +88 -0
- package/skill/references/interfaces/CheckBoxProps.md +223 -196
- package/skill/references/interfaces/CheckChangeDetail.md +88 -0
- package/skill/references/interfaces/CheckboxEditConfig.md +159 -0
- package/skill/references/interfaces/ClipboardCellData.md +142 -0
- package/skill/references/interfaces/ClipboardConfig.md +115 -0
- package/skill/references/interfaces/ColorPickerProps.md +169 -0
- package/skill/references/interfaces/ColumnDef.md +605 -0
- package/skill/references/interfaces/ColumnEditTrigger.md +57 -0
- package/skill/references/interfaces/ColumnGroupDef.md +192 -0
- package/skill/references/interfaces/ColumnResizeConfig.md +142 -0
- package/skill/references/interfaces/ComponentPropsMap.md +517 -448
- package/skill/references/interfaces/CustomHeaderConfig.md +169 -0
- package/skill/references/interfaces/DialogProps.md +385 -385
- package/skill/references/interfaces/DragSortConfig.md +115 -0
- package/skill/references/interfaces/EditingConfig.md +196 -0
- package/skill/references/interfaces/FilteringConfig.md +250 -0
- package/skill/references/interfaces/FixedColumnConfig.md +88 -0
- package/skill/references/interfaces/FlexItemProps.md +116 -116
- package/skill/references/interfaces/FlexProps.md +224 -224
- package/skill/references/interfaces/GridItemProps.md +143 -143
- package/skill/references/interfaces/GridProps.md +143 -143
- package/skill/references/interfaces/IDMT_BoardItem.md +171 -171
- package/skill/references/interfaces/IDMT_BriefProjectItem.md +171 -171
- package/skill/references/interfaces/IDMT_EditorDocumentItem.md +169 -169
- package/skill/references/interfaces/IDMT_EditorSplitScreenItem.md +173 -173
- package/skill/references/interfaces/IDMT_EditorTabItem.md +169 -169
- package/skill/references/interfaces/IDMT_FolderItem.md +225 -225
- package/skill/references/interfaces/IDMT_IndicatorMarkerShape.md +393 -393
- package/skill/references/interfaces/IDMT_PanelItem.md +144 -144
- package/skill/references/interfaces/IDMT_PcbItem.md +171 -171
- package/skill/references/interfaces/IDMT_ProjectItem.md +143 -143
- package/skill/references/interfaces/IDMT_SchematicItem.md +225 -225
- package/skill/references/interfaces/IDMT_SchematicPageItem.md +198 -198
- package/skill/references/interfaces/IDMT_TeamItem.md +144 -144
- package/skill/references/interfaces/IDMT_WorkspaceItem.md +117 -117
- package/skill/references/interfaces/IDesignPortal.md +103 -103
- package/skill/references/interfaces/ILIB_3DModelItem.md +198 -198
- package/skill/references/interfaces/ILIB_3DModelSearchItem.md +277 -277
- package/skill/references/interfaces/ILIB_CbbItem.md +225 -225
- package/skill/references/interfaces/ILIB_CbbSearchItem.md +277 -277
- package/skill/references/interfaces/ILIB_ClassificationIndex.md +150 -150
- package/skill/references/interfaces/ILIB_ClassificationNode.md +98 -0
- package/skill/references/interfaces/ILIB_DeviceAssociationItem.md +210 -210
- package/skill/references/interfaces/ILIB_DeviceExtendPropertyItem.md +304 -304
- package/skill/references/interfaces/ILIB_DeviceItem.md +279 -279
- package/skill/references/interfaces/ILIB_DevicePropertiesForSearch.md +250 -250
- package/skill/references/interfaces/ILIB_DeviceSearchItem.md +521 -521
- package/skill/references/interfaces/ILIB_ExtendLibrary3DModelFunctions.md +64 -64
- package/skill/references/interfaces/ILIB_ExtendLibraryCbbFunctions.md +93 -99
- package/skill/references/interfaces/ILIB_ExtendLibraryClassificationIndex.md +150 -150
- package/skill/references/interfaces/ILIB_ExtendLibraryDeviceFunctions.md +143 -157
- package/skill/references/interfaces/ILIB_ExtendLibraryFootprintFunctions.md +63 -63
- package/skill/references/interfaces/ILIB_ExtendLibraryFunctions.md +123 -123
- package/skill/references/interfaces/ILIB_ExtendLibraryItem.md +97 -97
- package/skill/references/interfaces/ILIB_ExtendLibraryItemIndex.md +98 -98
- package/skill/references/interfaces/ILIB_ExtendLibrarySearchProperty.md +115 -115
- package/skill/references/interfaces/ILIB_ExtendLibrarySearchResult.md +169 -169
- package/skill/references/interfaces/ILIB_ExtendLibrarySearchResultDataLine.md +234 -234
- package/skill/references/interfaces/ILIB_ExtendLibrarySymbolFunctions.md +91 -105
- package/skill/references/interfaces/ILIB_ExtendLibraryUserIndex.md +96 -96
- package/skill/references/interfaces/ILIB_FootprintItem.md +256 -198
- package/skill/references/interfaces/ILIB_FootprintPropertiesForSearch.md +61 -61
- package/skill/references/interfaces/ILIB_FootprintSearchItem.md +277 -277
- package/skill/references/interfaces/ILIB_LibraryInfo.md +92 -92
- package/skill/references/interfaces/ILIB_LibraryItem.md +115 -115
- package/skill/references/interfaces/ILIB_PanelLibraryItem.md +198 -198
- package/skill/references/interfaces/ILIB_PanelLibrarySearchItem.md +277 -277
- package/skill/references/interfaces/ILIB_RegisterExtendLibraryProps.md +71 -0
- package/skill/references/interfaces/ILIB_SimulationModelItem.md +306 -306
- package/skill/references/interfaces/ILIB_SimulationModelSearchItem.md +304 -304
- package/skill/references/interfaces/ILIB_SymbolItem.md +306 -279
- package/skill/references/interfaces/ILIB_SymbolPropertiesForSearch.md +61 -61
- package/skill/references/interfaces/ILIB_SymbolSearchItem.md +304 -304
- package/skill/references/interfaces/IPCB_AutoLayoutResult.md +169 -169
- package/skill/references/interfaces/IPCB_AutoRoutingProps.md +220 -220
- package/skill/references/interfaces/IPCB_AutoRoutingResult.md +169 -169
- package/skill/references/interfaces/IPCB_BomPropertiesTableColumns.md +169 -169
- package/skill/references/interfaces/IPCB_DifferentialPairItem.md +115 -115
- package/skill/references/interfaces/IPCB_DiscretizeOptions.md +65 -65
- package/skill/references/interfaces/IPCB_DiscretizedPoint.md +88 -88
- package/skill/references/interfaces/IPCB_EqualLengthNetGroupItem.md +115 -115
- package/skill/references/interfaces/IPCB_LayerItem.md +277 -277
- package/skill/references/interfaces/IPCB_NetClassItem.md +115 -115
- package/skill/references/interfaces/IPCB_NetInfo.md +115 -115
- package/skill/references/interfaces/IPCB_PadPairGroupItem.md +88 -88
- package/skill/references/interfaces/IPCB_PadPairMinWireLengthItem.md +88 -88
- package/skill/references/interfaces/IPCB_PhysicalStackingConfiguration.md +115 -115
- package/skill/references/interfaces/IPCB_Primitive.md +218 -218
- package/skill/references/interfaces/IPCB_PrimitiveAPI.md +174 -175
- package/skill/references/interfaces/IPCB_PrimitivePadHeatWelding.md +151 -151
- package/skill/references/interfaces/IPCB_PrimitivePouredPourFill.md +142 -142
- package/skill/references/interfaces/IPCB_PrimitiveSolderMaskAndPasteMaskExpansion.md +154 -154
- package/skill/references/interfaces/IPCB_RayTracerBackgroundConfig.md +223 -0
- package/skill/references/interfaces/IPCB_RayTracerLightConfig.md +412 -0
- package/skill/references/interfaces/IPCB_RayTracerMaterialConfig.md +547 -0
- package/skill/references/interfaces/IPCB_RayTracerPcbMaterialConfig.md +196 -0
- package/skill/references/interfaces/IPCB_RayTracerRenderConfigurations.md +200 -0
- package/skill/references/interfaces/IPCB_RayTracerRendererConfig.md +196 -0
- package/skill/references/interfaces/IPCB_RayTracerSceneElement.md +115 -0
- package/skill/references/interfaces/IPCB_RayTracerSceneElementTransform.md +123 -0
- package/skill/references/interfaces/IPCB_RayTracerTexture.md +88 -0
- package/skill/references/interfaces/IPCB_SubstratePhysicalProperties.md +88 -88
- package/skill/references/interfaces/IRawNet.md +103 -103
- package/skill/references/interfaces/IRawPureSchematic.md +80 -80
- package/skill/references/interfaces/IRawSchematic.md +103 -103
- package/skill/references/interfaces/IRawWire.md +149 -149
- package/skill/references/interfaces/ISCH_DrcError.md +142 -142
- package/skill/references/interfaces/ISCH_DrcErrorPrimitive.md +142 -142
- package/skill/references/interfaces/ISCH_ExportPngResolution.md +94 -94
- package/skill/references/interfaces/ISCH_NetInfo.md +88 -88
- package/skill/references/interfaces/ISCH_Primitive.md +218 -219
- package/skill/references/interfaces/ISCH_PrimitiveAPI.md +174 -175
- package/skill/references/interfaces/ISCH_ProjectNetInfo.md +142 -142
- package/skill/references/interfaces/ISCH_WireInfo.md +169 -169
- package/skill/references/interfaces/ISYS_ComparisonResponse.md +115 -0
- package/skill/references/interfaces/ISYS_ExtensionExternalApiIndex.md +13 -0
- package/skill/references/interfaces/ISYS_ExtensionRegisteredExternalApis.md +13 -0
- package/skill/references/interfaces/ISYS_ExternalApiHelp.md +173 -0
- package/skill/references/interfaces/ISYS_ExternalApiRegistration.md +146 -0
- package/skill/references/interfaces/ISYS_FileSystemFileList.md +169 -169
- package/skill/references/interfaces/ISYS_HeaderMenuSub1MenuItem.md +205 -174
- package/skill/references/interfaces/ISYS_HeaderMenuSub2MenuItem.md +178 -147
- package/skill/references/interfaces/ISYS_HeaderMenuTopMenuItem.md +115 -115
- package/skill/references/interfaces/ISYS_HeaderMenus.md +408 -408
- package/skill/references/interfaces/ISYS_HelpAudienceEntry.md +92 -0
- package/skill/references/interfaces/ISYS_HelpClassSummary.md +205 -0
- package/skill/references/interfaces/ISYS_HelpData.md +92 -0
- package/skill/references/interfaces/ISYS_HelpMethodDetail.md +310 -0
- package/skill/references/interfaces/ISYS_JobHandle.md +65 -0
- package/skill/references/interfaces/ISYS_JobLogEntry.md +142 -0
- package/skill/references/interfaces/ISYS_JobStatus.md +176 -0
- package/skill/references/interfaces/ISYS_LogLine.md +115 -115
- package/skill/references/interfaces/ISYS_MathBBox.md +142 -142
- package/skill/references/interfaces/ISYS_MathPoint.md +88 -88
- package/skill/references/interfaces/ISYS_MathPolygonWithHoles.md +92 -92
- package/skill/references/interfaces/ISYS_MessageBusTask.md +115 -115
- package/skill/references/interfaces/ISYS_MultilingualLanguagesData.md +12 -12
- package/skill/references/interfaces/ISYS_RightClickMenuItem.md +174 -174
- package/skill/references/interfaces/ISYS_ShortcutKeyData.md +169 -169
- package/skill/references/interfaces/ISYS_ShortcutKeyDataWithCallFn.md +62 -62
- package/skill/references/interfaces/ISYS_ShortcutKeyDataWithUserDefinedShortcutKey.md +62 -62
- package/skill/references/interfaces/ISYS_WindowEventListenerRemovableObject.md +109 -109
- package/skill/references/interfaces/IconProps.md +88 -88
- package/skill/references/interfaces/ImageProps.md +115 -115
- package/skill/references/interfaces/InputEditConfig.md +182 -0
- package/skill/references/interfaces/InputProps.md +547 -520
- package/skill/references/interfaces/KeyboardConfig.md +61 -0
- package/skill/references/interfaces/ListChildren.md +223 -223
- package/skill/references/interfaces/ListProps.md +250 -223
- package/skill/references/interfaces/ModalProps.md +358 -358
- package/skill/references/interfaces/NumberEditConfig.md +234 -0
- package/skill/references/interfaces/RadioGroupProps.md +196 -196
- package/skill/references/interfaces/RadioItem.md +115 -115
- package/skill/references/interfaces/RichTableProps.md +1357 -0
- package/skill/references/interfaces/RowMetaConfig.md +142 -0
- package/skill/references/interfaces/ScrollerProps.md +169 -169
- package/skill/references/interfaces/SelectEditConfig.md +211 -0
- package/skill/references/interfaces/SelectListItem.md +142 -142
- package/skill/references/interfaces/SelectOption.md +142 -0
- package/skill/references/interfaces/SelectProps.md +169 -169
- package/skill/references/interfaces/SelectionConfig.md +358 -0
- package/skill/references/interfaces/SliderProps.md +142 -0
- package/skill/references/interfaces/SlotProps.md +88 -88
- package/skill/references/interfaces/SortState.md +88 -0
- package/skill/references/interfaces/SortingConfig.md +169 -0
- package/skill/references/interfaces/StyleProps.md +439 -385
- package/skill/references/interfaces/TextAreaProps.md +196 -196
- package/skill/references/interfaces/TextProps.md +169 -169
- package/skill/references/interfaces/TextareaEditConfig.md +182 -0
- package/skill/references/interfaces/ValidationRule.md +223 -0
- package/skill/references/interfaces/VirtualScrollConfig.md +115 -0
- package/skill/references/types/Align.md +9 -0
- package/skill/references/types/CellContentType.md +9 -0
- package/skill/references/types/ColumnDefOrGroup.md +12 -0
- package/skill/references/types/ColumnEditConfig.md +13 -0
- package/skill/references/types/ColumnType.md +9 -0
- package/skill/references/types/DataChangeType.md +9 -0
- package/skill/references/types/FilterMatchMode.md +9 -0
- package/skill/references/types/RichTableRow.md +12 -0
- package/skill/references/types/Serializable.md +10 -0
- package/skill/references/types/SerializablePrimitive.md +9 -0
- package/skill/references/types/SortOrder.md +9 -0
- package/skill/references/types/TPCB_LayerTypesOfInnerLayer.md +11 -11
- package/skill/references/types/TPCB_LayersInTheSelectable.md +42 -42
- package/skill/references/types/TPCB_LayersOfComponent.md +11 -11
- package/skill/references/types/TPCB_LayersOfCopper.md +15 -15
- package/skill/references/types/TPCB_LayersOfCustom.md +41 -41
- package/skill/references/types/TPCB_LayersOfDimension.md +16 -16
- package/skill/references/types/TPCB_LayersOfFill.md +28 -28
- package/skill/references/types/TPCB_LayersOfImage.md +22 -22
- package/skill/references/types/TPCB_LayersOfInner.md +41 -41
- package/skill/references/types/TPCB_LayersOfLine.md +25 -25
- package/skill/references/types/TPCB_LayersOfObject.md +12 -12
- package/skill/references/types/TPCB_LayersOfPad.md +11 -11
- package/skill/references/types/TPCB_LayersOfRegion.md +11 -11
- package/skill/references/types/TPCB_NumberOfCopperLayers.md +9 -9
- package/skill/references/types/TPCB_PolygonSourceArray.md +85 -83
- package/skill/references/types/TPCB_PrimitiveDimensionCoordinateSet.md +66 -66
- package/skill/references/types/TPCB_PrimitivePadHole.md +30 -30
- package/skill/references/types/TPCB_PrimitivePadShape.md +61 -61
- package/skill/references/types/TPCB_PrimitiveSpecialPadShape.md +19 -19
- package/skill/references/types/TSYS_ComparisonErrorCode.md +15 -0
- package/skill/references/types/TSYS_LanguageKeyValuePairs.md +13 -0
- package/skill/references/types/TSYS_MathPolygonGroup.md +15 -15
- package/skill/references/types/TSYS_MathPolygonInput.md +20 -20
- package/skill/references/types/TSYS_ShortcutKeys.md +96 -96
- package/skill/user-guide/using-extension.md +47 -47
- package/src/json-gen.test.js +430 -0
- package/skill/guide/ancillary-projects/pro-api-sdk.md +0 -1
- package/skill/references/interfaces/ISYS_PcbComparisonResponse.md +0 -115
- package/skill/references/types/ISYS_LanguageKeyValuePairs.md +0 -13
- 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<[ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)<!-- -->>
|
|
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<[ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)<!-- -->>
|
|
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<[ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)<!-- -->>
|
|
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<[ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)<!-- -->>
|
|
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<[ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)<!-- -->>
|
|
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<[ISYS\_MathPoint](../interfaces/ISYS_MathPoint.md)<!-- -->>
|
|
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
|
+
```
|