.NET
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Thumbnail is not generating after saving drawing file.

4 REPLIES 4
Reply
Message 1 of 5
RamanSBV
1028 Views, 4 Replies

Thumbnail is not generating after saving drawing file.

Hi,

 

I am facing an issue while generating the thumbnail of the drawing file.

Thumbnail is generating fine for drawing file.

Once drawing file is saved using below statement,

 

Database.SaveAs(filePath,DwgVersion.Current);

 

Thumbnail generation method is returning null as given below.

 

byte bytCnt = br.ReadByte();

if (bytCnt <= 1)    //Means bytCnt value is 1;

return null;

 

Please help me on this issue

 

Regards,

Raman

 

4 REPLIES 4
Message 2 of 5

From Docs:

If the database executing the SaveAs() function is not the current database in the AutoCAD editor, then the thumbnail preview image is not saved to fileName. 

 To preserve previous thumbnail:

db.RetainOriginalThumbnailBitmap = true;
db.SaveAs (...);

 

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 3 of 5

Hi,

 

Thanks for giving your comments on this.

 

As you mentioned, I have coded as below

 

Database db = newDatabase(false, true);

db.RetainOriginalThumbnailBitmap =true;

db.ReadDwgFile(filePath, FileOpenMode.OpenForReadAndAllShare, true, "");

db.SaveAs(filePath,DwgVersion.Current);

db.Dispose();

 

But still same issue.... 😞

 

Regards,

Raman

 

Message 4 of 5

Tested with AutoCAD 2013:

static int Ver = AcAp.Application.Version.Major;
// AutoCAD 2007...2012
[DllImport("acblock.arx", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acdbMakeDrawingPreview")]
extern static private Int32 acdbMakeDrawingPreview12(IntPtr db, [MarshalAs(UnmanagedType.U1)] bool bUnused);
// AutoCAD 2013...
[DllImport("acblock.crx", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acdbMakeDrawingPreview")]
extern static private Int32 acdbMakeDrawingPreview13(IntPtr db, [MarshalAs(UnmanagedType.U1)] bool bUnused);
static public Int32 acdbMakeDrawingPreview(Database db, bool bUnused)
{
  return (Ver == 18) ? acdbMakeDrawingPreview12(db.UnmanagedObject, bUnused) : acdbMakeDrawingPreview13(db.UnmanagedObject, bUnused);
}

[CommandMethod("BoxView", CommandFlags.Modal)]
public static void CrossView()
{
  Autodesk.AutoCAD.Windows.OpenFileDialog dlg = new Autodesk.AutoCAD.Windows
      .OpenFileDialog("Select dwg-file:", "", "dwg", "",
      Autodesk.AutoCAD.Windows.OpenFileDialog.OpenFileDialogFlags.AllowMultiple);
  DialogResult ds = dlg.ShowDialog();
  if (ds != DialogResult.OK) return;
  foreach (string path in dlg.GetFilenames()) {
    using (Database db = new Database(false, false)) {
      try {
        db.ReadDwgFile(path, FileOpenMode.OpenForReadAndReadShare, false, "");
        Point3d p1 = db.Extmin, p2 = db.Extmax;
        Point3d[] pts = new Point3d[4];
        pts[0] = new Point3d(p1.X, p1.Y, 0);  pts[1] = new Point3d(p1.X, p2.Y, 0);
        pts[2] = new Point3d(p2.X, p2.Y, 0);  pts[3] = new Point3d(p2.X, p1.Y, 0);

        using (BlockTableRecord btr = db.CurrentSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord) {
          using (Polyline3d pl = new Polyline3d(Poly3dType.SimplePoly, new Point3dCollection(pts), true)) {
            btr.AppendEntity(pl);
          }
        }
        db.CloseInput(true);
        // acdbMakeDrawingPreview(db,true); // Making new preview
        db.RetainOriginalThumbnailBitmap = true;
        System.Drawing.Bitmap bm = db.ThumbnailBitmap;
        db.SaveAs(path, DwgVersion.Current);
      }
      catch (Autodesk.AutoCAD.Runtime.Exception ex) {
        Editor ed = Autodesk.AutoCAD.ApplicationServices.Application
                     .DocumentManager.MdiActiveDocument.Editor;
        ed.WriteMessage(ex.ToString());
      }
    }
  }
}

Preview has only previous Thumbnail, i.e. polyline is not visible in preview.
I've tried to using very old undocumented function acdbMakeDrawingPreview to make new preview but without success.



Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 5 of 5

Hi, works for me very well in combination with db.Wblock.

I'm creating new database, zoom to extents within a transaction, and write the tumbnail as seen above after the zoom-transaction.

True uses view of current database, False uses the newly created view in the side database.

 

    public static bool Wblock(string strFile, Point3d ptPoint, ObjectIdCollection lstObj)
    {
      bool isSuc = false;
      if (lstObj.Count > 0)
      {
        Database oDbSource = lstObj[0].Database;

        try
        {
          using (Database oNewDb = new Database(true, false))
          {
            oDbSource.Wblock(oNewDb, lstObj, ptPoint, DuplicateRecordCloning.Ignore);

            TransactionHelper.RunIn(oNewDb, delegate(Transaction oTrans)
            {
              oNewDb.ZoomExtents(1.05);
            });
// nothing else then acdbMakeDrawingPreview13 CreateDrawingPreview(oNewDb, false); oNewDb.SaveAs(strFile, DwgVersion.Newest); } isSuc = true; } catch { } } return isSuc; }

 Thanks for the sample.

 

Regards, Fred

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk DevCon in Munich May 28-29th


Autodesk Design & Make Report

”Boost