博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ObjectARX_符号表---->UCS
阅读量:6604 次
发布时间:2019-06-24

本文共 4030 字,大约阅读时间需要 13 分钟。

hot3.png

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();// 设置当前的UCSacedSetCurrentUCS(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);// 应用新的UCSacedSetCurrentUCS(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);// 应用新的UCSacedSetCurrentUCS(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;// 将起点和终点坐标转换到WCSacedTrans(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

你可能感兴趣的文章
phpMyAdmin数据库出现中文乱码
查看>>
linux安装NFS服务器学习
查看>>
Planner .NET日历日程控件能给你的应用程序提供多种日历日程功能
查看>>
我的友情链接
查看>>
word导出(使用freemarker模板导出)
查看>>
Linux压力测试
查看>>
4 HTTP重定向HTTPS-方法1
查看>>
获取来访真实IP方法
查看>>
主流CTR预估模型的演化及对比
查看>>
探索车险未来方向,2018平安产险数据建模大赛圆满落幕,获得第五名
查看>>
ES6:变量的解构赋值
查看>>
NIS网络信息服务
查看>>
file - 确定文件类型
查看>>
Java 第一天
查看>>
我的友情链接
查看>>
常用的与正则表达式
查看>>
JAVA中的线程机制(二)
查看>>
Windows Server 2012下的文件迁移
查看>>
nginx安装与配置2(转载)
查看>>
Linux下Mongodb安装和启动配置
查看>>