tanle2020 发表于 2024-1-31 19:11:30

四边形按方位获取坐标

论坛有人发过此贴,可惜看不到回复内容,请问如何按方位获取四边形的坐标

kucha007 发表于 2024-1-31 20:43:30

本帖最后由 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-1-31 20:20:37

本帖最后由 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:44:59

本帖最后由 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))
)


飞雪神光 发表于 2024-1-31 19:25:09

只有这四个点可以用黄明儒的排序 需要排四次 还有复杂点的按象限获取

tigcat 发表于 2024-1-31 19:29:41

谢谢兄台分享实用源码,论坛有你更精彩!

guosheyang 发表于 2024-1-31 20:31:05

本帖最后由 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-1-31 23:54:43

本帖最后由 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)
)

tanle2020 发表于 2024-2-1 11:45:20

kucha007 发表于 2024-1-31 20:43
如果四边形在2维平面的话,可以试一下这样:

感谢解答,测试了一下在不同形状的四边形还是不行,只是按顺序排序了

tanle2020 发表于 2024-2-1 11:46:27

vitalgg 发表于 2024-1-31 20:20


这是加载了网络自定义函数吧

tanle2020 发表于 2024-2-1 11:48:08

xyp1964 发表于 2024-1-31 23:54


院长无所不能,给个排序的代码学习一下了
页: [1] 2
查看完整版本: 四边形按方位获取坐标