找回密码
 注册
关于网站域名变更的通知
查看: 70|回复: 5
打印 上一主题 下一主题

allegro导出DXF源码

[复制链接]
  • TA的每日心情
    开心
    2024-9-17 15:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
     楼主| 发表于 2025-6-26 23:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    刚开始学习skill,一边看函数,一边写代码,写了1个导出DXF的skill,给出源码,欢迎大家试用,不过无法导出过孔孔径,因为还不会写怎么给过孔画shape,有会的人可以优化一下,分享出来
    1. ;导出DXF文件
    2. ;axlCmdRegister("dxfExport_TB" 'Export_DXF)
    3. procedure(Export_DXF()
    4.     let((topStatus bottomStatus topFile bottomFile)
    5.         ; 获取设计信息
    6.         topFile = strcat(getWorkingDir() "/" axlCurrentDesign() "_TOP.dxf")
    7.         bottomFile = strcat(getWorkingDir() "/" axlCurrentDesign() "_BOTTOM.dxf")

    8.    
    9.         ; 导出TOP层DXF:命名规则:CLASS/SUBCLASS/DXF_DXF_LAYER
    10.         topStatus = dxf_export_layer("TOP" topFile '("PIN/TOP/PIN_TOP"
    11.                                                       "REF DES/SILKSCREEN_TOP/RD_SILKSCREEN_TOP"
    12.                                                       "PACKAGE GEOMETRY/SILKSCREEN_TOP/PG_SILKSCREEN_TOP"
    13.                                                       "BOARD GEOMETRY/SILKSCREEN_TOP/BG_SILKSCREEN_TOP"
    14.                                                                                                           "BOARD GEOMETRY/Drillhole/BG_Drillhole"
    15.                                                       "BOARD GEOMETRY/OUTLINE/BG_OUTLINE"
    16.                                                       "BOARD GEOMETRY/DESIGN_OUTLINE/BG_DESIGN_OUTLINE"
    17.                                                                               )
    18.                                      );end dxf_export_layer
    19.    
    20.         ; 导出BOTTOM层DXF
    21.         bottomStatus = dxf_export_layer("BOTTOM"   bottomFile  '("PIN/BOTTOM/PIN_BOTTOM"
    22.                                                                   "REF DES/SILKSCREEN_BOTTOM/RD_SILKSCREEN_BOTTOM"
    23.                                                                   "PACKAGE GEOMETRY/SILKSCREEN_BOTTOM/PG_SILKSCREEN_BOTTOM"
    24.                                                                   "BOARD GEOMETRY/SILKSCREEN_BOTTOM/BG_SILKSCREEN_BOTTOM"
    25.                                                                                                                                   "BOARD GEOMETRY/Drillhole/BG_Drillhole"
    26.                                                                   "BOARD GEOMETRY/OUTLINE/BG_OUTLINE"
    27.                                                                   "BOARD GEOMETRY/DESIGN_OUTLINE/BG_DESIGN_OUTLINE"
    28.                                                                                          )
    29.                                         );end dxf_export_layer
    30.    
    31.     ; 显示完成信息
    32.     if(topStatus && bottomStatus
    33.         then
    34.         axlUIWPrint(nil "DXF export completed successfully!")
    35.     else
    36.         axlUIWPrint(nil "DXF export completed with warnings!")
    37.     );end if
    38.     ; 确保显示正确的文件路径
    39.     axlUIWPrint(nil strcat("TOP DXF: " topFile))
    40.     axlUIWPrint(nil strcat("BOTTOM DXF: " bottomFile))
    41.   );end let
    42. );end procedure
    43. ;构建导出命令
    44. procedure(dxf_export_layer(layerName dxfFileName layerList)
    45.     let(()
    46.         ; 创建临时CNV文件
    47.         cnvFile = strcat(layerName ".cnv")
    48.         P = outfile(cnvFile "w")
    49.         
    50.         ; 写入CNV文件头
    51.                 fprintf(P "#This is the Layer Conversion File used for\n")
    52.             fprintf(P "#importing DXF data into allegro/APD.\n\n")
    53.         fprintf(P "#CLASS!            SUBCLASS!                DXF_LAYER!\n\n")
    54.         
    55.         ; 按层分类输出
    56.                 fprintf(P "PIN!\n")
    57.         foreach(subclass layerList
    58.             when(rexMatchp("^PIN/" subclass)
    59.                 subclassName = cadr(parseString(subclass "/"))
    60.                                 dxf_layer_name = caddr(parseString(subclass "/"))
    61.                 fprintf(P "                         %s!                        %s!\n\n" subclassName dxf_layer_name)
    62.             );end when
    63.         );end foreach
    64.         fprintf(P "REF DES!\n")
    65.         foreach(subclass layerList
    66.             when(rexMatchp("^REF DES/" subclass)
    67.                 subclassName = cadr(parseString(subclass "/"))
    68.                                 dxf_layer_name = caddr(parseString(subclass "/"))
    69.                 fprintf(P "                   %s!         %s!\n\n" subclassName dxf_layer_name)
    70.             );end when
    71.         );end foreach
    72.         fprintf(P "PACKAGE GEOMETRY!\n")
    73.         foreach(subclass layerList
    74.             when(rexMatchp("^PACKAGE GEOMETRY/" subclass)
    75.                 subclassName = cadr(parseString(subclass "/"))
    76.                                 dxf_layer_name = caddr(parseString(subclass "/"))
    77.                 fprintf(P "                   %s!           %s!\n\n" subclassName dxf_layer_name)
    78.             );end when
    79.         );end foreach
    80.         fprintf(P "BOARD GEOMETRY!\n")   
    81.         foreach(subclass layerList
    82.             when(rexMatchp("^BOARD GEOMETRY/" subclass)
    83.                 subclassName = cadr(parseString(subclass "/"))
    84.                                 dxf_layer_name = caddr(parseString(subclass "/"))
    85.                 fprintf(P "                   %s!          %s!\n\n" subclassName dxf_layer_name)
    86.             );end when
    87.         );end foreach
    88.                 fprintf(P "#END\n")
    89.         close(P)
    90.         ;临时CNV文件创建结束
    91.        
    92.        
    93. ;**********************构建命令,调用a2dxf.exe导出函数****************************************

    94.     ; 创建日志文件名
    95.     logFile = strcat(layerName "_Drc.log")
    96.     ; 构建a2dxf.exe的命令
    97.     cmdGet = sprintf(nil "a2dxf.exe -u %s -a 5 -c l %s %s %s" car(axlDBGetDesignUnits()) cnvFile dxfFileName axlCurrentDesign())
    98.         DXFstatus = ipcBatchProcess(cmdGet "" logFile)

    99.     sleep(1) ; 等待1秒让文件系统完成写入,在删除临时文件
    100.         when(isFile(dxfFileName) errset(deleteFile(cnvFile)))
    101.         when(isFile(dxfFileName) errset(deleteFile(logFile)))

    102. /************************************************************************
    103.     ; 检查文件是否创建 - 添加延迟确保文件系统更新
    104.     sleep(2) ; 等待1秒让文件系统完成写入
    105.     success = isFile(dxfFileName)
    106.    
    107.     if(success then
    108.         ; 清理临时文件
    109.         when(isFile(cnvFile) deleteFile(cnvFile));end when
    110.         when(isFile(logFile) deleteFile(logFile));end when
    111.         t ; 返回成功状态
    112.     else
    113.         ; 导出失败:保留临时文件并打印日志内容
    114.         axlUIWPrint(nil sprintf(nil "ERROR: Failed to create %s" dxfFileName))
    115.         axlUIWPrint(nil "Temporary files preserved for debugging:")
    116.         axlUIWPrint(nil sprintf(nil "  Config file: %s" cnvFile))
    117.         axlUIWPrint(nil sprintf(nil "  Log file: %s" logFile))
    118.         
    119.         ; 读取并显示日志文件内容
    120.         if(isFile(logFile) then
    121.             axlUIWPrint(nil "Log file contents:")
    122.             logContent = infile(logFile)
    123.             while(gets(line logContent)
    124.                 axlUIWPrint(nil line)
    125.             );end while
    126.             close(logContent)
    127.         );end if
    128.         nil ; 返回失败状态
    129.     );end if
    130. ************************************************************************/
    131.   );end let
    132. );end procedure
    复制代码


  • TA的每日心情
    开心
    2024-9-17 15:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    2#
     楼主| 发表于 2025-6-27 00:01 | 只看该作者
    希望有大佬可以加上如何画过孔孔径,我现在正在学习,没有思路,现在只会看函数,用一些基本的函数,大部分函数都还没用到,连最基本的dbid也不了解
  • TA的每日心情
    开心
    2024-9-17 15:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    3#
     楼主| 发表于 2025-6-27 00:02 | 只看该作者
    这个代码不知道为啥在365上面比较乱
  • TA的每日心情
    奋斗
    2025-6-27 15:11
  • 签到天数: 627 天

    [LV.9]以坛为家II

    4#
    发表于 2025-6-27 08:47 | 只看该作者
    把文件包发上来
  • TA的每日心情

    2021-1-21 15:57
  • 签到天数: 121 天

    [LV.7]常住居民III

    5#
    发表于 2025-6-27 09:14 | 只看该作者
    能写出来给自己用  就已经很不错了  继续加油
    钻孔的画法我记得论坛里面也有,大概方法是获取焊盘钻孔的大小和中心坐标,然后创建一个专用层,在每个焊盘
    上画等大的圆圈。出dxf的时候把这层也显示一起出就行了

    点评

    听着很简单,但是我不会啊,论坛上有1个开源的代码,但是我运行后有错误  详情 回复 发表于 2025-6-27 12:41
  • TA的每日心情
    开心
    2024-9-6 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
    发表于 2025-6-27 12:41 | 只看该作者
    w_w 发表于 2025-6-27 09:14
    能写出来给自己用  就已经很不错了  继续加油
    钻孔的画法我记得论坛里面也有,大概方法是获取焊盘钻孔的大 ...

    听着很简单,但是我不会啊,论坛上有1个开源的代码,但是我运行后有错误
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-27 17:14 , Processed in 0.078125 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表