找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2891|回复: 3

[分享] .NET下如何存取或生成一个图块的预览图

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-5-25 04:24:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
How to access or generate a block preview Icon in .Net?                                                        By Philippe Leefsma
  The C# command below illustrates how to save a block preview icon as an image on the disk:
  1. [DllImport("acad.exe",
  2.     CharSet = CharSet.Unicode,
  3.     CallingConvention = CallingConvention.Cdecl,
  4.     EntryPoint = "acedCommand")]
  5. private static extern int acedCommand(
  6.     int type1,
  7.     string command,
  8.     int type2,
  9.     string blockName,
  10.     int end);

  11. [CommandMethod("BlkPreview")]
  12. static public void BlkPreview()
  13. {
  14.     Document doc = Application.DocumentManager.MdiActiveDocument;
  15.     Database db = doc.Database;
  16.     Editor ed = doc.Editor;
  17.     PromptStringOptions pso = new PromptStringOptions(
  18.         "\nEnter block name: ");
  19.     PromptResult pr = ed.GetString(pso);
  20.     if (pr.Status != PromptStatus.OK)
  21.         return;
  22.     using (Transaction Tx = db.TransactionManager.StartTransaction())
  23.     {
  24.         BlockTable table = Tx.GetObject(
  25.            db.BlockTableId,
  26.             OpenMode.ForRead)
  27.                 as BlockTable;
  28.         if (!table.Has(pr.StringResult) == true)
  29.         {
  30.             ed.WriteMessage(
  31.                 "\nNo block with name " + pr.StringResult);
  32.             return;
  33.         }
  34.         BlockTableRecord blk = Tx.GetObject(
  35.             table[pr.StringResult],
  36.             OpenMode.ForRead)
  37.                 as BlockTableRecord;
  38.         if (blk.PreviewIcon == null)
  39.         {
  40.            acedCommand(
  41.                 5005,
  42.                 "BLOCKICON",
  43.                 5005,
  44.                 pr.StringResult,
  45.                 5000);
  46.         }
  47.         blk.PreviewIcon.Save(
  48.             "c:\\Temp\\" + pr.StringResult + ".bmp");
  49.         Tx.Commit();
  50.     }
  51. }


评分

参与人数 1D豆 +2 收起 理由
ScmTools + 2 很给力!资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1632个

财富等级: 堆金积玉

发表于 2013-5-25 14:32:53 | 显示全部楼层
支持! 谢谢分享.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-6-24 17:16:16 | 显示全部楼层
找到组织了。{:soso_e182:}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-6-24 18:02:55 | 显示全部楼层

  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.Runtime;
  6. using System.IO;

  7. namespace BlockPreviews
  8. {
  9.     publicclassCommands
  10.     {
  11.         [CommandMethod("GBP", CommandFlags.Session)]
  12.         staticpublicvoid GenerateBlockPreviews()
  13.         {
  14.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  15.             PromptFileNameResult res = ed.GetFileNameForOpen(
  16.                                            "Select file for which to generate previews"
  17.                                        );
  18.             if (res.Status != PromptStatus.OK) return;
  19.             Document doc = null;
  20.             try
  21.             {
  22.                 doc =  Application.DocumentManager.Open(res.StringResult, false);
  23.             }
  24.             catch
  25.             {
  26.                 ed.WriteMessage("\nUnable to read drawing.");
  27.                 return;
  28.             }

  29.             Database db = doc.Database;
  30.             string path = Path.GetDirectoryName(res.StringResult),
  31.                    name = Path.GetFileName(res.StringResult),
  32.                    iconPath = path + "\" + name + " icons";
  33.             int numIcons = 0;
  34.             Transaction tr =  doc.TransactionManager.StartTransaction();
  35.             using (tr)
  36.             {
  37.                 BlockTable table = (BlockTable)tr.GetObject(
  38.                                        db.BlockTableId, OpenMode.ForRead
  39.                                    );
  40.                 foreach (ObjectId blkId in table)
  41.                 {
  42.                     BlockTableRecord blk = (BlockTableRecord)tr.GetObject(
  43.                                                blkId, OpenMode.ForRead
  44.                                            );

  45.                     // Ignore layouts and anonymous blocks

  46.                     if (blk.IsLayout || blk.IsAnonymous) continue;

  47.                     // Attempt to generate an icon, where one doesn't exist

  48.                     if (blk.PreviewIcon == null)
  49.                     {
  50.                         object ActiveDocument = doc.AcadDocument;
  51.                         object[] data = { "_.BLOCKICON " + blk.Name + "\n" };
  52.                         ActiveDocument.GetType().InvokeMember(
  53.                             "SendCommand",
  54.                             System.Reflection.BindingFlags.InvokeMethod,
  55.                             null, ActiveDocument, data
  56.                         );
  57.                     }

  58.                     // Hopefully we now have an icon

  59.                     if (blk.PreviewIcon != null)
  60.                     {
  61.                         // Create the output directory, if it isn't yet there

  62.                         if (!Directory.Exists(iconPath))
  63.                             Directory.CreateDirectory(iconPath);

  64.                         // Save the icon to our out directory

  65.                         blk.PreviewIcon.Save(iconPath + "\" + blk.Name + ".bmp");

  66.                         // Increment our icon counter

  67.                         numIcons++;
  68.                     }
  69.                 }
  70.                 tr.Commit();
  71.             }
  72.             doc.CloseAndDiscard();
  73.             ed.WriteMessage(
  74.                 "\n{0} block icons saved to "{1}".", numIcons, iconPath
  75.             );
  76.         }
  77.     }
  78. }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-19 02:14 , Processed in 0.432366 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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