。BricsCAD V15至V18中的NET WblockCloneObjects(动态块)
您好,Bellow是从其他DWG导入块的典型代码部分。
使用BricsCAD V13、V14和AutoCAD,它也可以完美地处理动态块。
我很惊讶它不适用于BricsCAD V15到V18。
什么原因?如何解决?
ObjectId重要性块(数据库目标Db,字符串源文件名,字符串块名)
{
使用(var源文件名=new Database(false, true))
{
sourceDb.ReadDwgFile(源文件名,FileOpenMode.OpenForReadAndAllShare,假,空);
var id=ObjectId.Null;
使用(var tr=sourceDb.TransactionManager.StartTransaction())
{
var bt=(BlockTable)tr.GetObject(sourceDb.BlockTableId,OpenMode.ForRead);
if(!bt.Has(block Name))
返回ObjectId.Null;
id=bt;
tr.Commit();
}
var id=new ObjectIdCollection();
ids.Add(id);
var映射=new IdMap();
sourceDb.WblockCloneObjects(id,targetDb.BlockTableId,映射,DuplicateRecordCloning.Replace, false);
返回映射. value;
}
}
同样的情况是当我尝试以下代码时:
http://through-the-interface.typepad.com/through_the_interface/2006/08/import_blocks_f.html
在附件中,您可以找到带有动态块的示例源DWG。
提前谢谢你。
**** Hidden Message *****
嗨kiki,
有什么错误?
我不喜欢挑剔,但发布显然曾经工作过的代码,而没有给我们任何错误报告或线索,不会给你带来太多帮助。
如果没有这些信息,您基本上是在要求我们创建一个项目来使用您的代码,然后在可能来自任何地方的绘图上测试它,我知道我没有那么多空闲时间。
有了一些错误消息,除了阅读您的片段之外,有人可能无需做任何进一步的工作就可以看到问题。
让我们知道您尝试了什么以及发生了什么,这将有助于我们帮助您
干杯 嗨,MickD,
BricsCAD V15 - V18只是在blocktable中看不到块名称。
没有错误消息。块不会导入到目标数据库。
此外,Kean的代码在这些BricsCAD版本中也不起作用。
我很惊讶,因为BricsCAD V18在动态块上工作得很好。
所有 AutoCAD 2009 - 2018 和 BricsCAD V13 - V14 都可以正常工作。
好的
您可以在源图中选择并检查这些实体吗?这可能会为如何获得它们进行克隆提供更多线索。还可以与早期版本进行尝试,并进行比较,看看是否有细微的差异。
hth 我的理解是Bricscad对动态块不太好。
我很惊讶13和14没有问题,很好奇你是否能让它工作。
Bricscad 18可以看到块表中的源块,所以块应该显示在那里。 使用WBlockCloneObject导入块时出现问题
我已经测试了sourceDWG。AutoCAD ArxDbg工具中的dwg。请参阅附件
然后我遍历表中的块。请参阅btr。名称生成以下程序:
AutoCAD和BricsCAD V13,V14:
*Model_Space
*Paper_Space0
U2
AD_8GK4851-5KK00i
BricsCAD V15-V18:Model_ Space
*Paper_ Space
这是块未导入的主要原因。 我记得在实现Bricscad时,我不得不为WblockCloneObjects调整代码。如果我没记错的话,我更改了实现DocumentLock的方式,以及 duplicaterecordconcloning 参数。看看这段代码,看看其中是否有对您有帮助的内容。/// 。
///从指定图形中获取块,并将其添加到激活图形的块表中..。
/// 。
/// 块名,。
/// 要从中提取块的dwg/dwt的路径,。
私有静态bool GetBlockFromDWG(string block name,string path)。
{。
使用(Database openDb = new Database(false,true))。
{。
openDb,ReadDwgFile(路径,。
系统,IO.FileShare.ReadWrite,true,“”;。
。
objectid collection ids = new objectid collection();。
使用(Transaction tr = openDb,transaction manager . start transaction())。
{。
var bt = (BlockTable)tr,GetObject(openDb,BlockTableId,OpenMode。for read);。
。
如果(bt,Has(blockName))。
{。
身份证,add(Bt);。
}。
trcommit();。
}。
。
//如果找到,则添加该块。
if (ids,数数!= 0)。
{。
//获取当前图形数据库。
。
使用(DocumentLock acLock = Active,Document.LockDocument())。
{。
id mapping iMap = new id mapping();。
激活,database . WblockCloneObjects(ids,Active。Database.BlockTableId。
iMap,DuplicateRecordCloning。忽略,假);。
。
}。
返回true。
}。
否则。
{。
调试,Print($“在{path}”)中找不到块{ block name };。
返回false。
}。
}。
}。
。
感谢您的回复。
您的代码适用于经典块。
不幸的是,导入动态块(V15-V18)不起作用。
此条件将被绕过,因为BlockTable中没有这样的名称:
if(bt.Has(block Name))
{
ids.Add(bt);
}
即使我删除此条件,动态块也不会导入...
嗨,试一试[命令方法("doit")]。
公共无效doit()。
{。
文档文档=Application.DocumentManager.MdiActiveDocument;。
编辑doc.Editor。
数据库db=doc.Database;。
使用(数据库源Db=新数据库(false, true))。
{。
尝试。
{。
字符串源文件名=@"C:\用户\丹\桌面\D_Block\sourceDWG.dwg";。
sourceDb.ReadDwgFile,System.IO.FileShare.Read, "");。
ObjectIdCollection块=new ObjectIdCollection();。
。
使用(BlockTable bt=(BlockTable)sourceDb.BlockTableId.Open(OpenMode.ForRead))。
{。
foreach(bt中的ObjectId btrId)。
{。
使用(BlockTableRecord btr=(BlockTableRecords)btrId.Open(OpenMode.ForRead))。
{。
如果(btr.IsDynamicBlock)。
blockIds.Add(btrId);。
}。
}。
}。
sourceDb.CloseInput(真);。
使用(IdMap映射=new IdMap())。
{。
mapping.DestinationDatabase目录。
destDb.WblockCloneObjects(块,destDb.BlockTableId,映射,DuplicateRecordCloning.Ignore,false);。
}。
ed.WriteMessage("\n复制"。
+blockIds.Count.ToString()。
+"块定义来自"。
+源文件名。
+"到当前绘图,");。
}。
捕获(System.Exceptionex)。
{。
ed.WriteMessage(\n复制时出错:+ex.Message);。
}。
}。
}。
。
哇!
谢谢。它在V17和V18中工作!
页:
[1]