乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 118|回复: 9

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

[复制链接]
xgr

56

主题

302

帖子

8

银币

中流砥柱

Rank: 25

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

使用道具 举报

xgr

56

主题

302

帖子

8

银币

中流砥柱

Rank: 25

铜币
526
发表于 2012-8-27 11:28:00 | 显示全部楼层
就如insert命令,从外部选择一个图块插入,这里真冷清,没办法,c#太菜,求助高手明示一下,谢谢了.
回复

使用道具 举报

9

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2012-8-27 12:02:00 | 显示全部楼层
  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.         }
回复

使用道具 举报

xgr

56

主题

302

帖子

8

银币

中流砥柱

Rank: 25

铜币
526
发表于 2012-8-27 13:28:00 | 显示全部楼层
就如insert命令,从外部选择一个图块插入,这里真冷清,没办法,c#太菜,求助高手明示一下,谢谢了.
回复

使用道具 举报

xgr

56

主题

302

帖子

8

银币

中流砥柱

Rank: 25

铜币
526
发表于 2012-8-27 17:02:00 | 显示全部楼层

发现三个错误
1 当前下文中不存在名称"mFun";
2 “WblockCloneObjects”方法没有任何重载采用五个参数;
3 无法将带[]的索引应于"Autodesk.Autocad.DatabaseServices.Idmapping"
回复

使用道具 举报

9

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2012-8-28 09:49:00 | 显示全部楼层

1."ObjectId destId = mFun.m_GetBlockId(blockName);
             if (destId.IsNull)"——可以不要,作用是检查当前图形中是否已存在同名块.
2."WblockCloneObjects"出现错误?你的CAD版本是不是低了?
3.怀疑你的CAD版本低了,请用08以上版本
回复

使用道具 举报

xgr

56

主题

302

帖子

8

银币

中流砥柱

Rank: 25

铜币
526
发表于 2012-8-28 10:40:00 | 显示全部楼层
是否可以换个版本
我是CAD2006+VS2010+NET3.5
没办法,有些软件必须用CAD2006
回复

使用道具 举报

9

主题

100

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2012-8-28 10:46:00 | 显示全部楼层
主要是WblockCloneObjects这个函数了,你用06版重新编译,看看06版的这个函数的参数,修改试试看
电脑里面没06版了,所以不好改
回复

使用道具 举报

17

主题

69

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
137
发表于 2012-9-9 11:46:00 | 显示全部楼层

我用的就是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#,主要体会里面的方法就行了,我一直都用这个方法!
回复

使用道具 举报

xgr

56

主题

302

帖子

8

银币

中流砥柱

Rank: 25

铜币
526
发表于 2012-9-26 15:32:00 | 显示全部楼层
好久没来啦,解决了,谢谢大家参与!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 21:10 , Processed in 0.403359 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表