乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 63|回复: 10

[编程交流] 反转功能不工作

[复制链接]
hei

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:23:47 | 显示全部楼层 |阅读模式
大家好。
 
所以我在这里,试图创建一个lisp命令,并且已经停留在它的第一部分(是的,我对lisp和任何与编程相关的东西都有点陌生)
 
无论如何,代码如下:
 
  1. (defun c:test ( / pl ent chequeo vert)
  2. (prompt "\nSeleccione objeto")
  3. (setq pl (entget (car (entsel))))
  4. (foreach ent pl
  5.         (setq chequeo (car ent))
  6.         (if (= chequeo 10)
  7.         (setq vert (cons (cdr ent) vert))
  8.         )
  9. )
  10. (reverse vert)
  11. (print vert)(princ)
  12. )

 
所以我注意到我正在创建的新列表中的项目按我想要的错误方式排序,然后我找到了一个反向函数,为我修复了它,只是什么都没有发生。无论我是否在命令中使用REVERSE,列表似乎保持不变,因此我不确定是我在这里做错了什么,还是我使用了REVERSE函数。
 
感谢您的帮助
 
提前感谢
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 18:35:14 | 显示全部楼层
  1. (defun c:test ( / plenx dxf chequeo vert )
  2. (setq plenx (entget (car (entsel "\nSeleccione objeto"))))
  3. (foreach dxf plenx
  4.    (setq chequeo (car dxf))
  5.    (if (= chequeo 10)
  6.      (setq vert (cons (cdr dxf) vert))
  7.    )
  8. )
  9. [color=red](setq vert [/color][color=blue](reverse vert)[/color][color=red])[/color]
  10. (print vert)
  11. (princ)
  12. )
HTH,M.R。
回复

使用道具 举报

hei

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:36:04 | 显示全部楼层
哈哈,现在看起来有点明显了。非常感谢,它现在正在工作!
 
但这让我想知道。。。我看到过其他代码,它们在手上没有setq,现在我很困惑什么时候应该在命令之前使用setq,什么时候不需要
回复

使用道具 举报

10

主题

253

帖子

75

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
223
发表于 2022-7-5 18:43:25 | 显示全部楼层
为什么不使用vl remove if not功能?
回复

使用道具 举报

55

主题

402

帖子

357

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
274
发表于 2022-7-5 18:51:19 | 显示全部楼层
当您通过Entsel发送信息时,不需要提示功能:-
  1. (setq pl (entget (car (entsel "\nSeleccione objeto"))))

执行此操作有不同的方法,例如:-
 
Foreach公司
  1. (foreach l pl
  2. (if (= (car l) 10)
  3.    (setq v (cons (cdr l) v))
  4. )
  5. )
  6. (setq v (reverse v))

 
地图车
  1. (vl-remove nil
  2.            (mapcar '(lambda (x)
  3.                       (if (eq (car x) 10)
  4.                         (cdr x)
  5.                       )
  6.                     )
  7.                    pl
  8.            )
  9. )

 
如果没有,则删除Vl
  1. (mapcar        'cdr
  2.         (vl-remove-if-not
  3.           '(lambda (x)
  4.              (eq (car x) 10)
  5.            )
  6.           pl
  7.         )
  8. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:57:09 | 显示全部楼层
 
FWIW,这里是几个“massoc”函数的性能比较。
回复

使用道具 举报

55

主题

402

帖子

357

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
274
发表于 2022-7-5 19:02:33 | 显示全部楼层
 
很好的比较李先生。。。
 
我的功能比较:-
  1.    (PROGN (FOREACH L PL (IF (= (CAR L) ...).....1669 / 1.34 <fastest>
  2.    (VL-REMOVE nil (MAPCAR (QUOTE (LAMBD...).....1903 / 1.17
  3.    (MAPCAR (QUOTE CDR) (VL-REMOVE-IF-NO...).....2231 / 1 <slowest>
回复

使用道具 举报

17

主题

1274

帖子

25

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
260
发表于 2022-7-5 19:06:47 | 显示全部楼层
 
要更改vert的值,必须以某种方式重置其值,但并不总是需要使用setq。您可以使用函数的输出,而无需将其保存为值。也许这就是你想的?
  1. (defun c:test ( / pl ent chequeo vert)
  2. (prompt "\nSeleccione objeto")
  3. (setq pl (entget (car (entsel))))
  4. (foreach ent pl
  5.         (setq chequeo (car ent))
  6.         (if (= chequeo 10)
  7.         (setq vert (cons (cdr ent) vert))
  8.         )
  9. )
  10. [color="blue"][b](reverse vert)[/b][/color]
  11. )
回复

使用道具 举报

hei

2

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 19:12:10 | 显示全部楼层
 
哇,最有效的一个似乎是把自己称为一个函数?这怎么可能?它似乎被称为递归,但我试图搜索有关它的材料,但似乎没有一个是我可以理解的lol。
 
当我完成我在这里试图完成的任务时,我将进一步研究它(试图使它更有效)
 
无论如何,出现了另一个问题,所以我只在这里发布,希望有人能够帮助我,而不必制作新的线程:
 
目前,我有以下代码:
 
  1. (setq y-aux (mapcar 'cadr vert))
  2. (print y-aux)(princ)
  3. (setq n 0)
  4. (repeat (- n-veces 1)
  5.         (setq h-aux (- (min (nth n y-aux) (nth (+ n 1) y-aux)) (nth n y-fund)))
  6.         (print h-aux)(princ)
  7.         (set h-fund (cons h-aux h-fund))
  8.         (print "checkpoint")(princ)
  9.         (setq n (+ n 1))
  10. )

 
这就是Autocad返回给我的信息:
 
  1. (7.99292 8.07037 8.15563 8.25114 8.35942 8.48295 8.62478 8.78742 8.97419 9.1877 9.4312 9.70793 10.0208 10.3739 10.7689 11.1954 11.6348 12.0677 12.4751 12.8378 13.137 13.3557 13.486 13.535 13.5121 13.4241 13.2795 13.0853 12.8488 12.5772 )
  2. 1.57056 ; error: bad argument type: symbolp nil

 
我添加了打印功能,以查看我把事情搞砸了,从它返回给我的信息来看,似乎是以下代码出错了(考虑到它正在正确打印y-aux和h-fund)
 
  1. (set h-fund (cons h-aux h-fund))

 
知道为什么吗?我以前做过三次完全相同的函数(但变量不同),除了这一次,它们都很好。
 
提前感谢!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:20:49 | 显示全部楼层
错误如下:
  1. (set h-fund (cons h-aux h-fund))

与setq不同,set函数将同时计算符号和值参数(setq仅计算值参数),从而计算符号h-fund,该符号h-fund的值明显为零。
 
这应该是:
  1. (setq h-fund (cons h-aux h-fund))

或:
  1. (set 'h-fund (cons h-aux h-fund))
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 19:27 , Processed in 1.925384 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表