518yf 发表于 2009-11-14 16:15:00

[求助]C# 如何打开指定的dwg文件?

本帖最后由 作者 于 2009-11-15 10:27:32 编辑 <br /><br /> <p>C#如何通过程序打开指定的dwg文件,然后对其文件进行文字遍历查找替换?最好给一段示意代码,我是一个新手,在网上找了一天了,也没找到,希望大家给予指点,谢谢大家……</p><p>1、文字一般信息存储在什么地方,BlockTable、BlockTableRecord还是其它某个记录或表?? </p><p>2、如果C#直接操作dwg文件有难度较大,那么请问C#如何隐藏模式启动CAD程序,打开文件进行查找替换,我是的是VS2008+CAD2008,网上找了许久,都是CAD2004的启动模块,不适合CAD2008?请大家指点一二……</p>

雪山飞狐_lzh 发表于 2009-11-15 10:37:00

<p>直接操作dwg文件没问题的</p><p>这几天机器坏掉,还没重装完,简单说下吧</p><p>1、打开你的dwg文件:Application.DocumentManager.Open(fileName)</p><p>2、用选择集获取文字实体,过滤器可以设置为:</p><p>&nbsp;&nbsp;&nbsp; 0,"*Text",</p><p>&nbsp;&nbsp;&nbsp; 1,"*你要查找的字符串*"</p><p>3、遍历选择集,替换</p>

518yf 发表于 2009-11-15 11:10:00

<p>谢谢版本,非常感谢,能不能给点代码,本人CAD开发是个菜鸟……</p><p>不管怎么说,我会按你说的思路,是研究一下!!感谢!!</p>

wangph 发表于 2009-11-15 14:51:00

直接打开DWG文件不是好选择,可以尝试用DBX,只是我也不知道如何在C#中用DBX技术。

518yf 发表于 2009-11-15 15:53:00

<p>本人写了一小段,肯定不对,但实在不知道怎么写,希望哪个朋友指点一下:</p><p>using Autodesk.AutoCAD.ApplicationServices;<br/>using Autodesk.AutoCAD.DatabaseServices;<br/>using Autodesk.AutoCAD.Runtime;<br/>using Autodesk.AutoCAD.Geometry;<br/>using Autodesk.AutoCAD.EditorInput;</p><p>Document doc = Application.DocumentManager.Open(lvi.SubItems.Text.Trim());<br/>Editor ed = doc.Editor;<br/>TypedValue[] filList = new TypedValue[] { new TypedValue((int)DxfCode.Start, "text,mtext") };<br/>SelectionFilter filter = new SelectionFilter(filList);<br/>PromptSelectionResult ssr = GetSelection(filter)<br/>if (ssr.Status == PromptStatus.OK)<br/>{<br/>&nbsp;&nbsp;&nbsp;&nbsp;//判断是否为空,查找要满足条件的文字在进行替换</p><p>}<br/></p>

雪山飞狐_lzh 发表于 2009-11-15 16:56:00

      
      public void Test1()
      {
            Document doc = Application.DocumentManager.Open("d:\\1.dwg");
            Database db = doc.Database;
            Editor ed = doc.Editor;
            SelectionFilter filter =
                new SelectionFilter(
                  new TypedValue[]
                  {
                        new TypedValue(0, "*text") ,
                        new TypedValue(1, "*ABC*")
                  }
                );
            PromptSelectionResult res = ed.GetSelection(filter);
            if (res.Status == PromptStatus.OK)
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                  foreach (ObjectId id in res.Value.GetObjectIds())
                  {
                        Entity ent = tr.GetObject(id, OpenMode.ForWrite) as Entity;
                        //替换的内容自己写下吧
                        if (ent is DBText)
                        {
                        }
                        else
                        {

                        }
                  }
                }
            }
      }

518yf 发表于 2009-11-15 21:41:00

本帖最后由 作者 于 2009-11-15 22:23:45 编辑 <br /><br /> <p>非常感谢,版主……谢谢!我代表全家老小感谢你</p><p>我来用你的代码测试一下……</p><p>请问版主:</p><p>1、单行与多行文字同时存在,如何捕捉??</p><p>new TypedValue(0, "*text") ,&nbsp;&nbsp; //这里仅捕捉单行文字</p><p>new TypedValue(1, "*要查找的文字*")&nbsp; //如果查找有多个文字,怎么实现</p><p></p><p>2、程序执行到 PromptSelectionResult res = ed.GetSelection(filter) 出错eNotApplicable异常错误</p><p>3、执行Document doc = Application.DocumentManager.Open("要打开的dwg文件")这句后,当前dwg文件被CAD打,现在我想问的是,如何不让用户看到CAD显示此文件已打开?</p><p>另外:假设,我要批量查找替换很多dwg文件,执行上句,每个文件都打开,即浪费时间,CAD显示又不直观,该如何操作??</p>

lzx838 发表于 2009-11-16 10:14:00

<p>1、单行与多行文字同时存在,如何捕捉??</p><p>new TypedValue(0, "*text") ,&nbsp;&nbsp; //这里仅捕捉单行文字</p><p><font color="#ff0000">改成:new TypedValue(0,"Text") 搜索单行文字</font></p><p><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp; new TypedValue(0,"MText")搜索多行文字</font></p><p>new TypedValue(1, "*要查找的文字*")&nbsp; //如果查找有多个文字,怎么实现</p><p><font color="#ff0000">改成:new TypedValue(1,"*Text1*Text1*") 查找多个文字,可以这么写.</font></p><p><font color="#ff0000"></font></p><p>2、程序执行到 PromptSelectionResult res = ed.GetSelection(filter) 出错eNotApplicable异常错误</p><p><font color="#ff3300">这倒没遇到过,可能要看你实际才知是什么情况</font></p><p><font color="#ff3300"></font></p><p>3、如何不让用户看到CAD显示此文件已打开?</p><p><font color="#ff0000">判断一下doc是否已经打开,如已打开,就不再打开,并设置为当前文档.</font></p><p><font color="#ff0000"></font></p><p>另外:每个文件都打开,即浪费时间,CAD显示又不直观,该如何操作??</p><p><font color="#ff0000">建议使用ObjectDBX技术,不打开文档从后台操作.</font></p>

518yf 发表于 2009-11-16 10:19:00

<p><font face="Verdana">感谢二位版主……继续努力!</font></p><p><font face="Verdana">请问<font color="#ff0000">ObjectDBX</font>可以用.net操作吗?哪有好的教材或资料!</font><font face="Verdana" color="#da2549"></font></p>

雪山飞狐_lzh 发表于 2009-11-16 11:24:00

<p>new TypedValue(0, "*text") ,&nbsp;&nbsp; //这里仅捕捉单行文字</p><p>你确定?</p><p>*Text:Text and MText</p>
页: [1] 2
查看完整版本: [求助]C# 如何打开指定的dwg文件?