How to read an embeded oleobject(image,not excel) using api?

How to read an embeded oleobject(image,not excel) using api?

Anonymous
Not applicable
550 Views
2 Replies
Message 1 of 3

How to read an embeded oleobject(image,not excel) using api?

Anonymous
Not applicable

Hello ,I have a requirement to get the data of an embeded oleobject(image,no excel,word) in  drawing using API.Does anyone have a solution?I had found that the oleobject is a comobject and i try to use dynamic binding to invoke some method to get data,unfortunately,it failed.How could I get the data?Thanks a lot. 

0 Likes
551 Views
2 Replies
Replies (2)
Message 2 of 3

SENL1362
Advisor
Advisor
Did you managed to edit a external referenced Image?
As i remember correctly embedded images have no pathname/ is empty value
0 Likes
Message 3 of 3

SENL1362
Advisor
Advisor

Small code fragment(s) to show you how to search for the Embedded Images

image.png

 

CommandMethod("TestEmbedded")]
public static void TestEmbedded()
{
    Document doc = null;
    Editor ed = null;
    Database db = null;

    try
    {
        doc = AcadApp.DocumentManager.MdiActiveDocument;
        ed = doc.Editor;
        db = doc.Database;

        var imageDictId = RasterImageDef.GetImageDictionary(db);
        if (imageDictId.IsNull)
        {
            ed.WriteMessage("No Images in this Drawing\n");
            imageDictId = RasterImageDef.CreateImageDictionary(db);
        }

        var imageDefId = ObjectId.Null;
        using (var tr = db.TransactionManager.StartTransaction())
        {
            var imageDict = (DBDictionary)tr.GetObject(imageDictId, OpenMode.ForRead);
            foreach (DBDictionaryEntry imageEntry in imageDict)
            {
                ed.WriteMessage($"{imageEntry.Key}:\n");
                imageDefId = imageEntry.Value;
                var rasterDef = tr.GetObject(imageDefId, OpenMode.ForWrite) as RasterImageDef;
                ed.WriteMessage($"\t Size={rasterDef.Size[0]} X {rasterDef.Size[1]}\n");
                if (rasterDef.IsEmbedded)
                {
                    ed.WriteMessage($"\t Embedded Image, no External Pathnames\n");
                }
                else //Not Embedded Image
                {
                    ed.WriteMessage($"\t {rasterDef.ActiveFileName}\n");
                    //Obsolete: ed.WriteMessage($"\t {rasterDef.SearchForActivePath}\n");
                    ed.WriteMessage($"\t {rasterDef.SourceFileName}\n");
                }
            }
            tr.Commit();
        }
    }
    catch (System.Exception ex)
    {
        ed?.WriteMessage(ex.Message);
    }
}
//Get (Modelspace) Images
using (var tr = db.TransactionManager.StartTransaction())
{
    var msId = SymbolUtilityServices.GetBlockModelSpaceId(db);
    var ms = (BlockTableRecord)tr.GetObject(msId, OpenMode.ForWrite);
    //Embedded only: var rasterImageIds = ms.Cast<ObjectId>().Where(n => n.ObjectClass.DxfName.Equals("AECIDBEMBEDDEDRASTERIMAGE", StringComparison.OrdinalIgnoreCase));
    var rasterImageIds = ms.Cast<ObjectId>().Where(n => n.ObjectClass.DxfName.Contains("RASTERIMAGE", StringComparison.OrdinalIgnoreCase));
    if (rasterImageIds != null)
    {
        foreach (ObjectId id in rasterImageIds)
        {
            var rasterImage = tr.GetObject(id, OpenMode.ForRead) as RasterImage;
            ed.WriteMessage($"{rasterImage.Name}\n");
            ed.WriteMessage($"\t pos:{rasterImage.Position.ToString()}\n");
            ed.WriteMessage($"\t angle:{rasterImage.Rotation * 180.0 / Math.PI}\n");
            ed.WriteMessage($"\t size:{rasterImage.Width} X {rasterImage.Height}\n");
            var rasterDef = tr.GetObject(rasterImage.ImageDefId, OpenMode.ForRead) as RasterImageDef;
            if (rasterDef.IsEmbedded)
            {
                ed.WriteMessage($"\t embedded\n");
            }
            else //Not Embedded image
            {
                ed.WriteMessage($"\t pathname:{rasterDef.ActiveFileName}");  
            }
        }
    }
    tr.Commit();
}

 

 

 

