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

如何等间距复制过孔?

[复制链接]
  • TA的每日心情
    开心
    2024-9-6 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
     楼主| 发表于 2025-7-14 22:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

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

    x
    本帖最后由 学无止境``` 于 2025-7-14 22:09 编辑

    下面是我写的一点代码,但是功能没有实现,实在不知道怎么写了?
    defun( CopyViaBySameDimension (x_offset y_offset)
        let((ViaDbid)
            axlSetFindFilter(?enabled (list "noall" "VIAS") ?onButtons (list "VIAS"))
            ;axlClearSelSet()
            axlMsgPut("Select a via as reference...")
            selectedVia = axlSingleSelectPoint()
            ViaDbid = axlGetSelSet(selectedVia)                        ;获取选择对象的DBID
                    ;unless(axlOKToProceed() axlShell("done"))
                    when(ViaDbid
                    padstackName = car(ViaDbid)->name      ;获取焊盘名称
                ViaNet = car(ViaDbid)->net->name       ;获取当前选择过孔的网络名称
                    ViaXY  = car(ViaDbid)->xy              ;获取当前选择过孔的坐标
                    ViaRotation  = car(ViaDbid)->via->rotation  ;获取旋转角度
                    ViaMirror  = car(ViaDbid)->via->mirrored  ;获取旋转角度
            );end when
                x = xCoord(ViaXY)  ; 获取x坐标
                y = yCoord(ViaXY)  ; 获取y坐标
                    ;点击左右则x变化,y不变
                x = x + x_offset
                ;点击上下则y变化,X不变
                y = y + y_offset
                    ;unless(axlOKToProceed() axlShell("done"))
                newVia = axlDBCreateVia(padstackName , x:y , ViaNet, ViaMirror , ViaRotation , nil) ;创建过孔
                when(newVia
                        NewViaDbid = list(car(newVia))
                    axlHighlightObject(NewViaDbid)
                );end when
                        
        );end let   
    );end defun       
  • TA的每日心情
    开心
    2024-9-6 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
     楼主| 发表于 2025-7-14 22:10 | 只看该作者
    完整代码发不出来,有不良信息
  • TA的每日心情
    开心
    2024-9-6 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
     楼主| 发表于 2025-7-15 09:50 | 只看该作者
    没人看一下吗
  • TA的每日心情
    奋斗
    2025-7-7 15:38
  • 签到天数: 83 天

    [LV.6]常住居民II

    4#
    发表于 2025-7-15 10:30 | 只看该作者
    你把获取器件信息放到主函数里,把创建via的函数放到上下左右按钮对应的回调函数里就行了。

    不是告诉你咋做了么。。。

    点评

    大佬,按照你说的,改了以后,点选1个过孔,上下左右的按钮恩一次,复制1个过孔,只能在form出来点选1次,然后就无法点选了,也无法连续点击按钮放置等间距过孔  详情 回复 发表于 2025-7-15 15:37
    按照这样放置,运行以后得先选择过孔,才能跳出来form,怎么样才能在跳出来form以后,点选1个过孔,上下左右恩一次,复制1个过孔  详情 回复 发表于 2025-7-15 15:31
    按照这样放置有错误,显示newvia是未被定义的变量  详情 回复 发表于 2025-7-15 15:18
  • TA的每日心情
    开心
    2024-9-6 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    5#
     楼主| 发表于 2025-7-15 15:18 | 只看该作者
    本帖最后由 学无止境``` 于 2025-7-15 15:30 编辑



  • TA的每日心情
    开心
    2024-9-6 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    6#
     楼主| 发表于 2025-7-15 15:31 | 只看该作者
    本帖最后由 学无止境``` 于 2025-7-15 15:35 编辑


    按照这样放置,运行以后得先选择过孔,才能跳出来form,怎么样才能在跳出来form以后,点选1个过孔,上下左右恩一次,复制1个过孔
  • TA的每日心情
    开心
    2024-9-6 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
     楼主| 发表于 2025-7-15 15:37 | 只看该作者
    db-_- 发表于 2025-7-15 10:30
    你把获取器件信息放到主函数里,把创建via的函数放到上下左右按钮对应的回调函数里就行了。

    不是告诉你 ...

    大佬,按照你说的,改了以后,点选1个过孔,上下左右的按钮恩一次,复制1个过孔,只能在form出来点选1次,然后就无法点选了,也无法连续点击按钮放置等间距过孔
  • TA的每日心情
    奋斗
    2025-7-7 15:38
  • 签到天数: 83 天

    [LV.6]常住居民II

    8#
    发表于 2025-7-15 15:50 | 只看该作者
    你的表达我看着有点混乱,我先捋一下你的想法。

    你是要按照以下顺序操作
    1、先出FORM
    2、再选孔
    3、在FORM上点击上/下/左/右按钮,点哪个按钮就在哪个方向复制过孔
    是这样吗?

    你没有提供create from的函数,也没有提供form的回调函数,怎么帮你看问题在哪呢。

    点评

    是的大佬,现在我按照你的方法,主要功能可以实现了,但是还有1个问题,将器件信息的获取放在主函数中的话,主函数中获取的过孔的dbid无法传递到下面的函数中,  详情 回复 发表于 2025-7-16 09:49
  • TA的每日心情
    开心
    2024-9-6 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    9#
     楼主| 发表于 2025-7-16 09:49 | 只看该作者
    db-_- 发表于 2025-7-15 15:50
    你的表达我看着有点混乱,我先捋一下你的想法。

    你是要按照以下顺序操作

    是的大佬,现在我按照你的方法,主要功能可以实现了,但是还有1个问题,将器件信息的获取放在主函数中的话,主函数中获取的过孔的dbid无法传递到下面的函数中,
    1. defun(CreateCOpyViaForm_KLJ ()
    2.                 time = getCurrentTime()
    3.                 time = parseString(time)
    4.                 day = nth(1 time)
    5.                 month = car(time)
    6.                 month = upperCase(month)
    7.                 year = nth(3 time)
    8.                 date = strcat(" Date: " day " " month " " year)
    9.                 CreateCOpyViaForm();form创建函数               
    10.                 COpyViaForm_KLJ=axlFormCreate( (gensym) form_file nil 'CopyVia_CallBack t)
    11.                 axlFormDisplay(COpyViaForm_KLJ)
    12.                 axlFormSetField(COpyViaForm_KLJ "Radio2" "true") ;默认勾选SMD
    13.                 axlFormSetField(COpyViaForm_KLJ "Units_value" car(axlDBGetDesignUnits()))        
    14.                 axlUIWPrint(COpyViaForm_KLJ date)       
    15.                
    16.                 ;获取选择的过孔坐标
    17.                 axlClearSelSet()
    18.         axlSetFindFilter(?enabled (list "all" "VIAS") ?onButtons (list "VIAS"))
    19.         axlMsgPut("Select a via as reference...")
    20.                 ;selectVia = axlSelect()
    21.         Viadbid = axlGetSelSet(axlSelect())                        ;获取选择对象的DBID
    22.                 printf("Current Via dbid:%s" car(Viadbid))
    23.                 when(Viadbid
    24.                     axlDBControl('highlightColor 17)
    25.                     axlHighlightObject(Viadbid t);高亮
    26.                 padstackName = car(Viadbid)->name      ;获取焊盘名称
    27.             ;ViaNet = car(Viadbid)->net->name       ;获取当前选择过孔的网络名称
    28.                 ViaXY  = car(Viadbid)->xy              ;获取当前选择过孔的坐标
    29.                 ViaRotation  = car(Viadbid)->via->rotation  ;获取旋转角度
    30.                 ViaMirror  = car(Viadbid)->via->mirrored  ;获取旋转角度
    31.                 x = xCoord(ViaXY)  ; 获取x坐标
    32.                 y = yCoord(ViaXY)  ; 获取y坐标
    33.         );end when
    34.             ;重新获得第一个孔的dbid
    35.             axlSetFindFilter(?enabled (list "noall" "VIAS") ?onButtons (list "VIAS"))
    36.             reselect = axlSingleSelectPoint(x : y)
    37.             lastViadbid = axlGetSelSet(reselect)               
    38. );end defun
    复制代码


  • TA的每日心情
    开心
    2024-9-6 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    10#
     楼主| 发表于 2025-7-16 09:51 | 只看该作者
    这是回调函数中调用的函数
    1. defun( CopyViaBySameDimension_Up ()
    2.     let(()
    3.         Radio_num1 = axlFormGetField(COpyViaForm_KLJ "Radio1")
    4.         Radio_num2 = axlFormGetField(COpyViaForm_KLJ "Radio2")
    5.         Radio_num3 = axlFormGetField(COpyViaForm_KLJ "Radio3")
    6.         Radio_num4 = axlFormGetField(COpyViaForm_KLJ "Radio4")
    7.         Radio_num5 = axlFormGetField(COpyViaForm_KLJ "Radio5")
    8.         when(Radio_num1
    9.             when(car(axlDBGetDesignUnits()) == "mils"         offset = float(19.69))
    10.             when(car(axlDBGetDesignUnits()) == "millimeters"  offset = float(0.5))
    11.         )
    12.         when(Radio_num2
    13.             when(car(axlDBGetDesignUnits()) == "mils"         offset = float(31.5))
    14.             when(car(axlDBGetDesignUnits()) == "millimeters"  offset = float(0.8))
    15.         )
    16.         when(Radio_num3
    17.             when(car(axlDBGetDesignUnits()) == "mils"         offset = float(39.37))
    18.             when(car(axlDBGetDesignUnits()) == "millimeters"  offset = float(1.0))
    19.         )
    20.         when(Radio_num4
    21.             when(car(axlDBGetDesignUnits()) == "mils"         offset = float(50))
    22.             when(car(axlDBGetDesignUnits()) == "millimeters"  offset = float(1.27))
    23.         )
    24.         when(Radio_num5
    25.             offset = atof(axlFormGetField(COpyViaForm_KLJ "Input"))
    26.         )

    27.         lastHighlightedVia = lastViadbid ; 存储最后高亮的过孔
    28.                 unless(lastHighlightedVia == nil   printf("Current Via dbid:%s" car(lastHighlightedVia)))
    29.                 ;printf("Current Via dbid:%s" car(lastHighlightedVia))

    30.             ;点击左右则x变化,y不变
    31.             new_x = x
    32.             ;点击左右则x变化,y不变
    33.             new_y = y + offset
    34.                
    35.                 when(new_x && new_y
    36.                 newVia = axlDBCreateVia(padstackName , new_x : new_y , nil , ViaMirror , ViaRotation , nil) ;创建过孔
    37.                 when(newVia != nil
    38.                         NewViaDbid = list(car(newVia))
    39.                             axlHighlightObject(NewViaDbid t);高亮新创建的过孔
    40.                         when(lastHighlightedVia
    41.                                 axlDehighlightObject(lastHighlightedVia t) ; 取消上一个过孔的高亮
    42.                                         axlVisibleUpdate(t)
    43.                             );end when
    44.                             lastViadbid = NewViaDbid
    45.                             x = new_x
    46.                             y = new_y
    47.                     );end when
    48.         );end when
    49.     );end let   
    50. );end defun       
    复制代码
  • TA的每日心情
    开心
    2024-9-6 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    11#
     楼主| 发表于 2025-7-16 09:53 | 只看该作者
    本帖最后由 学无止境``` 于 2025-7-16 09:59 编辑

    我是想等距创建第2个孔后,将上个孔取消高亮,但是现在无法取消第一个选择的过孔的高亮,运行过程中发现第1个过孔的DBID丢失了,只能将x y传递到回调函数中,不良信息

    点评

    将xy传过去是对的。dbid本身很容易丢。你都有xy了,你把lastViadbid改成lastPoint,重新去select一下旧孔就好了。  详情 回复 发表于 2025-7-16 10:55
  • TA的每日心情
    奋斗
    2025-7-7 15:38
  • 签到天数: 83 天

    [LV.6]常住居民II

    12#
    发表于 2025-7-16 10:55 | 只看该作者
    学无止境``` 发表于 2025-7-16 09:53
    我是想等距创建第2个孔后,将上个孔取消高亮,但是现在无法取消第一个选择的过孔的高亮,运行过程中发现第1 ...

    将xy传过去是对的。dbid本身很容易丢。你都有xy了,你把lastViadbid改成lastPoint,重新去select一下旧孔就好了。

    点评

    大佬找到问题了,需要再取消高亮后,取消选择才行  详情 回复 发表于 2025-7-16 13:01
    大佬,我现在改成:每次向上创建等距离过孔的时候,总是最后2个孔高亮,倒数第2个无法取消高亮  详情 回复 发表于 2025-7-16 12:37
  • TA的每日心情
    开心
    2024-9-6 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    13#
     楼主| 发表于 2025-7-16 12:37 | 只看该作者
    db-_- 发表于 2025-7-16 10:55
    将xy传过去是对的。dbid本身很容易丢。你都有xy了,你把lastViadbid改成lastPoint,重新去select一下旧孔 ...

    大佬,我现在改成:
    1. axlSetAlias("Up" "skill CopyViaBySameDimension_Up()" t)
    2. defun( CopyViaBySameDimension_Up ()
    3.     let(()
    4.         Radio_num1 = axlFormGetField(COpyViaForm_KLJ "Radio1")
    5.         Radio_num2 = axlFormGetField(COpyViaForm_KLJ "Radio2")
    6.         Radio_num3 = axlFormGetField(COpyViaForm_KLJ "Radio3")
    7.         Radio_num4 = axlFormGetField(COpyViaForm_KLJ "Radio4")
    8.         Radio_num5 = axlFormGetField(COpyViaForm_KLJ "Radio5")
    9.         when(Radio_num1
    10.             when(car(axlDBGetDesignUnits()) == "mils"         offset = float(19.69))
    11.             when(car(axlDBGetDesignUnits()) == "millimeters"  offset = float(0.5))
    12.         )
    13.         when(Radio_num2
    14.             when(car(axlDBGetDesignUnits()) == "mils"         offset = float(31.5))
    15.             when(car(axlDBGetDesignUnits()) == "millimeters"  offset = float(0.8))
    16.         )
    17.         when(Radio_num3
    18.             when(car(axlDBGetDesignUnits()) == "mils"         offset = float(39.37))
    19.             when(car(axlDBGetDesignUnits()) == "millimeters"  offset = float(1.0))
    20.         )
    21.         when(Radio_num4
    22.             when(car(axlDBGetDesignUnits()) == "mils"         offset = float(50))
    23.             when(car(axlDBGetDesignUnits()) == "millimeters"  offset = float(1.27))
    24.         )
    25.         when(Radio_num5
    26.             offset = atof(axlFormGetField(COpyViaForm_KLJ "Input"))
    27.         )
    28.                
    29.         axlSetFindFilter(?enabled (list "noall" "VIAS") ?onButtons (list "VIAS"))
    30.             reselect = axlSingleSelectPoint(x : y)
    31.             reselectViadbid = axlGetSelSet(reselect)
    32.                 axlDehighlightObject(reselectViadbid t) ; 取消上一个过孔的高亮       
    33.                
    34.             ;点击左右则x变化,y不变
    35.             new_x = x
    36.             ;点击左右则x变化,y不变
    37.             new_y = y + offset
    38.                
    39.                 when(new_x && new_y
    40.                 newVia = axlDBCreateVia(padstackName , new_x : new_y , nil , ViaMirror , ViaRotation , nil) ;创建过孔
    41.                 when(newVia != nil
    42.                             printf("Copy Via dbid:%s\n" car(newVia))
    43.                         NewViaDbid = list(car(newVia))
    44.                             axlHighlightObject(NewViaDbid t);高亮创建的过孔
    45.                             x = new_x
    46.                             y = new_y
    47.                     );end when
    48.         );end when
    49.     );end let   
    50. );end defun       
    复制代码
    每次向上创建等距离过孔的时候,总是最后2个孔高亮,倒数第2个无法取消高亮

    1.png (21.05 KB, 下载次数: 0)

    1.png
  • TA的每日心情
    开心
    2024-9-6 15:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    14#
     楼主| 发表于 2025-7-16 13:01 | 只看该作者
    db-_- 发表于 2025-7-16 10:55
    将xy传过去是对的。dbid本身很容易丢。你都有xy了,你把lastViadbid改成lastPoint,重新去select一下旧孔 ...

    大佬找到问题了,需要再取消高亮后,取消选择才行
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-18 01:39 , Processed in 0.156250 second(s), 28 queries , Gzip On.

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

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

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