sieben
发表于 2013-4-1 23:10:16
09. using (Transaction trans = db.TransactionManager.StartTransaction())
10. {
12. string blockName = "sample"; InsertDwg("test.dwg", ref blockName);
14. trans.Commit();
15. }
将上面代码改为如下试试
string blockName = "";
InsertDwg("D:\\test.dwg", ref blockName);//注意这里要输入文件全名
介之推
发表于 2013-4-1 23:21:08
sieben 发表于 2013-4-1 23:10 static/image/common/back.gif
09. using (Transaction trans = db.TransactionManager.StartTransaction())
10. ...
奇怪,如果采用string blockName = ""; InsertDwg("c:\\TestTwo.dwg", ref blockName);就把TestTwo.dwg中的所有块都拷贝到当前CAD中了。
但是如果采用string blockName = "sample"; InsertDwg("c:\\TestTwo.dwg", ref blockName);就出现了我上面说的错误了。但我在TestTwo.dwg中专门生成了一个名为“sample”的块,我就想要这个块,其他的块不要。
sieben
发表于 2013-4-2 00:00:18
两个函数的作用是不同的,否则我给两个函数干嘛呢?
介之推
发表于 2013-4-2 10:58:17
本帖最后由 介之推 于 2013-4-2 13:55 编辑
sieben 发表于 2013-4-2 00:00 http://bbs.mjtd.com/static/image/common/back.gif
两个函数的作用是不同的,否则我给两个函数干嘛呢?
不是两个函数,都是你给我的第二个函数,只是第一次传入的是个空白字符串,第二次传入的是"sample",是个有内容的字符串。
mkhsj928
发表于 2013-4-2 11:19:24
/// <summary>
/// 在当前图形中导入外部图形中的块,返回块名称
/// </summary>
/// <param name="fileName">外部DWG图形文件(绝对路径)</param>
/// <param name="blockName">待插入的外部图形中的块名称</param>
/// <param name="bReplace">是否覆盖当前图形中的同名块</param>
/// <returns>返回插入到当前文档中的块Id</returns>
public static ObjectId m_ImportBlock(string fileName, string blockName, bool bReplace)
{
ObjectId destId = mFun.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;
}
/// <summary>
/// 从原数据库中导入具有指定块名称的块
/// </summary>
/// <param name="sourceDb">原数据库</param>
/// <param name="blockName">要导入的块的名称</param>
/// <param name="bReplace">是否覆盖同名块</param>
/// <returns></returns>
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;
IdMapping idMap = new IdMapping();
sourceDb.WblockCloneObjects(
new ObjectIdCollection(new ObjectId[] { sourceId }),
HostApplicationServices.WorkingDatabase.BlockTableId,
idMap,
bReplace == true ? DuplicateRecordCloning.Replace : DuplicateRecordCloning.MangleName,
false);
destId = idMap.Value;
}
sourceTr.Commit();
}
}
return destId;
}
介之推
发表于 2013-4-2 13:44:42
mkhsj928 发表于 2013-4-2 11:19 static/image/common/back.gif
你好,mkhsj928
你的第一个函数m_ImportBlock(string, sting,bool)中的第一行代码:ObjectId destId = mFun.m_GetBlockId(blockName);中的函数mFun.m_GetBlockId(string)是如何定义的?
mkhsj928
发表于 2013-4-3 09:56:52
这个可以去掉的!
定义如下/// <summary>
/// 由指定块名称获得块Id
/// </summary>
/// <param name="BlockName"></param>
/// <returns></returns>
public static ObjectId m_GetBlockId(string BlockName)
{
ObjectId blockId = ObjectId.Null;
using (Transaction m_tr = mCommands.m_db.TransactionManager.StartTransaction())
{
BlockTable m_bt = (BlockTable)m_tr.GetObject(mCommands.m_db.BlockTableId, OpenMode.ForRead);
if (m_bt.Has(BlockName)) blockId = m_bt;
//else
//{
// MessageBox.Show(string.Format("指定块名\"{0}\"不存在!", BlockName));
//}
m_tr.Commit();
}
return blockId;
}
j15tty
发表于 2014-6-4 09:50:32
mkhsj928 发表于 2013-4-3 09:56 static/image/common/back.gif
这个可以去掉的!
定义如下
mCommands mfun FileShare指的的是什么类,好像没定义