Hi,Will
I don't use the SDK, I set the configuration manually.
Thanks for your helping.
Anyhow, I still found some code snippets come from other forums.
Here is one that can import blocks from external file.
public static ObjectId m_ImportBlock(string fileName, string blockName, bool bReplace)
{
ObjectId destId = m_GetBlockId(blockName);
if (destId.IsNull)
{
using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())//记住一定要先锁定文档
{
using (Database sourceDb = new Database(false, false))
{
sourceDb.ReadDwgFile(fileName.Trim(), FileShare.Read, true, null);
//destId = mCommands.m_db.Insert(blockName, sourceDb, false);//错误?!?!块自参照???!!!
destId = m_ImportBlock(sourceDb, blockName, bReplace);
sourceDb.CloseInput(true);
}
}
}
return destId;
}
public static ObjectId m_ImportBlock(Database sourceDb, string blockName, bool bReplace)
{
ObjectId destId = ObjectId.Null;
using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
{
using (Transaction sourceTr = sourceDb.TransactionManager.StartTransaction())
{
BlockTable sourceBt = sourceTr.GetObject(sourceDb.BlockTableId, OpenMode.ForRead) as BlockTable;
if (sourceBt.Has(blockName))
{
ObjectId sourceId = sourceBt[blockName];
IdMapping idMap = new IdMapping();
sourceDb.WblockCloneObjects(
new ObjectIdCollection(new ObjectId[] { sourceId }),
HostApplicationServices.WorkingDatabase.BlockTableId,
idMap,
bReplace == true ? DuplicateRecordCloning.Replace : DuplicateRecordCloning.MangleName,
false);
destId = idMap[sourceId].Value;
}
sourceTr.Commit();
}
}
return destId;
}
public static ObjectId m_GetBlockId(string BlockName)
{
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
ObjectId blockId = ObjectId.Null;
using (Transaction m_tr = db.TransactionManager.StartTransaction())
{
BlockTable m_bt = (BlockTable)m_tr.GetObject(db.BlockTableId, OpenMode.ForRead);
if (m_bt.Has(BlockName)) blockId = m_bt[BlockName];
//else
//{
// MessageBox.Show(string.Format("指定块名\"{0}\"不存在!", BlockName));
//}
m_tr.Commit();
}
return blockId;
}
Now, I am trying to specify the insert point to coincide with the blocks' insertpoint.