乐筑天下

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

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

[复制链接]

14

主题

49

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

画直线、点的时候,都没有问题,画多义线(Polyline、Polyline3d)的时候,就会有致命错误另外,选中一个点,复制,粘贴,也会报错,但不知道错在哪里!?
V C# 2005 + AutoCAD2007,附件要改成.cs文件
请各位指教
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-8-23 11:43:00 | 显示全部楼层
ObjectEventArgs的属性里应该有当前添加的实体
PL添加点的时候会向数据库添加子实体的
所以,你获取的是应该是子实体,而不是pl本身
回复

使用道具 举报

14

主题

49

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

  你好!
根据你的提示,我把  DatabaseAppended() 改成这个样子了,画Polyline还是不行,InterZ()中如果有“Transaction tr = db.TransactionManager.StartTransaction();”的代码就会报错!去掉就没事,不知道为什么?!复制代码
另外:
如果DatabaseAppended() 改成这个样子复制代码选中点复制、粘贴的时候,调试的过程中可以看到,“粘贴”的时候,database中加入了blockreference,和一个DBPoint,但是这个
DBPoint的坐标是(0,0,0)!!!而不是我鼠标指定的位置,我想取到真正的坐标,怎么办啊?
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-8-23 16:07:00 | 显示全部楼层
你的代码想实现什么?
一直没看懂.......
回复

使用道具 举报

14

主题

49

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

InterZ()是用来内插高程Z的,里面的具体代码我省略了。。。
在已经加载有已知三维坐标(X,Y,Z)的密集点的情况下,要在画了一个点之后,立刻内插其高程Z,复制、粘贴一个点的时候也需要内插Z
移动点的时候,也需要。。。(这里好像可以用ObjectModified来监听事件)
回复

使用道具 举报

14

主题

36

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
92
发表于 2010-8-31 17:09:00 | 显示全部楼层
C 的看不太懂!
但是我碰到个事,也许能够参考一下!就是transaction这个玩意!
如果用ObjectAppend监视,尽管只是只读打开一下图元,只要一画实体,就报错。
因为我一直想着只是打开看一下,所以我用完transaction之后只是把它dispose了
后来,我在dispose前面加了个comit就不报错了!
不知道是不是这么回事!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-15 07:28 , Processed in 0.350574 second(s), 64 queries .

© 2020-2025 乐筑天下

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