Revit二次开发之“墙体开洞NewOpening”

来源:互联网 发布:网络作家梦九重资料 编辑:程序博客网 时间:2024/04/29 03:09
墙体开洞的函数是Document.Create.NewOpening(Wall,XYZ,XYX);但是这里有个技巧就是如何选取墙上的两点。添加一个墙的过滤条件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using WinForm = System.Windows.Forms;

using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes;

using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.UI.Selection;
using RevitApp = Autodesk.Revit.ApplicationServices;

using System.Xml;

namespace RevitCodes
{
    
class WallSelectionFilter : ISelectionFilter
    {
        
public bool AllowElement(Element e)
        {
            
return e is Wall;
        }

        
public bool AllowReference(Reference r, XYZ p)
        {
            
return true;
        }
    }
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    
public class cmdCreateOpening : IExternalCommand
    {
        
public Result Execute(ExternalCommandData cmdData, ref string msg, ElementSet elements)
        {
            UIApplication uiApp 
= cmdData.Application;
            Document doc 
= uiApp.ActiveUIDocument.Document;
            Selection sel 
= uiApp.ActiveUIDocument.Selection;

            Transaction ts 
= new Transaction(doc, "opening");
            ts.Start();

            Wall wall 
= doc.GetElement(sel.PickObject(ObjectType.Element, "请选择一面墙。")) as Wall;
            WallSelectionFilter f 
= new WallSelectionFilter();
            XYZ pt1 
= sel.PickObject(ObjectType.Element, f, "请选择墙上第一点。").GlobalPoint;
            XYZ pt2 
= sel.PickObject(ObjectType.Element, f, "请选择墙上第二点。").GlobalPoint;

            doc.Create.NewOpening(wall, pt1, pt2);

            ts.Commit();

            
return Result.Succeeded;
        }
    }
}