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

代码错误求解!

[复制链接]
  • TA的每日心情

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

    [LV.7]常住居民III

    跳转到指定楼层
    1#
     楼主| 发表于 2024-7-5 11:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

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

    x
    defun( creat_smre_main ()
      creat_sm_mark = axlDBTransactionStart() ;记录MARK
      creat_sm_popup = axlUIPopupDefine( nil (list
        (list "Done" 'creat_sm_Done)
        (list "Cancel" 'creat_sm_Cancel)
         ))
      axlUIPopupSet(creat_sm_popup) ;创建右键选项
      nodone = t
      while(nodone
        vias_list = nil
        vias_xy_x_list = nil
        vias_xy_y_list = nil
        l_x_left = 0
        l_x_right = 0
        l_y_down = 0
        l_y_upper = 0
        axlSetFindFilter(?enabled '(noall vias) ?onButtons '(noall vias))
        vias_list = axlGetSelSet(axlSelect()) ;抓取选中的via
        foreach(onevia vias_list
          vias_xy_x_list = append1(vias_xy_x_list car(onevia->xy))
          vias_xy_y_list = append1(vias_xy_y_list cadr(onevia->xy))
          );end foreach

        l_x_left = car(vias_xy_x_list)
        foreach(onex vias_xy_x_list ;找到x轴最小坐标值
          if(l_x_left < onex
            then
            l_x_left = l_x_left
            else
            l_x_left = onex
            );end if
          );end foreach

        l_x_right = car(vias_xy_x_list)
        foreach(onex vias_xy_x_list ;找到x轴最大坐标值
          if(l_x_right > onex
            then
            l_x_right = l_x_right
            else
            l_x_right = onex
            );end if
          );end foreach

        l_y_down = car(vias_xy_y_list)
        foreach(oney vias_xy_y_list ;找到y轴最小坐标值
          if(l_y_down < oney
            then
            l_y_down = l_y_down
            else
            l_y_down = oney
            );end if
          );end foreach

        l_y_upper = car(vias_xy_y_list)
        foreach(oney vias_xy_y_list ;找到y轴最大坐标值
          if(l_y_upper > oney
            then
            l_y_upper = l_y_upper
            else
            l_y_upper = oney
            );end if
          );end foreach

        now_layer = axlGetActiveLayer() ;获取当前显示层
        expand_x_left = axlFormGetField(creat_sm_form "expand_x_left")
        expand_x_right = axlFormGetField(creat_sm_form "expand_x_right")
        expand_y_down = axlFormGetField(creat_sm_form "expand_y_down")  
        expand_y_up = axlFormGetField(creat_sm_form "expand_y_up")
        onepath = axlPathStart( list(l_x_right+expand_x_right:l_y_down-12-expand_y_down) ) ;绘制铜皮外形
        axlPathLine( onepath 0.0 l_x_left-expand_x_left:l_y_down-12-expand_y_down )
        axlPathArcCenter( onepath 0 l_x_left-12-expand_x_left:l_y_down-expand_y_down t l_x_left-expand_x_left:l_y_down-expand_y_down )
        axlPathLine( onepath 0.0 l_x_left-12-expand_x_left:l_y_upper+expand_y_up )
        axlPathArcCenter( onepath 0 l_x_left-expand_x_left:l_y_upper+12+expand_y_up t l_x_left-expand_x_left:l_y_upper+expand_y_up )
        axlPathLine( onepath 0.0 l_x_right+expand_x_right:l_y_upper+12+expand_y_up )
        axlPathArcCenter( onepath 0 l_x_right+12+expand_x_right:l_y_upper+expand_y_up t l_x_right+expand_x_right:l_y_upper+expand_y_up )
        axlPathLine( onepath 0.0 l_x_right+12+expand_x_right:l_y_down-expand_y_down )
        axlPathArcCenter( onepath 0 l_x_right+expand_x_right:l_y_down-12-expand_y_down t l_x_right+expand_x_right:l_y_down-expand_y_down )
        axlDBCreateShape(onepath t now_layer) ;创建铜皮
        axlFlushDisplay();刷新显示
        axlClearSelSet()
        );end while
      axlDBTransactionCommit(creat_sm_mark) ;结束MARK
      );end defun

    defun( creat_sm_Done ()
      axlMsgPut("Done")
      axlMsgPut("%L" list(l_x_right))
      axlDBTransactionCommit(creat_sm_mark)
      nodone = nil
      axlCancelEnteRFun()
      axlMsgPut("%L" list(l_x_right))
      );end defun

    defun( creat_sm_Cancel ()
      axlMsgPut("Cancel")
      axlDBTransactionOops(creat_sm_mark)
      nodone = nil
      axlCancelEnterFun()
      );end defun

    上述代码运行时,可以正常根据via生成铜皮,但是当你右击done和cancel时,打印框会提示E- *Error* plus: can't handle (nil + 20),20是我给的输入值,nil我分析是l_x_right没取到值,虽然不影响整个程序运行,但是为什么是nil,函数我给他附了值0,后期抓取via的时候,这个l_x_right也是有对应的值。为什么执行done和cancel,这个值就没了,是axlDBTransactionCommit和axlDBTransactionOops函数的原因吗?求解惑!

  • TA的每日心情
    奋斗
    2025-9-24 15:41
  • 签到天数: 86 天

    [LV.6]常住居民II

    推荐
    发表于 2024-8-16 10:25 | 只看该作者
    你要知道每次循环卡的点是在axlSelect那里,而不是while(nodone那里。

    所以你每次用done或者cancle来中断select的操作之后,你以为会自动立即跳出while循环,其实它只是跳出了select函数,select之后的每一行都会继续执行,直到下一个循环到while才会完全跳出来。

    所以可以判断select的结果,当有结果时才继续。
    when(axlSelect()
        ;;Todo

    )

    用axlGetSelSet的返回值来判断应该也可以。

    点评

    w_w
    谢谢大佬,明白了  详情 回复 发表于 2024-8-19 09:48

    该用户从未签到

    3#
    发表于 2024-7-5 14:08 | 只看该作者
    策划给你书写很规整
    头像被屏蔽
  • TA的每日心情
    开心
    2025-1-23 15:05
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    4#
    发表于 2024-7-5 14:56 | 只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽
  • TA的每日心情
    奋斗
    2025-10-23 15:30
  • 签到天数: 144 天

    [LV.7]常住居民III

    5#
    发表于 2024-7-5 15:08 | 只看该作者
    期待你的skill
  • TA的每日心情

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

    [LV.7]常住居民III

    6#
     楼主| 发表于 2024-8-19 09:48 | 只看该作者
    db-_- 发表于 2024-8-16 10:25
    你要知道每次循环卡的点是在axlSelect那里,而不是while(nodone那里。

    所以你每次用done或者cancle来中 ...

    谢谢大佬,明白了
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-29 02:32 , Processed in 0.140625 second(s), 25 queries , Gzip On.

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

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

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