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

【分享】用于PDF原理图快速抓取器件的SKILL

[复制链接]
  • TA的每日心情
    郁闷
    2024-7-25 15:18
  • 签到天数: 15 天

    [LV.4]偶尔看看III

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

    EDA365欢迎您登录!

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

    x
    本帖最后由 ashnoer 于 2024-9-9 13:07 编辑

    最近有个项目是PDF的原理图,我们之前抓模块是使用lst文本在allegro中加载,每次抓器件都要复制粘贴保存文档,就自己写了个,目前只是简单的抓器件,后续有空再搞个根据绘制的矩形放置的功能,鼠标附着部分式参考db大佬之前分享的创建网络丝印的skill
    目前还有个小问题,第一次打开设计时某些器件抓取后在放置时会丢失报错,之后都无法抓到丢失的器件
    1. E- *Error* fprintf/sprintf: invalid (NULL) string or format
    复制代码
    考虑后期会增加功能分为两个子函数执行,不知道是不是因为这个原因导致

    1. /*
    2. By4311
    3. 240908
    4. 用于PDF原理图,PDF中框选复制器件文本信息,在设计中使用~1抓取
    5. */

    6. axlSetFunckey("~1" "By4311_GrabClipboardSymbol")
    7. axlCmdRegister("By4311_GrabClipboardSymbol" 'By4311_Main_GrabClipboardSymbol)

    8. (procedure By4311_FindSymbol()
    9.   axlZoomToDbid(car(axlSelectByName("REFDES" axlUIPrompt("Find Symbol Name:"))) t)
    10. )

    11. (procedure By4311_Main_GrabClipboardSymbol()
    12.     By4311_GetClipboardSymbol()
    13.     By4311_GrabClipboardSymbol(List)
    14. )

    15. (procedure By4311_GetClipboardSymbol()
    16.   axlUIConfirmEx( "Use This Command At Your Own Risk." "By4311_GrabClipboardSymbol")
    17. let( (P)
    18. ;清除选择集,设置过滤器
    19. axlClearSelSet()
    20. P = list("NoAll" "Symbols")
    21. axlSetFindFilter(?enabled P ?onButtons cdr(P))

    22. ;获得剪切板内容进行解析,转换为字符串链表
    23. P = axlClipboardGetText()
    24. P = buildString(parseString(P "\r") " ")
    25. P = buildString(parseString(P "\n") " ")
    26. P = parseString(P " ")

    27. ;在设计中查找链表包含的对象,放置到抓取合集中
    28. List = list()
    29.    (foreach item P
    30.     P = axlSelectByName("REFDES" item)
    31.      when( P
    32.      List = append(List P)
    33.      ;printf("%L\n" car(P)->refdes)
    34.      )
    35.    )
    36. )
    37. )

    38. (procedure By4311_GrabClipboardSymbol(List)
    39. let((P item)
    40.    (if List ;传入的链表;如果不为空则抓取,如果为空则提示
    41.    then axlHighlightObject(List)
    42.    item = axlDBAltOrigin('center car(List)) ;默认鼠标附着基准点为第一个元素的中心坐标
    43.    axlDynamicsObject(List item) ;鼠标附着
    44.    P = axlEnterPoint(?prompts `("Please Click To Select The Point To Place...")) ;选择新位置
    45.    axlDehighlightObject(List)
    46.    (if P
    47.    then axlTransformObject(List ?move axlMXYSub(P item)) ;整体移动
    48.    else axlMsgPut("User Canceled Operation.");用户取消操作
    49.    )
    50.    axlClearDynamics();清除鼠标附着
    51.    else
    52.    axlMsgPut("Did Not Grab The Symbol.");没有抓取到有用的信息
    53.    )
    54.   )
    55. )
    复制代码








    补充内容 (2025-3-18 18:14):


    补充内容 (2025-3-18 18:34):
    更新:某些位号重叠被合并为一个字符串时也会抓取
    代码详见#19

    评分

    参与人数 1威望 +2 收起 理由
    kilbird + 2 感谢分享!

    查看全部评分

  • TA的每日心情
    郁闷
    2024-7-25 15:18
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    推荐
     楼主| 发表于 2025-3-18 18:33 | 只看该作者
    1. /*
    2. By4311
    3. 240908
    4. 用于PDF原理图,PDF中框选复制器件文本信息,在设计中使用~1抓取

    5. 历史更新:
    6.   2025.03.18
    7.     新增某些位号重叠被合并为一个字符串时也会抓取
    8. */

    9. axlSetFunckey("~1" "By4311_GrabClipboardSymbol")
    10. axlCmdRegister("By4311_GrabClipboardSymbol" 'By4311_Main_GrabClipboardSymbol)

    11. (procedure By4311_FindSymbol()
    12.   axlZoomToDbid(car(axlSelectByName("REFDES" axlUIPrompt("Find Symbol Name:"))) t)
    13. )

    14. (procedure By4311_Main_GrabClipboardSymbol()

    15.   ;器件位号前缀合集
    16.   Pre = list("U" "R" "C" "L")
    17.   ;字符前缀
    18.   Regular = "[A-Za-z0-9_+-=.]+"

    19.   By4311_GetClipboardSymbol()
    20.   By4311_GrabClipboardSymbol(GrabList)
    21. )

    22. (procedure By4311_GetClipboardSymbol()
    23.   axlUIConfirmEx( "Use This Command At Your Own Risk." "By4311_GrabClipboardSymbol")
    24. let( (P)
    25. ;清除选择集,设置过滤器
    26. axlClearSelSet()
    27. Filter = list("NoAll" "Symbols")
    28. axlSetFindFilter(?enabled Filter ?onButtons cdr(Filter))

    29. ;获得剪切板内容进行解析,转换为字符串链表
    30. TexList = axlClipboardGetText()
    31. TexList = buildString(parseString(TexList "\r") " ")
    32. TexList = buildString(parseString(TexList "\n") " ")
    33. TexList = parseString(TexList " ")

    34.   Analysis = list()
    35.   (foreach item Pre
    36.     printf("\n%s :" item)
    37.     New = rexMatchList(strcat(Regular item "[0-9]+") TexList)

    38.     rexCompile(strcat(Regular item))
    39.     (foreach otem New
    40.       printf("%L\t" rexReplace(otem item 1))
    41.       Analysis = cons(rexReplace(otem item 1) Analysis)
    42.     )
    43.   )

    44.   GrabList = list()
    45.   TexList = unique(append(TexList Analysis))

    46. ;在设计中查找链表包含的对象,放置到抓取合集中
    47.   (foreach item TexList
    48.     ID = car(axlSelectByName("REFDES" item))
    49.      when( ID
    50.      GrabList = cons(ID GrabList)
    51.      ;printf("%L\n" car(P)->refdes)
    52.      )
    53.   )

    54.   GrabList = unique(GrabList)
    55. )
    56. )

    57. (procedure By4311_GrabClipboardSymbol(TarList)
    58. let((Point item)
    59.    (if TarList ;传入的链表;如果不为空则抓取,如果为空则提示
    60.    then axlHighlightObject(TarList)
    61.    item = axlDBAltOrigin('center car(TarList)) ;默认鼠标附着基准点为第一个元素的中心坐标
    62.    axlDynamicsObject(TarList item) ;鼠标附着
    63.    Point = axlEnterPoint(?prompts `("Please Click To Select The Point To Place...")) ;选择新位置
    64.    axlDehighlightObject(TarList)
    65.    (if Point
    66.    then axlTransformObject(TarList ?move axlMXYSub(Point item)) ;整体移动
    67.    else axlMsgPut("User Canceled Operation.");用户取消操作
    68.    )
    69.    axlClearDynamics();清除鼠标附着
    70.    else
    71.    axlMsgPut("Did Not Grab The Symbol.");没有抓取到有用的信息
    72.    )
    73.   )
    74. )
    复制代码
  • TA的每日心情
    奋斗
    2025-4-27 15:26
  • 签到天数: 81 天

    [LV.6]常住居民II

    推荐
    发表于 2024-9-10 16:34 | 只看该作者
    看了下代码,这个错误是由重复的refdes + 使用了append导致的。
    建议用cons替代append,但是语法会不一样,你自己研究下。
    再建议用unique去重。

    另外还有很多地方写法习惯不好,但不影响使用,
    比如使用全局变量作为参数传递,没有必要。
    比如用和自带的关键字很像的名称List作为变量名。
    比如循环外和循环内用了同一个变量名,例如下面的P。
    (foreach item P
        P = axlSelectByName("REFDES" item)
    ...)

    比如SKILL里面尽量不要用UTF-8,特别是涉及到中文。

    点评

    感谢指点  详情 回复 发表于 2024-9-10 18:58
    头像被屏蔽
  • TA的每日心情
    开心
    2025-1-23 15:05
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    推荐
    发表于 2024-9-14 02:36 | 只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽

    该用户从未签到

    5#
    发表于 2024-9-9 14:18 | 只看该作者
    这个功能比较实用。

    该用户从未签到

    8#
    发表于 2024-9-10 12:56 | 只看该作者
    谢谢!感谢分享!

    该用户从未签到

    9#
    发表于 2024-9-10 14:00 | 只看该作者
    谢谢!感谢分享!
  • TA的每日心情
    慵懒
    2022-10-17 15:25
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    10#
    发表于 2024-9-10 14:36 | 只看该作者
    楼主,这个怎么用的?

    点评

    在PDF中框选复制器件文本信息,在allegro中执行~1即可将器件附着到鼠标  详情 回复 发表于 2024-9-12 11:11
  • TA的每日心情
    郁闷
    2024-7-25 15:18
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    11#
     楼主| 发表于 2024-9-10 18:58 | 只看该作者
    db-_- 发表于 2024-9-10 16:34
    看了下代码,这个错误是由重复的refdes + 使用了append导致的。
    建议用cons替代append,但是语法会不一样 ...

    感谢指点
  • TA的每日心情
    开心
    2025-5-28 15:49
  • 签到天数: 77 天

    [LV.6]常住居民II

    12#
    发表于 2024-9-11 12:54 | 只看该作者
    谢谢!感谢分享!
  • TA的每日心情
    郁闷
    2024-7-25 15:18
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    13#
     楼主| 发表于 2024-9-12 11:11 | 只看该作者
    929979964 发表于 2024-9-10 14:36
    楼主,这个怎么用的?

    在PDF中框选复制器件文本信息,在allegro中执行~1即可将器件附着到鼠标
  • TA的每日心情
    开心
    2025-6-4 15:35
  • 签到天数: 379 天

    [LV.9]以坛为家II

    14#
    发表于 2024-9-16 16:11 | 只看该作者
    這功能實在太好用了,如果後續還有優化進階就太神了!!!!

    该用户从未签到

    15#
    发表于 2024-12-3 03:05 | 只看该作者
    感谢分享

    “来自电巢APP”

  • TA的每日心情
    奋斗
    2025-2-28 15:32
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    16#
    发表于 2024-12-3 08:36 | 只看该作者
    大佬指点一下怎么加载,感谢。。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-5 03:27 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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