{"id":"218e6091-c175-4df4-b74b-2aab7074ae01","entityType":"agent","slug":"clawhub-yanranxiaoxi-easyeda-api","name":"EasyEDA API Skill","canonicalUrl":"https://www.xpersona.co/agent/clawhub-yanranxiaoxi-easyeda-api","canonicalPath":"/agent/clawhub-yanranxiaoxi-easyeda-api","generatedAt":"2026-10-09T05:25:45.379Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T02:17:36.930Z","emptyReason":null},"description":"EasyEDA Pro API skill for AI agents. Use when working with EasyEDA Pro EDA software, including PCB design, schematic editing, footprint/symbol management, and project operations. Supports live debugging in EasyEDA and EasyEDA extension development. Provides complete API reference (120+ classes, 62 enums, 70 interfaces), extension-development documentation, and a WebSocket bridge server to execute code in the running EasyEDA Pro client. Trigger on: \"嘉立创EDA，启动！\", \"立创EDA，启动！\", \"EDA，启动！\", \"EasyEDA\", \"PCB\", \"schematic\", \"footprint\", \"EDA\", \"circuit board\", \"嘉立创EDA\", \"原理图\", \"PCB设计\". **IMPORTANT**: 嘉立创EDA's English name is **EasyEDA**. They are the SAME product. Never use other transliterations like \"EasyEDA Pro\" (unless specifically versioned), \"EASYEDA\", \"easyeda\", etc. Always use \"EasyEDA\" for English references and \"嘉立创EDA\" for Chinese references.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 11.9K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s1742kvk50chxzh6t6hetdf9y983h56r:easyeda-api","sourceUrl":"https://clawhub.ai/yanranxiaoxi/easyeda-api","homepage":"https://clawhub.ai/yanranxiaoxi/skills/easyeda-api","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/yanranxiaoxi/easyeda-api","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/yanranxiaoxi/skills/easyeda-api","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"EasyEDA API Skill technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T02:17:36.930Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T02:17:36.930Z","emptyReason":null},"stars":null,"forks":null,"downloads":11864,"packageName":null,"latestVersion":"1.1.24","tractionLabel":"11.9K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T02:17:36.930Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T02:17:36.930Z","lastCrawledAt":"2026-10-09T02:17:36.930Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T02:17:36.930Z","lastVerifiedAt":null,"highlights":[{"version":"1.1.24","createdAt":"2026-09-10T08:36:14.032Z","changelog":"- Major expansion of API documentation: 54 new files and 87 updated, including new interface reference files for extension and UI/grid development. - Added guide for AI integration: new \"how-to-start-for-ai.md\" with instructions tailored for AI agent usage. - Extended class coverage: new documentation for classes such as PCB_ImageTool, SYS_ExternalApi, and SYS_Help. - Updated and reorganized skill metadata for versioning consistency. - Removed obsolete files: deprecated type and skill card references eliminated for clarity. - Improved and updated quick reference and main index documentation for easier API lookup and navigation.","fileCount":456,"zipByteSize":711473},{"version":"1.1.23","createdAt":"2026-08-27T10:00:30.473Z","changelog":"- Updated metadata version to 1.1.28 - SKILL.md revised for accuracy and clarity; minor documentation refinements - Removed obsolete skill-card.md file - package.json and package-lock.json updated accordingly","fileCount":403,"zipByteSize":667893},{"version":"1.1.22","createdAt":"2026-08-27T04:00:26.547Z","changelog":"- Updated package version to 1.1.22. - Incremented SKILL.md version metadata to 1.1.27. - Removed the redundant skill-card.md file. - Minor updates to package files for consistency.","fileCount":403,"zipByteSize":667934},{"version":"1.1.21","createdAt":"2026-08-25T08:07:35.410Z","changelog":"- Added new interface documentation: ISCH_ExportPngResolution. - Removed outdated file: skill-card.md. - Updated and expanded API reference documentation for multiple classes. - Updated version metadata in SKILL.md. - General improvements and clarifications to reference and quick-reference docs. - Package files updated for improved accuracy and dependency management.","fileCount":403,"zipByteSize":667842},{"version":"1.1.20","createdAt":"2026-08-25T03:41:33.226Z","changelog":"- Removed obsolete skill-card.md file. - Updated package metadata and version numbers. - Minor documentation and metadata adjustments for consistency. - No functional or API changes introduced in this release.","fileCount":402,"zipByteSize":665411},{"version":"1.1.19","createdAt":"2026-08-25T02:01:18.895Z","changelog":"- Updated package metadata to version 1.1.24. - Removed the skill-card.md file. - Minor documentation and metadata updates in SKILL.md.","fileCount":402,"zipByteSize":665377},{"version":"1.1.18","createdAt":"2026-08-24T04:04:15.282Z","changelog":"- Updated skill version to 1.1.18. - Incremented internal version metadata to \"1.1.23\" in SKILL.md. - Removed the redundant file: skill-card.md. - Made minor updates to dependencies and internal documentation references. - No functional or API changes.","fileCount":402,"zipByteSize":665437},{"version":"1.1.17","createdAt":"2026-08-21T13:23:16.972Z","changelog":"- Updated SKILL.md metadata version to 1.1.22 - Removed skill-card.md - Updated dependency information and metadata in package.json and package-lock.json - No functional API or interface changes","fileCount":402,"zipByteSize":665486}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1742kvk50chxzh6t6hetdf9y983h56r:easyeda-api","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s1742kvk50chxzh6t6hetdf9y983h56r:easyeda-api` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/yanranxiaoxi/easyeda-api before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yanranxiaoxi-easyeda-api/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yanranxiaoxi-easyeda-api/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yanranxiaoxi-easyeda-api/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-yanranxiaoxi-easyeda-api/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-yanranxiaoxi-easyeda-api/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-yanranxiaoxi-easyeda-api/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T05:25:45.376Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yanranxiaoxi-easyeda-api/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yanranxiaoxi-easyeda-api/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yanranxiaoxi-easyeda-api/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yanranxiaoxi-easyeda-api/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T02:17:36.930Z","emptyReason":null},"readme":"Skill: EasyEDA API Skill\n\nOwner: yanranxiaoxi\n\nSummary: EasyEDA Pro API skill for AI agents. Use when working with EasyEDA Pro EDA software, including PCB design, schematic editing, footprint/symbol management, and project operations. Supports live debugging in EasyEDA and EasyEDA extension development. Provides complete API reference (120+ classes, 62 enums, 70 interfaces), extension-development documentation, and a WebSocket bridge server to execute code in the running EasyEDA Pro client. Trigger on: \"嘉立创EDA，启动！\", \"立创EDA，启动！\", \"EDA，启动！\", \"EasyEDA\", \"PCB\", \"schematic\", \"footprint\", \"EDA\", \"circuit board\", \"嘉立创EDA\", \"原理图\", \"PCB设计\". **IMPORTANT**: 嘉立创EDA's English name is **EasyEDA**. They are the SAME product. Never use other transliterations like \"EasyEDA Pro\" (unless specifically versioned), \"EASYEDA\", \"easyeda\", etc. Always use \"EasyEDA\" for English references and \"嘉立创EDA\" for Chinese references.\n\nTags: latest:1.1.24\n\nVersion history:\n\nv1.1.24 | 2026-09-10T08:36:14.032Z | auto\n\n- Major expansion of API documentation: 54 new files and 87 updated, including new interface reference files for extension and UI/grid development.\n- Added guide for AI integration: new \"how-to-start-for-ai.md\" with instructions tailored for AI agent usage.\n- Extended class coverage: new documentation for classes such as PCB_ImageTool, SYS_ExternalApi, and SYS_Help.\n- Updated and reorganized skill metadata for versioning consistency.\n- Removed obsolete files: deprecated type and skill card references eliminated for clarity.\n- Improved and updated quick reference and main index documentation for easier API lookup and navigation.\n\nv1.1.23 | 2026-08-27T10:00:30.473Z | auto\n\n- Updated metadata version to 1.1.28\n- SKILL.md revised for accuracy and clarity; minor documentation refinements\n- Removed obsolete skill-card.md file\n- package.json and package-lock.json updated accordingly\n\nv1.1.22 | 2026-08-27T04:00:26.547Z | auto\n\n- Updated package version to 1.1.22.\n- Incremented SKILL.md version metadata to 1.1.27.\n- Removed the redundant skill-card.md file.\n- Minor updates to package files for consistency.\n\nv1.1.21 | 2026-08-25T08:07:35.410Z | auto\n\n- Added new interface documentation: ISCH_ExportPngResolution.\n- Removed outdated file: skill-card.md.\n- Updated and expanded API reference documentation for multiple classes.\n- Updated version metadata in SKILL.md.\n- General improvements and clarifications to reference and quick-reference docs.\n- Package files updated for improved accuracy and dependency management.\n\nv1.1.20 | 2026-08-25T03:41:33.226Z | auto\n\n- Removed obsolete skill-card.md file.\n- Updated package metadata and version numbers.\n- Minor documentation and metadata adjustments for consistency.\n- No functional or API changes introduced in this release.\n\nv1.1.19 | 2026-08-25T02:01:18.895Z | auto\n\n- Updated package metadata to version 1.1.24.\n- Removed the skill-card.md file.\n- Minor documentation and metadata updates in SKILL.md.\n\nv1.1.18 | 2026-08-24T04:04:15.282Z | auto\n\n- Updated skill version to 1.1.18.\n- Incremented internal version metadata to \"1.1.23\" in SKILL.md.\n- Removed the redundant file: skill-card.md.\n- Made minor updates to dependencies and internal documentation references.\n- No functional or API changes.\n\nv1.1.17 | 2026-08-21T13:23:16.972Z | auto\n\n- Updated SKILL.md metadata version to 1.1.22\n- Removed skill-card.md\n- Updated dependency information and metadata in package.json and package-lock.json\n- No functional API or interface changes\n\nv1.1.16 | 2026-08-21T09:46:24.206Z | auto\n\n- Updated package and documentation files to reflect new versioning.\n- The skill version is now 1.1.21 (was 1.1.20).\n- Removed the \"skill-card.md\" file.\n- General package maintenance, including updates to SKILL.md and package files.\n\nv1.1.15 | 2026-08-21T08:49:21.208Z | auto\n\n- Updated version metadata to 1.1.20.\n- Updated API documentation links and internal references in SKILL.md.\n- Removed the obsolete skill-card.md file.\n- Minor improvements to documentation structure and clarity.\n\nv1.1.14 | 2026-08-21T03:37:59.405Z | auto\n\n- Updated package metadata and documentation version to 1.1.18.\n- Removed the skill-card.md file.\n- Minor documentation and metadata adjustments in SKILL.md.\n\nv1.1.13 | 2026-08-20T14:24:03.193Z | auto\n\n- Updated metadata version to 1.1.17.\n- Removed the deprecated skill-card.md file.\n- Minor package and documentation maintenance for consistency.\n- No functional or API changes introduced in this release.\n\nv1.1.12 | 2026-08-20T09:55:12.179Z | auto\n\n- Version bump and sync to 1.1.15.\n- Removed obsolete files: skill-card.md, and two enum reference files.\n- Updated API documentation and references for consistency.\n- Minor cleanup and maintenance in documentation files.\n\nv1.1.11 | 2026-08-20T03:18:03.821Z | auto\n\n- Updated version to 1.1.12.\n- Documentation and API references have been refreshed across 348 files.\n- Removed obsolete file: skill-card.md.\n- No functional API or core logic changes; improvements are primarily in documentation and reference consistency.\n\nv1.1.10 | 2026-08-19T13:27:52.323Z | auto\n\n- Version updated to 1.1.10.\n- Documentation and metadata updated in SKILL.md.\n- Old skill-card.md removed.\n- Dependency files (package.json, package-lock.json) updated.\n- No changes to API or runtime functionality.\n\nv1.1.9 | 2026-08-19T12:05:19.958Z | auto\n\neasyeda-api v1.1.9\n\n- Updated package metadata and dependencies.\n- Removed deprecated documentation file: skill-card.md.\n- Minor internal documentation and maintenance updates.\n- No public API or workflow changes.\n\nv1.1.8 | 2026-08-19T10:50:31.903Z | auto\n\n- Removed the unused skill-card.md file.\n- Updated documentation in README.md and README.zh-Hans.md.\n- Package metadata and lockfile updated for consistency.\n- No user-facing API changes or new features.\n\nv1.1.7 | 2026-08-18T10:51:08.238Z | auto\n\n- Version bumped to 1.1.7 in SKILL.md and package files.\n- Updated authoring metadata and documentation to reflect the new version.\n- Removed redundant skill-card.md file to reduce duplication.\n\nv1.1.5 | 2026-08-18T08:07:08.835Z | auto\n\n- Downgraded version from 1.1.6 to 1.1.5 in skill metadata.\n- Removed the unused file: skill-card.md.\n- Updated package metadata in package.json and package-lock.json to reflect version 1.1.5.\n- No changes to core functionality or documented features.\n\nv1.1.4 | 2026-08-18T06:32:43.712Z | auto\n\n- Version rolled back from 1.1.6 to 1.1.4 in metadata.\n- Removed skill-card.md file.\n- Documentation and metadata changes only; no runtime logic affected.\n- No changes to API or user-facing features.\n\nv1.1.6 | 2026-08-18T04:19:50.877Z | auto\n\n- Major API documentation expansion: 76 new files added, many existing ones updated and improved.\n- Added comprehensive class, enum, and interface references under the new references/ directory.\n- Numerous new enums, interfaces, and class docs now available for extension developers.\n- Updated download links and instructions for the EasyEDA extension, replacing previous URLs.\n- Improved and clarified documentation for PCB, schematic, and project source formats.\n- Removed outdated types and documentation files to reduce clutter and ensure accuracy.\n\nv1.1.3 | 2026-04-24T01:53:37.968Z | auto\n\n- Added a README.md file for improved documentation and usability.\n- Updated skill version to 1.1.3.\n- Minor adjustments to package metadata and dependencies.\n\nv1.1.2 | 2026-04-24T01:38:45.219Z | auto\n\n- Added 11 new reference files for additional classes and interfaces in the EasyEDA API.\n- Updated 289 files, including API documentation and guides, to expand and refine the API reference and extension development documentation.\n- Increased API coverage, notably with new classes (e.g., PCB_RayTracerEngine, SCH_Net) and interfaces related to project, schematic, and rendering features.\n- Minor updates to skill metadata and documentation structure for improved navigation and usability.\n\nv1.1.1 | 2026-04-23T08:03:00.323Z | auto\n\n- Bump version to 1.1.1 in metadata.\n- Documentation updated to reflect the new version.\n- No functional changes; internal metadata and documentation refresh only.\n\nv1.1.0 | 2026-04-23T02:04:43.411Z | auto\n\n- Added comprehensive EasyEDA document source format references, including project, schematic, and PCB structure documentation (format/ directory).\n- Significantly expanded documentation to support tasks involving raw source analysis, editing, or generation, not just API usage.\n- Updated skill manifest and version.\n- No breaking changes to existing API documentation or behavior.\n- Package and lock files updated for the new documentation set.\n\nv1.0.8 | 2026-04-02T07:49:55.697Z | auto\n\neasyeda-api 1.0.8\n\n- Updated version number in metadata to 1.0.8.\n- Added `CLAUDE_SKILL_DIR` to required environment variables in the skill metadata.\n- No changes to runtime logic or API; documentation updated for compatibility requirements.\n\nv1.0.7 | 2026-04-02T07:39:21.965Z | auto\n\neasyeda-api v1.0.7\n\n- Updated version metadata to 1.0.7.\n- Minor documentation and metadata changes in SKILL.md (no functional or API changes).\n- No user-facing feature or compatibility changes.\n\nv1.0.6 | 2026-04-02T05:59:00.812Z | auto\n\neasyeda-api 1.0.6\n\n- Updated package version to 1.0.6.\n- Minor edits to documentation in SKILL.md (formatting, metadata update, fixed ASCII diagram alignment).\n- No changes to core logic or functionality.\n\nv1.0.5 | 2026-04-02T01:33:51.775Z | auto\n\neasyeda-api v1.0.5\n\n- Bumped version to 1.0.5 in SKILL.md and package files.\n- No functional or interface changes—documentation and metadata update only.\n\nv1.0.4 | 2026-04-01T09:39:21.914Z | auto\n\n- Bumped version to 1.0.4.\n- Updated metadata version tag in SKILL.md.\n- No functional changes; documentation and version alignment only.\n\nv1.0.3 | 2026-03-24T06:03:29.795Z | auto\n\n**EasyEDA API Skill 1.0.3 — Adds documentation and usage for EasyEDA extension development**\n\n- Expanded SKILL.md to clarify support for EasyEDA extension development, including usage, debugging workflow, and extension-specific resources.\n- Added direct download link and instructions for the required EasyEDA bridge extension.\n- Improved connection instructions and user prompts for connecting/joining EDA windows.\n- Updated version metadata to 1.0.3.\n- No code/API changes; this release focuses on improved documentation, extension developer onboarding, and accuracy of usage instructions.\n\nv1.0.2 | 2026-03-20T10:03:12.953Z | auto\n\n- Bump version to 1.0.2.\n- Update SKILL.md metadata version field from 1.0.1 to 1.0.2.\n- No functional or documentation changes other than metadata update.\n\nv1.0.1 | 2026-03-20T07:28:01.458Z | auto\n\n- Updated version to 1.0.1 with minor documentation and metadata adjustments.\n- Expanded and clarified command trigger phrases in the SKILL.md for improved usability.\n- Improved SKILL.md metadata consistency and formatting for trigger phrases and version.\n- No functional or breaking changes; package and documentation updates only.\n\nv1.0.0 | 2026-03-20T05:47:45.298Z | user\n\nInitial release: EasyEDA Pro API integration skill for AI agents.\n\n- Provides full API reference (120+ classes, 62 enums, 70 interfaces, 19 type aliases) for EasyEDA Pro (嘉立创EDA专业版).\n- Includes a Node.js WebSocket bridge server to execute code in EasyEDA Pro's runtime from AI agents.\n- Supports command triggers and auto-discovery of running bridge server/EDA windows.\n- Usage guides for session setup, connection, window selection, and code execution.\n- Enforced product naming consistency: always use \"EasyEDA\" (English) or \"嘉立创EDA\" (Chinese).\n- Complete documentation and quick reference for all API classes, methods, enums, and interfaces.\n\nArchive index:\n\nArchive v1.1.24: 456 files, 711473 bytes\n\nFiles: format/index.md (7050b), format/pcb/3d.md (4645b), format/pcb/attr.md (2064b), format/pcb/common.md (9692b), format/pcb/component.md (3692b), format/pcb/dimension.md (2047b), format/pcb/index.md (1219b), format/pcb/obj.md (1436b), format/pcb/pad_via.md (4795b), format/pcb/panel.md (1598b), format/pcb/partition.md (1030b), format/pcb/primitive.md (4993b), format/pcb/rule.md (2334b), format/pcb/shape.md (12240b), format/pcb/text.md (1963b), format/project/blob.md (1349b), format/project/common.md (935b), format/project/group.md (1644b), format/project/index.md (808b), format/project/instance.md (1329b), format/project/meta.md (3551b), format/project/variant.md (611b), format/schematic/attr.md (2105b), format/schematic/common.md (1445b), format/schematic/component.md (6838b), format/schematic/index.md (940b), format/schematic/obj.md (1249b), format/schematic/pin.md (2308b), format/schematic/shape.md (6973b), format/schematic/structure.md (1553b), format/schematic/table.md (2449b), format/schematic/text.md (1295b), format/schematic/wire.md (4953b), guide/ancillary-projects.md (4311b), guide/ancillary-projects/pro-api-sdk.md (56b), guide/ancillary-projects/pro-api-types.md (92b), guide/error-handling.md (1238b), guide/extension-json.md (4928b), guide/extensions-marketplace.md (4227b), guide/how-to-start-for-ai.md (17521b), guide/how-to-start.md (16338b), guide/i18n.md (3049b), guide/index.md (951b), guide/inline-frame.md (1390b), guide/invoke-apis.md (4110b), guide/stability.md (3198b), package-lock.json (1967b), package.json (262b), README.md (4807b), README.zh-Hans.md (4454b), references/_index.md (38791b), references/_quick-reference.md (193745b), references/classes/DMT_Board.md (8459b), references/classes/DMT_EditorControl.md (33440b), references/classes/DMT_Event.md (6139b), references/classes/DMT_Folder.md (12495b), references/classes/DMT_Panel.md (9807b), references/classes/DMT_Pcb.md (10269b), references/classes/DMT_Project.md (9458b), references/classes/DMT_Schematic.md (35259b), references/classes/DMT_SelectControl.md (2512b), references/classes/DMT_Team.md (3322b), references/classes/DMT_Workspace.md (3732b), references/classes/EDA.md (12516b), references/classes/IPCB_ComplexPolygon.md (6044b), references/classes/IPCB_Polygon.md (3090b), references/classes/IPCB_PrimitiveArc.md (37653b), references/classes/IPCB_PrimitiveAttribute.md (64926b), references/classes/IPCB_PrimitiveComponent.md (52305b), references/classes/IPCB_PrimitiveComponentPad.md (8772b), references/classes/IPCB_PrimitiveDimension.md (27831b), references/classes/IPCB_PrimitiveFill.md (28795b), references/classes/IPCB_PrimitiveImage.md (31889b), references/classes/IPCB_PrimitiveLine.md (32186b), references/classes/IPCB_PrimitiveObject.md (39835b), references/classes/IPCB_PrimitivePad.md (61154b), references/classes/IPCB_PrimitivePolyline.md (26817b), references/classes/IPCB_PrimitivePour.md (42693b), references/classes/IPCB_PrimitivePoured.md (12285b), references/classes/IPCB_PrimitiveRegion.md (29858b) (+56 more)\n\nFile v1.1.24:README.md\n\n[English](#) | [简体中文](./README.zh-Hans.md)\n\n# EasyEDA API Skill\n\nAn EasyEDA Pro API skill package for AI coding tools such as Claude Code, OpenCode, QwenCode, and any other tool that supports the [Agent Skills](https://agentskills.io/) standard.\n\nThis skill supports both online debugging of EasyEDA Pro through AI and extension development for EasyEDA Pro.\nWhen developing EasyEDA extensions, AI can use the extension-development documentation, API references, type information, usage examples, and bridge debugging capabilities provided by this skill to help with API lookup, code generation, and integration debugging.\nIf you want to analyze or modify EasyEDA document source files directly instead of operating through the API, this project also provides documentation for the source file formats.\n\n- 📚 **Structured API documentation** — Automatically builds hierarchical indexes from reference docs for fast AI lookup\n- 🧾 **Document source format specifications** — Explains project, schematic, and PCB source formats for direct source analysis and modification\n- 🔌 **WebSocket Bridge** — A Node.js server that bridges AI tools and the EasyEDA client\n- 🤖 **SKILL.md** — A complete skill instruction file\n\n## Quick Start\n\n### 1. Install dependencies\n\n```bash\nnpm install\n```\n\n### 2. Build API documentation\n\n```bash\nnpm run build:docs\n```\n\nThis reads the raw API documentation from the `reference/` directory and generates structured docs into the `docs/` directory.\n\n### 3. Start the WebSocket Bridge server\n\n```bash\nnpm run server\n```\n\nThe server automatically chooses an available port in the `49620-49629` range and waits for the EasyEDA client to connect.\n\n### 4. Connect from EasyEDA\n\nInstall the `run-api-gateway.eext` extension in EasyEDA. Download:\n\n- https://jlcext.com/item/oshwhub-official/run-api-gateway\n\nAfter the extension is loaded, it connects to the Bridge server automatically by scanning the port range and verifying the handshake.\n\n### 5. Use from an AI coding tool\n\nAI coding tools such as Claude Code, OpenCode, and QwenCode automatically read `SKILL.md` for instructions, then use the HTTP API to send code to EasyEDA:\n\n```bash\n# Check EasyEDA connection status (assuming the service is on port 49620)\ncurl http://localhost:49620/health\n\n# Execute EasyEDA code\ncurl -X POST http://localhost:49620/execute \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"code\": \"return await eda.dmt_Project.getCurrentProjectInfo();\"}'\n```\n\n## One-Command Packaging\n\n```bash\nnpm run pack\n```\n\nThis performs the following steps:\n1. Build API documentation (`docs/`)\n2. Package `SKILL.md`, documentation, and the server into `dist/easyeda-api/`\n3. Generate `dist/easyeda-api.zip` for upload\n\nIf the documentation has already been built, you can skip that step:\n\n```bash\nnpm run pack:fast\n```\n\n### Publish to ClawHub\n\n```bash\nnpx clawhub@latest publish dist/easyeda-api/\n```\n\nOr upload the zip file at https://clawhub.ai/upload\n\n## Architecture\n\n```\n┌──────────────┐   HTTP/WS     ┌────────────────┐   WebSocket   ┌──────────┐\n│   AI Agent   │ ◄───────────► │ Bridge Server  │ ◄───────────► │  EasyEDA │\n│ (Skill Tool) │  Port Range   │   (Node.js)    │  Port Range   │ (Client) │\n└──────────────┘  49620-49629  └────────────────┘  49620-49629  └──────────┘\n```\n\n## Communication Protocol\n\n| Message Type | Direction | Description |\n|--------------|-----------|-------------|\n| `execute` | AI → EDA | Execute JavaScript code |\n| `result` | EDA → AI | Return execution result |\n| `error` | EDA → AI | Return execution error |\n| `handshake` | Server → Client | Connection verification (includes `service: \"easyeda-bridge\"`) |\n| `ping/pong` | Bidirectional | Heartbeat |\n\n## Directory Structure\n\n```text\neasyeda-api-skill/\n  SKILL.md              # AgentSkills standard skill definition\n  AGENTS.md             # Agent prompt guide\n  package.json          # Project configuration\n  reference/            # Raw API reference docs (gitignored)\n  docs/                 # Built structured docs (gitignored)\n  format/               # EasyEDA document source format specs (project/schematic/pcb)\n  guide/                # API development guides\n  user-guide/           # User guides\n  server/index.mjs      # WebSocket Bridge server\n  scripts/\n    build-docs.mjs      # Documentation build script\n    pack.mjs            # Packaging script\n  dist/                 # Packaging output (gitignored)\n    easyeda-api/        # Publishable skill directory\n    easyeda-api.zip     # Zip archive for ClawHub upload\n```\n\nFile v1.1.24:references/_index.md\n\n# EasyEDA Pro API 文档索引\n\n> 此文档由构建脚本自动生成，供 AI 编程工具使用。\n> 全局变量 `eda` 是 EDA 类的实例，所有 API 通过 `eda.xxx` 调用。\n\n## 快速导航\n\n- [classes/](classes/) - 类文档（包含全部方法和属性）\n- [enums/](enums/) - 枚举文档\n- [interfaces/](interfaces/) - 接口文档（包含全部属性）\n- [types/](types/) - 类型别名文档\n\n## API 访问方式\n\n所有 API 通过全局变量 `eda` 访问，例如：\n- `eda.dmt_Board.createBoard()` — 文档树 / 板子管理\n- `eda.pcb_PrimitiveLine.create()` — PCB 直线图元创建\n- `eda.sys_WebSocket.register()` — WebSocket 连接注册\n- `eda.sch_PrimitiveComponent.create()` — 原理图器件创建\n\n---\n\n# 类 (Classes)\n\n| 类名 | 描述 | 备注 |\n|------|------|------|\n| [DMT_Board](classes/DMT_Board.md) | Document tree / Board management class |  |\n| [DMT_EditorControl](classes/DMT_EditorControl.md) | Document tree / Editor control class |  |\n| [DMT_Event](classes/DMT_Event.md) | Document tree / event class |  |\n| [DMT_Folder](classes/DMT_Folder.md) | Document tree / Folder class |  |\n| [DMT_Panel](classes/DMT_Panel.md) | Document tree / Panel management class |  |\n| [DMT_Pcb](classes/DMT_Pcb.md) | Document tree / PCB management class |  |\n| [DMT_Project](classes/DMT_Project.md) | Document tree / Project management class |  |\n| [DMT_Schematic](classes/DMT_Schematic.md) | Document tree / Schematic management class |  |\n| [DMT_SelectControl](classes/DMT_SelectControl.md) | Document tree / selection control class |  |\n| [DMT_Team](classes/DMT_Team.md) | Document tree / Team class |  |\n| [DMT_Workspace](classes/DMT_Workspace.md) | Document tree / Workspace class |  |\n| [EDA](classes/EDA.md) | EasyEDA Pro user API interface |  |\n| [IPCB_ComplexPolygon](classes/IPCB_ComplexPolygon.md) | Complex polygon |  |\n| [IPCB_Polygon](classes/IPCB_Polygon.md) | Single polygon |  |\n| [IPCB_PrimitiveArc](classes/IPCB_PrimitiveArc.md) | Arc line primitive |  |\n| [IPCB_PrimitiveAttribute](classes/IPCB_PrimitiveAttribute.md) | Property primitive |  |\n| [IPCB_PrimitiveComponent](classes/IPCB_PrimitiveComponent.md) | Device primitive |  |\n| [IPCB_PrimitiveComponentPad](classes/IPCB_PrimitiveComponentPad.md) | Device pad primitive |  |\n| [IPCB_PrimitiveDimension](classes/IPCB_PrimitiveDimension.md) | Dimension primitive |  |\n| [IPCB_PrimitiveFill](classes/IPCB_PrimitiveFill.md) | Fill primitive |  |\n| [IPCB_PrimitiveImage](classes/IPCB_PrimitiveImage.md) | Image primitive |  |\n| [IPCB_PrimitiveLine](classes/IPCB_PrimitiveLine.md) | Line primitive |  |\n| [IPCB_PrimitiveObject](classes/IPCB_PrimitiveObject.md) | Binary embedded object primitive |  |\n| [IPCB_PrimitivePad](classes/IPCB_PrimitivePad.md) | Pad primitive |  |\n| [IPCB_PrimitivePolyline](classes/IPCB_PrimitivePolyline.md) | Polyline primitive |  |\n| [IPCB_PrimitivePour](classes/IPCB_PrimitivePour.md) | Copper border primitive |  |\n| [IPCB_PrimitivePoured](classes/IPCB_PrimitivePoured.md) | Copper fill primitive |  |\n| [IPCB_PrimitiveRegion](classes/IPCB_PrimitiveRegion.md) | Region primitive |  |\n| [IPCB_PrimitiveString](classes/IPCB_PrimitiveString.md) | Text primitive |  |\n| [IPCB_PrimitiveVia](classes/IPCB_PrimitiveVia.md) | Via primitive |  |\n| [ISCH_PrimitiveArc](classes/ISCH_PrimitiveArc.md) | Arc primitive |  |\n| [ISCH_PrimitiveAttribute](classes/ISCH_PrimitiveAttribute.md) | Property primitive |  |\n| [ISCH_PrimitiveBus](classes/ISCH_PrimitiveBus.md) | Bus primitive |  |\n| [ISCH_PrimitiveCbbSymbolComponent](classes/ISCH_PrimitiveCbbSymbolComponent.md) | Reuse block symbol primitive |  |\n| [ISCH_PrimitiveCircle](classes/ISCH_PrimitiveCircle.md) | Circle primitive |  |\n| [ISCH_PrimitiveComponent](classes/ISCH_PrimitiveComponent.md) | Device primitive |  |\n| [ISCH_PrimitiveComponentPin](classes/ISCH_PrimitiveComponentPin.md) | Device pin primitive |  |\n| [ISCH_PrimitiveObject](classes/ISCH_PrimitiveObject.md) | Binary embedded object primitive |  |\n| [ISCH_PrimitivePin](classes/ISCH_PrimitivePin.md) | Pin primitive |  |\n| [ISCH_PrimitivePolygon](classes/ISCH_PrimitivePolygon.md) | Polygon (polyline) primitive |  |\n| [ISCH_PrimitiveRectangle](classes/ISCH_PrimitiveRectangle.md) | Rectangle primitive |  |\n| [ISCH_PrimitiveText](classes/ISCH_PrimitiveText.md) | Text primitive |  |\n| [ISCH_PrimitiveWire](classes/ISCH_PrimitiveWire.md) | Wire primitive |  |\n| [LIB_3DModel](classes/LIB_3DModel.md) | Comprehensive library / 3D model class |  |\n| [LIB_Cbb](classes/LIB_Cbb.md) | Comprehensive library / reuse block class |  |\n| [LIB_Classification](classes/LIB_Classification.md) | Comprehensive library / library classification index class |  |\n| [LIB_Device](classes/LIB_Device.md) | Comprehensive library / device class |  |\n| [LIB_Footprint](classes/LIB_Footprint.md) | Comprehensive library / footprint class |  |\n| [LIB_LibrariesList](classes/LIB_LibrariesList.md) | Comprehensive library / library list class |  |\n| [LIB_PanelLibrary](classes/LIB_PanelLibrary.md) | Comprehensive library / panel library class |  |\n| [LIB_SelectControl](classes/LIB_SelectControl.md) | Comprehensive library / selection control class |  |\n| [LIB_SimulationModel](classes/LIB_SimulationModel.md) | Comprehensive library / simulation model class |  |\n| [LIB_Symbol](classes/LIB_Symbol.md) | Comprehensive library / symbol class |  |\n| [PCB_Document](classes/PCB_Document.md) | PCB &amp; footprint / document operation class |  |\n| [PCB_Drc](classes/PCB_Drc.md) | PCB &amp; footprint / design rule check (DRC) class |  |\n| [PCB_Event](classes/PCB_Event.md) | PCB &amp; footprint / event class |  |\n| [PCB_ImageTool](classes/PCB_ImageTool.md) | PCB 图片工具类 |  |\n| [PCB_Layer](classes/PCB_Layer.md) | PCB &amp; footprint / layer operation class |  |\n| [PCB_ManufactureData](classes/PCB_ManufactureData.md) | PCB &amp; footprint / manufacture data class |  |\n| [PCB_MathPolygon](classes/PCB_MathPolygon.md) | PCB &amp; footprint / polygon math class |  |\n| [PCB_Net](classes/PCB_Net.md) | PCB &amp; footprint / net class |  |\n| [PCB_Primitive](classes/PCB_Primitive.md) | PCB &amp; footprint / primitive class |  |\n| [PCB_PrimitiveArc](classes/PCB_PrimitiveArc.md) | PCB &amp; footprint / arc line primitive class |  |\n| [PCB_PrimitiveAttribute](classes/PCB_PrimitiveAttribute.md) | PCB &amp; footprint / property primitive class |  |\n| [PCB_PrimitiveComponent](classes/PCB_PrimitiveComponent.md) | PCB &amp; footprint / device primitive class |  |\n| [PCB_PrimitiveDimension](classes/PCB_PrimitiveDimension.md) | PCB &amp; footprint / dimension primitive class |  |\n| [PCB_PrimitiveFill](classes/PCB_PrimitiveFill.md) | PCB &amp; footprint / fill primitive class |  |\n| [PCB_PrimitiveImage](classes/PCB_PrimitiveImage.md) | PCB &amp; footprint / image primitive class |  |\n| [PCB_PrimitiveLine](classes/PCB_PrimitiveLine.md) | PCB &amp; footprint / line primitive class |  |\n| [PCB_PrimitiveObject](classes/PCB_PrimitiveObject.md) | PCB &amp; footprint / binary embedded object primitive class |  |\n| [PCB_PrimitivePad](classes/PCB_PrimitivePad.md) | PCB &amp; footprint / pad primitive class |  |\n| [PCB_PrimitivePolyline](classes/PCB_PrimitivePolyline.md) | PCB &amp; footprint / polyline primitive class |  |\n| [PCB_PrimitivePour](classes/PCB_PrimitivePour.md) | PCB &amp; footprint / copper border primitive class |  |\n| [PCB_PrimitivePoured](classes/PCB_PrimitivePoured.md) | PCB &amp; footprint / copper fill primitive class |  |\n| [PCB_PrimitiveRegion](classes/PCB_PrimitiveRegion.md) | PCB &amp; footprint / forbidden region and constrained region primitive class |  |\n| [PCB_PrimitiveString](classes/PCB_PrimitiveString.md) | PCB &amp; footprint / text primitive class |  |\n| [PCB_PrimitiveVia](classes/PCB_PrimitiveVia.md) | PCB &amp; footprint / via primitive class |  |\n| [PCB_RayTracerEngine](classes/PCB_RayTracerEngine.md) | PCB &amp; footprint / ray tracer engine class |  |\n| [PCB_SelectControl](classes/PCB_SelectControl.md) | PCB &amp; footprint / selection control class |  |\n| [PNL_Document](classes/PNL_Document.md) | Panel / document operation class |  |\n| [SCH_Document](classes/SCH_Document.md) | Schematic &amp; symbol / document operation class |  |\n| [SCH_Drc](classes/SCH_Drc.md) | Schematic &amp; symbol / design rule check (DRC) class |  |\n| [SCH_Event](classes/SCH_Event.md) | Schematic &amp; symbol / event class |  |\n| [SCH_ManufactureData](classes/SCH_ManufactureData.md) | Schematic &amp; symbol / manufacture data class |  |\n| [SCH_Net](classes/SCH_Net.md) | Schematic &amp; symbol / net class |  |\n| [SCH_Netlist](classes/SCH_Netlist.md) | Schematic &amp; symbol / netlist class |  |\n| [SCH_Primitive](classes/SCH_Primitive.md) | Schematic &amp; symbol / primitive class |  |\n| [SCH_PrimitiveArc](classes/SCH_PrimitiveArc.md) | Schematic &amp; symbol / arc primitive class |  |\n| [SCH_PrimitiveAttribute](classes/SCH_PrimitiveAttribute.md) | Schematic &amp; symbol / property primitive class |  |\n| [SCH_PrimitiveBus](classes/SCH_PrimitiveBus.md) | Schematic &amp; symbol / bus primitive class |  |\n| [SCH_PrimitiveCircle](classes/SCH_PrimitiveCircle.md) | Schematic &amp; symbol / circle primitive class |  |\n| [SCH_PrimitiveComponent](classes/SCH_PrimitiveComponent.md) | Schematic &amp; symbol / device primitive class |  |\n| [SCH_PrimitiveObject](classes/SCH_PrimitiveObject.md) | Schematic &amp; symbol / binary embedded object primitive class |  |\n| [SCH_PrimitivePin](classes/SCH_PrimitivePin.md) | Schematic &amp; symbol / pin primitive class |  |\n| [SCH_PrimitivePolygon](classes/SCH_PrimitivePolygon.md) | Schematic &amp; symbol / polygon (polyline) primitive class |  |\n| [SCH_PrimitiveRectangle](classes/SCH_PrimitiveRectangle.md) | Schematic &amp; symbol / rectangle primitive class |  |\n| [SCH_PrimitiveText](classes/SCH_PrimitiveText.md) | Schematic &amp; symbol / text primitive class |  |\n| [SCH_PrimitiveWire](classes/SCH_PrimitiveWire.md) | Schematic &amp; symbol / wire primitive class |  |\n| [SCH_SelectControl](classes/SCH_SelectControl.md) | Schematic &amp; symbol / selection control class |  |\n| [SCH_SimulationEngine](classes/SCH_SimulationEngine.md) | Schematic &amp; symbol / simulation engine class |  |\n| [SCH_Utils](classes/SCH_Utils.md) | Schematic &amp; symbol / utility class |  |\n| [SYS_ClientUrl](classes/SYS_ClientUrl.md) | System / external request class |  |\n| [SYS_Dialog](classes/SYS_Dialog.md) | System / dialog class |  |\n| [SYS_Environment](classes/SYS_Environment.md) | System / runtime environment class |  |\n| [SYS_ExternalApi](classes/SYS_ExternalApi.md) | 外部接口注入管理类 |  |\n| [SYS_FileManager](classes/SYS_FileManager.md) | System / file manager class |  |\n| [SYS_FileSystem](classes/SYS_FileSystem.md) | System / file system interaction class |  |\n| [SYS_FontManager](classes/SYS_FontManager.md) | System / font manager class |  |\n| [SYS_FormatConversion](classes/SYS_FormatConversion.md) | System / format conversion (Chameleon) class |  |\n| [SYS_HeaderMenu](classes/SYS_HeaderMenu.md) | System / header menu class |  |\n| [SYS_Help](classes/SYS_Help.md) | Help 渐进式披露类 |  |\n| [SYS_I18n](classes/SYS_I18n.md) | System / multilingual class |  |\n| [SYS_IFrame](classes/SYS_IFrame.md) | System / iframe window class |  |\n| [SYS_LoadingAndProgressBar](classes/SYS_LoadingAndProgressBar.md) | System / loading and progress bar class |  |\n| [SYS_Log](classes/SYS_Log.md) | System / log class |  |\n| [SYS_Math](classes/SYS_Math.md) | System / math class |  |\n| [SYS_Message](classes/SYS_Message.md) | System / message notification class |  |\n| [SYS_MessageBox](classes/SYS_MessageBox.md) | System / message box class |  |\n| [SYS_MessageBus](classes/SYS_MessageBus.md) | System / message bus class |  |\n| [SYS_PanelControl](classes/SYS_PanelControl.md) | System / panel control class |  |\n| [SYS_RightClickMenu](classes/SYS_RightClickMenu.md) | System / right-click menu class |  |\n| [SYS_Setting](classes/SYS_Setting.md) | System / settings class |  |\n| [SYS_ShortcutKey](classes/SYS_ShortcutKey.md) | System / shortcut key class |  |\n| [SYS_Storage](classes/SYS_Storage.md) | System / storage class |  |\n| [SYS_Timer](classes/SYS_Timer.md) | System / timer class |  |\n| [SYS_ToastMessage](classes/SYS_ToastMessage.md) | System / toast message class |  |\n| [SYS_Tool](classes/SYS_Tool.md) | System / tool class |  |\n| [SYS_Unit](classes/SYS_Unit.md) | System / unit class |  |\n| [SYS_WebSocket](classes/SYS_WebSocket.md) | System / WebSocket class |  |\n| [SYS_Window](classes/SYS_Window.md) | System / window class |  |\n\n\n---\n\n# 枚举 (Enumerations)\n\n| 枚举名 | 描述 | 备注 |\n|--------|------|------|\n| [EDMT_EditorDocumentType](enums/EDMT_EditorDocumentType.md) | Editor document type |  |\n| [EDMT_EditorSplitScreenDirection](enums/EDMT_EditorSplitScreenDirection.md) | Editor split screen direction |  |\n| [EDMT_EditorTabEventType](enums/EDMT_EditorTabEventType.md) | Editor tab event type |  |\n| [EDMT_IndicatorMarkerType](enums/EDMT_IndicatorMarkerType.md) | Indicator marker type |  |\n| [EDMT_ItemType](enums/EDMT_ItemType.md) | Document tree project type |  |\n| [EDMT_ProjectCollaborationMode](enums/EDMT_ProjectCollaborationMode.md) | Project collaboration mode |  |\n| [ELIB_DeviceJlcLibraryCategory](enums/ELIB_DeviceJlcLibraryCategory.md) | EasyEDA SMT library category |  |\n| [ELIB_LibraryType](enums/ELIB_LibraryType.md) | Comprehensive library library type |  |\n| [ELIB_PreviewType](enums/ELIB_PreviewType.md) | Preview view type |  |\n| [ELIB_SimulationModelType](enums/ELIB_SimulationModelType.md) | Simulation model type |  |\n| [ELIB_SymbolType](enums/ELIB_SymbolType.md) | Symbol type |  |\n| [EPCB_AutoRoutingCornerStyle](enums/EPCB_AutoRoutingCornerStyle.md) | Auto routing corner style |  |\n| [EPCB_AutoRoutingExistingPrimitiveMode](enums/EPCB_AutoRoutingExistingPrimitiveMode.md) | How auto routing handles existing wires/vias |  |\n| [EPCB_AutoRoutingOptimization](enums/EPCB_AutoRoutingOptimization.md) | Auto routing optimization priority |  |\n| [EPCB_DocumentCanvasUpdateCalculationActiveStatus](enums/EPCB_DocumentCanvasUpdateCalculationActiveStatus.md) | Canvas update calculation function status |  |\n| [EPCB_DocumentRatlineCalculatingActiveStatus](enums/EPCB_DocumentRatlineCalculatingActiveStatus.md) | Document ratline calculation function status |  |\n| [EPCB_InactiveLayerDisplayMode](enums/EPCB_InactiveLayerDisplayMode.md) | Inactive layer display mode |  |\n| [EPCB_LayerColorConfiguration](enums/EPCB_LayerColorConfiguration.md) | Layer color configuration |  |\n| [EPCB_LayerId](enums/EPCB_LayerId.md) | Layer ID |  |\n| [EPCB_LayerStatus](enums/EPCB_LayerStatus.md) | Layer status |  |\n| [EPCB_LayerType](enums/EPCB_LayerType.md) | Layer type |  |\n| [EPCB_MouseEventType](enums/EPCB_MouseEventType.md) | Mouse event type |  |\n| [EPCB_NetEventType](enums/EPCB_NetEventType.md) | Net event type |  |\n| [EPCB_PcbPlateType](enums/EPCB_PcbPlateType.md) | PCB plate type |  |\n| [EPCB_PdfOutputMethod](enums/EPCB_PdfOutputMethod.md) | PDF output method |  |\n| [EPCB_PrimitiveArcInteractiveMode](enums/EPCB_PrimitiveArcInteractiveMode.md) | Arc interaction mode |  |\n| [EPCB_PrimitiveDimensionType](enums/EPCB_PrimitiveDimensionType.md) | Dimension type |  |\n| [EPCB_PrimitiveEventType](enums/EPCB_PrimitiveEventType.md) | Primitive event type |  |\n| [EPCB_PrimitiveFillMode](enums/EPCB_PrimitiveFillMode.md) | Fill primitive fill mode |  |\n| [EPCB_PrimitivePadHeatWeldingConnectionMethod](enums/EPCB_PrimitivePadHeatWeldingConnectionMethod.md) | Pad heat welding connection method |  |\n| [EPCB_PrimitivePadHoleType](enums/EPCB_PrimitivePadHoleType.md) | Pad drilling type |  |\n| [EPCB_PrimitivePadShapeType](enums/EPCB_PrimitivePadShapeType.md) | Pad shape type |  |\n| [EPCB_PrimitivePadType](enums/EPCB_PrimitivePadType.md) | Pad type |  |\n| [EPCB_PrimitivePourFillMethod](enums/EPCB_PrimitivePourFillMethod.md) | Copper fill method |  |\n| [EPCB_PrimitiveRegionRuleType](enums/EPCB_PrimitiveRegionRuleType.md) | Region primitive region rule type |  |\n| [EPCB_PrimitiveStringAlignMode](enums/EPCB_PrimitiveStringAlignMode.md) | Text alignment mode |  |\n| [EPCB_PrimitiveType](enums/EPCB_PrimitiveType.md) | Primitive type |  |\n| [EPCB_PrimitiveViaType](enums/EPCB_PrimitiveViaType.md) | Via type |  |\n| [ESCH_DynamicSimulationEnginePullEventType](enums/ESCH_DynamicSimulationEnginePullEventType.md) | Dynamic simulation engine pull event type |  |\n| [ESCH_DynamicSimulationEnginePushEventType](enums/ESCH_DynamicSimulationEnginePushEventType.md) | Dynamic simulation engine push event type |  |\n| [ESCH_ExportDocumentFileType](enums/ESCH_ExportDocumentFileType.md) | Export document file type |  |\n| [ESCH_MouseEventType](enums/ESCH_MouseEventType.md) | Mouse event type |  |\n| [ESCH_PrimitiveComponentType](enums/ESCH_PrimitiveComponentType.md) | Device type |  |\n| [ESCH_PrimitiveEventType](enums/ESCH_PrimitiveEventType.md) | Primitive event type |  |\n| [ESCH_PrimitiveFillStyle](enums/ESCH_PrimitiveFillStyle.md) | Fill style |  |\n| [ESCH_PrimitiveLineType](enums/ESCH_PrimitiveLineType.md) | Line type |  |\n| [ESCH_PrimitivePinShape](enums/ESCH_PrimitivePinShape.md) | Pin shape |  |\n| [ESCH_PrimitivePinType](enums/ESCH_PrimitivePinType.md) | Pin type |  |\n| [ESCH_PrimitiveTextAlignMode](enums/ESCH_PrimitiveTextAlignMode.md) | Text alignment mode |  |\n| [ESCH_PrimitiveType](enums/ESCH_PrimitiveType.md) | Primitive type |  |\n| [ESCH_SimulationNetlistType](enums/ESCH_SimulationNetlistType.md) | Simulation netlist type |  |\n| [ESCH_SpiceSimulationEnginePullEventType](enums/ESCH_SpiceSimulationEnginePullEventType.md) | Spice simulation engine pull event type |  |\n| [ESCH_SpiceSimulationEnginePushEventType](enums/ESCH_SpiceSimulationEnginePushEventType.md) | Spice simulation engine push event type |  |\n| [ESYS_BottomPanelTab](enums/ESYS_BottomPanelTab.md) | Bottom panel tab |  |\n| [ESYS_HeaderMenuEnvironment](enums/ESYS_HeaderMenuEnvironment.md) | Header menu environment |  |\n| [ESYS_ImportProjectBoardOutlineSource](enums/ESYS_ImportProjectBoardOutlineSource.md) | Import project board outline source |  |\n| [ESYS_ImportProjectImportOption](enums/ESYS_ImportProjectImportOption.md) | Import project import option |  |\n| [ESYS_ImportProjectSchematicObjectStyle](enums/ESYS_ImportProjectSchematicObjectStyle.md) | Import project schematic primitive style |  |\n| [ESYS_ImportProjectViaSolderMaskExpansion](enums/ESYS_ImportProjectViaSolderMaskExpansion.md) | Import project via solder mask extension |  |\n| [ESYS_LeftPanelTab](enums/ESYS_LeftPanelTab.md) | Left panel tab |  |\n| [ESYS_LogType](enums/ESYS_LogType.md) | Log type |  |\n| [ESYS_NetlistType](enums/ESYS_NetlistType.md) | Netlist type |  |\n| [ESYS_RightPanelTab](enums/ESYS_RightPanelTab.md) | Right panel tab |  |\n| [ESYS_ShortcutKeyEffectiveEditorRange](enums/ESYS_ShortcutKeyEffectiveEditorRange.md) | Effective page range of the shortcut key |  |\n| [ESYS_ShortcutKeyEffectiveEditorScene](enums/ESYS_ShortcutKeyEffectiveEditorScene.md) | Effective scene range of the shortcut key |  |\n| [ESYS_StartPageQuickStartItem](enums/ESYS_StartPageQuickStartItem.md) | Start page quick start item |  |\n| [ESYS_Theme](enums/ESYS_Theme.md) | Theme |  |\n| [ESYS_ToastMessageType](enums/ESYS_ToastMessageType.md) | Toast message type |  |\n| [ESYS_Unit](enums/ESYS_Unit.md) | Unit |  |\n| [ESYS_WindowEventType](enums/ESYS_WindowEventType.md) | Window event type |  |\n| [ESYS_WindowOpenTarget](enums/ESYS_WindowOpenTarget.md) | Open window context target |  |\n| [NetportDeviceName](enums/NetportDeviceName.md) | 网络端口符号对应的器件名称 |  |\n| [SchToolBarDeviceName](enums/SchToolBarDeviceName.md) | 悬浮框特殊符号对应的器件名称 |  |\n\n\n---\n\n# 接口 (Interfaces)\n\n| 接口名 | 描述 | 备注 |\n|--------|------|------|\n| [BoardProps](interfaces/BoardProps.md) | 分组面板：带标题的可折叠/分组容器 |  |\n| [BorderConfig](interfaces/BorderConfig.md) | 边框配置 |  |\n| [ButtonProps](interfaces/ButtonProps.md) | 按钮组件：可点击触发的操作按钮 |  |\n| [CellClickInfo](interfaces/CellClickInfo.md) | 单元格点击信息 |  |\n| [CellCoord](interfaces/CellCoord.md) | 单元格坐标（rowKey + colKey 定位一个单元格） |  |\n| [CheckboxEditConfig](interfaces/CheckboxEditConfig.md) |  |  |\n| [CheckBoxProps](interfaces/CheckBoxProps.md) | 复选框组件：可勾选的状态控件 |  |\n| [CheckChangeDetail](interfaces/CheckChangeDetail.md) | 勾选变更详情 |  |\n| [ClipboardCellData](interfaces/ClipboardCellData.md) | 剪贴板单元格数据 |  |\n| [ClipboardConfig](interfaces/ClipboardConfig.md) | 剪贴板配置 |  |\n| [ColorPickerProps](interfaces/ColorPickerProps.md) | 颜色拾取组件：复用 Input color 类型，点击弹出内置固定色板，支持预览/应用/手输/清除/默认/关闭 |  |\n| [ColumnDef](interfaces/ColumnDef.md) | 列定义 |  |\n| [ColumnEditTrigger](interfaces/ColumnEditTrigger.md) | 编辑触发方式 |  |\n| [ColumnGroupDef](interfaces/ColumnGroupDef.md) | 列分组：多级表头 |  |\n| [ColumnResizeConfig](interfaces/ColumnResizeConfig.md) | 列宽拖拽配置 |  |\n| [ComponentPropsMap](interfaces/ComponentPropsMap.md) | Component name → Props type mapping, serving as the sole source of the `createComponent` generic constraint |  |\n| [CustomHeaderConfig](interfaces/CustomHeaderConfig.md) | 自定义表头配置（列可见性管理） |  |\n| [DialogProps](interfaces/DialogProps.md) | 对话框组件：带标题栏、可拖拽缩放的组合弹窗 |  |\n| [DragSortConfig](interfaces/DragSortConfig.md) | 拖拽排序配置 |  |\n| [EditingConfig](interfaces/EditingConfig.md) | 编辑配置 |  |\n| [FilteringConfig](interfaces/FilteringConfig.md) | 筛选配置 |  |\n| [FixedColumnConfig](interfaces/FixedColumnConfig.md) | 固定列配置（也可通过 ColumnDef.fixed 逐列声明） |  |\n| [FlexItemProps](interfaces/FlexItemProps.md) | Flex 子项：Flex 布局中的单个子元素 |  |\n| [FlexProps](interfaces/FlexProps.md) | 布局容器：灵活的 Flex 布局容器 |  |\n| [GridItemProps](interfaces/GridItemProps.md) | Grid 子项：网格中的单个子元素 |  |\n| [GridProps](interfaces/GridProps.md) | 布局容器：固定列数的网格布局容器 |  |\n| [IconProps](interfaces/IconProps.md) | 图标配置：通过 URL 或 CSS class 指定图标 |  |\n| [IDesignPortal](interfaces/IDesignPortal.md) | Component tree operation contract. |  |\n| [IDMT_BoardItem](interfaces/IDMT_BoardItem.md) | Board property |  |\n| [IDMT_BriefProjectItem](interfaces/IDMT_BriefProjectItem.md) | Brief project properties |  |\n| [IDMT_EditorDocumentItem](interfaces/IDMT_EditorDocumentItem.md) | Editor document object |  |\n| [IDMT_EditorSplitScreenItem](interfaces/IDMT_EditorSplitScreenItem.md) | Editor split screen property |  |\n| [IDMT_EditorTabItem](interfaces/IDMT_EditorTabItem.md) | Editor tab |  |\n| [IDMT_FolderItem](interfaces/IDMT_FolderItem.md) | Folder property |  |\n| [IDMT_IndicatorMarkerShape](interfaces/IDMT_IndicatorMarkerShape.md) | Indicator marker shape |  |\n| [IDMT_PanelItem](interfaces/IDMT_PanelItem.md) | Panel property |  |\n| [IDMT_PcbItem](interfaces/IDMT_PcbItem.md) | PCB property |  |\n| [IDMT_ProjectItem](interfaces/IDMT_ProjectItem.md) | Project property |  |\n| [IDMT_SchematicItem](interfaces/IDMT_SchematicItem.md) | Schematic property |  |\n| [IDMT_SchematicPageItem](interfaces/IDMT_SchematicPageItem.md) | Schematic sheet property |  |\n| [IDMT_TeamItem](interfaces/IDMT_TeamItem.md) | Team properties |  |\n| [IDMT_WorkspaceItem](interfaces/IDMT_WorkspaceItem.md) | Workspace properties |  |\n| [ILIB_3DModelItem](interfaces/ILIB_3DModelItem.md) | 3D model property |  |\n| [ILIB_3DModelSearchItem](interfaces/ILIB_3DModelSearchItem.md) | Searched 3D model properties |  |\n| [ILIB_CbbItem](interfaces/ILIB_CbbItem.md) | Reuse block property |  |\n| [ILIB_CbbSearchItem](interfaces/ILIB_CbbSearchItem.md) | Searched reuse block properties |  |\n| [ILIB_ClassificationIndex](interfaces/ILIB_ClassificationIndex.md) | Classification index |  |\n| [ILIB_DeviceAssociationItem](interfaces/ILIB_DeviceAssociationItem.md) | Device associated symbol, footprint property |  |\n| [ILIB_DeviceExtendPropertyItem](interfaces/ILIB_DeviceExtendPropertyItem.md) | Device extension property |  |\n| [ILIB_DeviceItem](interfaces/ILIB_DeviceItem.md) | Device property |  |\n| [ILIB_DevicePropertiesForSearch](interfaces/ILIB_DevicePropertiesForSearch.md) | Device parameters that can be used for precise search |  |\n| [ILIB_DeviceSearchItem](interfaces/ILIB_DeviceSearchItem.md) | Searched device properties |  |\n| [ILIB_ExtendLibrary3DModelFunctions](interfaces/ILIB_ExtendLibrary3DModelFunctions.md) | External library 3D model functions |  |\n| [ILIB_ExtendLibraryCbbFunctions](interfaces/ILIB_ExtendLibraryCbbFunctions.md) | External library reuse block functions |  |\n| [ILIB_ExtendLibraryClassificationIndex](interfaces/ILIB_ExtendLibraryClassificationIndex.md) | External library classification index |  |\n| [ILIB_ExtendLibraryDeviceFunctions](interfaces/ILIB_ExtendLibraryDeviceFunctions.md) | External library device functions |  |\n| [ILIB_ExtendLibraryFootprintFunctions](interfaces/ILIB_ExtendLibraryFootprintFunctions.md) | External library footprint functions |  |\n| [ILIB_ExtendLibraryFunctions](interfaces/ILIB_ExtendLibraryFunctions.md) | External library functions |  |\n| [ILIB_ExtendLibraryItem](interfaces/ILIB_ExtendLibraryItem.md) | External library item |  |\n| [ILIB_ExtendLibraryItemIndex](interfaces/ILIB_ExtendLibraryItemIndex.md) | External library item index |  |\n| [ILIB_ExtendLibrarySearchProperty](interfaces/ILIB_ExtendLibrarySearchProperty.md) | External library search property |  |\n| [ILIB_ExtendLibrarySearchResult](interfaces/ILIB_ExtendLibrarySearchResult.md) | External library search result |  |\n| [ILIB_ExtendLibrarySearchResultDataLine](interfaces/ILIB_ExtendLibrarySearchResultDataLine.md) | External library search result data line |  |\n| [ILIB_ExtendLibrarySymbolFunctions](interfaces/ILIB_ExtendLibrarySymbolFunctions.md) | External library symbol functions |  |\n| [ILIB_ExtendLibraryUserIndex](interfaces/ILIB_ExtendLibraryUserIndex.md) | External library user index |  |\n| [ILIB_FootprintItem](interfaces/ILIB_FootprintItem.md) | Footprint property |  |\n| [ILIB_FootprintPropertiesForSearch](interfaces/ILIB_FootprintPropertiesForSearch.md) | Footprint parameters that can be used for precise search |  |\n| [ILIB_FootprintSearchItem](interfaces/ILIB_FootprintSearchItem.md) | Searched footprint properties |  |\n| [ILIB_LibraryInfo](interfaces/ILIB_LibraryInfo.md) | Library information |  |\n| [ILIB_LibraryItem](interfaces/ILIB_LibraryItem.md) | Library property |  |\n| [ILIB_PanelLibraryItem](interfaces/ILIB_PanelLibraryItem.md) | Panel library property |  |\n| [ILIB_PanelLibrarySearchItem](interfaces/ILIB_PanelLibrarySearchItem.md) | Searched panel library properties |  |\n| [ILIB_SimulationModelItem](interfaces/ILIB_SimulationModelItem.md) | Simulation model properties |  |\n| [ILIB_SimulationModelSearchItem](interfaces/ILIB_SimulationModelSearchItem.md) | Searched simulation model properties |  |\n| [ILIB_SymbolItem](interfaces/ILIB_SymbolItem.md) | Symbol property |  |\n| [ILIB_SymbolPropertiesForSearch](interfaces/ILIB_SymbolPropertiesForSearch.md) | Symbol parameters that can be used for precise search |  |\n| [ILIB_SymbolSearchItem](interfaces/ILIB_SymbolSearchItem.md) | Searched symbol properties |  |\n| [ImageProps](interfaces/ImageProps.md) | 图片组件：展示单张图片 |  |\n| [InputEditConfig](interfaces/InputEditConfig.md) |  |  |\n| [InputProps](interfaces/InputProps.md) | 输入框组件：支持下拉、搜索、清除、前后缀等多种形态 |  |\n| [IPCB_AutoLayoutResult](interfaces/IPCB_AutoLayoutResult.md) | Auto layout result |  |\n| [IPCB_AutoRoutingProps](interfaces/IPCB_AutoRoutingProps.md) | Auto routing props |  |\n| [IPCB_AutoRoutingResult](interfaces/IPCB_AutoRoutingResult.md) | Auto routing result |  |\n| [IPCB_BomPropertiesTableColumns](interfaces/IPCB_BomPropertiesTableColumns.md) | BOM column properties and sorting rules |  |\n| [IPCB_DifferentialPairItem](interfaces/IPCB_DifferentialPairItem.md) | Differential pair properties |  |\n| [IPCB_DiscretizedPoint](interfaces/IPCB_DiscretizedPoint.md) | Discretized point |  |\n| [IPCB_DiscretizeOptions](interfaces/IPCB_DiscretizeOptions.md) | Discretization options |  |\n| [IPCB_EqualLengthNetGroupItem](interfaces/IPCB_EqualLengthNetGroupItem.md) | Equal-length net group properties |  |\n| [IPCB_LayerItem](interfaces/IPCB_LayerItem.md) | Layer properties |  |\n| [IPCB_NetClassItem](interfaces/IPCB_NetClassItem.md) | Net class property |  |\n| [IPCB_NetInfo](interfaces/IPCB_NetInfo.md) | Net property |  |\n| [IPCB_PadPairGroupItem](interfaces/IPCB_PadPairGroupItem.md) | Pad pair group properties |  |\n| [IPCB_PadPairMinWireLengthItem](interfaces/IPCB_PadPairMinWireLengthItem.md) | Pad pair minimum wire length properties |  |\n| [IPCB_PhysicalStackingConfiguration](interfaces/IPCB_PhysicalStackingConfiguration.md) | Physical stacking configuration |  |\n| [IPCB_Primitive](interfaces/IPCB_Primitive.md) | PCB primitive |  |\n| [IPCB_PrimitiveAPI](interfaces/IPCB_PrimitiveAPI.md) | PCB primitive API |  |\n| [IPCB_PrimitivePadHeatWelding](interfaces/IPCB_PrimitivePadHeatWelding.md) | Pad thermal relief optimization parameters |  |\n| [IPCB_PrimitivePouredPourFill](interfaces/IPCB_PrimitivePouredPourFill.md) | Copper fill region |  |\n| [IPCB_PrimitiveSolderMaskAndPasteMaskExpansion](interfaces/IPCB_PrimitiveSolderMaskAndPasteMaskExpansion.md) | Solder mask / paste mask expansion |  |\n| [IPCB_SubstratePhysicalProperties](interfaces/IPCB_SubstratePhysicalProperties.md) | Substrate physical properties |  |\n| [IRawNet](interfaces/IRawNet.md) | Raw data - net |  |\n| [IRawPureSchematic](interfaces/IRawPureSchematic.md) | Raw data - pureSchematic |  |\n| [IRawSchematic](interfaces/IRawSchematic.md) | Raw data - schematic |  |\n| [IRawWire](interfaces/IRawWire.md) | Raw data - wire |  |\n| [ISCH_DrcError](interfaces/ISCH_DrcError.md) | DRC error item |  |\n| [ISCH_DrcErrorPrimitive](interfaces/ISCH_DrcErrorPrimitive.md) | Primitive involved in a DRC error |  |\n| [ISCH_ExportPngResolution](interfaces/ISCH_ExportPngResolution.md) | 原理图导出图片分辨率 |  |\n| [ISCH_NetInfo](interfaces/ISCH_NetInfo.md) | Net property |  |\n| [ISCH_Primitive](interfaces/ISCH_Primitive.md) | Schematic primitive |  |\n| [ISCH_PrimitiveAPI](interfaces/ISCH_PrimitiveAPI.md) | Schematic primitive API |  |\n| [ISCH_ProjectNetInfo](interfaces/ISCH_ProjectNetInfo.md) | Project net property |  |\n| [ISCH_WireInfo](interfaces/ISCH_WireInfo.md) | Wire property |  |\n| [ISYS_ExtensionExternalApiIndex](interfaces/ISYS_ExtensionExternalApiIndex.md) | external API 扁平索引（按命名空间分组） |  |\n| [ISYS_ExtensionRegisteredExternalApis](interfaces/ISYS_ExtensionRegisteredExternalApis.md) | 扩展注入的上层接口注册表（按扩展分组） |  |\n| [ISYS_ExternalApiHelp](interfaces/ISYS_ExternalApiHelp.md) | 扩展注入的上层接口 Help 元数据 |  |\n| [ISYS_ExternalApiRegistration](interfaces/ISYS_ExternalApiRegistration.md) | 扩展注入的上层接口注册条目 |  |\n| [ISYS_FileSystemFileList](interfaces/ISYS_FileSystemFileList.md) | File system file path |  |\n| [ISYS_HeaderMenus](interfaces/ISYS_HeaderMenus.md) | Header menu item |  |\n| [ISYS_HeaderMenuSub1MenuItem](interfaces/ISYS_HeaderMenuSub1MenuItem.md) | Top-level secondary menu item |  |\n| [ISYS_HeaderMenuSub2MenuItem](interfaces/ISYS_HeaderMenuSub2MenuItem.md) | Top-level tertiary menu item |  |\n| [ISYS_HeaderMenuTopMenuItem](interfaces/ISYS_HeaderMenuTopMenuItem.md) | Top-level primary menu item |  |\n| [ISYS_HelpClassSummary](interfaces/ISYS_HelpClassSummary.md) | 由 help 查询返回的类摘要 |  |\n| [ISYS_HelpData](interfaces/ISYS_HelpData.md) | lc-build 生成的 API jsonSchema（d.ts 的 JSON 形态） |  |\n| [ISYS_HelpMethodDetail](interfaces/ISYS_HelpMethodDetail.md) | Help 查询返回的方法详情 |  |\n| [ISYS_LogLine](interfaces/ISYS_LogLine.md) | Log line |  |\n| [ISYS_MathBBox](interfaces/ISYS_MathBBox.md) | BBox (minimum bounding rectangle) |  |\n| [ISYS_MathPoint](interfaces/ISYS_MathPoint.md) | Discrete points |  |\n| [ISYS_MathPolygonWithHoles](interfaces/ISYS_MathPolygonWithHoles.md) | Polygon with holes |  |\n| [ISYS_MessageBusTask](interfaces/ISYS_MessageBusTask.md) | Message bus task |  |\n| [ISYS_MultilingualLanguagesData](interfaces/ISYS_MultilingualLanguagesData.md) | Multilingual data |  |\n| [ISYS_PcbComparisonResponse](interfaces/ISYS_PcbComparisonResponse.md) | PCB comparison response |  |\n| [ISYS_RightClickMenuItem](interfaces/ISYS_RightClickMenuItem.md) | Right-click menu item |  |\n| [ISYS_ShortcutKeyData](interfaces/ISYS_ShortcutKeyData.md) | Shortcut key data |  |\n| [ISYS_ShortcutKeyDataWithCallFn](interfaces/ISYS_ShortcutKeyDataWithCallFn.md) | Shortcut key data with CallFn |  |\n| [ISYS_ShortcutKeyDataWithUserDefinedShortcutKey](interfaces/ISYS_ShortcutKeyDataWithUserDefinedShortcutKey.md) | Shortcut key data with userDefinedShortcutKey |  |\n| [ISYS_WindowEventListenerRemovableObject](interfaces/ISYS_WindowEventListenerRemovableObject.md) | Window event listener can remove object |  |\n| [KeyboardConfig](interfaces/KeyboardConfig.md) | 键盘导航配置 |  |\n| [ListChildren](interfaces/ListChildren.md) | 列表项：支持多级嵌套分组 |  |\n| [ListProps](interfaces/ListProps.md) | 列表组件：支持多级嵌套、图标、展开的列表 |  |\n| [ModalProps](interfaces/ModalProps.md) | 模态弹窗：可拖拽、可调整大小的顶层弹窗 |  |\n| [NumberEditConfig](interfaces/NumberEditConfig.md) |  |  |\n| [RadioGroupProps](interfaces/RadioGroupProps.md) | 单选组组件：一组互斥的单选选项 |  |\n| [RadioItem](interfaces/RadioItem.md) | 单选组中的单个选项 |  |\n| [RichTableProps](interfaces/RichTableProps.md) | RichTable 组件属性 |  |\n| [RowMetaConfig](interfaces/RowMetaConfig.md) | 行元数据配置，独立于业务数据（挂在 row.rowMeta 上） |  |\n| [ScrollerProps](interfaces/ScrollerProps.md) | 滚动组件：虚拟滚动列表，仅渲染可见行 |  |\n| [SelectEditConfig](interfaces/SelectEditConfig.md) |  |  |\n| [SelectionConfig](interfaces/SelectionConfig.md) | 选择配置 |  |\n| [SelectListItem](interfaces/SelectListItem.md) | 下拉选项：支持多级嵌套分组 |  |\n| [SelectOption](interfaces/SelectOption.md) | 下拉选项 |  |\n| [SelectProps](interfaces/SelectProps.md) | 下拉选择器：基于输入框的下拉选择控件 |  |\n| [SliderProps](interfaces/SliderProps.md) | 滑杆组件：基于浏览器原生 range 输入 |  |\n| [SlotProps](interfaces/SlotProps.md) | 插槽组件：为父组件提供具名内容占位 |  |\n| [SortingConfig](interfaces/SortingConfig.md) | 排序配置 |  |\n| [SortState](interfaces/SortState.md) | 排序状态 |  |\n| [StyleProps](interfaces/StyleProps.md) | 通用样式属性：可被布局容器等组件继承的样式集合 |  |\n| [TextareaEditConfig](interfaces/TextareaEditConfig.md) |  |  |\n| [TextAreaProps](interfaces/TextAreaProps.md) | 多行文本输入组件 |  |\n| [TextProps](interfaces/TextProps.md) | 文本组件：静态文本展示 |  |\n| [ValidationRule](interfaces/ValidationRule.md) | 校验规则（声明式，纯数据，可序列化） |  |\n| [VirtualScrollConfig](interfaces/VirtualScrollConfig.md) | 虚拟滚动配置 |  |\n\n\n---\n\n# 类型别名 (Type Aliases)\n\n| 类型名 | 描述 | 备注 |\n|--------|------|------|\n| [Align](types/Align.md) | 对齐方式 |  |\n| [CellContentType](types/CellContentType.md) | 剪贴板单元格内容类型（决定粘贴时的解析策略） |  |\n| [ColumnDefOrGroup](types/ColumnDefOrGroup.md) | 列定义（支持普通列和列分组） |  |\n| [ColumnEditConfig](types/ColumnEditConfig.md) | 五种编辑器类型配置 |  |\n| [ColumnType](types/ColumnType.md) | 列数据类型，默认 'text'。决定默认排序类型（sortType）和筛选匹配模式（filterMatchMode） |  |\n| [DataChangeType](types/DataChangeType.md) | 数据变更类型 |  |\n| [FilterMatchMode](types/FilterMatchMode.md) | 筛选匹配模式 |  |\n| [RichTableRow](types/RichTableRow.md) | 行数据：业务数据 + 行元数据（rowMeta） |  |\n| [Serializable](types/Serializable.md) |  |  |\n| [SerializablePrimitive](types/SerializablePrimitive.md) | 可序列化纯数据（可跨 BroadcastChannel 结构化克隆）。 编译期拒绝函数 / Date / React 元素等不可序列化值——slotProps 等跨广播字段必须用它。 |  |\n| [SortOrder](types/SortOrder.md) | 排序方向 |  |\n| [TPCB_LayersInTheSelectable](types/TPCB_LayersInTheSelectable.md) | Selectable layers |  |\n| [TPCB_LayersOfComponent](types/TPCB_LayersOfComponent.md) | Layers of the device |  |\n| [TPCB_LayersOfCopper](types/TPCB_LayersOfCopper.md) | Layers of copper |  |\n| [TPCB_LayersOfCustom](types/TPCB_LayersOfCustom.md) | Custom layers |  |\n| [TPCB_LayersOfDimension](types/TPCB_LayersOfDimension.md) | Layers of the dimension |  |\n| [TPCB_LayersOfFill](types/TPCB_LayersOfFill.md) | Layers of the fill |  |\n| [TPCB_LayersOfImage](types/TPCB_LayersOfImage.md) | Layers of complex polygon figures (SVG images, text) |  |\n| [TPCB_LayersOfInner](types/TPCB_LayersOfInner.md) | Inner layers |  |\n| [TPCB_LayersOfLine](types/TPCB_LayersOfLine.md) | Layers of the line |  |\n| [TPCB_LayersOfObject](types/TPCB_LayersOfObject.md) | Layers of binary embedded objects |  |\n| [TPCB_LayersOfPad](types/TPCB_LayersOfPad.md) | Layers of the pad |  |\n| [TPCB_LayersOfRegion](types/TPCB_LayersOfRegion.md) | Layers of the region |  |\n| [TPCB_LayerTypesOfInnerLayer](types/TPCB_LayerTypesOfInnerLayer.md) | Layer types allowed to be set for inner layers |  |\n| [TPCB_NumberOfCopperLayers](types/TPCB_NumberOfCopperLayers.md) | Number of copper layers |  |\n| [TPCB_PolygonSourceArray](types/TPCB_PolygonSourceArray.md) | Single polygon source array |  |\n| [TPCB_PrimitiveDimensionCoordinateSet](types/TPCB_PrimitiveDimensionCoordinateSet.md) | Dimension coordinate set |  |\n| [TPCB_PrimitivePadHole](types/TPCB_PrimitivePadHole.md) | Pad drilling |  |\n| [TPCB_PrimitivePadShape](types/TPCB_PrimitivePadShape.md) | Pad shape |  |\n| [TPCB_PrimitiveSpecialPadShape](types/TPCB_PrimitiveSpecialPadShape.md) | Special pad shape |  |\n| [TSYS_LanguageKeyValuePairs](types/TSYS_LanguageKeyValuePairs.md) | 语言数据键值对 |  |\n| [TSYS_MathPolygonGroup](types/TSYS_MathPolygonGroup.md) | Polygon group |  |\n| [TSYS_MathPolygonInput](types/TSYS_MathPolygonInput.md) | Polygon input type |  |\n| [TSYS_PcbComparisonErrorCode](types/TSYS_PcbComparisonErrorCode.md) | PCB comparison failure error code |  |\n| [TSYS_ShortcutKeys](types/TSYS_ShortcutKeys.md) | Shortcut key |  |\n\nFile v1.1.24:references/_quick-reference.md\n\n# EasyEDA API 快速参考\n\n> 此文件提供所有类及其方法/属性的签名一览，便于 AI 快速查找。\n> 详细参数和返回值请查看 docs/classes/<ClassName>.md\n\n## 全局入口\n\n```typescript\ndeclare const eda: EDA;\n```\n\nEDA 类的属性即为各模块的入口，如 `eda.dmt_Board`, `eda.pcb_PrimitiveLine` 等。\n\n---\n\n## DMT_Board\n\nDocument tree / Board management class\n\n```typescript\nclass DMT_Board\n```\n\n- **copyboard**: `function copyBoard(sourceBoardName: string): Promise<string | undefined>;`\n- **createboard**: `function createBoard(schematicUuid?: string, pcbUuid?: string): Promise<string | undefined>;`\n- **deleteboard**: `function deleteBoard(boardName: string): Promise<boolean>;`\n- **getallboardsinfo**: `function getAllBoardsInfo(): Promise<Array<IDMT_BoardItem>>;`\n- **getboardinfo**: `function getBoardInfo(boardName: string): Promise<IDMT_BoardItem | undefined>;`\n- **getcurrentboardinfo**: `function getCurrentBoardInfo(): Promise<IDMT_BoardItem | undefined>;`\n- **modifyboardname**: `function modifyBoardName(originalBoardName: string, boardName: string): Promise<boolean>;`\n\n---\n\n## DMT_EditorControl\n\nDocument tree / Editor control class\n\n```typescript\nclass DMT_EditorControl\n```\n\n- **activatedocument**: `function activateDocument(tabId: string): Promise<boolean>;`\n- **activatesplitscreen**: `function activateSplitScreen(splitScreenId: string): Promise<boolean>;`\n- **closedocument**: `function closeDocument(tabId: string): Promise<boolean>;`\n- **createsplitscreen**: `function createSplitScreen( \tsplitScreenType: EDMT_EditorSplitScreenDirection, \ttabId: string, ): Promise<{ sourceSplitScreenId: string; newSplitScreenId: string } | undefined>;`\n- **generateindicatormarkers**: `function generateIndicatorMarkers( \tmarkers: Array<IDMT_IndicatorMarkerShape>, \tcolor?: { r: number; g: number; b: number; alpha: number }, \tlineWidth?: number, \tzoom?: boolean, \ttabId?: string, ): Promise<boolean>;`\n- **getcurrentrenderedareaimage**: `function getCurrentRenderedAreaImage(tabId?: string): Promise<Blob | undefined>;`\n- **getsplitscreenidbytabid**: `function getSplitScreenIdByTabId(tabId: string): Promise<string | undefined>;`\n- **getsplitscreentree**: `function getSplitScreenTree(): Promise<IDMT_EditorSplitScreenItem | undefined>;`\n- **gettabsbysplitscreenid**: `function getTabsBySplitScreenId(splitScreenId: string): Promise<Array<IDMT_EditorTabItem>>;`\n- **mergealldocumentfromsplitscreen**: `function mergeAllDocumentFromSplitScreen(): Promise<boolean>;`\n- **movedocumenttosplitscreen**: `function moveDocumentToSplitScreen(tabId: string, splitScreenId: string): Promise<boolean>;`\n- **opendocument**: `function openDocument(documentUuid: string, splitScreenId?: string): Promise<string | undefined>;`\n- **openlibrarydocument**: `function openLibraryDocument( \tlibraryUuid: string, \tlibraryType: ELIB_LibraryType.SYMBOL | ELIB_LibraryType.FOOTPRINT, \tuuid: string, \tsplitScreenId?: string, ): Promise<string | undefined>;`\n- **removeindicatormarkers**: `function removeIndicatorMarkers(tabId?: string): Promise<boolean>;`\n- **tilealldocumenttosplitscreen**: `function tileAllDocumentToSplitScreen(): Promise<boolean>;`\n- **zoomto**: `function zoomTo( \tx?: number, \ty?: number, \tscaleRatio?: number, \ttabId?: string, ): Promise<{ left: number; right: number; top: number; bottom: number } | false>;`\n- **zoomtoallprimitives**: `function zoomToAllPrimitives( \ttabId?: string, ): Promise<{ left: number; right: number; top: number; bottom: number } | false>;`\n- **zoomtoregion**: `function zoomToRegion( \tleft: number, \tright: number, \ttop: number, \tbottom: number, \ttabId?: string, ): Promise<boolean>;`\n- **zoomtoselectedprimitives**: `function zoomToSelectedPrimitives( \ttabId?: string, ): Promise<{ left: number; right: number; top: number; bottom: number } | false>;`\n\n---\n\n## DMT_Event\n\nDocument tree / event class\n\n```typescript\nclass DMT_Event\n```\n\n- **addeditortabeventlistener**: `function addEditorTabEventListener( \tid: string, \teventType: 'all' | EDMT_EditorTabEventType, \tcallFn: ( \t\teventType: EDMT_EditorTabEventType, \t\tprops: { documentType: EDMT_EditorDocumentType; title: string; tabId: string }, \t) => void | Promise<void>, \tonlyOnce?: boolean, ): void;`\n- **iseventlisteneralreadyexist**: `function isEventListenerAlreadyExist(id: string): boolean;`\n- **removeeventlistener**: `function removeEventListener(id: string): boolean;`\n\n---\n\n## DMT_Folder\n\nDocument tree / Folder class\n\n```typescript\nclass DMT_Folder\n```\n\n- **createfolder**: `function createFolder( \tfolderName: string, \tteamUuid: string, \tparentFolderUuid?: string, \tdescription?: string, ): Promise<string | undefined>;`\n- **deletefolder**: `function deleteFolder(teamUuid: string, folderUuid: string): Promise<boolean>;`\n- **getallfoldersuuid**: `function getAllFoldersUuid(teamUuid: string): Promise<Array<string>>;`\n- **getfolderinfo**: `function getFolderInfo(teamUuid: string, folderUuid: string): Promise<IDMT_FolderItem | undefined>;`\n- **modifyfolderdescription**: `function modifyFolderDescription( \tteamUuid: string, \tfolderUuid: string, \tdescription?: string, ): Promise<boolean>;`\n- **modifyfoldername**: `function modifyFolderName( \tteamUuid: string, \tfolderUuid: string, \tfolderName: string, ): Promise<boolean>;`\n- **movefoldertofolder**: `function moveFolderToFolder( \tteamUuid: string, \tfolderUuid: string, \tparentFolderUuid?: string, ): Promise<boolean>;`\n\n---\n\n## DMT_Panel\n\nDocument tree / Panel management class\n\n```typescript\nclass DMT_Panel\n```\n\n- **copypanel**: `function copyPanel(panelUuid: string): Promise<string | undefined>;`\n- **createpanel**: `function createPanel(): Promise<string | undefined>;`\n- **deletepanel**: `function deletePanel(panelUuid: string): Promise<boolean>;`\n- **getallpanelsinfo**: `function getAllPanelsInfo(): Promise<Array<IDMT_PanelItem>>;`\n- **getcurrentpanelinfo**: `function getCurrentPanelInfo(): Promise<IDMT_PanelItem | undefined>;`\n- **getpanelinfo**: `function getPanelInfo(panelUuid: string): Promise<IDMT_PanelItem | undefined>;`\n- **modifypanelname**: `function modifyPanelName(panelUuid: string, panelName: string): Promise<boolean>;`\n\n---\n\n## DMT_Pcb\n\nDocument tree / PCB management class\n\n```typescript\nclass DMT_Pcb\n```\n\n- **copypcb**: `function copyPcb(pcbUuid: string, boardName?: string): Promise<string | undefined>;`\n- **createpcb**: `function createPcb(boardName?: string): Promise<string | undefined>;`\n- **deletepcb**: `function deletePcb(pcbUuid: string): Promise<boolean>;`\n- **getallpcbsinfo**: `function getAllPcbsInfo(): Promise<Array<IDMT_PcbItem>>;`\n- **getcurrentpcbinfo**: `function getCurrentPcbInfo(): Promise<IDMT_PcbItem | undefined>;`\n- **getpcbinfo**: `function getPcbInfo(pcbUuid: string): Promise<IDMT_PcbItem | undefined>;`\n- **modifypcbname**: `function modifyPcbName(pcbUuid: string, pcbName: string): Promise<boolean>;`\n\n---\n\n## DMT_Project\n\nDocument tree / Project management class\n\n```typescript\nclass DMT_Project\n```\n\n- **createproject**: `function createProject( \tprojectFriendlyName: string, \tprojectName?: string, \tteamUuid?: string, \tfolderUuid?: string, \tdescription?: string, \tcollaborationMode?: EDMT_ProjectCollaborationMode, ): Promise<string | undefined>;`\n- **getallprojectsuuid**: `function getAllProjectsUuid( \tteamUuid?: string, \tfolderUuid?: string, \tworkspaceUuid?: string, ): Promise<Array<string>>;`\n- **getcurrentprojectinfo**: `function getCurrentProjectInfo(): Promise<IDMT_ProjectItem | undefined>;`\n- **getprojectinfo**: `function getProjectInfo(projectUuid: string): Promise<IDMT_BriefProjectItem | undefined>;`\n- **moveprojecttofolder**: `function moveProjectToFolder(projectUuid: string, folderUuid?: string): Promise<boolean>;`\n- **openproject**: `function openProject(projectUuid: string): Promise<boolean>;`\n\n---\n\n## DMT_Schematic\n\nDocument tree / Schematic management class\n\n```typescript\nclass DMT_Schematic\n```\n\n- **copyschematic**: `function copySchematic(schematicUuid: string, boardName?: string): Promise<string | undefined>;`\n- **copyschematicpage**: `function copySchematicPage( \tschematicPageUuid: string, \tschematicUuid?: string, ): Promise<string | undefined>;`\n- **createschematic**: `function createSchematic(boardName?: string): Promise<string | undefined>;`\n- **createschematicpage**: `function createSchematicPage(schematicUuid: string): Promise<string | undefined>;`\n- **deleteschematic**: `function deleteSchematic(schematicUuid: string): Promise<boolean>;`\n- **deleteschematicpage**: `function deleteSchematicPage(schematicPageUuid: string): Promise<boolean>;`\n- **getallschematicpagesinfo**: `function getAllSchematicPagesInfo(): Promise<Array<IDMT_SchematicPageItem>>;`\n- **getallschematicsinfo**: `function getAllSchematicsInfo(): Promise<Array<IDMT_SchematicItem>>;`\n- **getcurrentschematicallschematicpagesinfo**: `function getCurrentSchematicAllSchematicPagesInfo(): Promise<Array<IDMT_SchematicPageItem>>;`\n- **getcurrentschematicinfo**: `function getCurrentSchematicInfo(): Promise<IDMT_SchematicItem | undefined>;`\n- **getcurrentschematicpageinfo**: `function getCurrentSchematicPageInfo(): Promise<IDMT_SchematicPageItem | undefined>;`\n- **getschematicinfo**: `function getSchematicInfo(schematicUuid: string): Promise<IDMT_SchematicItem | undefined>;`\n- **getschematicpageinfo**: `function getSchematicPageInfo( \tschematicPageUuid: string, ): Promise<IDMT_SchematicPageItem | undefined>;`\n- **modifyschematicname**: `function modifySchematicName(schematicUuid: string, schematicName: string): Promise<boolean>;`\n- **modifyschematicpagename**: `function modifySchematicPageName( \tschematicPageUuid: string, \tschematicPageName: string, ): Promise<boolean>;`\n- **modifyschematicpagetitleblock**: `function modifySchematicPageTitleBlock( \tshowTitleBlock?: boolean, \ttitleBlockData?: Record<string, { showTitle?: boolean; showValue?: boolean; value?: any }>, ): Promise<boolean>;`\n- **reorderschematicpages**: `function reorderSchematicPages( \tschematicUuid: string, \tschematicPageItemsArray: Array<IDMT_SchematicPageItem>, ): Promise<boolean>;`\n\n---\n\n## DMT_SelectControl\n\nDocument tree / selection control class\n\n```typescript\nclass DMT_SelectControl\n```\n\n- **getcurrentdocumentinfo**: `function getCurrentDocumentInfo(): Promise<IDMT_EditorDocumentItem | undefined>;`\n\n---\n\n## DMT_Team\n\nDocument tree / Team class\n\n```typescript\nclass DMT_Team\n```\n\n- **getallinvolvedteaminfo**: `function getAllInvolvedTeamInfo(): Promise<Array<IDMT_TeamItem>>;`\n- **getallteamsinfo**: `function getAllTeamsInfo(): Promise<Array<IDMT_TeamItem>>;`\n- **getcurrentteaminfo**: `function getCurrentTeamInfo(): Promise<IDMT_TeamItem | undefined>;`\n\n---\n\n## DMT_Workspace\n\nDocument tree / Workspace class\n\n```typescript\nclass DMT_Workspace\n```\n\n- **getallworkspacesinfo**: `function getAllWorkspacesInfo(): Promise<Array<IDMT_WorkspaceItem>>;`\n- **getcurrentworkspaceinfo**: `function getCurrentWorkspaceInfo(): Promise<IDMT_WorkspaceItem | undefined>;`\n- **toggletoworkspace**: `function toggleToWorkspace(workspaceUuid?: string): Promise<boolean>;`\n\n---\n\n## EDA\n\nEasyEDA Pro user API interface\n\n```typescript\neda: EDA;\n```\n\n- **dmt_board**: `function dmt_Board: DMT_Board;`\n- **dmt_editorcontrol**: `function dmt_EditorControl: DMT_EditorControl;`\n- **dmt_event**: `function dmt_Event: DMT_Event;`\n- **dmt_folder**: `function dmt_Folder: DMT_Folder;`\n- **dmt_panel**: `function dmt_Panel: DMT_Panel;`\n- **dmt_pcb**: `function dmt_Pcb: DMT_Pcb;`\n- **dmt_project**: `function dmt_Project: DMT_Project;`\n- **dmt_schematic**: `function dmt_Schematic: DMT_Schematic;`\n- **dmt_selectcontrol**: `function dmt_SelectControl: DMT_SelectControl;`\n- **dmt_team**: `function dmt_Team: DMT_Team;`\n- **dmt_workspace**: `function dmt_Workspace: DMT_Workspace;`\n- **lib_3dmodel**: `function lib_3DModel: LIB_3DModel;`\n- **lib_cbb**: `function lib_Cbb: LIB_Cbb;`\n- **lib_classification**: `function lib_Classification: LIB_Classification;`\n- **lib_device**: `function lib_Device: LIB_Device;`\n- **lib_footprint**: `function lib_Footprint: LIB_Footprint;`\n- **lib_librarieslist**: `function lib_LibrariesList: LIB_LibrariesList;`\n- **lib_panellibrary**: `function lib_PanelLibrary: LIB_PanelLibrary;`\n- **lib_selectcontrol**: `function lib_SelectControl: LIB_SelectControl;`\n- **lib_simulationmodel**: `function lib_SimulationModel: LIB_SimulationModel;`\n- **lib_symbol**: `function lib_Symbol: LIB_Symbol;`\n- **pcb_document**: `function pcb_Document: PCB_Document;`\n- **pcb_drc**: `function pcb_Drc: PCB_Drc;`\n- **pcb_event**: `function pcb_Event: PCB_Event;`\n- **pcb_imagetool**: `function pcb_ImageTool: PCB_ImageTool;`\n- **pcb_layer**: `function pcb_Layer: PCB_Layer;`\n- **pcb_manufacturedata**: `function pcb_ManufactureData: PCB_ManufactureData;`\n- **pcb_mathpolygon**: `function pcb_MathPolygon: PCB_MathPolygon;`\n- **pcb_net**: `function pcb_Net: PCB_Net;`\n- **pcb_primitive**: `function pcb_Primitive: PCB_Primitive;`\n- **pcb_primitivearc**: `function pcb_PrimitiveArc: PCB_PrimitiveArc;`\n- **pcb_primitiveattribute**: `function pcb_PrimitiveAttribute: PCB_PrimitiveAttribute;`\n- **pcb_primitivecomponent**: `function pcb_PrimitiveComponent: PCB_PrimitiveComponent;`\n- **pcb_primitivedimension**: `function pcb_PrimitiveDimension: PCB_PrimitiveDimension;`\n- **pcb_primitivefill**: `function pcb_PrimitiveFill: PCB_PrimitiveFill;`\n- **pcb_primitiveimage**: `function pcb_PrimitiveImage: PCB_PrimitiveImage;`\n- **pcb_primitiveline**: `function pcb_PrimitiveLine: PCB_PrimitiveLine;`\n- **pcb_primitiveobject**: `function pcb_PrimitiveObject: PCB_PrimitiveObject;`\n- **pcb_primitivepad**: `function pcb_PrimitivePad: PCB_PrimitivePad;`\n- **pcb_primitivepolyline**: `function pcb_PrimitivePolyline: PCB_PrimitivePolyline;`\n- **pcb_primitivepour**: `function pcb_PrimitivePour: PCB_PrimitivePour;`\n- **pcb_primitivepoured**: `function pcb_PrimitivePoured: PCB_PrimitivePoured;`\n- **pcb_primitiveregion**: `function pcb_PrimitiveRegion: PCB_PrimitiveRegion;`\n- **pcb_primitivestring**: `function pcb_PrimitiveString: PCB_PrimitiveString;`\n- **pcb_primitivevia**: `function pcb_PrimitiveVia: PCB_PrimitiveVia;`\n- **pcb_raytracerengine**: `function pcb_RayTracerEngine: PCB_RayTracerEngine;`\n- **pcb_selectcontrol**: `function pcb_SelectControl: PCB_SelectControl;`\n- **pnl_document**: `function pnl_Document: PNL_Document;`\n- **sch_document**: `function sch_Document: SCH_Document;`\n- **sch_drc**: `function sch_Drc: SCH_Drc;`\n- **sch_event**: `function sch_Event: SCH_Event;`\n- **sch_manufacturedata**: `function sch_ManufactureData: SCH_ManufactureData;`\n- **sch_net**: `function sch_Net: SCH_Net;`\n- **sch_netlist**: `function sch_Netlist: SCH_Netlist;`\n- **sch_primitive**: `function sch_Primitive: SCH_Primitive;`\n- **sch_primitivearc**: `function sch_PrimitiveArc: SCH_PrimitiveArc;`\n- **sch_primitiveattribute**: `function sch_PrimitiveAttribute: SCH_PrimitiveAttribute;`\n- **sch_primitivebus**: `function sch_PrimitiveBus: SCH_PrimitiveBus;`\n- **sch_primitivecircle**: `function sch_PrimitiveCircle: SCH_PrimitiveCircle;`\n- **sch_primitivecomponent**: `function sch_PrimitiveComponent: SCH_PrimitiveComponent;`\n- **sch_primitiveobject**: `function sch_PrimitiveObject: SCH_PrimitiveObject;`\n- **sch_primitivepin**: `function sch_PrimitivePin: SCH_PrimitivePin;`\n- **sch_primitivepolygon**: `function sch_PrimitivePolygon: SCH_PrimitivePolygon;`\n- **sch_primitiverectangle**: `function sch_PrimitiveRectangle: SCH_PrimitiveRectangle;`\n- **sch_primitivetext**: `function sch_PrimitiveText: SCH_PrimitiveText;`\n- **sch_primitivewire**: `function sch_PrimitiveWire: SCH_PrimitiveWire;`\n- **sch_selectcontrol**: `function sch_SelectControl: SCH_SelectControl;`\n- **sch_simulationengine**: `function sch_SimulationEngine: SCH_SimulationEngine;`\n- **sch_utils**: `function sch_Utils: SCH_Utils;`\n- **sys_clienturl**: `function sys_ClientUrl: SYS_ClientUrl;`\n- **sys_dialog**: `function sys_Dialog: SYS_Dialog;`\n- **sys_environment**: `function sys_Environment: SYS_Environment;`\n- **sys_externalapi**: `function sys_ExternalApi: SYS_ExternalApi;`\n- **sys_filemanager**: `function sys_FileManager: SYS_FileManager;`\n- **sys_filesystem**: `function sys_FileSystem: SYS_FileSystem;`\n- **sys_fontmanager**: `function sys_FontManager: SYS_FontManager;`\n- **sys_formatconversion**: `function sys_FormatConversion: SYS_FormatConversion;`\n- **sys_headermenu**: `function sys_HeaderMenu: SYS_HeaderMenu;`\n- **sys_help**: `function sys_Help: SYS_Help;`\n- **sys_i18n**: `function sys_I18n: SYS_I18n;`\n- **sys_iframe**: `function sys_IFrame: SYS_IFrame;`\n- **sys_loadingandprogressbar**: `function sys_LoadingAndProgressBar: SYS_LoadingAndProgressBar;`\n- **sys_log**: `function sys_Log: SYS_Log;`\n- **sys_math**: `function sys_Math: SYS_Math;`\n- **sys_message**: `function sys_Message: SYS_Message;`\n- **sys_messagebox**: `function sys_MessageBox: SYS_MessageBox;`\n- **sys_messagebus**: `function sys_MessageBus: SYS_MessageBus;`\n- **sys_panelcontrol**: `function sys_PanelControl: SYS_PanelControl;`\n- **sys_rightclickmenu**: `function sys_RightClickMenu: SYS_RightClickMenu;`\n- **sys_setting**: `function sys_Setting: SYS_Setting;`\n- **sys_shortcutkey**: `function sys_ShortcutKey: SYS_ShortcutKey;`\n- **sys_storage**: `function sys_Storage: SYS_Storage;`\n- **sys_timer**: `function sys_Timer: SYS_Timer;`\n- **sys_toastmessage**: `function sys_ToastMessage: SYS_ToastMessage;`\n- **sys_tool**: `function sys_Tool: SYS_Tool;`\n- **sys_unit**: `function sys_Unit: SYS_Unit;`\n- **sys_websocket**: `function sys_WebSocket: SYS_WebSocket;`\n- **sys_window**: `function sys_Window: SYS_Window;`\n\n---\n\n## IPCB_ComplexPolygon\n\nComplex polygon\n\n```typescript\nclass IPCB_ComplexPolygon\n```\n\n- **addsource**: `function addSource( \tcomplexPolygon: \t\t| TPCB_PolygonSourceArray \t\t| Array<TPCB_PolygonSourceArray> \t\t| IPCB_Polygon \t\t| Array<IPCB_Polygon>, ): IPCB_ComplexPolygon;`\n- **getcenter**: `function getCenter(): Promise<{ x: number; y: number }>;`\n- **getsource**: `function getSource(): TPCB_PolygonSourceArray | Array<TPCB_PolygonSourceArray>;`\n- **getsourcestrictcomplex**: `function getSourceStrictComplex(): Array<TPCB_PolygonSourceArray>;`\n- **topolygon**: `function toPolygon(): Array<IPCB_Polygon>;`\n\n---\n\n## IPCB_Polygon\n\nSingle polygon\n\n```typescript\nclass IPCB_Polygon\n```\n\n- **discretize**: `function discretize(options?: IPCB_DiscretizeOptions): Promise<Array<IPCB_DiscretizedPoint>>;`\n- **getcenter**: `function getCenter(): Promise<{ x: number; y: number }>;`\n- **getsource**: `function getSource(): TPCB_PolygonSourceArray;`\n\n---\n\n## IPCB_PrimitiveArc\n\nArc line primitive\n\n```typescript\nclass IPCB_PrimitiveArc implements IPCB_Primitive\n```\n\n- **done**: `function done(): Promise<IPCB_PrimitiveArc>;`\n- **getadjacentprimitives**: `function getAdjacentPrimitives(): Promise< \tArray<IPCB_PrimitiveLine | IPCB_PrimitiveVia | IPCB_PrimitiveArc> >;`\n- **getentiretrack**: `function getEntireTrack(includeVias: false): Promise<Array<IPCB_PrimitiveLine | IPCB_PrimitiveArc>>;`\n- **getentiretrack_1**: `function getEntireTrack( \tincludeVias: true, ): Promise<Array<IPCB_PrimitiveLine | IPCB_PrimitiveArc | IPCB_PrimitiveVia>>;`\n- **getstate_arcangle**: `function getState_ArcAngle(): number;`\n- **getstate_endx**: `function getState_EndX(): number;`\n- **getstate_endy**: `function getState_EndY(): number;`\n- **getstate_interactivemode**: `function getState_InteractiveMode(): EPCB_PrimitiveArcInteractiveMode;`\n- **getstate_layer**: `function getState_Layer(): TPCB_LayersOfLine;`\n- **getstate_linewidth**: `function getState_LineWidth(): number;`\n- **getstate_net**: `function getState_Net(): string;`\n- **getstate_primitiveid**: `function getState_PrimitiveId(): string;`\n- **getstate_primitivelock**: `function getState_PrimitiveLock(): boolean;`\n- **getstate_primitivetype**: `function getState_PrimitiveType(): EPCB_PrimitiveType;`\n- **getstate_startx**: `function getState_StartX(): number;`\n- **getstate_starty**: `function getState_StartY(): number;`\n- **isasync**: `function isAsync(): boolean;`\n- **reset**: `function reset(): Promise<IPCB_PrimitiveArc>;`\n- **setstate_arcangle**: `function setState_ArcAngle(arcAngle: number): IPCB_PrimitiveArc;`\n- **setstate_endx**: `function setState_EndX(endX: number): IPCB_PrimitiveArc;`\n- **setstate_endy**: `function setState_EndY(endY: number): IPCB_PrimitiveArc;`\n- **setstate_interactivemode**: `function setState_InteractiveMode( \tinteractiveMode: EPCB_PrimitiveArcInteractiveMode, ): IPCB_PrimitiveArc;`\n- **setstate_layer**: `function setState_Layer(layer: TPCB_LayersOfLine): IPCB_PrimitiveArc;`\n- **setstate_linewidth**: `function setState_LineWidth(lineWidth: number): IPCB_PrimitiveArc;`\n- **setstate_net**: `function setState_Net(net: string): IPCB_PrimitiveArc;`\n- **setstate_primitivelock**: `function setState_PrimitiveLock(primitiveLock: boolean): IPCB_PrimitiveArc;`\n- **setstate_startx**: `function setState_StartX(startX: number): IPCB_PrimitiveArc;`\n- **setstate_starty**: `function setState_StartY(startY: number): IPCB_PrimitiveArc;`\n- **toasync**: `function toAsync(): IPCB_PrimitiveArc;`\n- **tosync**: `function toSync(): IPCB_PrimitiveArc;`\n\n---\n\n## IPCB_PrimitiveAttribute\n\nProperty primitive\n\n```typescript\nclass IPCB_PrimitiveAttribute implements IPCB_Primitive\n```\n\n- **_constructor_**: `function constructor( \tlayer: TPCB_LayersOfImage, \tx: number | null, \ty: number | null, \tkey: string, \tvalue: string, \tkeyVisible: boolean, \tvalueVisible: boolean, \tfontFamily: string, \tfontSize: number, \tlineWidth: number, \talignMode: EPCB_PrimitiveStringAlignMode, \trotation: number, \treverse: boolean, \texpansion: number, \tmirror: boolean, \tprimitiveLock: boolean, \tprimitiveId: string, \tparentPrimitiveId: string, );`\n- **done**: `function done(): Promise<IPCB_PrimitiveAttribute>;`\n- **getstate_alignmode**: `function getState_AlignMode(): EPCB_PrimitiveStringAlignMode;`\n- **getstate_expansion**: `function getState_Expansion(): number;`\n- **getstate_fontfamily**: `function getState_FontFamily(): string;`\n- **getstate_fontsize**: `function getState_FontSize(): number;`\n- **getstate_key**: `function getState_Key(): string;`\n- **getstate_keyvisible**: `function getState_KeyVisible(): boolean;`\n- **getstate_layer**: `function getState_Layer(): TPCB_LayersOfImage;`\n- **getstate_linewidth**: `function getState_LineWidth(): number;`\n- **getstate_mirror**: `function getState_Mirror(): boolean;`\n- **getstate_parentprimitiveid**: `function getState_ParentPrimitiveId(): string;`\n- **getstate_primitiveid**: `function getState_PrimitiveId(): string;`\n- **getstate_primitivelock**: `function getState_PrimitiveLock(): boolean;`\n- **getstate_primitivetype**: `function getState_PrimitiveType(): EPCB_PrimitiveType;`\n- **getstate_reverse**: `function getState_Reverse(): boolean;`\n- **getstate_rotation**: `function getState_Rotation(): number;`\n- **getstate_value**: `function getState_Value(): string;`\n- **getstate_valuevisible**: `function getState_ValueVisible(): boolean;`\n- **getstate_x**: `function getState_X(): number | null;`\n- **getstate_y**: `function getState_Y(): number | null;`\n- **isasync**: `function isAsync(): boolean;`\n- **reset**: `function reset(): Promise<IPCB_PrimitiveAttribute>;`\n- **setstate_alignmode**: `function setState_AlignMode(alignMode: EPCB_PrimitiveStringAlignMode): IPCB_PrimitiveAttribute;`\n- **setstate_expansion**: `function setState_Expansion(expansion: number): IPCB_PrimitiveAttribute;`\n- **setstate_fontfamily**: `function setState_FontFamily(fontFamily: string): IPCB_PrimitiveAttribute;`\n- **setstate_fontsize**: `function setState_FontSize(fontSize: number): IPCB_PrimitiveAttribute;`\n- **setstate_key**: `function setState_Key(key: string): IPCB_PrimitiveAttribute;`\n- **setstate_keyvisible**: `function setState_KeyVisible(keyVisible: boolean): IPCB_PrimitiveAttribute;`\n- **setstate_layer**: `function setState_Layer(layer: TPCB_LayersOfImage): IPCB_PrimitiveAttribute;`\n- **setstate_linewidth**: `function setState_LineWidth(lineWidth: number): IPCB_PrimitiveAttribute;`\n- **setstate_mirror**: `function setState_Mirror(mirror: boolean): IPCB_PrimitiveAttribute;`\n- **setstate_primitivelock**: `function setState_PrimitiveLock(primitiveLock: boolean): IPCB_PrimitiveAttribute;`\n- **setstate_reverse**: `function setState_Reverse(reverse: boolean): IPCB_PrimitiveAttribute;`\n- **setstate_rotation**: `function setState_Rotation(rotation: number): IPCB_PrimitiveAttribute;`\n- **setstate_value**: `function setState_Value(value: string): IPCB_PrimitiveAttribute;`\n- **setstate_valuevisible**: `function setState_ValueVisible(valueVisible: boolean): IPCB_PrimitiveAttribute;`\n- **setstate_x**: `function setState_X(x: number): IPCB_PrimitiveAttribute;`\n- **setstate_y**: `function setState_Y(y: number): IPCB_PrimitiveAttribute;`\n- **toasync**: `function toAsync(): IPCB_PrimitiveAttribute;`\n- **tosync**: `function toSync(): IPCB_PrimitiveAttribute;`\n\n---\n\n## IPCB_PrimitiveComponent\n\nDevice primitive\n\n```typescript\nclass IPCB_PrimitiveComponent implements IPCB_Primitive\n```\n\n- **done**: `function done(): Promise<IPCB_PrimitiveComponent>;`\n- **getallpins**: `function getAllPins(): Promise<Array<IPCB_PrimitiveComponentPad>>;`\n- **getstate_addintobom**: `function getState_AddIntoBom(): boolean;`\n- **getstate_component**: `function getState_Component(): { libraryUuid: string; uuid: string; name?: string } | undefined;`\n- **getstate_designator**: `function getState_Designator(): string | undefined;`\n- **getstate_footprint**: `function getState_Footprint(): { libraryUuid: string; uuid: string; name?: string } | undefined;`\n- **getstate_layer**: `function getState_Layer(): TPCB_LayersOfComponent;`\n- **getstate_manufacturer**: `function getState_Manufacturer(): string | undefined;`\n- **getstate_manufacturerid**: `function getState_ManufacturerId(): string | undefined;`\n- **getstate_model3d**: `function getState_Model3D(): { libraryUuid: string; uuid: string; name?: string } | undefined;`\n- **getstate_name**: `function getState_Name(): string | undefined;`\n- **getstate_otherproperty**: `function getState_OtherProperty(): Record<string, string | number | boolean> | undefined;`\n- **getstate_pads**: `function getState_Pads(): \tArray<{ primitiveId: string; net: string; padNumber: string }> | undefined;`\n- **getstate_primitiveid**: `function getState_PrimitiveId(): string;`\n- **getstate_primitivelock**: `function getState_PrimitiveLock(): boolean;`\n- **getstate_primitivetype**: `function getState_PrimitiveType(): EPCB_PrimitiveType;`\n- **getstate_rotation**: `function getState_Rotation(): number;`\n- **getstate_supplier**: `function getState_Supplier(): string | undefined;`\n- **getstate_supplierid**: `function getState_SupplierId(): string | undefined;`\n- **getstate_uniqueid**: `function getState_UniqueId(): string | undefined;`\n- **getstate_x**: `function getState_X(): number;`\n- **getstate_y**: `function getState_Y(): number;`\n- **isasync**: `function isAsync(): boolean;`\n- **reset**: `function reset(): Promise<IPCB_PrimitiveComponent>;`\n- **setattribute**: `function setAttribute( \tkey: string, \tvalue?: string | number | boolean, \tkeyVisible?: boolean, \tvalueVisible?: boolean, ): Promise<IPCB_PrimitiveAttribute>;`\n- **setstate_addintobom**: `function setState_AddIntoBom(addIntoBom: boolean): IPCB_PrimitiveComponent;`\n- **setstate_designator**: `function setState_Designator(designator: string | undefined): IPCB_PrimitiveComponent;`\n- **setstate_layer**: `function setState_Layer(layer: TPCB_LayersOfComponent): IPCB_PrimitiveComponent;`\n- **setstate_manufacturer**: `function setState_Manufacturer(manufacturer: string | undefined): IPCB_PrimitiveComponent;`\n- **setstate_manufacturerid**: `function setState_ManufacturerId(manufacturerId: string | undefined): IPCB_PrimitiveComponent;`\n- **setstate_name**: `function setState_Name(name: string | undefined): IPCB_PrimitiveComponent;`\n- **setstate_otherproperty**: `function setState_OtherProperty( \totherProperty: Record<string, string | number | boolean>, ): IPCB_PrimitiveComponent;`\n- **setstate_primitivelock**: `function setState_PrimitiveLock(primitiveLock: boolean): IPCB_PrimitiveComponent;`\n- **setstate_rotation**: `function setState_Rotation(rotation: number): IPCB_PrimitiveComponent;`\n- **setstate_supplier**: `function setState_Supplier(supplier: string | undefined): IPCB_PrimitiveComponent;`\n- **setstate_supplierid**: `function setState_SupplierId(supplierId: string | undefined): IPCB_PrimitiveComponent;`\n- **setstate_uniqueid**: `function setState_UniqueId(uniqueId: string | undefined): IPCB_PrimitiveComponent;`\n- **setstate_x**: `function setState_X(x: number): IPCB_PrimitiveComponent;`\n- **setstate_y**: `function setState_Y(y: number): IPCB_PrimitiveComponent;`\n- **toasync**: `function toAsync(): IPCB_PrimitiveComponent;`\n- **tosync**: `function toSync(): IPCB_PrimitiveComponent;`\n\n---\n\n## IPCB_PrimitiveComponentPad\n\nDevice pad primitive\n\n```typescript\nclass IPCB_PrimitiveComponentPad extends IPCB_PrimitivePad\n```\n\n- **done**: `function done(): Promise<IPCB_PrimitiveComponentPad>;`\n- **getconnectedprimitives**: `function getConnectedPrimitives( \tonlyCentreConnection: true, ): Promise<Array<IPCB_PrimitiveLine | IPCB_PrimitiveArc | IPCB_PrimitiveVia>>;`\n- **getconnectedprimitives_1**: `function getConnectedPrimitives( \tonlyCentreConnection: false, ): Promise< \tArray< \t\t| IPCB_PrimitiveLine \t\t| IPCB_PrimitiveArc \t\t| IPCB_PrimitiveVia \t\t| IPCB_PrimitivePolyline \t\t| IPCB_PrimitiveFill \t> >;`\n- **getstate_parentcomponentprimitiveid**: `function getState_ParentComponentPrimitiveId(): string;`\n- **primitivetype**: `function readonly primitiveType: EPCB_PrimitiveType.COMPONENT_PAD;`\n- **setstate_parentcomponentprimitiveid**: `function setState_ParentComponentPrimitiveId(): IPCB_PrimitiveComponentPad;`\n\n---\n\n## IPCB_PrimitiveDimension\n\nDimension primitive\n\n```typescript\nclass IPCB_PrimitiveDimension implements IPCB_Primitive\n```\n\n- **done**: `function done(): Promise<IPCB_PrimitiveDimension>;`\n- **getstate_coordinateset**: `function getState_CoordinateSet(): TPCB_PrimitiveDimensionCoordinateSet;`\n- **getstate_dimensiontype**: `function getState_DimensionType(): EPCB_PrimitiveDimensionType;`\n- **getstate_layer**: `function getState_Layer(): TPCB_LayersOfDimension;`\n- **getstate_linewidth**: `function getState_LineWidth(): number;`\n- **getstate_precision**: `function getState_Precision(): number;`\n- **getstate_primitiveid**: `function getState_PrimitiveId(): string;`\n- **getstate_primitivelock**: `function getState_PrimitiveLock(): boolean;`\n- **getstate_primitivetype**: `function getState_PrimitiveType(): EPCB_PrimitiveType;`\n- **getstate_textfollow**: `function getState_TextFollow(): 0 | 1;`\n- **getstate_unit**: `function getState_Unit(): \tESYS_Unit.MILLIMETER | ESYS_Unit.CENTIMETER | ESYS_Unit.INCH | ESYS_Unit.MIL;`\n- **isasync**: `function isAsync(): boolean;`\n- **reset**: `function reset(): Promise<IPCB_PrimitiveDimension>;`\n- **setstate_coordinateset**: `function setState_CoordinateSet( \tcoordinateSet: TPCB_PrimitiveDimensionCoordinateSet, ): IPCB_PrimitiveDimension;`\n- **setstate_dimensiontype**: `function setState_DimensionType( \tdimensionType: EPCB_PrimitiveDimensionType, ): IPCB_PrimitiveDimension;`\n- **setstate_layer**: `function setState_Layer(layer: TPCB_LayersOfDimension): IPCB_PrimitiveDimension;`\n- **setstate_linewidth**: `function setState_LineWidth(lineWidth: number): IPCB_PrimitiveDimension;`\n- **setstate_precision**: `function setState_Precision(precision: number): IPCB_PrimitiveDimension;`\n- **setstate_primitivelock**: `function setState_PrimitiveLock(primitiveLock: boolean): IPCB_PrimitiveDimension;`\n- **setstate_unit**: `function setState_Unit( \tunit: ESYS_Unit.MILLIMETER | ESYS_Unit.CENTIMETER | ESYS_Unit.INCH | ESYS_Unit.MIL, ): IPCB_PrimitiveDimension;`\n- **toasync**: `function toAsync(): IPCB_PrimitiveDimension;`\n- **tosync**: `function toSync(): IPCB_PrimitiveDimension;`\n\n---\n\n## IPCB_PrimitiveFill\n\nFill primitive\n\n```typescript\nclass IPCB_PrimitiveFill implements IPCB_Primitive\n```\n\n- **converttopolyline**: `function convertToPolyline(): Promise<IPCB_PrimitivePolyline>;`\n- **converttopour**: `function convertToPour(): Promise<IPCB_PrimitivePour>;`\n- **converttoregion**: `function convertToRegion(): Promise<IPCB_PrimitiveRegion>;`\n- **done**: `function done(): Promise<IPCB_PrimitiveFill>;`\n- **getstate_complexpolygon**: `function getState_ComplexPolygon(): IPCB_Polygon;`\n- **getstate_fillmode**: `function getState_FillMode(): EPCB_PrimitiveFillMode | undefined;`\n- **getstate_layer**: `function getState_Layer(): TPCB_LayersOfFill;`\n- **getstate_linewidth**: `function getState_LineWidth(): number;`\n- **getstate_net**: `function getState_Net(): string | undefined;`\n- **getstate_primitiveid**: `function getState_PrimitiveId(): string;`\n- **getstate_primitivelock**: `function getState_PrimitiveLock(): boolean;`\n- **getstate_primitivetype**: `function getState_PrimitiveType(): EPCB_PrimitiveType;`\n- **isasync**: `function isAsync(): boolean;`\n- **reset**: `function reset(): Promise<IPCB_PrimitiveFill>;`\n- **setstate_complexpolygon**: `function setState_ComplexPolygon(complexPolygon: IPCB_Polygon): IPCB_PrimitiveFill;`\n- **setstate_fillmode**: `function setState_FillMode(fillMode: EPCB_PrimitiveFillMode): IPCB_PrimitiveFill;`\n- **setstate_layer**: `function setState_Layer(layer: TPCB_LayersOfFill): IPCB_PrimitiveFill;`\n- **setstate_linewidth**: `function setState_LineWidth(lineWidth: number): IPCB_PrimitiveFill;`\n- **setstate_net**: `function setState_Net(net: string): IPCB_PrimitiveFill;`\n- **setstate_primitivelock**: `function setState_PrimitiveLock(primitiveLock: boolean): IPCB_PrimitiveFill;`\n- **toasync**: `function toAsync(): IPCB_PrimitiveFill;`\n- **tosync**: `function toSync(): IPCB_PrimitiveFill;`\n\n---\n\n## IPCB_PrimitiveImage\n\nImage primitive\n\n```typescript\nclass IPCB_PrimitiveImage implements IPCB_Primitive\n```\n\n- **done**: `function done(): Promise<IPCB_PrimitiveImage>;`\n- **getstate_complexpolygon**: `function getState_ComplexPolygon(): TPCB_PolygonSourceArray | Array<TPCB_PolygonSourceArray>;`\n- **getstate_height**: `function getState_Height(): number;`\n- **getstate_horizonmirror**: `function getState_HorizonMirror(): boolean;`\n- **getstate_layer**: `function getState_Layer(): TPCB_LayersOfImage;`\n- **getstate_primitiveid**: `function getState_PrimitiveId(): string;`\n- **getstate_primitivelock**: `function getState_PrimitiveLock(): boolean;`\n- **getstate_primitivetype**: `function getState_PrimitiveType(): EPCB_PrimitiveType;`\n- **getstate_rotation**: `function getState_Rotation(): number;`\n- **getstate_width**: `function getState_Width(): number;`\n- **getstate_x**: `function getState_X(): number;`\n- **getstate_y**: `function getState_Y(): number;`\n- **isasync**: `function isAsync(): boolean;`\n- **reset**: `function reset(): Promise<IPCB_PrimitiveImage>;`\n- **setstate_height**: `function setState_Height(height: number): IPCB_PrimitiveImage;`\n- **setstate_horizonmirror**: `function setState_HorizonMirror(horizonMirror: boolean): IPCB_PrimitiveImage;`\n- **setstate_layer**: `function setState_Layer(layer: TPCB_LayersOfImage): IPCB_PrimitiveImage;`\n- **setstate_primitivelock**: `function setState_PrimitiveLock(primitiveLock: boolean): IPCB_PrimitiveImage;`\n- **setstate_rotation**: `function setState_Rotation(rotation: number): IPCB_PrimitiveImage;`\n- **setstate_width**: `function setState_Width(width: number): IPCB_PrimitiveImage;`\n- **setstate_x**: `function setState_X(x: number): IPCB_PrimitiveImage;`\n- **setstate_y**: `function setState_Y(y: number): IPCB_PrimitiveImage;`\n- **toasync**: `function toAsync(): IPCB_PrimitiveImage;`\n- **tosync**: `function toSync(): IPCB_PrimitiveImage;`\n\n---\n\n## IPCB_PrimitiveLine\n\nLine primitive\n\n```typescript\nclass IPCB_PrimitiveLine implements IPCB_Primitive\n```\n\n- **done**: `function done(): Promise<IPCB_PrimitiveLine>;`\n- **getadjacentprimitives**: `function getAdjacentPrimitives(): Promise< \tArray<IPCB_PrimitiveLine | IPCB_PrimitiveVia | IPCB_PrimitiveArc> >;`\n- **getentiretrack**: `function getEntireTrack(includeVias: false): Promise<Array<IPCB_PrimitiveLine | IPCB_PrimitiveArc>>;`\n- **getentiretrack_1**: `function getEntireTrack( \tincludeVias: true, ): Promise<Array<IPCB_PrimitiveLine | IPCB_PrimitiveArc | IPCB_PrimitiveVia>>;`\n- **getstate_endx**: `function getState_EndX(): number;`\n- **getstate_endy**: `function getState_EndY(): number;`\n- **getstate_layer**: `function getState_Layer(): TPCB_LayersOfLine;`\n- **getstate_linewidth**: `function getState_LineWidth(): number;`\n- **getstate_net**: `function getState_Net(): string;`\n- **getstate_primitiveid**: `function getState_PrimitiveId(): string;`\n- **getstate_primitivelock**: `function getState_PrimitiveLock(): boolean;`\n- **getstate_primitivetype**: `function getState_PrimitiveType(): EPCB_PrimitiveType;`\n- **getstate_startx**: `function getState_StartX(): number;`\n- **getstate_starty**: `function getState_StartY(): number;`\n- **isasync**: `function isAsync(): boolean;`\n- **reset**: `function reset(): Promise<IPCB_PrimitiveLine>;`\n- **setstate_endx**: `function setState_EndX(endX: number): IPCB_PrimitiveLine;`\n- **setstate_endy**: `function setState_EndY(endY: number): IPCB_PrimitiveLine;`\n- **setstate_layer**: `function setState_Layer(layer: TPCB_LayersOfLine): IPCB_PrimitiveLine;`\n- **setstate_linewidth**: `function setState_LineWidth(lineWidth: number): IPCB_PrimitiveLine;`\n- **setstate_net**: `function setState_Net(net: string): IPCB_PrimitiveLine;`\n- **setstate_primitivelock**: `function setState_PrimitiveLock(primitiveLock: boolean): IPCB_PrimitiveLine;`\n- **setstate_startx**: `function setState_StartX(startX: number): IPCB_PrimitiveLine;`\n- **setstate_starty**: `function setState_StartY(startY: number): IPCB_PrimitiveLine;`\n- **toasync**: `function toAsync(): IPCB_PrimitiveLine;`\n- **tosync**: `function toSync(): IPCB_PrimitiveLine;`\n\n---\n\n## IPCB_PrimitiveObject\n\nBinary embedded object primitive\n\n```typescript\nclass IPCB_PrimitiveObject implements IPCB_Primitive\n```\n\n- **done**: `function done(): Promise<IPCB_PrimitiveObject>;`\n- **getstate_binarydata**: `function getState_BinaryData(): string;`\n- **getstate_filename**: `function getState_FileName(): string;`\n- **getstate_height**: `function getState_Height(): number;`\n- **getstate_layer**: `function getState_Layer(): TPCB_LayersOfObject | undefined;`\n- **getstate_mirror**: `function getState_Mirror(): boolean;`\n- **getstate_primitiveid**: `function getState_PrimitiveId(): string;`\n- **getstate_primitivelock**: `function getState_PrimitiveLock(): boolean;`\n- **getstate_primitivetype**: `function getState_PrimitiveType(): EPCB_PrimitiveType;`\n- **getstate_rotation**: `function getState_Rotation(): number;`\n- **getstate_topleftx**: `function getState_TopLeftX(): number | undefined;`\n- **getstate_toplefty**: `function getState_TopLeftY(): number | undefined;`\n- **getstate_width**: `function getState_Width(): number;`\n- **isasync**: `function isAsync(): boolean;`\n- **reset**: `function reset(): Promise<IPCB_PrimitiveObject>;`\n- **setstate_binarydata**: `function setState_BinaryData(binaryData: string): IPCB_PrimitiveObject;`\n- **setstate_filename**: `function setState_FileName(fileName: string): IPCB_PrimitiveObject;`\n- **setstate_height**: `function setState_Height(height: number): IPCB_PrimitiveObject;`\n- **setstate_layer**: `function setState_Layer(layer: TPCB_LayersOfObject): IPCB_PrimitiveObject;`\n- **setstate_mirror**: `function setState_Mirror(mirror: boolean): IPCB_PrimitiveObject;`\n- **setstate_primitivelock**: `function setState_PrimitiveLock(primitiveLock: boolean): IPCB_PrimitiveObject;`\n- **setstate_rotation**: `function setState_Rotation(rotation: number): IPCB_PrimitiveObject;`\n- **setstate_topleftx**: `function setState_TopLeftX(topLeftX: number): IPCB_PrimitiveObject;`\n- **setstate_toplefty**: `function setState_TopLeftY(topLeftY: number): IPCB_PrimitiveObject;`\n- **setstate_width**: `function setState_Width(width: number): IPCB_PrimitiveObject;`\n- **toasync**: `function toAsync(): IPCB_PrimitiveObject;`\n- **tosync**: `function toSync(): IPCB_PrimitiveObject;`\n\n---\n\n## IPCB_PrimitivePad\n\nPad primitive\n\n```typescript\nclass IPCB_PrimitivePad implements IPCB_Primitive\n```\n\n- **async**: `function async: boolean;`\n- **create**: `function create(): Promise<IPCB_PrimitivePad>;`\n- **done**: `function done(): Promise<IPCB_PrimitivePad>;`\n- **getstate_heatwelding**: `function getState_HeatWelding(): IPCB_PrimitivePadHeatWelding | null;`\n- **getstate_hole**: `function getState_Hole(): TPCB_PrimitivePadHole | null;`\n- **getstate_holeoffsetx**: `function getState_HoleOffsetX(): number;`\n- **getstate_holeoffsety**: `function getState_HoleOffsetY(): number;`\n- **getstate_holerotation**: `function getState_HoleRotation(): number;`\n- **getstate_layer**: `function getState_Layer(): TPCB_LayersOfPad;`\n- **getstate_metallization**: `function getState_Metallization(): boolean;`\n- **getstate_net**: `function getState_Net(): string | undefined;`\n- **getstate_pad**: `function getState_Pad(): TPCB_PrimitivePadShape | undefined;`\n- **getstate_padnumber**: `function getState_PadNumber(): string;`\n- **getstate_padtype**: `function getState_PadType(): EPCB_PrimitivePadType;`\n- **getstate_primitiveid**: `function getState_PrimitiveId(): string;`\n- **getstate_primitivelock**: `function getState_PrimitiveLock(): boolean;`\n- **getstate_primitivetype**: `function getState_PrimitiveType(): EPCB_PrimitiveType;`\n- **getstate_rotation**: `function getState_Rotation(): number;`\n- **getstate_soldermaskandpastemaskexpansion**: `function getState_SolderMaskAndPasteMaskExpansion(): IPCB_PrimitiveSolderMaskAndPasteMaskExpansion | null;`\n- **getstate_specialpad**: `function getState_SpecialPad(): TPCB_PrimitiveSpecialPadShape | undefined;`\n- **getstate_x**: `function getState_X(): number;`\n- **getstate_y**: `function getState_Y(): number;`\n- **heatwelding**: `function heatWelding: IPCB_PrimitivePadHeatWelding | null;`\n- **hole**: `function hole: TPCB_PrimitivePadHole | null;`\n- **holeoffsetx**: `function holeOffsetX: number;`\n- **holeoffsety**: `function holeOffsetY: number;`\n- **holerotation**: `function holeRotation: number;`\n- **isasync**: `function isAsync(): boolean;`\n- **layer**: `function layer: TPCB_LayersOfPad;`\n- **metallization**: `function metallization: boolean;`\n- **net**: `function net?: string;`\n- **pad**: `function pad?: TPCB_PrimitivePadShape;`\n- **padnumber**: `function padNumber: string;`\n- **padtype**: `function padType: EPCB_PrimitivePadType;`\n- **primitiveid**: `function primitiveId?: string;`\n- **primitivelock**: `function primitiveLock: boolean;`\n- **primitivetype**: `function readonly primitiveType: EPCB_PrimitiveType;`\n- **reset**: `function reset(): Promise<IPCB_PrimitivePad>;`\n- **rotation**: `function rotation: number;`\n- **setstate_heatwelding**: `function setState_HeatWelding(heatWelding: IPCB_PrimitivePadHeatWelding | null): IPCB_PrimitivePad;`\n- **setstate_hole**: `function setState_Hole(hole: TPCB_PrimitivePadHole): IPCB_PrimitivePad;`\n- **setstate_holeoffsetx**: `function setState_HoleOffsetX(holeOffsetX: number): IPCB_PrimitivePad;`\n- **setstate_holeoffsety**: `function setState_HoleOffsetY(holeOffsetY: number): IPCB_PrimitivePad;`\n- **setstate_holerotation**: `function setState_HoleRotation(holeRotation: number): IPCB_PrimitivePad;`\n- **setstate_layer**: `function setState_Layer(layer: TPCB_LayersOfPad): IPCB_PrimitivePad;`\n- **setstate_metallization**: `function setState_Metallization(metallization: boolean): IPCB_PrimitivePad;`\n- **setstate_net**: `function setState_Net(net?: string): IPCB_PrimitivePad;`\n- **setstate_pad**: `function setState_Pad(pad: TPCB_PrimitivePadShape): IPCB_PrimitivePad;`\n- **setstate_padnumber**: `function setState_PadNumber(padNumber: string): IPCB_PrimitivePad;`\n- **setstate_primitivelock**: `function setState_PrimitiveLock(primitiveLock: boolean): IPCB_PrimitivePad;`\n- **setstate_rotation**: `function setState_Rotation(rotation: number): IPCB_PrimitivePad;`\n- **setstate_soldermaskandpastemaskexpansion**: `function setState_SolderMaskAndPasteMaskExpansion( \tsolderMaskAndPasteMaskExpansion: IPCB_PrimitiveSolderMaskAndPasteMaskExpansion | null, ): IPCB_PrimitivePad;`\n- **setstate_specialpad**: `function setState_SpecialPad(specialPad: TPCB_PrimitiveSpecialPadShape): IPCB_PrimitivePad;`\n- **setstate_x**: `function setState_X(x: number): IPCB_PrimitivePad;`\n- **setstate_y**: `function setState_Y(y: number): IPCB_PrimitivePad;`\n- **soldermaskandpastemaskexpansion**: `function solderMaskAndPasteMaskExpansion: IPCB_PrimitiveSolderMaskAndPasteMaskExpansion | null;`\n- **specialpad**: `function specialPad?: TPCB_PrimitiveSpecialPadShape;`\n- **toasync**: `function toAsync(): IPCB_PrimitivePad;`\n- **tosync**: `function toSync(): IPCB_PrimitivePad;`\n- **x**: `function x: number;`\n- **y**: `function y: number;`\n\n---\n\n## IPCB_PrimitivePolyline\n\nPolyline primitive\n\n```typescript\nclass IPCB_PrimitivePolyline implements IPCB_Primitive\n```\n\n- **converttofill**: `function convertToFill(): Promise<IPCB_PrimitiveFill>;`\n- **converttopour**: `function convertToPour(): Promise<IPCB_PrimitivePour>;`\n- **converttoregion**: `function convertToRegion(): Promise<IPCB_PrimitiveRegion>;`\n- **done**: `function done(): Promise<IPCB_PrimitivePolyline>;`\n- **getstate_layer**: `function getState_Layer(): TPCB_LayersOfLine;`\n- **getstate_linewidth**: `function getState_LineWidth(): number;`\n- **getstate_net**: `function getState_Net(): string;`\n- **getstate_polygon**: `function getState_Polygon(): IPCB_Polygon;`\n- **getstate_primitiveid**: `function getState_PrimitiveId(): string;`\n- **getstate_primitivelock**: `function getState_PrimitiveLock(): boolean;`\n- **getstate_primitivetype**: `function getState_PrimitiveType(): EPCB_PrimitiveType;`\n- **isasync**: `function isAsync(): boolean;`\n- **reset**: `function reset(): Promise<IPCB_PrimitivePolyline>;`\n- **setstate_layer**: `function setState_Layer(layer: TPCB_LayersOfLine): IPCB_PrimitivePolyline;`\n- **setstate_linewidth**: `function setState_LineWidth(lineWidth: number): IPCB_PrimitivePolyline;`\n- **setstate_net**: `function setState_Net(net: string): IPCB_PrimitivePolyline;`\n- **setstate_polygon**: `function setState_Polygon(polygon: IPCB_Polygon): IPCB_PrimitivePolyline;`\n- **setstate_primitivelock**: `function setState_PrimitiveLock(primitiveLock: boolean): IPCB_PrimitivePolyline;`\n- **toasync**: `function toAsync(): IPCB_PrimitivePolyline;`\n- **tosync**: `function toSync(): IPCB_PrimitivePolyline;`\n\n---\n\n## IPCB_PrimitivePour\n\nCopper border primitive\n\n```typescript\nclass IPCB_PrimitivePour implements IPCB_Primitive\n```\n\n- **converttofill**: `function convertToFill(): Promise<IPCB_PrimitiveFill>;`\n- **converttopolyline**: `function convertToPolyline(): Promise<IPCB_PrimitivePolyline>;`\n- **converttoregion**: `function convertToRegion(): Promise<IPCB_PrimitiveRegion>;`\n- **done**: `function done(): Promise<IPCB_PrimitivePour>;`\n- **getcopperregion**: `function getCopperRegion(): Promise<IPCB_PrimitivePoured | undefined>;`\n- **getstate_complexpolygon**: `function getState_ComplexPolygon(): IPCB_Polygon;`\n- **getstate_layer**: `function getState_Layer(): TPCB_LayersOfCopper;`\n- **getstate_linewidth**: `function getState_LineWidth(): number;`\n- **getstate_net**: `function getState_Net(): string;`\n- **getstate_pourfillmethod**: `function getState_PourFillMethod(): any;`\n- **getstate_pourname**: `function getState_PourName(): string;`\n- **getstate_pourpriority**: `function getState_PourPriority(): number;`\n- **getstate_preservesilos**: `function getState_PreserveSilos(): boolean;`\n- **getstate_primitiveid**: `function getState_PrimitiveId(): string;`\n- **getstate_primitivelock**: `function getState_PrimitiveLock(): boolean;`\n- **getstate_primitivetype**: `function getState_PrimitiveType(): EPCB_PrimitiveType;`\n- **isasync**: `function isAsync(): boolean;`\n- **rebuildcopperregion**: `function rebuildCopperRegion(): Promise<IPCB_PrimitivePoured | undefined>;`\n- **reset**: `function reset(): Promise<IPCB_PrimitivePour>;`\n- **setstate_complexpolygon**: `function setState_ComplexPolygon(complexPolygon: IPCB_Polygon): IPCB_PrimitivePour;`\n- **setstate_layer**: `function setState_Layer(layer: TPCB_LayersOfCopper): IPCB_PrimitivePour;`\n- **setstate_linewidth**: `function setState_LineWidth(lineWidth: number): IPCB_PrimitivePour;`\n- **setstate_net**: `function setState_Net(net: string): IPCB_PrimitivePour;`\n- **setstate_pourfillmethod**: `function setState_PourFillMethod(pourFillMethod: EPCB_PrimitivePourFillMethod): IPCB_PrimitivePour;`\n- **setstate_pourname**: `function setState_PourName(pourName: string): IPCB_PrimitivePour;`\n- **setstate_pourpriority**: `function setState_PourPriority(pourPriority: number): IPCB_PrimitivePour;`\n- **setstate_preservesilos**: `function setState_PreserveSilos(preserveSilos: boolean): IPCB_PrimitivePour;`\n- **setstate_primitivelock**: `function setState_PrimitiveLock(primitiveLock: boolean): IPCB_PrimitivePour;`\n- **toasync**: `function toAsync(): IPCB_PrimitivePour;`\n- **tosync**: `function toSync(): IPCB_PrimitivePour;`\n\n---\n\n## IPCB_PrimitivePoured\n\nCopper fill primitive\n\n```typescript\nclass IPCB_PrimitivePoured implements IPCB_Primitive\n```\n\n- **addsoldermaskfill**: `function addSolderMaskFill( \tpourFillId: IPCB_PrimitivePouredPourFill['id'], ): Promise<IPCB_PrimitiveFill | undefined>;`\n- **converttofill**: `function convertToFill( \tpourFillId: IPCB_PrimitivePouredPourFill['id'], ): Promise<IPCB_PrimitiveFill | undefined>;`\n- **deletepourfills**: `function deletePourFills( \tpourFillIds: IPCB_PrimitivePouredPourFill['id'] | Array<IPCB_PrimitivePouredPourFill['id']>, ): Promise<boolean>;`\n- **getstate_pourfills**: `function getState_PourFills(): Array<IPCB_PrimitivePouredPourFill>;`\n- **getstate_pourprimitiveid**: `function getState_PourPrimitiveId(): string;`\n- **getstate_primitiveid**: `function getState_PrimitiveId(): string;`\n- **getstate_primitivetype**: `function getState_PrimitiveType(): EPCB_PrimitiveType;`\n- **reset**: `function reset(): Promise<IPCB_PrimitivePoured>;`\n\n---\n\n## IPCB_PrimitiveRegion\n\nRegion primitive\n\n```typescript\nclass IPCB_PrimitiveRegion imple\n\nFile v1.1.24:references/classes/DMT_Board.md\n\n# DMT\\_Board class\n\nDocument tree / Board management class\n\n## Signature\n\n```typescript\nclass DMT_Board\n```\n\n## Remarks\n\nOperations related to board management in the currently open project\n\n## Methods\n\n<table><thead><tr><th>\n\nMethod\n\n</th><th>\n\nModifiers\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[copyBoard(sourceBoardName)](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\nCopy Board\n\n</td></tr>\n<tr><td>\n\n[createBoard(schematicUuid, pcbUuid)](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Create Board\n\n</td></tr>\n<tr><td>\n\n[deleteBoard(boardName)](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\nDelete Board\n\n</td></tr>\n<tr><td>\n\n[getAllBoardsInfo()](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\nGet all in the project board detailed properties of\n\n</td></tr>\n<tr><td>\n\n[getBoardInfo(boardName)](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\nGet detailed properties of Board\n\n</td></tr>\n<tr><td>\n\n[getCurrentBoardInfo()](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\nGet detailed properties of Current board\n\n</td></tr>\n<tr><td>\n\n[modifyBoardName(originalBoardName, boardName)](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\nModify Board name\n\n</td></tr>\n</tbody></table>\n\n---\n\n## 方法详情\n\n### copyboard\n\n# DMT\\_Board.copyBoard() method\n\nCopy Board\n\n## Signature\n\n```typescript\nfunction copyBoard(sourceBoardName: string): Promise<string | undefined>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nsourceBoardName\n\n</td><td>\n\nstring\n\n</td><td>\n\nSource board name\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;string \\| undefined&gt;\n\nNew board name, if it is `undefined` the copy fails\n\n## Example\n\n```javascript\n// 1. 取第一块板子的名称作为复制源\nconst boards = await eda.dmt_Board.getAllBoardsInfo();\nconst sourceName = boards[0].name;\n\n// 2. 复制板子，返回新板子名称\nconst newBoardName = await eda.dmt_Board.copyBoard(sourceName);\nconsole.log('source:', sourceName);\nconsole.log('copy:', newBoardName);\n\n// 3. 删除复制的板子，保持工程整洁\nconst deleted = await eda.dmt_Board.deleteBoard(newBoardName);\nconsole.log('deleted:', deleted);\n```\n\n### createboard\n\n# DMT\\_Board.createBoard() method\n\n> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n\nCreate Board\n\n## Signature\n\n```typescript\nfunction createBoard(schematicUuid?: string, pcbUuid?: string): Promise<string | undefined>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nschematicUuid\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Associated schematic UUID\n\n</td></tr>\n<tr><td>\n\npcbUuid\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Associated PCB UUID\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;string \\| undefined&gt;\n\nBoard name, if it is `undefined` creation fails\n\n## Example\n\n```javascript\n// 1. 无参调用，由系统自动创建一对原理图/PCB 文档并关联\nconst boardName = await eda.dmt_Board.createBoard();\nconsole.log('create:', boardName);\n\n// 2. 删除新板子（其关联文档是本例新建的，删除不影响其他板子），保持工程整洁\nconst deleted = await eda.dmt_Board.deleteBoard(boardName);\nconsole.log('deleted:', deleted);\n```\n\n### deleteboard\n\n# DMT\\_Board.deleteBoard() method\n\nDelete Board\n\n## Signature\n\n```typescript\nfunction deleteBoard(boardName: string): Promise<boolean>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nboardName\n\n</td><td>\n\nstring\n\n</td><td>\n\nBoard name\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;boolean&gt;\n\nWhether the operation is successful\n\n## Remarks\n\nIf the specified board does not exist, the API will return `false`<!-- -->, indicating that the operation failed\n\n## Example\n\n```javascript\n// 1. 复制一块板子作为删除目标，避免误删工程里有用的板子\nconst boards = await eda.dmt_Board.getAllBoardsInfo();\nconst tempName = await eda.dmt_Board.copyBoard(boards[0].name);\nconsole.log('temp board:', tempName);\n\n// 2. 删除该板子\nconst deleted = await eda.dmt_Board.deleteBoard(tempName);\nconsole.log('deleted:', deleted);\n```\n\n### getallboardsinfo\n\n# DMT\\_Board.getAllBoardsInfo() method\n\nGet all in the project board detailed properties of\n\n## Signature\n\n```typescript\nfunction getAllBoardsInfo(): Promise<Array<IDMT_BoardItem>>;\n```\n\n## Returns\n\nPromise&lt;Array&lt;[IDMT\\_BoardItem](../interfaces/IDMT_BoardItem.md)<!-- -->&gt;&gt;\n\nArray of detailed properties of all Board\n\n## Example\n\n```javascript\n// 1. 获取工程内所有板子\nconst boards = await eda.dmt_Board.getAllBoardsInfo();\n\n// 2. 输出每块板子的名称与下属文档\nboards.forEach((board, i) => {\n\tconsole.log(`board[${i}]:`, board.name, 'schematic:', board.schematic?.uuid, 'pcb:', board.pcb?.uuid);\n});\n\nconsole.log('total:', boards.length);\n```\n\n### getboardinfo\n\n# DMT\\_Board.getBoardInfo() method\n\nGet detailed properties of Board\n\n## Signature\n\n```typescript\nfunction getBoardInfo(boardName: string): Promise<IDMT_BoardItem | undefined>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nboardName\n\n</td><td>\n\nstring\n\n</td><td>\n\nBoard name\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;[IDMT\\_BoardItem](../interfaces/IDMT_BoardItem.md) \\| undefined&gt;\n\nBoard detailed properties of; if it is `undefined`<!-- -->, the retrieval failed\n\n## Example\n\n```javascript\n// 1. 先盘点所有板子，取第一块的名称作为查询目标\nconst boards = await eda.dmt_Board.getAllBoardsInfo();\nconst targetName = boards[0].name;\n\n// 2. 按名称查询该板子的详细属性\nconst board = await eda.dmt_Board.getBoardInfo(targetName);\n\n// 3. 输出板子属性\nconsole.log('name:', board.name);\nconsole.log('parentProjectUuid:', board.parentProjectUuid);\nconsole.log('schematic:', board.schematic?.uuid);\nconsole.log('pcb:', board.pcb?.uuid);\n```\n\n### getcurrentboardinfo\n\n# DMT\\_Board.getCurrentBoardInfo() method\n\nGet detailed properties of Current board\n\n## Signature\n\n```typescript\nfunction getCurrentBoardInfo(): Promise<IDMT_BoardItem | undefined>;\n```\n\n## Returns\n\nPromise&lt;[IDMT\\_BoardItem](../interfaces/IDMT_BoardItem.md) \\| undefined&gt;\n\nBoard detailed properties of; if it is `undefined`<!-- -->, the retrieval failed\n\n## Remarks\n\nIt will get the detailed properties of the board associated with the currently open schematic or PCB that has the last input focus\n\n## Example\n\n```javascript\n// 1. 切换到第一块板子下属的 PCB 文档（工程里可能存在不属于任何板子的 PCB，不能直接取 getAllPcbsInfo()[0]）\nconst boards = await eda.dmt_Board.getAllBoardsInfo();\nawait eda.dmt_EditorControl.openDocument(boards[0].pcb.uuid);\nawait new Promise(r => setTimeout(r, 500));\n\n// 2. 获取当前焦点对应的板子\nconst board = await eda.dmt_Board.getCurrentBoardInfo();\n\n// 3. 输出板子属性\nconsole.log('name:', board.name);\nconsole.log('schematic:', board.schematic?.uuid);\nconsole.log('pcb:', board.pcb?.uuid);\n```\n\n### modifyboardname\n\n# DMT\\_Board.modifyBoardName() method\n\nModify Board name\n\n## Signature\n\n```typescript\nfunction modifyBoardName(originalBoardName: string, boardName: string): Promise<boolean>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\noriginalBoardName\n\n</td><td>\n\nstring\n\n</td><td>\n\nOriginal board name\n\n</td></tr>\n<tr><td>\n\nboardName\n\n</td><td>\n\nstring\n\n</td><td>\n\nNew board name\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;boolean&gt;\n\nWhether Modify Successful\n\n## Example\n\n```javascript\n// 1. 取第一块板子，记录原名称\nconst boards = await eda.dmt_Board.getAllBoardsInfo();\nconst originalName = boards[0].name;\nconst newName = `${originalName}_tmp`;\n\n// 2. 改名并输出结果\nconst modified = await eda.dmt_Board.modifyBoardName(originalName, newName);\nconsole.log('original:', originalName);\nconsole.log('new:', newName);\nconsole.log('modified:', modified);\n\n// 3. 等待改名生效后改回原名称（改名是异步提交，紧跟的第二次改名会返回 false）\nawait new Promise(r => setTimeout(r, 1000));\nconst restored = await eda.dmt_Board.modifyBoardName(newName, originalName);\nconsole.log('restored:', restored);\n```\n\nFile v1.1.24:references/classes/DMT_EditorControl.md\n\n# DMT\\_EditorControl class\n\nDocument tree / Editor control class\n\n## Signature\n\n```typescript\nclass DMT_EditorControl\n```\n\n## Remarks\n\nHere the editor control is based on the sheets under the currently open engineering design. Any other `documentUuid` will be considered a non-existent document page\n\n## Methods\n\n<table><thead><tr><th>\n\nMethod\n\n</th><th>\n\nModifiers\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[activateDocument(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nActivate a document\n\n</td></tr>\n<tr><td>\n\n[activateSplitScreen(splitScreenId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nActivate a split screen\n\n</td></tr>\n<tr><td>\n\n[closeDocument(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nClose document\n\n</td></tr>\n<tr><td>\n\n[createSplitScreen(splitScreenType, tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nCreate Split screen\n\n</td></tr>\n<tr><td>\n\n[generateIndicatorMarkers(markers, color, lineWidth, zoom, tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Generate indicator markers\n\n</td></tr>\n<tr><td>\n\n[getCurrentRenderedAreaImage(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Get the canvas rendering region image\n\n</td></tr>\n<tr><td>\n\n[getSplitScreenIdByTabId(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nUse tab ID get split screen ID\n\n</td></tr>\n<tr><td>\n\n[getSplitScreenTree()](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nGet the editor split screen property tree\n\n</td></tr>\n<tr><td>\n\n[getTabsBySplitScreenId(splitScreenId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nGet all tabs under the specified split screen ID\n\n</td></tr>\n<tr><td>\n\n[mergeAllDocumentFromSplitScreen()](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nMerge all split screens\n\n</td></tr>\n<tr><td>\n\n[moveDocumentToSplitScreen(tabId, splitScreenId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nMove a document to the specified split screen\n\n</td></tr>\n<tr><td>\n\n[openDocument(documentUuid, splitScreenId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nOpen document\n\n</td></tr>\n<tr><td>\n\n[openLibraryDocument(libraryUuid, libraryType, uuid, splitScreenId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Open library symbol, footprint document\n\n</td></tr>\n<tr><td>\n\n[removeIndicatorMarkers(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Remove indicator markers\n\n</td></tr>\n<tr><td>\n\n[tileAllDocumentToSplitScreen()](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nTile all documents\n\n</td></tr>\n<tr><td>\n\n[zoomTo(x, y, scaleRatio, tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Zoom to coordinates\n\n</td></tr>\n<tr><td>\n\n[zoomToAllPrimitives(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Zoom to all primitives (fit all)\n\n</td></tr>\n<tr><td>\n\n[zoomToRegion(left, right, top, bottom, tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Zoom to region\n\n</td></tr>\n<tr><td>\n\n[zoomToSelectedPrimitives(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Zoom to the selected primitives (fit selection)\n\n</td></tr>\n</tbody></table>\n\n---\n\n## 方法详情\n\n### activatedocument\n\n# DMT\\_EditorControl.activateDocument() method\n\nActivate a document\n\n## Signature\n\n```typescript\nfunction activateDocument(tabId: string): Promise<boolean>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\ntabId\n\n</td><td>\n\nstring\n\n</td><td>\n\nTab ID\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;boolean&gt;\n\nWhether the operation is successful\n\n## Remarks\n\nSwitch to the tab of the specified document and place the input focus in it\n\n## Example\n\n```javascript\n// 1. 先后打开原理图页与 PCB，此时焦点在最后打开的 PCB 上\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst pcbs = await eda.dmt_Pcb.getAllPcbsInfo();\nconst tabSch = await eda.dmt_EditorControl.openDocument(pages[0].uuid);\nawait eda.dmt_EditorControl.openDocument(pcbs[0].uuid);\n\n// 2. 激活原理图标签页（真实切换回原理图画布）\nconst activated = await eda.dmt_EditorControl.activateDocument(tabSch);\nconsole.log('activated:', activated);\n```\n\n### activatesplitscreen\n\n# DMT\\_EditorControl.activateSplitScreen() method\n\nActivate a split screen\n\n## Signature\n\n```typescript\nfunction activateSplitScreen(splitScreenId: string): Promise<boolean>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nsplitScreenId\n\n</td><td>\n\nstring\n\n</td><td>\n\nSplit screen ID\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;boolean&gt;\n\nWhether the operation is successful\n\n## Remarks\n\nGive input focus\n\n## Example\n\n```javascript\n// 1. 归一化布局后打开两个文档，并拆出一个新分屏\nawait eda.dmt_EditorControl.mergeAllDocumentFromSplitScreen();\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst pcbs = await eda.dmt_Pcb.getAllPcbsInfo();\nawait eda.dmt_EditorControl.openDocument(pages[0].uuid);\nconst tabPcb = await eda.dmt_EditorControl.openDocument(pcbs[0].uuid);\nconst split = await eda.dmt_EditorControl.createSplitScreen('vertical', tabPcb);\n\n// 2. 激活新分屏（输入焦点移到该分屏）\nconst activated = await eda.dmt_EditorControl.activateSplitScreen(split.newSplitScreenId);\nconsole.log('activated:', activated);\n\n// 3. 合并所有分屏，恢复单屏布局\nconst merged = await eda.dmt_EditorControl.mergeAllDocumentFromSplitScreen();\nconsole.log('merged:', merged);\n```\n\n### closedocument\n\n# DMT\\_EditorControl.closeDocument() method\n\nClose document\n\n## Signature\n\n```typescript\nfunction closeDocument(tabId: string): Promise<boolean>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\ntabId\n\n</td><td>\n\nstring\n\n</td><td>\n\nTab ID. Here [IDMT\\_SchematicPageItem.uuid](../interfaces/IDMT_SchematicPageItem.md)<!-- -->, [IDMT\\_PcbItem.uuid](../interfaces/IDMT_PcbItem.md)<!-- -->, and [IDMT\\_PanelItem.uuid](../interfaces/IDMT_PanelItem.md) are supported as input\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;boolean&gt;\n\nWhether the operation is successful\n\n## Remarks\n\nIf the document has not been saved, executing this operation will directly lose all unsaved data. After completing modification operations, first execute [SCH\\_Document.save()](./SCH_Document.md)<!-- -->, [PCB\\_Document.save()](./PCB_Document.md)<!-- -->, and [PNL\\_Document.save()](./PNL_Document.md) to save the data\n\n## Example\n\n```javascript\n// 1. 创建临时原理图并给它加一页（新建的原理图没有页面，需显式创建）\nconst schematicUuid = await eda.dmt_Schematic.createSchematic('嘉立创示例_关闭文档');\nconst pageUuid = await eda.dmt_Schematic.createSchematicPage(schematicUuid);\n\n// 2. 打开该页面作为关闭目标\nconst tabId = await eda.dmt_EditorControl.openDocument(pageUuid);\nconsole.log('opened tab:', tabId);\n\n// 3. 关闭该标签页（空白文档，无未保存内容）\nconst closed = await eda.dmt_EditorControl.closeDocument(tabId);\nconsole.log('closed:', closed);\n\n// 4. 删除临时原理图，保持工程整洁\nconst deleted = await eda.dmt_Schematic.deleteSchematic(schematicUuid);\nconsole.log('deleted:', deleted);\n```\n\n### createsplitscreen\n\n# DMT\\_EditorControl.createSplitScreen() method\n\nCreate Split screen\n\n## Signature\n\n```typescript\nfunction createSplitScreen(\n\tsplitScreenType: EDMT_EditorSplitScreenDirection,\n\ttabId: string,\n): Promise<{ sourceSplitScreenId: string; newSplitScreenId: string } | undefined>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nsplitScreenType\n\n</td><td>\n\n[EDMT\\_EditorSplitScreenDirection](../enums/EDMT_EditorSplitScreenDirection.md)\n\n</td><td>\n\nSplit screen type, `horizontal` horizontal, `vertical` vertical\n\n</td></tr>\n<tr><td>\n\ntabId\n\n</td><td>\n\nstring\n\n</td><td>\n\nTab ID. This tab will be moved into the new split screen\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;{ sourceSplitScreenId: string; newSplitScreenId: string } \\| undefined&gt;\n\nSplit screen ID. `sourceSplitScreenId` represents the source split screen, and `newSplitScreenId` represents the new split screen\n\n## Remarks\n\nPlease make sure the split screen corresponding to [tabId](./DMT_EditorControl.md) has more than two tabs; otherwise the split screen will not be executed and `undefined` will be returned\n\n## Example\n\n```javascript\n// 1. 归一化布局：先合并既有分屏，保证两个标签页落在同一分屏\nawait eda.dmt_EditorControl.mergeAllDocumentFromSplitScreen();\n\n// 2. 打开两个文档，让当前分屏持有两个标签页\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst pcbs = await eda.dmt_Pcb.getAllPcbsInfo();\nawait eda.dmt_EditorControl.openDocument(pages[0].uuid);\nconst tabPcb = await eda.dmt_EditorControl.openDocument(pcbs[0].uuid);\n\n// 3. 把 PCB 标签页拆到一个新的水平分屏\nconst split = await eda.dmt_EditorControl.createSplitScreen('horizontal', tabPcb);\nconsole.log('source split:', split?.sourceSplitScreenId);\nconsole.log('new split:', split?.newSplitScreenId);\n\n// 4. 回读新分屏的标签页，确认 PCB 已在其中\nconst tabs = await eda.dmt_EditorControl.getTabsBySplitScreenId(split.newSplitScreenId);\nconsole.log('tabs in new split:', tabs.map(t => t.title));\n\n// 5. 合并所有分屏，恢复单屏布局\nconst merged = await eda.dmt_EditorControl.mergeAllDocumentFromSplitScreen();\nconsole.log('merged:', merged);\n```\n\n### generateindicatormarkers\n\n# DMT\\_EditorControl.generateIndicatorMarkers() method\n\n> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n\nGenerate indicator markers\n\n## Signature\n\n```typescript\nfunction generateIndicatorMarkers(\n\tmarkers: Array<IDMT_IndicatorMarkerShape>,\n\tcolor?: { r: number; g: number; b: number; alpha: number },\n\tlineWidth?: number,\n\tzoom?: boolean,\n\ttabId?: string,\n): Promise<boolean>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nmarkers\n\n</td><td>\n\nArray&lt;[IDMT\\_IndicatorMarkerShape](../interfaces/IDMT_IndicatorMarkerShape.md)<!-- -->&gt;\n\n</td><td>\n\nArray of indicator marker shape objects\n\n</td></tr>\n<tr><td>\n\ncolor\n\n</td><td>\n\n\\{ r: number; g: number; b: number; alpha: number \\}\n\n</td><td>\n\n_(Optional)_ Indicator marker color\n\n</td></tr>\n<tr><td>\n\nlineWidth\n\n</td><td>\n\nnumber\n\n</td><td>\n\n_(Optional)_ Line width\n\n</td></tr>\n<tr><td>\n\nzoom\n\n</td><td>\n\nboolean\n\n</td><td>\n\n_(Optional)_ Whether to locate and zoom\n\n</td></tr>\n<tr><td>\n\ntabId\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Tab ID. If not passed in, the canvas with the last input focus will be used\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;boolean&gt;\n\nWhether the indicator markers were generated successfully, `false` indicates that the canvas does not support this operation or `tabId` does not exist\n\n## Remarks\n\nIn the indicator marker shape data, the coordinate unit span of the schematic and symbol canvases is 0.01inch, and that of the PCB and footprint canvases is mil\n\n## Example\n\n```javascript\n// 1. 打开一个原理图页，确定标记作用的画布\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst tabId = await eda.dmt_EditorControl.openDocument(pages[0].uuid);\n\n// 2. 生成一组标记：点 + 圆 + 矩形（原理图画布坐标单位 0.01inch）\nconst generated = await eda.dmt_EditorControl.generateIndicatorMarkers(\n\t[\n\t\t{ type: 'point', x: 100, y: 100 },\n\t\t{ type: 'circle', x: 250, y: 150, r: 50 },\n\t\t{ type: 'rectangle', left: 350, right: 550, top: 100, bottom: 250 },\n\t],\n\t{ r: 255, g: 60, b: 60, alpha: 1 }, // 标记颜色\n\t2, // 线宽\n\tfalse, // 不自动缩放定位到标记\n\ttabId,\n);\nconsole.log('generated:', generated);\n\n// 3. 用完即清，保持画布干净\nconst removed = await eda.dmt_EditorControl.removeIndicatorMarkers(tabId);\nconsole.log('removed:', removed);\n```\n\n### getcurrentrenderedareaimage\n\n# DMT\\_EditorControl.getCurrentRenderedAreaImage() method\n\n> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n\nGet the canvas rendering region image\n\n## Signature\n\n```typescript\nfunction getCurrentRenderedAreaImage(tabId?: string): Promise<Blob | undefined>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\ntabId\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Tab ID. If not passed in, the canvas with the last input focus will be obtained\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;Blob \\| undefined&gt;\n\n- Blob-format image data of the canvas rendering region\n\n## Example\n\n```javascript\n// 1. 打开一个原理图页，确定截图的画布\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst tabId = await eda.dmt_EditorControl.openDocument(pages[0].uuid);\n\n// 2. 获取该画布当前渲染区域的图像\nconst image = await eda.dmt_EditorControl.getCurrentRenderedAreaImage(tabId);\n\n// 3. 读取 Blob 的基本信息（字节数与 MIME 类型）\nconsole.log('isBlob:', image instanceof Blob);\nconsole.log('size:', image.size);\nconsole.log('mimeType:', image.type);\n```\n\n### getsplitscreenidbytabid\n\n# DMT\\_EditorControl.getSplitScreenIdByTabId() method\n\nUse tab ID get split screen ID\n\n## Signature\n\n```typescript\nfunction getSplitScreenIdByTabId(tabId: string): Promise<string | undefined>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\ntabId\n\n</td><td>\n\nstring\n\n</td><td>\n\nTab ID\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;string \\| undefined&gt;\n\nSplit screen ID\n\n## Example\n\n```javascript\n// 1. 打开一个原理图页，拿到它的标签页 ID\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst tabId = await eda.dmt_EditorControl.openDocument(pages[0].uuid);\n\n// 2. 查询该标签页所在的分屏\nconst splitScreenId = await eda.dmt_EditorControl.getSplitScreenIdByTabId(tabId);\nconsole.log('tabId:', tabId);\nconsole.log('splitScreenId:', splitScreenId);\n```\n\n### getsplitscreentree\n\n# DMT\\_EditorControl.getSplitScreenTree() method\n\nGet the editor split screen property tree\n\n## Signature\n\n```typescript\nfunction getSplitScreenTree(): Promise<IDMT_EditorSplitScreenItem | undefined>;\n```\n\n## Returns\n\nPromise&lt;[IDMT\\_EditorSplitScreenItem](../interfaces/IDMT_EditorSplitScreenItem.md) \\| undefined&gt;\n\nThe editor split screen property tree. If it is `undefined`<!-- -->, the data retrieval failed\n\n## Example\n\n```javascript\n// 1. 打开一个原理图页，保证分屏树里有标签页可读\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nawait eda.dmt_EditorControl.openDocument(pages[0].uuid);\n\n// 2. 读取分屏树\nconst tree = await eda.dmt_EditorControl.getSplitScreenTree();\n\n// 3. 递归遍历，收集所有分屏 ID 与标签页标题\nconst splitIds = [];\nconst tabTitles = [];\n(function walk(node) {\n\tsplitIds.push(node.id);\n\tif (node.tabs)\n\t\ttabTitles.push(...node.tabs.map(t => t.title));\n\t(node.children || []).forEach(walk);\n})(tree);\nconsole.log('split count:', splitIds.length);\nconsole.log('tab titles:', tabTitles);\n```\n\n### gettabsbysplitscreenid\n\n# DMT\\_EditorControl.getTabsBySplitScreenId() method\n\nGet all tabs under the specified split screen ID\n\n## Signature\n\n```typescript\nfunction getTabsBySplitScreenId(splitScreenId: string): Promise<Array<IDMT_EditorTabItem>>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nsplitScreenId\n\n</td><td>\n\nstring\n\n</td><td>\n\nSplit screen ID\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;Array&lt;[IDMT\\_EditorTabItem](../interfaces/IDMT_EditorTabItem.md)<!-- -->&gt;&gt;\n\nTab list\n\n## Remarks\n\nIf there are no direct tabs under the specified split screen (that is, it still has [children](../interfaces/IDMT_EditorSplitScreenItem.md) under it), an empty array will be returned\n\n## Example\n\n```javascript\n// 1. 打开一个原理图页并读取分屏树，定位一个直接持有标签页的分屏\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nawait eda.dmt_EditorControl.openDocument(pages[0].uuid);\nconst tree = await eda.dmt_EditorControl.getSplitScreenTree();\nlet leaf = null;\n(function find(node) {\n\tif (node.tabs?.length) { leaf = node; return; }\n\t(node.children || []).forEach(find);\n})(tree);\n\n// 2. 查询该分屏下的所有标签页\nconst tabs = await eda.dmt_EditorControl.getTabsBySplitScreenId(leaf.id);\nconsole.log('splitScreenId:', leaf.id);\nconsole.log('tab count:', tabs.length);\nconsole.log('titles:', tabs.map(t => t.title));\n```\n\n### mergealldocumentfromsplitscreen\n\n# DMT\\_EditorControl.mergeAllDocumentFromSplitScreen() method\n\nMerge all split screens\n\n## Signature\n\n```typescript\nfunction mergeAllDocumentFromSplitScreen(): Promise<boolean>;\n```\n\n## Returns\n\nPromise&lt;boolean&gt;\n\nWhether the operation is successful\n\n## Remarks\n\nOnly available when child split screens exist. It will cancel all child split screens and merge all document tabs into the initial split screen\n\n## Example\n\n```javascript\n// 1. 制造\"存在子分屏\"的前提：归一化布局后打开两个文档并拆出一个分屏\nawait eda.dmt_EditorControl.mergeAllDocumentFromSplitScreen();\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst pcbs = await eda.dmt_Pcb.getAllPcbsInfo();\nawait eda.dmt_EditorControl.openDocument(pages[0].uuid);\nconst tabPcb = await eda.dmt_EditorControl.openDocument(pcbs[0].uuid);\nawait eda.dmt_EditorControl.createSplitScreen('vertical', tabPcb);\n\n// 2. 合并所有分屏，标签页全部回到初始分屏\nconst merged = await eda.dmt_EditorControl.mergeAllDocumentFromSplitScreen();\nconsole.log('merged:', merged);\n\n// 3. 回读分屏树，确认已无子分屏\nconst tree = await eda.dmt_EditorControl.getSplitScreenTree();\nconsole.log('child splits left:', tree.children?.length ?? 0);\n```\n\n### movedocumenttosplitscreen\n\n# DMT\\_EditorControl.moveDocumentToSplitScreen() method\n\nMove a document to the specified split screen\n\n## Signature\n\n```typescript\nfunction moveDocumentToSplitScreen(tabId: string, splitScreenId: string): Promise<boolean>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\ntabId\n\n</td><td>\n\nstring\n\n</td><td>\n\nTab ID\n\n</td></tr>\n<tr><td>\n\nsplitScreenId\n\n</td><td>\n\nstring\n\n</td><td>\n\n[Split screen ID](../interfaces/IDMT_EditorSplitScreenItem.md)\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;boolean&gt;\n\nWhether the operation is successful\n\n## Remarks\n\nAfter moving the document, the editor split screen property tree may change\n\n## Example\n\n```javascript\n// 1. 归一化布局后打开两个文档，把 PCB 拆到新分屏\nawait eda.dmt_EditorControl.mergeAllDocumentFromSplitScreen();\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst pcbs = await eda.dmt_Pcb.getAllPcbsInfo();\nawait eda.dmt_EditorControl.openDocument(pages[0].uuid);\nconst tabPcb = await eda.dmt_EditorControl.openDocument(pcbs[0].uuid);\nconst split = await eda.dmt_EditorControl.createSplitScreen('vertical', tabPcb);\n\n// 2. 把 PCB 标签页移回源分屏\nconst moved = await eda.dmt_EditorControl.moveDocumentToSplitScreen(tabPcb, split.sourceSplitScreenId);\nconsole.log('moved:', moved);\n\n// 3. 回读源分屏标签页，确认两个标签页又同处一个分屏\nconst tabs = await eda.dmt_EditorControl.getTabsBySplitScreenId(split.sourceSplitScreenId);\nconsole.log('source split tabs:', tabs.map(t => t.title));\n\n// 4. 清理：合并残余分屏，恢复单屏布局\nconst mergedBack = await eda.dmt_EditorControl.mergeAllDocumentFromSplitScreen();\nconsole.log('mergedBack:', mergedBack);\n```\n\n### opendocument\n\n# DMT\\_EditorControl.openDocument() method\n\nOpen document\n\n## Signature\n\n```typescript\nfunction openDocument(documentUuid: string, splitScreenId?: string): Promise<string | undefined>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\ndocumentUuid\n\n</td><td>\n\nstring\n\n</td><td>\n\nDocument UUID. Here [IDMT\\_SchematicItem.uuid](../interfaces/IDMT_SchematicItem.md)<!-- -->, [IDMT\\_SchematicPageItem.uuid](../interfaces/IDMT_SchematicPageItem.md)<!-- -->, [IDMT\\_PcbItem.uuid](../interfaces/IDMT_PcbItem.md)<!-- -->, and [IDMT\\_PanelItem.uuid](../interfaces/IDMT_PanelItem.md) are supported as input\n\n</td></tr>\n<tr><td>\n\nsplitScreenId\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Split screen ID, which is the [IDMT\\_EditorSplitScreenItem.id](../interfaces/IDMT_EditorSplitScreenItem.md) obtained by the [DMT\\_EditorControl.getSplitScreenTree()](./DMT_EditorControl.md) method\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;string \\| undefined&gt;\n\nTab ID, if it is `undefined`<!-- -->, then open document failed\n\n## Example\n\n```javascript\n// 1. 取工程里第一个原理图页作为打开目标\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconsole.log('target:', pages[0].name);\n\n// 2. 打开该页面，返回标签页 ID\nconst tabId = await eda.dmt_EditorControl.openDocument(pages[0].uuid);\nconsole.log('tabId:', tabId);\n```\n\n### openlibrarydocument\n\n# DMT\\_EditorControl.openLibraryDocument() method\n\n> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n\nOpen library symbol, footprint document\n\n## Signature\n\n```typescript\nfunction openLibraryDocument(\n\tlibraryUuid: string,\n\tlibraryType: ELIB_LibraryType.SYMBOL | ELIB_LibraryType.FOOTPRINT,\n\tuuid: string,\n\tsplitScreenId?: string,\n): Promise<string | undefined>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nlibraryUuid\n\n</td><td>\n\nstring\n\n</td><td>\n\nLibrary UUID, you can use [LIB\\_LibrariesList](./LIB_LibrariesList.md) APIs in\n\n</td></tr>\n<tr><td>\n\nlibraryType\n\n</td><td>\n\n[ELIB\\_LibraryType.SYMBOL](../enums/ELIB_LibraryType.md) \\| [ELIB\\_LibraryType.FOOTPRINT](../enums/ELIB_LibraryType.md)\n\n</td><td>\n\nLibrary type, support symbol and footprint\n\n</td></tr>\n<tr><td>\n\nuuid\n\n</td><td>\n\nstring\n\n</td><td>\n\nSymbol, footprint UUID\n\n</td></tr>\n<tr><td>\n\nsplitScreenId\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Split screen ID, which is the [IDMT\\_EditorSplitScreenItem.id](../interfaces/IDMT_EditorSplitScreenItem.md) obtained by the [DMT\\_EditorControl.getSplitScreenTree()](./DMT_EditorControl.md) method\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;string \\| undefined&gt;\n\nTab ID, if it is `undefined`<!-- -->, then open document failed\n\n## Example\n\n```javascript\n// 1. 搜索库符号，拿到其所在库 UUID 与符号 UUID\nconst results = await eda.lib_Symbol.search('0603');\nconsole.log('symbol:', results[0].name);\n\n// 2. 打开该符号的编辑画布，返回标签页 ID（'2' = ELIB_LibraryType.SYMBOL）\nconst tabId = await eda.dmt_EditorControl.openLibraryDocument(results[0].libraryUuid, '2', results[0].uuid);\nconsole.log('tabId:', tabId);\n\n// 3. 看完关闭标签页\nconst closed = await eda.dmt_EditorControl.closeDocument(tabId);\nconsole.log('closed:', closed);\n```\n\n### removeindicatormarkers\n\n# DMT\\_EditorControl.removeIndicatorMarkers() method\n\n> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n\nRemove indicator markers\n\n## Signature\n\n```typescript\nfunction removeIndicatorMarkers(tabId?: string): Promise<boolean>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\ntabId\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Tab ID. If not passed in, the canvas with the last input focus will be used\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;boolean&gt;\n\nWhether the indicator markers were removed successfully, `false` indicates that the canvas does not support this operation or `tabId` does not exist\n\n## Remarks\n\nThis API will remove all generated indicator markers\n\n## Example\n\n```javascript\n// 1. 打开一个原理图页，并先生成一个指示标记作为清理对象\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst tabId = await eda.dmt_EditorControl.openDocument(pages[0].uuid);\nconst generated = await eda.dmt_EditorControl.generateIndicatorMarkers(\n\t[{ type: 'circle', x: 150, y: 150, r: 60 }],\n\t{ r: 0, g: 128, b: 255, alpha: 1 },\n\t2,\n\tfalse,\n\ttabId,\n);\nconsole.log('generated:', generated);\n\n// 2. 移除该画布上全部指示标记\nconst removed = await eda.dmt_EditorControl.removeIndicatorMarkers(tabId);\nconsole.log('removed:', removed);\n```\n\n### tilealldocumenttosplitscreen\n\n# DMT\\_EditorControl.tileAllDocumentToSplitScreen() method\n\nTile all documents\n\n## Signature\n\n```typescript\nfunction tileAllDocumentToSplitScreen(): Promise<boolean>;\n```\n\n## Returns\n\nPromise&lt;boolean&gt;\n\nWhether the operation is successful\n\n## Remarks\n\nOnly available when no child split screens exist. It will automatically create split screens for all opened document tabs\n\n## Example\n\n```javascript\n// 1. 归一化布局：先合并既有子分屏，满足\"无子分屏\"前提\nawait eda.dmt_EditorControl.mergeAllDocumentFromSplitScreen();\n\n// 2. 打开两个文档，给平铺提供素材\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst pcbs = await eda.dmt_Pcb.getAllPcbsInfo();\nawait eda.dmt_EditorControl.openDocument(pages[0].uuid);\nawait eda.dmt_EditorControl.openDocument(pcbs[0].uuid);\n\n// 3. 平铺：每个标签页各占一个分屏\nconst tiled = await eda.dmt_EditorControl.tileAllDocumentToSplitScreen();\nconsole.log('tiled:', tiled);\n\n// 4. 合并所有分屏，恢复单屏布局\nconst merged = await eda.dmt_EditorControl.mergeAllDocumentFromSplitScreen();\nconsole.log('merged:', merged);\n```\n\n### zoomto\n\n# DMT\\_EditorControl.zoomTo() method\n\n> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n\nZoom to coordinates\n\n## Signature\n\n```typescript\nfunction zoomTo(\n\tx?: number,\n\ty?: number,\n\tscaleRatio?: number,\n\ttabId?: string,\n): Promise<{ left: number; right: number; top: number; bottom: number } | false>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nx\n\n</td><td>\n\nnumber\n\n</td><td>\n\n_(Optional)_ Center X coordinate. If not passed in, the current X coordinate will not be changed\n\n</td></tr>\n<tr><td>\n\ny\n\n</td><td>\n\nnumber\n\n</td><td>\n\n_(Optional)_ Center Y coordinate. If not passed in, the current Y coordinate will not be changed\n\n</td></tr>\n<tr><td>\n\nscaleRatio\n\n</td><td>\n\nnumber\n\n</td><td>\n\n_(Optional)_ Zoom ratio. If not passed in, the current zoom ratio will not be changed. The unit span is `1/100`<!-- -->. If `200` is passed in, it means a zoom ratio of `200%`\n\n</td></tr>\n<tr><td>\n\ntabId\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Tab ID. If not passed in, the canvas with the last input focus will be used\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;{ left: number; right: number; top: number; bottom: number } \\| false&gt;\n\nRegion data after zooming. `false` indicates that the canvas does not support the zoom operation or the `tabId` does not exist\n\n## Remarks\n\nIn the schematic and symbol canvases, the coordinate unit span is 0.01inch; in the PCB and footprint canvases, it is mil\n\n## Example\n\n```javascript\n// 1. 打开一个原理图页，确定缩放的画布\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst tabId = await eda.dmt_EditorControl.openDocument(pages[0].uuid);\n\n// 2. 视口中心移到 (100, 100)，缩放比 200%（单位跨度 1/100）\nconst bounds = await eda.dmt_EditorControl.zoomTo(100, 100, 200, tabId);\nconsole.log('bounds:', bounds);\n```\n\n### zoomtoallprimitives\n\n# DMT\\_EditorControl.zoomToAllPrimitives() method\n\n> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n\nZoom to all primitives (fit all)\n\n## Signature\n\n```typescript\nfunction zoomToAllPrimitives(\n\ttabId?: string,\n): Promise<{ left: number; right: number; top: number; bottom: number } | false>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\ntabId\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Tab ID. If not passed in, the canvas with the last input focus will be used\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;{ left: number; right: number; top: number; bottom: number } \\| false&gt;\n\nRegion data after zooming. `false` indicates that the canvas does not support the zoom operation or the `tabId` does not exist\n\n## Remarks\n\nIn the returned data, the coordinate unit span of the schematic and symbol canvases is 0.01inch, and that of the PCB and footprint canvases is mil\n\n## Example\n\n```javascript\n// 1. 打开一个原理图页，确定缩放的画布\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst tabId = await eda.dmt_EditorControl.openDocument(pages[0].uuid);\n\n// 2. 适应全部图元，返回缩放后的可视区域边界\nconst bounds = await eda.dmt_EditorControl.zoomToAllPrimitives(tabId);\nconsole.log('bounds:', bounds);\n```\n\n### zoomtoregion\n\n# DMT\\_EditorControl.zoomToRegion() method\n\n> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n\nZoom to region\n\n## Signature\n\n```typescript\nfunction zoomToRegion(\n\tleft: number,\n\tright: number,\n\ttop: number,\n\tbottom: number,\n\ttabId?: string,\n): Promise<boolean>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nleft\n\n</td><td>\n\nnumber\n\n</td><td>\n\nFirst X coordinate of the rectangle\n\n</td></tr>\n<tr><td>\n\nright\n\n</td><td>\n\nnumber\n\n</td><td>\n\nSecond X coordinate of the rectangle\n\n</td></tr>\n<tr><td>\n\ntop\n\n</td><td>\n\nnumber\n\n</td><td>\n\nFirst Y coordinate of the rectangle\n\n</td></tr>\n<tr><td>\n\nbottom\n\n</td><td>\n\nnumber\n\n</td><td>\n\nSecond Y coordinate of the rectangle\n\n</td></tr>\n<tr><td>\n\ntabId\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Tab ID. If not passed in, the canvas with the last input focus will be used\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;boolean&gt;\n\nWhether the operation is successful\n\n## Remarks\n\nIn the schematic and symbol canvases, the coordinate unit span is 0.01inch; in the PCB and footprint canvases, it is mil\n\n## Example\n\n```javascript\n// 1. 打开一个原理图页，确定缩放的画布\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst tabId = await eda.dmt_EditorControl.openDocument(pages[0].uuid);\n\n// 2. 缩放到 (0,0)-(400,300) 的矩形区域\nconst zoomed = await eda.dmt_EditorControl.zoomToRegion(0, 400, 0, 300, tabId);\nconsole.log('zoomed:', zoomed);\n```\n\n### zoomtoselectedprimitives\n\n# DMT\\_EditorControl.zoomToSelectedPrimitives() method\n\n> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n\nZoom to the selected primitives (fit selection)\n\n## Signature\n\n```typescript\nfunction zoomToSelectedPrimitives(\n\ttabId?: string,\n): Promise<{ left: number; right: number; top: number; bottom: number } | false>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\ntabId\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Tab ID. If not passed in, the canvas with the last input focus will be used\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;{ left: number; right: number; top: number; bottom: number } \\| false&gt;\n\nRegion data after zooming. `false` indicates that the canvas does not support the zoom operation or the `tabId` does not exist\n\n## Remarks\n\nIn the returned data, the coordinate unit span of the schematic and symbol canvases is 0.01inch, and that of the PCB and footprint canvases is mil\n\n## Example\n\n```javascript\n// 1. 打开原理图页，创建一个文本图元作为选中目标\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nconst tabId = await eda.dmt_EditorControl.openDocument(pages[0].uuid);\nconst text = await eda.sch_PrimitiveText.create(100, 80, '嘉立创示例_缩放目标');\n\n// 2. 以图元 ID 建立选中状态\nconst selected = await eda.sch_SelectControl.doSelectPrimitives([text.getState_PrimitiveId()]);\nconsole.log('selected:', selected);\n\n// 3. 缩放到选中的图元，返回可视区域边界\nconst bounds = await eda.dmt_EditorControl.zoomToSelectedPrimitives(tabId);\nconsole.log('bounds:', bounds);\n\n// 4. 清理：取消选中并删除测试图元\nawait eda.sch_SelectControl.clearSelected();\nawait eda.sch_PrimitiveText.delete([text.getState_PrimitiveId()]);\nconsole.log('cleaned');\n```\n\nFile v1.1.24:references/classes/DMT_Event.md\n\n# DMT\\_Event class\n\nDocument tree / event class\n\n## Signature\n\n```typescript\nclass DMT_Event\n```\n\n## Remarks\n\nRegister an event callback\n\n## Methods\n\n<table><thead><tr><th>\n\nMethod\n\n</th><th>\n\nModifiers\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[addEditorTabEventListener(id, eventType, callFn, onlyOnce)](./DMT_Event.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Add an editor tab event listener\n\n</td></tr>\n<tr><td>\n\n[isEventListenerAlreadyExist(id)](./DMT_Event.md)\n\n</td><td>\n\n</td><td>\n\nQuery whether the event listener exists\n\n</td></tr>\n<tr><td>\n\n[removeEventListener(id)](./DMT_Event.md)\n\n</td><td>\n\n</td><td>\n\nRemove Event listener\n\n</td></tr>\n</tbody></table>\n\n---\n\n## 方法详情\n\n### addeditortabeventlistener\n\n# DMT\\_Event.addEditorTabEventListener() method\n\n> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n\nAdd an editor tab event listener\n\n## Signature\n\n```typescript\nfunction addEditorTabEventListener(\n\tid: string,\n\teventType: 'all' | EDMT_EditorTabEventType,\n\tcallFn: (\n\t\teventType: EDMT_EditorTabEventType,\n\t\tprops: { documentType: EDMT_EditorDocumentType; title: string; tabId: string },\n\t) => void | Promise<void>,\n\tonlyOnce?: boolean,\n): void;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nid\n\n</td><td>\n\nstring\n\n</td><td>\n\nEvent ID, used to prevent duplicate event registration\n\n</td></tr>\n<tr><td>\n\neventType\n\n</td><td>\n\n'all' \\| [EDMT\\_EditorTabEventType](../enums/EDMT_EditorTabEventType.md)\n\n</td><td>\n\nEvent type\n\n</td></tr>\n<tr><td>\n\ncallFn\n\n</td><td>\n\n(eventType: [EDMT\\_EditorTabEventType](../enums/EDMT_EditorTabEventType.md)<!-- -->, props: { documentType: [EDMT\\_EditorDocumentType](../enums/EDMT_EditorDocumentType.md)<!-- -->; title: string; tabId: string }) =&gt; void \\| Promise&lt;void&gt;\n\n</td><td>\n\nThe callback function triggered when the event fires\n\n</td></tr>\n<tr><td>\n\nonlyOnce\n\n</td><td>\n\nboolean\n\n</td><td>\n\n_(Optional)_ Whether to listen only once\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nvoid\n\n## Remarks\n\nNote: This API is only valid for extensions. Calling it in a standalone script environment will always `throw Error`\n\nWhen the [tab event type](../enums/EDMT_EditorTabEventType.md) is [close](../enums/EDMT_EditorTabEventType.md) or [open](../enums/EDMT_EditorTabEventType.md)<!-- -->, the [switch](../enums/EDMT_EditorTabEventType.md) event will also be triggered\n\n## Example\n\n```javascript\nconst listenerId = '嘉立创示例_tab_add';\n\n// 1. 打开一个原理图页，保证编辑器里存在可切换的标签页\nconst pages = await eda.dmt_Schematic.getAllSchematicPagesInfo();\nawait eda.dmt_EditorControl.openDocument(pages[0].uuid);\n\n// 2. 注册 toggle 事件监听（回调里拿到事件类型与标签页属性）\nlet fired = null;\neda.dmt_Event.addEditorTabEventListener(\n\tlistenerId,\n\t'toggle',\n\t(eventType, props) => {\n\t\tfired = { eventType, title: props?.title, tabId: props?.tabId };\n\t}\n);\n\n// 3. 回读确认注册成功（同 id 再注册也会被防重机制忽略）\nconst registered = eda.dmt_Event.isEventListenerAlreadyExist(listenerId);\nconsole.log('registered:', registered);\n\n// 4. 切换一次标签页触发 toggle 事件，观察回调被调用\nif (pages[1]) {\n\tawait eda.dmt_EditorControl.openDocument(pages[1].uuid);\n\tawait eda.dmt_EditorControl.openDocument(pages[0].uuid);\n}\nelse {\n\tawait eda.dmt_EditorControl.openDocument(pages[0].uuid);\n}\nawait new Promise(r => setTimeout(r, 500));\nconsole.log('fired:', fired ? JSON.stringify(fired) : 'null');\n\n// 5. 清理监听，避免会话内残留\nconst removed = eda.dmt_Event.removeEventListener(listenerId);\nconsole.log('removed:', removed);\n```\n\n### iseventlisteneralreadyexist\n\n# DMT\\_Event.isEventListenerAlreadyExist() method\n\nQuery whether the event listener exists\n\n## Signature\n\n```typescript\nfunction isEventListenerAlreadyExist(id: string): boolean;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nid\n\n</td><td>\n\nstring\n\n</td><td>\n\nEvent ID\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nboolean\n\nWhether the event listener exists\n\n## Example\n\n```javascript\nconst listenerId = '嘉立创示例_tab_exist';\n\n// 1. 注册前查询：应为 false\nconst before = eda.dmt_Event.isEventListenerAlreadyExist(listenerId);\nconsole.log('before:', before);\n\n// 2. 注册一个监听使 id 生效\neda.dmt_Event.addEditorTabEventListener(\n\tlistenerId,\n\t'toggle',\n\t() => {}\n);\n\n// 3. 注册后查询：应为 true\nconst after = eda.dmt_Event.isEventListenerAlreadyExist(listenerId);\nconsole.log('after:', after);\n\n// 4. 移除后查询：应回到 false\neda.dmt_Event.removeEventListener(listenerId);\nconst afterRemove = eda.dmt_Event.isEventListenerAlreadyExist(listenerId);\nconsole.log('afterRemove:', afterRemove);\n```\n\n### removeeventlistener\n\n# DMT\\_Event.removeEventListener() method\n\nRemove Event listener\n\n## Signature\n\n```typescript\nfunction removeEventListener(id: string): boolean;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nid\n\n</td><td>\n\nstring\n\n</td><td>\n\nEvent ID\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nboolean\n\nWhether Remove Specify event listener\n\n## Example\n\n```javascript\nconst listenerId = '嘉立创示例_tab_remove';\n\n// 1. 先注册一个监听作为移除目标\neda.dmt_Event.addEditorTabEventListener(\n\tlistenerId,\n\t'toggle',\n\t() => {}\n);\nconst registered = eda.dmt_Event.isEventListenerAlreadyExist(listenerId);\nconsole.log('registered:', registered);\n\n// 2. 移除该监听\nconst removed = eda.dmt_Event.removeEventListener(listenerId);\nconsole.log('removed:', removed);\n\n// 3. 回读确认已不存在\nconst existAfter = eda.dmt_Event.isEventListenerAlreadyExist(listenerId);\nconsole.log('existAfter:', existAfter);\n\n// 4. 重复移除同一 id：返回 false（本就未注册）\nconst removedAgain = eda.dmt_Event.removeEventListener(listenerId);\nconsole.log('removedAgain:', removedAgain);\n```\n\nFile v1.1.24:references/classes/DMT_Folder.md\n\n# DMT\\_Folder class\n\nDocument tree / Folder class\n\n## Signature\n\n```typescript\nclass DMT_Folder\n```\n\n## Methods\n\n<table><thead><tr><th>\n\nMethod\n\n</th><th>\n\nModifiers\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[createFolder(folderName, teamUuid, parentFolderUuid, description)](./DMT_Folder.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Create Folder\n\n</td></tr>\n<tr><td>\n\n[deleteFolder(teamUuid, folderUuid)](./DMT_Folder.md)\n\n</td><td>\n\n</td><td>\n\nDelete Folder\n\n</td></tr>\n<tr><td>\n\n[getAllFoldersUuid(teamUuid)](./DMT_Folder.md)\n\n</td><td>\n\n</td><td>\n\nGet the UUIDs of all folders\n\n</td></tr>\n<tr><td>\n\n[getFolderInfo(teamUuid, folderUuid)](./DMT_Folder.md)\n\n</td><td>\n\n</td><td>\n\nGet Folder detailed properties\n\n</td></tr>\n<tr><td>\n\n[modifyFolderDescription(teamUuid, folderUuid, description)](./DMT_Folder.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Modify Folder description\n\n</td></tr>\n<tr><td>\n\n[modifyFolderName(teamUuid, folderUuid, folderName)](./DMT_Folder.md)\n\n</td><td>\n\n</td><td>\n\nModify Folder name\n\n</td></tr>\n<tr><td>\n\n[moveFolderToFolder(teamUuid, folderUuid, parentFolderUuid)](./DMT_Folder.md)\n\n</td><td>\n\n</td><td>\n\nMove folder\n\n</td></tr>\n</tbody></table>\n\n---\n\n## 方法详情\n\n### createfolder\n\n# DMT\\_Folder.createFolder() method\n\n> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n\nCreate Folder\n\n## Signature\n\n```typescript\nfunction createFolder(\n\tfolderName: string,\n\tteamUuid: string,\n\tparentFolderUuid?: string,\n\tdescription?: string,\n): Promise<string | undefined>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nfolderName\n\n</td><td>\n\nstring\n\n</td><td>\n\nFolder name\n\n</td></tr>\n<tr><td>\n\nteamUuid\n\n</td><td>\n\nstring\n\n</td><td>\n\nTeam UUID\n\n</td></tr>\n<tr><td>\n\nparentFolderUuid\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Parent folder UUID. If not specified, it is the root folder\n\n</td></tr>\n<tr><td>\n\ndescription\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Folder description\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;string \\| undefined&gt;\n\nFolder UUID, if it is `undefined` creation fails\n\n## Example\n\n```javascript\n// 1. 取当前工程所属团队，作为文件夹的归属\nconst projectInfo = await eda.dmt_Project.getCurrentProjectInfo();\nconst teamUuid = projectInfo.teamUuid;\n\n// 2. 在团队根目录下创建测试文件夹\nconst folderUuid = await eda.dmt_Folder.createFolder('嘉立创示例_文件夹', teamUuid);\n\n// 3. 等待工作区同步后回读，确认文件夹已落地\nawait new Promise(r => setTimeout(r, 1500));\nconst folderInfo = await eda.dmt_Folder.getFolderInfo(teamUuid, folderUuid);\n\nconsole.log('folderUuid:', folderUuid);\nconsole.log('name:', folderInfo?.name);\nconsole.log('parentFolderUuid:', folderInfo?.parentFolderUuid === teamUuid ? '(团队根目录)' : folderInfo?.parentFolderUuid);\n```\n\n### deletefolder\n\n# DMT\\_Folder.deleteFolder() method\n\nDelete Folder\n\n## Signature\n\n```typescript\nfunction deleteFolder(teamUuid: string, folderUuid: string): Promise<boolean>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nteamUuid\n\n</td><td>\n\nstring\n\n</td><td>\n\nTeam UUID\n\n</td></tr>\n<tr><td>\n\nfolderUuid\n\n</td><td>\n\nstring\n\n</td><td>\n\nFolder UUID\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;boolean&gt;\n\nWhether the operation is successful\n\n## Example\n\n```javascript\n// 1. 取当前工程所属团队\nconst projectInfo = await eda.dmt_Project.getCurrentProjectInfo();\nconst teamUuid = projectInfo.teamUuid;\n\n// 2. 创建专用测试文件夹（避免动到用户现有目录）\nconst folderUuid = await eda.dmt_Folder.createFolder('嘉立创示例_待删除', teamUuid);\nawait ne\n\nArchive v1.1.23: 403 files, 667893 bytes\n\nFiles: format/index.md (7050b), format/pcb/3d.md (4645b), format/pcb/attr.md (2064b), format/pcb/common.md (9692b), format/pcb/component.md (3692b), format/pcb/dimension.md (2047b), format/pcb/index.md (1219b), format/pcb/obj.md (1436b), format/pcb/pad_via.md (4795b), format/pcb/panel.md (1598b), format/pcb/partition.md (1030b), format/pcb/primitive.md (4993b), format/pcb/rule.md (2334b), format/pcb/shape.md (12240b), format/pcb/text.md (1963b), format/project/blob.md (1349b), format/project/common.md (935b), format/project/group.md (1644b), format/project/index.md (808b), format/project/instance.md (1329b), format/project/meta.md (3551b), format/project/variant.md (611b), format/schematic/attr.md (2105b), format/schematic/common.md (1445b), format/schematic/component.md (6838b), format/schematic/index.md (940b), format/schematic/obj.md (1249b), format/schematic/pin.md (2308b), format/schematic/shape.md (6973b), format/schematic/structure.md (1553b), format/schematic/table.md (2449b), format/schematic/text.md (1295b), format/schematic/wire.md (4953b), guide/ancillary-projects.md (4311b), guide/ancillary-projects/pro-api-sdk.md (56b), guide/ancillary-projects/pro-api-types.md (92b), guide/error-handling.md (1238b), guide/extension-json.md (4928b), guide/extensions-marketplace.md (4227b), guide/how-to-start.md (15377b), guide/i18n.md (3049b), guide/index.md (951b), guide/inline-frame.md (1390b), guide/invoke-apis.md (4110b), guide/stability.md (3198b), package-lock.json (1967b), package.json (262b), README.md (4807b), README.zh-Hans.md (4454b), references/_index.md (34050b), references/_quick-reference.md (186195b), references/classes/DMT_Board.md (8459b), references/classes/DMT_EditorControl.md (33440b), references/classes/DMT_Event.md (6139b), references/classes/DMT_Folder.md (12495b), references/classes/DMT_Panel.md (9807b), references/classes/DMT_Pcb.md (10269b), references/classes/DMT_Project.md (9458b), references/classes/DMT_Schematic.md (35338b), references/classes/DMT_SelectControl.md (2512b), references/classes/DMT_Team.md (3322b), references/classes/DMT_Workspace.md (3732b), references/classes/EDA.md (12162b), references/classes/IPCB_ComplexPolygon.md (6044b), references/classes/IPCB_Polygon.md (3090b), references/classes/IPCB_PrimitiveArc.md (37653b), references/classes/IPCB_PrimitiveAttribute.md (64926b), references/classes/IPCB_PrimitiveComponent.md (52383b), references/classes/IPCB_PrimitiveComponentPad.md (8772b), references/classes/IPCB_PrimitiveDimension.md (27831b), references/classes/IPCB_PrimitiveFill.md (28795b), references/classes/IPCB_PrimitiveImage.md (31889b), references/classes/IPCB_PrimitiveLine.md (32186b), references/classes/IPCB_PrimitiveObject.md (39835b), references/classes/IPCB_PrimitivePad.md (61154b), references/classes/IPCB_PrimitivePolyline.md (26817b), references/classes/IPCB_PrimitivePour.md (42693b), references/classes/IPCB_PrimitivePoured.md (12285b), references/classes/IPCB_PrimitiveRegion.md (29858b), references/classes/IPCB_PrimitiveString.md (44413b) (+3 more)\n\nArchive v1.1.22: 403 files, 667934 bytes\n\nFiles: format/index.md (7050b), format/pcb/3d.md (4645b), format/pcb/attr.md (2064b), format/pcb/common.md (9692b), format/pcb/component.md (3692b), format/pcb/dimension.md (2047b), format/pcb/index.md (1219b), format/pcb/obj.md (1436b), format/pcb/pad_via.md (4795b), format/pcb/panel.md (1598b), format/pcb/partition.md (1030b), format/pcb/primitive.md (4993b), format/pcb/rule.md (2334b), format/pcb/shape.md (12240b), format/pcb/text.md (1963b), format/project/blob.md (1349b), format/project/common.md (935b), format/project/group.md (1644b), format/project/index.md (808b), format/project/instance.md (1329b), format/project/meta.md (3551b), format/project/variant.md (611b), format/schematic/attr.md (2105b), format/schematic/common.md (1445b), format/schematic/component.md (6838b), format/schematic/index.md (940b), format/schematic/obj.md (1249b), format/schematic/pin.md (2308b), format/schematic/shape.md (6973b), format/schematic/structure.md (1553b), format/schematic/table.md (2449b), format/schematic/text.md (1295b), format/schematic/wire.md (4953b), guide/ancillary-projects.md (4311b), guide/ancillary-projects/pro-api-sdk.md (56b), guide/ancillary-projects/pro-api-types.md (92b), guide/error-handling.md (1238b), guide/extension-json.md (4928b), guide/extensions-marketplace.md (4227b), guide/how-to-start.md (15377b), guide/i18n.md (3049b), guide/index.md (951b), guide/inline-frame.md (1390b), guide/invoke-apis.md (4110b), guide/stability.md (3198b), package-lock.json (1967b), package.json (262b), README.md (4807b), README.zh-Hans.md (4454b), references/_index.md (34050b), references/_quick-reference.md (186195b), references/classes/DMT_Board.md (8459b), references/classes/DMT_EditorControl.md (33440b), references/classes/DMT_Event.md (6139b), refe...","readmeExcerpt":"Skill: EasyEDA API Skill Owner: yanranxiaoxi Summary: EasyEDA Pro API skill for AI agents. Use when working with EasyEDA Pro EDA software, including PCB design, schematic editing, footprint/symbol management, and project operations. Supports live debugging in EasyEDA and EasyEDA extension development. Provides complete API reference (120+ classes, 62 enums, 70 interfaces), extension-development documentation, and a W","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"npm install"},{"language":"bash","snippet":"npm run build:docs"},{"language":"bash","snippet":"npm run server"},{"language":"bash","snippet":"curl http://localhost:49620/health"},{"language":"bash","snippet":"curl -X POST http://localhost:49620/execute \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"code\": \"return await eda.dmt_Project.getCurrentProjectInfo();\"}'"},{"language":"bash","snippet":"# Check EasyEDA connection status (assuming the service is on port 49620)\ncurl http://localhost:49620/health\n\n# Execute EasyEDA code\ncurl -X POST http://localhost:49620/execute \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"code\": \"return await eda.dmt_Project.getCurrentProjectInfo();\"}'"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"README.md","content":"[English](#) | [简体中文](./README.zh-Hans.md)\n\n# EasyEDA API Skill\n\nAn EasyEDA Pro API skill package for AI coding tools such as Claude Code, OpenCode, QwenCode, and any other tool that supports the [Agent Skills](https://agentskills.io/) standard.\n\nThis skill supports both online debugging of EasyEDA Pro through AI and extension development for EasyEDA Pro.\nWhen developing EasyEDA extensions, AI can use the extension-development documentation, API references, type information, usage examples, and bridge debugging capabilities provided by this skill to help with API lookup, code generation, and integration debugging.\nIf you want to analyze or modify EasyEDA document source files directly instead of operating through the API, this project also provides documentation for the source file formats.\n\n- 📚 **Structured API documentation** — Automatically builds hierarchical indexes from reference docs for fast AI lookup\n- 🧾 **Document source format specifications** — Explains project, schematic, and PCB source formats for direct source analysis and modification\n- 🔌 **WebSocket Bridge** — A Node.js server that bridges AI tools and the EasyEDA client\n- 🤖 **SKILL.md** — A complete skill instruction file\n\n## Quick Start\n\n### 1. Install dependencies\n\n```bash\nnpm install\n```\n\n### 2. Build API documentation\n\n```bash\nnpm run build:docs\n```\n\nThis reads the raw API documentation from the `reference/` directory and generates structured docs into the `docs/` directory.\n\n### 3. Start the WebSocket Bridge server\n\n```bash\nnpm run server\n```\n\nThe server automatically chooses an available port in the `49620-49629` range and waits for the EasyEDA client to connect.\n\n### 4. Connect from EasyEDA\n\nInstall the `run-api-gateway.eext` extension in EasyEDA. Download:\n\n- https://jlcext.com/item/oshwhub-official/run-api-gateway\n\nAfter the extension is loaded, it connects to the Bridge server automatically by scanning the port range and verifying the handshake.\n\n### 5. Use from an AI coding tool\n\nAI coding tools such as Claude Code, OpenCode, and QwenCode automatically read `SKILL.md` for instructions, then use the HTTP API to send code to EasyEDA:\n\n```bash\n# Check EasyEDA connection status (assuming the service is on port 49620)\ncurl http://localhost:49620/health\n\n# Execute EasyEDA code\ncurl -X POST http://localhost:49620/execute \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"code\": \"return await eda.dmt_Project.getCurrentProjectInfo();\"}'\n```\n\n## One-Command Packaging\n\n```bash\nnpm run pack\n```\n\nThis performs the following steps:\n1. Build API documentation (`docs/`)\n2. Package `SKILL.md`, documentation, and the server into `dist/easyeda-api/`\n3. Generate `dist/easyeda-api.zip` for upload\n\nIf the documentation has already been built, you can skip that step:\n\n```bash\nnpm run pack:fast\n```\n\n### Publish to ClawHub\n\n```bash\nnpx clawhub@latest publish dist/easyeda-api/\n```\n\nOr upload the zip file at https://clawhub.ai/upload\n\n## Architecture\n\n```\n┌──────────────┐   HTTP/WS     ┌────"},{"path":"references/_index.md","content":"# EasyEDA Pro API 文档索引\n\n> 此文档由构建脚本自动生成，供 AI 编程工具使用。\n> 全局变量 `eda` 是 EDA 类的实例，所有 API 通过 `eda.xxx` 调用。\n\n## 快速导航\n\n- [classes/](classes/) - 类文档（包含全部方法和属性）\n- [enums/](enums/) - 枚举文档\n- [interfaces/](interfaces/) - 接口文档（包含全部属性）\n- [types/](types/) - 类型别名文档\n\n## API 访问方式\n\n所有 API 通过全局变量 `eda` 访问，例如：\n- `eda.dmt_Board.createBoard()` — 文档树 / 板子管理\n- `eda.pcb_PrimitiveLine.create()` — PCB 直线图元创建\n- `eda.sys_WebSocket.register()` — WebSocket 连接注册\n- `eda.sch_PrimitiveComponent.create()` — 原理图器件创建\n\n---\n\n# 类 (Classes)\n\n| 类名 | 描述 | 备注 |\n|------|------|------|\n| [DMT_Board](classes/DMT_Board.md) | Document tree / Board management class |  |\n| [DMT_EditorControl](classes/DMT_EditorControl.md) | Document tree / Editor control class |  |\n| [DMT_Event](classes/DMT_Event.md) | Document tree / event class |  |\n| [DMT_Folder](classes/DMT_Folder.md) | Document tree / Folder class |  |\n| [DMT_Panel](classes/DMT_Panel.md) | Document tree / Panel management class |  |\n| [DMT_Pcb](classes/DMT_Pcb.md) | Document tree / PCB management class |  |\n| [DMT_Project](classes/DMT_Project.md) | Document tree / Project management class |  |\n| [DMT_Schematic](classes/DMT_Schematic.md) | Document tree / Schematic management class |  |\n| [DMT_SelectControl](classes/DMT_SelectControl.md) | Document tree / selection control class |  |\n| [DMT_Team](classes/DMT_Team.md) | Document tree / Team class |  |\n| [DMT_Workspace](classes/DMT_Workspace.md) | Document tree / Workspace class |  |\n| [EDA](classes/EDA.md) | EasyEDA Pro user API interface |  |\n| [IPCB_ComplexPolygon](classes/IPCB_ComplexPolygon.md) | Complex polygon |  |\n| [IPCB_Polygon](classes/IPCB_Polygon.md) | Single polygon |  |\n| [IPCB_PrimitiveArc](classes/IPCB_PrimitiveArc.md) | Arc line primitive |  |\n| [IPCB_PrimitiveAttribute](classes/IPCB_PrimitiveAttribute.md) | Property primitive |  |\n| [IPCB_PrimitiveComponent](classes/IPCB_PrimitiveComponent.md) | Device primitive |  |\n| [IPCB_PrimitiveComponentPad](classes/IPCB_PrimitiveComponentPad.md) | Device pad primitive |  |\n| [IPCB_PrimitiveDimension](classes/IPCB_PrimitiveDimension.md) | Dimension primitive |  |\n| [IPCB_PrimitiveFill](classes/IPCB_PrimitiveFill.md) | Fill primitive |  |\n| [IPCB_PrimitiveImage](classes/IPCB_PrimitiveImage.md) | Image primitive |  |\n| [IPCB_PrimitiveLine](classes/IPCB_PrimitiveLine.md) | Line primitive |  |\n| [IPCB_PrimitiveObject](classes/IPCB_PrimitiveObject.md) | Binary embedded object primitive |  |\n| [IPCB_PrimitivePad](classes/IPCB_PrimitivePad.md) | Pad primitive |  |\n| [IPCB_PrimitivePolyline](classes/IPCB_PrimitivePolyline.md) | Polyline primitive |  |\n| [IPCB_PrimitivePour](classes/IPCB_PrimitivePour.md) | Copper border primitive |  |\n| [IPCB_PrimitivePoured](classes/IPCB_PrimitivePoured.md) | Copper fill primitive |  |\n| [IPCB_PrimitiveRegion](classes/IPCB_PrimitiveRegion.md) | Region primitive |  |\n| [IPCB_PrimitiveString](classes/IPCB_PrimitiveString.md) | Text primitive |  |\n| [IPCB_PrimitiveVia](classes/IPCB_PrimitiveVia.md) | Via primitive | "},{"path":"references/_quick-reference.md","content":"# EasyEDA API 快速参考\n\n> 此文件提供所有类及其方法/属性的签名一览，便于 AI 快速查找。\n> 详细参数和返回值请查看 docs/classes/<ClassName>.md\n\n## 全局入口\n\n```typescript\ndeclare const eda: EDA;\n```\n\nEDA 类的属性即为各模块的入口，如 `eda.dmt_Board`, `eda.pcb_PrimitiveLine` 等。\n\n---\n\n## DMT_Board\n\nDocument tree / Board management class\n\n```typescript\nclass DMT_Board\n```\n\n- **copyboard**: `function copyBoard(sourceBoardName: string): Promise<string | undefined>;`\n- **createboard**: `function createBoard(schematicUuid?: string, pcbUuid?: string): Promise<string | undefined>;`\n- **deleteboard**: `function deleteBoard(boardName: string): Promise<boolean>;`\n- **getallboardsinfo**: `function getAllBoardsInfo(): Promise<Array<IDMT_BoardItem>>;`\n- **getboardinfo**: `function getBoardInfo(boardName: string): Promise<IDMT_BoardItem | undefined>;`\n- **getcurrentboardinfo**: `function getCurrentBoardInfo(): Promise<IDMT_BoardItem | undefined>;`\n- **modifyboardname**: `function modifyBoardName(originalBoardName: string, boardName: string): Promise<boolean>;`\n\n---\n\n## DMT_EditorControl\n\nDocument tree / Editor control class\n\n```typescript\nclass DMT_EditorControl\n```\n\n- **activatedocument**: `function activateDocument(tabId: string): Promise<boolean>;`\n- **activatesplitscreen**: `function activateSplitScreen(splitScreenId: string): Promise<boolean>;`\n- **closedocument**: `function closeDocument(tabId: string): Promise<boolean>;`\n- **createsplitscreen**: `function createSplitScreen( \tsplitScreenType: EDMT_EditorSplitScreenDirection, \ttabId: string, ): Promise<{ sourceSplitScreenId: string; newSplitScreenId: string } | undefined>;`\n- **generateindicatormarkers**: `function generateIndicatorMarkers( \tmarkers: Array<IDMT_IndicatorMarkerShape>, \tcolor?: { r: number; g: number; b: number; alpha: number }, \tlineWidth?: number, \tzoom?: boolean, \ttabId?: string, ): Promise<boolean>;`\n- **getcurrentrenderedareaimage**: `function getCurrentRenderedAreaImage(tabId?: string): Promise<Blob | undefined>;`\n- **getsplitscreenidbytabid**: `function getSplitScreenIdByTabId(tabId: string): Promise<string | undefined>;`\n- **getsplitscreentree**: `function getSplitScreenTree(): Promise<IDMT_EditorSplitScreenItem | undefined>;`\n- **gettabsbysplitscreenid**: `function getTabsBySplitScreenId(splitScreenId: string): Promise<Array<IDMT_EditorTabItem>>;`\n- **mergealldocumentfromsplitscreen**: `function mergeAllDocumentFromSplitScreen(): Promise<boolean>;`\n- **movedocumenttosplitscreen**: `function moveDocumentToSplitScreen(tabId: string, splitScreenId: string): Promise<boolean>;`\n- **opendocument**: `function openDocument(documentUuid: string, splitScreenId?: string): Promise<string | undefined>;`\n- **openlibrarydocument**: `function openLibraryDocument( \tlibraryUuid: string, \tlibraryType: ELIB_LibraryType.SYMBOL | ELIB_LibraryType.FOOTPRINT, \tuuid: string, \tsplitScreenId?: string, ): Promise<string | undefined>;`\n- **removeindicatormarkers**: `function removeIndicatorMarkers(tabId?: string): Promise<boolean>;`\n- **tilealldocumenttosplitscreen**: `functi"},{"path":"references/classes/DMT_Board.md","content":"# DMT\\_Board class\n\nDocument tree / Board management class\n\n## Signature\n\n```typescript\nclass DMT_Board\n```\n\n## Remarks\n\nOperations related to board management in the currently open project\n\n## Methods\n\n<table><thead><tr><th>\n\nMethod\n\n</th><th>\n\nModifiers\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[copyBoard(sourceBoardName)](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\nCopy Board\n\n</td></tr>\n<tr><td>\n\n[createBoard(schematicUuid, pcbUuid)](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Create Board\n\n</td></tr>\n<tr><td>\n\n[deleteBoard(boardName)](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\nDelete Board\n\n</td></tr>\n<tr><td>\n\n[getAllBoardsInfo()](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\nGet all in the project board detailed properties of\n\n</td></tr>\n<tr><td>\n\n[getBoardInfo(boardName)](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\nGet detailed properties of Board\n\n</td></tr>\n<tr><td>\n\n[getCurrentBoardInfo()](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\nGet detailed properties of Current board\n\n</td></tr>\n<tr><td>\n\n[modifyBoardName(originalBoardName, boardName)](./DMT_Board.md)\n\n</td><td>\n\n</td><td>\n\nModify Board name\n\n</td></tr>\n</tbody></table>\n\n---\n\n## 方法详情\n\n### copyboard\n\n# DMT\\_Board.copyBoard() method\n\nCopy Board\n\n## Signature\n\n```typescript\nfunction copyBoard(sourceBoardName: string): Promise<string | undefined>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nsourceBoardName\n\n</td><td>\n\nstring\n\n</td><td>\n\nSource board name\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;string \\| undefined&gt;\n\nNew board name, if it is `undefined` the copy fails\n\n## Example\n\n```javascript\n// 1. 取第一块板子的名称作为复制源\nconst boards = await eda.dmt_Board.getAllBoardsInfo();\nconst sourceName = boards[0].name;\n\n// 2. 复制板子，返回新板子名称\nconst newBoardName = await eda.dmt_Board.copyBoard(sourceName);\nconsole.log('source:', sourceName);\nconsole.log('copy:', newBoardName);\n\n// 3. 删除复制的板子，保持工程整洁\nconst deleted = await eda.dmt_Board.deleteBoard(newBoardName);\nconsole.log('deleted:', deleted);\n```\n\n### createboard\n\n# DMT\\_Board.createBoard() method\n\n> This API is provided as a beta preview for developers and may change based on feedback that we receive. Do not use this API in a production environment.\n\nCreate Board\n\n## Signature\n\n```typescript\nfunction createBoard(schematicUuid?: string, pcbUuid?: string): Promise<string | undefined>;\n```\n\n## Parameters\n\n<table><thead><tr><th>\n\nParameter\n\n</th><th>\n\nType\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\nschematicUuid\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Associated schematic UUID\n\n</td></tr>\n<tr><td>\n\npcbUuid\n\n</td><td>\n\nstring\n\n</td><td>\n\n_(Optional)_ Associated PCB UUID\n\n</td></tr>\n</tbody></table>\n\n## Returns\n\nPromise&lt;string \\| undefined&gt;\n\nBoard name, if it is `undefined` creation fails\n\n## Example\n\n```javascript\n// 1. 无参调用，由系统自动创建一对原理图/PCB 文档并关联\nconst boardName = await eda.dmt_Board.createBoard();\nconsole.log('create:', boardN"},{"path":"references/classes/DMT_EditorControl.md","content":"# DMT\\_EditorControl class\n\nDocument tree / Editor control class\n\n## Signature\n\n```typescript\nclass DMT_EditorControl\n```\n\n## Remarks\n\nHere the editor control is based on the sheets under the currently open engineering design. Any other `documentUuid` will be considered a non-existent document page\n\n## Methods\n\n<table><thead><tr><th>\n\nMethod\n\n</th><th>\n\nModifiers\n\n</th><th>\n\nDescription\n\n</th></tr></thead>\n<tbody><tr><td>\n\n[activateDocument(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nActivate a document\n\n</td></tr>\n<tr><td>\n\n[activateSplitScreen(splitScreenId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nActivate a split screen\n\n</td></tr>\n<tr><td>\n\n[closeDocument(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nClose document\n\n</td></tr>\n<tr><td>\n\n[createSplitScreen(splitScreenType, tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nCreate Split screen\n\n</td></tr>\n<tr><td>\n\n[generateIndicatorMarkers(markers, color, lineWidth, zoom, tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Generate indicator markers\n\n</td></tr>\n<tr><td>\n\n[getCurrentRenderedAreaImage(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Get the canvas rendering region image\n\n</td></tr>\n<tr><td>\n\n[getSplitScreenIdByTabId(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nUse tab ID get split screen ID\n\n</td></tr>\n<tr><td>\n\n[getSplitScreenTree()](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nGet the editor split screen property tree\n\n</td></tr>\n<tr><td>\n\n[getTabsBySplitScreenId(splitScreenId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nGet all tabs under the specified split screen ID\n\n</td></tr>\n<tr><td>\n\n[mergeAllDocumentFromSplitScreen()](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nMerge all split screens\n\n</td></tr>\n<tr><td>\n\n[moveDocumentToSplitScreen(tabId, splitScreenId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nMove a document to the specified split screen\n\n</td></tr>\n<tr><td>\n\n[openDocument(documentUuid, splitScreenId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nOpen document\n\n</td></tr>\n<tr><td>\n\n[openLibraryDocument(libraryUuid, libraryType, uuid, splitScreenId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Open library symbol, footprint document\n\n</td></tr>\n<tr><td>\n\n[removeIndicatorMarkers(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Remove indicator markers\n\n</td></tr>\n<tr><td>\n\n[tileAllDocumentToSplitScreen()](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\nTile all documents\n\n</td></tr>\n<tr><td>\n\n[zoomTo(x, y, scaleRatio, tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Zoom to coordinates\n\n</td></tr>\n<tr><td>\n\n[zoomToAllPrimitives(tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Zoom to all primitives (fit all)\n\n</td></tr>\n<tr><td>\n\n[zoomToRegion(left, right, top, bottom, tabId)](./DMT_EditorControl.md)\n\n</td><td>\n\n</td><td>\n\n**_(BETA)_** Zoom to region\n\n</td></tr>\n<tr><td>\n\n[zoomToSelectedPrimitives(tabId)]"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1563,"uniquenessScore":41,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T02:17:36.930Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T02:17:36.930Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T05:25:45.379Z","emptyReason":null},"items":[{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-10T18:48:31.762Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}