使用 RevitPythonShell 在活动视图中覆盖图形设置
OverrideGraphicSettings in active view with RevitPythonShell
我正在尝试使用 RevitPythonshell 在 Revit 的 3D 视图中覆盖墙的图形。我设法使用 Python 节点在 Dynamo 中完成这项工作。
到目前为止我有以下代码;
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
from System.Collections.Generic import List
doc = DocumentManager.Instance.CurrentDBDocument
TransactionManager.Instance.EnsureInTransaction(doc)
walls = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls)
elements = walls.OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType()
color = Autodesk.Revit.DB.Color(255,50,50)
ogs = OverrideGraphicSettings().SetProjectionFillColor(color)
for i in elements:
doc.ActiveView.SetElementOverrides((i.Id), ogs)
TransactionManager.Instance.TransactionTaskDone()
当我在 Revit运行 中 PythonShell 它什么都不做。我没有得到任何错误或任何东西。当我打印 doc.ActiveView.SetElementOverrides((i.Id), ogs)
它时 returns None。
我在这里错过了什么?我在 Revit 的 3D 视图中,这是活动视图。我正在开始和结束交易。
Here 与 Dynamo 节点中的 Python 节点中的代码有些相同。
通过一些调整,您的代码可以工作:
import clr
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
app = __revit__.Application
doc = __revit__.ActiveUIDocument.Document
elements = list(FilteredElementCollector(doc, doc.ActiveView.Id))
color = Color(255,50,50)
ogs = OverrideGraphicSettings().SetProjectionFillColor(color)
t = Transaction(doc, 'Color Walls')
t.Start()
try:
for i in elements:
if i.Category.Name == 'Walls':
doc.ActiveView.SetElementOverrides((i.Id), ogs)
print 'element overridden'
except Exception as e:
print '- Failed to override -'
print '- ' + str(e) + ' -'
t.Commit()
- 当您将
View.Id
传递给 FilteredElementCollector
时,您收集
该视图中可见的所有内容
- 事务在 RevitPythonShell 中的工作方式与 Dynamo 略有不同,您围绕实际修改数据库的代码打开和关闭它们
- 当你在交易中时,将代码包装在 try/except 块中是值得的,因为即使有错误你也需要完成交易
我设法按照以下方式为不同类型的墙壁着色。
import clr
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
from random import randint
app = __revit__.Application
doc = __revit__.ActiveUIDocument.Document
#elements = list(FilteredElementCollector(doc, doc.ActiveView.Id))
wall_collector = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls)
wall_instances = wall_collector.OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType()
fill_patterns = FilteredElementCollector(doc).OfClass(FillPatternElement).WhereElementIsNotElementType().ToElements()
for i in fill_patterns:
if i.Name == 'Solid fill':
solid_fill = i.Id
element_list = []
element_name_list = []
for i in wall_instances:
element_name_list.append(i.Name)
element_list.append(i.Id)
wall_color_dict = {}
for i in set(element_name_list):
wall_color_dict[i] = Color(randint(0,250), randint(0,250), randint(0,250))
t = Transaction(doc, 'Color Walls')
t.Start()
for i in wall_instances:
for k, v in wall_color_dict.iteritems():
if k == i.Name:
a=OverrideGraphicSettings().SetProjectionFillPatternId(solid_fill)
b=OverrideGraphicSettings(a).SetProjectionFillColor(v)
p = doc.ActiveView.SetElementOverrides(i.Id, a)
c = doc.ActiveView.SetElementOverrides(i.Id, b)
t.Commit()
在 运行 脚本之前:
在 运行 脚本之后:
我正在尝试使用 RevitPythonshell 在 Revit 的 3D 视图中覆盖墙的图形。我设法使用 Python 节点在 Dynamo 中完成这项工作。
到目前为止我有以下代码;
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
from System.Collections.Generic import List
doc = DocumentManager.Instance.CurrentDBDocument
TransactionManager.Instance.EnsureInTransaction(doc)
walls = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls)
elements = walls.OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType()
color = Autodesk.Revit.DB.Color(255,50,50)
ogs = OverrideGraphicSettings().SetProjectionFillColor(color)
for i in elements:
doc.ActiveView.SetElementOverrides((i.Id), ogs)
TransactionManager.Instance.TransactionTaskDone()
当我在 Revit运行 中 PythonShell 它什么都不做。我没有得到任何错误或任何东西。当我打印 doc.ActiveView.SetElementOverrides((i.Id), ogs)
它时 returns None。
我在这里错过了什么?我在 Revit 的 3D 视图中,这是活动视图。我正在开始和结束交易。
Here 与 Dynamo 节点中的 Python 节点中的代码有些相同。
通过一些调整,您的代码可以工作:
import clr
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
app = __revit__.Application
doc = __revit__.ActiveUIDocument.Document
elements = list(FilteredElementCollector(doc, doc.ActiveView.Id))
color = Color(255,50,50)
ogs = OverrideGraphicSettings().SetProjectionFillColor(color)
t = Transaction(doc, 'Color Walls')
t.Start()
try:
for i in elements:
if i.Category.Name == 'Walls':
doc.ActiveView.SetElementOverrides((i.Id), ogs)
print 'element overridden'
except Exception as e:
print '- Failed to override -'
print '- ' + str(e) + ' -'
t.Commit()
- 当您将
View.Id
传递给FilteredElementCollector
时,您收集 该视图中可见的所有内容 - 事务在 RevitPythonShell 中的工作方式与 Dynamo 略有不同,您围绕实际修改数据库的代码打开和关闭它们
- 当你在交易中时,将代码包装在 try/except 块中是值得的,因为即使有错误你也需要完成交易
我设法按照以下方式为不同类型的墙壁着色。
import clr
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')
import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
from random import randint
app = __revit__.Application
doc = __revit__.ActiveUIDocument.Document
#elements = list(FilteredElementCollector(doc, doc.ActiveView.Id))
wall_collector = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls)
wall_instances = wall_collector.OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType()
fill_patterns = FilteredElementCollector(doc).OfClass(FillPatternElement).WhereElementIsNotElementType().ToElements()
for i in fill_patterns:
if i.Name == 'Solid fill':
solid_fill = i.Id
element_list = []
element_name_list = []
for i in wall_instances:
element_name_list.append(i.Name)
element_list.append(i.Id)
wall_color_dict = {}
for i in set(element_name_list):
wall_color_dict[i] = Color(randint(0,250), randint(0,250), randint(0,250))
t = Transaction(doc, 'Color Walls')
t.Start()
for i in wall_instances:
for k, v in wall_color_dict.iteritems():
if k == i.Name:
a=OverrideGraphicSettings().SetProjectionFillPatternId(solid_fill)
b=OverrideGraphicSettings(a).SetProjectionFillColor(v)
p = doc.ActiveView.SetElementOverrides(i.Id, a)
c = doc.ActiveView.SetElementOverrides(i.Id, b)
t.Commit()
在 运行 脚本之前:
在 运行 脚本之后: