乐筑天下

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

更新多行文字C#

[复制链接]

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2017-3-22 15:53:31 | 显示全部楼层 |阅读模式
Update:仅通过向该方法传入1个参数来解决,大家好,这里的初级开发人员和autocad API用户没有运气谷歌一下这个。希望有人能给我指出正确的方向,目标是更新多行文字内容。ForRead”可以很好地阅读多行文字内容,然而,当我试图”。forWrite“我得到以下异常:Autodesk,AcdbMgd.dll中的“AutoCAD . runtime . exception ”遍历代码时,它在第行失败:-但仅在写入模式下失败。传入的句柄im指回一个多行文字对象,并且在转换过程中似乎获得了正确的对象ID。但是我还没有排除这个问题的原因,谁有更新多行文字时可以参考的代码,或者可以给我指出正确的方向?
  1. public static void editMtextContents(string handle, string newValue)
  2. {
  3.         Document doc = Application.DocumentManager.MdiActiveDocument;
  4.         Database db = doc.Database;
  5.         Handle hn = new Handle(ConvertHandleToInt(handle));
  6.         Transaction tr = db.TransactionManager.StartTransaction();
  7.         using (tr)
  8.         {
  9.                 ObjectId id = db.GetObjectId(false, hn, 0);
  10.                 var obj = tr.GetObject(id, OpenMode.ForWrite, false);
  11.                 var mtext = obj as MText;
  12.                 mtext.Contents = newValue;
  13.                 tr.Commit();
  14.         }
  15. }
谢谢!-Bruce更新:使用Autocad 2015。
绘图/图层未锁定。

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

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

使用道具 举报

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2017-3-22 18:42:00 | 显示全部楼层
还有错误信息吗?
可能在锁定的图层上?
回复

使用道具 举报

24

主题

204

帖子

6

银币

后起之秀

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

铜币
300
发表于 2017-3-23 07:32:32 | 显示全部楼层
图层没有锁定,我在几个图纸上尝试过,试图消除dwg本身的问题。
这与使用autocad 2015有关。
回复

使用道具 举报

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2017-3-23 08:19:04 | 显示全部楼层
你能把你的工作图纸贴出来吗?
回复

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2017-3-23 09:12:15 | 显示全部楼层
我遇到了这个问题(解决方法?)!
传入两个参数时,该方法不起作用。 修复方法是修复方法签名以接受一个参数,在我的例子中是一个带有句柄和新值的对象。
唷!
回复

使用道具 举报

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2017-3-24 00:17:57 | 显示全部楼层
您好,Ken,
我遇到问题的方法(注意,我还必须添加“文档锁”来解决问题制作):
  1. public static void EditMtextContents(UpdatedTag tag)
  2. {
  3.         Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.         Database db = doc.Database;
  5.         //create handle from long int
  6.         Handle hn = new Handle(ConvertHandleToInt(tag.Handle));
  7.         //attempt to get an ObjectID for the handle
  8.         ObjectId id = db.GetObjectId(false, hn, 0);
  9.         //open the object to edit it
  10.         using (DocumentLock doclock = doc.LockDocument())
  11.         {
  12.                 Transaction tr = doc.TransactionManager.StartTransaction();
  13.                 using (tr)
  14.                 {
  15.                         DBObject obj = tr.GetObject(id, OpenMode.ForWrite);
  16.                         //testing editing mtext contents
  17.                         MText mtext = obj as MText;
  18.                         mtext.Contents = tag.NewValue;
  19.                         tr.Commit();
  20.                 }
  21.         }
  22. }

更新的标记只是一个简单的小类:
  1. public class UpdatedTag
  2. {
  3.         public string Handle { get; set; }
  4.         public string NewValue { get; set; }
  5.         public UpdatedTag(string handle, string newValue)
  6.         {
  7.                 Handle = handle;
  8.                 NewValue = newValue;
  9.         }
  10. }

我提取所有多行文字,并将其存储在列表/数据集中。用acad术语来说,部分信息是它的“句柄”。
我使用以下方法将字符串句柄转换为autocad对象句柄(我相信这是从Kean那里得到的,不管怎样,他都是一个巨大的资源):
  1. public class UpdatedTag
  2. {
  3.         public string Handle { get; set; }
  4.         public string NewValue { get; set; }
  5.         public UpdatedTag(string handle, string newValue)
  6.         {
  7.                 Handle = handle;
  8.                 NewValue = newValue;
  9.         }
  10. }

希望这比混乱更有帮助-我对acad和一般开发非常陌生
回复

使用道具 举报

24

主题

204

帖子

6

银币

后起之秀

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

铜币
300
发表于 2017-3-24 15:57:54 | 显示全部楼层
您是否在会话之间存储UpdatedTag对象?如果没有,那么为什么不直接使用ObjectId呢?
回复

使用道具 举报

24

主题

204

帖子

6

银币

后起之秀

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

铜币
300
发表于 2017-3-27 07:57:50 | 显示全部楼层
也可以代替Transaction tr=doc.TransactionManager.StartTransaction();。
使用(tr)您可以使用(Transaction tr=doc.TransactionManager.StartTransaction())。
回复

使用道具 举报

24

主题

204

帖子

6

银币

后起之秀

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

铜币
300
发表于 2017-3-27 07:59:39 | 显示全部楼层
如果您在C# 6中   使用(var doclock = doc,LockDocument())。
{。
使用(var tr = doc,transaction manager . start transaction();)。
{。
var mtext = tr,GetObject(id,OpenMode。ForWrite)作为多行文字;。
if(mtext!= null)。
{。
多行文字,内容=标签,NewValue。
}。

trcommit();。
}。
}如果您已经开始使用C#7,请使用(var doclock = doc。LockDocument())。
{。
使用(var tr = doc,transaction manager . start transaction())。
{。
如果(tr,GetObject(id,OpenMode。ForWrite)是MText mtext)。
多行文字,内容=标签,NewValue。
trcommit();。
}。
}。
回复

使用道具 举报

1

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2017-3-27 08:07:36 | 显示全部楼层

这是一个单独的会话。感谢分享改进的代码,可读性更好了!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-4 14:05 , Processed in 0.226135 second(s), 83 queries .

© 2020-2025 乐筑天下

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