先要看你是什么版本的中望cad BlockTableRecord.PreviewIcon可以参考下ZwSoft.ZwCA… 朱一朱一朱 取消关注 关注 私信 10月15日 待审 编辑 先要看你是什么版本的中望cad BlockTableRecord.PreviewIcon可以参考下ZwSoft.ZwCAD.Internal.Utils.GetBlockImage 这个也可以参考
朱一朱一朱A 社区版主☪☪☪lv6 10月16日 贴上你的代码 zwuser@朱一朱一朱A ☆lv0 10月16日 方法 1:UpdateThumbnail Database newDb = db.Wblock(idCol, basePt); // 改视图(让 Database 有有效视图) try { Point3d min = newDb.Extmin; Point3d max = newDb.Extmax; double w = max.X – min.X; double h = max.Y – min.Y; if (w > 0 && h > 0) { double ratio = 4.0 / 3.0; double viewH = Math.Max(h * 1.1, (w * 1.1) / ratio); double cx = (min.X + max.X) / 2.0; double cy = (min.Y + max.Y) / 2.0; using (Transaction tr = newDb.TransactionManager.StartTransaction()) { var vport = (ViewportTableRecord)tr.GetObject( newDb.CurrentViewportTableRecordId, OpenMode.ForWrite); vport.CenterPoint = new Point2d(cx, cy); vport.Height = viewH; tr.Commit(); } } } catch { } // 设 UpdateThumbnail try { newDb.UpdateThumbnail = 1; } catch { } newDb.SaveAs(fullpath, DwgVersion.AC1015); newDb.Dispose(); 结果:缩略图空。 UpdateThumbnail = 0 / = 1 / = 2 均试过,都不行。 方法 2:ThumbnailBitmap Database newDb = db.Wblock(idCol, basePt); try { using (Bitmap bmp = new Bitmap(200, 150)) { using (Graphics g = Graphics.FromImage(bmp)) { g.Clear(Color.Red); // 先设“红色”,验证是否生效 } newDb.ThumbnailBitmap = bmp; } } catch (Exception ex) { ed.WriteMessage(“n[调试] 设 ThumbnailBitmap 异常: ” + ex.Message); } newDb.SaveAs(fullpath, DwgVersion.AC1015); newDb.Dispose(); 结果:缩略图空,卡片没有变红 → ThumbnailBitmap 没有写进 DWG。 也试过 newDb.ThumbnailBitmap = db.ThumbnailBitmap;(源文档的缩略图),同样为空。 方法 3:RetainOriginalThumbnailBitmap Database newDb = db.Wblock(idCol, basePt); try { newDb.RetainOriginalThumbnailBitmap = false; } catch { } newDb.SaveAs(fullpath, DwgVersion.AC1015); newDb.Dispose(); 结果:缩略图空。 方法 4:SaveAs 的 saveThumbnailImage 重载 反编译 ZwDatabaseMgd.dll 得到的签名: public unsafe void SaveAs(string fileName, SaveType st, DwgVersion version, [MarshalAs(UnmanagedType.U1)] bool saveThumbnailImage, int dxfPrecision) SaveType 枚举: csharp public enum SaveType { NoSave = -1, Save12, // = 0 Save13, // = 1 Save14 // = 2 } 调用: csharp Database newDb = db.Wblock(idCol, basePt); // 改视图、设 ThumbnailBitmap(同上) newDb.SaveAs(fullpath, SaveType.Save12, DwgVersion.AC1015, true, 0); newDb.Dispose(); 结果:缩略图空(saveThumbnailImage = true 也没有写入缩略图)。 方法 5:打开文档 + 保存 + 关闭 csharp Database newDb = db.Wblock(idCol, basePt); newDb.SaveAs(fullpath, DwgVersion.AC1015); newDb.Dispose(); DocumentCollection docs = Application.DocumentManager; Document newDoc = docs.Open(fullpath, false); if (newDoc != null) { newDoc.Database.SaveAs(fullpath, DwgVersion.AC1015); newDoc.CloseAndDiscard(); // 或 CloseAndSave(fullpath) } 结果: 缩略图有了(卡片正常显示图)✅ 但: CAD 中多出一个文档标签,CloseAndDiscard / CloseAndSave 都关不掉; DWG 被占用,外部删除提示“正由另一进程使用”; “另存到自身”报 eFileSharingViolation; 试“另存到 tmp + 改名”,File.Delete(fullpath) 与 File.Copy(tmp, fullpath, true) 均报文件被占用。 副作用不可接受,因此没有采用这条路径。 想请版主确认 Wblock 返回的 Database,是否本身就不带缩略图?newDb.ThumbnailBitmap 是 null 吗? 在不“打开文档”的前提下,如何让 Wblock 的 Database 在 SaveAs 时写出缩略图?上面 UpdateThumbnail / ThumbnailBitmap / RetainOriginalThumbnailBitmap / SaveAs(…, saveThumbnailImage: true) 都无效。 论坛提到的 BlockTableRecord.PreviewIcon,应该用在“读端”还是“写端”?如果是写端,应该在 Wblock 之后对哪个 BlockTableRecord 设置?有没有示例? ZwSoft.ZwCAD.Internal.Utils.GetBlockImage 的签名和参数是什么?它是“生成图像”还是“读取已有图像”? 另外搜到一条相关讨论: “发送命令”和“API 获取预览图”之间可能存在时序不同步 —— 先发 BLOCKICON 更新预览图,再用 PreviewIcon 读,可能读到旧图或黑图,因为命令尚未执行完毕。 如果确实存在这种时序问题,那么在 Wblock 后配合 BLOCKICON 的正确做法是什么?是否需要等待、或调用某个刷新接口? 以上。谢谢。 zwuser@zwuser ☆lv0 10月16日 排版乱了。截图1 zwuser@朱一朱一朱A ☆lv0 10月16日 排版乱了,截屏2 zwuser@朱一朱一朱A ☆lv0 10月16日 排版乱了,截屏3 zwuser@朱一朱一朱A ☆lv0 10月17日 后面把这个图库管理工具做成EXE版连cad,制作的图块入库,就有白色背景的缩略图可显示。而DLL的怎么也不行,不知道是两者的差别在哪 zwuser@朱一朱一朱A ☆lv0 10月18日 我编译成EXE版的,建块入库的缩略图又能出来了。DLL的就不行
zwuser@朱一朱一朱A ☆lv0 10月16日 方法 1:UpdateThumbnail Database newDb = db.Wblock(idCol, basePt); // 改视图(让 Database 有有效视图) try { Point3d min = newDb.Extmin; Point3d max = newDb.Extmax; double w = max.X – min.X; double h = max.Y – min.Y; if (w > 0 && h > 0) { double ratio = 4.0 / 3.0; double viewH = Math.Max(h * 1.1, (w * 1.1) / ratio); double cx = (min.X + max.X) / 2.0; double cy = (min.Y + max.Y) / 2.0; using (Transaction tr = newDb.TransactionManager.StartTransaction()) { var vport = (ViewportTableRecord)tr.GetObject( newDb.CurrentViewportTableRecordId, OpenMode.ForWrite); vport.CenterPoint = new Point2d(cx, cy); vport.Height = viewH; tr.Commit(); } } } catch { } // 设 UpdateThumbnail try { newDb.UpdateThumbnail = 1; } catch { } newDb.SaveAs(fullpath, DwgVersion.AC1015); newDb.Dispose(); 结果:缩略图空。 UpdateThumbnail = 0 / = 1 / = 2 均试过,都不行。 方法 2:ThumbnailBitmap Database newDb = db.Wblock(idCol, basePt); try { using (Bitmap bmp = new Bitmap(200, 150)) { using (Graphics g = Graphics.FromImage(bmp)) { g.Clear(Color.Red); // 先设“红色”,验证是否生效 } newDb.ThumbnailBitmap = bmp; } } catch (Exception ex) { ed.WriteMessage(“n[调试] 设 ThumbnailBitmap 异常: ” + ex.Message); } newDb.SaveAs(fullpath, DwgVersion.AC1015); newDb.Dispose(); 结果:缩略图空,卡片没有变红 → ThumbnailBitmap 没有写进 DWG。 也试过 newDb.ThumbnailBitmap = db.ThumbnailBitmap;(源文档的缩略图),同样为空。 方法 3:RetainOriginalThumbnailBitmap Database newDb = db.Wblock(idCol, basePt); try { newDb.RetainOriginalThumbnailBitmap = false; } catch { } newDb.SaveAs(fullpath, DwgVersion.AC1015); newDb.Dispose(); 结果:缩略图空。 方法 4:SaveAs 的 saveThumbnailImage 重载 反编译 ZwDatabaseMgd.dll 得到的签名: public unsafe void SaveAs(string fileName, SaveType st, DwgVersion version, [MarshalAs(UnmanagedType.U1)] bool saveThumbnailImage, int dxfPrecision) SaveType 枚举: csharp public enum SaveType { NoSave = -1, Save12, // = 0 Save13, // = 1 Save14 // = 2 } 调用: csharp Database newDb = db.Wblock(idCol, basePt); // 改视图、设 ThumbnailBitmap(同上) newDb.SaveAs(fullpath, SaveType.Save12, DwgVersion.AC1015, true, 0); newDb.Dispose(); 结果:缩略图空(saveThumbnailImage = true 也没有写入缩略图)。 方法 5:打开文档 + 保存 + 关闭 csharp Database newDb = db.Wblock(idCol, basePt); newDb.SaveAs(fullpath, DwgVersion.AC1015); newDb.Dispose(); DocumentCollection docs = Application.DocumentManager; Document newDoc = docs.Open(fullpath, false); if (newDoc != null) { newDoc.Database.SaveAs(fullpath, DwgVersion.AC1015); newDoc.CloseAndDiscard(); // 或 CloseAndSave(fullpath) } 结果: 缩略图有了(卡片正常显示图)✅ 但: CAD 中多出一个文档标签,CloseAndDiscard / CloseAndSave 都关不掉; DWG 被占用,外部删除提示“正由另一进程使用”; “另存到自身”报 eFileSharingViolation; 试“另存到 tmp + 改名”,File.Delete(fullpath) 与 File.Copy(tmp, fullpath, true) 均报文件被占用。 副作用不可接受,因此没有采用这条路径。 想请版主确认 Wblock 返回的 Database,是否本身就不带缩略图?newDb.ThumbnailBitmap 是 null 吗? 在不“打开文档”的前提下,如何让 Wblock 的 Database 在 SaveAs 时写出缩略图?上面 UpdateThumbnail / ThumbnailBitmap / RetainOriginalThumbnailBitmap / SaveAs(…, saveThumbnailImage: true) 都无效。 论坛提到的 BlockTableRecord.PreviewIcon,应该用在“读端”还是“写端”?如果是写端,应该在 Wblock 之后对哪个 BlockTableRecord 设置?有没有示例? ZwSoft.ZwCAD.Internal.Utils.GetBlockImage 的签名和参数是什么?它是“生成图像”还是“读取已有图像”? 另外搜到一条相关讨论: “发送命令”和“API 获取预览图”之间可能存在时序不同步 —— 先发 BLOCKICON 更新预览图,再用 PreviewIcon 读,可能读到旧图或黑图,因为命令尚未执行完毕。 如果确实存在这种时序问题,那么在 Wblock 后配合 BLOCKICON 的正确做法是什么?是否需要等待、或调用某个刷新接口? 以上。谢谢。
贴上你的代码
方法 1:UpdateThumbnail Database newDb = db.Wblock(idCol, basePt); // 改视图(让 Database 有有效视图) try { Point3d min = newDb.Extmin; Point3d max = newDb.Extmax; double w = max.X – min.X; double h = max.Y – min.Y; if (w > 0 && h > 0) { double ratio = 4.0 / 3.0; double viewH = Math.Max(h * 1.1, (w * 1.1) / ratio); double cx = (min.X + max.X) / 2.0; double cy = (min.Y + max.Y) / 2.0; using (Transaction tr = newDb.TransactionManager.StartTransaction()) { var vport = (ViewportTableRecord)tr.GetObject( newDb.CurrentViewportTableRecordId, OpenMode.ForWrite); vport.CenterPoint = new Point2d(cx, cy); vport.Height = viewH; tr.Commit(); } } } catch { } // 设 UpdateThumbnail try { newDb.UpdateThumbnail = 1; } catch { } newDb.SaveAs(fullpath, DwgVersion.AC1015); newDb.Dispose(); 结果:缩略图空。 UpdateThumbnail = 0 / = 1 / = 2 均试过,都不行。 方法 2:ThumbnailBitmap Database newDb = db.Wblock(idCol, basePt); try { using (Bitmap bmp = new Bitmap(200, 150)) { using (Graphics g = Graphics.FromImage(bmp)) { g.Clear(Color.Red); // 先设“红色”,验证是否生效 } newDb.ThumbnailBitmap = bmp; } } catch (Exception ex) { ed.WriteMessage(“n[调试] 设 ThumbnailBitmap 异常: ” + ex.Message); } newDb.SaveAs(fullpath, DwgVersion.AC1015); newDb.Dispose(); 结果:缩略图空,卡片没有变红 → ThumbnailBitmap 没有写进 DWG。 也试过 newDb.ThumbnailBitmap = db.ThumbnailBitmap;(源文档的缩略图),同样为空。 方法 3:RetainOriginalThumbnailBitmap Database newDb = db.Wblock(idCol, basePt); try { newDb.RetainOriginalThumbnailBitmap = false; } catch { } newDb.SaveAs(fullpath, DwgVersion.AC1015); newDb.Dispose(); 结果:缩略图空。 方法 4:SaveAs 的 saveThumbnailImage 重载 反编译 ZwDatabaseMgd.dll 得到的签名: public unsafe void SaveAs(string fileName, SaveType st, DwgVersion version, [MarshalAs(UnmanagedType.U1)] bool saveThumbnailImage, int dxfPrecision) SaveType 枚举: csharp public enum SaveType { NoSave = -1, Save12, // = 0 Save13, // = 1 Save14 // = 2 } 调用: csharp Database newDb = db.Wblock(idCol, basePt); // 改视图、设 ThumbnailBitmap(同上) newDb.SaveAs(fullpath, SaveType.Save12, DwgVersion.AC1015, true, 0); newDb.Dispose(); 结果:缩略图空(saveThumbnailImage = true 也没有写入缩略图)。 方法 5:打开文档 + 保存 + 关闭 csharp Database newDb = db.Wblock(idCol, basePt); newDb.SaveAs(fullpath, DwgVersion.AC1015); newDb.Dispose(); DocumentCollection docs = Application.DocumentManager; Document newDoc = docs.Open(fullpath, false); if (newDoc != null) { newDoc.Database.SaveAs(fullpath, DwgVersion.AC1015); newDoc.CloseAndDiscard(); // 或 CloseAndSave(fullpath) } 结果: 缩略图有了(卡片正常显示图)✅ 但: CAD 中多出一个文档标签,CloseAndDiscard / CloseAndSave 都关不掉; DWG 被占用,外部删除提示“正由另一进程使用”; “另存到自身”报 eFileSharingViolation; 试“另存到 tmp + 改名”,File.Delete(fullpath) 与 File.Copy(tmp, fullpath, true) 均报文件被占用。 副作用不可接受,因此没有采用这条路径。 想请版主确认 Wblock 返回的 Database,是否本身就不带缩略图?newDb.ThumbnailBitmap 是 null 吗? 在不“打开文档”的前提下,如何让 Wblock 的 Database 在 SaveAs 时写出缩略图?上面 UpdateThumbnail / ThumbnailBitmap / RetainOriginalThumbnailBitmap / SaveAs(…, saveThumbnailImage: true) 都无效。 论坛提到的 BlockTableRecord.PreviewIcon,应该用在“读端”还是“写端”?如果是写端,应该在 Wblock 之后对哪个 BlockTableRecord 设置?有没有示例? ZwSoft.ZwCAD.Internal.Utils.GetBlockImage 的签名和参数是什么?它是“生成图像”还是“读取已有图像”? 另外搜到一条相关讨论: “发送命令”和“API 获取预览图”之间可能存在时序不同步 —— 先发 BLOCKICON 更新预览图,再用 PreviewIcon 读,可能读到旧图或黑图,因为命令尚未执行完毕。 如果确实存在这种时序问题,那么在 Wblock 后配合 BLOCKICON 的正确做法是什么?是否需要等待、或调用某个刷新接口? 以上。谢谢。
排版乱了。截图1
排版乱了,截屏2
排版乱了,截屏3
后面把这个图库管理工具做成EXE版连cad,制作的图块入库,就有白色背景的缩略图可显示。而DLL的怎么也不行,不知道是两者的差别在哪
我编译成EXE版的,建块入库的缩略图又能出来了。DLL的就不行
中望2026。还是不行啊,让DeepSeek帮忙,也没搞定。