我正在为另一个基于公共.NET API的程序编写插件.通常,这些插件是通过创建引用API程序集的类库DLL来创建的.然后,通过继承API程序集中的基本命令类来创建命令类.然后将应用程序设置为引用插件DLL文件,然后还负责在用户请求时实际启动自定义命令类.
但是,现在我正在尝试通过自动化代码生成System.CodeDOM,并且想要创建一个简单的控制台应用程序,该应用程序根据API程序集中的类型自动生成新的类类型.
然而,当我尝试运行我的应用程序时,我得到以下异常.
System.BadImageFormatException未处理消息:无法加载文件或程序集"RevitAPI,Version = 2011.0.0.0,Culture = neutral,PublicKeyToken = null"或其依赖项之一.尝试加载格式不正确的程序.
通常我需要将插件程序集的目标框架设置为3.5.但是现在我发现如果我将控制台应用程序的目标框架设置为2.0,上面的错误就会消失.但是,我的控制台应用程序已经引用了我的目标框架设置为3.5的其他类库.而且我真的不想围绕2.0框架重写它们.
.net revit badimageformatexception revit-api target-framework
我有一堆斜坡,我想知道它的开始和结束点(如果有多个开始/结束点,我想知道它们是如何连接的).我目前得到这些
List<TransitionPoint> ret = new List<TransitionPoint>();
FilteredElementCollector collector = new FilteredElementCollector(doc);
ICollection<Element> ramps = collector.OfCategory(BuiltInCategory.OST_Ramps).ToElements();
foreach (var ramp in ramps)
{
//what goes here?
}
Run Code Online (Sandbox Code Playgroud)
这些斜坡包含以下属性:
Type Comments
Ramp Max Slope (1/x)
Category
URL
Design Option
Type Name
Ramp Material
Function
Manufacturer
Family Name
Model
Keynote
Type Image
Text Size
Shape
Text Font
Maximum Incline Length
Assembly Description
Assembly Code
Type Mark
Category
Thickness
Cost
Description
Run Code Online (Sandbox Code Playgroud)
现在,如果这些楼梯我将使用ICollection stairs = collector.OfCategory(BuiltInCategory.OST_Stairs).OfClass(typeof(Stairs)).ToElements();
然后我可以将对象投射到楼梯但是似乎没有一个类的simmulair到楼梯,这将允许我adresStairs.GetStairsRuns().
任何人都知道如何获得像RampRun这样的东西或者找到斜坡的开始和结束?
我也尝试了以下溶剂,但这也没有用
public static void MapRunsToRamps(Document doc)
{ …Run Code Online (Sandbox Code Playgroud) 我正在为另一个应用程序Autodesk Revit开发一个加载项,它是作为一个单独的DLL类库构建的.我正在尝试在我的一个WPF窗口中使用Wpf工具包属性网格.属性网格在Visual Studio中显示正常,而intellisense也可以.但是当我尝试使用加载项加载启动Revit时,我得到以下异常.
System.Windows.Markup.XamlParseException occurred
HResult=-2146233087
Message=Could not load file or assembly 'Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4' or one of its dependencies. The system cannot find the file specified.
Source=PresentationFramework
LineNumber=133
LinePosition=27
StackTrace:
at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
InnerException: System.IO.FileNotFoundException
HResult=-2147024894
Message=Could not load file or assembly 'Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4' or one of its dependencies. The system cannot find the file specified.
Source=mscorlib
FileName=Xceed.Wpf.Toolkit, PublicKeyToken=3e4669d2f30244f4
FusionLog==== Pre-bind state information ===
LOG: User = GLOBAL\eric.anastas …Run Code Online (Sandbox Code Playgroud) 我想要这样做的简短解释:
我正在为Autodesk Revit Architecture 2010编写插件.测试我的插件代码非常麻烦,因为我必须为每个调试会话重新启动Autodesk,手动加载Revit项目,单击Add-Ins选项卡然后启动我的插件.这花了太长时间.
我写了第二个插件来托管IronPython解释器.通过这种方式,我可以使用Revit提供的API.但最终,代码必须在C#中重写 - 并进行调试.
很简单,我想:只需从IronPython脚本加载插件DLL并进行练习即可.这确实有效,但一旦加载,我无法在Visual Studio中重新编译,因为DLL现在已加载到Revits AppDomain中.
很简单,我想(在StackOverflow的帮助下):只需在新的AppDomain中加载DLL即可.唉,RevitAPI对象无法封送到另一个AppDomain,因为它们不会扩展MarshalByRefObject.
我想我可能会使用影子副本.ASP.NET似乎正在这样做.但是阅读MSDN上的文档,似乎我只能在创建 AppDomain 时指定它.
我可以为当前(默认)AppDomain更改此设置吗?我可以强制它使用特定目录中的DLL的卷影副本吗?
好.我们的产品有效.Beta测试人员实际上正在完成他们的工作.下一次迭代的时间.但如何保证质量?我们需要一个测试员!
我如何让新鲜的人在街上开始测试?我不知道如何自己做(我是开发人员,而不是测试人员)!
我们是一个小团队:
我们都不知道如何专业地做这件事.到目前为止,我们有:
我希望我们需要一个测试脚本.但是怎么样?谁?什么?什么时候?
对于熟悉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) 您好我有以下代码:
public static void HandleStairs(Document doc)
List<TransitionPoint> ret = new List<TransitionPoint>();
FilteredElementCollector collector = new FilteredElementCollector(doc);
ICollection<Element> stairs = collector.OfCategory(BuiltInCategory.OST_Stairs).ToElements();
foreach (var stair in stairs)
{
var st= stair as Stairs;
if(st!=null)
{
%code that is never executed
}
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,无论看起来楼梯总是空的,我听说另一个程序员也有同样的问题.
楼梯变量确实接收了一些具有stairlike属性的物体(被命名为楼梯,有立管和平台分机),但实际上并不接受被施放到楼梯上.有人知道如何将其实际投入楼梯(或以其他方式获取文档中的所有楼梯吗?)
请注意,stairs是具有以下属性的元素:
Riser to Tread Connection
Monolithic Material
Apply Nosing Profile
Stringer Material
Text Size
Begin with Riser
Stringer Carriage Height
URL
Open Stringer Offset
Right Stringer
Riser Type
Cost
Left Stringer
Underside of Winder
Stringer …Run Code Online (Sandbox Code Playgroud) 假设我想创建一个基于云的服务,它可以连接到 Revit Server 并获取模型数据、处理它,并在基于 Web 的界面中向用户返回一些有用的信息。然后用户修改模型并将更改提交到服务器。我的应用程序收到一个通知,其中包含有关已修改内容的详细信息(自动避免差异),处理更改并继续循环。在这个例子中,我避免使用我的应用程序修改模型,但可能只是应用程序需要修改模型的情况。让我举一个假设的用例。
架构师想要优化设计解决方案的性能。他/他一直在研究模型的不同部分,并对模型进行一些(很可能是次要的)更改。更改将发送到中央 BIM 360 服务器或任何其他中央 Revit 服务器。我的应用程序将从服务器检索修改信息并评估模型的性能并在网页中向架构师提供反馈。
我的应用程序使用在 linux 上运行的 Python(sklearn、Tensorflow 等)来处理 BIM 模型,因此独立于 Revit 环境和 Windows 至关重要。为了向用户显示信息,它使用了 Web 技术(例如 d3.js 可视化库)。
Model Derivative Forge API提供RVT 到 IFC(和 SVF)的转换。所有这些(查询和编写 BIM)都可以在 IFC 上实现,但是,每次转换都意味着更多的复杂性、数据丢失(IFC 和 RVT 不是 100% 兼容)、计算和时间。
这是这个问题的一个更简单的形式(文件格式)。如果您对这些 API 感兴趣,请对这两个问题进行投票。它可能有助于获得一些关注。
使用我的加载项的大多数应用程序都返回“ C:\ Users \ [用户名] \ AppData \ Local \ Temp \”路径。但是一个应用程序返回“ C:\ Users \ [用户名] \ AppData \ Local \ Temp \ 1affa5dd-2f26-4c96-9965-7a78f5c76321 \”。最终,每次启动应用程序时,GUID都会更改。
我正在从中运行加载项的应用程序是Revit 2015-2020。Revit 2015-2019版本返回正确的路径。但是Revit 2020将返回最后添加GUID的路径。代码保持不变。
public static string GetLocalFilePath(string sourceUri, string fileName, string extension)
{
string[] sasTokenSeparated = sourceUri.Split('?');
string[] uriParts = sasTokenSeparated[0].Split('/');
string documentId = uriParts[uriParts.Length - 2];
documentId = documentId.Split('.')[0];
string extensionWithDot = string.Empty;
if (!extension.StartsWith("."))
{
extensionWithDot = "." + extension;
}
else
{
extensionWithDot = extension;
}
string localPath = Path.Combine(Path.GetTempPath(), documentId, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Revit API 激活视图。我想要做的正是提示用户选择一些墙,但是当用户被问到时,他无法切换视图以选择更多墙(此时一切都变灰了)。所以我想激活的视图(我的意思是,我希望这个视图实际显示在屏幕上)已经存在,我可以访问它的 Id。
我看过关于创建、浏览、过滤视图的线程,但没有激活它......这是一个平面图视图。
到目前为止,我可以访问其关联的 ViewPlan 对象和关联的参数(名称、Id、..)。
有可能吗?
非常感谢 !
阿尔诺。