乐筑天下

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

求助 vb.net 无法插入块

[复制链接]

13

主题

29

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2014-6-10 16:41:00 | 显示全部楼层 |阅读模式
做个简单的程序,在cad中插入直线,在直线的端点插入一个块(“断路器”),运行后只能生成直线,却不能插入块
  1. Imports Autodesk..Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.Geometry
  5. Imports Autodesk.AutoCAD.EditorInput
  6. Public Class Class1
  7.      _
  8.     Public Sub AddLine()
  9.         '' 获取当前文档和数据库
  10.         Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  11.         Dim acCurDb As Database = acDoc.Database
  12.         Dim acEditor As Editor = acDoc.Editor
  13.         Using (acDoc.LockDocument)
  14.             '' 启动事务
  15.             Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
  16.                 '' 以读模式打开 块表
  17.                 Dim acBlkTbl As BlockTable
  18.                 acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
  19.                 '' 以写模式打开 块表记录模型空间
  20.                 Dim acBlkTblRec As BlockTableRecord
  21.                 acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
  22.                 OpenMode.ForWrite)
  23.                 '' 拾取点
  24.                 Dim pPtRes As PromptPointResult
  25.                 Dim pPtOpts As PromptPointOptions = New PromptPointOptions("")
  26.                 pPtOpts.Message = vbLf & "Insert Point of Block:"
  27.                 pPtRes = acEditor.GetPoint(pPtOpts)
  28.                 Dim InsertPt As Point3d = pPtRes.Value
  29.                 '' 创建直线
  30.                 Dim acLine As Line = New Line(New Point3d(InsertPt.X, InsertPt.Y, 0), _
  31.                 New Point3d(InsertPt.X + 1000, InsertPt.Y, 0))
  32.                 Dim FilePath As String = "G:\断路器.dwg"
  33.                 Dim FileName As String = "断路器.dwg"
  34.                 Dim BlockName As String = "断路器"
  35.                 Dim Block As BlockReference = New BlockReference(New Point3d(InsertPt.X + 1000, InsertPt.Y, 0), acBlkTbl(BlockName))
  36.                 Block.ScaleFactors = New Scale3d(1, 1, 1)
  37.                 Block.Rotation = 0
  38.                 '' 将新对象添加到块表记录和事务
  39.                 acBlkTblRec.AppendEntity(Block)
  40.                 acTrans.AddNewlyCreatedDBObject(Block, True)
  41.                 acBlkTblRec.AppendEntity(acLine)
  42.                 acTrans.AddNewlyCreatedDBObject(acLine, True)
  43.                 '' 将新对象保存到数据库
  44.                 acTrans.Commit()
  45.             End Using
  46.         End Using
  47.     End Sub
  48. End Class
回复

使用道具 举报

9

主题

23

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
59
发表于 2014-6-10 21:30:00 | 显示全部楼层
如果你当前图面中没有定义"断路器"这个图块,就不可能将"断路器"图块插入到模型空间!
我猜你是想将外部保持的图块插入到当前图面中吧,这个方法可不行啊!
回复

使用道具 举报

13

主题

