搜索
bottom↓
回复: 15

AD利用script和PIK文件快速布局

[复制链接]

出0入0汤圆

发表于 2019-10-9 10:32:57 | 显示全部楼层 |阅读模式
应用场景:
1.之前已经布局过的电路单元,再次画板时希望复用;
2.同一电路模块有非常多的通道,布局相同,不需要每个通道重复布局;
使用方法:
选中已经布局好的器件,运行script,输入偏移坐标,输入替换的器件标号,得到新的PIK文件,
选择用PIK文件place,未布局的器件现在已经布局完毕了。由于AD的布线文件可以直接复制,
故布局相同情况下,再利用本文脚本可以快速高效进行layout。
参考:
1.AD的DelphiScript例程;
2.LC的PnPcustom脚本.




另外贴个前期用python实现的类似功能的代码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

# add author here
__author__ = 'spcm'

import os
import sys
import re

if __name__ == "__main__":

    file_name = input("输入坐标文件:> ")[:-4]
    file_pick_old = open(file_name + '.txt',mode='r')
    content = file_pick_old.readlines()
    print(type(content))
    component_num = len(content) - 3
    print("器件数量:%d"%component_num)

    file_pick_new = open(file_name + '.PIK',mode='w')
    file_pick_new.writelines(content[0])   
    file_pick_new.writelines(content[1])   

    offset_x = float(input("输入偏移坐标X="))
    offset_y = float(input("输入偏移坐标Y="))

    designator_old = input("输入需要替换的器件序号=").upper()
    designator_new = input("输入替换之后的器件序号=").upper()
    while designator_old != 'Q' and designator_new != 'Q':
        for index in range(2,component_num):
            info_old = re.split(" +", content[index])
            designator = info_old[0]

            if  designator == designator_old :
                print("器件序号替换:%s->%s"%(designator_old,designator_new))
                mid_x_str_old = re.findall(r'-?\d+\.?\d*e?-?\d*?', info_old[2])
                mid_x = float(mid_x_str_old[0])+offset_x
                mid_x_str_new = str(mid_x)
                print("器件坐标更新X:%s->%s"%(mid_x_str_old[0],mid_x_str_new))

                mid_y_str_old = re.findall(r'-?\d+\.?\d*e?-?\d*?', info_old[3])
                mid_y = float(mid_y_str_old[0])+offset_y
                mid_y_str_new = str(mid_y)
                print("器件坐标更新Y:%s->%s"%(mid_y_str_old[0],mid_y_str_new))

                info_new = content[index]
                print("before replace:\n"+info_new)
                info_new = info_new.replace(designator_old,designator_new,1)
                info_new = info_new.replace(mid_x_str_old[0],mid_x_str_new,1)
                info_new = info_new.replace(mid_y_str_old[0],mid_y_str_new,1)
                print("after replace:\n"+info_new)
                file_pick_new.writelines(info_new)

        designator_old = input("输入需要替换的器件序号=").upper()
        designator_new = input("输入替换之后的器件序号=").upper()
           
    #write a \n at last line        
    file_pick_new.writelines(content[len(content)-1])   
   
    file_pick_old.close()   
    file_pick_new.close()

    if input("All component changed! Continue?\n>") != 'y':
        quit()
后记:从06年开始画板写程序,从阿莫电子邮购部买器件,一转眼过去好多年了。现在除非项目需要,基本不想再画板子了,即便画也是想快速准确完成,
所以比较关注这些eda软件的二次扩展功能,用cadence时候skill插件非常高效,最近才发现AD也可以用delphi脚本。这个贴子算是个例子吧。


本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2019-10-9 10:39:59 来自手机 | 显示全部楼层
画个好板子太费脑子了,又没什么收益。

出0入0汤圆

发表于 2019-10-9 10:45:34 | 显示全部楼层
类似示波器双通道对称这种不知道有没有好的办法?

出0入0汤圆

 楼主| 发表于 2019-10-9 11:21:32 | 显示全部楼层
mubei 发表于 2019-10-9 10:45
类似示波器双通道对称这种不知道有没有好的办法?

