明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2288|回复: 9

如何插入一个已定义于dwg之外的块

[复制链接]
发表于 2012-8-25 12:11:42 来自手机 | 显示全部楼层 |阅读模式
如巳定义好一个块文件,现需插入进新建图内,看了好多贴子,都是在本图内新建一个块.与我的要求不一样,求一个通用函数,

 楼主| 发表于 2012-8-27 11:28:03 来自手机 | 显示全部楼层
就如insert命令,从外部选择一个图块插入,这里真冷清,没办法,c#太菜,求助高手明示一下,谢谢了.
发表于 2012-8-27 12:02:25 | 显示全部楼层
  1.         public static ObjectId m_ImportBlock(string fileName, string blockName, bool bReplace)
  2.         {
  3.             ObjectId destId = mFun.m_GetBlockId(blockName);
  4.             if (destId.IsNull)
  5.             {
  6.                 using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())//记住一定要先锁定文档
  7.                 {
  8.                     using (Database sourceDb = new Database(false, false))
  9.                     {
  10.                         sourceDb.ReadDwgFile(fileName.Trim(), FileShare.Read, true, null);

  11.                         //destId = mCommands.m_db.Insert(blockName, sourceDb, false);//错误?!?!块自参照???!!!

  12.                         destId = m_ImportBlock(sourceDb, blockName, bReplace);

  13.                         sourceDb.CloseInput(true);
  14.                     }
  15.                 }
  16.             }

  17.             return destId;
  18.         }
  19.         public static ObjectId m_ImportBlock(Database sourceDb, string blockName, bool bReplace)
  20.         {
  21.             ObjectId destId = ObjectId.Null;
  22.             using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
  23.             {
  24.                 using (Transaction sourceTr = sourceDb.TransactionManager.StartTransaction())
  25.                 {
  26.                     BlockTable sourceBt = sourceTr.GetObject(sourceDb.BlockTableId, OpenMode.ForRead) as BlockTable;

  27.                     if (sourceBt.Has(blockName))
  28.                     {
  29.                         ObjectId sourceId = sourceBt[blockName];

  30.                         IdMapping idmap = new IdMapping();
  31.                         sourceDb.WblockCloneObjects(
  32.                             new ObjectIdCollection(new ObjectId[] { sourceId }),
  33.                             HostApplicationServices.WorkingDatabase.BlockTableId,
  34.                             idmap,
  35.                             bReplace == true ? DuplicateRecordCloning.Replace : DuplicateRecordCloning.MangleName,
  36.                             false);

  37.                         destId = idmap[sourceId].Value;
  38.                     }

  39.                     sourceTr.Commit();
  40.                 }
  41.             }

  42.             return destId;
  43.         }

评分

参与人数 2明经币 +2 收起 理由
鱼与熊掌 + 1 很给力!代码很优秀
xgr + 1 很给力!

查看全部评分

 楼主| 发表于 2012-8-27 13:28:12 来自手机 | 显示全部楼层
就如insert命令,从外部选择一个图块插入,这里真冷清,没办法,c#太菜,求助高手明示一下,谢谢了.
 楼主| 发表于 2012-8-27 17:02:29 来自手机 | 显示全部楼层
mkhsj928 发表于 2012-8-27 12:02

发现三个错误
1 当前下文中不存在名称"mFun";
2 “WblockCloneObjects”方法没有任何重载采用五个参数;
3 无法将带[]的索引应于"Autodesk.Autocad.DatabaseServices.Idmapping"
发表于 2012-8-28 09:49:20 | 显示全部楼层
xgr 发表于 2012-8-27 17:02
发现三个错误
1 当前下文中不存在名称"mFun";
2 “WblockCloneObjects”方法没有任何重载采用五个参数 ...

1."ObjectId destId = mFun.m_GetBlockId(blockName);
             if (destId.IsNull)"——可以不要,作用是检查当前图形中是否已存在同名块.
2."WblockCloneObjects"出现错误?你的CAD版本是不是低了?
3.怀疑你的CAD版本低了,请用08以上版本
 楼主| 发表于 2012-8-28 10:40:16 | 显示全部楼层
是否可以换个版本
我是CAD2006+VS2010+NET3.5
没办法,有些软件必须用CAD2006
发表于 2012-8-28 10:46:40 | 显示全部楼层
主要是WblockCloneObjects这个函数了,你用06版重新编译,看看06版的这个函数的参数,修改试试看
电脑里面没06版了,所以不好改
发表于 2012-9-9 11:46:58 | 显示全部楼层
本帖最后由 single-yu 于 2012-9-9 11:47 编辑

