How to get all the text in a RhinoPageView?

I’m trying to modify Kelvin Cheng’s script that prints one PDF page of each Layouts as a separate file. I want to add to each PDF file’s name suffix of a text object in that layout (it’s a revision note).

I thought of retrieving that text object’s contents by finding it using Rhino.Display.RhinoPageView object, but I can’t seem to find a way to retrieve objects by view.

import Rhino
import scriptcontext as sc
import System.Drawing
import rhinoscriptsyntax as rs

folder = rs.BrowseForFolder()
prefix = "XXXX-XX-XX-XX-XX-X-"
folder += "\\" + prefix

name = "layout_revision"
settings = Rhino.DocObjects.ObjectEnumeratorSettings()
settings.NameFilter = name

def createSinglePDF(view):
    pdf = Rhino.FileIO.FilePdf.Create()
    dpi = 300
    settings = Rhino.Display.ViewCaptureSettings(view, dpi)
    settings.OutputColor = Rhino.Display.ViewCaptureSettings.ColorMode.DisplayColor
    pdf.AddPage(settings)
    filename = folder + view.PageName + '.pdf'
    pdf.Write(filename)

for i in sc.doc.Views:
    if type(i) is Rhino.Display.RhinoPageView:
        createSinglePDF(i)

Hi Daniel,

Does this help:
(PS happy cakeday)

import rhinoscriptsyntax as rs
import scriptcontext as sc
import Rhino

def objects_on_pageview(view):
    
    view_objects = []
    
    view_id = view.ActiveViewportID
    all = rs.AllObjects()
    for obj_id in all:
        robj = rs.coercerhinoobject(obj_id)
        obj_view_id = robj.Attributes.ViewportId
        if obj_view_id == view_id:
            view_objects.append(obj_id)
    return view_objects

for view in sc.doc.Views:
    if type(view) is Rhino.Display.RhinoPageView:
        view_objects = objects_on_pageview(view)
        print view_objects

-Willem

2 Likes

Happy cakeday :cake:

Thanks, yes I didn’t know that view.ActiveViewportID is where PageView’s Id were stored. With that out of the way I’ve managed to customise Kelvin’s script, so that it produces PDFs named following ISO19650-2 schema using text objects on each page’s titleblock. It requires text objects to be put on that particular layer ("titleblock index-AR002") and be named (Project Number, Originator, Zone, Level, Drawing Type, Role, Drawing Number, Drawing Title 1, Drawing Title 2, Drawing Title 3).

import Rhino
import scriptcontext as sc
import System.Drawing
import rhinoscriptsyntax as rs
import os

folder = rs.BrowseForFolder()
titleblock = dict()

def createSinglePDF(view, titleblock):
    pdf = Rhino.FileIO.FilePdf.Create()
    dpi = 300
    settings = Rhino.Display.ViewCaptureSettings(view, dpi)
    settings.OutputColor = Rhino.Display.ViewCaptureSettings.ColorMode.DisplayColor
#    settings.DefaultPrintWidthMillimeters = 0.18
    pdf.AddPage(settings)
    filename = folder + "\\" + titleblock.get("project_number","0000") + "-" + \
                titleblock.get("originator", "00") + "-" + \
                titleblock.get("zone", "00") + "-" + \
                titleblock.get("level", "00") + "-" + \
                titleblock.get("drawing_type", "00") + "-" + \
                titleblock.get("role", "0") + "-" + \
                titleblock.get("drawing_number", "00000") + "_" + \
                titleblock.get("latest_revision", "00") + " " + \
                titleblock.get("drawing_title_1", "000000000") + " " + \
                titleblock.get("drawing_title_2", "") + " " + \
                titleblock.get("drawing_title_3", "") + ".pdf"
    pdf.Write(filename)

for view in sc.doc.Views.GetPageViews():
    for object in sc.doc.Objects.FindByLayer("titleblock index-AR002"):
        if type(object) == Rhino.DocObjects.TextObject and \
            view.ActiveViewportID == object.Attributes.ViewportId:
            if object.Name == "Project Number":
                titleblock["project_number"] = object.DisplayText
            if object.Name == "Originator":
                titleblock["originator"] = object.DisplayText
            if object.Name == "Zone":
                titleblock["zone"] = object.DisplayText
            if object.Name == "Level":
                titleblock["level"] = object.DisplayText
            if object.Name == "Drawing Type":
                titleblock["drawing_type"] = object.DisplayText
            if object.Name == "Role":
                titleblock["role"] = object.DisplayText
            if object.Name == "Drawing Number":
                titleblock["drawing_number"] = object.DisplayText
            if object.Name == "Latest Revision":
                titleblock["latest_revision"] = object.DisplayText
            if object.Name == "Drawing Title 1":
                titleblock["drawing_title_1"] = object.DisplayText
            if object.Name == "Drawing Title 2":
                titleblock["drawing_title_2"] = object.DisplayText
            if object.Name == "Drawing Title 3":
                titleblock["drawing_title_3"] = object.DisplayText
    createSinglePDF(view, titleblock)
1 Like