明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 818|回复: 7

[运行时] 关于CAD文档管理的问题

[复制链接]
发表于 2016-7-18 17:48 | 显示全部楼层 |阅读模式
本帖最后由 cooolseee 于 2016-7-19 09:05 编辑

各位高手,大家好。我想实现一个功能,是新建一个dwg文件,然后根据要求绘制图形。一种图形绘制完成后,保存并该dwg文件,然后新建文件,再重复上述工作内容。
我遇到的问题是:
1、我采用了以下代码:
  1. //新建一个文件,此函数在Tools类中
  2. public static Document dwgCreat()
  3.         {
  4.             DocumentCollection docs = Application.DocumentManager;
  5.             Document doc = docs.Add("acad.dwt");
  6.             //docs.MdiActiveDocument = doc;
  7.             return doc;
  8.         }
  9. #region 初始化绘图环境
  10.                 Document doc = Tools.dwgCreat();
  11.                 Database db = doc.Database;
  12.                 Editor ed = doc.Editor;
  13.                 DocumentLock docl= doc.LockDocument();
  14. #endregion 初始化绘图环境
  15. //省略绘图过程
  16. db.SaveAs(pathDWG + "图纸" + i +".dwg", DwgVersion.Current);

  17. i++

  18.                 try
  19.                 {
  20.                     docl.Dispose();
  21.                     doc.CloseAndDiscard();
  22.                 }
  23.                 catch { }

每次都会出现如下错误提示:
致命错误:  Unhandled Access Violation Reading 0x7ede0474 Exception at 6209546eh

07/18/2016 at 17:08:55.360  图形: Drawing1.dwg

请大侠帮助,这个问题已经困扰我很久了,不知道怎么优化
 楼主| 发表于 2016-7-19 08:14 | 显示全部楼层
请大侠指点
 楼主| 发表于 2016-7-19 08:56 | 显示全部楼层
本帖最后由 cooolseee 于 2016-7-19 08:58 编辑

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Collections;

  7. using Autodesk.AutoCAD.ApplicationServices;
  8. using Autodesk.AutoCAD.DatabaseServices;
  9. using Autodesk.AutoCAD.EditorInput;
  10. using Autodesk.AutoCAD.Geometry;
  11. using Autodesk.AutoCAD.Runtime;
  12. using Autodesk.AutoCAD.Windows;
  13. using DotNetARX;


  14. namespace 工具
  15. {
  16. public  class Tools
  17. {
  18. #region 新建dwg文档
  19.         //[CommandMethod("dwgCreat", CommandFlags.Session)]
  20.         public static Document dwgCreat()
  21.         {
  22.             DocumentCollection docs = Application.DocumentManager;
  23.             Document doc = docs.Add("acad.dwt");
  24.             //docs.MdiActiveDocument = doc;
  25.             return doc;
  26.         }
  27.         #endregion 新建dwg文档

  28. }

  29. public class 测试
  30. {
  31. [CommandMethod("AAA", CommandFlags.Session)]
  32.         public void AAA()
  33.         {

  34.             for (int i = 0; i < 100; )
  35.             {
  36.                 Circle cir = new Circle();
  37.                 cir.Center = new Point3d(0, 0, 0);
  38.                 cir.Radius = 10;

  39.                 #region 初始化绘图环境
  40.                 DocumentCollection docs = Application.DocumentManager;
  41.                 Document doc = Tools.dwgCreat();
  42.                 Database db = doc.Database;
  43.                 Editor ed = doc.Editor;
  44.                 DocumentLock docl = doc.LockDocument();//这句要不要
  45.                 #endregion 初始化绘图环境
  46.                 using (Transaction trans = db.TransactionManager.StartTransaction())
  47.                 {
  48.                     db.AddToModelSpace(cir);
  49.                     trans.Commit();
  50.                 }
  51.                 if (docs.MdiActiveDocument != doc)
  52.                     docs.MdiActiveDocument = doc;
  53.                 db.SaveAs("D:\\DWG\\" + i+ ".dwg", DwgVersion.AC1800);
  54.                 doc.CloseAndDiscard();
  55.                 i++;
  56.             }

  57.         }
  58. }
  59. }

上面的代码不确定锁定文档需不需要,如果需要,没有解锁文档对不对,请高手指点。测试没什么问题,就是用同样的原理,在我的程序中, 就会出现1楼描述的问题

 楼主| 发表于 2016-7-19 12:06 | 显示全部楼层
我测试了一下,通过DocumentCollection的ADD方式新建dwg文件,直接就是当前文档,不知道对不对,请高手指点
发表于 2016-7-19 20:39 | 显示全部楼层
本帖最后由 epwt 于 2016-7-19 20:41 编辑

