乐筑天下

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

如何在不将指定布局设置为当前布局的情况下,在该布局上新建视口?

[复制链接]

3

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
17
发表于 2012-5-6 23:30:00 | 显示全部楼层 |阅读模式
如何在不将指定布局设置为当前布局的情况下(布局切换起来速度比较慢),在该布局上新建视口?
通过第一个sub创建布局,然后由第二个sub在该布局上创建视口。可是,可以由第二个sub在第一个过程中生成的布局上画直线等对象,但无法创建创建视口,为何?又试了一下可以通过第二个sub在已经存在的指定布局(非程序生成的)上创建视口,貌似同一个程序运行过程中生成的布局只生成在内存中,而没有生成在记录中。请高人指点。一下是部分代码:
    Public Sub CreatLayouts(ByVal VPNo As Double, ByRef acLytBTRId As ObjectId)
        Dim acCurDb As Database = HostApplicationServices.WorkingDatabase
        Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
        Dim layoutId As ObjectId
        Dim acLayout As Layout
        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            Dim acLayoutMgr As LayoutManager
            acLayoutMgr = LayoutManager.Current
            layoutId = acLayoutMgr.CreateLayout("VP" & VPNo)
            acLayout = Trans.GetObject(layoutId, OpenMode.ForWrite)
            acLytBTRId = acLayout.BlockTableRecordId()
            acTrans.Commit()
        End Using
    End Sub

   Public Sub CreateFloatingViewport(ByVal ViewPortParab As VPpara, ByVal Vwidth As Double, ByVal Vheight As Double, _
                                      ByVal BkTbRdId As ObjectId, ByVal VP_layer As ObjectId)
        Dim acCurDb As Database = HostApplicationServices.WorkingDatabase
        Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
        Dim acLayout As Layout
        Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
            Dim acBlkTbl As BlockTable
            acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead)
            Dim acBlkTblRec As BlockTableRecord
            acBlkTblRec = acTrans.GetObject(BkTbRdId, OpenMode.ForWrite)
            Dim LineEnt As New Line(New Point3d(0, 500 / 2, 0.0), New Point3d(0, -500 / 2, 0.0))
            acBlkTblRec.AppendEntity(LineEnt)
            acTrans.AddNewlyCreatedDBObject(LineEnt, True)
            Dim acVport As Viewport = New Viewport()
            acVport.SetDatabaseDefaults()
            acVport.CenterPoint = New Point3d(Vwidth / 2, Vheight / 2, 0)
            acVport.Width = Vwidth
            acVport.Height = Vheight
            acVport.TwistAngle = ViewPortParab.Slopeangle
            acVport.ViewCenter = New Point2d(ViewPortParab.x_coordinate * Math.Cos(-ViewPortParab.Slopeangle) + ViewPortParab.y_coordinate * Math.Sin(-ViewPortParab.Slopeangle), -ViewPortParab.x_coordinate * Math.Sin(-ViewPortParab.Slopeangle) + ViewPortParab.y_coordinate * Math.Cos(-ViewPortParab.Slopeangle))
            acVport.ViewHeight = Vheight * ViewPortParab.Plotscale
            acVport.LayerId = VP_layer
            acBlkTblRec.AppendEntity(acVport)
            acTrans.AddNewlyCreatedDBObject(acVport, True)
            acVport.On = True
            acTrans.Commit()
        End Using
    End Sub
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2012-5-7 09:45:00 | 显示全部楼层
通过第一个sub创建布局,然后由第二个sub在该布局上创建视口。可是,可以由第二个sub在第一个过程中生成的布局上画直线等对象,但无法创建创建视口
---------------------------------
感觉你这里两句话说的同一个意思。你当前第二个sub没有创建布局也没有调用第一个sub
或许你要注意AppendEntity 或 AddNewlyCreatedDBObject
回复

使用道具 举报

3

主题

5

帖子

1

银币

初来乍到

Rank: 1

铜币
17
发表于 2012-5-7 22:22:00 | 显示全部楼层
非常感谢!请问创建布局需要用到AppendEntity 或 AddNewlyCreatedDBObject吗?
运行第一个sub可以创建布局(比如VP1,VP2等),但当运行到第二个sub时却无法在布局上生成视口。我是通过在两个sub之间传递指定布局的BlockTableRecordId来实现此功能,我尝试了一下可以通过该方法在布局中生成直线等对象,但就是无法创建视口。难道对于新创建的布局必须将布局设为current才能创建视口吗?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-6-29 19:14 , Processed in 0.998571 second(s), 59 queries .

© 2020-2025 乐筑天下

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