CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

片剂校准

2023-1-1 00:48| 发布者: admin| 查看: 346| 评论: 0|来自: AutoCAD

使用数字化数位板的 AutoCAD 用户可以使用 TABLET 命令校准数位板。使用该功能,应用程序可以通过直接设置校准并保存校准设置以备将来使用来管理校准。该函数接受两个参数,每个参数都是一个结果缓冲区列表。第一个列表中的第一个结果缓冲区是一个整数代码,必须为 0 才能检索当前校准 (in),或者必须为 1 才能根据列表中的其余缓冲区设置校准。校准表示为四个 3D 点(除代码外)。这些点中的前三个点(row1、row2 和 row3)是平板电脑转换矩阵的三行。第四个点是垂直于平板电脑表面平面的向量,方向(以WCS表示)。acedTablet()listresultresult

注意:TABMODE 系统变量控制平板电脑模式是设置为开 (1) 还是关 (0)。您可以使用它来控制它。acedSetVar()

以下代码序列检索当前平板电脑校准,并将其保存。在此示例中,用户已使用 TABLET 命令校准矩阵,并且平板电脑模式处于打开状态。calibr2

struct resbuf *calibr1, *calibr2; 
struct resbuf varbuf, rb; 
// Retrieve the current calibration.
calibr1 = acutBuildList(RTSHORT, 0, RTNONE); 
if (acedTablet(calibr1, &calibr2) != RTNORM) { 
    acdbFail("Calibration not obtainable\n"); 
    return BAD; 
} 

在示例中,结果参数中返回的代码自动设置为 1。若要将校准重置为前面的示例检索的值,可以使用以下代码:calibr2

if (acedTablet(calibr2, &calibr1) != RTNORM) { 
    acdbFail("Couldn't reset calibration\n"); 
    return BAD; 
} 
rb.restype = RTSHORT; 
rb.resval.rint = 1; 
acedSetVar("TABMODE", &rb); 
acedGetVar("TABMODE" &varbuf); 
if (varbuf.resval.rint == 0) { 
    acdbFail("Couldn't set TABMODE\n"); 
    return BAD; 
} 

在此示例中,现在包含校准的结果。因为这大概与(初始化者)相同,所以你不一定需要这个结果。设置校准时,可以指定结果,这将导致“静默”设置校准。calibr1calibr2acedTablet()NULLacedTablet()

if (acedTablet(calibr2, NULL) != RTNORM) { . . . } 

作为 row1、row2 和 row3 传递的变换矩阵是一个 3x3 变换矩阵,用于变换 2D 点。2D 点表示为齐次坐标中的列向量(通过将 1.0 追加为第三个元素),因此变换如下所示:

点的计算类似于 3D 情况。AutoCAD 使用以下公式转换点:

要将生成的矢量转换回 2D 点,将前两个分量除以第三个分量(比例因子),从而产生该点

对于射影变换(这是最一般的情况),执行完整计算。但是对于仿射变换和正交变换,并且都是 0,所以将是 1.0。省略了计算和除法;生成的 2D 点很简单acedTablet()

仿射变换是射影跨形成的特殊、均匀的情况。正交变换是仿射变换的特例:不仅是 are0,还有and

注意:设置校准时,如果列表中的方向未归一化,则结果不等于列表参数;AutoCAD 在返回方向矢量之前对其进行归一化。此外,它还确保第三列中的第三个元素 (row3[Z]) 等于 1。如果使用 从 AutoCAD 检索的值设置校准,则不会出现这种情况。但是,如果程序计算转换本身,则可能会发生这种情况。acedTablet()

路过

雷人

握手

鲜花

鸡蛋

最新评论

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部