乐筑天下

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

[编程交流] 比较上的2个实体列表

[复制链接]
gsc

33

主题

90

帖子

57

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
165
发表于 2022-7-5 16:02:02 | 显示全部楼层 |阅读模式
你好
 
我想比较多段线实体列表和圆实体列表:
 
如果多段线端点垂直XY坐标与圆心坐标XY匹配。
然后将圆的层名称写入新列表。
 
如果不匹配,则返回“不匹配”
 
 
我已经有了一个子例程,可以获取LWpolyline的(开始)顶点。
在重复中尝试重复。。。但那没有成功。
所以我在这里被绊住了,跟mapcar lambda成员有什么关系?
 
有人能帮我比较两个列表吗
 
格里茨,
 
格本
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 16:10:56 | 显示全部楼层
你能写下这两个列表吗?或者你是在选择了多段线和圆来检查它们的坐标之后?
 
需要更多的信息。
回复

使用道具 举报

76

主题

312

帖子

254

银币

后起之秀

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

铜币
390
发表于 2022-7-5 16:11:50 | 显示全部楼层
下面的代码允许您选择多段线。
然后检查其端点上是否有圆。
如果是这样,则将圆移动到图层MATCHLAYER。
 
  1. (defun C:CadTutor ( / polyline polylinex polyliney allcircles n ensel enlist circlex circley)
  2. (setq polyline (entget (car (entsel))))
  3. (setq polylinex (car (cdr (assoc 10 (reverse polyline)))))
  4. (setq polyliney (car (cddr (assoc 10 (reverse polyline)))))
  5. (setq allcircles (ssget "_X" (list (cons 0 "CIRCLE"))))
  6. (setq n (sslength allcircles))
  7. (repeat n
  8.         (setq ensel (ssname allcircles (setq n (1- n))))
  9.         (setq enlist (entget ensel))
  10.         (setq circlex (car (cdr (assoc 10 enlist))))
  11.         (setq circley (car (cdr (cdr (assoc 10 enlist)))))
  12.         (if (and (= polylinex circlex)(= polyliney circley))
  13.                 (progn
  14.                         (princ "\nMatch found!")
  15.                         (setq enlist (subst (cons 8 "MATCHLAYER") (assoc 8 enlist) enlist))
  16.                         (entmod enlist)
  17.                 )
  18.                 (progn
  19.                         (princ "\nNo match...")
  20.                 )
  21.         )
  22. )
  23. (princ)
  24. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 16:18:48 | 显示全部楼层
我的尝试。
 
  1. (defun c:Test ( / int sel ent lst )
  2. ;; Tharwat - Date: 11.Sep.2017        ;;
  3. (if (and (or (setq int -1 sel (ssget "_X" (list '(0 . "CIRCLE") (cons 410 (getvar 'CTAB)))))
  4.               (alert "Couldn't find any circle in this drawing <!>")
  5.               )
  6.           (progn
  7.             (while (setq ent (ssname sel (setq int (1+ int))))
  8.               (setq lst (cons (list ent (cdr (assoc 10 (entget ent)))) lst))
  9.               )
  10.             lst
  11.             )
  12.           (princ "\nSelect LWpolylines to change circles reside on their end points to MatchLayer :")
  13.           (setq int -1 sel (ssget '((0 . "LWPOLYLINE"))))
  14.           )
  15.    (while (setq ent (ssname sel (setq int (1+ int))))
  16.      (vl-some '(lambda (p)
  17.                  (if (or (equal (vlax-curve-getstartpoint ent) (cadr p) 1e-4)
  18.                          (equal (vlax-curve-getendpoint ent) (cadr p) 1e-4)
  19.                          )
  20.                    (entmod (append (entget (car p)) '((8 . "MatchLayer"))))))
  21.               lst)
  22.      )
  23.    )
  24. (princ)
  25. ) (vl-load-com)
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 16:20:55 | 显示全部楼层
注:如果起点和终点上有两个圆,则只需将函数vl some替换为mapcar。
回复

使用道具 举报

gsc

33

主题

90

帖子

57

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
165
发表于 2022-7-5 16:26:59 | 显示全部楼层
 
Thanx man,你的代码工作顺利,但它并不完全是我想要的。
我将其更改为我想要实现的目标:
 
变化:
所有圆都在不同的层中
因为所有圆都在(或应该在)多段线端点上
我想要一个条件,即如果任何LWPOLYLINE端点等于任何圆的中心点,则将圆图层名称写入列表。
但如果不相等,则例程必须终止并发出警报,因为CAD绘图员在修改过程中可能会移动x个圆。
 
“WHILE VL-SOME LAMBDA IF”循环将1个多段线端点与所有选定的圆中心点进行比较。。。如果我错了,请纠正我,如果选择了77个圆,76个圆不等于当前的LWPOLYLINE端点。但是,其他76个圆可能与其他多段线端点匹配。
 
这可能吗?
回复

使用道具 举报

gsc

33

主题

90

帖子

57

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
165
发表于 2022-7-5 16:33:26 | 显示全部楼层
嗨,塔瓦,
 
你的代码运行平稳,但这并不完全是我想要的。
我画的所有圆圈都在不同的图层上
此外,所有圆都(或应该)位于LWD多段线端点上(因此目前我不需要起点)。
如果这是真的,则必须将圆层名称写入列表。
但您的While循环将1个多段线端点与所有圆的中心点进行比较。
因此,如果假设集合中有77个圆,其中76个与循环中当前LWPOLYLINE端点的端点不匹配。
但是,它们确实与其他多段线端点匹配。
我想要实现的是,如果任何LWPOLYLINE端点与任何圆中心点匹配,则将圆图层名称写入列表
如果不是,则x数量的圆不位于LWD多段线端点上(CAD绘图员在修改过程中可能会移动一些圆),例程应终止并发出警报。
 
我对您的代码进行了一些修改,以显示我想要的:
 
  1. (defun c:Test ( / int sel ent lst )
  2. ;; Tharwat - Date: 11.Sep.2017    ;;
  3.            
  4.      (setq ss2_list nil)
  5.    (setq wtg_id2_lst nil)
  6.    (if
  7.        (and
  8.            (or
  9.                (setq int -1 sel (ssget "_X" (list '(0 . "CIRCLE") (cons 410 (getvar 'CTAB)))))
  10.            (alert "Couldn't find any circle in this drawing <!>")
  11.            )
  12.            (progn
  13.                (while (setq ent (ssname sel (setq int (1+ int))))
  14.                    (setq ss2_list (cons (list ent (cdr (assoc 10 (entget ent)))) ss2_list))
  15.                )
  16.                ss2_list
  17.            )
  18.            
  19.            (princ "\nSelect LWpolylines to change circles reside on their end points to MatchLayer :")
  20.            (setq int -1 sel (ssget '((0 . "LWPOLYLINE"))))
  21.        )
  22.        (while (setq ent (ssname sel (setq int (1+ int))))
  23.            (vl-some '(lambda (p)
  24.                (cond ((equal (vlax-curve-getendpoint ent) (cadr p) 1e-4)
  25.                            (setq wtg_id2_lst (cons (cdr (assoc 8 (entget (car p)))) wtg_id2_lst))
  26.                        )
  27.                        ((/= (vlax-curve-getendpoint ent) (cadr p) 1e-4)
  28.                            
  29.                            ; All circles are (or should be) on endpoints of LWPOLYLINES
  30.                            ; So If any circle is not on any LWPOLYLINE endpoint then break the routine with an alert
  31.                        )
  32.                )
  33.            )
  34.            ss2_list)
  35.        )
  36.    )
  37.    (princ)
  38. )
  39. (vl-load-com)
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 16:38:24 | 显示全部楼层
像这样的?
  1. (defun c:Test ( / int sel ent lst fnd obj lys)
  2. ;; Tharwat - Date: 11.Sep.2017    ;;
  3.    (if (and (or (setq int -1 sel (ssget "_X" (list '(0 . "CIRCLE") (cons 410 (getvar 'CTAB)))))
  4.                 (alert "Couldn't find any circle in this drawing <!>")
  5.                 )
  6.            (progn
  7.                (while (setq ent (ssname sel (setq int (1+ int))))
  8.                    (setq lst (cons (list ent (cdr (assoc 10 (entget ent)))) lst))
  9.                )
  10.                lst
  11.              )
  12.            (princ "\nSelect LWpolylines to change circles reside on their end points to MatchLayer :")
  13.            (setq int -1 sel (ssget '((0 . "LWPOLYLINE"))))
  14.        )
  15.        (while (and (not fnd) (setq ent (ssname sel (setq int (1+ int)))))
  16.           (if (vl-some '(lambda (o) (and (equal (vlax-curve-getendpoint ent) (cadr o) 1e-4) (setq obj o))) lst)
  17.              (setq lys (cons (cdr (assoc 8 (entget (car obj)))) lys))
  18.                  (progn
  19.                    (setq fnd t)
  20.                    (alert "Found a circle not reside on any end point of a LWpolyline <!>")
  21.                    )
  22.             )
  23.          )
  24.      )
  25.    lys
  26. ) (vl-load-com)
回复

使用道具 举报

gsc

33

主题

90

帖子

57

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
165
发表于 2022-7-5 16:42:49 | 显示全部楼层
哇,很有魅力!thanx公司
 
关于它的几个问题:
代码中的(非fnd)和(setq fnd t)是什么?当我在它们前面加分号时,仍然得到相同的结果
2.while语句后的lst和if语句后的lys是否相同?
回复

使用道具 举报

gsc

33

主题

90

帖子

57

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
165
发表于 2022-7-5 16:45:13 | 显示全部楼层
是否可以在变量中捕捉不在LWDOLYLINE任何端点上的圆形对象?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-1 10:27 , Processed in 0.525856 second(s), 84 queries .

© 2020-2025 乐筑天下

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