我遇到方法uidoc.PostRequestForElementTypePlacement()
的问题。
似乎该方法始终要求使用架构放置而不是结构放置。有没有办法打电话给结构墙/地板放置?
或者是否可以等待用户使用方法en放置然后将参数“Structural”设置为true?我不知道如何做到这一点,因为上面的方法没有立即执行,而是当用户将焦点带回Revit视图时。
提前致谢。
编辑,添加了最少的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
namespace Test2
{
[TransactionAttribute(TransactionMode.Manual)]
[RegenerationAttribute(RegenerationOption.Manual)]
public class Test2 : IExternalCommand
{
List<ElementId> addedElementIds = new List<ElementId>();
UIApplication _uiapp;
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
UIApplication uiApp = commandData.Application;
Autodesk.Revit.ApplicationServices.Application app = uiApp.Application;
UIDocument uiDoc = uiApp.ActiveUIDocument;
Document doc = uiDoc.Document;
_uiapp = uiApp;
addedElementIds.Clear();
WallType wallType = new FilteredElementCollector(doc).OfClass(typeof(WallType)).Cast<WallType>().Last();
app.DocumentChanged += new EventHandler<DocumentChangedEventArgs>(OnDocumentChanged);
uiDoc.PostRequestForElementTypePlacement(wallType);
return Result.Succeeded;
}
void OnDocumentChanged(object sender, DocumentChangedEventArgs e)
{
addedElementIds.AddRange(e.GetAddedElementIds());
Autodesk.Revit.ApplicationServices.Application app = _uiapp.Application;
Document doc = _uiapp.ActiveUIDocument.Document;
foreach (ElementId id in addedElementIds)
{
Element el = doc.GetElement(id);
el.LookupParameter("Structural").Set(1);
}
app.DocumentChanged -= new EventHandler<DocumentChangedEventArgs>(OnDocumentChanged);
}
}
}
答案 0 :(得分:0)
您可以使用相同的方法使用Place a Family Instance using PromptForFamilyInstancePlacement
所述的DocumentChanged
事件检索新创建的实例。
答案 1 :(得分:0)
PostRequestForElementTypePlacement被描述为延迟实际的家庭放置请求,直到“在API之外”。这个(基于我的实验)在一个家庭中,其参数不能被放置它的同一个程序改变,并且似乎忽略了事件处理程序“.DocumentChanged”(因为文档在API完成之后才会改变)。请注意,R2018中存在一个错误(由RevitAPIDocs验证,仍然通过2018.3验证),这会阻止使用“PromptForFamilyInstancePlacement”,因为“Esc”正在向API返回COMPLETE CANCEL - 因此无法退出放置工具不删除新放置的元素。所以你的答案(根据Jeremy的回答)是在2018年之前的代码中使用“PromptForFamilyInstancePlacement”。
(编辑)或者更好,将“PromptForFamilyInstancePlacement”放在“try”中,并带有“Catch Exception” - 显然,这将捕获修改API所产生的伪造异常。这是基于Jeremy Tamik在另一个网站上的帖子。