找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3880|回复: 17

[求助] 如何设置标注的前后缀?已搜索论坛无重复提问

[复制链接]

已领礼包: 112个

财富等级: 日进斗金

发表于 2016-6-24 11:18:05 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 革天明 于 2016-6-24 17:31 编辑

AcString qianzhui,houzhui;
qianzhui=_T("%%c");
houzhui=_T("%%p0.03");
pDim=AcDbDimension::cast(pEnt);
es=pDim->setAlternatePrefix(qianzhui);
if(es!=Acad::eOk)
{
    return;
}
……
if (pDim!=NULL)
     {
      pDim->close();
     }

上面代码一运行就崩溃了

请问如何才能设置一个标注的前后缀呢?
2016-06-24_172201.png
哪上图所示,左边标注需要添加前缀“Φ”和后缀“±0.03”变为右侧的标注形式。注意对于其尺寸24.05还要保持其原有形式(下图)而不是将尺寸提取后按小数位数转成的字符串(若以DXF码来说,其组码1为“%%c<>%%p0.03”)
2016-06-24_172524.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-6-24 11:38:50 | 显示全部楼层
崩溃有什么提示呢?

点评

[attachimg]53831[/attachimg]  详情 回复 发表于 2016-6-24 17:32
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2016-6-24 17:00:57 | 显示全部楼层
没看懂什么意思
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2016-6-24 17:01:44 | 显示全部楼层
本帖最后由 iLisp 于 2016-6-24 17:07 编辑

你这个方法是哪个版本的?我查 2010 的 help 没有看到 AcDbDimension 有 setAlternatePrefix 方法

This method returns a string in the MTextContentBuffer argument that is suitable for passing into setDimensionText(). A typical use would be as follows:

AcDbDimension *pDim = ...;
// The client allocates the return buffer
char dimTBuf[1000];
double userLen = 22/7;
// or whatever...
pDim->formatMeasurement(dimTBuf, userLen, pDim->dimensionText());
pDim->setDimensionText(dimTBuf);



This method gives you access to the dimension classes' text assembly and formatting logic. You pass in a double corresponding to the desired measurement and get back a string suitable for building MText objects. That MText content string reflects the dimension's dimstyle settings for prefixes, suffixes, units, precision, alternate units, tolerances, text style, and so on.
The dimensionText string can either be a replacement for the dimension measurement, as in setDimensionText("5.000"), or it can be a template that influences the dimension text, as in setDimensionText("{}X[]Ptypical"). This dimension text string gets combined with DIMPOST, DIMAPOST, and the alternate and primary measurements in the final dimension text.
Another case would be to format a measurement for use in some other MText object. You create a dummy dimension object, assign whatever dimstyle data needed to that dimension, then use this method to generate other MText notes:

AcDbDatabase *pDb = ...;
AcDbRotatedDimension *pDim = ...;
AcDbDimStyleTableRecord Style, *pStyle = &style;
pDb->getDimstyleData(pStyle);
pDim->setDimensionstyle(pDb->dimstyle());
pDim->setDimstyleData(pStyle);
AcDbMText *pMt = ...;
char measureBuf[1000];
double measureX;
pDim->formatMeasurement(measureBuf, measureX, "");
pMt->setContents(dimTBuf);




点评

[attachimg]53832[/attachimg] ObjectARX 2012  详情 回复 发表于 2016-6-24 17:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2016-6-24 17:32:58 | 显示全部楼层
newer 发表于 2016-6-24 11:38
崩溃有什么提示呢?

2016-06-24_172815.png

点评

前缀和后缀都是设置DIMPOST pDim->setDimPost(_T(".....")); [attachimg]53833[/attachimg]  详情 回复 发表于 2016-6-24 19:15
提示的很清楚了,你没有用写方式打开对象,换 kWrite 方式就行了。  详情 回复 发表于 2016-6-24 18:50
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2016-6-24 17:35:53 | 显示全部楼层
iLisp 发表于 2016-6-24 17:01
你这个方法是哪个版本的?我查 2010 的 help 没有看到 AcDbDimension 有 setAlternatePrefix 方法

This  ...

2016-06-24_173059.png
ObjectARX 2012

点评

这个是换算前缀,前缀是 setPrefix 后缀是 setSuffix 不是 需要 kForWrite 打开  详情 回复 发表于 2016-6-24 17:55
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2016-6-24 17:55:52 | 显示全部楼层

这个是换算前缀,前缀是  setPrefix  后缀是  setSuffix

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2016-6-24 18:13:43 | 显示全部楼层
直接设置 dimtext 可以,设置前缀、后缀后文字会分成两行,在特性管理器设置不会出现两行,List 查询是 DIMPOST 替代


  1. static void asdkMyGroupMyCommand () {
  2.                 // Put your command code here
  3.                 ads_name ent;
  4.                 ads_point pt;
  5.                 if (RTNORM!=acedEntSel(L"\nPick Dim: ",ent,pt))
  6.                         return;
  7.        
  8.                 AcDbObjectId id;
  9.                 acdbGetObjectId(id,ent);
  10.                 AcDbEntity *pEnt=NULL;
  11.                  
  12.                 if (acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) != Acad::eOk  )
  13.                         return;

  14.                 if (!pEnt->isKindOf(AcDbDimension::desc()))
  15.                 {
  16.                         pEnt->close();
  17.                         return;
  18.                 }
  19.                 AcDbDimension *pDim=NULL;
  20.                 pDim=AcDbDimension::cast(pEnt);
  21.                 //pDim->setPrefix(L"%%c");
  22.                 //pDim->setSuffix(L"%%p0.25");
  23.                 pDim->setDimensionText(L"%%c<>%%p0.30");
  24.                 pDim->close();
  25.                 pEnt->close();
  26.         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-6-24 18:50:54 | 显示全部楼层

