乐筑天下

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

如何在事件处理程序中取回ObjectID?

[复制链接]

1

主题

2

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2021-7-10 03:50:48 | 显示全部楼层 |阅读模式
我想对用户修改的对象做一些事情,但我就是不能让它在我的事件处理程序中工作,而且在我看来,问题是ObjectID不正确。在第二个代码片段中,我做了一些测试,一切都如我所愿。如何正确访问ObjectID?
预先感谢。
  1. public void acPolyMod(object senderObj, EventArgs evtArgs)
  2.         {
  3.             Tables tables = HostMapApplicationServices.Application.ActiveProject.ODTables;
  4.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  5.             Entity ent = senderObj as Entity;
  6.             ObjectId id = ent.ObjectId;
  7.             Autodesk.Gis.Map.ObjectData.Table table = tables[m_tableName];
  8.             Records records = table.GetObjectTableRecords(0, id, Autodesk.Gis.Map.Constants.OpenMode.OpenForWrite, true);
  9.             if (records.Count == 0)
  10.             {
  11.                 AddODRecord(tables, m_tableName, id, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  12.             }
  13.             else
  14.             {
  15.                 UpdateOD(m_tableName, id, "Date", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  16.             }
  17.         }

我的测试代码:
  1. public void asd()
  2.         {
  3.             Tables tables = HostMapApplicationServices.Application.ActiveProject.ODTables;
  4.             Editor AcadEditor = Application.DocumentManager.MdiActiveDocument.Editor;
  5.             AcadEditor.WriteMessage("\n Please select an entity to add a record: ");
  6.             PromptSelectionOptions options = new PromptSelectionOptions();
  7.             options.SingleOnly = true;
  8.             options.SinglePickInSpace = true;
  9.             PromptSelectionResult result = AcadEditor.GetSelection(options);
  10.             ObjectId[] ids = result.Value.GetObjectIds();
  11.             AddODRecord(tables, m_tableName, ids[0], DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  12.             UpdateOD(m_tableName, ids[0], "Date", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  13.             
  14.         }

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2021-7-10 12:00:37 | 显示全部楼层
您可以共享AddODRecord和UpdateOD这两个函数吗?
回复

使用道具 举报

1

主题

2

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2021-7-10 12:57:51 | 显示全部楼层
是的,当然。我做了更多的测试,问题似乎是我试图在事件hendler中运行这个。我这样想是因为<pre>
  1. Entity ent = senderObj as Entity;
  2.             ObjectId id = ent.ObjectId;


  1. ObjectId[] ids = result.Value.GetObjectIds();
  2. ids[0]

转换为字符串时,会吐出相同的ObjectID号
  1. public bool AddODRecord(Tables tables, string tableName, ObjectId id, string value)
  2.         {
  3.             try
  4.             {
  5.                 Autodesk.Gis.Map.ObjectData.Table table = tables[tableName];
  6.                 // Create and initialize an record
  7.                 Record tblRcd = Record.Create();
  8.                 table.InitRecord(tblRcd);
  9.                 MapValue val = tblRcd[0]; // String type
  10.                 val.Assign(value);
  11.                 table.AddRecord(tblRcd, id);
  12.                 return true;
  13.             }
  14.             catch (MapException)
  15.             {
  16.                 return false;
  17.             }
  18.         }

  1. public void UpdateOD(string TableName, ObjectId objectID, string columnName, string value)
  2.         {
  3.             Autodesk.Gis.Map.ObjectData.Tables tables = Autodesk.Gis.Map.HostMapApplicationServices.Application.ActiveProject.ODTables;
  4.             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  5.             using (Records records = tables.GetObjectRecords(0, objectID, Autodesk.Gis.Map.Constants.OpenMode.OpenForWrite, false))
  6.             {
  7.                 if (records.Count == 0)
  8.                 {
  9.                     ed.WriteMessage("\nData attachment failed.");
  10.                     return;
  11.                 }
  12.                 foreach (Record Recd in records)
  13.                 {
  14.                     Autodesk.Gis.Map.ObjectData.Table tbl = tables[Recd.TableName];
  15.                     if (tbl.Name.CompareTo(TableName) == 0)
  16.                     {
  17.                         for (int i = 0; i < Recd.Count; i++)
  18.                         {
  19.                             FieldDefinitions tblDefs = tbl.FieldDefinitions;
  20.                             FieldDefinition column = null;
  21.                             column = tblDefs[i];
  22.                             if (column.Name.CompareTo(columnName) == 0)
  23.                             {
  24.                                 Recd[i].Assign(value);
  25.                                 records.UpdateRecord(Recd);
  26.                                 break;
  27.                             }
  28.                         }
  29.                     }
  30.                 }
  31.             }

回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2021-7-10 15:18:10 | 显示全部楼层
谢谢!是的,当编辑在事件处理程序之外完成时,您应该对实体进行修改。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 01:06 , Processed in 0.209075 second(s), 60 queries .

© 2020-2024 乐筑天下

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