找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 145|回复: 1

[几何] XD::GEOM:VIEW-POINTS

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2025-5-10 14:30:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
  1. ;;; ------------------------------------------------------------------------
  2. ;;; 函数名称 / Function Name: XD::GEOM:VIEW-POINTS
  3. ;;;
  4. ;;; 【功能说明 / Description】
  5. ;;;     返回当前视口的视图边界点(左下角和右上角),以图纸空间坐标表示。
  6. ;;;     Returns the lower-left and upper-right corner points of the current view in WCS.
  7. ;;;
  8. ;;;     功能包括 / Features:
  9. ;;;       - 判断当前是否在图纸空间(tilemode=0)或模型空间
  10. ;;;         Determine if in paper space or model space
  11. ;;;       - 获取当前视口的中心点与宽高
  12. ;;;         Get center, width and height of the current viewport
  13. ;;;       - 计算视口四角点,并转换为世界坐标系
  14. ;;;         Calculate bounding points and transform to WCS
  15. ;;;       - 在图纸空间时考虑裁剪视口边界叠加
  16. ;;;         In paper space, considers overlapping viewports
  17. ;;;
  18. ;;; 【参数说明 / Parameters】
  19. ;;;     无参数 / No parameters
  20. ;;;
  21. ;;; 【返回值 / Return Value】
  22. ;;;     列表 (list p1 p2),分别为视图左下角与右上角在 WCS 中的坐标。
  23. ;;;     A list (p1 p2), where p1 is the lower-left and p2 is the upper-right point in WCS.
  24. ;;;
  25. ;;; 【依赖函数 / Dependencies】
  26. ;;;     - XD::CURRENTVIEWPORT:ENAME   : 获取当前视口实体名 / Get current viewport entity name
  27. ;;;     - XD::PSPACE:VIEWPORT-ENAME   : 获取图纸空间视口 / Get paper space viewport entity name
  28. ;;;     - TRANS, ENTGET, ASSOC, GETVAR, etc. (AutoLISP 内建函数)
  29. ;;;
  30. ;;; 【使用示例 / Example Usage】
  31. ;;;     (XD::GEOM:VIEW-POINTS)
  32. ;;;     => ((x1 y1 z1) (x2 y2 z2)) ; 当前可视区域的两角点
  33. ;;;
  34. ;;; 【备注 / Notes】
  35. ;;;     - 对于图纸空间的视口会取模型视口与图纸视口相交的区域。
  36. ;;;       In paper space, it intersects model and layout viewport extents.
  37. ;;; ------------------------------------------------------------------------
  38. (defun XD::GEOM:VIEW-POINTS (/ na e1 x w h p1 p2 p3 p4 a b c d)
  39.   (if (equal 0 (getvar "tilemode"))
  40.     ;; 图纸空间处理
  41.     (progn
  42.       (setq na (XD::CURRENTVIEWPORT:ENAME))
  43.       (setq e1 (entget na))
  44.       (setq x (cdr (assoc 10 e1)))
  45.       (setq w (cdr (assoc 40 e1)))
  46.       (setq h (cdr (assoc 41 e1)))
  47.       ;; 初始模型空间视口边界
  48.       (setq p1 (list (- (car x) (/ w 2.0))
  49.                      (- (cadr x) (/ h 2.0))))
  50.       (setq p2 (list (+ (car x) (/ w 2.0))
  51.                      (+ (cadr x) (/ h 2.0))))
  52.       ;; 如果不是主视口(cvport != 1)
  53.       (if (not (equal 1 (getvar "cvport")))
  54.         (progn
  55.           (setq p1 (trans p1 3 2))
  56.           (setq p2 (trans p2 3 2))
  57.           (setq na (XD::PSPACE:VIEWPORT-ENAME))
  58.           (setq e1 (entget na))
  59.           (setq x (cdr (assoc 10 e1)))
  60.           (setq w (cdr (assoc 40 e1)))
  61.           (setq h (cdr (assoc 41 e1)))
  62.           ;; 图纸空间视口边界
  63.           (setq p3 (list (- (car x) (/ w 2.0))
  64.                          (- (cadr x) (/ h 2.0))))
  65.           (setq p4 (list (+ (car x) (/ w 2.0))
  66.                          (+ (cadr x) (/ h 2.0))))
  67.           (setq p3 (trans p3 3 2))
  68.           (setq p4 (trans p4 3 2))
  69.           ;; 取模型与图纸空间交集
  70.           (setq p1 (list (max (car p1) (car p3))
  71.                          (max (cadr p1) (cadr p3))))
  72.           (setq p2 (list (min (car p2) (car p4))
  73.                          (min (cadr p2) (cadr p4))))
  74.           ;; 转为世界坐标
  75.           (setq p1 (trans p1 2 1))
  76.           (setq p2 (trans p2 2 1))
  77.         )
  78.         ;; 主视口直接转换坐标
  79.         (progn
  80.           (setq p1 (trans p1 2 1))
  81.           (setq p2 (trans p2 2 1))
  82.         )
  83.       )
  84.     )
  85.     ;; 模型空间处理
  86.     (progn
  87.       (setq b (getvar "viewsize"))
  88.       (setq c (car (getvar "screensize")))
  89.       (setq d (cadr (getvar "screensize")))
  90.       (setq a (* b (/ c d)))  ;; 宽度
  91.       (setq x (getvar "viewctr"))
  92.       (setq x (trans x 1 2))
  93.       ;; 视图边界
  94.       (setq p1 (list (- (car x) (/ a 2.0))
  95.                      (- (cadr x) (/ b 2.0))
  96.                      0.0))
  97.       (setq p2 (list (+ (car x) (/ a 2.0))
  98.                      (+ (cadr x) (/ b 2.0))
  99.                      0.0))
  100.       ;; 转换为 WCS
  101.       (setq p1 (trans p1 2 1))
  102.       (setq p2 (trans p2 2 1))
  103.     )
  104.   )
  105.   ;; 返回左下角与右上角点
  106.   (list p1 p2)
  107. )




论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2025-5-10 14:43:29 | 显示全部楼层
N版,要不要把你的程序打一个包,让我帮你保管一下,万一哪一天的硬盘坏了,就找不到了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-7 02:35 , Processed in 0.219613 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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