//Attach Image
var imagePathname = @"C:\Temp\Raster.tif";
var imageName = Path.GetFileNameWithoutExtension(imagePathname);
using (var tr = db.TransactionManager.StartTransaction())
{
    var imageDict = (DBDictionary)tr.GetObject(imageDictId, OpenMode.ForRead);

    //?Is Image attached already
    if (imageDict.Contains(imageName))
    {
        imageDefId = imageDict.GetAt(imageName);
        var rasterDef = tr.GetObject(imageDefId, OpenMode.ForWrite) as RasterImageDef;
    }
    else //Attach Image
    {
        using (var rasterDef = new RasterImageDef())
        {
            rasterDef.SourceFileName = imagePathname;
            rasterDef.Load();

            imageDict.UpgradeOpen();
            imageDefId = imageDict.SetAt(imageName, rasterDef);
            tr.AddNewlyCreatedDBObject(rasterDef, true);
        }
    }
    tr.Commit();
}
//Insert Image into Modelspace
var rasterPos = new Point3d(100, 200, 0);
var rasterAngle = 0 * Math.PI / 180.0;
var rasterScale = 1;
using (var tr = db.TransactionManager.StartTransaction())
{
    using (var rasterImage = new RasterImage())
    {
        rasterImage.SetDatabaseDefaults();
        rasterImage.ImageDefId = imageDefId;

        var msId = SymbolUtilityServices.GetBlockModelSpaceId(db);
        var ms = (BlockTableRecord)tr.GetObject(msId, OpenMode.ForWrite);
        ms.AppendEntity(rasterImage);
        tr.AddNewlyCreatedDBObject(rasterImage, true);

        var rasterDef = tr.GetObject(imageDefId, OpenMode.ForWrite) as RasterImageDef;

        var wRaster = default(Vector3d);
        var hRaster = default(Vector3d);

        var wImage = rasterDef.ResolutionMMPerPixel.X * rasterImage.ImageWidth;
        var hImage = rasterDef.ResolutionMMPerPixel.Y * rasterImage.ImageHeight;

        if (rasterScale != 1)
        {
            if (db.Measurement == MeasurementValue.English)
            {
                wImage /= 25.4;
                hImage /= 25.4;
            }
            wImage *= rasterScale;
            hImage *= rasterScale;
        }
        wRaster = new Vector3d(wImage, 0, 0);
        hRaster = new Vector3d(0, hImage, 0);
        var coordinateSystem = new CoordinateSystem3d(rasterPos, wRaster, hRaster);

        rasterImage.Orientation = coordinateSystem;
        rasterImage.Rotation = rasterAngle;

        rasterImage.ImageTransparency = true;
        rasterImage.Name = imageName;
        RasterImage.EnableReactors(true);
        rasterImage.AssociateRasterDef(rasterDef);
        var rasterRefId = rasterImage.ObjectId;

        //Vectors above Image
        var moveBelowIds = new ObjectIdCollection(new ObjectId[] { rasterRefId });
        var btrDrawOrder = (DrawOrderTable)tr.GetObject(ms.DrawOrderTableId, OpenMode.ForWrite);
        btrDrawOrder.MoveToBottom(moveBelowIds);
    }
    tr.Commit();
}
//Embed
// Need RasterDesign to do that
using (var tr = db.TransactionManager.StartTransaction())
{
    var rasterDef = tr.GetObject(imageDefId, OpenMode.ForWrite) as RasterImageDef;
    //not implemented yet: rasterDef.Embed();
    tr.Commit();
}

 

0 Likes