提示的很清楚了,你没有用写方式打开对象,换 kWrite 方式就行了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-6-24 19:15:03 | 显示全部楼层

前缀和后缀都是设置DIMPOST
pDim->setDimPost(_T("....."));



搜狗截图20160624190940.png

点评

是这样的 pDim->setDimpost(L"%%c%%p0.25"); 手册中这个方法没有在 AcDbDimension 对象中列出  详情 回复 发表于 2016-6-24 20:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2016-6-24 20:01:22 | 显示全部楼层
newer 发表于 2016-6-24 19:15
前缀和后缀都是设置DIMPOST
pDim->setDimPost(_T("....."));

是这样的

pDim->setDimpost(L"%%c<>%%p0.25");

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

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2016-6-25 23:08:58 | 显示全部楼层
正确方法应该是:
  1. pDim->setDimpost(_T("%%c<>%%p0.30"));
  2. pDim->setDimapost(_T(""));

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

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2016-6-26 00:15:32 | 显示全部楼层
如果采用智能指针,可以少犯点错。
例如稍微改写的代码:
  1.         ads_name ent;
  2.         ads_point pt;
  3.         if (RTNORM!=acedEntSel(_T("\nPick Dim: "),ent,pt))
  4.             return;

  5.         AcDbObjectId id;
  6.         acdbGetObjectId(id,ent);

  7.         AcDbEntityPointer pEnt(id,AcDb::kForWrite);
  8.         if (pEnt.openStatus()!=Acad::eOk)
  9.             return;

  10.         if(pEnt->isKindOf(AcDbDimension::desc()))
  11.         {
  12.             AcDbDimension* pDim =(AcDbDimension *)pEnt.object();
  13.             pDim->setDimpost(_T("%%c<>%%p0.30"));
  14.             pDim->setDimapost(_T(""));
  15.         }


点评

指导很详细,谢谢!下面是我写的,只是加了一个选择集,能实现多选操作,本意还想对acedGetstring的返回值进行判断,当用户直接按空格时,intstr=“2”,但没有实现 static void YTMsupportzhijing() { ACHAR  详情 回复 发表于 2016-6-27 14:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

 楼主| 发表于 2016-6-27 14:58:06 | 显示全部楼层
Highflybird 发表于 2016-6-26 00:15
如果采用智能指针,可以少犯点错。
例如稍微改写的代码:

指导很详细,谢谢!下面是我写的,只是加了一个选择集,能实现多选操作,本意还想对acedGetstring的返回值进行判断,当用户直接按空格时,intstr=“2”,但没有实现
static void YTMsupportzhijing()
{
  ACHAR *intstr = new ACHAR(20);
  //acedGetString(NULL,_T("\n请设置公差范围:<2>"),str.GetBufferSetLength(100)) 返回值是CString类型
  CString mydimpost=_T("");
  if(acedGetString(0,_T("\n请设置公差值:"),intstr)!=RTNORM)
  {
   return;
  }
  
  mydimpost=_T("%%c<>%%p0.0") + (CString)intstr;
  ////遍历所有实体  
  ads_name sset;////选择集名称
  AcDbObjectIdArray entIds;
  entIds.setLogicalLength(0);
  //建议缓冲区链表
  struct resbuf *rb;//结果缓冲表
  rb=acutBuildList(RTDXF0,TEXT("DIMENSION"),RTNONE);
  if(acedSSGet(NULL,NULL,NULL,rb,sset)==RTNORM)
  {
   long length=0;
   acedSSLength(sset,&length);
   acutPrintf(TEXT("\n实体数:%d"),length);
   for(int i=0;i<length;i++)
   {
    ads_name ent;
    acedSSName(sset,i,ent);
    AcDbObjectId id;
    acdbGetObjectId(id,ent);
    AcDbEntityPointer pEnt(id,AcDb::kForWrite);
    if (pEnt.openStatus()!=Acad::eOk)
     return;
    if(pEnt->isKindOf(AcDbDimension::desc()))
    {
     AcDbDimension* pDim =(AcDbDimension *)pEnt.object();
     acutPrintf(mydimpost);
     pDim->setDimpost(mydimpost);
     pDim->setDimapost(_T(""));
    }  
   }
  }
  //关闭链表
  acutRelRb(rb);
  //关闭选择集
  acedSSFree(sset);
  
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2016-6-27 15:25:11 | 显示全部楼层
那你为什么不用acedGetInt 或者acedGetReal呢?这样就可以控制按空格默认数值了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 09:13 , Processed in 0.253637 second(s), 71 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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