找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 366|回复: 4

[已解决] 请教如何将视口边线提取至模型中?

[复制链接]
发表于 2025-2-10 11:23:18 | 显示全部楼层 |阅读模式

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

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

×
有时在布局出图,视口很多,模型中图纸也比较分散,在模型中找不到视口中的图纸位置
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2025-2-10 12:03:58 | 显示全部楼层
  1. (defun c:tt ()
  2.   (if (setq e (car (xdrx_entsel
  3.                      "\n拾取视口<退出>:"
  4.                      '((0 . "viewport"))
  5.                    )
  6.               )
  7.       )
  8.     (progn
  9.       (setq verts (xdrx-getpropertyvalue e "vertices")) ;视口顶点坐标
  10.       (setq mat-ps2ms (xdrx-matrix-ps2ms e));图纸空间视口到模型空间的变换矩阵
  11.       (xdrx-mspace)
  12.       (setq verts (xdrx-points-transform verts mat-ps2ms));矩阵作用,得到模型空间对应窗口的角点 坐标
  13.       (xdrx-polyline-make verts t)
  14.       (xdrx-pspace);回到视口
  15.     )
  16.   )
  17.   (princ)
  18. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-10 15:19:49 | 显示全部楼层
非常好用,谢谢大佬
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-10 15:26:23 | 显示全部楼层
我让deepseek给优化了一下

你的AutoLISP代码整体逻辑是正确的,但有一些地方可以优化或需要注意。以下是我对代码的分析和改进建议:

---

### 1. **变量命名**
   - 变量名 `e` 和 `verts` 是合法的,但建议使用更具描述性的名称,比如 `viewport-entity` 和 `viewport-vertices`,以提高代码的可读性。
   - `mat-ps2ms` 是一个矩阵变量,命名是合理的,但可以加上注释说明其用途。

---

### 2. **函数调用**
   - `xdrx_entsel` 是一个扩展函数(可能是基于 ARX 或 ObjectARX 的扩展),确保你的 AutoCAD 环境支持这些函数。如果不支持,代码将无法运行。
   - `xdrx-getpropertyvalue`、`xdrx-matrix-ps2ms`、`xdrx-mspace`、`xdrx-polyline-make` 和 `xdrx-pspace` 也是扩展函数,确保它们的定义和功能符合你的预期。

---

### 3. **错误处理**
   - 当前代码没有处理用户取消选择(按 `Esc` 键)的情况。如果用户没有选择视口,`xdrx_entsel` 会返回 `nil`,但代码中没有对这种情况进行处理。
   - 建议在 `if` 语句中添加一个 `else` 分支,处理用户取消选择的情况。

---

### 4. **代码优化**
   - `xdrx-mspace` 和 `xdrx-pspace` 是切换空间的函数,确保在操作完成后回到原始空间(图纸空间)。当前代码已经实现了这一点,但可以添加注释以明确其作用。
   - `xdrx-points-transform` 是对点进行矩阵变换的函数,确保 `verts` 是一个有效的点列表。

---

### 5. **代码改进版本**
以下是改进后的代码:

```lisp
(defun c:tt (/ viewport-entity viewport-vertices mat-ps2ms)
  ;; 提示用户选择一个视口
  (if (setq viewport-entity (car (xdrx_entsel
                                   "\n拾取视口<退出>:"
                                   '((0 . "viewport"))
                                )
                            )
      )
    (progn
      ;; 获取视口的顶点坐标
      (setq viewport-vertices (xdrx-getpropertyvalue viewport-entity "vertices"))
      
      ;; 获取从图纸空间到模型空间的变换矩阵
      (setq mat-ps2ms (xdrx-matrix-ps2ms viewport-entity))
      
      ;; 切换到模型空间
      (xdrx-mspace)
      
      ;; 对顶点坐标进行矩阵变换,得到模型空间中的坐标
      (setq viewport-vertices (xdrx-points-transform viewport-vertices mat-ps2ms))
      
      ;; 在模型空间中创建多段线
      (xdrx-polyline-make viewport-vertices t)
      
      ;; 切换回图纸空间
      (xdrx-pspace)
    )
    ;; 如果用户取消选择,提示并退出
    (princ "\n用户取消选择或未选择视口。")
  )
  ;; 静默退出
  (princ)
)
```

---

### 6. **改进点总结**
- 增加了变量名的描述性。
- 添加了用户取消选择的处理。
- 增加了注释,使代码更易读。
- 确保代码逻辑清晰,避免潜在的错误。

---

### 7. **测试建议**
- 在运行代码之前,确保你的 AutoCAD 环境支持 `xdrx` 系列函数。
- 测试代码时,尝试选择视口和不选择视口(按 `Esc` 键)的情况,确保代码能够正确处理。

---

如果你有其他问题,或者需要进一步优化代码,请随时告诉我!

评分

参与人数 1D豆 +20 收起 理由
XDSoft + 20 有始有终奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2025-2-18 11:19:55 | 显示全部楼层
很强大,也很实用的功能
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-7 06:11 , Processed in 0.291729 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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