PostRequestForElementTypePlacement结构墙

时间:2018-04-17 07:50:07

标签: c# revit-api revit

我遇到方法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);
        }
    }
}

2 个答案:

答案 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在另一个网站上的帖子。