29

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2014-6-10 21:53:00 | 显示全部楼层
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.DatabaseServices
  4. Imports Autodesk.AutoCAD.Geometry
  5. Imports Autodesk.AutoCAD.EditorInput
  6. Public Class Class1
  7.   
  8.      _
  9.     Public Sub InserBlock()
  10.         Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  11.         Dim acDatabase As Database = acDoc.Database
  12.         Dim acEditor As Editor = acDoc.Editor
  13.         Dim pPtRes As PromptPointResult
  14.         Dim pPtOpts As PromptPointOptions = New PromptPointOptions("")
  15.         pPtOpts.Message = vbLf & "Insert Point of Block:"
  16.         pPtRes = acEditor.GetPoint(pPtOpts)
  17.         Dim InsertPt As Point3d = pPtRes.Value
  18.         If pPtRes.Status = PromptStatus.Cancel Then
  19.             Exit Sub
  20.         End If
  21.         Using (acDoc.LockDocument)
  22.             Using trans As Transaction = acDatabase.TransactionManager.StartTransaction
  23.                 Dim acBlockTable As BlockTable = trans.GetObject(acDatabase.BlockTableId, OpenMode.ForWrite)
  24.                 Dim FilePath As String = "G:\断路器.dwg"
  25.                 Dim FileName As String = "断路器.dwg"
  26.                 Dim BlockName As String = "断路器"
  27.                 If acBlockTable.Has(BlockName) = True Then
  28.                     Dim Block As BlockReference = New BlockReference(InsertPt, acBlockTable(BlockName))
  29.                     Block.ScaleFactors = New Scale3d(1, 1, 1)
  30.                     Block.Rotation = 0
  31.                     Dim ModelSpace As BlockTableRecord = trans.GetObject(acDatabase.CurrentSpaceId, OpenMode.ForWrite)
  32.                     ModelSpace.AppendEntity(Block)
  33.                     trans.AddNewlyCreatedDBObject(Block, True)
  34.                     trans.Commit()
  35.                 Else
  36.                     Dim db As New Database(False, False)
  37.                     'sourceDb.ReadDwgFile("c:\\xxx.dwg", System.IO.FileShare.Read, true, "");
  38.                     db.ReadDwgFile(FilePath, System.IO.FileShare.Read, False, "")
  39.                     Dim id As ObjectId = acDatabase.Insert(FileName, db, False)
  40.                     If id.IsValid = False Then
  41.                         Exit Sub
  42.                     End If
  43.                     Dim Block As BlockReference = New BlockReference(InsertPt, acBlockTable(BlockName))
  44.                     Block.ScaleFactors = New Scale3d(1, 1, 1)
  45.                     Block.Rotation = 0
  46.                     Dim ModelSpace As BlockTableRecord = trans.GetObject(acDatabase.CurrentSpaceId, OpenMode.ForWrite)
  47.                     ModelSpace.AppendEntity(Block)
  48.                     trans.AddNewlyCreatedDBObject(Block, True)
  49.                     trans.Commit()
  50.                 End If
  51.             End Using
  52.         End Using
  53.     End Sub
  54. End Class
断路器图块是个单独的文件。这个代码可以执行。跟第一个例子结合后就不能插入了,不知道为什么,请大家帮忙看看
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2014-6-10 22:49:00 | 显示全部楼层
自己仔细看看上下代码有没有什么不同?
回复

使用道具 举报

13

主题

29

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2014-6-10 22:51:00 | 显示全部楼层
我就看出来几个定义的名字不一样,我都统一了,其他的没看出来,还望明鉴
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2014-6-11 08:46:00 | 显示全部楼层
Dim db As New Database(False, False)
43.                    'sourceDb.ReadDwgFile("c:\\xxx.dwg", System.IO.FileShare.Read, true, "");
44.                    db.ReadDwgFile(FilePath, System.IO.FileShare.Read, False, "")
------------------------------------
一楼代码里面有没有这些?
回复

使用道具 举报

13

主题

29

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2014-6-11 10:55:00 | 显示全部楼层
唉!刚开始学二次开发差的太多了,大概明白这段代码的意思了,如若当前文件包含“断路器块”,就直接插入,如果当前文件不包含块,按照路径打开“断路器块”。显然我的“断路器块”是外部文件,所以我之前的代码不可能成功,晚上我试着改一改。谢谢sieben,热心网友。
回复

使用道具 举报

1

主题

16

帖子

9

银币

初来乍到

Rank: 1

铜币
22
发表于 2015-2-18 00:09:00 | 显示全部楼层

已经试了,这个办法没问题。谢谢!
回复

使用道具 举报

4

主题

22

帖子

4

银币

初来乍到

Rank: 1

铜币
38
发表于 2018-11-29 13:15:00 | 显示全部楼层
自己仔细看看上下代码有没有什么不同?
回复

使用道具 举报

1

主题

17

帖子

3

银币

初来乍到

Rank: 1

铜币
21
发表于 2018-12-10 16:03:00 | 显示全部楼层
初次二开这个问题必然接触啊,我刚开始也琢磨了好几天
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 02:43 , Processed in 0.629068 second(s), 72 queries .

© 2020-2025 乐筑天下

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