乐筑天下

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

菜鸟求助,Database 的saveas报错

[复制链接]

4

主题

7

帖子

2

银币

初来乍到

Rank: 1

铜币
23
发表于 2013-3-3 16:52:00 | 显示全部楼层 |阅读模式
  1. Imports Autodesk..ApplicationServices
  2. Imports Autodesk.AutoCAD.EditorInput
  3. Imports Autodesk.AutoCAD.Runtime
  4. Imports Autodesk.AutoCAD.DatabaseServices
  5. Imports Autodesk.AutoCAD.Geometry
  6. Public Class Class1
  7.      _
  8.    Public Sub DWG()
  9.         Dim ed As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
  10.         Dim db As Database = HostApplicationServices.WorkingDatabase
  11.         Dim TrimEdge As New Polyline  '裁剪边界
  12.         Dim JZD As New Polyline   '界址线
  13.         Dim trans As Transaction = db.TransactionManager.StartTransaction
  14.         Dim docLock As DocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument
  15.         Try
  16.             Dim fillist_JZD() As TypedValue = {New TypedValue(DxfCode.LayerName, "JZD"), _
  17.                                           New TypedValue(70, "1")}
  18.             Dim res_JZD As PromptSelectionResult = ed.SelectAll(New SelectionFilter(fillist_JZD))  '选择所有界址线
  19.             If res_JZD.Status = PromptStatus.OK Then
  20.                 Dim ss As SelectionSet = res_JZD.Value
  21.                 For Each ID_JZD As ObjectId In ss.GetObjectIds
  22.                     JZD = trans.GetObject(ID_JZD, OpenMode.ForRead)
  23.                     Dim minPt As Point3d = JZD.GeomExtents.MinPoint
  24.                     Dim maxPt As Point3d = JZD.GeomExtents.MaxPoint
  25.                     Dim RecPts As New Point3dCollection
  26.                     RecPts.Add(New Point3d((minPt.X + maxPt.X) / 2 - 364, (minPt.Y + maxPt.Y) / 2 - 241, 0))
  27.                     RecPts.Add(New Point3d((minPt.X + maxPt.X) / 2 - 364, (minPt.Y + maxPt.Y) / 2 + 241, 0))
  28.                     RecPts.Add(New Point3d((minPt.X + maxPt.X) / 2 + 364, (minPt.Y + maxPt.Y) / 2 - 241, 0))
  29.                     RecPts.Add(New Point3d((minPt.X + maxPt.X) / 2 + 364, (minPt.Y + maxPt.Y) / 2 + 241, 0))
  30.                     TrimEdge = CreatePolyline(RecPts, True)   '根据界址线外接矩形生成裁剪边界
  31.                     Dim res_Other As PromptSelectionResult = ed.SelectCrossingWindow(TrimEdge.GeomExtents.MinPoint, TrimEdge.GeomExtents.MaxPoint) '根据裁剪边界外接矩形选择实体
  32.                     If res_Other.Status = PromptStatus.OK Then
  33.                         Dim ss1 As SelectionSet = res_Other.Value
  34.                         Dim idColl As ObjectIdCollection = New ObjectIdCollection(ss1.GetObjectIds)
  35.                         Dim ndb As Database = New Database(True, False)  '新建数据库
  36.                         Try
  37.                             db.WblockCloneObjects(idColl, ndb.CurrentSpaceId, DuplicateRecordCloning.Replace, False)  '不同数据库之间复制实体
  38.                             '裁剪,已经实现了主要实体裁剪
  39.                             ndb.SaveAs("c:\qqqq.dwg", DwgVersion.Current)  '在这个位置报错
  40.                             '即时窗口里面出现如下信息:
  41.                             '在 System.AccessViolationException 中第一次偶然出现的“acdbmgd.dll”类型的异常
  42.                             'Forgot to call Dispose? (Autodesk.AutoCAD.DatabaseServices.Polyline): DisposableWrapper
  43.                             'Forgot to call Dispose? (Autodesk.AutoCAD.DatabaseServices.Polyline): DisposableWrapper
  44.                             '如果是从TrimEdge = CreatePolyline(RecPts, True)开始单步,这样不会出错,从这句之后单步会报错。如果是直接运行也会报错。
  45.                         Catch ex As Exception
  46.                         Finally
  47.                             ndb.Dispose()
  48.                         End Try
  49.                     End If
  50.                 Next
  51.             End If        Catch ex As Exception
  52.         Finally
  53.             '提交事务,释放资源
  54.             trans.Commit()
  55.             trans.Dispose()
  56.             TrimEdge.Dispose()
  57.             JZD.Dispose()
  58.             docLock.Dispose()
  59.             db.Dispose()
  60.         End Try
  61.     End Sub
  62.     '''
  63.     ''' 创建多段线
  64.     '''
  65.     ''' 点集
  66.     ''' 是否闭合
  67.     '''
  68.     '''
  69.     Private Function CreatePolyline(ByVal ptColl As Point3dCollection, ByVal bl As Boolean) As Polyline
  70.         Dim pline As New Polyline
  71.         For i As Integer = 0 To ptColl.Count - 1
  72.             pline.AddVertexAt(i, ptColl(i).Convert2d(New Plane()), 0, 0, 0)
  73.         Next
  74.         pline.Closed = bl
  75.         Return pline
  76.     End Function
  77. End Class
开发环境:VS2008+.NET2.0+CAD2006
代码如上,这个是一个裁剪程序里面一小段,裁剪的主题部分已差不多了,我是准备new数据库来保存的,可是保存出错了,详细描述在注释里。希望高手们指导一下

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

9

主题

23

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
59
发表于 2014-4-24 23:14:00 | 显示全部楼层
请高手回答下,我也遇到!
回复

使用道具 举报

9

主题

23

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
59
发表于 2014-4-27 23:42:00 | 显示全部楼层
已经搞定,原来是新建的DataBase没有BlockTable,需要先载入一个模板文件!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:17 , Processed in 0.367529 second(s), 63 queries .

© 2020-2025 乐筑天下

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