- UID
- 59465
- 积分
- 267
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-6-18
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2003-6-27 14:05:33
|
显示全部楼层
呵呵,问题基本上解决了
下面是完整主要代码,请大家参考并指正
//尺寸标注中文字翻转
void TextRotation()
{
ads_name ssDim,EntityName;
AcDbEntity *pEnt;
struct resbuf pRb;
AcDbObjectId objId,DmStyId;
double TxtRt,dDimToHAngle;
AcGePoint3d DmLPt,TxtPt,EPt1,EPt2,TmpPt;
AcDbObjectId DimStyId;
AcDbDimStyleTableRecord *pDmTblRcd;
int dimfit;//标注的Format->fit值
//获取选择集过滤List(由实体名称过滤)
char sbuf[50]; // Buffers to hold strings
pRb.restype = 0; //实体名称
strcpy(sbuf, "Dimension");
strupr(sbuf);
pRb.resval.rstring = sbuf;
pRb.rbnext = NULL;
//选取尺寸标注
ads_printf("\n请选择要翻转尺寸值的标注");
int ss= ads_ssget(NULL,NULL,NULL,&pRb,ssDim);
//取得选择集中实体个数
long NumOfEntity;
ss = ads_sslength(ssDim,&NumOfEntity);
//对选择集中的实体进行过滤
for(long i = 0 ; i<NumOfEntity;i++)
{
ads_ssname(ssDim,i,EntityName);
acdbGetObjectId(objId,EntityName);
if(acdbOpenObject(pEnt,objId,AcDb::kForWrite)!=Acad::eOk)
{
ads_printf("\n打开实体时出错!");
return;
}
//线性标注
if(strcmp(pEnt->isA()->name(),"AcDbRotatedDimension")==0)
{
AcDbRotatedDimension *pDim;
pDim = AcDbRotatedDimension::cast(pEnt);
//取得标注的风格ID
DmStyId=pDim->dimensionStyle();
acdbOpenObject(pDmTblRcd,DmStyId,AcDb::kForWrite);
//取得标注的Format->fit值
dimfit=pDmTblRcd->dimfit();
//取得标注线点
DmLPt=pDim->dimLinePoint();
//取得文字中心点
TxtPt = pDim->textPosition();
EPt1 = pDim->xLine1Point();
EPt2 = pDim->xLine2Point();
//取得文字中心点的镜像点
AcGePlane pLn(DmLPt,AcGeVector3d(EPt2-EPt1).perpVector());
TmpPt = TxtPt;
TmpPt.mirror(pLn);
//取得标注线与水平方向夹角
dDimToHAngle = AcGeVector3d(EPt2-EPt1).angleTo(AcGeVector3d(1,0,0));
//翻转文字
pDim->setTextRotation(PI+dDimToHAngle);
pDim->setTextPosition(TmpPt);
//pDmTblRcd->setDimfit(dimfit);//以后实现把标注的Format->fit属性设置还原
pDmTblRcd->close();
}
//对齐标注
else if(strcmp(pEnt->isA()->name(),"AcDbAlignedDimension")==0)
{
AcDbAlignedDimension *pDim;
pDim=AcDbAlignedDimension::cast(pEnt);
//取得标注的风格ID并打开相应的纪录表
DmStyId=pDim->dimensionStyle();
acdbOpenObject(pDmTblRcd,DmStyId,AcDb::kForWrite);
//取得标注的Format->fit值
dimfit=pDmTblRcd->dimfit();
//取得标注线点
DmLPt=pDim->dimLinePoint();
//取得文字中心点
TxtPt = pDim->textPosition();
EPt1 = pDim->xLine1Point();
EPt2 = pDim->xLine2Point();
//取得文字中心点的镜像点
AcGePlane pLn(DmLPt,AcGeVector3d(EPt2-EPt1).perpVector());
TmpPt = TxtPt;
TmpPt.mirror(pLn);
//取得标注线与水平方向夹角
dDimToHAngle = AcGeVector3d(EPt2-EPt1).angleTo(AcGeVector3d(1,0,0));
//翻转文字
pDim->setTextRotation(PI-dDimToHAngle);
pDim->setTextPosition(TmpPt);
//pDmTblRcd->setDimfit(dimfit);//以后实现把标注的Format->fit属性设置还原
pDim->setTextPosition(TmpPt);
pDmTblRcd->close();
}
//其他标注暂时先不做处理。。。
else
{
AcDbDimension *pDim;
pDim=AcDbDimension::cast(pEnt);
TxtRt = pDim->textRotation();
pDim->setTextRotation(PI+TxtRt);
}
pEnt->close();
}
}
线性标注和对齐标注的代码能在多大程度上简化,正在思索中~~
请大家指点。。。。。。。 |
|