编辑
2025-06-28
AutoCAD
00
C#
private const string TemplatePath = @"C:\Users\xiaobai\AppData\Local\Autodesk\AutoCAD 2024\R24.3\chs\Template\acadiso.dwt"; [CommandMethod("ExportDrawingFrames")] public void ExportDrawingFrames() { Document doc = Application.DocumentManager.MdiActiveDocument; Database srcDb = doc.Database; Editor ed = doc.Editor; using (Transaction tr = srcDb.TransactionManager.StartTransaction()) { // 获取当前文档的工作目录作为输出路径 string outputDir = "输出路径"; if (string.IsNullOrEmpty(outputDir)) outputDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // 打开块表 BlockTable bt = (BlockTable)tr.GetObject(srcDb.BlockTableId, OpenMode.ForRead); // 用于存储导出成功的块 int exportedCount = 0; // 遍历所有块定义 foreach (ObjectId btrId in bt) { BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead); // 跳过非图纸图框块(根据名称判断) if (!IsDrawingFrameBlock(btr.Name)) continue; try { // 导出块到新DWG string dwgPath = Path.Combine(outputDir, btr.Name + ".dwg"); ExportBlockToDwg(btr, dwgPath); exportedCount++; ed.WriteMessage("\n已导出图框: {0}", dwgPath); } catch (System.Exception ex) { ed.WriteMessage("\n导出失败 - 图框: {0}, 错误: {1}", btr.Name, ex.Message); } } tr.Commit(); ed.WriteMessage("\n导出完成! 共导出 {0} 个图框", exportedCount); } } // 判断是否为图纸图框块 private bool IsDrawingFrameBlock(string blockName) { // 根据块命名规则判断是否为图框 // 这里可以使用与重命名方法相同的正则表达式 return System.Text.RegularExpressions.Regex.IsMatch( blockName, @"^A\d+(-[\d\.]+)?V?$"); } // 导出块到新DWG文件 private void ExportBlockToDwg(BlockTableRecord srcBtr, string dwgPath) { // 创建基于模板的新数据库 Database dstDb = new Database(false, true); dstDb.ReadDwgFile(TemplatePath, FileShare.Read, true, null); try { using (Transaction dstTr = dstDb.TransactionManager.StartTransaction()) { // 打开目标块表 BlockTable dstBt = (BlockTable)dstTr.GetObject( dstDb.BlockTableId, OpenMode.ForWrite); // 打开模型空间 BlockTableRecord dstMs = (BlockTableRecord)dstTr.GetObject( dstBt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); // 从源数据库复制块定义到目标数据库 ObjectIdCollection srcIds = new ObjectIdCollection(); srcIds.Add(srcBtr.ObjectId); IdMapping idMap = new IdMapping(); dstDb.WblockCloneObjects(srcIds, dstBt.ObjectId, idMap, DuplicateRecordCloning.Replace, false); // 在目标数据库中获取复制后的块定义ID ObjectId dstBtrId = idMap[srcBtr.ObjectId].Value; // 创建块参照并插入到模型空间 BlockReference br = new BlockReference(Point3d.Origin, dstBtrId); dstMs.AppendEntity(br); dstTr.AddNewlyCreatedDBObject(br, true); // 设置预览图(使用块的范围) SetPreviewFromBlock(dstDb, srcBtr, dstTr); dstTr.Commit(); } // 保存目标数据库 dstDb.SaveAs(dwgPath, DwgVersion.Current); } finally { // 释放资源 dstDb.Dispose(); } } // 设置预览图(基于块的范围) private void SetPreviewFromBlock(Database db, BlockTableRecord btr, Transaction tr) { Extents3d extents = GetBlockExtents(btr); var limitMin = extents.MinPoint.TransformBy(Matrix3d.Displacement(-extents.MinPoint.GetAsVector())); var limitMax = extents.MaxPoint.TransformBy(Matrix3d.Displacement(-extents.MinPoint.GetAsVector())); var bestBt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; db.Limmax = new Point2d(limitMax.X, limitMax.Y); db.Limmin = new Point2d(limitMin.X, limitMin.Y); db.ThumbnailBitmap = ExtractThumbnails(tr, bestBt); } // 获取块的范围 private Extents3d GetBlockExtents(BlockTableRecord btr) { Extents3d extents = new Extents3d(); // 遍历块中的所有实体 foreach (ObjectId entId in btr) { Entity ent = entId.GetObject(OpenMode.ForRead) as Entity; if (ent != null && !ent.IsErased) { try { // 合并实体的范围 extents.AddExtents(ent.GeometricExtents); } catch { // 忽略无法计算范围的实体 } } } return extents; } public static Bitmap ExtractThumbnails(Transaction tr, BlockTable bt) { try { // 获取模型空间的 BlockTableRecord var btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead); // 获取缩略图 var imgsrc = CMLContentSearchPreviews.GetBlockTRThumbnail(btr); // 将 BitmapSource 转换为 GDI+ Bitmap var image = ImageSourceToGDI(imgsrc as System.Windows.Media.Imaging.BitmapSource); return new Bitmap(image); } catch { // 遇到异常直接返回 null return null; } } private static System.Drawing.Image ImageSourceToGDI(System.Windows.Media.Imaging.BitmapSource src) { // 获取 BitmapSource 的宽度和高度 int width = src.PixelWidth; int height = src.PixelHeight; // 创建一个与源图像相同大小的 GDI+ Bitmap 对象 var bmp = new System.Drawing.Bitmap(width, height); // 获取 GDI+ Bitmap 的像素数据 var rect = new System.Drawing.Rectangle(0, 0, width, height); var data = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.WriteOnly, bmp.PixelFormat); // 使用 CopyPixels 将像素数据从 BitmapSource 复制到 GDI+ Bitmap src.CopyPixels(new System.Windows.Int32Rect(0, 0, width, height), data.Scan0, data.Stride * height, data.Stride); bmp.UnlockBits(data); return bmp; }