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