更改重复点的层
大家好,我有一张图,其中有许多点,其中东距和北距相同,但这些点的高程不同。我正在寻找lisp,它可以选择这些点,并将较高海拔的点分离到一个图层,将较低海拔的点分离到不同的图层。
提前感谢,祝所有用户新年快乐。 为了有机会得到正确的答案,您需要发布图形文件,以便做出响应的人能够知道点由什么组成,以及如何自动选择它们。 你是否试过拍摄正面视图,在那里可以立即看到不同的海拔高度?您甚至可以手动选择它们,这样就不用编写自己的lisp。
但是,和以往一样,张贴一张图纸将有助于给出最佳回复。 CADWORKER,
假设我们讨论的是点实体,那么应该使用以下方法:
新年快乐!!
ymg公司
(defun c:movdup (/ a b dl en enl i pl ss)
(setq pl nildl nil)
(princ "\nSelect Points: ")
(if (setq ss (ssget '((0 . "POINT"))))
(progn
(repeat (setq i (sslength ss))
(setq en (ssname ss (setq i (1- i)))
pl (cons (cons (cdr (assoc 10 (entget en))) en) pl))
)
(setq pl (vl-sort pl (function (lambda (a b) (< (caddar a) (caddar b))))) ;; Sort on Z Coordinate
pl (vl-sort pl (function (lambda (a b) (< (cadar a) (cadar b))))) ;; Sort on Y Coordinate
pl (vl-sort pl (function (lambda (a b) (< (caar a) (caar b))))) ;; Sort on X Coordinate
dl (vl-remove nil
(mapcar '(lambda (a b) (if (equal (cdr (reverse (car a))) (cdr (reverse (car b)))) (cdr a)))
pl (append (cdr pl) (list (car pl)))
)
)
)
;; dl should now be a list of ename of duplicate points. ;
(foreach en dl
(setq enl (entget en))
(entmod (subst (cons 8 "Lower Duplicate Points") (assoc 8 enl) enl ))
)
)
)
)
我在这里回答了类似的问题:
http://www.cadtutor.net/forum/showthread.php?83202-Z坐标-将所有对象移动到0,并定义空间。
也许,你可以用它,但它和你的要求没什么不同。。。
没关系,新年快乐。。。
M、 R。 还有一种方法:
(defun c:fixpoints ( / e i l s )
(if (setq s (ssget "_:L" '((0 . "POINT"))))
(progn
(repeat (setq i (sslength s))
(setq e (ssname s (setq i (1- i)))
l (cons (cons (assoc 10 (entget e)) e) l)
)
)
(foreach x
(LM:groupbyfunction l
(lambda ( a b )
(equal
(list (cadar a) (caddar a))
(list (cadar b) (caddar b))
1e-8
)
)
)
(foreach x (cdr (vl-sort x '(lambda ( a b ) (> (last (car a)) (last (car b))))))
(entmod (list (cons -1 (cdr x)) '(8 . "Lower Points")))
)
)
)
)
(princ)
)
;; Group By Function-Lee Mac
;; Groups items considered equal by a given predicate function
(defun LM:groupbyfunction ( lst fun / tmp1 tmp2 x1 )
(if (setq x1 (car lst))
(progn
(foreach x2 (cdr lst)
(if (fun x1 x2)
(setq tmp1 (cons x2 tmp1))
(setq tmp2 (cons x2 tmp2))
)
)
(cons (cons x1 (reverse tmp1)) (LM:groupbyfunction (reverse tmp2) fun))
)
)
)
(princ)
李,
不知道效率低下的地方在哪里,但如果irun在5000点列表上修复了3个重复点。
我的时机越来越不好。在60到83秒之间(变化很大)。
相反,Movdup只需0.3秒。
$ (c:fixpoints)
Fixpoints - Elapsed time: 66.2220 secs.
_$ (c:movdup)
Select Points:
Movdup - Elapsed time: 0.2970 secs.
_$
ymg公司
测试重复。图纸 瓶颈可能是LM:groupbyfunction函数,因为如果重复项很少,该函数将在整个列表中迭代多次,重复项越多,效率就越高。
排序方法当然更优化,但是,这当然取决于排序算法,在按每个坐标排序时不会严重干扰列表项的相对位置? 李,
不知道OP的典型特征是什么。
但我希望你的函数能在三角测量中使用它。
通常情况下,你会在一个大的点列表中找到一些重复的点。
至于排序,三角剖分通常只需要对坐标的X值进行排序。
新年快乐
ymg公司 很抱歉让ymg失望了-我必须想一个更好的算法
祝你新年快乐!
李
页:
[1]
2