Announcements
Due to scheduled maintenance, the Autodesk Community will be inaccessible from 10:00PM PDT on Oct 16th for approximately 1 hour. We appreciate your patience during this time.
.NET
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Layout of newly created xref is null

0 REPLIES 0
Reply
Message 1 of 1
ottosson_mathias
96 Views, 0 Replies

Layout of newly created xref is null

I'm creating a new xref definition and instances on specified layouts (usually just one) in a sideDb:

 

var path = ...;
var xrefName = ...;
var toCreate = ...; // list of instances to be created

using (Transaction transaction = db.TransactionManager.StartTransaction())
{
    ObjectId newXrefId = db.OverlayXref(path, xrefName);

    foreach (var createInstance in toCreate)
    {
        var position = new Point3d(0, 0, 0);
        var scale = new Scale3d(1, 1, 1);

        var newXrefBref = new BlockReference(position, newXrefId);
        var xrefDefinition = (BlockTableRecord)transaction.GetObject(newXrefId, OpenMode.ForWrite, false, true);
        var layout = GetLayout(db, createInstance.LayoutHandle); // getting layout to add xref to
        var layoutBtr = (BlockTableRecord)transaction.GetObject(layout.BlockTableRecordId, OpenMode.ForWrite, false, true);

        layoutBtr.AppendEntity(newXrefBref);
        layoutBtr.LayoutId = layout.BlockTableRecordId;
        xrefDefinition.PathName = xref.Path;
        xrefDefinition.IsUnloaded = xref.LoadStatus == LoadStatus.Unloaded;
        newXrefBref.Layer = createInstance.LayerName;
        newXrefBref.Rotation = createInstance.Rotation
        newXrefBref.ScaleFactors = scale;

        transaction.AddNewlyCreatedDBObject(newXrefBref, true);
    }

    transaction.Commit();
}

 

After creating the new xref I try to load all xrefs in the current db. But layout for the newly created xref is null and the function crashes when I use layout..

 

internal static void GetXrefs(Database db)
{
    var xrg = db.GetHostDwgXrefGraph(true);

    for (int i = 1; i < xrg.NumNodes; i++)
    {
        var xrgn = xrg.GetXrefNode(i);

        using (Transaction transaction = db.TransactionManager.StartTransaction())
        {
            BlockTableRecord xrefDefinition = (BlockTableRecord)transaction.GetObject(xrgn.BlockTableRecordId, OpenMode.ForRead);
            var xrefInstanceIds = xrefDefinition.GetBlockReferenceIds(true, true);

            foreach (ObjectId id in xrefInstanceIds)
            {
                var xrefInstance = transaction.GetObject(id, OpenMode.ForRead) as BlockReference;
                var layoutBlock = transaction.GetObject(xrefInstance.BlockId, OpenMode.ForRead) as BlockTableRecord;
                var layout = transaction.GetObject(layoutBlock.LayoutId, OpenMode.ForRead) as Layout; // layout is null for new xrefs, but works for all others!

                // ...
            }

            transaction.Abort();
        }
    }

    return xrefs;
}

 

It always works just fine for all other xrefs and if I re-open the file I can use the newly created xref to retrieve the layout as with every other xref...

 

What is wrong here. Do I need to refresh the db after creating the xref or something? I would prefer not to have to close and open the file again...

 

Thanks!

0 REPLIES 0

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

Post to forums  

AutoCAD Inside the Factory


Autodesk Design & Make Report