找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 502|回复: 6

[求助]:请高手帮忙:如何修改尺寸标注的Fit属性(有代码和图片)

[复制链接]
发表于 2003-6-27 09:23:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
图1是原图
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2003-6-27 09:26:12 | 显示全部楼层
图2是我把图中的标注的Format->fit设置为Best Fit时候的翻转尺寸的效果。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-27 09:27:02 | 显示全部楼层
图3是我把图中标注的Format->fit设置为No Leader时候翻转尺寸的效果。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-27 09:44:35 | 显示全部楼层

源代码

下面是实现翻转的主要源代码
void TextRotation()
{
ads_name ssDim,EntityName;
AcDbEntity *pEnt;
struct resbuf pRb;
AcDbObjectId objId;
double TxtRt;//DimRt,
AcGePoint3d DmLPt,TxtPt,EPt1,EPt2,TmpPt;
AcDbObjectId DimStyId;
       
//获取选择集过滤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(),"AcDbAlignedDimension")==0)
{
                       
AcDbAlignedDimension*pDim;
pDim = AcDbAlignedDimension::cast(pEnt);
               
//取得标注线点
DmLPt=pDim->dimLinePoint();
//取得文字中心点
TxtPt = pDim->textPosition();
//取得文字转角(夹角?)
TxtRt = pDim->textRotation();
                       
EPt1 = pDim->xLine1Point();
EPt2 = pDim->xLine2Point();
               
//取得文字中心点相对标注线的镜像点
AcGePlane pLn(DmLPt,AcGeVector3d(EPt1-EPt2).perpVector());
TmpPt = TxtPt;
TmpPt.mirror(pLn);
       
//翻转文字
pDim->setTextRotation(PI+TxtRt);
pDim->setTextPosition(TmpPt);
                                       
}
pEnt->close();

}
}
请大家帮我看看问题出在那个地方,谢谢了~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-27 09:52:43 | 显示全部楼层
以上的代码是实现对齐标注的代码(这个搞定了线性标注也差不多了)。我自己弄了好久,不知道把尺寸标注的Format->fit用代码更改设置为No Leader是不是会好点?或者这个思路根本就是错的!?
请大家多多帮忙指点下,谢了~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 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();
       
}
}

线性标注和对齐标注的代码能在多大程度上简化,正在思索中~~
请大家指点。。。。。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-6-27 15:44:57 | 显示全部楼层
以下是经过测试后修正的代码:
//线性标注
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();

//设置标注Format->fit为No Leader
pDmTblRcd->setDimfit(5);

//取得标注线点
DmLPt=pDim->dimLinePoint();
//取得文字中心点
TxtPt = pDim->textPosition();
TxtRt = pDim->textRotation();
                       
EPt1 = pDim->xLine1Point();
EPt2 = pDim->xLine2Point();
               
//取得文字中心点的镜像点
AcGePlane pLn(DmLPt,AcGeVector3d(EPt2-EPt1).perpVector());
TmpPt = TxtPt;
TmpPt.mirror(pLn);

//取得标注线与水平方向夹角
if(dDimToHAngle==0)
dDimToHAngle = (AcGeVector3d(EPt2-EPt1).normalize()).angleTo(AcGeVector3d(1,0,0));
                       
//翻转文字
if(TxtRt==0)
{
if(dDimToHAngle == PI/2.0)
  pDim->setTextRotation(2*PI-dDimToHAngle);
else
pDim->setTextRotation(PI);
}
else
{
if(TxtRt==3*PI/2.0)
pDim->setTextRotation(PI+TxtRt);
else
pDim->setTextRotation(PI-TxtRt);
}
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();

//设置标注Format->fit为No Leader
pDmTblRcd->setDimfit(5);

//取得标注线点
DmLPt=pDim->dimLinePoint();

//取得文字中心点
TxtPt = pDim->textPosition();
TxtRt = pDim->textRotation();
       
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));
                       
//翻转文字
if(TxtRt==0)
pDim->setTextRotation(2*PI-dDimToHAngle);
else
pDim->setTextRotation(PI+TxtRt);

pDim->setTextPosition(TmpPt);
//pDmTblRcd->setDimfit(dimfit);//以后实现把标注的Format->fit属性设置还原
               
pDim->setTextPosition(TmpPt);
pDmTblRcd->close();

}

pEnt->close();

}
其它标注的翻转情况目前只是做简单处理。。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 00:28 , Processed in 0.204818 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表