明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2076|回复: 5

[求助]ObjectAppended事件,画Polylin报错?【有代码】

[复制链接]
发表于 2010-8-23 10:23:00 | 显示全部楼层 |阅读模式
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.EditorInput;
  8. namespace TestClassLib
  9. {
  10.     public class Class1 : IExtensionApplication
  11.     {
  12.         #region IExtensionApplication 成员
  13.         public void Initialize()
  14.         {
  15.             AddDatabaseEvent();
  16.             
  17.         }
  18.         public void Terminate()
  19.         {
  20.            
  21.             
  22.         }
  23.         #endregion
  24.         public static bool b_DbEvent;
  25.         public void AddDatabaseEvent()
  26.         {
  27.             // Get the current document
  28.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  29.             Database db = acDoc.Database;
  30.            
  31.             db.ObjectAppended +=
  32.                 new ObjectEventHandler(DatabaseAppended);
  33.             acDoc.Editor.WriteMessage("\nEvent added!\n");
  34.             b_DbEvent = true;
  35.         }
  36.         [CommandMethod("RemovevDatabaseEvent")]
  37.         public void RemoveDatabaseEvent()
  38.         {
  39.             // Get the current document
  40.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  41.             Database db = acDoc.Database;
  42.            
  43.             db.ObjectAppended -=
  44.                 new ObjectEventHandler(DatabaseAppended);
  45.             acDoc.Editor.WriteMessage("\nEvent removed!\n");
  46.             b_DbEvent = false;
  47.         }
  48.         public void DatabaseAppended(object senderObj,
  49.                                  ObjectEventArgs dbAdded)
  50.         {
  51.             //App.ShowAlertDialog("Database added!");
  52.             RemoveDatabaseEvent();
  53.             InterZ();
  54.             AddDatabaseEvent();
  55.         }
  56.         public void InterZ()
  57.         {
  58.            
  59.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  60.             Editor ed = doc.Editor;
  61.             Database db = doc.Database;
  62.             using(DocumentLock docLock = doc.LockDocument())
  63.             {
  64.                 PromptSelectionResult curSR;   
  65.                 curSR = ed.SelectLast();
  66.                 if (curSR.Status != PromptStatus.OK || curSR.Value.Count == 0)
  67.                     return;
  68.                
  69.                 ObjectId[] ids = curSR.Value.GetObjectIds();
  70.                 DBPoint dbpt = null;
  71.                 Polyline pln = null;
  72.                 foreach (ObjectId id0 in ids)
  73.                 {
  74.                     #region foreach
  75.                     Transaction tr = db.TransactionManager.StartTransaction();
  76.                     Entity ent = tr.GetObject(id0, OpenMode.ForRead) as Entity;
  77.                     dbpt = ent as DBPoint;
  78.                     pln = ent as Polyline;
  79.                     tr.Dispose();                    
  80.                     #endregion
  81.                 }
  82.             }
  83.             
  84.         }
  85.     }
  86. }



画直线、点的时候,都没有问题,画多义线(Polyline、Polyline3d)的时候,就会有致命错误另外,选中一个点,复制,粘贴,也会报错,但不知道错在哪里!?

V C# 2005 + AutoCAD2007,附件要改成.cs文件
请各位指教
发表于 2010-8-23 11:43:00 | 显示全部楼层

ObjectEventArgs的属性里应该有当前添加的实体

PL添加点的时候会向数据库添加子实体的

所以,你获取的是应该是子实体,而不是pl本身

 楼主| 发表于 2010-8-23 15:15:00 | 显示全部楼层

回复:(lzh741206)ObjectEventArgs的属性里应该有当...

本帖最后由 作者 于 2010-8-23 15:42:50 编辑

  你好!
根据你的提示,我把  DatabaseAppended() 改成这个样子了,画Polyline还是不行,InterZ()中如果有“Transaction tr = db.TransactionManager.StartTransaction();”的代码就会报错!去掉就没事,不知道为什么?!
  1.         public void DatabaseAppended(object senderObj,
  2.                                  ObjectEventArgs dbAdded)
  3.         {
  4.             //App.ShowAlertDialog("Database added!");
  5.             RemoveDatabaseEvent();
  6.             
  7.             DBObject obj = dbAdded.DBObject;
  8.             string str = obj.GetType().Name.ToString();
  9.             if (str == "Polyline")
  10.             {
  11.                 InterZ();
  12.             }
  13.             AddDatabaseEvent();
  14.         }
复制代码

另外:
如果DatabaseAppended() 改成这个样子
  1.         public void DatabaseAppended(object senderObj,
  2.                                  ObjectEventArgs dbAdded)
  3.         {
  4.             //App.ShowAlertDialog("Database added!");
  5.             RemoveDatabaseEvent();
  6.             
  7.             DBObject obj = dbAdded.DBObject;
  8.             string str = obj.GetType().Name.ToString();
  9.             if (str == "DBPoint")
  10.             {
  11.                 DBPoint dbpt = obj as DBPoint;
  12.                
  13.             }
  14.             AddDatabaseEvent();
  15.         }
复制代码
选中点复制、粘贴的时候,调试的过程中可以看到,“粘贴”的时候,database中加入了blockreference,和一个DBPoint,但是这个
DBPoint的坐标是(0,0,0)!!!而不是我鼠标指定的位置,我想取到真正的坐标,怎么办啊?

发表于 2010-8-23 16:07:00 | 显示全部楼层

你的代码想实现什么?

一直没看懂.......

 楼主| 发表于 2010-8-23 16:12:00 | 显示全部楼层

回复:(lzh741206)你的代码想实现什么?一直没看懂...

 
InterZ()是用来内插高程Z的,里面的具体代码我省略了。。。

在已经加载有已知三维坐标(X,Y,Z)的密集点的情况下,要在画了一个点之后,立刻内插其高程Z,复制、粘贴一个点的时候也需要内插Z

移动点的时候,也需要。。。(这里好像可以用ObjectModified来监听事件)
发表于 2010-8-31 17:09:00 | 显示全部楼层

C 的看不太懂!

但是我碰到个事,也许能够参考一下!就是transaction这个玩意!

如果用ObjectAppend监视,尽管只是只读打开一下图元,只要一画实体,就报错。

因为我一直想着只是打开看一下,所以我用完transaction之后只是把它dispose了

后来,我在dispose前面加了个comit就不报错了!

不知道是不是这么回事!

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

本版积分规则

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

GMT+8, 2024-11-26 00:57 , Processed in 0.179048 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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