明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 845|回复: 13

[提问] 四边形按方位获取坐标

[复制链接]
发表于 2024-1-31 19:11 | 显示全部楼层 |阅读模式
论坛有人发过此贴,可惜看不到回复内容,请问如何按方位获取四边形的坐标

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-1-31 20:43 | 显示全部楼层
本帖最后由 kucha007 于 2024-2-1 23:58 编辑

如果四边形在2维平面的话,可以试一下这样:
  1. (progn
  2.     (setq en (car (nentsel)));获取四边形
  3.     (setq Lst (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget en))));获取顶点X和Y
  4.     (setq Lst
  5.         (vl-sort Lst
  6.             '(lambda (a b)
  7.               (minusp
  8.                 (-
  9.                   (* (car a) (cadr b))
  10.                   (* (car b) (cadr a))
  11.                 )
  12.               )
  13.               
  14.             )
  15.         )
  16.     );计算两点叉积,按顺时针排序
  17.     (setq Lst (mapcar '(lambda (x)(nth x Lst))(list 1 2 0 3)));按顺序重新调整表   
  18. )
回复 支持 1 反对 0

使用道具 举报

发表于 2024-1-31 20:20 | 显示全部楼层
本帖最后由 vitalgg 于 2024-2-1 12:22 编辑



原来下面也是从左到右啊,已更正
  1. (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))))

  2. (defun c:jd ()
  3.   (setq ss (ssget  '((0 . "LWPOLYLINE"))))
  4.   (foreach
  5.    lwpl (pickset:to-list ss)
  6.    (setq pts (curve:get-points lwpl))
  7.    (progn
  8.      (setq pt-center (point:centroid pts))
  9.      (setq pts (vl-sort
  10.     pts
  11.     ;; 都在x轴上按顺时针,都在x轴下按逆时针。x轴上在排前面。
  12.     '(lambda(x y)
  13.       (cond
  14.         ((and (< (m:fix-angle (+ pi (angle pt-center x))) pi)
  15.         (< (m:fix-angle (+ pi (angle pt-center y))) pi))
  16.          (< (m:fix-angle (+ pi (angle pt-center x)))
  17.       (m:fix-angle (+ pi (angle pt-center y)))))
  18.         (t
  19.           (> (m:fix-angle (+ pi (angle pt-center x)))
  20.       (m:fix-angle (+ pi (angle pt-center y)))))
  21.         ))))
  22.      ;;
  23.      (setq n 0)
  24.      (mapcar '(lambda(x)
  25.          (entity:make-text
  26.     (strcat  "PT"(itoa (setq n (1+ n))))
  27.     x
  28.     3 0 0.8 0 "LB"))
  29.        pts))))
发表于 2024-2-2 13:44 | 显示全部楼层
本帖最后由 xyp1964 于 2024-2-2 13:51 编辑
tanle2020 发表于 2024-2-2 12:48
我用这个排序方法实现了,先把四个点表按x排序,然后把最x最小的两个点按y排序得出左上和左下,剩余x最大 ...

  1. (defun abc (pl / ptn ptn1 ptn2 p1 p2 p3 p4)
  2.   (setq ptn (mapcar 'cdr (vl-remove-if '(lambda (x) (/= 10 (car x))) (entget pl)))
  3.         ptn (vl-sort ptn '(lambda (x y) (> (cadr x) (cadr y))))
  4.   )
  5.   (mapcar 'set '(p1 p2 p3 p4) ptn)
  6.   (setq ptn1 (vl-sort (list p1 p2) '(lambda (x y) (< (car x) (car y))))
  7.         ptn2 (vl-sort (list p3 p4) '(lambda (x y) (< (car x) (car y))))
  8.   )
  9.   (append ptn1 ptn2)
  10. )



  1. (defun abc2 (pl / ptn pptn1 ptn2 p1 p2 p3 p4)
  2.   (setq ptn (mapcar 'cdr(vl-remove-if '(lambda (x) (/= (car x) 10)) (entget pl)))
  3.         ptn (vl-sort ptn '(lambda (x y) (< (car x) (car y))))
  4.   )
  5.   (mapcar 'set '(p1 p2 p3 p4) ptn)
  6.   (setq ptn1 (vl-sort (list p1 p2) '(lambda (x y) (> (cadr x) (cadr y))))
  7.         ptn2 (vl-sort (list p3 p4) '(lambda (x y) (> (cadr x) (cadr y))))
  8.   )
  9.   (list (car ptn1) (car ptn2) (cadr ptn1) (cadr ptn2))
  10. )


发表于 2024-1-31 19:25 | 显示全部楼层
只有这四个点可以用黄明儒的排序 需要排四次 还有复杂点的按象限获取
发表于 2024-1-31 19:29 | 显示全部楼层
谢谢兄台分享实用源码,论坛有你更精彩!
发表于 2024-1-31 20:31 | 显示全部楼层
本帖最后由 guosheyang 于 2024-1-31 22:06 编辑

方法一 保证节点方向为顺时针   然后 x从小到大排 x相同时 y从大到小排  确定第一点pt1 多段线节点表中 依次提取pt2  pt3  pt4   最后将pt4  pt3 换下顺序
方法二  x从小到大排 x相同时 y从大到小排  确定第一点pt1
            x从大到小排 x相同时 y从大到小排  确定第二点pt2
            x从小到大排 x相同时 y从小到大排  确定第三点pt3
            x从大到小排 x相同时 y从小到大排  确定第四点pt4
           (其实方法二中  只需要计算 两次  不用四次就可得到结果
            在两组点x值相同时  计算一次即可


           


发表于 2024-1-31 23:54 | 显示全部楼层
本帖最后由 xyp1964 于 2024-2-1 12:40 编辑




  1. (defun c:tt ()
  2.   "四边形按方位获取坐标"
  3.   (xyp-Start)
  4.   (setq i -1)
  5.   (if (setq ss (ssget '((0 . "*po*") (90 . 4) (70 . 1))))
  6.     (while (setq s1 (ssname ss (setq i (1+ i))))
  7.       (setq ptn (xyp-Vertexs s1 0);顶点
  8.             ptn (xyp-Ptn2CCW ptn);逆时针排序
  9.             p7 (xyp-9pt s1 7);左上角点基点
  10.             p7 (xyp-PtNearPtn p7 ptn);左上角点
  11.             ptn (xyp-SortListSub ptn p7);重新排序
  12.             lst (list (car ptn) (last ptn) (cadr ptn) (caddr ptn));左上 右上 左下 右下
  13.             j0
  14.       )
  15.       (mapcar '(lambda (x)(setq j  (1+ j)tx (strcat "pt" (itoa j)))(xyp-Text 5 x tx))lst)
  16.     )
  17.   )
  18.   (xyp-End)
  19. )


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2024-2-1 11:45 | 显示全部楼层
kucha007 发表于 2024-1-31 20:43
如果四边形在2维平面的话,可以试一下这样:

感谢解答,测试了一下在不同形状的四边形还是不行,只是按顺序排序了
 楼主| 发表于 2024-2-1 11:46 | 显示全部楼层

这是加载了网络自定义函数吧
 楼主| 发表于 2024-2-1 11:48 | 显示全部楼层

院长无所不能,给个排序的代码学习一下了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-2 23:42 , Processed in 0.317601 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表