EDA365电子论坛网

标题: 【分享】用于PDF原理图快速抓取器件的SKILL [打印本页]

作者: ashnoer    时间: 2024-9-9 13:04
标题: 【分享】用于PDF原理图快速抓取器件的SKILL
本帖最后由 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
作者: Sleep_xz    时间: 2024-9-9 14:18
这个功能比较实用。
作者: zc333    时间: 2024-9-9 15:30
谢谢共享。。。。。。。
作者: kingweison    时间: 2024-9-9 17:18
:):)
作者: 你好阿    时间: 2024-9-10 12:56
谢谢!感谢分享!
作者: 6940    时间: 2024-9-10 14:00
谢谢!感谢分享!
作者: 929979964    时间: 2024-9-10 14:36
楼主,这个怎么用的?
作者: db-_-    时间: 2024-9-10 16:34
看了下代码,这个错误是由重复的refdes + 使用了append导致的。
建议用cons替代append,但是语法会不一样,你自己研究下。
再建议用unique去重。

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

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


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

感谢指点

作者: 无痕03356    时间: 2024-9-11 12:54
谢谢!感谢分享!
作者: ashnoer    时间: 2024-9-12 11:11
929979964 发表于 2024-9-10 14:36
楼主,这个怎么用的?

在PDF中框选复制器件文本信息,在allegro中执行~1即可将器件附着到鼠标
作者: aarom    时间: 2024-9-14 02:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: kilbird    时间: 2024-9-16 16:11
這功能實在太好用了,如果後續還有優化進階就太神了!!!!
作者: ee_windy    时间: 2024-12-3 03:05
感谢分享
作者: fuxiangyupi23    时间: 2024-12-3 08:36
大佬指点一下怎么加载,感谢。。
作者: bingshuihuo    时间: 2024-12-8 08:08
谢谢!感谢分享!
作者: Dc202501021a    时间: 2025-1-2 01:24
请问代码怎么用
作者: gogogo冲冲冲    时间: 2025-2-14 21:35
谢谢分享,下来试一试
作者: ashnoer    时间: 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. )
复制代码





欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2