CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

选择集的转换

2023-1-1 02:25| 发布者: admin| 查看: 312| 评论: 0|来自: AutoCAD

该函数通过将转换矩阵(类型)应用于集中的实体来转换选择集。acedXformSS()ads_matrix

这为使用 //(或/) 调用旋转、缩放、镜像或移动命令或更改数据库中的值提供了一种有效的替代方法。acedCommandS()acedCommandC()acedCmd()acedCmdC()acdbEntMod()

可以通过任何常用方式获得选择集。矩阵必须进行统一缩放。即缩放向量中的元素S X S Y S Z 必须都是平等的;在矩阵表示法中,M 00 M 11 M 22 .

如果比例矢量不均匀,则报告错误。acedXformSS()

下面的示例代码使用交叉框获取选择集,然后将以下矩阵应用于该选择集。

应用此矩阵会将实体缩放一半(这会将它们移向原点),并将其位置平移 (20.0,5.0)。

int rc, i, j; 
ads_point pt1, pt2; 
ads_matrix matrix; 
ads_name ssname; 
// Initialize pt1 and pt2 here.
rc = acedSSGet("C", pt1, pt2, NULL, ssname); 
if (rc == RTNORM) { 
// Initialize to identity.
    ident_init(matrix); 
// Initialize scale factors.
    matrix[0][0] = matrix[1][1] = matrix[2][2] = 0.5; 
// Initialize translation vector.
    matrix[0][T] = 20.0;	 
    matrix[1][T] = 5.0; 
    rc = acedXformSS(ssname, matrix); 
} 

调用时,必须指定类似的函数,以便让用户以交互方式控制转换的效果。函数的声明必须具有以下形式:acedDragGen()

int scnf(ads_point pt, ads_matrix mt)

它应该返回如果它修改了矩阵,如果没有,或者如果它检测到错误。RTNORMRTNONERTERROR

每次用户移动光标时,该函数都会调用该函数。该函数设置矩阵的新值。当返回状态为 ,将新矩阵应用于选择集时。如果不需要修改矩阵(例如,if简单地显示瞬态向量),则应返回。在这种情况下,忽略不会转换选择集。acedDragGen()scnfscnf()mtscnf()RTNORMacedDragGen()scnf()acedGrVecs()scnf()RTNONEacedDragGen()mt

在以下示例中,该函数将矩阵设置为仅移动(平移)选择集,而不进行缩放或旋转。

int dragsample(usrpt, matrix) 
ads_point usrpt 
ads_matrix matrix; 
{ 
    ident_init(matrix); // Initialize to identity.
// Initialize translation vector.
    matrix[0][T] = usrpt[X]; 
    matrix[1][T] = usrpt[Y]; 
    matrix[2][T] = usrpt[Z]; 
    return RTNORM; // Matrix was modified.
} 

相反,以下版本的 缩放当前XY平面中的选择集,但不移动它。dragsample()

int dragsample(usrpt, matrix) 
ads_point usrpt 
ads_matrix matrix; 
{ 
    ident_init(matrix); // Initialize to identity.
    matrix[0][0] = userpt[X]; 
    matrix[1][1] = userpt[Y]; 
    return RTNORM; // Matrix was modified.
} 

使用 TRANSFORM 函数的调用如下所示:acedDragGen()

int rc; 
ads_name ssname; 
ads_point return_pt; 
// Prompt the user for a general entity selection: 
if (acedSSGet(NULL, NULL, NULL, NULL, ssname) == RTNORM) 
    rc = acedDragGen(ssname, // The new entities
        "Scale the selected objects by dragging", // Prompt
         0, // Display normal cursor (crosshairs) 
         dragsample, // Pointer to the transform function 
         return_pt); // Set to the specified location 

更复杂的转换可以旋转实体、合并转换(如示例中所示)等。acedXformSS()

组合变换矩阵称为矩阵组合。以下函数通过返回其乘积来组成两个转换矩阵。resmat

void xformcompose(ads_matrix xf1, ads_matrix xf2, 
        ads_matrix resmat) 
{ 
    int i, j, k; 
    ads_real sum; 
    for (i=0; i<=3; i++) { 
        for (j=0; j<=3; j++) { 
            sum = 0.0; 
            for (k=0; k<3; k++) { 
                sum += xf1[i,k] * xf2[k,j]; 
            } 
            resmat[i,j] = sum; 
        } 
    } 
} 

路过

雷人

握手

鲜花

鸡蛋

最新评论

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

GMT+8, 2024-5-19 12:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部