Set DetailView to NamedView

Hello,
I have created a Layout with a DetailView. I would like to change the Detailview to the NamedView (“Profil_view”) I created before. I have no idea how to proceed (I have marked the position in code with ###). I thankful for any tips. Here is my code:

import rhinoscriptsyntax as rs
import Rhino
from Rhino.Geometry import PolylineCurve, Point3d
import scriptcontext
import System




def AddLayout(pagename):
    scriptcontext.doc.PageUnitSystem = Rhino.UnitSystem.Millimeters
    page_views = scriptcontext.doc.Views.GetPageViews()
    pageview = scriptcontext.doc.Views.AddPageView(pagename,210, 297)
    pageview.SetPageAsActive()
    scriptcontext.doc.Views.ActiveView = pageview
    scriptcontext.doc.Views.Redraw()
    return pageview
def AddDetailView(page):
    top_left = Rhino.Geometry.Point2d(10,287) #defines the frame size of detail view in new layout
    bottom_right = Rhino.Geometry.Point2d(200,10) #defines the frame size of detail view in new layout
    detail = page.AddDetailView("Top_view", top_left, bottom_right, Rhino.Display.DefinedViewportProjection.Bottom)
    page.SetActiveDetail(detail.Id)
    ###set view to Named View ("Profil_view")###
    detail.Viewport.ZoomExtents()
    detail.DetailGeometry.IsProjectionLocked = False 
    detail.DetailGeometry.SetScale(400, scriptcontext.doc.ModelUnitSystem, 10, scriptcontext.doc.PageUnitSystem) 
    page.SetPageAsActive()

def AddNamedView():
    newView = Rhino.RhinoDoc.ActiveDoc.Views.Add("Profil_view", Rhino.Display.DefinedViewportProjection.Bottom, System.Drawing.Rectangle(0, 0, 200, 600), True) 
    scriptcontext.doc.Views.ActiveView = newView
    rs.RotateView(None,1,90)
    vp = newView.ActiveViewport
    newView.Redraw()
    scriptcontext.doc.NamedViews.Add(vp.Name, vp.Id)

AddNamedView()
page = AddLayout("NewLayout")
AddDetailView(page)

Thank you in advance.

Hi,

I think the below edits will restore the vies as you described.
Note I found the named view in the NamedViews table and restored it to the detail
Also for the changes to take effect you need detail.CommitViewportChanges()

It seems that for the ZoomExtends you need another viewport commit because in my tests it did not seem to work…

import rhinoscriptsyntax as rs
import Rhino
from Rhino.Geometry import PolylineCurve, Point3d
import scriptcontext
import System




def AddLayout(pagename):
    scriptcontext.doc.PageUnitSystem = Rhino.UnitSystem.Millimeters
    page_views = scriptcontext.doc.Views.GetPageViews()
    pageview = scriptcontext.doc.Views.AddPageView(pagename,210, 297)
    pageview.SetPageAsActive()
    scriptcontext.doc.Views.ActiveView = pageview
    scriptcontext.doc.Views.Redraw()
    return pageview
def AddDetailView(page):
    top_left = Rhino.Geometry.Point2d(10,287) #defines the frame size of detail view in new layout
    bottom_right = Rhino.Geometry.Point2d(200,10) #defines the frame size of detail view in new layout
    detail = page.AddDetailView("Top_view", top_left, bottom_right, Rhino.Display.DefinedViewportProjection.Bottom)
    page.SetActiveDetail(detail.Id)
    
    ###set view to Named View ("Profil_view")###
    named_views = scriptcontext.doc.NamedViews
    restore_view = named_views.FindByName("Profil_view")
    named_views.Restore(restore_view, detail.Viewport)
    #CommitViewportChanges
    detail.CommitViewportChanges()
    
    detail.Viewport.ZoomExtents()
    detail.DetailGeometry.IsProjectionLocked = False 
    detail.DetailGeometry.SetScale(400, scriptcontext.doc.ModelUnitSystem, 10, scriptcontext.doc.PageUnitSystem) 
    page.SetPageAsActive()

def AddNamedView():
    newView = Rhino.RhinoDoc.ActiveDoc.Views.Add("Profil_view", Rhino.Display.DefinedViewportProjection.Bottom, System.Drawing.Rectangle(0, 0, 200, 600), True) 
    scriptcontext.doc.Views.ActiveView = newView
    rs.RotateView(None,1,45)
    vp = newView.ActiveViewport
    newView.Redraw()
    scriptcontext.doc.NamedViews.Add(vp.Name, vp.Id)

AddNamedView()
page = AddLayout("NewLayout")
AddDetailView(page)

Thank you very much for the fast response @Willem! Works like a charm. Also the tip with detail.CommitViewportChanges() was perfect. The method needs to be called after detail.Viewport.ZoomExtents() is called, though.

1 Like