Placing PanelScheduleviews into existing sheets

Hi all,

I’m trying to place panelscheduleviews on existing sheets with the given script.

I retrieved the existing sheets and the panelscheduleviews. Also get the origin point in Dynamo with the node point.by coordinates, could I believe are the inputs that need to use the methods of create a ScheduleSheetInstance or viewport but not of them allows me to place panelscheduleview into sheets. I notice on Revit API we do have a class for Panelschedulesheetinstance but on their inputs do not have any arguments to include a location, so when I run the code, it just creates those but not placing on the sheet. I am using on Revit 2024 and Dynamo 2.19.

Here is the code to create Viewport.

import clr
clr.AddReference('RevitAPI')
clr.AddReference('RevitServices')
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
from Autodesk.Revit.DB import *
clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)

doc = DocumentManager.Instance.CurrentDBDocument

sheets = [UnwrapElement(sheet) for sheet in IN[0]]
views = [UnwrapElement(view) for view in IN[1]]
points = IN[2]

viewports = []

# Start transaction
TransactionManager.Instance.EnsureInTransaction(doc)

# Iterate through sheets, views, and points
for sheet, view, point in zip(sheets, views, points):
    try:
        # Check if view is a PanelScheduleView and can be added to the sheet
        if isinstance(view, View) and view.ViewType == ViewType.PanelSchedule:
            if Viewport.CanAddViewToSheet(doc, sheet.Id, view.Id):
                location = XYZ(point.X, point.Y, point.Z)
                # Create viewport
                viewport = Viewport.Create(doc, sheet.Id, view.Id, location)
                if viewport:
                    wviewport = viewport.ToDSType(False)
                    viewports.append(wviewport)
                else:
                    viewports.append("Failed to create viewport")
            else:
                viewports.append("Cannot add view to sheet")
        else:
            viewports.append("The view is not a PanelScheduleView")
    except Exception as e:
        viewports.append(f"Error creating viewport for sheet {sheet.Id} and view {view.Id}: {e}")

# Regenerate document once after all viewports are created
doc.Regenerate()
TransactionManager.Instance.TransactionTaskDone()
OUT = viewports

and here is for meths to create ScheduleSheetInstance

import clr
clr.AddReference('RevitAPI')
clr.AddReference('RevitServices')
clr.AddReference("RevitAPIUI")
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
import Autodesk
from Autodesk.Revit.UI import *
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Electrical import *
clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application
uidoc = uiapp.ActiveUIDocument

sheets = [UnwrapElement(sheet) for sheet in IN[0]]
views = [UnwrapElement(view) for view in IN[1]]
points = IN[2]

scheduleview = []

# Start transaction
TransactionManager.Instance.EnsureInTransaction(doc)

try:
    # Iterate through sheets, views, and points
    for sheet, view, point in zip(sheets, views, points):
        try:
            # Check if view is a PanelScheduleView and can be added to the sheet
            if isinstance(view, View) and view.ViewType == ViewType.PanelSchedule:
                location = XYZ(point.X, point.Y, point.Z)
                # Create viewschedule
                viewschd = ScheduleSheetInstance.Create(doc, sheet.Id, view.Id, location)
                if viewschd:
                    wviewschd = viewschd.ToDSType(False)
                    scheduleview.append(wviewschd)
                else:
                    scheduleview.append("Cannot add view to sheet")
            else:
                scheduleview.append("The view is not a PanelScheduleView or is an internal schedule")
        except Exception as e:
            scheduleview.append(f"Error creating viewport for sheet {sheet.Id} and view {view.Id}: {e}")
finally:
    # Regenerate document once after all viewports are created
    doc.Regenerate()
    TransactionManager.Instance.TransactionTaskDone()

OUT = scheduleview

and finally, here is for the metod of PanelscheduleSheet Instance

import clr
clr.AddReference('RevitAPI')
clr.AddReference('RevitServices')
from Autodesk.Revit.DB import *
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.Elements)

# Get the current document
doc = DocumentManager.Instance.CurrentDBDocument

# Unwrap inputs
panel_schedule_views = UnwrapElement(IN[0])  # Second input: list of panel schedule view IDs

# Initialize lists to store the IDs and views
panel_schedule_view_ids = []
panel_schedule_views_ = []

# Loop through each Panel Schedule View and get its ID and View
for panel_sch_v in panel_schedule_views:
    panel_sch_v_id = panel_sch_v.Id
    panel_schedule_view_ids.append(panel_sch_v_id)
    panel_schedule_views_.append(panel_sch_v)

# Start a transaction
TransactionManager.Instance.EnsureInTransaction(doc)

# Create multiple Panel Schedule Sheet instances
panel_schedule_sheets = []
for view_id, view_ in zip(panel_schedule_view_ids, panel_schedule_views_):
    panel_schedule_sheet = Electrical.PanelScheduleSheetInstance.Create(doc, view_id, view_)
    W_panel_schedule_sheet = panel_schedule_sheet.ToDSType(False)
    panel_schedule_sheets.append(W_panel_schedule_sheet)

# Commit the transaction
TransactionManager.Instance.TransactionTaskDone()

# Output the Panel Schedule Sheet instances
OUT = panel_schedule_sheets

The last one does not give me any errors, but I am still does not see the panelscheduleviews placing into the sheets.

Is there another method or there something that I am missing in order to achieve this. Any advice I really appreciate. Thanks.

Regards.

Schedules don’t use viewports.

Remarks

Schedule views are not handled by the Viewport class. Refer to [!:Autodesk::Revit::DB::ScheduleSheetInstance::Create()] for information about adding schedules to sheets.

The second error also tells you the issue with your method.

In addition you can use the Origin property

import clr
import sys
import System
#
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
import Autodesk.DesignScript.Geometry as DS

#import Revit API
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
import Autodesk.Revit.DB as DB
from Autodesk.Revit.DB.Electrical import *

#import transactionManager and DocumentManager (RevitServices is specific to Dynamo)
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

panelSchedule = UnwrapElement(IN[0])
sheet = UnwrapElement(IN[1])

title_block = FilteredElementCollector(doc, sheet.Id).OfCategory(BuiltInCategory.OST_TitleBlocks).FirstElement()
bbx_sheet = title_block.get_BoundingBox(sheet)
pt_Top_left = XYZ(bbx_sheet.Min.X, bbx_sheet.Max.Y, bbx_sheet.Min.Z)

TransactionManager.Instance.EnsureInTransaction(doc)
panel_schedule_sheet = PanelScheduleSheetInstance.Create(doc, panelSchedule.Id, sheet)
panel_schedule_sheet.Origin = pt_Top_left

TransactionManager.Instance.TransactionTaskDone()

OUT = panel_schedule_sheet

Thank you. Cyril, yes it works. Much really appreciate

Regards.