Hello pyRevit community
I´m at the very start of transforming all my dynamo graphs to python code.
So why not ask some python experts what I´m doing wrong, what could be done better, what has to be avoided, what i have to keep in mind. Especially, what can I do easyer by importing pyrevit methods.
So please let´s take a look at my first, working, larger script that runs the following tasks:
- Filter Selection (Views/Legends/Schedules/Sectionlines)
- Duplicate Views/Legends/Schedules
- Places them on Sheets
- Sets Types, Locations,…
- Sets Detail Numbers
- Read/Write csv log
- Throw Taskdialogs
Am I importing properly?
Am I wasting time somewhere?
It took me forever to create my csv read/write method, and now i see pyRevit has this implemented. Should i switch to the pyRevit method? Are there other important pyRevit methods(?)/modules(?) I should use, that are a must have for every workflow?
Would really appreciate any help at getting better, don´t be kind!
Kind Regards!
# -*- coding: utf-8 -*-
__doc__ = "TestText"
__title__ = "Duplicate"
__author__ = "Gerhard"
import io
import csv
import clr
import sys
import time
st = time.time()
from pyrevit import script
from pyrevit import forms
from pyrevit import EXEC_PARAMS
sys.path.append('C:\Program Files (x86)\IronPython 2.7\Lib')
import System
from System import Array
from System.Collections.Generic import *
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference("RevitServices")
import RevitServices
from Autodesk.Revit.UI import TaskDialog, TaskDialogCommonButtons, TaskDialogResult, TaskDialogCommandLinkId, TaskDialogIcon
from datetime import datetime, timedelta
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
clr.AddReference("RevitAPI")
clr.AddReference("RevitAPIUI")
import Autodesk
from Autodesk.Revit import DB
from Autodesk.Revit.DB import (FamilySymbol,Viewport, XYZ, UnitTypeId, UnitUtils, ViewDuplicateOption, SpecTypeId, FilteredElementCollector, ParameterValueProvider, Element, View, ViewType, ElementId, ElementParameterFilter, FilterElementIdRule, BuiltInParameter, BuiltInCategory)
doc = __revit__.ActiveUIDocument.Document
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application
uidoc = uiapp.ActiveUIDocument
now = datetime.now()
StartTimeFormat = "%X"
StartDateformat = "%d.%m.%Y"
StartTime = now.strftime(StartTimeFormat)
StartDate = now.strftime(StartDateformat)
FileName = script.get_bundle_name()
RevitFileName = doc.Title
app = DocumentManager.Instance.CurrentUIApplication.Application
User = app.Username
LogFilePath = "C:\Users\...\Desktop\Test.csv"
def CurrentSelection():
selid = uidoc.Selection.GetElementIds()
return [doc.GetElement(id) for id in selid]
def FilterViewports():
viewportlist = []
for element in elements:
if element.Category.Id == ElementId(BuiltInCategory.OST_Viewports):
viewportlist.append(element)
return viewportlist
def FilterSectionlines():
sectionlineslist = []
for element in elements:
string = element.ToString()
if element.Category.Id == ElementId(BuiltInCategory.OST_Viewers) and string == "Autodesk.Revit.DB.Element":
sectionlineslist.append(element)
return sectionlineslist
def FilterSchedules():
outlist = []
for element in elements:
if element.Category.Id == ElementId(BuiltInCategory.OST_ScheduleGraphics):
outlist.append(element)
return outlist
def ScheduleViews():
outlist = []
for ScheduleGraphic in ScheduleGraphics:
ScheduleView = doc.GetElement(ScheduleGraphic.ScheduleId)
outlist.append(ScheduleView)
return outlist
def ViewFromViewports():
ViewFromViewportList = []
for viewport in viewports:
viewId = viewport.ViewId
ViewFromViewportList.append(doc.GetElement(viewId))
return ViewFromViewportList
def ViewFromSectionLine():
viewlist = []
views = FilteredElementCollector(doc).OfClass(View).ToElements()
for element in elements:
for view in views:
if element.Name == view.Name:
viewlist.append(view)
return viewlist
def ViewportFromSectionLine():
viewportlist = []
viewports = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Viewports).WhereElementIsNotElementType().ToElements()
for view in ViewFromSectionLine:
viewId = view.Id
for viewport in viewports:
viewportId = viewport.ViewId
if viewportId == viewId:
viewportlist.append(viewport)
return viewportlist
def DuplicateViews(views):
myNewViews = []
for v in views:
if v.ViewType == ViewType.Legend:
option = ViewDuplicateOption.WithDetailing
elif FileName == "WithDetailing.pushbutton":
option = ViewDuplicateOption.WithDetailing
elif FileName == "Duplicate.pushbutton":
option = ViewDuplicateOption.Duplicate
newview = v.Duplicate(option)
myNewView = doc.GetElement(newview)
myNewViews.append(myNewView)
return myNewViews
def DuplicateSchedules(views):
myNewViews = []
option = ViewDuplicateOption.Duplicate
for v in views:
newview = v.Duplicate(option)
myNewView = doc.GetElement(newview)
myNewViews.append(myNewView)
return myNewViews
def DuplicateLegends():
option = ViewDuplicateOption.WithDetailing
myNewLegends = []
for v in ViewFromViewports:
newview = v.Duplicate(option)
myNewLegend = doc.GetElement(newview)
myNewLegends.append(myNewLegend)
return myNewLegends
def ConvertUnits(num):
unitType = SpecTypeId.Length
currentDisplayUnits = doc.GetUnits().GetFormatOptions(unitType).GetUnitTypeId()
return UnitUtils.Convert(float(num), UnitTypeId.Millimeters, currentDisplayUnits)
def Offset():
Offset_X= ConvertUnits(20)
Offset_Y= ConvertUnits(-20)
OffsetVec = XYZ(Offset_X,Offset_Y,0)
return OffsetVec
def CreateViewport(views,viewports):
NewViewports = []
sheets = [doc.GetElement(viewport.SheetId) for viewport in viewports]
points = [viewport.GetBoxCenter() + Offset() for viewport in viewports]
for s,v,p in zip(sheets,views,points):
try:
a = Viewport.Create(doc, s.Id,v.Id, p)
except:
a = "View is already placed"
NewViewports.append(a)
return NewViewports
def CreateScheduleInstance(views,viewports):
NewViewports = []
sheets = [doc.GetElement(viewport.OwnerViewId) for viewport in viewports]
points = [viewport.Point + Offset() for viewport in viewports]
for s,v,p in zip(sheets,views,points):
try:
a = ScheduleSheetInstance.Create(doc, s.Id,v.Id, p)
except:
a = "View is already placed"
NewViewports.append(a)
return NewViewports
def GetTypeId(viewports):
ViewportTypeIds = []
for viewport in viewports:
TypeId = viewport.GetTypeId()
ViewportTypeIds.append(TypeId)
return ViewportTypeIds
def SetTypeId(Viewports,ViewportTypeIds):
for Viewport,ViewportTypeId in zip(Viewports, ViewportTypeIds):
Viewport.ChangeTypeId(ViewportTypeId)
def GetViewTitleLocation(viewports):
ViewTitleLocationList = []
for viewport in viewports:
location = viewport.LabelOffset
ViewTitleLocationList.append(location)
return ViewTitleLocationList
def SetViewTitleLocation(Viewports, ViewTitleLocations):
for Viewport, ViewTitleLocation in zip(Viewports, ViewTitleLocations):
Viewport.LabelOffset = ViewTitleLocation
def UserMessage():
taskDialog = TaskDialog("Results")
taskDialog.MainInstruction = "No View selected"
taskDialog.MainContent = "Select a View on a Sheet before running"
taskDialog.TitleAutoPrefix = False
taskDialog.MainIcon = TaskDialogIcon.TaskDialogIconInformation
taskDialog.CommonButtons = TaskDialogCommonButtons.Close #| TaskDialogCommonButtons.Yes
taskDialog.FooterText = "Help"
userinput = taskDialog.Show()
return userinput
def LOG_Entry():
now = datetime.now()
dateformat = "%d.%m.%Y"
timeformat = "%X"
Date = now.strftime(dateformat)
Time = now.strftime(timeformat)
LOG_Entry = Time+"\t"+Date+"\t"+User+"\t"+FileName+"\t"+RevitFileName
return LOG_Entry
def Read_LOG():
retry = 0
max_retries=5
while True:
try:
with io.open(LogFilePath,"r", encoding = "utf-8") as LOGfile:
LOG = LOGfile.read().splitlines()
except OSError:
time.sleep(0.5)
retry += 1
if retry > max_retries:
raise
else:
return LOG
def Write_LOG():
LOG = Read_LOG()
LOG_New_Entry = LOG_Entry()
LOG.append(LOG_New_Entry)
retry = 0
max_retries=5
while True:
try:
with io.open(LogFilePath,"w", encoding = "UTF8", newline='') as LOGfile:
for L in LOG:
writer = csv.writer(LOGfile,delimiter="'")
writer.writerow([L])
except OSError:
time.sleep(0.5)
retry += 1
if retry > max_retries:
raise
else:
return LOG_New_Entry
def CurrentViewports_DetailNumbers(viewports):
CurrentViewports_DetailNumbers = []
for viewport in viewports:
SheetId = viewport.SheetId
Sheet = doc.GetElement(SheetId)
CurrentViewportIDs = Sheet.GetAllViewports()
CurrentViewports= [doc.GetElement(CurrentViewportID) for CurrentViewportID in CurrentViewportIDs]
for CurrentViewport in CurrentViewports:
CurrentViewports_DetailNumber = CurrentViewport.get_Parameter(BuiltInParameter.VIEWPORT_DETAIL_NUMBER).AsString()
try:
integer=int(CurrentViewports_DetailNumber)
CurrentViewports_DetailNumbers.append(integer)
except:
pass
return CurrentViewports_DetailNumbers
def NewViewports_DetailNumbers():
NewViewports_DetailNumbers = []
CurrentViewports_DetailNumbers = []
for NewViewport in NewViewports:
NewViewports_DetailNumber = NewViewport.get_Parameter(BuiltInParameter.VIEWPORT_DETAIL_NUMBER).AsString()
try:
integer=int(NewViewports_DetailNumber)
NewViewports_DetailNumbers.append(integer)
except:
pass
def CreateDetailNumbers():
Final_DetailNumbers = []
MaximumDetailNumber = int(max(CurrentViewports_DetailNumbers))
n = 100
numbers = []
for i in range(MaximumDetailNumber+1, n+1):
numbers.append(i)
for i in numbers:
if str(i) not in CurrentViewports_DetailNumbers:
Final_DetailNumbers.append(str(i))
return Final_DetailNumbers
def SetDetailNumbers():
Final_DetailNumbers = CreateDetailNumbers()
for V, D in zip(NewViewports, Final_DetailNumbers):
set = V.get_Parameter(BuiltInParameter.VIEWPORT_DETAIL_NUMBER).Set(D)
elements = CurrentSelection()
viewports = FilterViewports()
sectionline = FilterSectionlines()
ViewFromSectionLine = ViewFromSectionLine()
ViewportFromSectionLine = ViewportFromSectionLine()
ScheduleGraphics = FilterSchedules()
t = DB.Transaction(doc, 'SampleText')
t.Start()
if viewports:
CurrentViewports_DetailNumbers = CurrentViewports_DetailNumbers(viewports)
ViewFromViewports = ViewFromViewports()
DuplicatedViews = DuplicateViews(ViewFromViewports)
NewViewports = CreateViewport(DuplicatedViews, viewports)
ViewportTypeIds = GetTypeId(viewports)
SetTypeId = SetTypeId(NewViewports,ViewportTypeIds)
ViewTitleLocations = GetViewTitleLocation(viewports)
SetViewTitleLocation = SetViewTitleLocation(NewViewports, ViewTitleLocations)
SetDetailNumbers = SetDetailNumbers()
if ViewportFromSectionLine:
CurrentViewports_DetailNumbers = CurrentViewports_DetailNumbers(ViewportFromSectionLine)
DuplicatedViews = DuplicateViews(ViewFromSectionLine)
NewViewports = CreateViewport(DuplicatedViews, ViewportFromSectionLine)
ViewportTypeIds = GetTypeId(ViewportFromSectionLine)
SetTypeId = SetTypeId(NewViewports,ViewportTypeIds)
ViewTitleLocations = GetViewTitleLocation(ViewportFromSectionLine)
SetViewTitleLocation = SetViewTitleLocation(NewViewports, ViewTitleLocations)
SetDetailNumbers = SetDetailNumbers()
if ScheduleGraphics:
ScheduleViews = ScheduleViews()
DuplicatedSchedules = DuplicateSchedules(ScheduleViews)
NewScheduleGraphics = CreateScheduleInstance(ScheduleViews, ScheduleGraphics)
if not viewports and not ViewportFromSectionLine and not ScheduleGraphics:
UserMessage = UserMessage()
t.Commit()
Write = Write_LOG()
print time.time() - st