乐筑天下

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

[编程交流] 分层

[复制链接]

4

主题

42

帖子

38

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 08:52:52 | 显示全部楼层 |阅读模式
你好
 
我正在尝试开发一个应用程序来简化我的工作,我需要做以下工作:
我需要将在特定层(base)中找到的元素划分为不同的层(base1,base2…),每个层只能在给定区域内具有对象。
 
下面展示了两张图纸,第一张是原件,第二张是我打算得到的。
ex1.dxf
ex2.dxf
 
在这个例子中,我用200*200的参考区域划分了图形,但这个值应该是可变的。。。
如果有任何对象不适合参考区域,则应将其更改为layer base\u too\u large
 
我脑子里想的是​​我是怎么做的,但把它转换成lisp是因为它更复杂。。。
 
原谅英语(谷歌翻译:哎呀:)
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 08:56:43 | 显示全部楼层
查找SSGET“C”的帮助,即拾取所有交叉框的对象,然后对其执行更改层之类的操作。
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 09:01:03 | 显示全部楼层
样品
 
  1. (defun c:test ()
  2.      (vl-load-com)
  3.      (if (not BArea)(setq BArea 100.00))
  4.      (setq BArea (cond
  5.                       ((getreal
  6.                              (strcat "\nEnter Base Area:  <"
  7.                                      (rtos BArea 2 2)
  8.                                      ">: ")))
  9.                       (BArea)))
  10.        (setq LayerBase (getstring "\nEnter Layer Name: "))
  11.      (setq objs (ssget '((0 . "LWPOLYLINE,CIRCLE,HATCH"))))
  12.       (repeat (sslength objs)
  13.        (if
  14.        (> (vla-get-area (vlax-ename->vla-object  (setq ent  (ssname objs 0)))) BArea)
  15.                (entmod (subst (cons 8 LayerBase) (assoc 8 (setq ent (entget ent))) ent))
  16.                )
  17.       (ssdel (ssname objs 0) objs)
  18.              )
  19.      )

 
我看到的这种方法的问题是,如果您想一次根据它们的区域来分割它们,那么每次运行代码时都需要传递两个值作为参数。最大值和最小值(模糊)可能使用列表,也要注意序列。
 
否则,先从小区域开始,然后再从大区域开始。
回复

使用道具 举报

4

主题

42

帖子

38

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 09:04:37 | 显示全部楼层
我觉得我自己不清楚,
我的意思是:
 
我有一个层(基础)中的所有实体,然后开始从左下角扫描该层。
当您找到第一个实体时,例如,创建一个200*200的窗口,将完全在此窗口内的所有实体发送到一个新层(base_1),然后继续执行此扫描并找到另一个实体,然后再次执行上一步。我打算在最大为200*200的区域中保持层之间的独立实体,并且只保留不适合该区域的原始层实体。
 
对不起,如果我在做什么来理解:哎呀:
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 09:06:55 | 显示全部楼层
哦我现在明白了。。
 
我的错
回复

使用道具 举报

4

主题

42

帖子

38

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 09:10:03 | 显示全部楼层
有人能帮我吗???
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 09:14:30 | 显示全部楼层
 
现在我想我明白你想做什么了。
 
那么你是说200x2000窗口内的实体将是一层?然后对另一层的下一个相同大小的窗口执行相同的操作。而那些边界之外的其他实体将被命名为base\u too\u large
 
从左下角的用户输入点开始。最下面一行先从左向右,然后再从左向右上一行?
 
和是的,这里有人可以也会帮助你
 
编辑:窗口的大小,总是正方形吗?
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 09:16:11 | 显示全部楼层
以下是草稿:
  1. (defun c:test (/ sp osp cmt Boxobj lyn lnm lylst)
  2. [color=olive] (setq sp '(0.0 0.0))[/color]
  3. (setq osp sp
  4. [color=olive] wp  sp[/color]
  5. cnt 1
  6. )
  7. [color=blue] (if (not WdwSize)[/color]
  8. [color=blue]           (setq WdwSize 200.00))[/color]
  9. [color=blue]     (setq WdwSize (cond[/color]
  10. [color=blue]                      ((getreal[/color]
  11. [color=blue]                             (strcat "\nEnter Distance <"[/color]
  12. [color=blue]                                     (rtos WdwSize 2 2)[/color]
  13. [color=blue]                                     ">: ")))[/color]
  14. [color=blue]                      (WdwSize)))[/color]
  15. (while (if (null
  16.        (setq
  17.   BoxObj (ssget [color=blue]"_C"[/color]
  18.          sp
  19.          (setq ep (polar sp
  20.            0.785398163
  21.            (* WdwSize 1.412)
  22.     )
  23.          )
  24.          '((0 . "LWPOLYLINE,CIRCLE"))
  25.   )
  26.        )
  27.      )
  28.    (progn
  29.      (if (setq BoxObj (ssget [color=blue]"_C"[/color]
  30.         (setq sp (polar osp 1.57079633 WdwSize))
  31.         (polar sp 0.785398163 (* WdwSize 1.412))
  32.         '((0 . "LWPOLYLINE,CIRCLE"))
  33.         )
  34.         osp    sp
  35.   )
  36.   BoxObj
  37.        (setq BoxObj nil)
  38.      )
  39.    ) BoxObj
  40. )
  41.    (repeat (sslength BoxObj)
  42.      (setq ent (entget (ssname BoxObj 0)))
  43.      (entmod (subst (cons 8 (setq lnm (strcat "Base_" (itoa cnt))))
  44.       (assoc 8 ent)
  45.       ent
  46.       )
  47.      )
  48.      (if (not (member lnm lylst))
  49. (progn
  50. (setq lylst (cons lnm lylst)
  51.         lyn (entget (tblobjname "LAYER" lnm)))
  52.        (entmod (subst (cons 62 cnt)(assoc 62 lyn) lyn))))
  53.      (setq BoxObj (ssdel (ssname BoxObj 0) BoxObj))
  54.    )
  55.    (setq sp  (polar sp 0 WdwSize)
  56.   cnt (1+ cnt)
  57.    )
  58. )
  59. (princ)
  60. )

 
例行程序结束时强调的实体被视为“局外人”,尚未决定如何处理
 
代码已更新
回复

使用道具 举报

4

主题

42

帖子

38

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 09:19:23 | 显示全部楼层
谢谢,这正是我需要的。
 
是的,窗户总是正方形的。
 
res1文件是使用其函数的结果。
res2该文件是我期望的结果,有一个实体没有放置在新层中,应该已经放置。
 
我也希望没有必要选择第一个点,但它是自动检测到的,但如果不可能,也不会是最大的问题。
 
 
 
提前感谢您的帮助
res1.dxf
res2.dxf
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 09:23:38 | 显示全部楼层
您为窗口大小输入了什么值?
用刚输入的窗口大小从0,0绘制一个正方形。那扇窗户一定是开着的。我在你的样本文件上画了一个正方形,左上框的对象是第三象限的“局外人”(见附件)
 
顺便问一句,你想被提示输入“继续下一行”吗?如果你愿意,我们可以失去它。
 
如果你需要的话,我们可以从0,0,0开始
 
 
编辑:已更新发布代码
095256p4iqtjk01dakdadt.png
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 06:11 , Processed in 2.140531 second(s), 74 queries .

© 2020-2025 乐筑天下

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