【问题标题】:OverrideGraphicSettings in active view with RevitPythonShell使用 RevitPythonShell 在活动视图中覆盖图形设置
【发布时间】:2018-06-03 22:23:18
【问题描述】:

我正在尝试使用 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()

当我在 RevitPythonShell 中运行它时,它什么也不做。我没有得到任何错误或任何东西。当我打印doc.ActiveView.SetElementOverrides((i.Id), ogs) 时,它返回无。

我在这里缺少什么?我在 Revit 中的 3D 视图中,这是活动视图。我正在开始和结束交易。

Here 与 Dynamo 节点中 Python 节点中的代码有些相同。

【问题讨论】:

  • doc.ActiveView.SetElementOverrides((i.Id), ogs) 返回None 是意料之中的——否则应该是什么结果?
  • 作为调试的第一步,我会打印出elements 变量。也许你没有收集到你期望的元素?

标签: python revit revitpythonshell


【解决方案1】:

通过一些调整,您的代码可以正常工作:

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 块中是值得的,因为即使出现错误,您也需要完成事务

【讨论】:

    【解决方案2】:

    我设法通过以下方式为不同类型的墙壁着色。

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

    在运行脚本之前:

    运行脚本后:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2011-12-14
      • 1970-01-01
      相关资源
      最近更新 更多