我不知道这是 IronPython 问题、Revit API 程序集问题还是其他问题。任何有关可能导致这种情况的信息/想法表示赞赏。
我知道这可以通过再次重新导入相同的命名空间来解决,但我很想知道为什么会这样。
下面是正在发生的事情的简短示例。图像显示 RevitPythonShell 控制台输出。
import clr
clr.AddReference('RevitAPI') # Contains Imports Autodesk.Revit.DB
from Autodesk.Revit import DB # OK
DB.Element.Name # OK
DB.Element.Name.GetValue() # OK: Method exists. As Expected
Run Code Online (Sandbox Code Playgroud)
from File1 import DB
DB.Element.Name # OK, Property Exists
DB.Element.Name.GetValue() # *** Method DOES NOT Exist, Attribute Error is raised
from Autodesk.Revit import DB # Re-import the same namespace again
DB.Element.Name.GetValue() # OK: Method Exists
Run Code Online (Sandbox Code Playgroud)
对于熟悉Revit API和python的一些人,我有一个问题:
我一直在使用dynamo中的spring nodes包来创建一个相当大的自由对象系列,每个对象都在它们自己的系列中.FamilyInstance.ByGeometry的工作方式,它采用实体列表,并使用模板系列文件为每个实体创建一个族实例.结果非常好.(可以在这里找到spring节点:https://github.com/dimven/SpringNodes)
但是,缺点是现在我有大约200个单独的实例,所以对每个实例进行更改是相当痛苦的.我一开始认为可以使用dynamo来创建一个新的子类别,并将每个族实例中的实体设置为这个新的子类别.不幸的是,我意识到这是不可能的,因为dynamo不能同时在两个不同的Revit环境中打开(我正在工作的项目和该系列的每个实例).这让我想看看我是否可以使用python来做到这一点.
我在rhino中使用了python并且相处得很好,但我仍在学习Revit API.但基本上我的想法是:1.在Revit项目环境中选择一系列族实例2.遍历每个实例3.将其保存到指定位置4.在每个族实例中创建一个新的子类别(子类别将是对于所有选定的族实例都相同)5.在实例中选择每个实体中的实体6.将实体设置为此新创建的子类别7.关闭族实例并保存
我的问题是,这听起来像是根据您对Revit API的了解可以实现的吗?
非常感谢您的时间和建议.
更新:
我在revit api中找到了一个描述我要做的事情的部分:http://help.autodesk.com/view/RVT/2015/ENU/?guid = GUID-FBF9B994-ADCB-4679-B50B -2E9A1E09AA48
我已经第一次将它插入到dynamo节点的python代码中.其余的代码工作正常,除了我添加的新部分(见下文).请原谅变量,我只是保持我正在黑客攻击的代码原作者的逻辑:
(注意:变量进来是在数组中)
#set subcategory
try:
#create new sucategory
fam_subcat = famdoc.Settings.Categories.NewSubcategory(fam_cat, get_Item(subcat1.Name))
#assign the mataterial(fam_mat.Id) to the subcategory
fam_subcat.Material = famdoc.GetElement(fam_mat.Id)
#assign the subcategory to the element (s2)
s2.Subcategory = fam_subcat
except: pass
Run Code Online (Sandbox Code Playgroud)
任何有关此部分代码的帮助或建议都将非常感谢.
更新:请参阅下面的完整代码,了解相关部分的上下文:
#Copyright(c) 2015, Dimitar Venkov
# @5devene, dimitar.ven@gmail.com
import clr
import System
from System.Collections.Generic import *
pf_path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86)
import sys
sys.path.append("%s\IronPython 2.7\Lib" %pf_path) …Run Code Online (Sandbox Code Playgroud) 我使用了RevitPythonShell和Dynamo,但想使用现有的Python IDE(Eclipse),在其中进行日志记录,调试,GitHub集成等配置。
我对交易和整个API都很满意,并且花了一些时间阅读有关Revit API和无模式连接的信息,其他人也提出了类似的问题。其中一些已经几岁了。目前是否可以从Revit外部执行的Python与Revit进行交互?
例如,我尝试过;
import clr
clr.AddReference(r'C:\Program Files\Autodesk\Revit 2016\RevitAPI')
import Autodesk.Revit.DB as rvt_db
print(dir(rvt_db))
Run Code Online (Sandbox Code Playgroud)
但这似乎没有揭示任何有用的东西。
我正在尝试使用 Revit API 激活视图。我想要做的正是提示用户选择一些墙,但是当用户被问到时,他无法切换视图以选择更多墙(此时一切都变灰了)。所以我想激活的视图(我的意思是,我希望这个视图实际显示在屏幕上)已经存在,我可以访问它的 Id。
我看过关于创建、浏览、过滤视图的线程,但没有激活它......这是一个平面图视图。
到目前为止,我可以访问其关联的 ViewPlan 对象和关联的参数(名称、Id、..)。
有可能吗?
非常感谢 !
阿尔诺。
我有一个非常"普遍"的问题.我正在使用Revit API(使用python)进行开发,我有时会观察到Revit会话在我的测试和试验期间变慢(Revit保持打开的时间越长,它看起来就越多).它没有达到真正有问题的程度,但它让我无论如何都要考虑它.
所以,由于我没有编程背景,我很确定我的代码充满了真正"非正统"的东西,可能会好得多.
我是否可以遵循一些基本的"技巧和窍门"(我的意思是,与Revit API相关)以帮助提高代码执行速度?或者我应该说:帮助减少内存使用?
例如,我已经阅读了可用的'Dispose'方法,特别是在使用Transactions时(例如:http://thebuildingcoder.typepad.com/blog/2012/09/disposal-of-revit-api-objects). html),但最后我不是很清楚这是否真的非常重要(此外,因为我使用的是Python,并且不知道在哪里让我参与讨论使用"使用"或不)?
我应该'弃置'一切吗?;)
除了'Dispose'方法,还有别的吗?
非常感谢,Arnaud.
revitpythonshell 提供了两种非常相似的方法来加载族。
LoadFamily(self: Document, filename:str) -> (bool, Family)
LoadFamily(self: Document, filename:str) -> bool
Run Code Online (Sandbox Code Playgroud)
所以似乎只有返回值不同。我尝试以几种不同的方式调用它:
(success, newFamily) = doc.LoadFamily(path)
success, newFamily = doc.LoadFamily(path)
o = doc.LoadFamily(path)
Run Code Online (Sandbox Code Playgroud)
但我总是得到一个布尔值。我也想要家人
我在 pyRevit 环境中使用 Iron python,我的代码如下:
element_types = \
DB.FilteredElementCollector(doc)\
.OfCategory(DB.BuiltInCategory.OST_Walls)\
.WhereElementIsElementType()\ # getting family types not elements
.ToElements()
for ele in element_types:
print(ele.Name)
Run Code Online (Sandbox Code Playgroud)
根据 Revit API 文档,这应该可以工作,并且可能在 C# 中工作。ele.Name既可以作为 setter也可以作为 getter 使用。但是在 Ironpython 上面的代码失败,返回一个AttributeError: Name. 但是当我尝试时ele.Name = "new_family_type_name"它工作正常。
所以我的问题是如何进行ele.Name工作以获取家庭类型名称。
不允许从在API上下文之外运行的外部应用程序启动事务.无法启动交易.