CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 文档中心

关于实体上下文和坐标转换数据(AutoLISP)

2023-1-8 11:12| 发布者: admin| 查看: 712| 评论: 0|来自: AutoCAD

摘要: nentsel 和 nentselp 函数与 entsel 类似,不同之处在于它们返回两个附加值来处理嵌套在块引用中的实体。

and 函数与 类似,只不过它们返回两个附加值来处理嵌套在块引用中的实体。nentselnentselpentsel

这些函数之间的另一个区别是,当用户通过选择复杂实体或复杂实体选择时,这些函数返回所选子实体的实体名称,而不是复杂实体的标头。nentselnentselpentsel

例如,当用户选择 3D 折线时,将返回顶点子图元而不是折线标头。您可以通过连续调用 来检索折线标头,然后从 Deqend 子实体的 -2 dxf 组代码中获取标头的名称。当用户在嵌套块引用中选择属性时,这同样适用。nentselentnext

在块参照中选择属性将返回属性的名称和拾取点。当所选对象是块引用的组件而不是属性时,将返回包含以下元素的列表:nentsel

  • 所选实体的名称。
  • 包含用于拾取对象的点的坐标的列表。
  • 从模型到世界的转换矩阵。这是一个由四个子列表组成的列表,每个子列表包含一组坐标。此矩阵可用于将实体定义数据点从称为模型坐标系 (MCS) 的内部坐标系转换为世界坐标系 (WCS)。包含选定图元的块的插入点定义 MCS 的原点。创建模块时 UCS 的方向决定了 MCS 轴的方向。
  • 包含包含选定对象的块的实体名称的列表。如果所选对象位于嵌套块(块中的块)中,则该列表还包含所选对象嵌套的所有块的实体名称,从最里面的块开始,一直向外延伸,直到报告在图形中插入的块的名称。

选择块返回的列表总结如下:nentsel

(<Entity Name: ename1>   ; Name of entity.
  (Px Py Pz)             ; Pick point.
  ( (X0 Y0 Z0)           ; Model to World Transformation Matrix.
  (X1 Y1 Z1)
  (X2 Y2 Z2)
  (X3 Y3 Z3)
)
(<Entity name: ename2>   ; Name of most deeply nested block
  .                      ; containing selected object.
  ..
  <Entity name: enamen>) ; Name of outermost block
)                        ; containing selected object.

在以下示例中,创建一个用于函数的块。nentsel

命令:line

指定第一点:1,1

指定下一个点或[撤消]:3,1

指定下一个点或[撤消]:3,3

指定下一个点或[关闭/撤消]:1,3

指定下一个点或[关闭/撤消]:c

命令:-block

输入块名称或 [?]: square

指定插入基点或[注释]:2,2

选择对象:选择刚刚绘制的四条线

选择对象: 按 Enter 键

然后,将块插入绕 Z 轴旋转 45 度的 UCS 中:

命令:ucs

当前 ucs 名称: *WORLD*

指定UCS或[Face/NAmed/OBject/Previous/View/World/X/Y/Z/ZAxis]<World>:z的原点

指定 Z 轴旋转角度 <90>:45

命令:-insert

输入块名称或 [?]: square

指定插入点或[基点/刻度/X/Y/Z/旋转]:7.0

输入 X 比例因子,指定对角或 [Corner/XYZ] <1>: 按 Enter 键

输入 Y 比例因子<使用 X 比例因子>: 按 Enter 键

指定旋转角度 <0>: 按 Enter 键

用于选择正方形的左下角。nentsel

(setq ndata (nentsel))

此代码集等于类似于以下内容的列表:ndata

(<Entity Name: 400000a0>   ; Entity name.
  (6.46616 -1.0606 0.0)    ; Pick point.
  ((0.707107 0.707107 0.0) ; Model to World
  (-0.707107 0.707107 0.0) ; Transformation Matrix.
  (0.0 -0.0 1.0)
  (4.94975 4.94975 0.0)
)
  (<Entity name:6000001c>) ; Name of block containing
                           ; selected object.
)

获取实体名称和模型到世界转换矩阵后,可以将实体定义数据点从 MCS 转换为 WCS。在实体名称上使用 和 来获取以 MCS 坐标表示的定义点。返回的 Model to World Transformation Matrix 是一个 4×3 矩阵(作为四个点的数组传递),它使用点是行而不是列的约定。变换由以下矩阵乘法描述:entgetassocnentsel

因此,推导新坐标的方程如下:

Mij,其中 0 le;J乐;2、是模型到世界的变换矩阵坐标;XYZ 是以 MCS 坐标表示的实体定义数据点,X'、Y'、Z' 是以 WCS 坐标表示的结果实体定义数据点。

要变换向量而不是点,请不要添加平移向量(变换矩阵第四列中的 M30、M31、M32)。

注意:这是唯一使用此类型矩阵的 AutoLISP 函数。该函数之所以首选,是因为它返回的矩阵类似于其他 AutoLISP、ObjectARX 和 Managed .NET 函数使用的矩阵。nentselpnentsel

使用先前用 获取的实体名称,以下示例说明了如何获取块定义中包含的行(组代码 10)的 MCS 起点:nentsel

命令: (setq edata (assoc 10 (entget (car ndata))))

(10 -1.0 1.0 0.0)

以下语句将“模型到世界变换矩阵”子列表存储在符号 中。matrix

命令:(setq matrix (caddr ndata))

((0.707107 0.707107 0.0)   ; X transformation
  (-0.707107 0.707107 0.0) ; Y transformation
  (0.0 -0.0 1.0)           ; Z transformation
  (4.94975 4.94975 0.0)    ; Displacement from WCS origin
)

以下语句应用 X' 的变换公式,将直线起点的 X 坐标从 MCS 坐标更改为 WCS 坐标:

(setq answer
  (+                                       ; add:
    (* (car (nth 0 matrix))(cadr edata))   ; M00 * X
    (* (car (nth 1 matrix))(caddr edata))  ; M10 * Y
    (* (car (nth 2 matrix))(cadddr edata)) ; M20 * Z
    (car (nth 3 matrix))                   ; M30
  )
)

此语句返回 3.53553,即所选线起点的 WCS X 坐标。


路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1   苏公网安备32011402011833)

GMT+8, 2024-12-15 14:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部