taiven 发表于 2012-11-6 13:33:51

关于用VB.NET通过COM连接AUTOCAD2010读取块的问题请教。

各位,有个关于COM连接AUTOCAD的问题请教。
之前我用VB6写了个针对AUTOCAD2010从DWG文件中读取块的程序,现在想升级到VB.NET2010,经过一番折腾后,目前这个问题无法解决,不知道在VB.NET中如何从其他的DWG文件中导入块,然后再加入现在的绘图中。

我使用如下命令调用子程序:
Call GetBlocksFromDwg("d:\abc.dwg", obj_Doc)
obj_Doc的定义如下:
Dim obj_Doc As Autodesk.AutoCAD.Interop.AcadDocument

之前的VB6部分代码:
Private Sub GetBlocksFromDwg(DwgName As String, Target As Object)
Set DbxDoc = obj_Acad.GetInterfaceObject("ObjectDBX.AxDbDocument.18")
DbxDoc.Open DwgName
Dim Objects(0 To 0) As Object
'Set Objects(0) = DbxDoc.Blocks(BlkName)
For Each entry In DbxDoc.Blocks
    Set Objects(0) = DbxDoc.Blocks(entry.Name)
    DbxDoc.CopyObjects Objects, Target.Blocks
Next
End Sub

现在的VB.NET2010的部分代码:
Private Sub GetBlocksFromDwg(ByRef DwgName As String, ByRef Target As Object)
Dim entry As Object
Dim DbxDoc As Object
'On Error GoTo Failed
DbxDoc = obj_Acad.GetInterfaceObject("ObjectDBX.AxDbDocument.18")
DbxDoc.Open(DwgName)
Dim Objects(0) As Object

For Each entry In DbxDoc.Blocks
Objects(0) = DbxDoc.Blocks(entry.Name)
         DbxDoc.CopyObjects(Objects, DbxDoc.Blocks, Type.Missing)
Next entry
End Sub

请告知我该怎么处理呢?多谢了。

sailorcwx 发表于 2012-11-6 17:09:50

写了个c#的
public static void CloneBlock(string blockName, string fromFileName)
      {
            Database fromdb = new Database(false, false);
            fromdb.ReadDwgFile(fromFileName, System.IO.FileShare.Read, true, "");
            Database db = HostApplicationServices.WorkingDatabase;
            Transaction tr = db.TransactionManager.StartTransaction();
            BlockTable fromBt =(BlockTable) tr.GetObject(fromdb.BlockTableId, OpenMode.ForRead);
            if (fromBt.Has(blockName))
            {
                ObjectId blockId = fromBt;
                ObjectIdCollection oic = new ObjectIdCollection();
                oic.Add(blockId);
                BlockTable bt=(BlockTable) tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
                db.WblockCloneObjects(oic, bt.ObjectId, new IdMapping(), DuplicateRecordCloning.Replace,false);
                tr.Commit();
            }
            tr.Dispose();
            fromdb.Dispose();         
      }

taiven 发表于 2012-11-7 23:22:20

Hi, Sailorcwx:
我这是针对COM引用的程序,是一个STANDALONE的EXE,不是基于.NET的引用,所以无法使用那些东西的。

huaxiamengqing 发表于 2012-11-8 12:39:51

最好还是通过.netapi写database.这样方便,如果非要完全使用com那就wblock写出去,然后Insert再插入。具体实现方法去看明经的VBA手册。用.net 而不使用其api(即使你是生成的exe程序)感觉很不可取。

taiven 发表于 2012-11-8 16:26:52

能否告知如何通过COM使用WBLOCK呢?多谢。

huaxiamengqing 发表于 2012-11-8 17:33:29

Application.ActiveDocument.WBlock FileName, SelectionSet
 

FileName

String[字符串]; 仅用于输入
所写新文件名称。

SelectionSet

SelectionSet对象; 仅用于输入
选择集名称。

taiven 发表于 2012-11-9 17:12:33

不理解。我是想从一个DWG文件中读入块,然后在Application.ActiveDocument中根据块名称插入块。
我就是想看看是不是有什么可以替代COPYOBJECTS的,请告知具体,多谢。

齐天大圣3386 发表于 2012-11-9 19:36:42

com方式可以去看一下VBA,好象inster就能以文件的形式插入块。

taiven 发表于 2012-11-10 20:49:53

各位能否给个例程呢?我想从一个DWG文件中读出块,然后在AUTOCAD的当前页面上绘制这个块。
是基于COM和VB.NET的,多谢了。

huaxiamengqing 发表于 2012-11-14 12:49:32

这种级别应该好好去查查VBA手册再来提问- -
页: [1] 2
查看完整版本: 关于用VB.NET通过COM连接AUTOCAD2010读取块的问题请教。