Hi …
This portion of code with C# does the copy between databases without error …
var mapping = new IdMapping();
using (var sourceDb = new Database(false, true))
{
sourceDb.ReadDwgFile(xrpath, FileOpenMode.OpenForReadAndAllShare, true, "");
ObjectId xrMsId = SymbolUtilityServices.GetBlockModelSpaceId(sourceDb);
var ids = new ObjectIdCollection();
using (var tr = new OpenCloseTransaction())
{
BlockTableRecord xrMS = (BlockTableRecord)tr.GetObject(xrMsId, OpenMode.ForWrite);
foreach (ObjectId id in xrMS)
{
Entity ent = (Entity)tr.GetObject(id, OpenMode.ForWrite);
ent.TransformBy(EM);
if (msg1.Contains(ent.Layer))
ids.Add(id);
}
}
var db = doc.Database;
ObjectId MsId = SymbolUtilityServices.GetBlockModelSpaceId(db);
sourceDb.WblockCloneObjects(ids, MsId, mapping, DuplicateRecordCloning.Ignore, false);
}
Here’s my attempt using python script in Dynamo…
# Load the Python Standard and DesignScript Libraries
import sys
import clr
import fnmatch
# Add Assemblies for AutoCAD and Civil3D
clr.AddReference('AcMgd')
clr.AddReference('AcCoreMgd')
clr.AddReference('AcDbMgd')
clr.AddReference('AecBaseMgd')
clr.AddReference('AecPropDataMgd')
clr.AddReference('AeccDbMgd')
# axtra for ReadDwgFile
from System.IO import FileShare
# Import references from AutoCAD
from Autodesk.AutoCAD.Runtime import *
from Autodesk.AutoCAD.ApplicationServices import *
from Autodesk.AutoCAD.EditorInput import *
from Autodesk.AutoCAD.DatabaseServices import *
from Autodesk.AutoCAD.Geometry import *
# Import references from Civil3D
from Autodesk.Civil.ApplicationServices import *
from Autodesk.Civil.DatabaseServices import *
bn = IN[1] #example: "TAN"
LF = IN[2] #exxample: "ZONE*H*"
# missing ... user select nested enttity for the transform matrix
adoc = Application.DocumentManager.MdiActiveDocument
editor = adoc.Editor
xrefGraph = adoc.Database.GetHostDwgXrefGraph(True)
xrefNode = xrefGraph.GetXrefNode(bn)
xrpath = ""
with OpenCloseTransaction() as tr:
xrbr = tr.GetObject(xrefNode.BlockTableRecordId, OpenMode.ForRead)
xrpath = xrbr.GetXrefDatabase(False).Filename
ids = ObjectIdCollection()
with Database(False, True) as db:
db.ReadDwgFile(xrpath, FileShare.ReadWrite, False, "")
xrMsId = SymbolUtilityServices.GetBlockModelSpaceId(db);
with OpenCloseTransaction() as tr:
xrMS = tr.GetObject(xrMsId, OpenMode.ForWrite)
for id in xrMS:
try:
ent = tr.GetObject(id, OpenMode.ForWrite)
if fnmatch.fnmatch(ent.Layer,LF):
# ent.TransformBy(EM);
ids.Add(id)
except:
continue
#
#mapping = IdMapping()
#MsId = SymbolUtilityServices.GetBlockModelSpaceId(adoc.Database)
#db.WblockCloneObjects(ids, MsId, mapping, DuplicateRecordCloning.Ignore, False)
#
#with adoc.LockDocument():
# with adoc.Database as docdb:
# with docdb.TransactionManager.StartTransaction() as t:
# mapping = IdMapping()
# MsId = SymbolUtilityServices.GetBlockModelSpaceId(docdb)
# ms = t.GetObject(MsId,OpenMode.ForWrite)
# db.WblockCloneObjects(ids, MsId, mapping, DuplicateRecordCloning.Ignore, False)
# t.Commit()
OUT = ids
These lines result in Lock Violation error …
mapping = IdMapping()
MsId = SymbolUtilityServices.GetBlockModelSpaceId(adoc.Database)
db.WblockCloneObjects(ids, MsId, mapping, DuplicateRecordCloning.Ignore, False)
And these lines result in error … was not open for write …
with adoc.LockDocument():
with adoc.Database as docdb:
with docdb.TransactionManager.StartTransaction() as t:
mapping = IdMapping()
MsId = SymbolUtilityServices.GetBlockModelSpaceId(docdb)
ms = t.GetObject(MsId,OpenMode.ForWrite)
db.WblockCloneObjects(ids, MsId, mapping, DuplicateRecordCloning.Ignore, False)
t.Commit()
? I have something the wrong way around ?