乐筑天下

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

[编程交流] Ssget在窗口上分割对象

[复制链接]

46

主题

92

帖子

45

银币

后起之秀

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

铜币
235
发表于 2022-7-5 17:27:06 | 显示全部楼层 |阅读模式
我选择了对象函数ssget。
  1. (setq s ssget)

我有一个角窗列表(图纸上的白色正方形)。
  1. '((x y) (x y) (x y) (x y) (x y))

如何在窗口内的对象上划分对象。
我需要每个窗口中的对象列表实体。
  1. '((<Entity name: 7ffff931b40> <Entity name: 7ffff931b40> ...)
  2. (...) (...) (...) (...))

有没有办法在系统变量ssget(ssget“_W”)上使用过滤器窗口
图纸中的示例。
182709prtzh8illtdwmami.jpg
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:46:36 | 显示全部楼层
像这样的
  1. (defun c:test ( / SS i ent lst x SelN n Nlst Tlst )
  2. (if
  3.         (and
  4.                 (princ "\nSelect the closed(white) plines: ")
  5.                 (setq SS (ssget '((0 . "LWPOLYLINE") (-4 . "&=") (70 . 1))))
  6.         );and
  7.         (progn
  8.                 (repeat (setq i (sslength SS)) ; repeat for each closed polyline
  9.                         (setq ent (ssname SS (setq i (1- i))))
  10.                         (setq        lst (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget ent))))
  11.                        
  12.                         (if
  13.                                 (and
  14.                                         (setq SelN (ssget "_WP" lst))
  15.                                         (or (not (ssmemb ent SelN)) (ssdel ent SelN))
  16.                                         (< 0 (sslength SelN))
  17.                                 )
  18.                                 (progn
  19.                                         (repeat (setq n (sslength SelN)) ; repeat for each entity inside the polyline
  20.                                                 (setq Nlst (cons (ssname SelN (setq n (1- n))) Nlst)) ; create list for the SS
  21.                                         )
  22.                                         (setq Tlst (cons (reverse Nlst) Tlst)) ; store the SS list into the global list
  23.                                         (setq Nlst nil) ; reset the SS list
  24.                                 )
  25.                         ); if
  26.                 ); repeat
  27.                 (princ "\n") (print Tlst) ; print the global list
  28.         );progn
  29. ); if/while
  30. (princ)
  31. )

 
这是经过大量修改的代码,原始代码来自Lee Mac(MatchCenInsPoly)-根据我的旧请求。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:59:35 | 显示全部楼层
另一种可能更复杂的方法是只选取一个窗口,但检查对象的最小/最大Y值,使其仅成为一个窗口组的一部分。另请看边界框方法。你可以改变窗户的大小。
回复

使用道具 举报

46

主题

92

帖子

45

银币

后起之秀

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

铜币
235
发表于 2022-7-5 18:06:20 | 显示全部楼层
它必须简单快捷。
我使用了一种解决方案,首先选择窗口的坐标,然后选择ssget(窗口)。
  1. (setq lst '(((x y) (x y)) ((x y) (x y))  ((x y) (x y)) ...))

 
  1. (mapcar '(lambda (%) (ssget "_W" (car %) (cadr %))) lst)

对不起我的英语。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:22:14 | 显示全部楼层
请小心在lisp中使用奇怪的字符,例如%,你可能想知道为什么有些东西不起作用。
回复

使用道具 举报

46

主题

92

帖子

45

银币

后起之秀

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

铜币
235
发表于 2022-7-5 18:37:39 | 显示全部楼层
谢谢你的建议。我会注意代码中的奇怪字符。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:29 , Processed in 0.518673 second(s), 67 queries .

© 2020-2025 乐筑天下

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