我用的就是CAD2006+VS2005,一直都用的很正常,你试试我的这个代码:
我的程序是这样的,在外部建个DWG文件作为模板,每次调用它插入到图形中,并作修改!
  1.                         '开始当前文档的事务处理
  2.                         Using trans As Transaction = curDb.TransactionManager.StartTransaction
  3.                             '新建临时数据库来读取点之记模板
  4.                             Dim tempDb As New Database(False, True)
  5.                             '新建数据库来生成点之记
  6.                             Dim db As New Database(False, True)
  7.                             '使用多边形框来选择范围内的实体
  8.                             Dim resSel As PromptSelectionResult = ed.SelectCrossingPolygon(ptColl)
  9.                             Dim sSet As SelectionSet = resSel.Value
  10.                             Dim Ids As ObjectIdCollection = New ObjectIdCollection(sSet.GetObjectIds)
  11.                             Ids.Add(pLine.ObjectId)
  12.                             db = curDb.Wblock(Ids, curDb.Ucsorg)

  13.                             '读取点之记模板
  14.                             Dim fileName As String = "C:\Program Files\AcadTool\测量工具箱\TP.dwg" '模板文件的位置
  15.                             If System.IO.File.Exists(fileName) Then
  16.                                 tempDb.ReadDwgFile(fileName, System.IO.FileShare.Read, True, Nothing)
  17.                                 tempDb.CloseInput(True)
  18.                                 '插入点之记模板文件到数据库
  19.                                 db.Insert(System.IO.Path.GetFileNameWithoutExtension(fileName), tempDb, True)

  20.                                 '开始点之记数据库的事务处理
  21.                                 Using atrans As Transaction = db.TransactionManager.StartTransaction
  22.                                     Dim bt As BlockTable = atrans.GetObject(db.BlockTableId, OpenMode.ForWrite)

  23.                                     If bt.Has("TP") = False Then
  24.                                         Return
  25.                                     End If

  26.                                     Dim block As BlockTableRecord = atrans.GetObject(bt.Item("TP"), OpenMode.ForWrite)

  27.                                     '字体样式
  28.                                     Dim tst As TextStyleTable = TryCast(atrans.GetObject(db.TextStyleTableId, OpenMode.ForWrite), TextStyleTable)

  29.                                     '添加TP点点名
  30.                                     Dim tpName As New DBText
  31.                                     '在点之记中加入作业员
  32.                                     Dim workmanText As New DBText
  33.                                     '在点之记中加入检查员
  34.                                     Dim checkmanText As New DBText
  35.                                     '在点之记中加入说明
  36.                                     Dim typeText As New MText


  37.                                     tpName.TextString = "TP" & num.ToString
  38.                                     tpName.Position = New Point3d(-30, -69, 0)
  39.                                     tpName.Height = 4
  40.                                     tpName.TextStyle = atrans.GetObject(tst.Item("宋体"), OpenMode.ForWrite).ObjectId

  41.                                     workmanText.TextString = pointMarkPalette.textboxWorkMan.Text
  42.                                     workmanText.Position = New Point3d(-55.65, -100.32, 0)
  43.                                     workmanText.Height = 4
  44.                                     workmanText.TextStyle = atrans.GetObject(tst.Item("宋体"), OpenMode.ForWrite).ObjectId

  45.                                     checkmanText.TextString = pointMarkPalette.textboxCheckMan.Text
  46.                                     checkmanText.Position = New Point3d(-2.86, -100.32, 0)
  47.                                     checkmanText.Height = 4
  48.                                     checkmanText.TextStyle = atrans.GetObject(tst.Item("宋体"), OpenMode.ForWrite).ObjectId

  49.                                     typeText.Contents = "1、实地砸有" & pointMarkPalette.typeCbo.Text & ",并涂有红油漆。"
  50.                                     typeText.Location = New Point3d(-49.235, -137.553, 0)
  51.                                     typeText.TextHeight = 4
  52.                                     typeText.TextStyle = atrans.GetObject(tst.Item("宋体"), OpenMode.ForWrite).ObjectId


  53.                                     block.AppendEntity(tpName)
  54.                                     block.AppendEntity(workmanText)
  55.                                     block.AppendEntity(checkmanText)
  56.                                     block.AppendEntity(typeText)

  57.                                     atrans.AddNewlyCreatedDBObject(tpName, True)
  58.                                     atrans.AddNewlyCreatedDBObject(workmanText, True)
  59.                                     atrans.AddNewlyCreatedDBObject(checkmanText, True)
  60.                                     atrans.AddNewlyCreatedDBObject(typeText, True)

  61.                                     Dim blockref As BlockReference = New BlockReference(pt, bt.Item("TP"))
  62.                                     '点之记根据比例尺缩小或者放大
  63.                                     blockref.ScaleFactors = New Scale3d(ScaleFlector)
  64.                                     blockref.Rotation = 0
  65.                                     Dim btr As BlockTableRecord = atrans.GetObject(bt.Item(BlockTableRecord.ModelSpace), OpenMode.ForWrite)

  66.                                     btr.AppendEntity(blockref)
  67.                                     atrans.AddNewlyCreatedDBObject(blockref, True)
  68.                                     atrans.Commit()
  69.                                 End Using

  70.                             End If
  71.                             '把临时存取模板的数据库销毁
  72.                             tempDb.Dispose()
  73.                             '保存各个点之记
  74.                             db.SaveAs(pointMarkPalette.saveFileName & "TP" & num.ToString & ".dwg", DwgVersion.Current)
  75.                             '提交事务处理
  76.                             trans.Commit()
  77.                         End Using

虽然你用的是C#,主要体会里面的方法就行了,我一直都用这个方法!

评分

参与人数 1明经币 +1 收起 理由
xgr + 1 赞一个!

查看全部评分

 楼主| 发表于 2012-9-26 15:32:39 | 显示全部楼层
好久没来啦,解决了,谢谢大家参与!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 17:25 , Processed in 0.169059 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表