明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1896|回复: 2

菜鸟求助,Database 的saveas报错

[复制链接]
发表于 2013-3-3 16:52:41 | 显示全部楼层 |阅读模式
  1. Imports Autodesk.AutoCAD.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



  52.         Catch ex As Exception

  53.         Finally

  54.             '提交事务,释放资源
  55.             trans.Commit()

  56.             trans.Dispose()

  57.             TrimEdge.Dispose()

  58.             JZD.Dispose()

  59.             docLock.Dispose()

  60.             db.Dispose()

  61.         End Try

  62.     End Sub
  63.     '''
  64.     ''' 创建多段线
  65.     '''
  66.     ''' 点集
  67.     ''' 是否闭合
  68.     '''
  69.     '''
  70.     Private Function CreatePolyline(ByVal ptColl As Point3dCollection, ByVal bl As Boolean) As Polyline

  71.         Dim pline As New Polyline

  72.         For i As Integer = 0 To ptColl.Count - 1

  73.             pline.AddVertexAt(i, ptColl(i).Convert2d(New Plane()), 0, 0, 0)

  74.         Next

  75.         pline.Closed = bl

  76.         Return pline

  77.     End Function
  78. End Class
开发环境:VS2008+.NET2.0+CAD2006
代码如上,这个是一个裁剪程序里面一小段,裁剪的主题部分已差不多了,我是准备new数据库来保存的,可是保存出错了,详细描述在注释里。希望高手们指导一下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2014-4-24 23:14:42 | 显示全部楼层
请高手回答下,我也遇到!
发表于 2014-4-27 23:42:56 | 显示全部楼层
已经搞定,原来是新建的DataBase没有BlockTable,需要先载入一个模板文件!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 08:26 , Processed in 0.163408 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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