还剩39页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
二次开发项目实例分析在本节中,我们将通过具体的项目实例来分析如何在中进行二次开发这些实Altium Designer例将涵盖从简单到复杂的多种应用场景,帮助读者理解二次开发的实际操作和实现过程我们将重点讨论以下几个方面:项目需求分析
1.开发环境的搭建
2.脚本开发
3.插件开发
4.调用
5.API用户界面定制
6.自动化任务
7.需求分析在进行二次开发之前,首先要明确项目的需求需求分析是任何开发项目的起点,它决定了后续开发的方向和具体实现步骤以下是一个具体的项目需求分析示例项目背景假设你是一家电子设计公司的工程师,公司需要一个自动化工具来生成设计报告,报告中PCB包括元件列表、网络列表、层数配置等信息目前,这些信息需要手动导出并整理成报告,耗时且容易出错公司希望你能利用的二次开发功能,实现一键生成报告的功能,Altium Designer提高设计效率需求分析生成元件列表需要从原理图和设计文件中提取所有元件的信息,包括名称、值、
1.PCB封装、位置等生成网络列表需要从原理图中提取所有网络的信息,包括网络名称、
2.连接点等height:600,webPreferences:{preload:path.join_dirname,preload.js};mainWindow.loadFileindex.htmr;app.whenReady.then={createWindow;app.onCactivate,={if BrowserWindow.getAIIWindows.length===0{createWindow;};};app.onCwindow-all-closed,={if process.platform!==darwin{app.quit;};创建界面HTML创建一个文件,例如
1.HTML index.htmlo/-index.html!DOCTYPE htmlhtmlheadmetacharset=UTF-8titleReport Generator/title/headbodyhlReport Generator/hl生成元件列|表〈/〉button id=generateBOM”button生成网络歹表〈/〉button id=generateNetList”U button生成层数酉己置〉button id=generateLayerConfig/button〉生成设计规则〉button id=generateDesignRules/buttonscript src=renderer.js/script/body/html编写前端代码JavaScript创建一个文件,例如
1.JavaScript renderer.jso//renderer.jsconst{ipcRenderer}=require electron;document.getElementByldCgenerateBOM j.addEventListenerCclick,={ipcRenderer.sendCgenerateBOM;};document.getElementByldCgenerateNetListJ.addEventListenerCclick1,={ipcRenderer.sendgenerateNetList;};document.getElementByldCgenerateLayerConfigyaddEventListenerCclick,={ipcRenderer.sendgenerateLayerConfig;};document.getElementByldCgenerateDesignRulesJ.addEventListenerf click,={ipcRenderer.sendgenerateDesignRules;};ipcRenderer.onreportGenerated,event,message={alertmessage;};编写后端代码JavaScript创建一个文件,例如
2.JavaScript preload.jso//preload.jsconst{contextBridge,ipcRenderer}=requireelectron;contextBridge.exposelnMainWorldCapi*,{generateBOM:={ipcRenderer.sendgenerateBOM;},generateNetList:={ipcRenderer.sendgenerateNetList;},generateLayerConfig:={ipcRenderer.sendgenerateLayerConfig;},generateDesignRules:={ipcRenderer.sendgenerateDesignRules;};修改以处理后端逻辑
3.main.js//main Jsconst{app,Browserwindow,dialog,ipcMain}=require electron;const path=requirepath;const altium=requireCaltium-scripting;;const XLSX=requirexlsxfunction generateBOM{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const components=schematic.getComponents;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Name,Value,Footprint,Position]];components.forEachcomponent={const row=[component.getName,component.getValue,component.getFootprint/${component.getX}mm,${component.getY}mm];XLSX.utils.sheet__add_rowworksheet,row;};XLSX.utils.book_append_sheetworkbook,worksheet,Components;const filePath=dialog.showSaveDialogSync{defaultPath:BOM.xlsx,filters:[{name:Excel Files,extensions:[xlsx1]}]};if filePath{XLSX.writeFileworkbook,filePath;,元件歹表已生成!;mainWindow.webContents.sendreportGeneratedUfunction generateNetList{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const nets=schematic.getNets;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Net Name,Nodes]];nets.forEachnet={const nodes=net.getNodes.mapnode=node.getNameOJ.joinC,;const row=[net.getName,nodes];XLSX.utils.sheet_add_rowworksheet,row;};XLSX.utils.book_append_sheetworkbook,worksheet,Nets;const filePath=dialog.showSaveDialogSync{defaultPath:NetList.xlsx,filters:[{name:Excel Files extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;网络歹表已生成!;mainWindow.webContents.sendreportGeneratecT JJfunction generateLayerConfig{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const layerStack=pcb.getLayerStack;const layers=layerStack.getLayers;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Layer Name,Layer Type,Material1,Thickness]];layers.forEachlayer={const row=[layer.getNameO,layer.getType,layer.getMaterial,${layer.getThickness}mm];XLSX.utils.sheet__add__rowworksheet,row;};XLSX.utils.book_append_sheetworkbook,worksheet,Layer Config;const filePath=dialog.showSaveDialogSync{defaultPath:LayerConfig.xlsx,filters:[{name:Ex celFiles,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;层数酉己置已生成!;mainWindow.webContents.sendCreportGenerated,function generateDesignRules{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const designRules=pcb.getDesignRules;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Rule Name,Rule Type,Rule Value]];designRules.forEachrule={const row=[rule.getName,rule.getType,rule.getValue];XLSX.utils.sheet_add_rowworksheet,row;};用户界面定制XLSX.utils.book_append_sheetworkbook##
6.用户界面定制可以提高插件的可用性和用户体验以下是一个简单的用户界面定制示例,使用框架创建一个简单的对话框Electron###安装Electron在项目文件夹中安装
1.Electronbashnpm installelectron创建一个主文件,例如
2.Electron main.jso//main.jsconst{app,Browserwindow,dialog,ipcMain}=require electron;const path=requirepath;const altium=requirealtium-scripting;const XLSX=requireCxIsx1;let mainWindow;function createWindow{mainWindow=new BrowserWindow{width:800,height:600,webPreferences:{preload:path.join_dirname,preload.js};main Window,load Fileindex.htmr;app.whenReady.then={createWindow;app.onactivate,={if BrowserWindow.getAIIWindows.length===0{createWindow;};};app.onCwindow-all-closed,={if process.platform!==darwin1{app.quit;};处理生成报告的请求//ipcMain.onCgenerateBOM,event={generateBOM;};ipcMain.ongenerateNetList,event={generateNetList;};ipcMain.ongenerateLayerConfig,event={generateLayerConfig;};ipcMain.ongenerateDesignRules,event={generateDesignRules;};function generateBOM{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const components=schematic.getComponents;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Name,Value,Footprint,Position]];components.forEachcomponent={const row=[component.getName,component.getValue,component.getFootprint,${component.getX}mm,${component.getY}mm];XLSX.utils.sheet_add_rowworksheet,row;};XLSX.utils.book_append_sheetworkbook,worksheet,Components;const filePath=dialog.showSaveDialogSync{defaultPath:BOM.xlsx,filters:[{name:Excel Files,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;元件歹表已生成!’;mainWindow.webContents.sendreportGeneratecT JJ}function generateNetList{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const nets=schematic.getNets;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Net Name1,Nodes]];nets.forEachfnet={const nodes=net.getNodes.mapnode=node.getNameOJ.joinC,;const row=[net.getName,nodes];XLSX.utils.sheet_add_rowworksheet,row;};XLSX.utils.book__append_sheetworkbook,worksheet,Nets;const filePath=dialog.showSaveDialogSync{defaultPath:^etList.xlsx,filters:[{name:Excel Files\extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;网络歹表已生成!,;mainWindow.webComents.sendreportGeneratecTJ Ufunction generateLayerConfig{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const layerStack=pcb.getLayerStack;const layers=layerStack.getLayers;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Layer Name,Layer Type,Material,Thickness1]];layers.forEachlayer={const row=[layer.getName,layer.getType,layer.getMaterial,${layer.getThickness}mm];XLSX.utils.sheet_add_rowworksheet,row;};XLSX.utils.book_append_sheetworkbook,worksheet,Layer Config;const filePath=dialog.showSaveDialogSync{defaultPath:LayerConfig.xlsx,filters:[{name:Ex celFiles,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;层数酉己置已生成!;mainWindow.webContems.sendreportGeneratecTfunction generateDesignRules{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const designRules=pcb.getDesignRules;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Rule Name,Rule Type,Rule Value]];designRules.forEachrule={const row=[rule.getName,rule.getType,rule.getValue];XLSX.utils.sheet_add_rowworksheet,row;};XLSX.utils.book_append_sheetworkbook,worksheet,Design Rules;const filePath=dialog.showSaveDialogSync{defaultPath:DesignRules.xlsx,filters:[{name:*Excel Files,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;设计规贝已生成!,;mainWindow.webContents.sendreportGeneratecTJ1J创建界面HTML创建一个文件,例如
1.HTML index.htmlo/-index.html-!DOCTYPE htmlhtmlheadmetacharset=,UTF-8titleReport Generator/title/headbodyhlReport Generator/hl生成元件歹表〈/〉button id=generateBOM”J button生成网络歹表〈/〉button id=generateNetList J button生成层数配置〉button id=generateLayerConfig/button〉生成设计规贝button id=generateDesignRules k/buttonscript src=renderer.jsx/script/body/html编写前端代码JavaScript创建一个文件,例如
1.JavaScript renderer.jso//rendererjsconst{ipcRenderer}=require electron;document.getElementByldCgenerateBOM j.addEventListenerCclick,={ipcRenderer.sendgenerateBOM;};document.getElementByldCgenerateNetListyaddEventListenerCclick,={ipcRenderer.sendgenerateNetList;};document.getElementByldCgenerateLayerConfigyaddEventListenerCclick,={ipcRenderer.sendgenerateLayerConfig;};document.getElementByldCgenerateDesignRulesJ.addEventListenerf click,={ipcRenderer.sendgenerateDesignRules;};生成层数配置信息需要从设计文件中提取层数配置信息,包括层数、层类型、
3.PCB材料等报告格式报告需要以或格式输出,便于查看和打印
4.Excel PDF用户界面需要一个简单的用户界面,方便工程师选择生成报告的类型和路径
5.开发环境的搭建
2.为了进行二次开发,我们需要搭建一个合适的开发环境支持多种脚本语言,Altium Designer包括、、等以下是一个使用进行二次开发的环境搭建示例JavaScript DelphiC#JavaScript安装Node.js访问官网下载并安装
1.Node.js Node.jSo验证安装是否成功
2.node-vnpm-v安装插件Altium Scripting打开进入
1.Altium Designer,Extensions-Install Extensiono搜索并安装插件
2.Altium Scripting重启确保插件生效
3.Altium Designer,安装依赖库创建一个项目文件夹,例如
1.C:\AltiumProjects\ReportGeneratoro在项目文件夹中初始化一个项目
2.Node.jscd C:\AltiumProjects\ReportGenerator npminit-y安装必要的依赖库,例如用于生成文件
3.xlsx Excelnpminstall xlsxipcRenderer.onreportGenerated,event,message={alertmessage;};编写后端代码JavaScript创建一个文件,例如
1.JavaScript preload.jso//preload.jsconst{contextBridge,ipcRenderer}=requireelectron;contextBridge.exposelnMainWorld api{,generateBOM:={ipcRenderer.sendCgenerateBOM;},generateNetList:={ipcRenderer.sendgenerateNetList;},generateLayerConfig:={ipcRenderer.sendgenerateLayerConfig;,generateDesignRules:={ipcRenderer.sendgenerateDesignRules;];__________________________________________________________________________________________________________________________________________________________________________________运行应用Electron在项目文件夹中创建一个启动脚本,例如
1.start.js//start.jsconst{app}=requireelectron;requireC./main.js;修改文件,添加启动脚本:
2.packagejsonname:report-generator,version:
1.
0.0,main1:start.js,scripts:{start:electron,,dependencies:{altium-scripting:A
0.
1.0,xlsx:,A
0.
18.5}运行应用
3.Electron npmstart.自动化任务7自动化任务是二次开发的重要应用之一,通过编写脚本和插件可以实现多个重复性操作的自动化以下是一个自动化任务的示例,包括生成元件列表、网络列表、层数配置和设计规则,并将它们整合到一个报告中创建自动化脚本创建一个文件,例如
1.JavaScript generateReport.jso//generateReport.jsconst altium=requireCaltium-scripting;const XLSX=requireCxIsx1;const{dialog}=requireelectron.remote;function generateBOM{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const components=schematic.getComponents;const worksheet=XLSX.utils.aoa_to_sheet[[Name,Value1,Footprint,Position]];components.forEachcomponent={const row=[component.getName,component.getValue,component.getFootprint,${component.getX}mm,${component.getY}mm;]XLSX.utils.sheet_add_rowworksheet,row;return worksheet;function generateNetList{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const nets=schematic.getNets;const worksheet=XLSX.utils.aoa_to_sheet[[Net Name,Nodes]];nets.forEachnet={const nodes=net.getNodes.mapnode=node.getNameOJ.joinC,;const row=[net.getName,nodes];XLSX.utils.sheet_add_rowworksheet,row;};return worksheet;function generateLayerConfig{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const layerStack=pcb.getLayerStack;const layers=layerStack.getLayers;const worksheet=XLSX.utils.aoa_to_sheet[[Layer Name,layer Type,Material,Thickness1]];layers.forEachlayer={const row=[layer.getName,layer.getType,layer.getMaterial,${layer.getThickness}mm];XLSX.utils.sheet__add__rowworksheet,row;};return worksheet;function generateDesignRules{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const designRules=pcb.getDesignRules;const worksheet=XLSX.utils.aoa_to_sheet[[Rule Name,Rule Type,Rule Value]];designRules.forEachrule={const row=[rule.getName,rule.getType,rule.getValue];XLSX.utils.sheet_add_rowworksheet,row;};return worksheet;function generateCompleteReport{const workbook=XLSX.utils.book_new;const bomSheet=generateBOM;const netListSheet=generateNetList;const layerConfigSheet=generateLayerConfig;const designRulesSheet=generateDesignRules;XLSX.utils.book_append_sheetworkbook,bomSheet,Components;XLSX.utils.book_append_sheetworkbook,netListSheet,Nets;XLSX.utils.book_append_sheetworkbook,layerConfigSheet,Layer Config;XLSX.utils.book_append_sheetworkbook,designRulesSheet,Design Rules;const filePath=dialog.showSaveDialogSync{defaultPath:CompleteReport.xlsx,filters:[{nam e:Excel Files,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;完整报告已生成!1;注册插件命令//altium.ui.registerCommandGenerate CompleteReport,generateCompleteReport;添加自动化任务到用户界面修改文件,添加生成完整报告的按钮
1.index.html/-index.html-!DOCTYPE htmlhtmlheadmetacharset=,UTF-8titleReport Generator/title/headbodyhlReport Generator/hl生成元件歹表〈/〉button id=generateBOM”J button生成网络歹表〈/〉button id=generateNetList Jbutton生成层数配置〉button id=generateLayerConfig/button〉生成设计规贝button id=generateDesignRules k/button生成完整报告〈/〉button id=generateCompleteReport buttonscriptsrc=renderer.jsx/script/body/html修改文件,添加生成完整报告的事件处理
2.renderer.js//rendererjsconst{ipcRenderer}=require electron;document.getElementByldCgenerateBOM j.addEventListenerCclick1,={ipcRenderer.sendCgenerateBOM;};document.getElementByldCgenerateNetListJ.addEventListenerCclick1,={ipcRenderer.sendgenerateNetList;};document.getElementByldCgenerateLayerConfigj.addEventListenerCclick,={ipcRenderer.sendgenerateLayerConfig;};document.getElementByldgenerateDesignRules.addEventListener click,={ipcRenderer.sendgenerateDesignRules;};document.getElementByldCgenerateCompleteReportJ.addEventListenerCclick,={ipcRenderer.sendgenerateCompleteReport;};ipcRenderer.onreportGenerated,event,message={alertmessage;};修改文件,添加生成完整报告的事件处理-
3.main.js//main Jsconst{app,Browserwindow,dialog,ipcMain}=require electron;const path=requirepath;const altium=requireCaltium-scripting;const XLSX=requirexlsx;let mainWindow;function createWindow{mainWindow=new BrowserWindow{width:800,height:600,webPreferences:{preload:path.join_dirname,preload.js};mainWindow.loadFileindex.htmr;app.whenReady.then={createWindow;app.on activate,={if BrowserWindow.getAIIWindows.length===0{createWindow;};};app.onwindow-all-closed,={if process.platform!==darwin{app.quit;};处理生成报告的请求//ipcMain.on generateBOM,event={generateBOM;};ipcMain.on generateNetList,event={generateNetList;};ipcMain.ongenerateLayerConfig\event={generateLayerConfig;};ipcMain.onCgenerateDesignRules1,event={generateDesignRules;};ipcMain.on generateCompleteReport\event={generateCompleteReport;};function generateBOM{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const components=schematic.getComponents;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Name,Value,Footprint,Position]];components.forEachcomponent={const row=[component.getName,component.getValue,component.getFootprint${component.getX}mm,/${component.getY}mm];XLSX.utils.sheet__add_rowworksheet row;zXLSX.utils.book__append_sheetworkbook,worksheet,Components;const filePath=dialog.showSaveDialogSync{defaultPath:BOM.xlsx,filters:[{name:Excel Files,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;匕件歹表已生成!;mainWindow.webContents.sendfreportGeneratedJ;/Ufunction generateNetList{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const nets=schematic.getNets;const workbook=XLSX.utils.book__new;const worksheet=XLSX.utils.aoa_to_sheet[[Net Name,Nodes]];nets.forEachnet={const nodes=net.getNodes.mapnode=node.getName.join\;const row=[net.getName,nodes];XLSX.utils.sheet_add_rowworksheet,row;};XLSX.utils.book_append_sheetworkbook,worksheet,Nets;const filePath=dialog.showSaveDialogSync{defaultPath:NetList.xlsx,filters:[{name:Excel Files\extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;网络歹]表已生成!,;mainWindow.webContents.sendreportGenerat:ecrj}function generateLayerConfig{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const layerStack=pcb.getLayerStack;const layers=layerStack.getLayers;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Layer Name,Layer Type1,Material1,Thickness1]];layers.forEachlayer={const row=[layer.getNameO,layer.getType,layer.getMaterial,${layer.getThickness}mm];XLSX.utils.sheet_add_rowworksheet,row;};XLSX.utils.book_append_sheetworkbook,worksheet,Layer Config;const filePath=dialog.showSaveDialogSync{defaultPath:LayerConfig.xlsx,filters:[{name:Ex celFiles,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;层数酉己置已生成!,;mainWindow.webContents.sendreportGeneratecT,function generateDesignRules{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const designRules=pcb.getDesignRules;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Rule Name,Rule Type,Rule Value]];designRules.forEachrule={const row=[rule.getName,rule.getType,rule.getValue];XLSX.utils.sheet_add_rowworksheet,row;};XLSX.utils.book__append_sheetworkbook,worksheet,Design Rules;const filePath=dialog.showSaveDialogSync{defaultPath:DesignRules.xlsx,filters:[{name:E xcelFiles,extensions:[xlsx]}]};if filePath{.用户界面定制XLS##6用户界面定制可以提高插件的可用性和用户体验以下是一个简单的用户界面定制示例,使用框架创建一个简单的对话框Electron###安装Electron在项目文件夹中安装
1.Electronbashnpm installelectron创建一个主文件,例如
2.Electron main.jso//main Jsconst{app,Browserwindow,dialog,ipcMain}=require electron;const path=requirepath;const altium=requireCaltium-scripting1;;const XLSX=requirexlsxlet mainWindow;function createWindow{mainWindow=new BrowserWindow{width:800,height:600,web Preferences:{preload:path.join_dirname,preload.js;}mainWindow.loadFileindex.htmr;app.whenReady.then={createWindow;app.onCactivate,={if BrowserWindow.getAIIWindows.length===0{createWindow;脚本开发
3.脚本开发是二次开发的基础,通过编写脚本可以实现自动化的任务以下是一个生成元件列表的脚本示例JavaScript生成元件列表创建一个文件,例如
1.JavaScript generateB0M.jso//generateBOM.jsconst altium=requireCaltium-scripting;;const XLSX=requirexlsx〃获取当前打开的项目const project=altium.getProjectManager.getCurrentProject;〃获取原理图文件const schematic=project.getDocuments
[0];〃获取元件列表const components=schematic.getComponents;创建一个工作簿//Excelconst workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Name,Value,Footprint,Position]];/〃遍历元件并填充数据components.forEachcomponent={const row=[component.getName,component.getValue,component.getFootprint,${component.getX}mm,${component.getY}mm];XLSX.utils.sheet_add_rowworksheet,row;};将工作表添加到工作簿//XLSX.utils.book_append_sheetworkbook,worksheet,Components;保存文件//Excel};};app.onCwindow-all-closed,={if process.platform!==darwin{app.quit;};〃处理生成报告的请求ipcMain.ongenerateBOM,event={generateBOM;};ipcMain.ongenerateNetList,event={generateNetList;};ipcMain.onCgenerateLayerConfig,event={generateLayerConfig;};ipcMain.onCgenerateDesignRules,event={generateDesignRules;;}function generateBOM{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const components=schematic.getComponents;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[,Name,Value,Footprint,Position]];components.forEachcomponent={const row=[component.getName,component.getValue,component.getFootprint,${component.getX}mm,${component.getY}mm;]XLSX.utils.sheet_add_rowworksheet,row;};XLSX.utils.book__append_sheetworkbook,worksheet,Components;const filePath=dialog.showSaveDialogSync{defaultPath:BOM.xlsx,filters:[{name:Excel Files,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;元件歹表已生成!;mainWindow.webContents.sendCreportGeneratecT,Jfunction generateNetList{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const nets=schematic.getNets;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Net Name,Nodes1]];nets.forEachnet={const nodes=net.getNodes.mapnode=node.getName.join,;const row=[net.getName,nodes];XLSX.utils.sheet_add_rowworksheet,row;};XLSX.utils.book_append_sheetworkbook,worksheet,Nets;const filePath=dialog.showSaveDialogSync{defaultPath:NetList.xlsx,filters:[{name:Excel Files,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;网络歹表已生成!;mainWindow.webContents.sendreportGeneratecT Jfunction generateLayerConfig{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const layerStack=pcb.getLayerStack;const layers=layerStack.getLayers;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Layer Name1,layer Type,Material,Thickness]];layers.forEachlayer={const row=[layer.getNameO,layer.getType,layer.getMaterial,${layer.getThickness}mm];XLSX.utils.sheet_add_rowworksheet,row;};XLSX.utils.book_append_sheetworkbook worksheet,Layer Config;zconst filePath=dialog.showSaveDialogSync{defaultPath:LayerConfig.xlsx,filters:[{name:Ex celFiles,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;层数酉己置已生成!;mainWindow.webContents.sendTeportGenerated,function generateDesignRules{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const designRules=pcb.getDesignRules;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Rule Name,Rule Type,Rule Value]];designRules.forEachrule={const row=[rule.getName,rule.getTypezrule.getValue];XLSX.utils.sheet__add_rowworksheet row;/};XLSX.utils.book_append_sheetworkbook,worksheet,Design Rules1;const filePath=dialog.showSaveDialogSync{defaultPath:DesignRules.xlsx,filters:[{name:Excel Files,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;设计规贝!已生成!;mainWindow.webContents.sendreportGeneratedJ J}创建界面HTML创建一个文件,例如
1.HTML index.htmlo/-index,html-!DOCTYPE htmlhtmlheadmetacharset=UTF-8titleReport Generator/title/headbodyhlReport Generator/hl生成元件歹!表〈/〉button id=generateBOM”Jbutton二生成网络歹表button idgenerateNetList J/button〉生成层数配置〉button id=generateLayerConfig/button生成设计规则〈/〉button id=generateDesignRules”button〉生成完整报告〈/〉button id=generateCompleteReport buttonscriptsrc=renderer.js/script/body/html编写前端代码JavaScript创建一个文件,例如
1.JavaScript renderer.jso//renderer.jsconst{ipcRenderer}=require electron;document.getElementByldCgenerateBOM j.addEventListenerCclick,={ipcRenderer.sendgenerateBOM;};document.getElementByldCgenerateNetListyaddEventListenerCclick,={ipcRenderer.sendCgenerateNetList;};document.getElementByldCgenerateLayerConfigJ.addEventListenerCclick,={ipcRenderer.sendgenerateLayerConfig;};document.getElementByldgenerateDesignRules.addEventListener click,={ipcRenderer.sendgenerateDesignRules;};document.getElementByldCgenerateCompleteReportj.addEventListenerCclick1,={ipcRenderer.sendCgenerateCompleteReport1;};ipcRenderer.onreportGenerated,event,message={alertmessage;};编写后端代码JavaScript创建一个文件,例如
1.JavaScript preload.jso//preload.jsconst{contextBridge,ipcRenderer}=requireelectron;contextBridge.exposelnMainWorldCapi,{generateBOM:={ipcRenderer.sendgenerateBOM;},generateNetList:={ipcRenderer.sendgenerateNetList;},generateLayerConfig:={ipcRenderer.sendgenerateLayerConfig;generateDesignRules:={ipcRenderer.sendgenerateDesignRules;},generateCompleteReport:={ipcRenderer.sendCgenerateCompleteReport;};运彳亍应用Electron在项目文件夹中创建一个启动脚本,例如
1.start.js//start.jsconst{app}=requireelectron;require./main.js;修改文件,添加启动脚本:
2.packageJsonname:report-generator,version:
1.
0.0,main:start.js,scripts:{start:electron},,dependencies:{altium-scripting:A
0.
1.0,xlsx:,AH}运行应用:
3.Electron npmstart
7.自动化任务是二次开发的重要应用之一,通过编写脚本和插件可以实现多个重复性操作的自动化以下是一个自动化任务的示例,包括生成元件列表、网络列表、层数配置和设计规则,并将它们整合到一个报告中创建自动化脚本创建一个文件,例如
1.JavaScript generateReport.jso//generateReport.jsconst altium=requirealtium-scripting;const XLSX=requirexlsx;const{dialog}=requireelectron.remote;function generateBOM{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const components=schematic.getComponents;const worksheet=XLSX.utils.aoa^^sheetftfName,Value*,Footprint,Position]];components.forEachcomponent={const row=[component.getName,component.getValue,component.getFootprint,${component.getX}mm,${component.getY}mm];XLSX.utils.sheet_add_rowworksheet,row;};return worksheet;function generateNetList{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const nets=schematic.getNets;const worksheet=XLSX.utils.aoa_to_sheet[[Net Name,Nodes]];nets.forEachnet={const nodes=net.getNodes.mapnode=node.getName.joinJ;const row=[net.getName,nodes];XLSX.utils.sheet_add_rowworksheet,row;};return worksheet;function generateLayerConfig{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const layerStack=pcb.getLayerStack;const layers=layerStack.getLayers;const worksheet=XLSX.utils.aoa_to_sheet[[Layer Name1,Layer Type,Material,Thickness1]];layers.forEachlayer={const row=[layer.getNameO,layer.getType,layer.getMaterial,${layer.getThickness}mm];XLSX.utils.sheet_add_rowworksheet,row;};return worksheet;function generateDesignRules{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const designRules=pcb.getDesignRules;const worksheet=XLSX.utils.aoa_to_sheet[[Rule Name,Rule Type,Rule Value1]];designRules.forEachrule={const row=[rule.getName,rule.getType,rule.getValue];XLSX.utils.sheet_add_rowworksheet,row;};return worksheet;function generateCompleteReport{const workbook=XLSX.utils.book_new;const bomSheet=generateBOM;const netListSheet=generateNetList;const layerConfigSheet=generateLayerConfig;const designRulesSheet=generateDesignRules;XLSX.utils.book_append_sheetworkbook bomSheet,Components;/XLSX.utils.book_append_sheetworkbook,netListSheet,Nets;XLSX.utils.book_append_sheetworkbook,layerConfigSheet,Layer Config;XLSX.utils.book_append_sheetworkbook,designRulesSheet,Design Rules;const filePath=dialog.showSaveDialogSync{defaultPath:CompleteReport.xlsx,filters:[{nam e:Excel Files,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;完整报告已生成!;〃注册插件命令altium.ui.registerCommandGenerate CompleteReport,generateCompleteReport;添加自动化任务到用户界面修改文件,添加生成完整报告的按钮
1.index.html/-index.html-!DOCTYPE htmlhtmlheadmetacharset=UTF8titleReport Generator/title/headbodyhlReport Generator/hl生成元件列|表〈/〉button id=generateBOM”button生成网络歹表〈/〉button id=generateNetList Ubutton生成层数西己置〈/〉button id=generateLayerConfig button〉生成设计规则〈/〉button id=generateDesignRules button生成完整报告〈/〉button id=generateCompleteReport buttonscriptsrc=renderer.jsx/script/body/html修改文件,添加生成完整报告的事件处理
2.renderer.js//rendererjsconst{ipcRenderer}=require electron;document.getElementByldCgenerateBOM j.addEventListenerf click,={ipcRenderer.sendgenerateBOM;};日document.get ementByldgenerateNetList.addEventListenerfclick={ipcRenderer.sendgenerateNetList;};document.getElementByldCgenerateLayerConfigj.addEventListenerCclick,={ipcRenderer.sendgenerateLayerConfig;};document.getElementByldgenerateDesignRules.addEventListenerclick,={ipcRenderer.sendgenerateDesign Rules;};document.getElementByldCgenerateCompleteReportyaddEventListenerCclick,={ipcRenderer.sendCgenerateCompleteReport;};ipcRenderer.onCreportGenerated,event,message={alertmessage;};.修改文件,添加生成完整报告的事件处理3main.js^Javascript//main.js const{app,Browserwindow,dialog,ipcMain}=requirezelectron,;const path=requirepath;const altium=requirezaltium-scripting;const XLSX=requirexlsx;let mainWindow;function createWindow{mainWindow=new BrowserWindow{width:800,height:600,webPreferences:{preload:path.joindirname,zpreload.jsz}};mainWindow.loadFileindex.htmr;}app.whenReady.then={createWindow;app.onCactivate1,={if BrowserWindow.getAIIWindows.length===0{createWindow;const filePath=CiWAItiumProjectsWReportGeneratorWBOM.xlsx1;XLSX.writeFileworkbook,filePath;元件列表已生成!console.log1;运行脚本
2.node generateBOM.js生成网络列表创建一个文件,例如
1.JavaScript generateNetList.jso//generateNetList.jsconst altium=requireCaltium-scripting;const XLSX=requireCxIsx1;〃获取当前打开的项目const project=altium.getProjectManager.getCurrentProject;获取原理图文件//const schematic=project.getDocuments
[0];〃获取网络列表const nets=schematic.getNets;//创建一个Excel工作簿const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Net Name,Nodes]];遍历网络并填充数据//nets.forEachnet={const nodes=net.getNodes.mapnode=node.getName.join,;const row=[net.getName,nodes];XLSX.utils.sheet_add_rowworksheet,row;;}〃将工作表添加到工作簿XLSX.utils.book_append_sheetworkbook,worksheet,Nets;保存文件//Excelconst filePath=C:\\AltiumProjects\\ReportGenerator\\NetList.xlsx;XLSX.writeFileworkbook,filePath;};};app.onzwindow-all-closed,={if process.platform!==darwin{app.quit;}};///处理生成报告的请求ipcMain,ongenerateBOM[event={generateBOM;};ipcMain.onzgenerateNetList\event={generateNetList;};ipcMain.onzgenerateLayerConfig\event={gene rateLaye rConf ig;};ipcMain.onzgenerateDesignRules,,event={generateDesignRules;};ipcMain.onzgenerateCompleteReport,,event={generateCompleteReport;};functiongenerateBOM{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];constcomponents=schematic.getComponents;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Name\Value,Footprint*,Position]];components.forEachcomponent={const row=[component.getName,component.getValueO,;component.getFootprint,${component.getX}mm,${component.getY}mm];XLSX.utils.sheet_add_rowworksheet row;}zXLSX.utils.book__append_sheetworkbook,worksheet,Components;const filePath=dialog.showSaveDialogSync{defaultPath:BOM.xlsx,filters:[{name:Excel Files,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;元件歹表已生成!;mainWindow.webContents.sendreportGeneratecTJ U}function generateNetList{const project=altium.getProjectManager.getCurrentProject;constschematic=project.getDocuments
[0];const nets=schematic.getNets;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Net Name,Nodes]];nets.forEachnet={const nodes=net.getNodes.mapnode=node.getName.join,;const row=[net.getName,nodes];XLSX.utils.sheet_add_rowworksheet row;z;}XLSX.utils.book_append_sheetworkbook,worksheet,Nets;const filePath=dialog.showSaveDialogSync{defaultPath:NetList.xlsx,filters:[{name:Excel Files,extensions:[xlsx]}]};if filePath{网络歹XLSX.writeFileworkbook,filePath;mainWindow.webContents.sendreportGeneratecT JU表已生成!,;}functiongenerateLayerConfig{const project=altium.getProjectManager.getCurrentProject;const pcb=project.getDocuments[l];const layerStack=pcb.getLayerStack;const layers=layerStack.getLayers;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Layer Name,layer Type,Material,Thickness]];layers.forEachlayer={const row=[layer.getName,layer.getTypeO,layer.getMaterial,x${layer.getThickness}mm];XLSX.utils.sheet_add_rowworksheet row;z;};XLSX.utils.book_append_sheetworkbook,worksheet,layer Configconst filePath=dialog.showSaveDialogSync{defaultPath:LayerConfig.xlsx,filters:[{name:Exce IFiles,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;层数再己置已生成!,;mainWindow.webContents.sendreportGeneratecTJ functiongenerateDesignRules{const projectaltium.getProjectManager.getCurrentProject;const pcbproject.getDocuments[l];const designRules=pcb.getDesignRules;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Rule Name*,Rule Type,Rule Value]];designRules.forEachrule={;const row=[rule.getName,rule.getType,rule.getValue];XLSX.utils.sheet_add_rowworksheet,row;}X网络列表已生成!console.log1;运行脚本
2.node generateNetList.js插件开发
4.插件开发可以将二次开发的功能整合到的用户界面中,使用户可以更方便地使Altium Designer用这些功能以下是一个生成报告插件的开发示例创建插件项目打开进入
1.Altium Designer,Extensions-Scripting-Create NewScripto选择作为脚本语言,创建一个新的脚本项目
2.JavaScript编写插件代码在项目中创建一个文件,例如
1.JavaScript reportGeneratorPlugin.jso//reportGeneratorPluginjsconst altium=require,altium-scripting,;;const XLSX=requirexlsxconst{dialog}=requireelectron.remote;function generateBOM{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const components=schematic.getComponents;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Name,,Value*,Footprint,Position]];components.forEachcomponent={const row=[component.getName,component.getValue,component.getFootprint,${component.getX}mm,${component.getY}mm];XLSX.utils.sheet_add_rowworksheet,row;};XLSX.utils.book_append_sheetworkbook worksheet,Components;/const filePath=dialog.showSaveDialogSync{defaultPath:BOM.xlsx,filters:[{name:Excel Files\extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;元件列表已生成!,;function generateNetList{const project=altium.getProjectManager.getCurrentProject;const schematic=project.getDocuments
[0];const nets=schematic.getNets;const workbook=XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Net Name1,Nodes]];nets.forEachnet={const nodes=net.getNodes.mapnode=node.getName.join,;const row=[net.getName nodes];/XLSX.utils.sheet_add_rowworksheet,row;;}XLSX.utils.book_append_sheetworkbook,worksheet,Nets;constfilePath=dialog.showSaveDialogSync{defaultPath:NetList.xlsx,filters:[{name:Excel Files,extensions:[xlsx]}]};if filePath{XLSX.writeFileworkbook,filePath;网络列表列生成!1;〃注册插件命令altium.ui.registerCommandGenerate BOM,generateBOM;altium.ui.registerCommandCGenerate NetList,generateNetList;将插件代码添加到的脚本项目中
2.Altium Designer配置插件在中,进入
1.Altium DesignerTools-External Scripting-Configure Scripts
0.添加插件路径,例如2C:\AltiumProjects\ReportGenerator\reportGeneratorPlugin.jSo测试插件重启
1.Altium Designero在命令栏中输入或测试插件功能
2.Generate BOMGenerate NetList,调用
5.API提供了丰富的可以通过这些实现更复杂的功能以下是一些常用的Altium DesignerAPI,API API调用示例获取层数配置PCB
1.创建一个JavaScript文件,例如getLayerConfig.js//getLayerConfig.jsoconst altium=requireCaltium-scripting;const XLSX=requireCxIsx1;//获取当前打开的项目const project=altium.getProjectManager.getCurrentProject;〃获取文件PCBconst pcb=project.getDocuments[l];〃获取层数配置const layerStack=pcb.getLayerStack;const layers=layerStack.getLayers;//创建一个Excel工作簿const workbook二XLSX.utils.book_new;const worksheet=XLSX.utils.aoa_to_sheet[[Layer Name,Layer Type,Material,Thickness]];〃遍历层数配置并填充数据layers.forEachlayer={const row=[layer.getName,layer.getType,layer.getMaterial,${layer.getThickness}mm];XLSX.utils.sheet_add_rowworksheet,row;};〃将工作表添加到工作簿XLSX.utils.book_append_sheetworkbook,worksheet,Layer Config;〃保存文件Excelconst filePath=CrWAItiumProjectsWReportGeneratorWLayerConfig.xlsx;XLSX.writeFileworkbook,filePath;层数配置已生成!console.logf1;运行脚本
2.node getLayerConfig.js获取设计规则PCB创建一个文件,例如
1.JavaScript getDesignRules.jso//getDesignRules.jsconst altium=requirealtium-scripting;;const XLSX=requirexlsx〃获取当前打开的项目const project=altium.getProjectManager.getCurrentProject;获取文件//PCBconst pcb=project.getDocuments[l];〃获取设计规则const designRules=pcb.getDesignRules;创建一个工作簿//Excelconst workbook=XLSX.utils.book__new;const worksheet=XLSX.utils.aoa_to_sheet[[Rule Name,Rule Type,Rule Value]];〃遍历设计规则并填充数据designRules.forEachrule={const row=[rule.getName,rule.getType,rule.getValue];XLSX.utils.sheet_add_rowworksheet,row;};〃将工作表添加到工作簿XLSX.utils.book_append_sheetworkbook,worksheet,Design Rules;〃保存文件Excelconst filePath=CrWAItiumProjectsWReportGeneratorWDesignRules.xlsx;XLSX.writeFileworkbook,filePath;设计规则已生成!console.logf1;运行脚本
2.node getDesignRules.js用户界面定制
6.用户界面定制可以提高插件的可用性和用户体验以下是一个简单的用户界面定制示例,使用框架创建一个简单的对话框Electron安装Electron在项目文件夹中安装
1.Electronnpm installelectron创建一个主文件,例如
2.Electron main.js//main Jsconst{app,Browserwindow,dialog}=requireelectron;const path=requirepath;const altium=requireCaltium-scripting;function createWindow{const mainWindow=new BrowserWindow{width:800,。
个人认证
优秀文档
获得点赞 0