AutoCAD二次开发问题

wonder_zs 2008-11-11 11:36:33
需要将cad图中的所有文本提取出来进行修改。
但是不知道如何将文本从cadApp.ActiveDocument.ModelSpace.Item(i)提取出来,代码如下

private AcadApplication cadApp = new AcadApplicationClass();

object missing = System.Reflection.Missing.Value;
object readOnly = false;
int count=0;

cadApp.Documents.Open(strFileName, readOnly, missing);

for (int i = 0; i < cadApp.ActiveDocument.ModelSpace.Count; i++)
{
if (cadApp.ActiveDocument.ModelSpace.Item(i).ObjectName == "AcDbMText")
{
count = count + 1;
cadApp.ActiveDocument.ModelSpace.Item(i);
????
}
}

谢谢大虾了,01:00前在线等
...全文
248 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
gislqy 2008-11-12
  • 打赏
  • 举报
回复
那是的,模型空间里面的对象不会只是文本,还会有其他点,线,面等对象;
由于AcadEntityClass是父类,所以它的子类除了你上面说的AcadTextClass,应该还会有其他点,线之类的,我猜就会有:AcadPointClass,AcadPolylineClass...

所以你要过滤其他的对象,只提取文本对象,但文本对象或者会有简单文本对象和多文本对象之分,你把这句:
cadApp.ActiveDocument.ModelSpace.Item(i).ObjectName == "AcDbMText";
改成:
cadApp.ActiveDocument.ModelSpace.Item(i).ObjectName == "AcDbText";

再用
AcadTextClass cadTxt=cadApp.ActiveDocument.ModelSpace.Item(i);看看
wonder_zs 2008-11-12
  • 打赏
  • 举报
回复
我先在比较纳闷的是cadApp.ActiveDocument.ModelSpace.Item返回的所有类型都是AcadEntityClass,但是它的cadApp.ActiveDocument.ModelSpace.Item[i].OjectName却可以为其他的比如"AcDbMText" "AcDbPolyline"。
wonder_zs 2008-11-12
  • 打赏
  • 举报
回复
6楼的谢谢你了。但是实际上cadApp.ActiveDocument.ModelSpace.Item返回的所有类型都是AcadEntityClass.所以
if(objAEC is AcadTextClass)
{
AcadTextClass cadTxt=(AcadTextClass )objAEC;
}
这个是根本不被执行的。
我先前再做
AcadTextClass cadTxt;
cadtxt=(AcadTextClass )cadApp.ActiveDocument.ModelSpace.Item(i);
这句时SDK告诉:
Additional information: 无法将类型为“AutoCAD.AcadEntityClass”的 COM 对象强制转换为类类型“AutoCAD.AcadTextClass”。表示 COM 组件的类型实例不能强制转换为表示 COM 组件的其他类型;不过,只要基础 COM 组件支持对接口 IID 的 QueryInterface 调用,就能将这些实例强制转换为接口。
gislqy 2008-11-12
  • 打赏
  • 举报
回复
上面那个 多余,原来想设置字体颜色的..
gislqy 2008-11-12
  • 打赏
  • 举报
回复
没做过cad二次开发,不过看代码的意思,AcadEntityClass应该会有一个类型的,看看下面行不行:

private AcadApplication cadApp = new AcadApplicationClass();

object missing = System.Reflection.Missing.Value;
object readOnly = false;
int count=0;

cadApp.Documents.Open(strFileName, readOnly, missing);

for (int i = 0; i < cadApp.ActiveDocument.ModelSpace.Count; i++)
{
if (cadApp.ActiveDocument.ModelSpace.Item(i).ObjectName == "AcDbMText")
{
count = count + 1;
//cadApp.ActiveDocument.ModelSpace.Item(i);
//????
AcadEntityClass objAEC=cadApp.ActiveDocument.ModelSpace.Item(i);
if(objAEC is AcadTextClass)
{
AcadTextClass cadTxt=(AcadTextClass )objAEC;
}

}
}
wonder_zs 2008-11-12
  • 打赏
  • 举报
回复
楼上的,我再VB地下是这么用的

