返回的第一个附加参数是类型的 4x4 转换矩阵。此矩阵称为模型到世界转换矩阵。它使应用程序能够将实体的定义数据(和扩展数据,如果存在)中的点从实体的模型坐标系 (MCS) 转换为世界坐标系 (WCS)。MCS 仅适用于嵌套实体。MCS 的原点是块的插入点,其方向是创建块时有效的 UCS 的方向。acedNEntSelP()ads_matrix 如果所选实体不是嵌套实体,则转换矩阵将设置为单位矩阵。变换由以下矩阵乘法表示: ![]() 变换点的各个坐标从方程中获得,其中 M 锰 是模型到世界变换矩阵坐标,是以 MCS 坐标表示的实体定义数据点,是用 WCS 坐标表示的结果实体定义数据点。请参阅转换矩阵。(X,Y,Z)(X',Y',Z') 注意:要变换向量而不是点,请不要添加平移向量[M
03
M
13
M
23
](来自转换矩阵的第四列)。
下面的示例代码定义了一个函数,该函数执行上述公式所述的转换。它采用由单个点返回的转换矩阵(可能来自嵌套实体的定义数据),并返回转换后的点。如果第三个参数 to,,设置为 0 (),则转换矩阵的最后一列(平移向量或位移)不会添加到结果中。这使函数能够平移向量和点。mcs2wcs()acedNEntSelP()mcs2wcs()is_ptFALSE void mcs2wcs(xform, entpt, is_pt, worldpt)
ads_matrix xform;
ads_point entpt, worldpt;
int is_pt;
{
int i, j;
worldpt[X] = worldpt[Y] = worldpt[Z] = 0.0;
for (i=X; i<=Z; i++)
for (j=X; j<=Z; j++)
worldpt[i] += xform[i][j] * entpt[j];
if (is_pt) // If it's a point, add in the displacement
for (i=X; i<=Z; i++)
worldpt[i] += xform[i][T];
}
以下代码片段显示了如何结合使用,将点值转换为当前 WCS。mcs2wcs()acedNEntSelP() ads_name usrent, containent;
ads_point usrpt, defpt, wcspt;
ads_matrix matrix;
struct resbuf *containers, *data, *rb, *prevrb;
status = acedNEntSelP(NULL, usrent, usrpt, FALSE, matrix,
&containers);
if ((status != RTNORM) || (containers == NULL))
return BAD;
data = acdbEntGet(usrent);
// Extract a point (defpt) from the data obtained by calling
// acdbEntGet() for the selected kind of entity.
.
.
.
mcs2wcs(matrix, defpt, TRUE, wcspt);
该函数还允许程序指定拾取点。参数确定是否以交互方式调用。acedNEntSelP()pickflagacedNEntSelP() 在下面的示例中,thecall 指定自己的选取实体点,并且不提示用户。参数是指示调用提供自己的点值(也是,theis)。acedNEntSelP()pickflagTRUEpromptNULL ads_point ownpoint;
ownpoint[X] = 2.7; ownpoint[Y] = 1.5; ownpoint[Z] = 0.0;
status = acedNEntSelP(NULL, usrent, ownpt, TRUE, matrix,
&containers);
提供该功能是为了与现有的 ObjectARX 应用程序兼容。应使用编写新应用程序。acedNEntSel()acedNEntSelP() 调用 to 返回的模型到世界转换矩阵与返回的矩阵具有相同的用途,但它是一个 4x3 矩阵(作为四个点的数组传递),它使用点是行而不是列的约定。转换由以下矩阵乘法描述:acedNEntSel()acedNEntSelP() ![]() 推导新坐标的公式如下: ![]() 尽管矩阵格式不同,但公式等效于 thetype,并且适应使用所需的唯一更改是将矩阵参数声明为四个点的数组。ads_matrixmcs2wcs()acedNEntSel() void mcs2wcs(xform, entpt, is_pt, worldpt); ads_point xform[4]; // 4x3 version ads_point entpt, worldpt; int is_pt; 4x3 矩阵的恒等形式如下: ![]() 除了使用不同的矩阵约定外,不允许程序指定拾取点。acedNEntSel() |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-10-27 03:43
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.