乐筑天下

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

外部参照 - 重新加载图像

[复制链接]

50

主题

114

帖子

2

银币

后起之秀

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

铜币
314
发表于 2020-3-12 11:37:32 | 显示全部楼层 |阅读模式
嗨,
我正在开发一个编辑外部参照的工具。对于dwg外部参照,它工作正常。对于图像,它的工作(我可以编辑路径),但图像消失了,我无法找到一种方法来重新加载它。基本上我不想做REDIR在Express Tools中做的事情。
下面是我编辑路径的步骤:
  1. // XREF DWG
  2. BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
  3. foreach (ObjectId btrId in bt)
  4. {
  5.     BlockTableRecord btr = tr.GetObject(btrId, OpenMode.ForWrite) as BlockTableRecord;
  6.     if (btr.IsFromExternalReference)
  7.     {
  8.         btr.PathName = btr.PathName.Replace("U:\", cServerName);
  9.         collection.Add(btrId);
  10.     }
  11. }
  12. // XREF IMAGE
  13. if (dictDB.Contains(imgkey))
  14. {
  15.     DBDictionary imgDic = (DBDictionary)tr.GetObject(dictDB.GetAt(imgkey), OpenMode.ForWrite);
  16.     foreach (DBDictionaryEntry dbe in imgDic)
  17.     {
  18.         if (String.IsNullOrEmpty(dbe.m_key)) continue;
  19.         RasterImageDef underlayDefinition = (RasterImageDef)tr.GetObject(dbe.Value, OpenMode.ForWrite);
  20.         if (underlayDefinition.SourceFileName.StartsWith("G:\") || underlayDefinition.SourceFileName.StartsWith("U:\"))
  21.         {
  22.                 underlayDefinition.SourceFileName = underlayDefinition.SourceFileName.Replace("U:\", cServerName);
  23.                 //collection.Add(underlayDefinition.Id);
  24.                 //collection.Add(underlayDefinition.ObjectId);
  25.         }
  26.     }
  27. }
  28. if (collection.Count > 0) db.ReloadXrefs(collection);

我无法从收藏中的图像外部参照添加ID,在“db。错误的对象类型。
知道如何正确地做到这一点吗?
谢谢您!

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

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

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2020-3-12 14:26:42 | 显示全部楼层
你试过使用CloseImage方法吗?根据文档:关闭关联的图像数据对象,并更新对AutoCAD中图像实例的任何更改。
回复

使用道具 举报

50

主题

114

帖子

2

银币

后起之秀

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

铜币
314
发表于 2020-3-12 15:15:12 | 显示全部楼层
您好,
感谢您的回答,但不幸的是,它不起作用,它仍然会消失,我必须手动刷新外部参照才能重新显示图像。
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

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

铜币
238
发表于 2020-3-13 12:36:25 | 显示全部楼层
虽然AutoCAD在Xreference管理器中显示插入到绘图中的光栅图像,但光栅图像与Xref有根本/完全不同的区别,即使用户以相同/相似的方式处理它以进行插入(附着),加载/重新加载...因此,Database.Reload[Resulve]Xrefs() 在绘图中对 RasterImage 没有任何作用。
在您的例子中,当 RasterInageDef.SourceFileName 发生更改时,RasterImage.IsLoaded 属性会发生变化(即,如果它是 true,它将更改为 false)。因此,在更改 SourceFileName 属性后,如果希望引用 RasterImageDef 的 RasterImage 可见,则需要调用 RasterImageDef.Load() 方法。
请参阅下面的代码示例:
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Text;
  4. using System.Threading.Tasks;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Autodesk.AutoCAD.EditorInput;
  9. using Autodesk.AutoCAD.Runtime;
  10. using CadApp = Autodesk.AutoCAD.ApplicationServices.Application;
  11. [assembly: CommandClass(typeof(UpdateImagePath.MyCommands))]
  12. namespace UpdateImagePath
  13. {
  14.     public class MyCommands
  15.     {
  16.         [CommandMethod("ImgPath")]
  17.         public static void RunMyCommand()
  18.         {
  19.             var imgPath =
  20.                 @"C:\Users\norman.yuan\Documents\Visual Studio 2019\Projects\AutoCAD2020\MiscTests\UpdateImagePath\Images";
  21.             var doc = CadApp.DocumentManager.MdiActiveDocument;
  22.             var ed = doc.Editor;
  23.             var imgId = SelectImage(ed);
  24.             if (!imgId.IsNull)
  25.             {
  26.                 UpdateImagePath(imgId, imgPath);
  27.                 ed.UpdateScreen();
  28.             }
  29.         }
  30.         private static ObjectId SelectImage(Editor ed)
  31.         {
  32.             var opt = new PromptEntityOptions(
  33.                 "\nSelect raster image:");
  34.             opt.SetRejectMessage("\nNot raster image!");
  35.             opt.AddAllowedClass(typeof(RasterImage), true);
  36.             var res = ed.GetEntity(opt);
  37.             return res.Status == PromptStatus.OK ? res.ObjectId : ObjectId.Null;
  38.         }
  39.         private static void UpdateImagePath(ObjectId imgId, string imgPath)
  40.         {
  41.             using (var tran = imgId.Database.TransactionManager.StartTransaction())
  42.             {
  43.                 var img = (RasterImage)tran.GetObject(imgId, OpenMode.ForRead);
  44.                 var imgDef = (RasterImageDef)tran.GetObject(img.ImageDefId, OpenMode.ForWrite);
  45.                 CadApp.ShowAlertDialog(
  46.                     $"IsLoaded: {imgDef.IsLoaded}");
  47.                 var fileName = System.IO.Path.GetFileName(imgDef.SourceFileName);
  48.                 imgDef.SourceFileName = imgPath + "\" + fileName;
  49.                 CadApp.ShowAlertDialog(
  50.                     $"IsLoaded after SourceFileName changed: {imgDef.IsLoaded}");
  51.                 imgDef.Load();
  52.                 tran.Commit();
  53.             }
  54.         }
  55.     }
  56. }

注意:第二个警报对话框(在 SourceFileName 更改后)将显示 IsLoaded 属性变为“false”。
回复

使用道具 举报

50

主题

114

帖子

2

银币

后起之秀

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

铜币
314
发表于 2020-3-13 15:21:26 | 显示全部楼层
是的,现在的工作与.load()。谢谢
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 05:53 , Processed in 0.144224 second(s), 62 queries .

© 2020-2024 乐筑天下

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