gsteven 发表于 2009-9-27 01:40:00

<p>BlockTableRecord btr = (BlockTableRecord)operTrans.GetObject(operBlk, OpenMode.ForWrite);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Circle acCirc = new Circle();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acCirc.SetDatabaseDefaults();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acCirc.Center = new Point3d(2, 3, 0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acCirc.Radius = 400;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btr.AppendEntity(acCirc);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operTrans.AddNewlyCreatedDBObject(acCirc, true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //复制块定义<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //frameDb.WblockCloneObjects(frameIDCol,operBlk.ObjectId,acIdMap,DuplicateRecordCloning.Ignore,false);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //插入外部参照<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operDb.AttachXref(framePath,"图框");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //提交事务<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operTrans.Commit();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //保存数据库到硬盘<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operDb.SaveAs(operFilePath, null);</p><p>试了好久了,一直没用,复制块定义,画圆都成功了,operDb.AttachXref(framePath,"图框");没任何作用。同时一到operDb.SaveAs(operFilePath, null);就弹出消息框报错,说保存错误,然后程序继续运行。不知何故啊?</p><p>要像VBA中ModelSpace.AddExternalReference的这种插入外部参照的效果,也就是插入一个链接。</p>

雪山飞狐_lzh 发表于 2009-9-27 07:17:00

      
      public static void tt2()
      {
            Database db = new Database(false, true);
            db.DxfIn("D:\\1.dxf", null);
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                DBPoint dptest = new DBPoint(Point3d.Origin);
                btr.AppendEntity(dptest);
                tr.AddNewlyCreatedDBObject(dptest, true);
                ObjectId id = db.AttachXref("d:\\2.dwg", "2");
                BlockReference blkref = new BlockReference(Point3d.Origin, id);
                btr.AppendEntity(blkref);
                tr.AddNewlyCreatedDBObject(blkref, true);
                tr.Commit();
            }
            db.SaveAs("d:\\1.dwg", null);
      }

gsteven 发表于 2009-9-27 22:22:00

斑竹你在运行到db.SaveAs("d:\\1.dwg", null);没有报错吗?我一直报错:警告,保存时出错,建议您对图形进行RECOVER.

雪山飞狐_lzh 发表于 2009-9-27 22:26:00

<p>我在Cad2008测试没有问题的,你的版本?</p>

gsteven 发表于 2009-9-27 23:45:00

本帖最后由 作者 于 2009-9-28 8:45:40 编辑 <br /><br /> <p>我是2009的,我用导入dxf导出dxf成功了,不报错。</p><p>读入dxf,保存成dwg也可以的,不报错。</p><p>读入dwg,导出dxf也可以,不报错。</p><p>但是导入dwg,保存dwg就出现保存错误,运行完成后还是可以打开的,外部参照也添加了,可以一旦全选就出错,直接退出cad!</p><p><font color="#f73809">全部成功了!</font>operDb.ReadDwgFile(operFilePath, FileOpenMode.<font color="#f70909">OpenForReadAndWriteNoShare</font>, true, "");<br/>改成&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operDb.ReadDwgFile(operFilePath, FileOpenMode.<font color="#0000ff">OpenForReadAndAllShare</font>, true, "");</p><p><font color="#f73809">还有一个问题就是我插入的是绝对路径,后来我吧ObjectId id = operDb.AttachXref(framePath, "图框");<br/>改成ObjectId id = operDb.AttachXref(@".\图框.dwg", "图框");还是绝对路径,不知道怎么插入相对路径?</font></p><p>operDb = new Database(false, true);//新建操作数据库<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fileType == "DWG")//分为DWG,DXF分类打开图形数据库<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operDb.ReadDwgFile(operFilePath, FileOpenMode.OpenForReadAndWriteNoShare, true, "");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operDb.DxfIn(operFilePath, null);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (Transaction operTrans = operDb.TransactionManager.StartTransaction())<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BlockTable operBlk;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operBlk = (BlockTable)operTrans.GetObject(operDb.BlockTableId, OpenMode.ForWrite);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BlockTableRecord btr = (BlockTableRecord)operTrans.GetObject(operBlk, OpenMode.ForWrite);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //插入外部参照<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectId id = operDb.AttachXref(framePath, "图框");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BlockReference blkref = new BlockReference(Point3d.Origin, id);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btr.AppendEntity(blkref);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operTrans.AddNewlyCreatedDBObject(blkref, true);</p><p>operTrans.Commit();</p><p>if (fileType == "DWG")//分为DWG,DXF分类保存图形数据库<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operDb.SaveAs(operFilePath, null);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //operDb.SaveAs("D:\\23.dwg", null);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; operDb.DxfOut(operFilePath, 14,DwgVersion.AC1015);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>

雪山飞狐_lzh 发表于 2009-9-28 09:15:00

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectId id = db.AttachXref(".\\2.dwg", "2");<br/><div class="section"><a name="WSfacf1429558a55de8b299cffc1fb20d344ae"></a><p class="section_title_h1"><a name="TOC_ENTRY__d0e115083"></a><a name="WS1a9193826455f5ff157aac310e83f20e74-7e85"></a>指定完整(绝对)路径</p><p><a name="WSfacf1429558a55de8b299cffc1fb20d3452c"></a>完整路径是确定文件参照位置的文件夹的完整指定的层次结构。完整路径包括本地硬盘驱动器号、网站的 URL 或网络服务器驱动器号。这是最明确的选项,但缺乏灵活性。</p></div><div class="section"><a name="WSfacf1429558a55de8b299cffc1fb20d344af"></a><p class="section_title_h1"><a name="TOC_ENTRY__d0e115096"></a><a name="WS1a9193826455f5ff157aac310e83f20e74-7e84"></a>指定“无路径”</p><p><a name="WSfacf1429558a55de8b299cffc1fb20d3452d"></a>相对路径是使用当前驱动器号或宿主图形文件夹的部分指定的文件夹路径。这是灵活性最大的选项,可以使您将图形集从当前驱动器移动到使用相同文件夹结构的其他驱动器中。</p><p><a name="WSfacf1429558a55de8b299cffc1fb20d3452e"></a>如果所参照的文件位于其他本地硬盘驱动器上或网络服务器上,则相对路径选项不可用。</p><p><a name="WSfacf1429558a55de8b299cffc1fb20d3452f"></a>指定相对文件夹路径的规则如下:</p><dl><dt><span style="DISPLAY: none;"><a name="WSfacf1429558a55de8b299cffc1fb20d344c8"></a>\ </span></dt><dd><div class="definition"><p><a name="WSfacf1429558a55de8b299cffc1fb20d34530"></a>查看宿主图形驱动器的根文件夹</p></div></dd><dt><span style="DISPLAY: none;"><a name="WSfacf1429558a55de8b299cffc1fb20d344c9"></a><em class="mild">路径</em></span>
                        </dt><dd><div class="definition"><p><a name="WSfacf1429558a55de8b299cffc1fb20d34531"></a>从宿主图形的文件夹中,按照指定的路径</p></div></dd><dt><span style="DISPLAY: none;"><a name="WSfacf1429558a55de8b299cffc1fb20d344ca"></a>\ <em class="mild">路径</em></span>
                        </dt><dd><div class="definition"><p><a name="WSfacf1429558a55de8b299cffc1fb20d34532"></a>从根文件夹中,按照指定的路径</p></div></dd><dt><span style="DISPLAY: none;"><a name="WSfacf1429558a55de8b299cffc1fb20d344cb"></a>.\ <em class="mild">路径</em></span>
                        </dt><dd><div class="definition"><p><a name="WSfacf1429558a55de8b299cffc1fb20d34533"></a>从宿主图形的文件夹中,按照指定的路径</p></div></dd><dt><span style="DISPLAY: none;"><a name="WSfacf1429558a55de8b299cffc1fb20d344cc"></a>..\ <em class="mild">路径</em></span>
                        </dt><dd><div class="definition"><p><a name="WSfacf1429558a55de8b299cffc1fb20d34534"></a>从宿主图形的文件夹中,向上移动一层文件夹并按照指定的路径</p></div></dd><dt><span style="DISPLAY: none;"><a name="WSfacf1429558a55de8b299cffc1fb20d344cd"></a>..\..\ <em class="mild">路径</em></span>
                        </dt><dd><div class="definition"><p><a name="WSfacf1429558a55de8b299cffc1fb20d34535"></a>从宿主图形的文件夹中,向上移动两层文件夹并按照指定的路径</p></div></dd></dl><div><div class="note-note">注意如果包含参照文件的图形被移动或保存到另一个路径、另一个本地硬盘驱动器或另一个网络服务器,则必须编辑所有相对路径,使其适应宿主图形的新位置,或者必须重新定位参照文件。</div></div></div>
页: 1 [2]
查看完整版本: 如何加入dwg参照。成功!