So working on a pythonic way to get schedules NOT on sheets. there is Collecting Legends and Schedules not on Sheets but that uses nodes, and I am trying to work backwards to a tool I can use in PyREvit.
I have this:
which proves this works:
b=[1,3,5,6,7,8]
a=[1,2,3]
c=[element for i, element in enumerate(b) if element not in a]
OUT=c
The VSH_OFF Isn’t returning the difference
(The 2nd #VSH_OFF line is with out the ‘i’ - is this an enumerator for the list position as it steps?)
##Insipred from
##https://forum.dynamobim.com/t/collecting-legends-and-schedules-not-on-sheets/20538/2
##Apsis0215 R Allen 2022-09-28 CPy3
import clr
clr.AddReference("RevitServices")
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument ##Current Document
#clr.AddReference("RevitNodes")
import Revit
#clr.ImportExtensions(Revit.Elements)
#clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import FilteredElementCollector,ScheduleSheetInstance,ViewSchedule
PlacedSchedules = FilteredElementCollector(doc).OfClass(ScheduleSheetInstance).WhereElementIsNotElementType().ToElements()
PlacedSchedulesID=[ VID.Id.IntegerValue for VID in PlacedSchedules]
AllSchedules = FilteredElementCollector(doc).OfClass(ViewSchedule).WhereElementIsNotElementType().ToElements()
AllSchedulesID =[ VID.Id.IntegerValue for VID in AllSchedules]
##https://stackoverflow.com/questions/33577790/exclude-items-from-list-of-lists-python
##VSH_OFF should be all elements NOT matching
VSH_OFF=[element for i, element in enumerate(AllSchedulesID) if element not in PlacedSchedulesID]
#VSH_OFF=[element for element in AllSchedulesID if element not in PlacedSchedulesID]
#vsh_ON=[]
HostSheets = [doc.GetElement(VID.get_OwnerViewId()) for VID in PlacedSchedules] ##Get host sheet for each schedsheet
#for vsh in AllSchedulesID:
# if vsh in PlacedSchedulesIDs:
# vsh_ON.append(vsh)
# else:
# VSH_OFF.append(vsh)
OUT=PlacedSchedulesID,AllSchedulesID,VSH_OFF ##PlacedSchedulesIDs,AllSchedulesID
Tried a couple of ways now - but no dice- any suggestions?
and is CPy3 going to work in PyRevit?(Anyone know yet?)
Pyrevit supports CPython3 if you add this to the top of your py file:
#!python3
Also try getting the schedule’s type Id instead. This should work I think…
# Made by Gavin Crump
# Free for use
# BIM Guru, www.bimguru.com.au
# Boilerplate text
import clr
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
# Current doc/app/ui
doc = DocumentManager.Instance.CurrentDBDocument
# Define list/unwrap list functions
schedTypes = FilteredElementCollector(doc).OfClass(ViewSchedule).ToElements()
schedInsts = FilteredElementCollector(doc).OfClass(ScheduleSheetInstance).ToElements()
instIds = [s.ScheduleId for s in schedInsts]
unused = []
for s in schedTypes:
if s.Id not in instIds:
unused.append(s)
# Preparing output to Dynamo
OUT = unused
##Insipred from
##https://forum.dynamobim.com/t/collecting-legends-and-schedules-not-on-sheets/20538/2
##Apsis0215 R Allen 2022-09-28 CPy3
import clr
clr.AddReference("RevitServices")
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument ##Current Document
#clr.AddReference("RevitNodes")
import Revit
#clr.ImportExtensions(Revit.Elements)
#clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import FilteredElementCollector,ScheduleSheetInstance,ViewSchedule
PlacedSchedules = FilteredElementCollector(doc).OfClass(ScheduleSheetInstance).WhereElementIsNotElementType().ToElements()
PlacedSchedulesID=[VID.ScheduleId for VID in PlacedSchedules]
AllSchedules = FilteredElementCollector(doc).OfClass(ViewSchedule).WhereElementIsNotElementType().ToElements()
AllSchedulesID =[VID.Id for VID in AllSchedules]
##https://stackoverflow.com/questions/33577790/exclude-items-from-list-of-lists-python
##VSH_OFF should be all elements NOT matching
VSH_OFF=[sched for sched in AllSchedulesID if sched not in PlacedSchedulesID]
#VSH_OFF=[element for element in AllSchedulesID if element not in PlacedSchedulesID]
#vsh_ON=[]
HostSheets = [doc.GetElement(VID.get_OwnerViewId()) for VID in PlacedSchedules] ##Get host sheet for each schedsheet
#for vsh in AllSchedulesID:
# if vsh in PlacedSchedulesIDs:
# vsh_ON.append(vsh)
# else:
# VSH_OFF.append(vsh)
OUT=PlacedSchedulesID,AllSchedulesID,VSH_OFF ##PlacedSchedulesIDs,AllSchedulesID
Take a look at the changed I made to this part as well. I don’t think you were getting the correct ScheduleId from the instances.
If you think about this as an expanded loop, you will see where it broke down, which is basically what @GavinCrump showed in his example now that I actually look at it.
This will wrap up to:
VSH_OFF = [s for s in schedTypes if s.Id not in instIds]
Pretty version cleaned up with meaningful names : )
#!python3 ##Code pre-directive untested!
##Apsis0215 R Allen 2022-09-28 CPy3
import clr
clr.AddReference("RevitServices")
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument ##Current Document
import Revit
from Autodesk.Revit.DB import FilteredElementCollector,ScheduleSheetInstance,ViewSchedule
PlacedSchedules = FilteredElementCollector(doc).OfClass(ScheduleSheetInstance).WhereElementIsNotElementType().ToElements()
PlacedSchedulesName = [PSS.Name for PSS in PlacedSchedules]
PlacedSchedulesID=[VID.ScheduleId for VID in PlacedSchedules]
AllSchedules = FilteredElementCollector(doc).OfClass(ViewSchedule).WhereElementIsNotElementType().ToElements()
AllSchedulesID =[VID.Id for VID in AllSchedules]
##https://stackoverflow.com/questions/33577790/exclude-items-from-list-of-lists-python
SchedNotPlaced=[element for element in AllSchedulesID if element not in PlacedSchedulesID]
SchedNotPlaced=[doc.GetElement(VSHID) for VSHID in SchedNotPlaced]
SchedNotPlacedNames=[NPS.Name for NPS in SchedNotPlaced]
HostSheet = [doc.GetElement(VID.get_OwnerViewId()) for VID in PlacedSchedules] ##Get host sheet for each schedsheet
HostSheetsName=[HS.Name for HS in HostSheet] ##REturn host sheet name for
OUT=PlacedSchedulesName,HostSheetsName,SchedNotPlacedNames ##PlacedSchedulesIDs,AllSchedulesID