Dim arcObj As AcadArc
Dim lineObj As AcadLine
Dim outerLoop(0 To 1) As AcadEntity
Dim center(0 To 2) As Double
Dim radius As Double
Dim startAngle As Double
Dim endAngle As Double
center(0) = 5: center(1) = 3: center(2) = 0
radius = 3
startAngle = 0
endAngle = 3.141592
Set arcObj = ThisDrawing.ModelSpace.AddArc(center, radius, startAngle, endAngle)
Set lineObj = ThisDrawing.ModelSpace.AddLine(arcObj.startPoint, arcObj.endPoint)

因此我自己认为AcadArc,AcadText,等等都是AcadEntity的子类
fengyecsdn 2008-11-12
  • 打赏
  • 举报
回复
是不是继承关系? 你怎么知道 对象的实际类型?
wonder_zs 2008-11-12
  • 打赏
  • 举报
回复
楼上 提示不能AcadEntityClass转换为AcadTextClass
fengyecsdn 2008-11-12
  • 打赏
  • 举报
回复
不清楚你的SDK是怎么个意思 绑顶
wonder_zs 2008-11-12
  • 打赏
  • 举报
回复
没有人回答吗?
cadApp.ActiveDocument.ModelSpace.Item(i)返回了一个AcadEntityClass类。这是AcadTextClass的父类,因此没有TextString属性。在vb地下,可以直接写
dim a as object
dim str as string
for each a in ModelSapce
if a.ObjectName="AcDbMText" Then
a.TextString=str
end if
next
可是C#里面并不能这么做,我尝试着用

AcadTextClass cadTxt;
cadtxt=(AcadTextClass )cadApp.ActiveDocument.ModelSpace.Item(i);

被告知不能转换。
那位达人可以告诉我吗?不胜感激
wonder_zs 2008-11-12
  • 打赏
  • 举报
回复
楼上的,已经弄出来了。不过谢谢你提醒我。

private AcadApplication cadApp = new AcadApplicationClass();

object missing = System.Reflection.Missing.Value;
object readOnly = false;
int count=0;

cadApp.Documents.Open(strFileName, readOnly, missing);

for (int i = 0; i < cadApp.ActiveDocument.ModelSpace.Count; i++)
{
if (cadApp.ActiveDocument.ModelSpace.Item(i).ObjectName == "AcDbMText")
{
count += 1;
IAcadMText im = (IAcadMText)cadApp.ActiveDocument.ModelSpace.Item(i);
chsContent[count] = im.TextString;
}
}

刚才看了很多文档AcadEntityClass用子类的接口来转换。上面那个IAcadMText 成功了。
gislqy 2008-11-12
  • 打赏
  • 举报
回复
是多文本对象就用相应的对象来接收,我以为你做这个开发的应该明白的我意思了,或者我应该都写出来,你看看:

private AcadApplication cadApp = new AcadApplicationClass();

object missing = System.Reflection.Missing.Value;
object readOnly = false;
int count=0;

cadApp.Documents.Open(strFileName, readOnly, missing);

for (int i = 0; i < cadApp.ActiveDocument.ModelSpace.Count; i++)
{
if (cadApp.ActiveDocument.ModelSpace.Item(i).ObjectName == "AcDbMText" || cadApp.ActiveDocument.ModelSpace.Item(i).ObjectName == "AcDbText") //既然是所有就都要提取
{
count = count + 1;
//cadApp.ActiveDocument.ModelSpace.Item(i);
AcadEntityClass objAEC=cadApp.ActiveDocument.ModelSpace.Item(i);
if(objAEC is AcadMTextClass)//如果是多行文本对象
{
AcadMTextClass cadMTxt=cadApp.ActiveDocument.ModelSpace.Item(i) as AcadMTextClass;
}
else if(objAEC is AcadTextClass)//如果是简单文本对象
{
AcadTextClass cadTxt=cadApp.ActiveDocument.ModelSpace.Item(i) as AcadTextClass;
}
}
}
wonder_zs 2008-11-12
  • 打赏
  • 举报
回复
楼上,我读出来
string otype = cadApp.ActiveDocument.ModelSpace.Item(i).ObjectName
otype=="AcDbMText"

如你所说,AcDbMText是多文本对象
但是时间上这里只是一个是否执行下去的语句啊。跟地下怎么取值是没有关系的。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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