EDA365电子论坛网
标题:
allegro导出DXF源码
[打印本页]
作者:
亦久忆旧
时间:
2025-6-26 23:58
标题:
allegro导出DXF源码
刚开始学习skill,一边看函数,一边写代码,写了1个导出DXF的skill,给出源码,欢迎大家试用,不过无法导出过孔孔径,因为还不会写怎么给过孔画shape,有会的人可以优化一下,分享出来
;导出DXF文件
;axlCmdRegister("dxfExport_TB" 'Export_DXF)
procedure(Export_DXF()
let((topStatus bottomStatus topFile bottomFile)
; 获取设计信息
topFile = strcat(getWorkingDir() "/" axlCurrentDesign() "_TOP.dxf")
bottomFile = strcat(getWorkingDir() "/" axlCurrentDesign() "_BOTTOM.dxf")
; 导出TOP层DXF:命名规则:CLASS/SUBCLASS/DXF_DXF_LAYER
topStatus = dxf_export_layer("TOP" topFile '("PIN/TOP/PIN_TOP"
"REF DES/SILKSCREEN_TOP/RD_SILKSCREEN_TOP"
"PACKAGE GEOMETRY/SILKSCREEN_TOP/PG_SILKSCREEN_TOP"
"BOARD GEOMETRY/SILKSCREEN_TOP/BG_SILKSCREEN_TOP"
"BOARD GEOMETRY/Drillhole/BG_Drillhole"
"BOARD GEOMETRY/OUTLINE/BG_OUTLINE"
"BOARD GEOMETRY/DESIGN_OUTLINE/BG_DESIGN_OUTLINE"
)
);end dxf_export_layer
; 导出BOTTOM层DXF
bottomStatus = dxf_export_layer("BOTTOM" bottomFile '("PIN/BOTTOM/PIN_BOTTOM"
"REF DES/SILKSCREEN_BOTTOM/RD_SILKSCREEN_BOTTOM"
"PACKAGE GEOMETRY/SILKSCREEN_BOTTOM/PG_SILKSCREEN_BOTTOM"
"BOARD GEOMETRY/SILKSCREEN_BOTTOM/BG_SILKSCREEN_BOTTOM"
"BOARD GEOMETRY/Drillhole/BG_Drillhole"
"BOARD GEOMETRY/OUTLINE/BG_OUTLINE"
"BOARD GEOMETRY/DESIGN_OUTLINE/BG_DESIGN_OUTLINE"
)
);end dxf_export_layer
; 显示完成信息
if(topStatus && bottomStatus
then
axlUIWPrint(nil "DXF export completed successfully!")
else
axlUIWPrint(nil "DXF export completed with warnings!")
);end if
; 确保显示正确的文件路径
axlUIWPrint(nil strcat("TOP DXF: " topFile))
axlUIWPrint(nil strcat("BOTTOM DXF: " bottomFile))
);end let
);end procedure
;构建导出命令
procedure(dxf_export_layer(layerName dxfFileName layerList)
let(()
; 创建临时CNV文件
cnvFile = strcat(layerName ".cnv")
P = outfile(cnvFile "w")
; 写入CNV文件头
fprintf(P "#This is the Layer Conversion File used for\n")
fprintf(P "#importing DXF data into Allegro/APD.\n\n")
fprintf(P "#CLASS! SUBCLASS! DXF_LAYER!\n\n")
; 按层分类输出
fprintf(P "PIN!\n")
foreach(subclass layerList
when(rexMatchp("^PIN/" subclass)
subclassName = cadr(parseString(subclass "/"))
dxf_layer_name = caddr(parseString(subclass "/"))
fprintf(P " %s! %s!\n\n" subclassName dxf_layer_name)
);end when
);end foreach
fprintf(P "REF DES!\n")
foreach(subclass layerList
when(rexMatchp("^REF DES/" subclass)
subclassName = cadr(parseString(subclass "/"))
dxf_layer_name = caddr(parseString(subclass "/"))
fprintf(P " %s! %s!\n\n" subclassName dxf_layer_name)
);end when
);end foreach
fprintf(P "PACKAGE GEOMETRY!\n")
foreach(subclass layerList
when(rexMatchp("^PACKAGE GEOMETRY/" subclass)
subclassName = cadr(parseString(subclass "/"))
dxf_layer_name = caddr(parseString(subclass "/"))
fprintf(P " %s! %s!\n\n" subclassName dxf_layer_name)
);end when
);end foreach
fprintf(P "BOARD GEOMETRY!\n")
foreach(subclass layerList
when(rexMatchp("^BOARD GEOMETRY/" subclass)
subclassName = cadr(parseString(subclass "/"))
dxf_layer_name = caddr(parseString(subclass "/"))
fprintf(P " %s! %s!\n\n" subclassName dxf_layer_name)
);end when
);end foreach
fprintf(P "#END\n")
close(P)
;临时CNV文件创建结束
;**********************构建命令,调用a2dxf.exe导出函数****************************************
; 创建日志文件名
logFile = strcat(layerName "_Drc.log")
; 构建a2dxf.exe的命令
cmdGet = sprintf(nil "a2dxf.exe -u %s -a 5 -c l %s %s %s" car(axlDBGetDesignUnits()) cnvFile dxfFileName axlCurrentDesign())
DXFstatus = ipcBatchProcess(cmdGet "" logFile)
sleep(1) ; 等待1秒让文件系统完成写入,在删除临时文件
when(isFile(dxfFileName) errset(deleteFile(cnvFile)))
when(isFile(dxfFileName) errset(deleteFile(logFile)))
/************************************************************************
; 检查文件是否创建 - 添加延迟确保文件系统更新
sleep(2) ; 等待1秒让文件系统完成写入
success = isFile(dxfFileName)
if(success then
; 清理临时文件
when(isFile(cnvFile) deleteFile(cnvFile));end when
when(isFile(logFile) deleteFile(logFile));end when
t ; 返回成功状态
else
; 导出失败:保留临时文件并打印日志内容
axlUIWPrint(nil sprintf(nil "ERROR: Failed to create %s" dxfFileName))
axlUIWPrint(nil "Temporary files preserved for debugging:")
axlUIWPrint(nil sprintf(nil " Config file: %s" cnvFile))
axlUIWPrint(nil sprintf(nil " Log file: %s" logFile))
; 读取并显示日志文件内容
if(isFile(logFile) then
axlUIWPrint(nil "Log file contents:")
logContent = infile(logFile)
while(gets(line logContent)
axlUIWPrint(nil line)
);end while
close(logContent)
);end if
nil ; 返回失败状态
);end if
************************************************************************/
);end let
);end procedure
复制代码
作者:
亦久忆旧
时间:
2025-6-27 00:01
希望有大佬可以加上如何画过孔孔径,我现在正在学习,没有思路,现在只会看函数,用一些基本的函数,大部分函数都还没用到,连最基本的dbid也不了解
作者:
亦久忆旧
时间:
2025-6-27 00:02
这个代码不知道为啥在365上面比较乱
作者:
zc333
时间:
2025-6-27 08:47
把文件包发上来
作者:
w_w
时间:
2025-6-27 09:14
能写出来给自己用 就已经很不错了 继续加油
钻孔的画法我记得论坛里面也有,大概方法是获取焊盘钻孔的大小和中心坐标,然后创建一个专用层,在每个焊盘
上画等大的圆圈。出dxf的时候把这层也显示一起出就行了
作者:
学无止境```
时间:
2025-6-27 12:41
w_w 发表于 2025-6-27 09:14
能写出来给自己用 就已经很不错了 继续加油
钻孔的画法我记得论坛里面也有,大概方法是获取焊盘钻孔的大 ...
听着很简单,但是我不会啊,论坛上有1个开源的代码,但是我运行后有错误
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2