关于vc使用autocad的ActiveX开发控制cad的应用程序?????????

dzy983 2006-01-06 02:15:46
我使用vc程序控制打开一个cad(*.dwg)文件,然后想在这个图纸文件中查找某个文本字符的位置,如里这个文本字符是个单独的文本控件字符,我可以查找得到他的位置,是通过遍历cad图纸的模型空间的所有对象来查找的,但要是这个文本字符是放在一个块(cad图纸的中block,即块)中就没办法遍历到了。如何遍历一个块中的所有对象?
问题就是用vc程序如何遍历cad图纸中的一个块(也就是遍历块中的所有对象),然后判断每个遍历对象的类型,要是是文本类型,就是取出应该文本内容。
...全文
568 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
asuo8 2006-04-23
  • 打赏
  • 举报
回复
MicroDraw图形控件中的FindText功能可以对块中文字,扩展文字等进行查找,定位坐标的。。
asuo8 2006-04-23
  • 打赏
  • 举报
回复
建议试试MicroDraw图形控件
dzy983 2006-01-08
  • 打赏
  • 举报
回复
to: syy64(太平洋) ,xuzheng318(忧郁王子)
各位高手,就是已经找了搜了,找不到解决办法啊!才来请教各位的!!!!
syy64 2006-01-07
  • 打赏
  • 举报
回复
google搜了没有?
dzy983 2006-01-07
  • 打赏
  • 举报
回复
是啊!我找了很多资料都没查到!!在线等待!
syy64 2006-01-07
  • 打赏
  • 举报
回复
那要对cad控件的功能很熟啊。
dzy983 2006-01-07
  • 打赏
  • 举报
回复
在线等待,高手解决
dzy983 2006-01-07
  • 打赏
  • 举报
回复
to:lzzqqq(Jonersen)
我代码如下:
IAcadApplication m_CADApp;//AutoCAD应用程序对象
IAcadDocuments m_CADDocs;//AutoCAD文档集
IAcadDocument m_CADDoc;//AutoCAD文档集
IAcadModelSpace m_CADModelSpace;//模型空间
IAcadBlockReference m_CADBlock;//图块空间
IAcadText m_CADText;//文本对象
IAcadRasterImage m_CADRaster;//光栅图像对象


//打开所选择的图形文件
m_CADDocs.Open(m_strDrawingFilePath,ReadOnly,password);
//获得当前活动状态的图形文档
m_CADDoc = m_CADApp.GetActiveDocument();
//获得模型空间对象
m_CADModelSpace = m_CADDoc.GetModelSpace();
//m_CADBlock=m_CADDoc.GetBlocks ();

//签名函数
SignatureName();

