找回密码
 注册
关于网站域名变更的通知

如何等间距复制过孔?

查看数: 464 | 评论数: 13 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2025-7-14 22:07

正文摘要:

本帖最后由 学无止境``` 于 2025-7-14 22:09 编辑 下面是我写的一点代码,但是功能没有实现,实在不知道怎么写了? defun( CopyViaBySameDimension (x_offset y_offset)     let((ViaDbid)   &n ...

回复

学无止境``` 发表于 2025-7-16 13:01
db-_- 发表于 2025-7-16 10:55
将xy传过去是对的。dbid本身很容易丢。你都有xy了,你把lastViadbid改成lastPoint,重新去select一下旧孔 ...

大佬找到问题了,需要再取消高亮后,取消选择才行
db-_- 发表于 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
学无止境``` 发表于 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
学无止境``` 发表于 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       
复制代码
学无止境``` 发表于 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
复制代码


db-_- 发表于 2025-7-15 15:50
你的表达我看着有点混乱,我先捋一下你的想法。

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

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

点评

是的大佬,现在我按照你的方法,主要功能可以实现了,但是还有1个问题,将器件信息的获取放在主函数中的话,主函数中获取的过孔的dbid无法传递到下面的函数中,  详情 回复 发表于 2025-7-16 09:49
学无止境``` 发表于 2025-7-15 15:37
db-_- 发表于 2025-7-15 10:30
你把获取器件信息放到主函数里,把创建via的函数放到上下左右按钮对应的回调函数里就行了。

不是告诉你 ...

大佬,按照你说的,改了以后,点选1个过孔,上下左右的按钮恩一次,复制1个过孔,只能在form出来点选1次,然后就无法点选了,也无法连续点击按钮放置等间距过孔
学无止境``` 发表于 2025-7-15 15:31
本帖最后由 学无止境``` 于 2025-7-15 15:35 编辑


按照这样放置,运行以后得先选择过孔,才能跳出来form,怎么样才能在跳出来form以后,点选1个过孔,上下左右恩一次,复制1个过孔
学无止境``` 发表于 2025-7-15 15:18
本帖最后由 学无止境``` 于 2025-7-15 15:30 编辑



db-_- 发表于 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
学无止境``` 发表于 2025-7-15 09:50
没人看一下吗
学无止境``` 发表于 2025-7-14 22:10
完整代码发不出来,有不良信息
关闭

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

EDA365公众号

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

GMT+8, 2025-11-22 02:12 , Processed in 0.171875 second(s), 30 queries , Gzip On.

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

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

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