找回密码
 注册
查看: 231|回复: 25

请教一个skill问题

[复制链接]

该用户从未签到

 楼主| 发表于 2025-1-22 16:57 | 显示全部楼层 |阅读模式

EDA365欢迎您登录!

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

x
各位大神,下面是我的代码段,主要是想切除板框外的PACKAGE GEOMETRY/DISPLAY_TOP,不知道这个遍历问题出在哪里,感觉逻辑没有问题啊。代码如下:
    foreach(eachComp topCompList
            symChildrenList = eachComp->symbol->definition->children
          foreach(each symChildrenList if(each->layer == "PACKAGE GEOMETRY/DISPLAY_TOP" then DisplayTopID=axlDBGetShapes("PACKAGE GEOMETRY/DISPLAY_TOP")
                  Poly1=axlPolyFromDB(car(DisplayTopID))
                  outlineID=axlDBGetShapes("BOARD GEOMETRY/DESIGN_OUTLINE")
                  Poly2=axlPolyFromDB(car(outlineID))
                  Poly3=axlPolyOperation(Poly1 Poly2 'ANDNOT)
                  Poly4=axlPolyOperation(Poly1 car(Poly3) 'ANDNOT)
                  axlDeleteObject(DisplayTopID)
                  axlDBCreateShape(car(Poly4) t "PACKAGE GEOMETRY/DISPLAY_TOP" nil nil))))

另外,我还想把新生成的PACKAGE GEOMETRY/DISPLAY_TOP赋给这个器件!
请大家不吝赐教,谢谢
  • TA的每日心情
    慵懒
    2024-11-14 15:27
  • 签到天数: 72 天

    [LV.6]常住居民II

    发表于 2025-1-23 10:27 | 显示全部楼层
    long83 发表于 2025-1-22 18:00
    我尝试换成each也是不行,请大神帮忙修正下?非常感谢

    我拿我的placebound试了一下,发现你这代码问题多多。

    1、eachComp->symbol->definition->children
    这里你修改的symbol实体(只有超出outline的实体才需要修改),所以不需要修改symbol定义,把definition去掉。

    2、if(each->layer == "PACKAGE GEOMETRY/PLACE_BOUND_TOP"
    这后面建议加上objType为shape的判断,如果有人用line画的,那么后续处理会出错。

    3、DisplayTopID=axlDBGetShapes("PACKAGE GEOMETRY/DISPLAY_TOP")
    这里肯定不对了,改成DisplayTopID=each,each此时就已经是专属于eachComp这个器件的DISPLAY_TOP层的shape了,不需要再去get,如上文所说,你get的是所有comp的shape,逻辑不对。

    4、Poly2=axlPolyFromDB(car(outlineID))
    这里如果你的outline只有一个shape,就没什么大问题,如果有多个,必须进行额外处理。

    5、Poly3=axlPolyOperation(Poly1 Poly2 'ANDNOT)和Poly4=axlPolyOperation(Poly1 car(Poly3) 'ANDNOT)
    这里操作有点复杂了,1 andnot (1 andnot 2) 直接就等于 1 and 2,所以写成一行poly1和poly2的and的操作就行。

    6、axlDeleteObject(DisplayTopID)
    这里也有问题,不是所有的shape都需要删除,咱们只需要删除有交集,and后结果不为(nil)的即可,为什么是(nil)不是nil呢,你自己思考思考。所以可以加个if或者when判断一下。

    7、axlDBCreateShape(car(Poly4) t "PACKAGE GEOMETRY/DISPLAY_TOP" nil nil))))
    如上面的大佬说的,这里的最后一个参数可以填上each->parent,这样的话,生成的shape不是独立的,是和symbol绑定的。移动、删除器件时,这个你刚创建的shape也会同样一起移动、删除。但是这里有个坑,和axlDeleteObject有关系,你可能会遇到。

    题外话
    1、从代码看,作者的思路大方向上是没有问题的,但是不擅长在skill中调试的手段。可以加上printf进行调试。比如我自己调试,就加上了以下内容,可以很方便的看到shape有没有交际,每个shape的父元素是不是symbol类型。
    printf("Poly1 = %L\n" Poly1)
    printf("Poly2 = %L\n" Poly2)
    printf("Poly4 = %L\n\n" Poly4~>??)
    printf("test = %L\n\n" each->parent->objType)


    2、代码还有很多可以优化的地方,比如加上axlDBTransactionStart等系列函数以及右键菜单,这样不用每次误删后重新打开pcb进行还原。比如可以将shape的原有prop复制到新的shape上。

    3、其实直接贴出修改完的代码给你更简单,1秒就贴完了,但真心希望每个学习skill的朋友能在水平上更上一层楼。多多思考,共同进步。

    4、另外,真心希望某些大佬不要天天阴阳怪气的,实力是有的,但这样真的容易没!朋!友!

    点评

    这才是大师风范。 三观正文风好。  发表于 2025-1-25 16:17
    其實只要選 SHAPE 就可以, 其他 選擇是假象.  发表于 2025-1-23 11:16
    大神可以把其他联系方式私信我不?就不在这里打扰大家了  详情 回复 发表于 2025-1-23 10:51
    能留个邮箱吗 有个代码想让您帮忙看下  详情 回复 发表于 2025-1-23 10:38
    真心感谢您,对于新手小白来说太重要,谢谢谢谢  详情 回复 发表于 2025-1-23 10:36

    评分

    参与人数 1威望 +1 收起 理由
    PANSHER + 1 赞一个!

    查看全部评分

  • TA的每日心情
    慵懒
    2024-11-14 15:27
  • 签到天数: 72 天

    [LV.6]常住居民II

    发表于 2025-1-22 17:33 | 显示全部楼层
    你是想遍历每个component的的DISPLAY_TOP吧,但是
    DisplayTopID=axlDBGetShapes("PACKAGE GEOMETRY/DISPLAY_TOP")
    这一行和component(上文的each变量)没有任何关系,这行是获取DISPLAY_TOP所有的shape。

    点评

    我尝试换成each也是不行,请大神帮忙修正下?非常感谢  详情 回复 发表于 2025-1-22 18:00

    该用户从未签到

     楼主| 发表于 2025-1-22 18:00 | 显示全部楼层
    db-_- 发表于 2025-1-22 17:33
    你是想遍历每个component的的DISPLAY_TOP吧,但是
    DisplayTopID=axlDBGetShapes("PACKAGE GEOMETRY/DISPLA ...

    我尝试换成each也是不行,请大神帮忙修正下?非常感谢

    点评

    我拿我的placebound试了一下,发现你这代码问题多多。 1、eachComp->symbol->definition->children 这里你修改的symbol实体(只有超出outline的实体才需要修改),所以不需要修改symbol定义,把definition去掉。  详情 回复 发表于 2025-1-23 10:27
  • TA的每日心情
    奋斗
    2020-12-18 15:41
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2025-1-22 18:24 | 显示全部楼层
    本帖最后由 zhualuo2 于 2025-1-22 18:26 编辑

    如果想将新建的铜皮赋予这个器件,下面新建铜皮的最后一个参数,不应该是nil,而是dbid of the object
    axlDBCreateShape(car(Poly4) t "PACKAGE GEOMETRY/DISPLAY_TOP" nil dbid)
  • TA的每日心情
    开心
    2025-1-23 15:05
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    发表于 2025-1-22 20:45 | 显示全部楼层
    本帖最后由 aarom 于 2025-1-22 22:15 编辑

    各位有"世界級事業有成就的大師們", 你們邏輯太複雜了, 小弟弟資質魯鈍.

    我這"事業無成"小弟弟的邏輯 : ( 只修改 SHAPE )
    1.確認 OUTLINE :
      (1) 確認 allegro 版本, 新版本(17.2以上),
           有 outlineID = axlDBGetDesign()->designOutline 會抓 BOARD GEOMETRY/DESIGN_OUTLINE 的dbid.
           (設定"BOARD GEOMETRY/OUTLINE"無用.)
      (2) 確認 allegro 版本, 舊版本(16.6以下),
           outlineID = axlDBGetShapes("BOARD GEOMETRY/OUTLINE") 可能會抓到不只一個dbid,        
           而且格式是LIST(代表一定至少要使用 car 抓dbid.),  個人我是會用面積比較, 取最大面積的單獨 dbid.

    2.確認 PACKAGE GEOMETRY/DISPLAY_TOP 的 SHAPE :
       (1) DisplayTopID=axlDBGetShapes("PACKAGE GEOMETRY/DISPLAY_TOP") 會抓到不只一個dbid, 所以必須使用 foreach 一個一個抓出單獨 dbid.

    3.直接 ANDNOT. (以下小弟弟能力有限,說不出指令.)
    (1) 使用  foreach 一個一個抓 DisplayTopID 的 dbid 跟 outlineID 的 ANDNOT 比對是否為 "真". ( 當然要先使用 axlPolyFromDB.)
    (2) 若 ANDNOT 比對是否為 "真" , 使用修改 SHAPE 指令(不是創建指令. 也不要刪除.), 修改成"真"的 "單獨 DisplayTopID 的 dbid".


    除非你存檔取代零件檔案, 及更新零件, 不然依以上做法, 只要 refresh symbol 會恢復原形. (不用抓零件.)

    還望看懂的大師, 指點小弟弟指令 一,二. 尤其 "使用修改 SHAPE 指令(不是創建指令. 也不要刪除.)," 省略了一些詳細步驟.

    使用 創建指令 是不會跟零件 有聯繫, (就是選了零件, 選不到SHAPE.),
    使用了 refresh symbol 會恢復原形, 外加保留切除的 SHAPE ,就是重疊 SHAPE .

    使用 修改指令 是會跟零件 有聯繫 (就是選了零件, 也選了SHAPE.), 使用了 refresh symbol 會恢復原形 .








    该用户从未签到

     楼主| 发表于 2025-1-23 10:36 | 显示全部楼层
    db-_- 发表于 2025-1-23 10:27
    我拿我的placebound试了一下,发现你这代码问题多多。

    1、eachComp->symbol->definition->children

    真心感谢您,对于新手小白来说太重要,谢谢谢谢
  • TA的每日心情
    郁闷
    2025-2-6 15:00
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2025-1-23 10:38 | 显示全部楼层
    db-_- 发表于 2025-1-23 10:27
    我拿我的placebound试了一下,发现你这代码问题多多。

    1、eachComp->symbol->definition->children

    能留个邮箱吗  有个代码想让您帮忙看下

    点评

    谢谢分享!: 1.0 支持!: 5.0
    谢谢分享!: 1 支持!: 5
    恭喜找對大師了, 祝事業有成!  发表于 2025-1-23 11:25
  • TA的每日心情
    慵懒
    2024-11-14 15:27
  • 签到天数: 72 天

    [LV.6]常住居民II

    发表于 2025-1-23 10:42 | 显示全部楼层
    PANSHER 发表于 2025-1-23 10:38
    能留个邮箱吗  有个代码想让您帮忙看下

    kittledeng@126.com

    点评

    谢谢分享!: 5.0 支持!: 5.0
    谢谢分享!: 5 支持!: 5
    大師助人為快樂之本!  发表于 2025-1-23 11:27

    该用户从未签到

     楼主| 发表于 2025-1-23 10:51 | 显示全部楼层
    db-_- 发表于 2025-1-23 10:27
    我拿我的placebound试了一下,发现你这代码问题多多。

    1、eachComp->symbol->definition->children

    大神可以把其他联系方式私信我不?就不在这里打扰大家了

    点评

    支持!: 5.0
    支持!: 5
    恭喜找對大師了, 祝事業有成!  发表于 2025-1-23 11:26
    上楼有邮箱,可以邮箱沟通  发表于 2025-1-23 11:12
  • TA的每日心情
    开心
    2025-1-23 15:05
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    发表于 2025-1-23 11:41 | 显示全部楼层
    本帖最后由 aarom 于 2025-1-23 14:14 编辑

    提醒各位"世界級專業大師" :

    ANDNOT 是切除方的shape. (是"偵測條件"代表切除成立, 也能是另一個SHAPE修改指令會用到.)

    AND 是保留方的shape. (只是 "創造" SHAPE 的指令, 使用它為"偵測條件"會誤判.)  
    (為何會誤判, 在於只要有部份重疊都成立. 包括內部完全重疊,未能切除部分.)
    (只要你想把 SHAPE 和零件聯繫, 完全用不到它.)                        


    因為大師們, 沒有用 AND 創造 SHAPE, 小弟弟提醒一下.



    還是大師們有獨到之處, 煩請教教小弟弟.

    (因為小弟弟功力只至此而已, 其他靠大師們去解了.)











    点评

    大佬说的对,确实需要andnot的结果作为条件,先来判断是否已经在outline外了。 否则每个器件都会生成一个新的shape,虽然生成的和以前一样,但是器件多的话运行速度就慢下来了。  详情 回复 发表于 2025-1-23 14:46
  • TA的每日心情
    慵懒
    2024-11-14 15:27
  • 签到天数: 72 天

    [LV.6]常住居民II

    发表于 2025-1-23 14:46 | 显示全部楼层
    aarom 发表于 2025-1-23 11:41
    提醒各位"世界級專業大師" :

    ANDNOT 是切除方的shape. (是"偵測條件"代表切除成立, 也能是另一個SHAPE修 ...

    大佬说的对,确实需要andnot的结果作为条件,先来判断是否已经在outline外了。
    否则每个器件都会生成一个新的shape,虽然生成的和以前一样,但是器件多的话运行速度就慢下来了。

    点评

    有種東西叫"反相選擇", 有種選擇視窗, 會依方向辨別, 碰到就算選到 或 必須完整選到物件才算選到, 就可排除大部份內部物件. (其實全部用 ANDNOT 篩選也非常快, 因為常拿來辨識物件是否重疊"AND"一樣, 如VIA.   发表于 2025-1-23 15:02
  • TA的每日心情
    开心
    2025-1-23 15:05
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    发表于 2025-2-3 15:36 | 显示全部楼层
    因這帖子, 我學到了另二個指令.

    能把 零件 關聯(連動)物件  和 取消關聯(連動)物件.

    重點在:
    1. 零件 關聯(連動) 另外創建SHAPE. (使用SHAPE修改指令下.)
    2. refresh symbol 也不會恢復, 更不影響存檔零件.


    我算賺到了.
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    EDA365公众号

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

    GMT+8, 2025-2-7 03:09 , Processed in 0.078125 second(s), 25 queries , Gzip On.

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

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

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