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

高效框选自动摆放器件SKILL

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 digitzing 于 2022-2-17 14:18 编辑

原来程序为点击ON,开启程序,点击select,后,鼠标框选器件,或从原理图中选中部分电路,联动到PCB选中后,点击place,鼠标框选器件要摆放的位置,自动摆放后done
有没有哪位帅哥美女可以把这个skill 修改为框选器件后,快捷键调起这个SKILL,然后鼠标框选区域,器件就自动摆放完成?再框选,就再自动重新摆放, 不要弹出FROM,直接快捷键后台运行,提高效率和操作更方便
调用命令:pis
  1. load("Part_Place_Inside.il" "")
复制代码













  1. /*
  2. #########################################################################################                                                                    
  3. #                 Skill File: FanySkill_Place_Inside.il                                                           #
  4. #                 How To Load: Command> (load("FanySkill_Place_Inside.il"))                                        #
  5. #                        Modify by:  longxf 2020-1-1 Download Addr:https://pcbbar.com/                                 #
  6. #                        How To Execute: Command> FYPI                                                                                                #
  7. #                        Original author : Skny                                                                                                                #
  8. #########################################################################################
  9. */

  10. axlCmdRegister("pis" 'Part_Place_Inside)         ;"pi" 为启动命令关键字,可以自定义此关键字。

  11. defun( Part_Place_Inside ()
  12.      let(()
  13.      formcreate()
  14.         ) ;let
  15.      ) ;defun
  16.       
  17. defun( move ()   
  18.       axlShell("unrats all")
  19.       Com_area=axlEnterBox(?prompts list("First rectangle point, please..." "Second rectangle point, please..."))
  20.       if(caar(Com_area)>car(cadr(Com_area)) then
  21.                 new_x=car(cadr(Com_area))
  22.                 big_x=caar(Com_area)
  23.       else
  24.                new_x=car(car(Com_area))
  25.                big_x=car(cadr(Com_area))
  26.               )
  27.       if(cadr(cadr(Com_area))>cadr(car(Com_area)) then
  28.                 new_y=cadr(cadr(Com_area))
  29.       else
  30.                 new_y=cadr(car(Com_area))
  31.                 )
  32.        sym_dy=0
  33.        sym_dx=0
  34.        H_dy=0
  35.        pls_x=new_x+1
  36.        pls_y=new_y-1
  37.        pls_xy=list(pls_x,pls_y)
  38.        all_dy=0
  39.       
  40.        axlClearSelSet()
  41.        axlSetFindFilter(?enabled list( "noall" "symbols") ?onButtons list( "noall" "symbols"))
  42.        foreach(ref reflist
  43.                dSyms = axlSelectByName("REFDES" ref)
  44.                dSym=car(dSyms)
  45.                foreach(db0 dSym->children
  46.                        layer = cadr(parseString(db0->layer "/"))
  47.                        if(layer == "PLACE_BOUND_TOP" || layer == "PLACE_BOUND_BOTTOM"  then
  48.                           sym_boundary = db0->bBox
  49.                           downleft_xy=car(sym_boundary)  
  50.                           upright_xy=car(cdr(sym_boundary))
  51.                           left_x=car(downleft_xy)
  52.                           up_y=car(cdr(upright_xy))
  53.                           right_x=car(upright_xy)
  54.                           down_y=car(cdr(downleft_xy))
  55.                           if(pls_x<big_x then
  56.                              ix=pls_x-left_x
  57.                              iy=pls_y-up_y
  58.                              axlTransformObject(dSym, ?move ix:iy)
  59.                              
  60.                              axlDehighlightObject(dSym)
  61.                              sym_dx=right_x-left_x
  62.                              pls_x=pls_x+sym_dx+5   
  63.                              sym_dy=up_y-down_y
  64.                              pls_xy=list(pls_x,pls_y)
  65.                              if(sym_dy>H_dy then
  66.                                       H_dy=sym_dy
  67.                              else
  68.                                 H_dy=H_dy
  69.                                 );if(sym_dy>H_dy then
  70.                   
  71.                           else
  72.                                     all_dy=H_dy+all_dy+5
  73.                                     pls_x=new_x+1
  74.                                     pls_y=new_y-all_dy
  75.                                     ix=pls_x-left_x
  76.                              iy=pls_y-up_y
  77.                                     axlTransformObject(dSym, ?move ix:iy)
  78.                                     axlDehighlightObject(dSym)  
  79.                              sym_dy=up_y-down_y
  80.                              sym_dx=right_x-left_x
  81.                              pls_x=pls_x+sym_dx+5
  82.                              pls_xy=list(pls_x,pls_y)
  83.                              H_dy=sym_dy
  84.                              ) ;if(pls_x<big_x then
  85.                           );if(layer
  86.                       );foreach(db0
  87.                 );foreach(ref
  88.      );defun
  89.      
  90. defun( formcreate ()
  91.        let((place)
  92.            path_place="./place_in.form"
  93.            place= outfile(path_place "w")
  94.            
  95.            fprintf(place "FILE_TYPE=FORM_DEFN VERSION=2\n")
  96.            fprintf(place "FORM\n")
  97.            fprintf(place "FIXED\n")
  98.            fprintf(place "PORT 30 5\n")
  99.            fprintf(place "HEADER \"Place_inside\"\n")
  100.            fprintf(place "TILE\n")
  101.             
  102.                  fprintf(place "FIELD Place\n")
  103.                  fprintf(place "FLOC 17 19\n")
  104.                  fprintf(place "MENUBUTTON \"Place\" 10 4\n")
  105.                  fprintf(place "ENDFIELD\n")
  106.                  
  107.                  fprintf(place "FIELD Select\n")
  108.                  fprintf(place "FLOC 17 12\n")
  109.                  fprintf(place "MENUBUTTON \"Select\" 10 4\n")
  110.                  fprintf(place "ENDFIELD\n")
  111.         
  112.            fprintf(place "TEXT \"Symbols:\"\n")
  113.            fprintf(place "FLOC 3 1\n")
  114.            fprintf(place "ENDTEXT\n")
  115.         
  116.            fprintf(place "TEXT\n")
  117.            fprintf(place "FLOC 10 1\n")
  118.            fprintf(place "INFO Sym_Count 20\n")
  119.            fprintf(place "FSIZE 20 2\n")
  120.            fprintf(place "ENDTEXT\n")
  121.            
  122.            fprintf(place "FIELD ref_sym\n")
  123.            fprintf(place "FLOC 2 3\n")
  124.            fprintf(place "LIST \"\" 10 10\n")
  125.            fprintf(place "OPTIONS multiselect\n")               
  126.            fprintf(place "ENDFIELD\n")
  127.            
  128.            fprintf(place "FIELD Toggle\n")
  129.            fprintf(place "FLOC 17 5\n")
  130.            fprintf(place "MENUBUTTON \"On/Off\" 10 4\n")
  131.            fprintf(place "ENDFIELD\n")
  132.         
  133.            fprintf(place "TEXT\n")
  134.            fprintf(place "FLOC 23 2\n")
  135.            fprintf(place "INFO msg 20\n")
  136.            fprintf(place "FSIZE 20 2\n")
  137.            fprintf(place "ENDTEXT\n")
  138.            
  139.            fprintf(place "TEXT \"Function:\"\n")
  140.            fprintf(place "FLOC 15 2\n")
  141.            fprintf(place "ENDTEXT\n")
  142.         
  143.                  fprintf(place "ENDTILE\n")
  144.            fprintf(place "ENDFORM\n")
  145.            close(place)
  146.         
  147.            axlFormCreate('place_in "./place_in.form" '("msgLines" 1) 'placeAction t nil)
  148.            axlFormDisplay(place_in)
  149.            axlUIWPrint(place_in "Please Turn ON the function!")
  150.            deleteFile(path_place)
  151.        );end let
  152.            sts = 0
  153.            axlFormSetField( place_in "msg"         "OFF")
  154.            axlFormSetField( place_in "Sym_Count"  "0"  )
  155.      );end defun

  156. defun( placeAction (place_in)
  157.        targ = nil
  158.        case(place_in->cuRField
  159.                     ("Place"         
  160.                         if(reflist == nil  then
  161.                            axlUIWPrint(place_in "Please Select symbols First!!")
  162.                         else
  163.                            axlShell("done")
  164.                            move()
  165.                            axlFormSetField( place_in "Sym_Count"  "0" )
  166.                            axlFormListDeleteAll(place_in "ref_sym" )
  167.                            axlUIWPrint(place_in "Done")
  168.                            reflist = nil
  169.                           );if
  170.                       );Place
  171.                     ("Select"
  172.                         if(sts == 0 then
  173.                            axlUIWPrint(place_in "Please Open the function First!!")
  174.                         else
  175.                                  axlUIWPrint(place_in "Selecting......")
  176.                            hilight()
  177.                           );if
  178.                       );Select
  179.                     ("Toggle"
  180.                         Toggle_Sts()
  181.                       );Toggle
  182.              );case
  183.        reflist = nil
  184.      );defun
  185. defun( hilight ()
  186.        targ = nil
  187.        axlFormListDeleteAll(place_in "ref_sym" )
  188.        axlShell("hilight")
  189.        axlSetFindFilter(?enabled list( "noall" "symbols") ?onButtons list( "noall" "symbols"))
  190.      );

  191. defun( myxprobe (items)
  192.        if(car(items) == 'highlight then
  193.           targ = cons(caadr(items)->refdes targ)
  194.           );if
  195.        axlFormListDeleteAll(place_in "ref_sym" )
  196.        when(member(nil targ) targ = remove(nil targ))
  197.        targ = sort(unique(targ) nil)
  198.        axlFormSetField( place_in "ref_sym"         targ)
  199.        reflist = targ
  200.        Sym_cnt=length(reflist)
  201.        axlFormSetField( place_in "Sym_Count" Sym_cnt  )
  202.      );defun

  203. defun( Toggle_Sts ()
  204.        if(sts == 0 then
  205.           sts = 1
  206.           axlTriggerSet('xprobe 'myxprobe)
  207.           axlFormSetField( place_in "msg"         "ON")
  208.           axlUIWPrint(place_in "Please Select symbols!")
  209.                   
  210.        else
  211.           sts = 0
  212.           axlTriggerClear('xprobe 'myxprobe)
  213.           axlFormSetField( place_in "msg"         "OFF")
  214.           axlUIWPrint(place_in "Please Open the function!")
  215.           axlFormListDeleteAll(place_in "ref_sym" )
  216.           axlFormSetField( place_in "Sym_Count"  "0"  )
  217.           reflist = nil
  218.           );if
  219.       );defun
复制代码





  • TA的每日心情
    奋斗
    2025-7-7 15:38
  • 签到天数: 83 天

    [LV.6]常住居民II

    2#
    发表于 2022-2-16 16:29 | 只看该作者
    一句注释都没有,看着费劲。。。

    点评

    复制下来运行  详情 回复 发表于 2022-2-16 20:01

    该用户从未签到

    3#
     楼主| 发表于 2022-2-16 20:01 | 只看该作者
    db-_- 发表于 2022-2-16 16:29
    一句注释都没有,看着费劲。。。

    复制下来运行
  • TA的每日心情
    奋斗
    2025-7-7 15:38
  • 签到天数: 83 天

    [LV.6]常住居民II

    4#
    发表于 2022-2-17 10:53 | 只看该作者
    运行了下什么也干不了  所以到底是做什么的呢?


    这个程序是做什么的都不说清楚,怎么可能会有人一行一行给你读一下,猜出来功能再给你改。

    点评

    这是网上共享的源代码,分享出来之前可能已经删去注释了 或者压根没有注释的习惯(比如我)  详情 回复 发表于 2022-2-18 09:21
  • TA的每日心情
    开心
    2022-5-6 15:29
  • 签到天数: 34 天

    [LV.5]常住居民I

    5#
    发表于 2022-2-18 09:21 | 只看该作者
    db-_- 发表于 2022-2-17 10:53
    运行了下什么也干不了  所以到底是做什么的呢?

    这是网上共享的源代码,分享出来之前可能已经删去注释了
    或者压根没有注释的习惯(比如我
  • TA的每日心情
    奋斗
    2025-7-7 15:38
  • 签到天数: 83 天

    [LV.6]常住居民II

    6#
    发表于 2022-2-18 11:44 | 只看该作者
    可能是我太笨了吧。我这点及ON/OFF没反应。

    话说不是有根据原理图页数以及位置放置器件的skill吗。这个就显得有点多余。
  • TA的每日心情
    开心
    2022-3-15 15:23
  • 签到天数: 2 天

    [LV.1]初来乍到

    7#
    发表于 2022-3-4 14:46 | 只看该作者
    這個厲害啊~ 感謝分享
  • TA的每日心情
    奋斗
    2025-7-7 15:38
  • 签到天数: 83 天

    [LV.6]常住居民II

    9#
    发表于 2022-3-4 15:27 | 只看该作者
    有几个问题

    1、网站有个BUG,代码里面如果有特殊关键词,会自动小写改大写。比如161行的case(place_in->cuRField,应该是case(place_in->curField,所以直接复制下来的代码运行不了。

    2、有没有哪位帅哥美女可以把这个skill 修改为框选器件后,快捷键调起这个SKILL。
    你是用的plach mode?还是什么预选模式吗?none模式需要先运行命令才可以框选
  • TA的每日心情
    难过
    2025-3-6 15:07
  • 签到天数: 251 天

    [LV.8]以坛为家I

    10#
    发表于 2022-3-10 10:44 | 只看该作者
    点了ON/OFF没有反应。没有变成ON,默认为OFF
  • TA的每日心情
    慵懒
    2025-7-9 15:01
  • 签到天数: 49 天

    [LV.5]常住居民I

    11#
    发表于 2023-12-13 17:30 | 只看该作者
    插个眼,等有空了来细看
    头像被屏蔽
  • TA的每日心情
    开心
    2025-1-23 15:05
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    12#
    发表于 2023-12-14 22:33 | 只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-19 12:47 , Processed in 0.140625 second(s), 29 queries , Gzip On.

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

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

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