ObjectARX_符号表---->UCS

cad中的坐标系:

(1)UCS:用户坐标系;

(2)WCS:世界坐标系 ;

(3)ECS:对象坐标系,多义线和细多义线对象的某些方法和属性指定的点的值由这种坐标系统表达,与对象有关;

(4)DCS:显示坐标系统,DCS的原点是被存在AutoCAD系统变量TARGET中的点,它的Z轴就是视图方向。换句话说,一个视口始终是它的DCS平面图;

(5)PSDCS:图纸空间DCS-该坐标系统只能从当前活动的模型空间视口的DCS转入或转出。

使用 acedTrans函数在各种坐标系之间转换坐标。

  acedTrans 函数的定义形式为:

int acedTrans(const ads_point pt,const struct resbuf * from,const struct resbuf * to,int disp,ads_point result);

第一个参数:pt: 输入点或向量;

第二个参数:from:当前坐标系;

第三个参数:to:目标坐标系;

第四个参数:disp: 指定 pt 的类型,0为点。非0为向量;

第五个参数:result:坐标转换后的结果。

struct resbuf rb;
if(rb.restype == RT3DPOINT)//三维挤压向量
{
//esc坐标
}
else if(rb.restype == RTENAME)//实体名
{
//esc坐标
}
else if(rb.restype == RTSHORT)//整形
{
if(rb.rint == 0)
{
//wsc
}
else if(rb.rint == 1)
{
//ucs
}
else if(rb.rint == 2)
{
//dcs
}
}

创建 UCS 来调整图形的参考系。

创建 UCS:

void ZffCHAP4NewUCS()
{
// 获得当前图形的UCS表
AcDbUCSTable *pUcsTbl = NULL;
acdbHostApplicationServices()->workingDatabase()->getUCSTable(pUcsTbl, AcDb::kForWrite);

// 定义UCS的参数
AcGePoint3d ptOrigin(0, 0, 0);
AcGeVector3d vecXAxis(1, 1, 0);
AcGeVector3d vecYAxis(-1, 1, 0);

// 创建新的UCS表记录
AcDbUCSTableRecord *pUcsTblRcd = new AcDbUCSTableRecord();

// 设置UCS的参数
Acad::ErrorStatus es = pUcsTblRcd->setName("NewUcs");
if (es != Acad::eOk)
{
delete pUcsTblRcd;
pUcsTbl->close();
return;
}

//AcDbUCSTableRecord 类的 setOrigin、setXAxis 和setYAxis 三个函数分别用来设置原点、X 轴和 Y 轴的方向。
pUcsTblRcd->setOrigin(ptOrigin);
pUcsTblRcd->setXAxis(vecXAxis);
pUcsTblRcd->setYAxis(vecYAxis);

// 将新建的UCS表记录添加到UCS表中
es = pUcsTbl->add(pUcsTblRcd);
if (es != Acad::eOk)
{
delete pUcsTblRcd;
pUcsTbl->close();
return;
}

// 关闭对象
pUcsTblRcd->close();
pUcsTbl->close();
}

设置为当前 UCS:

void ZffCHAP4SetCurUcs()
{
// 提示用户输入UCS的名称
char ucsName[40];
if (acedGetString(NULL, "\n输入用户坐标系的名称:", ucsName) != RTNORM)
return;

// 获得指定的UCS表记录
AcDbUCSTable *pUcsTbl = NULL;
acdbHostApplicationServices()->workingDatabase()->getUCSTable(pUcsTbl, AcDb::kForRead);
if (!pUcsTbl->has(ucsName))
{
pUcsTbl->close();
return;
}

AcDbUCSTableRecord *pUcsTblRcd = NULL;
pUcsTbl->getAt(ucsName, pUcsTblRcd, AcDb::kForRead);

// 获得UCS的变换矩阵
AcGeMatrix3d mat;// UCS 到 WCS 转换
AcGeVector3d vecXAxis, vecYAxis, vecZAxis;
vecXAxis = pUcsTblRcd->xAxis();
vecYAxis = pUcsTblRcd->yAxis();
vecZAxis = vecXAxis.crossProduct(vecYAxis);//两个矢量的向量积(根据 UCS 的 X、Y 轴方向获得 Z 方向。)
mat.setCoordSystem(pUcsTblRcd->origin(), vecXAxis,vecYAxis, vecZAxis);

// 关闭UCS表和UCS表记录
pUcsTblRcd->close();
pUcsTbl->close();

// 设置当前的UCS
acedSetCurrentUCS(mat);
}

移动UCS 的原点:

