标签: revit-api

System.BadImageFormatException尝试加载格式不正确的程序

我正在为另一个基于公共.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

42
推荐指数
4
解决办法
9万
查看次数

如何在revit中找到ramp的开始/结束,也许用草图?

我有一堆斜坡,我想知道它的开始和结束点(如果有多个开始/结束点,我想知道它们是如何连接的).我目前得到这些

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)

c# api autodesk revit revit-api

34
推荐指数
1
解决办法
912
查看次数

无法加载文件或程序集'Xceed.Wpf.Toolkit

我正在为另一个应用程序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)

c# wpf wpftoolkit revit revit-api

15
推荐指数
4
解决办法
1万
查看次数

在另一个线程上创建WPF进度窗口

我正在通过一个名为Revit的架构建模软件的API创建一个自定义加载项命令.我的命令可能需要一些时间才能完成,因此我想向用户显示一个带有进度条的窗口,因为它正在工作.

通常,如果我要创建这样的进度窗口,它将位于主UI线程上,并且正在完成的实际工作将在辅助工作线程上进行.但是,Revit要求对API的任何访问都是通过调用自定义命令的线程进行的.所以我必须在第二个线程上创建我的进度条.

我发现这篇博客文章是关于在一个单独的线程中启动WPF窗口,并基于我的解决方案.这是我的自定义命令类.

public class SampleProgressWindowCommand : Autodesk.Revit.UI.IExternalCommand
{

    private ProgressWindow progWindow;
    internal static EventWaitHandle _progressWindowWaitHandle;


    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
        //Starts New Progress Window Thread
        using (_progressWindowWaitHandle = new AutoResetEvent(false))
        {

            //Starts the progress window thread
            Thread newprogWindowThread = new Thread(new ThreadStart(ShowProgWindow));
            newprogWindowThread.SetApartmentState(ApartmentState.STA);
            newprogWindowThread.IsBackground = true;
            newprogWindowThread.Start();

            //Wait for thread to notify that it has created the window
            _progressWindowWaitHandle.WaitOne();
        }

        //Does some work that takes a long time
        for (int i = …
Run Code Online (Sandbox Code Playgroud)

.net c# wpf multithreading revit-api

6
推荐指数
1
解决办法
3121
查看次数

当从一个 Python 文件导入到另一个文件 (IronPython) 时,.NET 程序集会丢失一些方法

我不知道这是 IronPython 问题、Revit API 程序集问题还是其他问题。任何有关可能导致这种情况的信息/想法表示赞赏。

我知道这可以通过再次重新导入相同的命名空间来解决,但我很想知道为什么会这样。

下面是正在发生的事情的简短示例。图像显示 RevitPythonShell 控制台输出。

文件1.py

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)

文件2.py

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)

在此处输入图片说明

在此处输入图片说明

ironpython revit-api revitpythonshell

6
推荐指数
0
解决办法
114
查看次数

在 C# 中使用 Revit API 提示用户回答布尔选择

我用 C# 创建了一个 Revit 插件,允许对 3D 技术完全陌生的用户选择一个族,并将其插入到他们的项目中。但现在用户无法选择将对象放置在任意位置的点上还是放置在面上。要么是其中之一,要么是另一个。现在我的代码如下所示:

bool useSimpleInsertionPoint = false; //or true
bool useFaceReference = true; //or false
if (useSimpleInsertionPoint)
{
//my code for insertion on point here
}
if (useFaceReference)
{
//my code for face insertion here
}
Run Code Online (Sandbox Code Playgroud)

我想做的是问用户他想做什么。TaskDialog.Show 可以解决这个问题还是别的什么?

提前致谢。

c# revit-api

5
推荐指数
1
解决办法
2408
查看次数

使用python在revit中创建和分配子类别

对于熟悉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)

python revit revit-api revitpythonshell

5
推荐指数
1
解决办法
1483
查看次数

从包含此类信息的元素获取有关楼梯和楼梯的信息

您好我有以下代码:

   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)

c# null revit revit-api revit-2015

5
推荐指数
1
解决办法
653
查看次数

是否有云 API 可以从 Revit 模型中提取数据?

假设我想创建一个基于云的服务,它可以连接到 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 感兴趣,请对这两个问题进行投票。它可能有助于获得一些关注。

revit revit-api ifc autodesk-forge autodesk-bim360

5
推荐指数
1
解决办法
1654
查看次数

如何使用 Revit API 激活(显示)视图?

我正在尝试使用 Revit API 激活视图。我想要做的正是提示用户选择一些墙,但是当用户被问到时,他无法切换视图以选择更多墙(此时一切都变灰了)。所以我想激活的视图(我的意思是,我希望这个视图实际显示在屏幕上)已经存在,我可以访问它的 Id。

我看过关于创建、浏览、过滤视图的线程,但没有激活它......这是一个平面图视图。

到目前为止,我可以访问其关联的 ViewPlan 对象和关联的参数(名称、Id、..)。

有可能吗?

非常感谢 !

阿尔诺。

revit revit-api revitpythonshell revit-2015

4
推荐指数
1
解决办法
2459
查看次数