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)
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.