乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 121|回复: 7

事件处理过程中读取全局内容

[复制链接]

9

主题

26

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
62
发表于 2012-2-13 19:24:00 | 显示全部楼层 |阅读模式
做了个块浏览器,带paletteset的那种,主要实现以下:
1、netload加载后即可用,无需其他启动命令。
2、编辑、删除、创建数据库对象后,自动更新paletteset里面的gridview内容。
3、切换文档后,自动更新paletteset里面的gridview内容。
目前遇到一个困难:在向数据库级的ObjectModified、ObjectErased、ObjectAppended事件中写更新gridview内容时CAD会报错;文档切换事件中更新gridview就没有问题。
我认为问题出现在这里:在数据库级的ObjectModified、ObjectErased、ObjectAppended事件处理过程中又读取了全局DataBase,所以报错。但是该怎么实现在删除/创建/改变事件中读取全局DataBase呢?
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Windows.Forms;
  7. using Autodesk..DatabaseServices;
  8. using Autodesk.AutoCAD.EditorInput;
  9. using Autodesk.AutoCAD.Geometry;
  10. using Autodesk.AutoCAD.Runtime;
  11. using Autodesk.AutoCAD.Windows;
  12. using cadapp = Autodesk.AutoCAD.ApplicationServices;
  13. [assembly: ExtensionApplication(typeof(CADBlockBrowse.CAD))]
  14. [assembly: CommandClass(typeof(CADBlockBrowse.CAD))]
  15. namespace CADBlockBrowse
  16. {
  17.     public class CAD : IExtensionApplication
  18.     {
  19.         private cadapp.Document CurDoc = cadapp.Application.DocumentManager.MdiActiveDocument;
  20.         private Database CurDB = cadapp.Application.DocumentManager.MdiActiveDocument.Database;
  21.         private Editor ed = cadapp.Application.DocumentManager.MdiActiveDocument.Editor;
  22.         private PaletteSet ps = new PaletteSet("块选择器");
  23.         private Hashtable BlockName_Count = new Hashtable();
  24.         private UserControl1 mycontrol = new UserControl1();
  25.         public CAD()
  26.         {
  27.         }
  28.         ///
  29.         /// 读取当前活动文档的所有块名、数量到Hashtable中
  30.         ///
  31.         /// 返回Hashtable
  32.         public static Hashtable ReloadBlockNames()
  33.         {
  34.             Hashtable hs = new Hashtable();
  35.             Database db = cadapp.Application.DocumentManager.MdiActiveDocument.Database;
  36.             using (Transaction trans = db.TransactionManager.StartTransaction())
  37.             {
  38.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  39.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForRead);
  40.                 foreach (ObjectId obj in btr)
  41.                 {
  42.                     Entity ent = (Entity)trans.GetObject(obj, OpenMode.ForRead);
  43.                     if (ent.GetType() == typeof(BlockReference))
  44.                     {
  45.                         BlockReference brf = ent as BlockReference;
  46.                         if (hs.ContainsKey(brf.Name))
  47.                         {
  48.                             int oc = Convert.ToInt32(hs[brf.Name]);
  49.                             hs[brf.Name] = oc + 1;
  50.                         }
  51.                         else
  52.                         {
  53.                             hs.Add(brf.Name, 1);
  54.                         }
  55.                     }
  56.                 }
  57.             }
  58.             return hs;
  59.         }
  60.         ///
  61.         /// 炸开所有块
  62.         ///
  63.         /// 块名称
  64.         public static void BlockSelectAndExplode(string b_name)
  65.         {
  66.             cadapp.Document doc = cadapp.Application.DocumentManager.MdiActiveDocument;
  67.             Database db = doc.Database;
  68.             Editor ed = doc.Editor;
  69.             Transaction transaction = db.TransactionManager.StartTransaction();
  70.             using (transaction)
  71.             {
  72.                 Entity entity = null;
  73.                 DBObjectCollection EntityCollection = new DBObjectCollection();
  74.                 BlockTable bt = (BlockTable)transaction.GetObject(db.BlockTableId, OpenMode.ForRead);
  75.                 BlockTableRecord btr = (BlockTableRecord)transaction.GetObject(db.CurrentSpaceId, OpenMode.ForRead);
  76.                 cadapp.DocumentLock documentLock = doc.LockDocument();
  77.                 foreach (ObjectId id in btr)
  78.                 {
  79.                     entity = (Entity)transaction.GetObject(id, OpenMode.ForWrite);
  80.                     if (entity is BlockReference)
  81.                     {
  82.                         BlockReference br = (BlockReference)entity;
  83.                         if (br.Name == b_name)
  84.                         {
  85.                             entity.Explode(EntityCollection);
  86.                             entity.UpgradeOpen();
  87.                             entity.Erase();
  88.                         }
  89.                     }
  90.                 }
  91.                 AddEntityCollection(EntityCollection, doc);
  92.                 transaction.Commit();
  93.                 documentLock.Dispose();
  94.             }
  95.         }
  96.         private static void AddEntityCollection(DBObjectCollection dbos, cadapp.Document doc)
  97.         {
  98.             Database db = doc.Database;
  99.             using (Transaction tran = db.TransactionManager.StartTransaction())
  100.             {
  101.                 BlockTableRecord btr = (BlockTableRecord)tran.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  102.                 foreach (DBObject obj in dbos)
  103.                 {
  104.                     Entity ent = (Entity)obj;
  105.                     btr.AppendEntity(ent);
  106.                     tran.AddNewlyCreatedDBObject(ent, true);
  107.                 }
  108.                 tran.Commit();
  109.             }
  110.         }
  111.         public void Initialize()
  112.         {
  113.             ed.WriteMessage("\nInitialize函数中运行\n");
  114.             ps.Style = PaletteSetStyles.ShowAutoHideButton | PaletteSetStyles.ShowPropertiesMenu;
  115.             //ps.Dock = DockSides.None;
  116.             ps.DockEnabled = DockSides.Left | DockSides.Right | DockSides.None;
  117.             ps.MinimumSize = new System.Drawing.Size(150, 100);
  118.             ps.Size = new System.Drawing.Size(150, 100);
  119.             ps.Add("Palette1", mycontrol);
  120.             ps.Visible = true;
  121.             //注册文档切换事件
  122.             cadapp.Application.DocumentManager.DocumentActivated += new cadapp.DocumentCollectionEventHandler(DocumentManager_DocumentActivated);
  123.             //注册文档打开、创建事件
  124.             cadapp.Application.DocumentManager.DocumentCreated += new cadapp.DocumentCollectionEventHandler(DocumentManager_DocumentCreated);
  125.             //注册文档对象删除事件
  126.             cadapp.Application.DocumentManager.MdiActiveDocument.Database.ObjectErased += new ObjectErasedEventHandler(Database_ObjectErased);
  127.             //注册文档对象创建事件
  128.             //cadapp.Application.DocumentManager.MdiActiveDocument.Database.ObjectAppended += new ObjectEventHandler(Database_ObjectAppended);
  129.             UpdateGV();
  130.         }
  131.         void DocumentManager_DocumentCreated(object sender, cadapp.DocumentCollectionEventArgs e)
  132.         {
  133.             try
  134.             {
  135.                 //MessageBox.Show("DocumentCreated Event:" + e.Document.Name);
  136.                 //注册文档对象修改事件
  137.                 //e.Document.Database.ObjectModified += new ObjectEventHandler(Database_ObjectModified);
  138.                 //注册文档对象删除事件
  139.                 e.Document.Database.ObjectErased += new ObjectErasedEventHandler(Database_ObjectErased);
  140.                 //注册文档对象创建事件
  141.                 //e.Document.Database.ObjectAppended += new ObjectEventHandler(Database_ObjectAppended);
  142.                 UpdateGV();
  143.             }
  144.             catch (System.Exception ee)
  145.             {
  146.                 cadapp.Application.ShowAlertDialog(ee.Message);
  147.             }
  148.         }
  149.         //void Database_ObjectAppended(object sender, ObjectEventArgs e)
  150.         //{
  151.         //    //MessageBox.Show("ObjectAppended Event:" + e.DBObject.GetType().ToString());
  152.         //    try
  153.         //    {
  154.         //        UpdateGV();
  155.         //    }
  156.         //    catch (System.Exception ee)
  157.         //    {
  158.         //        MessageBox.Show("ObjectAppended Error:" + ee.Message);
  159.         //    }
  160.         //}
  161.         //private void Database_ObjectModified(object sender, ObjectEventArgs e)
  162.         //{
  163.         //    //MessageBox.Show("ObjectModified Event:" + e.DBObject.GetType().ToString());
  164.         //    UpdateGV();
  165.         //}
  166.         void Database_ObjectErased(object sender, ObjectErasedEventArgs e)
  167.         {
  168.             try
  169.             {
  170.                 if (e.Erased)
  171.                 {
  172.                     UpdateGV();  //我认为问题出现在这里:在事件处理过程中又读取了全局DataBase。但是该怎么实现在删除/创建/改变事件中读取全局DataBase呢?
  173.                 }
  174.             }
  175.             catch (System.Exception ee)
  176.             {
  177.                 MessageBox.Show("ObjectErased Error:" + ee.Message);
  178.             }
  179.         }
  180.         private void DocumentManager_DocumentActivated(object sender, cadapp.DocumentCollectionEventArgs e)
  181.         {
  182.             UpdateGV();
  183.         }
  184.         ///
  185.         /// 更新GridView的内容
  186.         ///
  187.         private void UpdateGV()
  188.         {
  189.             Hashtable bts = ReloadBlockNames();
  190.             if (bts.Count == 0)
  191.             {
  192.                 mycontrol.bt_explode.Text = "无块";
  193.                 mycontrol.bt_explode.Enabled = false;
  194.             }
  195.             else
  196.             {
  197.                 mycontrol.bt_explode.Text = "炸开";
  198.                 mycontrol.bt_explode.Enabled = true;
  199.                 mycontrol.setdgvDataSource(bts);
  200.             }
  201.         }
  202.         public void Terminate()
  203.         {
  204.         }
  205.     }
  206. }