1.在你不进行其它操作时,通过DocumentCollection的ADD方式新建dwg文件,就是最上层文档,因为会一层一层覆盖,你最新创建的在最上层
2.给你的Document对象加上锁,而且记得自动释放,你的代码改了下,就是加上了加锁那段,可以正确运行,就是测试的时候先把那100改成1吧,不然闪屏的关不住呀~
  1. [CommandMethod("AAA", CommandFlags.Session)]
  2.         public void AAA()
  3.         {
  4.             for (int i = 0; i < 1; )
  5.             {
  6.                 Circle cir = new Circle();
  7.                 cir.Center = new Point3d(0, 0, 0);
  8.                 cir.Radius = 10;

  9.                 #region 初始化绘图环境
  10.                 DocumentCollection docs = Application.DocumentManager;
  11.                 Document doc = dwgCreat();
  12.                 Database db = doc.Database;
  13.                 Editor ed = doc.Editor;
  14.              using (DocumentLock docLock = doc.LockDocument())
  15.                 {
  16.                   //DocumentLock docl = doc.LockDocument();//这句要不要
  17.                 #endregion 初始化绘图环境
  18.                     using (Transaction trans = db.TransactionManager.StartTransaction())
  19.                     {
  20.                         db.AddToModelSpace(cir);
  21.                         trans.Commit();
  22.                     }
  23.                     if (docs.MdiActiveDocument != doc)
  24.                         docs.MdiActiveDocument = doc;
  25.                     db.SaveAs("D:\\DWG\" + i + ".dwg", DwgVersion.Current);
  26.                 }
  27.                 doc.CloseAndDiscard();
  28.                 i++;
  29.             }

  30.         }
 楼主| 发表于 2016-7-20 09:03 | 显示全部楼层
epwt 发表于 2016-7-19 20:39
1.在你不进行其它操作时,通过DocumentCollection的ADD方式新建dwg文件,就是最上层文档,因为会一层一层覆 ...

我的那个代码运行没什么问题,保存的文件从0-99然后自动停止。我现在有2个问题很疑惑:
1、通过DocumentCollection的ADD方式新建dwg文件,是不是当前文档,如果是,问什么在当前文档要加锁。如果不是,我测试的时候,明明看见docs.MdiActiveDocument的name属性和doc的name是一样的。
2、加锁后的文档,我画图结束了,文档都关闭了,还用不用解锁。我的那段代码是加锁了,没解锁,然后运行正常。
----------------------------------------------------------------------------------------
另外,用相同的原理,在我的代码中,每次生成第3个dwg文件,就会出现一个异常警告,然后,图纸可以继续按程序设定的顺序继续绘图,结果是正确的,就是老出现异常,感觉不爽,画图完毕,CAD会出现错误提示,得关闭。
发表于 2016-7-21 19:58 | 显示全部楼层
关于加锁的问题,我曾经也问过我的前辈,但是并没有得到确切的回答,所以就养成了一个经验写法,每次对数据库操作的时候都给文档加上锁。
第一个问题,我的理解是,创建的文档虽然是当前文档,但是它并不存在于物理磁盘中,而只存在于内存中,加锁是为了把这一块的内存锁定,防止冲突。这就验证了加锁的一个条件:访问已调入的文档而不是当前文档时,需要对文档加锁。我认为新建的这个文档是调入的文档,而非实际意义的当前文档。

第二个问题,画图结束后,是需要解锁的。我加的代码使用了using在调用结束后是会自动释放的。关于你没解锁运行正常,我认为这可能加完锁绘制完毕,你就把文档关了,并没有对文档继续操作,但你加锁的这块内存空间仍然处于占有状态,并没有释放。

只是发表一下个人看法,因为并没有找到官方的资料来彻底弄清楚这个问题。希望借你这篇帖子,也能引起更多朋友的注意,有大牛出来科普这个问题吧。

CAD二次开发先开始你觉得很神奇很简单,越往后开始钻研底层的问题,你会觉得CAD二次开发的API其实很深~有些问题我们可以暂时解决,但是可能过了很久,我能才能了解产生问题深层的原因。加油吧!共勉~
 楼主| 发表于 2016-7-22 08:13 | 显示全部楼层
epwt 发表于 2016-7-21 19:58
关于加锁的问题,我曾经也问过我的前辈,但是并没有得到确切的回答,所以就养成了一个经验写法,每次对数据 ...

谢谢你的回复,有些东西你考虑的还是比较的深,我因为不是搞软件的,只是工作中需要,才搞这个二次开发。希望能得到像你这样大牛的指点。谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-20 14:22 , Processed in 0.174910 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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