分层
你好我正在尝试开发一个应用程序来简化我的工作,我需要做以下工作:
我需要将在特定层(base)中找到的元素划分为不同的层(base1,base2…),每个层只能在给定区域内具有对象。
下面展示了两张图纸,第一张是原件,第二张是我打算得到的。
ex1.dxf
ex2.dxf
在这个例子中,我用200*200的参考区域划分了图形,但这个值应该是可变的。。。
如果有任何对象不适合参考区域,则应将其更改为layer base\u too\u large
我脑子里想的是我是怎么做的,但把它转换成lisp是因为它更复杂。。。
原谅英语(谷歌翻译:哎呀:) 查找SSGET“C”的帮助,即拾取所有交叉框的对象,然后对其执行更改层之类的操作。 样品
(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)
)
)
我看到的这种方法的问题是,如果您想一次根据它们的区域来分割它们,那么每次运行代码时都需要传递两个值作为参数。最大值和最小值(模糊)可能使用列表,也要注意序列。
否则,先从小区域开始,然后再从大区域开始。 我觉得我自己不清楚,
我的意思是:
我有一个层(基础)中的所有实体,然后开始从左下角扫描该层。
当您找到第一个实体时,例如,创建一个200*200的窗口,将完全在此窗口内的所有实体发送到一个新层(base_1),然后继续执行此扫描并找到另一个实体,然后再次执行上一步。我打算在最大为200*200的区域中保持层之间的独立实体,并且只保留不适合该区域的原始层实体。
对不起,如果我在做什么来理解:哎呀: 哦我现在明白了。。
我的错 有人能帮我吗???
现在我想我明白你想做什么了。
那么你是说200x2000窗口内的实体将是一层?然后对另一层的下一个相同大小的窗口执行相同的操作。而那些边界之外的其他实体将被命名为base\u too\u large
从左下角的用户输入点开始。最下面一行先从左向右,然后再从左向右上一行?
和是的,这里有人可以也会帮助你
编辑:窗口的大小,总是正方形吗? 以下是草稿:
(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)
)
例行程序结束时强调的实体被视为“局外人”,尚未决定如何处理
代码已更新 谢谢,这正是我需要的。
是的,窗户总是正方形的。
res1文件是使用其函数的结果。
res2该文件是我期望的结果,有一个实体没有放置在新层中,应该已经放置。
我也希望没有必要选择第一个点,但它是自动检测到的,但如果不可能,也不会是最大的问题。
提前感谢您的帮助
res1.dxf
res2.dxf 您为窗口大小输入了什么值?
用刚输入的窗口大小从0,0绘制一个正方形。那扇窗户一定是开着的。我在你的样本文件上画了一个正方形,左上框的对象是第三象限的“局外人”(见附件)
顺便问一句,你想被提示输入“继续下一行”吗?如果你愿意,我们可以失去它。
如果你需要的话,我们可以从0,0,0开始
编辑:已更新发布代码
页:
[1]
2