feiyyu 发表于 2013-3-3 16:52:41

菜鸟求助,Database 的saveas报错

Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Public Class Class1
   _
   Public Sub DWG()
      Dim ed As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor

      Dim db As Database = HostApplicationServices.WorkingDatabase

      Dim TrimEdge As New Polyline'裁剪边界

      Dim JZD As New Polyline   '界址线

      Dim trans As Transaction = db.TransactionManager.StartTransaction

      Dim docLock As DocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument

      Try

            Dim fillist_JZD() As TypedValue = {New TypedValue(DxfCode.LayerName, "JZD"), _
                                          New TypedValue(70, "1")}

            Dim res_JZD As PromptSelectionResult = ed.SelectAll(New SelectionFilter(fillist_JZD))'选择所有界址线

            If res_JZD.Status = PromptStatus.OK Then

                Dim ss As SelectionSet = res_JZD.Value

                For Each ID_JZD As ObjectId In ss.GetObjectIds

                  JZD = trans.GetObject(ID_JZD, OpenMode.ForRead)

                  Dim minPt As Point3d = JZD.GeomExtents.MinPoint

                  Dim maxPt As Point3d = JZD.GeomExtents.MaxPoint

                  Dim RecPts As New Point3dCollection

                  RecPts.Add(New Point3d((minPt.X + maxPt.X) / 2 - 364, (minPt.Y + maxPt.Y) / 2 - 241, 0))

                  RecPts.Add(New Point3d((minPt.X + maxPt.X) / 2 - 364, (minPt.Y + maxPt.Y) / 2 + 241, 0))

                  RecPts.Add(New Point3d((minPt.X + maxPt.X) / 2 + 364, (minPt.Y + maxPt.Y) / 2 - 241, 0))

                  RecPts.Add(New Point3d((minPt.X + maxPt.X) / 2 + 364, (minPt.Y + maxPt.Y) / 2 + 241, 0))

                  TrimEdge = CreatePolyline(RecPts, True)   '根据界址线外接矩形生成裁剪边界

                  Dim res_Other As PromptSelectionResult = ed.SelectCrossingWindow(TrimEdge.GeomExtents.MinPoint, TrimEdge.GeomExtents.MaxPoint) '根据裁剪边界外接矩形选择实体

                  If res_Other.Status = PromptStatus.OK Then

                        Dim ss1 As SelectionSet = res_Other.Value

                        Dim idColl As ObjectIdCollection = New ObjectIdCollection(ss1.GetObjectIds)

                        Dim ndb As Database = New Database(True, False)'新建数据库

                        Try

                            db.WblockCloneObjects(idColl, ndb.CurrentSpaceId, DuplicateRecordCloning.Replace, False)'不同数据库之间复制实体

                            '裁剪,已经实现了主要实体裁剪

                            ndb.SaveAs("c:\qqqq.dwg", DwgVersion.Current)'在这个位置报错
                            '即时窗口里面出现如下信息:
                            '在 System.AccessViolationException 中第一次偶然出现的“acdbmgd.dll”类型的异常
                            'Forgot to call Dispose? (Autodesk.AutoCAD.DatabaseServices.Polyline): DisposableWrapper
                            'Forgot to call Dispose? (Autodesk.AutoCAD.DatabaseServices.Polyline): DisposableWrapper
                            '如果是从TrimEdge = CreatePolyline(RecPts, True)开始单步,这样不会出错,从这句之后单步会报错。如果是直接运行也会报错。

                        Catch ex As Exception

                        Finally

                            ndb.Dispose()

                        End Try

                  End If

                Next

            End If



      Catch ex As Exception

      Finally

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

            trans.Dispose()

            TrimEdge.Dispose()

            JZD.Dispose()

            docLock.Dispose()

            db.Dispose()

      End Try

    End Sub
    '''
    ''' 创建多段线
    '''
    ''' 点集
    ''' 是否闭合
    '''
    '''
    Private Function CreatePolyline(ByVal ptColl As Point3dCollection, ByVal bl As Boolean) As Polyline

      Dim pline As New Polyline

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

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

      Next

      pline.Closed = bl

      Return pline

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

raohuan 发表于 2014-4-24 23:14:42

请高手回答下,我也遇到!

raohuan 发表于 2014-4-27 23:42:56

已经搞定,原来是新建的DataBase没有BlockTable,需要先载入一个模板文件!
页: [1]
查看完整版本: 菜鸟求助,Database 的saveas报错