回复

使用道具 举报

11

主题

23

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
67
发表于 2012-2-14 15:30:00 | 显示全部楼层
标记一下,正在使用这些方法
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2012-2-14 16:37:00 | 显示全部楼层
非常复杂!为什么不把报什么错贴出来了,既然怀疑某个地方错,怎么不再那里继续检查,至少可以把那行代码干掉看看还会不会报错呀
回复

使用道具 举报

9

主题

26

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
62
发表于 2012-2-14 18:23:00 | 显示全部楼层

其实问题也很简单。就是 Database.ObjectErased 这个数据库级的事件处理时,要读取全部的Database。这时会报错误。
如果不用注册事件,那就简单了,用命令启动。但是就没那么完美了。
有点类似这个
回复

使用道具 举报

40

主题

133

帖子

25

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
277
发表于 2012-2-17 18:20:00 | 显示全部楼层
无需其他启动命令,好牛
更新paletteset里面的gridview内容,我正要学学怎么把块放到palette上呢
切换文档后,自动更新paletteset里面的gridview内容,我不想更新。
回复

使用道具 举报

21

主题

97

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
181
发表于 2012-4-18 18:33:00 | 显示全部楼层
很好的方法。
回复

使用道具 举报

0

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
2
发表于 2012-5-8 10:20:00 | 显示全部楼层
楼主很牛嘛
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
1
发表于 2012-5-20 19:33:00 | 显示全部楼层
楼主你好。我在做基于C#的CAD二次开发,想在自己做的dll里面调用sql数据库 可以吗???
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-6-29 19:17 , Processed in 1.721277 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表