-2

我正在尝试将 C# 代码(用于 revit API)转换为 python,但没有运气。C# 代码看起来:

 public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
        Document doc = commandData.Application.ActiveUIDocument.Document;

        Reference r = commandData.Application.ActiveUIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "please select wall");

        IEnumerable<Element> associate = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).Where(m=>(m as FamilyInstance).Host.Id  == r.ElementId);

        return Result.Succeeded;
    }

我遇到的问题是.Where(m=>(m as FamilyInstance).Host.Id == r.ElementId); 我使用 pyrevit 的部分。谁能建议怎么做?谢谢你!

4

1 回答 1

0

您可以在csharp-to-python或使用SharpDevelop Macro Editor之类的地方将 C# 代码转换为 python 。

转换不会运行,因为某些类在 Python 脚本中的构造方式不同

如果您想在 python 中编写您所拥有的内容,首先需要一些不同的声明。使用示例:

import clr
clr.AddReference("RevitAPI")
from Autodesk.Revit.DB import *
clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

然后需要使用 Document Manager 创建 Document & UIApp 作为示例:

app = DocumentManager.Instance.CurrentUIApplication
doc = DocumentManager.Instance.CurrentDBDocument

对于当前选择,这篇文章应该可以解决问题

对于您遇到问题的代码部分:

IEnumerable<Element> associate = new FilteredElementCollector(doc).
OfClass(typeof(FamilyInstance)).
Where(m=>(m as FamilyInstance).Host.Id  == r.ElementId);

请记住,您使用的是 LINQ。对于 python (除非我弄错了),你需要类似LINQ in Python 的东西。

对于交易通常:

TransactionManager.Instance.EnsureInTransaction(doc)  
  {Do Something}
TransactionManager.Instance.TransactionTaskDone()

组装代码并尝试在 RevitPythonShell 中运行它。

请记住,您可以直接在 PyRevit 中使用 C# 程序集,这是一个链接

于 2020-08-17T10:23:56.023 回答