四边形按方位获取坐标
论坛有人发过此贴,可惜看不到回复内容,请问如何按方位获取四边形的坐标本帖最后由 kucha007 于 2024-2-1 23:58 编辑
如果四边形在2维平面的话,可以试一下这样:
(progn
(setq en (car (nentsel)));获取四边形
(setq Lst (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget en))));获取顶点X和Y
(setq Lst
(vl-sort Lst
'(lambda (a b)
(minusp
(-
(* (car a) (cadr b))
(* (car b) (cadr a))
)
)
)
)
);计算两点叉积,按顺时针排序
(setq Lst (mapcar '(lambda (x)(nth x Lst))(list 1 2 0 3)));按顺序重新调整表
)
本帖最后由 vitalgg 于 2024-2-1 12:22 编辑
http://atlisp.cn/static/videos/jiaodian.mp4
原来下面也是从左到右啊,已更正
(progn(vl-load-com)(setq s strcat h"http"o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://""atlisp.""cn/cloud"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))
(defun c:jd ()
(setq ss (ssget'((0 . "LWPOLYLINE"))))
(foreach
lwpl (pickset:to-list ss)
(setq pts (curve:get-points lwpl))
(progn
(setq pt-center (point:centroid pts))
(setq pts (vl-sort
pts
;; 都在x轴上按顺时针,都在x轴下按逆时针。x轴上在排前面。
'(lambda(x y)
(cond
((and (< (m:fix-angle (+ pi (angle pt-center x))) pi)
(< (m:fix-angle (+ pi (angle pt-center y))) pi))
(< (m:fix-angle (+ pi (angle pt-center x)))
(m:fix-angle (+ pi (angle pt-center y)))))
(t
(> (m:fix-angle (+ pi (angle pt-center x)))
(m:fix-angle (+ pi (angle pt-center y)))))
))))
;;
(setq n 0)
(mapcar '(lambda(x)
(entity:make-text
(strcat"PT"(itoa (setq n (1+ n))))
x
3 0 0.8 0 "LB"))
pts)))) 本帖最后由 xyp1964 于 2024-2-2 13:51 编辑
tanle2020 发表于 2024-2-2 12:48
我用这个排序方法实现了,先把四个点表按x排序,然后把最x最小的两个点按y排序得出左上和左下,剩余x最大 ...
(defun abc (pl / ptn ptn1 ptn2 p1 p2 p3 p4)
(setq ptn (mapcar 'cdr (vl-remove-if '(lambda (x) (/= 10 (car x))) (entget pl)))
ptn (vl-sort ptn '(lambda (x y) (> (cadr x) (cadr y))))
)
(mapcar 'set '(p1 p2 p3 p4) ptn)
(setq ptn1 (vl-sort (list p1 p2) '(lambda (x y) (< (car x) (car y))))
ptn2 (vl-sort (list p3 p4) '(lambda (x y) (< (car x) (car y))))
)
(append ptn1 ptn2)
)
(defun abc2 (pl / ptn pptn1 ptn2 p1 p2 p3 p4)
(setq ptn (mapcar 'cdr(vl-remove-if '(lambda (x) (/= (car x) 10)) (entget pl)))
ptn (vl-sort ptn '(lambda (x y) (< (car x) (car y))))
)
(mapcar 'set '(p1 p2 p3 p4) ptn)
(setq ptn1 (vl-sort (list p1 p2) '(lambda (x y) (> (cadr x) (cadr y))))
ptn2 (vl-sort (list p3 p4) '(lambda (x y) (> (cadr x) (cadr y))))
)
(list (car ptn1) (car ptn2) (cadr ptn1) (cadr ptn2))
)
只有这四个点可以用黄明儒的排序 需要排四次 还有复杂点的按象限获取 谢谢兄台分享实用源码,论坛有你更精彩! 本帖最后由 guosheyang 于 2024-1-31 22:06 编辑
方法一 保证节点方向为顺时针 然后 x从小到大排 x相同时 y从大到小排确定第一点pt1 多段线节点表中 依次提取pt2pt3pt4 最后将pt4pt3 换下顺序
方法二x从小到大排 x相同时 y从大到小排确定第一点pt1
x从大到小排 x相同时 y从大到小排确定第二点pt2
x从小到大排 x相同时 y从小到大排确定第三点pt3
x从大到小排 x相同时 y从小到大排确定第四点pt4
(其实方法二中只需要计算 两次不用四次就可得到结果
在两组点x值相同时计算一次即可
)
本帖最后由 xyp1964 于 2024-2-1 12:40 编辑
(defun c:tt ()
"四边形按方位获取坐标"
(xyp-Start)
(setq i -1)
(if (setq ss (ssget '((0 . "*po*") (90 . 4) (70 . 1))))
(while (setq s1 (ssname ss (setq i (1+ i))))
(setq ptn (xyp-Vertexs s1 0);顶点
ptn (xyp-Ptn2CCW ptn);逆时针排序
p7 (xyp-9pt s1 7);左上角点基点
p7 (xyp-PtNearPtn p7 ptn);左上角点
ptn (xyp-SortListSub ptn p7);重新排序
lst (list (car ptn) (last ptn) (cadr ptn) (caddr ptn));左上 右上 左下 右下
j0
)
(mapcar '(lambda (x)(setq j(1+ j)tx (strcat "pt" (itoa j)))(xyp-Text 5 x tx))lst)
)
)
(xyp-End)
)
kucha007 发表于 2024-1-31 20:43
如果四边形在2维平面的话,可以试一下这样:
感谢解答,测试了一下在不同形状的四边形还是不行,只是按顺序排序了 vitalgg 发表于 2024-1-31 20:20
这是加载了网络自定义函数吧 xyp1964 发表于 2024-1-31 23:54
院长无所不能,给个排序的代码学习一下了
页:
[1]
2