EDA365电子论坛网

标题: 我想实现把框选区域里的器件摆在一个手绘的矩形框里 [打印本页]

作者: binmuk    时间: 2024-9-10 16:31
标题: 我想实现把框选区域里的器件摆在一个手绘的矩形框里
为什么总是提示选择器件出问题?

axlCmdRegister("autoplace" 'arrange_components_in_box ?cmdType "sub_cmd")
axlSetFunckey("m" "autoplace" t)
procedure(arrange_components_in_box()
    let((selected_comps box_coords place_box min_x min_y max_x max_y comp_width comp_height i j x_step y_step)

        ;;获取用户选择的器件
        axlClearSelSet()
        axlSetFindFilter( ?enabled '("NOALL" "components")
                                                ?onButtons '("components")
                                        )

        selected_comps = axlGetSelSet()

        ;; 如果没有选中器件,提示用户
        when(!selected_comps
            error("please slect components")
        )

        ;;获取用户画的方框 (可以通过用户交互或者预设方式)
        place_box = axlEnterBox()

        ;;方框的四个角坐标
        min_x = car(car(place_box))
        min_y = cadr(car(place_box))
        max_x = car(cadr(place_box))
        max_y = cadr(cadr(place_box))

        ;;计算方框内的可用宽度和高度
        box_width = max_x - min_x
        box_height = max_y - min_y

        ;;计算每个器件的宽度和高度 (使用placebound区域)
        comp_width = 0
        comp_height = 0

        foreach(comp selected_comps
            ;;获取器件的placebound边界
            bound_box = axlDBGetBoundingBox(comp)
            comp_width = max(comp_width, car(cadr(bound_box)) - car(car(bound_box)))
            comp_height = max(comp_height, cadr(cadr(bound_box)) - cadr(car(bound_box)))
        )

        ;;计算排列间距
        x_step = comp_width + 100
        y_step = comp_height + 100

        ;;将器件按顺序排列在方框内
        i = 0
        j = 0
        foreach(comp selected_comps
            ;;计算新位置
            new_x = min_x + i * x_step
            new_y = max_y - j * y_step

            ;;如果超出方框宽度,则换行
            when(new_x + comp_width > max_x
                i = 0
                j = j + 1
                new_x = min_x
                new_y = max_y - j * y_step
            )

            ;;移动器件到新位置
            axlTransformDB(comp, list(new_x, new_y))

            ;; 更新排列索引
            i = i + 1
        )
    )
)


作者: binmuk    时间: 2024-9-10 16:36
执行后就提示:*Error* please slect components
但是选中择器件也不行
作者: binmuk    时间: 2024-9-10 17:56
另外axlDBGetBoundingBox这个函数也提示不存在
作者: db-_-    时间: 2024-9-10 18:00
多翻翻HELP,不仅axlDBGetBoundingBox没有,axlTransformDB也没有吧。
作者: binmuk    时间: 2024-9-10 19:21
db-_- 发表于 2024-9-10 18:00
多翻翻HELP,不仅axlDBGetBoundingBox没有,axlTransformDB也没有吧。

那应该是virtuoso里的了,不过按照这个思路找一下allegro这边的应该可以搞一下

作者: aarom    时间: 2024-9-12 04:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: binmuk    时间: 2024-9-17 09:35
aarom 发表于 2024-9-12 04:06
功力太弱,

只看出開頭的 selected_comps = axlGetSelSet() 位置錯了.

嗯嗯,不错,看来有一定功力

作者: digitzing    时间: 2025-5-13 14:12
我写了个...
作者: 倾听风雨    时间: 2025-8-12 08:24
666666666
作者: 学无止境```    时间: 2025-9-28 16:58
digitzing 发表于 2025-5-13 14:12
我写了个...

方便分享下嘛





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