乐筑天下

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

[编程交流] 按Z过滤多段线选择

[复制链接]

33

主题

267

帖子

213

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
197
发表于 2022-7-6 07:59:39 | 显示全部楼层 |阅读模式
有人能帮我指出正确的方向吗?我想通过Z值过滤多段线(等高线)的选择(即过滤仅获得10’或5’或2’等高线)。
我假设我需要测试Z值,看看它是10、5还是2的倍数,等等。。。
 
有什么关于如何得到这个sarted的提示吗?
 
谢谢
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 08:06:08 | 显示全部楼层
这些是长多段线还是重多段线-大卫
回复

使用道具 举报

33

主题

267

帖子

213

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
197
发表于 2022-7-6 08:06:38 | 显示全部楼层
我不确定。我必须弄清楚——我正在为我妹妹做这件事。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:12:23 | 显示全部楼层
要检查多段线类型,请加载并拾取多段线:
 
  1. (defun c:checkpoly ( / e )
  2.    (if (setq e (car (entsel)))
  3.        (print (cdr (assoc 0 (entget e))))
  4.    )
  5.    (princ)
  6. )

 
如果以上返回“LWPOLYLINE”,则可以通过LWPOLYLINE高程值DXF 38过滤选择:
 
  1. (ssget "_X" '((0 . "LWPOLYLINE") (38 . <YourElevationValue>)))

 
如果上面返回“POLYLINE”,事情就复杂了一点,因为Z值将包含在每个顶点的坐标中。此类顶点不是主要实体,因此无法使用ssget过滤器列表进行过滤。
 
在这种情况下,需要收集一组所有此类多段线,然后在此集合上迭代,删除那些顶点高程不正确的多段线。
回复

使用道具 举报

33

主题

267

帖子

213

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
197
发表于 2022-7-6 08:15:27 | 显示全部楼层
谢谢大家。我得拿一幅她的画来玩。
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 08:17:39 | 显示全部楼层
示例代码
  1. (defun c:test (/ elev ss)
  2. (initget 1 "2 5 10 ALL")
  3. (setq elev (getkword "\nSelect String for filter [2/5/10/ALL]: "))
  4. (setq ss (ssget "_X" (if (eq elev "ALL")
  5.    '((0 . "LWPOLYLINE")
  6.       (-4 . "<OR")
  7.       (38 . 24.0)
  8.       (38 . 60.0)
  9.       (38 . 120.0)
  10.       (-4 . "OR>")
  11.     )  
  12.   (list '(0 . "LWPOLYLINE")  
  13.       (cons 38  (* 12  (distof elev)))
  14.         )
  15.   )
  16.    )
  17.    )
  18. (sssetfirst nil ss)
  19. )
回复

使用道具 举报

33

主题

267

帖子

213

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
197
发表于 2022-7-6 08:21:21 | 显示全部楼层
谢谢pBe。你一定是个建筑师——我花了好几分钟才意识到你在看英寸。这些是地形等高线(均以英尺为单位)。
 
我想我已经解决了一般的概念,但是我在SSGET列表中遇到了一个错误。(错误的SSGET列表)
 
我需要做的(我认为)是逐步通过所有可能的10’标高,并在我们前进时将每个标高添加到SS中。最后,我们的目标是找到所有这些元素(任何10的倍数)并将其移动到特定层。
 
  1.   (setq elev 10)
  2. (while
  3. (<= elev 10000)
  4.    (setq temp (ssget "_X" '((0 . "LWPOLYLINE") (cons '38 elev))))
  5.    (setq ss (ssadd ss temp))
  6.     (setq temp nil)
  7. (setq elev (+ elev 10))
  8. );_end while

 
返回“**错误:错误参数类型:consp**”
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 08:24:30 | 显示全部楼层
我的猜测是,只需单步通过一组多段线就可以了
 
 
  1.                
  2. [b][color=blue](defun c:demo (/ elev ss i)[/color][/b]
  3. (setq elev 10 [color=blue][b]ss (ssadd)[/b][/color][color=black])[/color]
  4. (while
  5. (<= elev 10000)
  6.   [color=blue][b] (if (setq temp (ssget "_X" (List '(0 . "LWPOLYLINE") (cons 38 elev))))[/b][/color]
  7. [color=blue][b](repeat (setq i (sslength temp))[/b][/color]
  8. [color=blue][b]      (ssadd  (ssname temp (setq i (1- i))) ss)))[/b][/color]
  9.         (setq elev (+ elev 10))
  10. );_end while
  11. [b][color=blue](sssetfirst nil ss)[/color][/b]
  12.               )

 
 
即使您选择“全部”
 
-大卫
回复

使用道具 举报

33

主题

267

帖子

213

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
197
发表于 2022-7-6 08:25:21 | 显示全部楼层
 
明亮的
 
 
你不能在纠察车上使用foreach
 
需要vla对象+有效层
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 08:29:22 | 显示全部楼层
好的,如果我理解的话-我们选择所有的lwpolyline,然后过滤掉所有的10的倍数?
但是,我们如何测试z值是10的倍数?我不明白这是怎么回事。。。
 
那么,改变选择集中实体层的最佳方式是什么?
 
谢谢
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-9 21:17 , Processed in 0.716893 second(s), 83 queries .

© 2020-2025 乐筑天下

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