首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >活动视图中的OverrideGraphicSettings与RevitPythonShell

活动视图中的OverrideGraphicSettings与RevitPythonShell
EN

Stack Overflow用户
提问于 2017-12-21 09:14:57
回答 2查看 1.2K关注 0票数 1

我正试图用RevitPythonshell覆盖3D视图中墙壁的图形。我用Python在Dynamo中成功地完成了这个任务。

到目前为止,我有以下代码;

代码语言:javascript
复制
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)时,它不返回任何内容。

我在这里错过了什么?我在一个3D视图中的Revit,这是一个积极的视图。我要开始和结束一笔交易。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-22 19:52:30

只要稍加调整,您的代码就能工作:

代码语言:javascript
复制
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/ you块中,因为即使有错误,也需要完成事务。
票数 1
EN

Stack Overflow用户

发布于 2018-01-03 12:47:26

我设法用以下方式给不同类型的墙壁着色。

代码语言:javascript
复制
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()

在运行脚本之前:

运行脚本之后:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47921606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档