EDA365电子论坛网

标题: allegro导出DXF源码 [打印本页]

作者: 亦久忆旧    时间: 2025-6-26 23:58
标题: allegro导出DXF源码
刚开始学习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
复制代码



作者: 亦久忆旧    时间: 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