对于这个脚本代码来说,增加一个镜像参考点,然后坐标变换即可。不过2通道,不值得研究。我们PCB一个电路单元可能有几十通道,这样用脚本才有意义。

出0入0汤圆

发表于 2019-10-10 11:57:20 | 显示全部楼层
请问:这个 选择用PIK文件place来布局,在AD软件中怎样操作? 没有相应的菜单

出0入0汤圆

发表于 2019-10-10 17:25:33 | 显示全部楼层
画板子布局确实是个体力活,密度大的手指头都要断了,眼睛也要瞎了

出0入0汤圆

发表于 2019-10-10 17:45:10 | 显示全部楼层
power pcb reuse 了解一下。 10年前,用这个功能,画过有100多个子模块的板子, 每个子模块有几十个分立器件。

出0入0汤圆

发表于 2019-10-10 18:02:44 来自手机 | 显示全部楼层
有空试用下!

出0入0汤圆

发表于 2019-10-10 18:05:00 | 显示全部楼层
多通道设计就可以了,可以复用

出0入0汤圆

发表于 2019-11-21 08:57:36 | 显示全部楼层
spcm 发表于 2019-10-9 11:21
对于这个脚本代码来说,增加一个镜像参考点,然后坐标变换即可。不过2通道,不值得研究。我们PCB一个电路 ...

为何不试试AD的通道图纸,画完直接拷贝布局走线,一键完成。原生就有的功能,为何要费力写脚本呢?

出0入0汤圆

发表于 2019-11-21 11:09:00 | 显示全部楼层
不用AD,转edge和Kicad中

出0入8汤圆

发表于 2019-11-21 11:41:06 | 显示全部楼层
design -> copy room format,

出0入0汤圆

 楼主| 发表于 2020-3-9 10:25:02 | 显示全部楼层
再来一个c@dence的skill部分功能实现,多通道设计以前用过,这是另外一种思路。
  1. ;skill 导出选中器件的坐标并添加偏移量 , 参考 deargds 前辈<十天学会skill>
  2. axlCmdRegister("test" 'test)
  3. defun( test ()
  4.   ;axlUIConfirm(strcat("Hello ",axlGetVariable("username")))
  5.   let(()

  6.     axlSetFindFilter( ?enabled list("noall" "COMPONENTS") ?onButtons list("noall" "COMPONENTS"));设置允许选择的对象类型COMPONENTS
  7.     axlClearSelSet()        ;清除选择
  8.     while(axlAddSelectBox() ;用户开始多次框选器件操作
  9.       comps = axlGetSelSet();保存选择结果
  10.       ;comps = axlDBGetDesign()->components      ;获取到所有的器件
  11.     )
  12.     axlClearSelSet();清除选择
  13.     ;此处修改偏移量
  14.     xOffset = 130
  15.     yOffset = 0

  16.     ;循环打印已选中器件的信息
  17.     sViewFile = axlTempFile()
  18.     pViewFile = axlDMOpenFile("TEMP" sViewFile "w")
  19.     fprintf(pViewFile "%s\n" "UUNITS = MILLIMETERS")
  20.     foreach(comp comps
  21.       xOrigin = (xCoord comp->symbol->xy)
  22.       yOrigin = (yCoord comp->symbol->xy)
  23.       fprintf(pViewFile "%s\t%.4f\t%.4f\t%.2f\t%s\t%s\n" comp->name xOrigin+xOffset yOrigin+yOffset comp->symbol->rotation  if(comp->symbol->mirrorType," ","m") comp->package)
  24.     )
  25.     axlDMClose(pViewFile)
  26.     axlUIWExpose(axlUIViewFileCreate(sViewFile "xyCoord" nil list(80 16)))
  27.   )
  28. )
复制代码

出0入0汤圆

发表于 2020-12-8 10:20:53 | 显示全部楼层
学习,谢谢!

出0入0汤圆

发表于 2022-5-26 16:40:21 | 显示全部楼层
icoyool 发表于 2019-11-21 11:41
design -> copy room format,
(引用自12楼)

是的,可以设置ROOM,然后拷贝

出0入228汤圆

发表于 2022-5-27 05:20:56 来自手机 | 显示全部楼层
mark一 下,再一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 08:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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