void CSignatureToCADDlg::SignatureName()
{
IAcadEntity theEntity;
VARIANT varit,blockvarit;
IAcadText theText;
IAcadMText theMText;
IAcadBlockReference theBlock;
varit.vt = VT_I4;
BOOL bIsSig = false;
//输出文本到指定的点
if(!m_strPersonName.IsEmpty())
{
//当审批人的名字为空时,执行函数体


for(long i=0;i<m_CADModelSpace.GetCount();i++)
{
//遍历模型空间的所有实体
varit.lVal = i;
theEntity = m_CADModelSpace.Item(varit);
AfxMessageBox("类型:\n"+theEntity.GetObjectName());
if(theEntity.GetObjectName() == "AcDbBlockReference")
{
theBlock = m_CADModelSpace.Item(varit);

//blockvarit=theBlock.;
int j;


char p[100];
AfxMessageBox(itoa(j,p,100));
//for (j=0;j<=)
//theBlock.
//blockvarit(1)
}
if(theEntity.GetObjectName() == "AcDbText")
{
//如果当前实体是单行文本的话
theText = m_CADModelSpace.Item(varit);
//AfxMessageBox("单行文本:\n"+theText.GetTextString());
if(theText.GetTextString() == m_strTextPlace)
{

CComVariant thePoint;
thePoint = theText.GetInsertionPoint();//获取插入点,相对于基准点而言
//thePoint = theText.GetTextAlignmentPoint();//获取基准点,坐标原点
double *dpoint;
dpoint = (double*)(thePoint.parray->pvData);

//将双精度型的数组填充到VARIANT的parray域中
COleSafeArray safeOleArr;
double dValues[3];//={300,1000,0};
dValues[0] = *dpoint+20;dpoint++;//+80
dValues[1] = *dpoint;dpoint++;
dValues[2] = *dpoint;
safeOleArr.CreateOneDim(VT_R8,3,dValues);
VARIANT * pNewPointVariant = (LPVARIANT)safeOleArr;

//设置输出文本的字体
IAcadTextStyle cadNewTextStyle;

//获取当前活动字体的对象
cadNewTextStyle = m_CADDoc.GetActiveTextStyle();
cadNewTextStyle.SetFont("隶书",false,false,1,4);//宋体 隶书
//设置字体
m_CADDoc.SetActiveTextStyle(cadNewTextStyle);

m_CADText = m_CADModelSpace.AddText(m_strPersonName,*pNewPointVariant,theText.GetHeight());

bIsSig = true;
MessageBox("审批人签名成功!","提示信息",MB_ICONINFORMATION|MB_OK);
break;
}
}

if(theEntity.GetObjectName() == "AcDbMText")
{
//如果当前实体是多行文本的话
theMText = m_CADModelSpace.Item(varit);
//AfxMessageBox("多行文本:\n"+theMText.GetTextString());

if((theMText.GetTextString()).Find(m_strTextPlace) != -1)
{
//多行文本所返回的字符串中包含格式化的内容,
//它不同于单行文本所返回的字符串
//所以它采用在字符串中查找子字符串的方式来处理
CComVariant theMPoint;
theMPoint = theMText.GetInsertionPoint();//获取插入点,相对于基准点而言

double *dMpoint;
dMpoint = (double*)(theMPoint.parray->pvData);

//将双精度型的数组填充到VARIANT的parray域中
COleSafeArray safeOleArrM;
double dMValues[3];//={300,1000,0};
dMValues[0] = *dMpoint+80;dMpoint++;
dMValues[1] = *dMpoint;dMpoint++;
dMValues[2] = *dMpoint;
safeOleArrM.CreateOneDim(VT_R8,3,dMValues);
VARIANT * pMNewPointVariant = (LPVARIANT)safeOleArrM;

//设置输出文本的字体
IAcadTextStyle cadNewTextStyle;

//获取当前活动字体的对象
cadNewTextStyle = m_CADDoc.GetActiveTextStyle();
cadNewTextStyle.SetFont("隶书",false,false,1,4);//宋体 隶书
//设置字体
m_CADDoc.SetActiveTextStyle(cadNewTextStyle);

m_CADText = m_CADModelSpace.AddText(m_strPersonName,*pMNewPointVariant,theText.GetHeight());

bIsSig = true;
MessageBox("审批人签名成功!","提示信息",MB_ICONINFORMATION|MB_OK);
break;
}


}
//输出实体对象的名称
//AfxMessageBox(theEntity.GetObjectName());
}

if(!bIsSig)
MessageBox("审批人签名失败,在文件中未找到:\n"+m_strTextPlace,"提示信息",MB_ICONINFORMATION|MB_OK);

}

}

上面的代码只对单行文本和多行文本两种对象类型进行处理,而有些文本是放块中的,如何遍历块中的所有对象呢???
xuzheng318 2006-01-07
  • 打赏
  • 举报
回复
google找找相关资料学习一下!
lzzqqq 2006-01-06
  • 打赏
  • 举报
回复
CFile f;
f.Open("cad.dwg");
f.Find(..........
至于怎么找你自己看吧.不可能找不到.

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