void ZffCHAP4MoveUcsOrigin()
{
// 获得当前UCS的变换矩阵
AcGeMatrix3d mat;
Acad::ErrorStatus es = acedGetCurrentUCS(mat);

// 根据变换矩阵获得UCS的参数
AcGePoint3d ptOrigin;
AcGeVector3d vecXAxis, vecYAxis, vecZAxis;
mat.getCoordSystem(ptOrigin, vecXAxis, vecYAxis, vecZAxis);

// 移动UCS的原点
AcGeVector3d vec(100, 100, 0);
ptOrigin += vec;

// 更新变换矩阵
mat.setCoordSystem(ptOrigin, vecXAxis, vecYAxis, vecZAxis);

// 应用新的UCS
acedSetCurrentUCS(mat);
}

 UCS 绕 Z 轴旋转60°:

void ZffCHAP4RotateUcs()
{
// 获得当前UCS的变换矩阵
AcGeMatrix3d mat;
Acad::ErrorStatus es = acedGetCurrentUCS(mat);

// 根据变换矩阵获得UCS的参数
AcGePoint3d ptOrigin;
AcGeVector3d vecXAxis, vecYAxis, vecZAxis;
mat.getCoordSystem(ptOrigin, vecXAxis, vecYAxis, vecZAxis);

// 绕Z轴旋转60度
vecXAxis.rotateBy(60 * atan(1) * 4 / 180, vecZAxis);
vecYAxis.rotateBy(60 * atan(1) * 4 / 180, vecZAxis);

// 更新变换矩阵
mat.setCoordSystem(ptOrigin, vecXAxis, vecYAxis, vecZAxis);

// 应用新的UCS
acedSetCurrentUCS(mat);
}

在UCS 中创建实体:

void ZffCHAP4AddEntInUcs()
{
// 转换坐标系的标记
struct resbuf wcs, ucs;
wcs.restype = RTSHORT;
wcs.resval.rint = 0;
ucs.restype = RTSHORT;
ucs.resval.rint = 1;

// 提示用户输入直线的起点和终点
ads_point pt1, pt2;
if (acedGetPoint(NULL, "拾取直线的起点:", pt1) != RTNORM)
return; 
if (acedGetPoint(pt1, "拾取直线的终点:", pt2) != RTNORM)
return;

// 将起点和终点坐标转换到WCS
acedTrans(pt1, &ucs, &wcs, 0, pt1);
acedTrans(pt2, &ucs, &wcs, 0, pt2);

// 创建直线
AcDbLine *pLine = new AcDbLine(asPnt3d(pt1), asPnt3d(pt2));
AcDbBlockTable *pBlkTbl = NULL;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForRead);
AcDbBlockTableRecord *pBlkTblRcd= NULL;
pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,AcDb::kForWrite);
pBlkTbl->close();
pBlkTblRcd->appendAcDbEntity(pLine);
pLine->close();
pBlkTblRcd->close();
}

 

转载于:https://my.oschina.net/u/2930533/blog/1618956

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 AutoCAD 的 Python API 中,可以通过以下方式获取当前文档的 WCS 坐标系: ``` import comtypes.client import math # 连接 AutoCAD COM 组件 acad = comtypes.client.GetActiveObject("AutoCAD.Application") # 获取当前文档对象 doc = acad.ActiveDocument # 获取当前文档的 UCS 坐标系 ucs = doc.ActiveUCS # 获取 UCS 坐标系的原点坐标 ucs_origin = ucs.Origin # 获取 UCS 坐标系的 X 轴向量 ucs_x_axis = ucs.XAxis # 获取 UCS 坐标系的 Y 轴向量 ucs_y_axis = ucs.YAxis # 计算 WCS 坐标系的原点坐标 wcs_origin = ucs_origin - ucs_x_axis * doc.UCSOriginDistance * math.cos(math.radians(ucs.Elevation)) - ucs_y_axis * doc.UCSOriginDistance * math.sin(math.radians(ucs.Elevation)) # 计算 WCS 坐标系的 X 轴向量 wcs_x_axis = ucs_x_axis.RotateBy(ucs.Elevation, ucs.ZAxis) # 计算 WCS 坐标系的 Y 轴向量 wcs_y_axis = ucs_y_axis.RotateBy(ucs.Elevation, ucs.ZAxis) # 计算 WCS 坐标系的 Z 轴向量 wcs_z_axis = ucs.ZAxis # 输出 WCS 坐标系的信息 print("WCS Origin:", wcs_origin) print("WCS X Axis:", wcs_x_axis) print("WCS Y Axis:", wcs_y_axis) print("WCS Z Axis:", wcs_z_axis) ``` 在上面的代码中,我们首先连接到了 AutoCAD 的 COM 组件,然后获取了当前文档对象。接着,使用文档对象的 `ActiveUCS` 属性获取了当前的 UCS 坐标系,并分别获取了 UCS 坐标系的原点坐标、X 轴向量和 Y 轴向量。接着,根据 UCS 坐标系的信息计算了 WCS 坐标系的原点坐标、X 轴向量、Y 轴向量和 Z 轴向量,并输出了 WCS 坐标系的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值