EDA365电子论坛网

标题: 请教一个skill问题 [打印本页]

作者: long83    时间: 2025-1-22 16:57
标题: 请教一个skill问题
各位大神,下面是我的代码段,主要是想切除板框外的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赋给这个器件!
请大家不吝赐教,谢谢

作者: db-_-    时间: 2025-1-22 17:33
你是想遍历每个component的的DISPLAY_TOP吧,但是
DisplayTopID=axlDBGetShapes("PACKAGE GEOMETRY/DISPLAY_TOP")
这一行和component(上文的each变量)没有任何关系,这行是获取DISPLAY_TOP所有的shape。

作者: long83    时间: 2025-1-22 18:00
db-_- 发表于 2025-1-22 17:33
你是想遍历每个component的的DISPLAY_TOP吧,但是
DisplayTopID=axlDBGetShapes("PACKAGE GEOMETRY/DISPLA ...

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

作者: zhualuo2    时间: 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)
作者: aarom    时间: 2025-1-22 20:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: db-_-    时间: 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、另外,真心希望某些大佬不要天天阴阳怪气的,实力是有的,但这样真的容易没!朋!友!

作者: long83    时间: 2025-1-23 10:36
db-_- 发表于 2025-1-23 10:27
我拿我的placebound试了一下,发现你这代码问题多多。

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

真心感谢您,对于新手小白来说太重要,谢谢谢谢

作者: PANSHER    时间: 2025-1-23 10:38
db-_- 发表于 2025-1-23 10:27
我拿我的placebound试了一下,发现你这代码问题多多。

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

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

作者: db-_-    时间: 2025-1-23 10:42
PANSHER 发表于 2025-1-23 10:38
能留个邮箱吗  有个代码想让您帮忙看下

kittledeng@126.com

作者: long83    时间: 2025-1-23 10:51
db-_- 发表于 2025-1-23 10:27
我拿我的placebound试了一下,发现你这代码问题多多。

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

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

作者: aarom    时间: 2025-1-23 11:41
提示: 作者被禁止或删除 内容自动屏蔽
作者: db-_-    时间: 2025-1-23 14:46
aarom 发表于 2025-1-23 11:41
提醒各位"世界級專業大師" :

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

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

作者: athena_lu    时间: 2025-1-25 16:16
谢谢分享。
作者: aarom    时间: 2025-2-3 15:36
提示: 作者被禁止或删除 内容自动屏蔽




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