在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2134|回复: 8

[求助] 求助skill的car和cdr嵌套使用时的访问规则

[复制链接]
发表于 2021-8-19 11:51:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
本帖最后由 新手IC工程师 于 2021-8-19 12:05 编辑

1629344475(1).png 1629345884(1).png

我想通过car和cdr来得到bBox中指定的坐标,上面这个car和cdr嵌套时的访问是从car开始还是cdr开始?bBox得到的xy坐标是算成两个list还是一个,它是怎么被读取的?
发表于 2021-8-19 12:41:04 | 显示全部楼层
括号的规则是从最里面算到最外面,和C语言一样的。

geGetSelSet() 的返回值本身就是一个List,geGetSelSet()~>bBox这个操作就是拿到了所有被选中图形的bBox,组成了一个list,赋值给cv。而cv本身没有bBox这个属性的,所以cv~>bBox这个操作不对。
 楼主| 发表于 2021-8-19 14:24:02 | 显示全部楼层
本帖最后由 新手IC工程师 于 2021-8-19 14:36 编辑


amodaman 发表于 2021-8-19 12:41
括号的规则是从最里面算到最外面,和C语言一样的。

geGetSelSet() 的返回值本身就是一个List,geGetSelSet ...


我第一张图那条指令只是我尝试提一下目标的bBox,后面那张图才是提取目标具体的坐标,两个结果做个对照。两条指令不是放一起跑的。

第二条指令执行过程应该是先得到第一张图中的bBox,再用cdar来提取坐标的吧?我是想知道car和cdr是以一种什么规则读取的这个坐标?car是得到list中的第一个元素,cdr是得到除第一个元素外的其他元素,按我的理解,cdr应该会得到-2.3235 这个X坐标值吧。但它失败了,我有点不理解。
1629353783(1).png



发表于 2021-8-19 14:36:51 | 显示全部楼层
本帖最后由 amodaman 于 2021-8-19 15:09 编辑

我已经说过了geGetSelSet()~>bBox这个语句的习惯非常不好。

cv = geGetSelSet() ;; 这是一个list,一组被选择的objects
foreach(cvObj cv
     when( cvBBox = cvObj~>bBox  ;; 取到单个object的bBox属性

        xy_ll = car(cvBBox) ;; 左下点坐标 x:y
        x_ll = car(xy_ll) ;; 左下 x 坐标
        y_ll = cadr(xy_ll) ;; 左下 y 坐标
        printf("lower left x: %f\t y: %f\n" x_ll y_ll)

       xy_ur = cadr(cvBBox) ;; 右上点坐标 x:y
       x_ur = car(xy_ur) ;; 右上 x 坐标
       y_ur = cadr(xu_ur) ;; 右上 y 坐标
       printf("upper right x: %f\t y: %f\n" x_ur y_ur)      )  ;; when
) ;; foreach


发表于 2021-8-19 14:40:33 | 显示全部楼层
本帖最后由 amodaman 于 2021-8-19 14:50 编辑

geGetSelSet()~> bBox语句等同于一个lambda函数:

lambda((x) x~>bBox geGetSelSet())

这句返回所有被选objects的bBox,组成了一个list。list中每一个元素都是两个点,左下和右上;每个点都是 x:y的形式。数据结构看到这已经看穿透了,就没啥了。

 楼主| 发表于 2021-8-19 15:01:34 | 显示全部楼层


amodaman 发表于 2021-8-19 14:36
我已经说过了geGetSelSet()~>bBox这个语句的习惯非常不好。

cv = geGetSelSet() ;; 这是一个list,一组被 ...


多谢大佬,我还想问一下cdr不是可以得到列表表尾的元素吗?为什么上面的指令中直接用的话会失败?
发表于 2021-8-19 15:08:22 | 显示全部楼层
因为被选中的objects很有可能根本就没有bBox这个属性,比如多边形,或者一根线。
 楼主| 发表于 2021-8-19 15:19:32 | 显示全部楼层


amodaman 发表于 2021-8-19 15:08
因为被选中的objects很有可能根本就没有bBox这个属性,比如多边形,或者一根线。 ...


多谢大佬提点
发表于 2021-8-25 11:04:35 | 显示全部楼层


新手IC工程师 发表于 2021-8-19 15:01
多谢大佬,我还想问一下cdr不是可以得到列表表尾的元素吗?为什么上面的指令中直接用的话会失败?
...


你说的没错,car访问list的第一个元素,cdr访问list除第一个元素外的其他元素,但要注意cdr返回的仍是list
因此我们在提取一个矩形的右上角坐标时用cadr,cadr就是car(cdr())
假设一个坐标bBox = (( 300 400 ) ( 500 450 )),
cdr ( bBox ) = ( ( 500 450 ) ) 这个地方就是两个括号,( 500 450 )是bBox的元素
car ( cdr ( bBox ) )=( 500 450 ) 得到右上角坐标
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-19 04:50 , Processed in 0.022119 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表