luiscarneirorm 发表于 2022-7-6 08:52:52

分层

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

BIGAL 发表于 2022-7-6 08:56:43

查找SSGET“C”的帮助,即拾取所有交叉框的对象,然后对其执行更改层之类的操作。

pBe 发表于 2022-7-6 09:01:03

样品
 
(defun c:test ()
   (vl-load-com)
   (if (not BArea)(setq BArea 100.00))
   (setq BArea (cond
                      ((getreal
                           (strcat "\nEnter Base Area:<"
                                     (rtos BArea 2 2)
                                     ">: ")))
                      (BArea)))
       (setq LayerBase (getstring "\nEnter Layer Name: "))
   (setq objs (ssget '((0 . "LWPOLYLINE,CIRCLE,HATCH"))))
      (repeat (sslength objs)
       (if
       (> (vla-get-area (vlax-ename->vla-object(setq ent(ssname objs 0)))) BArea)
               (entmod (subst (cons 8 LayerBase) (assoc 8 (setq ent (entget ent))) ent))
               )
      (ssdel (ssname objs 0) objs)
             )
   )
 
我看到的这种方法的问题是,如果您想一次根据它们的区域来分割它们,那么每次运行代码时都需要传递两个值作为参数。最大值和最小值(模糊)可能使用列表,也要注意序列。
 
否则,先从小区域开始,然后再从大区域开始。

luiscarneirorm 发表于 2022-7-6 09:04:37

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

pBe 发表于 2022-7-6 09:06:55

哦我现在明白了。。
 
我的错

luiscarneirorm 发表于 2022-7-6 09:10:03

有人能帮我吗???

pBe 发表于 2022-7-6 09:14:30

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

pBe 发表于 2022-7-6 09:16:11

以下是草稿:
(defun c:test (/ sp osp cmt Boxobj lyn lnm lylst)
(setq sp '(0.0 0.0))
(setq osp sp
wpsp
cnt 1
)
(if (not WdwSize)
         (setq WdwSize 200.00))
   (setq WdwSize (cond
                      ((getreal
                           (strcat "\nEnter Distance <"
                                     (rtos WdwSize 2 2)
                                     ">: ")))
                      (WdwSize)))
(while (if (null
       (setq
BoxObj (ssget "_C"
         sp
         (setq ep (polar sp
         0.785398163
         (* WdwSize 1.412)
    )
         )
         '((0 . "LWPOLYLINE,CIRCLE"))
)
       )
   )
   (progn
   (if (setq BoxObj (ssget "_C"
      (setq sp (polar osp 1.57079633 WdwSize))
      (polar sp 0.785398163 (* WdwSize 1.412))
      '((0 . "LWPOLYLINE,CIRCLE"))
      )
      osp    sp
)
BoxObj
       (setq BoxObj nil)
   )
   ) BoxObj
)
   (repeat (sslength BoxObj)
   (setq ent (entget (ssname BoxObj 0)))
   (entmod (subst (cons 8 (setq lnm (strcat "Base_" (itoa cnt))))
      (assoc 8 ent)
      ent
      )
   )
   (if (not (member lnm lylst))
(progn
(setq lylst (cons lnm lylst)
      lyn (entget (tblobjname "LAYER" lnm)))
       (entmod (subst (cons 62 cnt)(assoc 62 lyn) lyn))))
   (setq BoxObj (ssdel (ssname BoxObj 0) BoxObj))
   )
   (setq sp(polar sp 0 WdwSize)
cnt (1+ cnt)
   )
)

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

luiscarneirorm 发表于 2022-7-6 09:19:23

谢谢,这正是我需要的。
 
是的,窗户总是正方形的。
 
res1文件是使用其函数的结果。
res2该文件是我期望的结果,有一个实体没有放置在新层中,应该已经放置。
 
我也希望没有必要选择第一个点,但它是自动检测到的,但如果不可能,也不会是最大的问题。
 
 
 
提前感谢您的帮助
res1.dxf
res2.dxf

pBe 发表于 2022-7-6 09:23:38

您为窗口大小输入了什么值?
用刚输入的窗口大小从0,0绘制一个正方形。那扇窗户一定是开着的。我在你的样本文件上画了一个正方形,左上框的对象是第三象限的“局外人”(见附件)
 
顺便问一句,你想被提示输入“继续下一行”吗?如果你愿意,我们可以失去它。
 
如果你需要的话,我们可以从0,0,0开始
 
 
编辑:已更新发布代码
页: [1] 2
查看完整版本: 分层