我使用了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 Structure API 创建了许多插件。每个工具都必须有一个实现 IExternalCommand 接口的类。
在最新版本的 Revit 中,为了让您的工具正常工作,您需要在实现该接口的类上拥有两个属性:
[再生(RegenesisOption.Manual)] [事务(TransactionMode.Automatic)]
括号中的值可以改变,但那里一定有东西。我经常发现自己忘记添加属性,然后在运行时它会崩溃。Visual Studio 2010 中是否有任何方法可以添加编译器警告或错误,指出如果您的类实现该接口,则它必须具有这两个属性?如果有帮助的话我有磨刀器。
有人能指出我正确的方向吗?
所以我刚刚开始涉足 pyRevit 中的 WPF。我尝试像这样实现pyrevit.forms.WPFWindow 类:
# -*- coding: UTF-8 -*-
"""
Third-Party software credits:
pyRevit: repository at https://github.com/eirannejad/pyRevit
"""
import System, clr, json, sys
clr.AddReference("System.Windows.Forms")
clr.AddReference('IronPython.Wpf')
import wpf
from Autodesk.Revit.DB import *
from pyrevit import revit, script, forms
class FactorySettings(forms.WPFWindow):
def __init__(self):
forms.WPFWindow.__init__(self, script.get_bundle_file('settings.xaml'))
def something_click(self, A, B):
plantings = FilteredElementCollector(revit.doc) \
.WhereElementIsElementType() \
.OfCategory(BuiltInCategory.OST_Planting)
ui = FactorySettings()
ui.show()
Run Code Online (Sandbox Code Playgroud)
这是我的 xaml:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
ShowInTaskbar="False" ResizeMode="CanResize"
WindowStartupLocation="CenterScreen"
HorizontalContentAlignment="Center"
Title="Set worksets" Width="300" SizeToContent="Height"
>
<StackPanel Margin="0,0,0,0" …Run Code Online (Sandbox Code Playgroud) 使用Revit API有一种方法可以获得BuiltInParameterGroup枚举值的人类可读版本(尺寸,材料和表面处理等)吗?
"AIPAppStartup"的Revit SDK示例包含用于执行"OnShutDown"(关闭Revit会话时)或"OnStartup"(启动Revit会话时)的代码的预构建部分,但我希望能够为加载的每个文档运行代码.具体来说,我希望Revit清除与加载的特定模型相关联的临时文件.
我尝试创建一个新的结果,公共Autodesk.Revit.UI.Result OnLoad(UIControlledApplication应用程序),这不起作用.我还尝试了另一对On****的可能性(OnOpen等),这也失败了.
是否有一个特定的"On*****"结果可以实现我的愿望?
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)
但我总是得到一个布尔值。我也想要家人
我想重写我的 Revit 插件之一,以便它通过 MVVM 使用 WPF,因为与 Windows 窗体相比,我更喜欢 WPF 的外观和功能。
我已将 Jeremy Tammik 的 Revit 模板向导用于基于表单的加载项,但添加 WPF 用户控件似乎不起作用(无法找到 xaml 资源的运行时错误)。
我在示例中找到了一个 WPF MVVM revit add(AddMaterials,这里是 github 链接,它将从 Excel 电子表格添加材料),但它不符合我期望在顶层看到的内容。
第三个问题很容易解决,只需将 WPF 应用程序项目中的窗口复制到类库项目中即可。但我不太明白如果不遵循模板中的 app.cs 代码,类库将如何在 Revit 中实例化。还有其他人以这种方式创建加载项吗?如果是的话,您能让我了解任何有帮助的技巧或讨论吗?有人为 Visual Studio 创建了 WPF Revit 插件模板吗?
当我添加 WPF 窗口并尝试实例化它时,出现错误,指出找不到 xaml 资源(System.IO.IOException:无法找到资源“xxxx.xaml”)。我尝试根据谷歌搜索此错误时找到的建议来修复此问题,但无济于事。我认为它来自于基于表单的项目,并且我可能必须从一个没有表单内容的新项目开始。
我现在已经验证,您确实可以从 Revit AddIn Wizard 开始并使用 WPF 。。。我从头开始,复制到另一个项目中创建的窗口中并让它运行(在添加各种引用、命名空间等之后)。所以我的问题似乎只是与原始项目有关,它已经添加了一堆表单内容。
我有一个非常"普遍"的问题.我正在使用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.
有没有人知道如何构建.NET C#Revit应用程序而无需每次都重新启动Revit?这适用于REVIT MEP 2013.
我正在使用 FilteredElementCollector 来检索家庭实例:
var collector = new FilteredElementCollector(doc, doc.ActiveView.Id);
var familyInstances = collector.OfClass(typeof(FamilyInstance));
Run Code Online (Sandbox Code Playgroud)
这适用于没有嵌套族实例的族。但是如果我在项目中有 A 族的实例,而 A 族本身包含 B 族的实例,则此代码无法获取 B 族的实例。如何获取 B 族的实例?
我是 Revit API 的新手,似乎必须有一个简单的解决方案,但我在网上找不到。如果这有所作为,我正在使用 Revit 2015。