jg973_zyz 发表于 2025-2-10 11:23:18

请教如何将视口边线提取至模型中?

有时在布局出图,视口很多,模型中图纸也比较分散,在模型中找不到视口中的图纸位置

XDSoft 发表于 2025-2-10 12:03:58


(defun c:tt ()
(if (setq e (car (xdrx_entsel
                     "\n拾取视口<退出>:"
                     '((0 . "viewport"))
                   )
            )
      )
    (progn
      (setq verts (xdrx-getpropertyvalue e "vertices")) ;视口顶点坐标
      (setq mat-ps2ms (xdrx-matrix-ps2ms e));图纸空间视口到模型空间的变换矩阵
      (xdrx-mspace)
      (setq verts (xdrx-points-transform verts mat-ps2ms));矩阵作用,得到模型空间对应窗口的角点 坐标
      (xdrx-polyline-make verts t)
      (xdrx-pspace);回到视口
    )
)
(princ)
)

jg973_zyz 发表于 2025-2-10 15:19:49

非常好用,谢谢大佬{:1_12:}{:1_12:}{:1_12:}

jg973_zyz 发表于 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` 键)的情况,确保代码能够正确处理。

---

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

gdfyhao 发表于 2025-2-18 11:19:55

很强大,也很实用的功能
页: [1]
查看完整版本: 请教如何将视口边线提取至模型中?