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

墙体开洞的函数是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;
        }
    }
}
from:http://revit.5d6d.com/thread-1219-1-1.html
posted @ 2011-09-07 08:03  大气象  阅读(2392)  评论(0编辑  收藏  举报
http://www.tianqiweiqi.com