乐筑天下

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

[编程交流] 将三维点附加到列表

[复制链接]

16

主题

50

帖子

34

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-5 23:40:03 | 显示全部楼层 |阅读模式
我尝试了几个组合,浏览了大约100篇帖子,但我不知道我做错了什么。
 
我正在过滤对象并从数据库中提取三维坐标。然后我将其转化为一个3点列表(x y z)。然后,我想创建这些点的列表,并将其添加到现有列表中,因为程序会过滤选择集中的其余对象。
 
  1. (progn
  2. (setq unitpoint_orig (vl-string-right-trim ";" (substr (vlax-get entvla 'points) 12)))                       
  3. (if (and(or (= Z_pref "Y")(= Z_pref "y"))(/= Z_height nil))
  4.         (progn
  5.                 (setq unitpoint_mod (comma_pull unitpoint_orig "REAL_NUM"))
  6.                 (setq unitpoint (list (car unitpoint_mod) (cadr unitpoint_mod) (caddr Z_height)))
  7.         )
  8.         (setq unitpoint (comma_pull unitpoint_orig "REAL_NUM"))
  9. )
  10. (setq unitpoint_lst (append unitpoint_lst 'unitpoint))
  11. ;(command "insert" pl_block unitpoint "1" "1" "0")
  12. )

 
当前结果:(105.13 3165.22 0.0 105.13 3194.65 0.0 105.13 3142.5 0.0)
 
期望结果:((105.13 3165.22 0.0)(105.13 3194.65 0.0)(105.13 3142.5 0.0))
 
一旦这部分开始工作,我就计划使用李-麦克的子程序过滤重复项。然后根据这些点插入。
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 23:50:36 | 显示全部楼层
他们叫我约翰。
 
你可以在清单上使用这个小程序。
 
  1. (defun tupl3 (l) (if l (cons (list (car l) (cadr l) (caddr l))(tupl3 (cdddr l)))))

 
例如:
  1. (tupl3 '(105.13 3165.22 0.0 105.13 3194.65 0.0 105.13 3142.5 0.0))
  2. ((105.13 3165.22 0.0) (105.13 3194.65 0.0) (105.13 3142.5 0.0))
  3. _$

 
或者改变
 
  1. (setq unitpoint_lst (append unitpoint_lst 'unitpoint))
  2. to
  3. (setq unitpoint_lst (append unitpoint_lst (list unitpoint)))
回复

使用道具 举报

16

主题

50

帖子

34

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 00:04:31 | 显示全部楼层
正是我需要的。。。(我发誓我也厌倦了用“'”而不是“list”,但我想我犯了一个错误,
 
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 00:07:26 | 显示全部楼层
小列表没什么大不了的,但是(cons)比(append)快很多。
 
你基本上(cons-pt-list),然后如果列表的顺序很重要(反向lst)
 
如果你使用30000个原子,它会产生很大的不同-大卫
 
-大卫
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 00:16:07 | 显示全部楼层
他们叫我约翰,
 
大卫说得很对,我倾向于远离他。
 
在您的情况下,您可以简单地:
  1. (setq unitpoint_lst (cons unitpoint unitpoint_lst))
  2. ; and if necessary at the end :
  3. (setq unitpoint_lst (reverse unitpoint_lst))

 
此外,不完全必要,但我通常会设置列表
在开始建造之前将其设置为零。这是特别的
在调试阶段非常有用
您尚未声明变量,并且
运行测试。
 
ymg公司
回复

使用道具 举报

16

主题

50

帖子

34

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 00:23:50 | 显示全部楼层
 
 
David和Ymg,
谢谢你的建议。我会试试看是否可行。我也把它设置为nil,我只是把它放在defun下,这样当我调试完代码后,就可以更容易地使必要的变量成为局部变量。
 
 
更新:
所以它试着替换这个:
  1. (setq unitpoint_lst (cons unitpoint_lst (list unitpoint)))

 
为此:
  1. (setq unitpoint_lst (append unitpoint_lst (list unitpoint)))

 
但它不起作用,还有什么我需要改变的吗?
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 00:33:03 | 显示全部楼层
他们叫我约翰,
 
下面是一个使用Gilles Chanteau的解析例程的小示例。
我已经设置了一个要分析的字符串的虚拟列表:
 
  1. (defun test ()
  2.   (setq datalist '(";;;1.0, 2.0, 3.0,       weerertttretqrt"  ";;;4.0, 5.0, 6.0,       weerertttretqrt"    ";;;7.0, 8.0,9.0,       weerertttretqrt"))
  3.   (setq parsedlist nil)
  4.   (foreach item datalist
  5.       (setq parsedlist (cons (str2lst (vl-string-left-trim ";" item) ",") parsedlist))
  6.   )
  7.   (setq coordlist nil)
  8.   (foreach str parsedlist
  9.       (setq coordlist (cons (list (atof (car str)) (atof (cadr str)) (atof (caddr str))) coordlist))
  10.   )
  11.   
  12.   (princ)
  13. )        
  14.   
  15. ;; str2lst     by Gilles Chanteau                                             ;
  16. ;; Transform a string with separator into a list of strings.                  ;
  17. ;;                                                                            ;
  18. ;; Arguments:                                                                 ;
  19. ;; str : string of characters                                                 ;
  20. ;; sep : separator characters                                                 ;
  21. (defun str2lst (str sep / len lst)
  22. (setq len (strlen sep))
  23. (while (setq pos (vl-string-search sep str))
  24.    (setq lst (cons (substr str 1 pos) lst)
  25.   str (substr str (+ len pos 1))
  26.    )
  27. )
  28. (reverse (cons (substr str 1 pos) lst))
  29. )         

 
下面是跑步后的reult:
 
  1. _$ (test)
  2. _$ parsedlist
  3. (("7.0" " 8.0" "9.0" "       weerertttretqrt") ("4.0" " 5.0" " 6.0" "       weerertttretqrt") ("1.0" " 2.0" " 3.0" "       weerertttretqrt"))
  4. _$ coordlist
  5. ((1.0 2.0 3.0) (4.0 5.0 6.0) (7.0 8.0 9.0))
  6. _$

 
正如您在完成第一个foreach循环时所看到的,您的结果是
第一个位置的最后一项。
 
现在,我们运行另一个foreach循环来遍历坐标列表,结果是
列表顺序正确。
 
假设我们不必进行第二个循环,但您仍然希望您的列表处于正确的位置
顺序您将发布(反向列表)。
 
我们告诉你使用cons的唯一原因是它比append快十倍
特别是在长名单上。在你的情况下,你不必这样做,但它仍然是你需要的
我想知道。
 
现在,如果您发布由(vlax get entvla’points)返回的典型数据行,
也许我们可以提出建议,让你的任务更容易。
 
ymg公司
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 00:40:29 | 显示全部楼层
他们叫我约翰,
 
在回答帖子#6时,你需要的是:
 
  1. (setq unitpoint_lst (cons unitpoint  unitpoint_list))

 
ymg公司
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 00:28 , Processed in 1.591053 second(s), 68 queries .

© 2020-2025 乐筑天下

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