没测试成功,留待以后研究。

[TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class cmdAddAlignment : IExternalCommand
{
    //创建对齐,把一个面对齐到参考面。
    void AddAlignment_ReferencePlane(Application app, Document doc, Extrusion pSolid, XYZ normal, string nameRefPlane)
    {
        View pViewPlan = Util.findElement(doc, typeof(ViewPlan), "Lower Ref. Level") as View;
        ReferencePlane refPlane = Util.findElement(doc, typeof(ReferencePlane), nameRefPlane) as ReferencePlane;
        PlanarFace pFace = findFace(app, pSolid, normal, refPlane);
        doc.FamilyCreate.NewAlignment(pViewPlan, refPlane.Reference, pFace.Reference);
    }
    //对齐到楼层
    void AddAlignment_Level(Document doc, Extrusion pSolid, XYZ normal, string nameLevel)
    {
        View pView = Util.findElement(doc, typeof(View), "Front") as View;
        Level pLevel = Util.findElement(doc, typeof(Level), nameLevel) as Level;
        PlanarFace pFace = Util.findFace(pSolid, normal);
        doc.FamilyCreate.NewAlignment(pView, pLevel.PlaneReference, pFace.Reference);
    }
    void AddAlignments(Application app, Document doc, Extrusion pSolid)
    {
        AddAlignment_Level(doc, pSolid, new XYZ(0.0, 0.0, 1.0), "Upper Ref Level");
        AddAlignment_Level(doc, pSolid, new XYZ(0.0, 0.0, -1.0), "Lower Ref. Level");
        AddAlignment_ReferencePlane(app, doc, pSolid, new XYZ(1.0, 0.0, 0.0), "Right");
        AddAlignment_ReferencePlane(app, doc, pSolid, new XYZ(-1.0, 0.0, 0.0), "Left");
        AddAlignment_ReferencePlane(app, doc, pSolid, new XYZ(0.0, -1.0, 0.0), "Front");
        AddAlignment_ReferencePlane(app, doc, pSolid, new XYZ(0.0, 1.0, 0.0), "Back");
        AddAlignment_ReferencePlane(app, doc, pSolid, new XYZ(1.0, 0.0, 0.0), "OffsetV");
        AddAlignment_ReferencePlane(app, doc, pSolid, new XYZ(0.0, 1.0, 0.0), "OffsetH");
    }
    // ===============================================================
    // helper function: given a solid, find a planar 
    //Extrusion实体,给一个实体,给一个方向,找到与此方向一致的面。
    // face with the given normal (version 2)
    // this is a slightly enhaced version of the previous 
    // version and checks if the face is on the given reference plane.
    // ===============================================================
    PlanarFace findFace(Application app, Extrusion pBox, XYZ normal, ReferencePlane refPlane)
    {
        // get the geometry object of the given element
        //
        Options op = new Options();
        op.ComputeReferences = true;
        GeometryObjectArray geomObjs = pBox.get_Geometry(op).Objects;         // loop through the array and find a face with the given normal
        //
        foreach (GeometryObject geomObj in geomObjs)
        {
            if (geomObj is Solid)  // solid is what we are interested in.
            {
                Solid pSolid = geomObj as Solid;
                FaceArray faces = pSolid.Faces;
                foreach (Face pFace in faces)
                {
                    PlanarFace pPlanarFace = (PlanarFace)pFace;
                    // check to see if they have same normal
                    //face.Normal是面的向量。IsAlmostEqualTo();
                    if ((pPlanarFace != null) && pPlanarFace.Normal.IsAlmostEqualTo(normal))
                    {
                        // additionally, we want to check if the face is on the reference plane
                        //还要判断面是否在参考平面上。
                        XYZ p0 = refPlane.BubbleEnd;//终点?
                        XYZ p1 = refPlane.FreeEnd;//起点?
                        Line pCurve = app.Create.NewLineBound(p0, p1);
                        if (pPlanarFace.Intersect(pCurve) == SetComparisonResult.Subset)//子集
                        {
                            return pPlanarFace; // we found the face
                        }
                    }
                }
            }             // will come back later as needed.
            //
            //else if (geomObj is Instance)
            //{
            //}
            //else if (geomObj is Curve)
            //{
            //}
            //else if (geomObj is Mesh)
            //{
            //}
        }         // if we come here, we did not find any.
        return null;
    }
    public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
    {
        UIApplication app = commandData.Application;
        Document doc = app.ActiveUIDocument.Document;         Transaction ts = new Transaction(doc, "http://revit.5d6d.com");
        ts.Start();         //
        Extrusion pSolid = CreateSolid(app.Application, doc);
        AddAlignments(app.Application, doc, pSolid);         ts.Commit();         return Result.Succeeded;
    }
    //创建封闭曲线
    CurveArrArray createProfileLShape(Application _rvtApp)
    {
        //
        // define a simple L-shape profile
        //
        //  5 tw 4
        //   +-+
        //   | | 3          h = height
        // d | +---+ 2
        //   +-----+ td
        //  0        1
        //  6  w
        //         // sizes (hard coded for simplicity)
        // note: these need to match reference plane. otherwise, alignment won't work.
        // as an exercise, try changing those values and see how it behaves.
        //
        double w = Util.mmToFeet(600.0); // those are hard coded for simplicity here. in practice, you may want to find out from the references)
        double d = Util.mmToFeet(600.0);
        double tw = Util.mmToFeet(150.0); // thickness added for Lab2
        double td = Util.mmToFeet(150.0);         // define vertices
        //
        const int nVerts = ; // the number of vertices         XYZ[] pts = new XYZ[] {
new XYZ(-w / 2.0, -d / 2.0, 0.0),
new XYZ(w / 2.0, -d / 2.0, 0.0),
new XYZ(w / 2.0, (-d / 2.0) + td, 0.0),
new XYZ((-w / 2.0) + tw, (-d / 2.0) + td, 0.0),
new XYZ((-w / 2.0) + tw, d / 2.0, 0.0),
new XYZ(-w / 2.0, d / 2.0, 0.0),
new XYZ(-w / 2.0, -d / 2.0, 0.0) };  // the last one is to make the loop simple         // define a loop. define individual edges and put them in a curveArray
        //
        CurveArray pLoop = _rvtApp.Create.NewCurveArray();
        for (int i = ; i < nVerts; ++i)
        {
            Line line = _rvtApp.Create.NewLineBound(pts[i], pts[i + ]);
            pLoop.Append(line);
        }         // then, put the loop in the curveArrArray as a profile
        //
        CurveArrArray pProfile = _rvtApp.Create.NewCurveArrArray();
        pProfile.Append(pLoop);
        // if we come here, we have a profile now.         return pProfile;
    }
    Extrusion CreateSolid(Application app, Document doc)
    {
        CurveArrArray pProfile = createProfileLShape(app);
        //这个参考平面模板中没有,可以切换到Front立面,自己画一个。
        ReferencePlane pRefPlane = Util.findElement(doc, typeof(ReferencePlane), "Reference Plane") as ReferencePlane;
        SketchPlane pSketchPlane = doc.FamilyCreate.NewSketchPlane(pRefPlane.Plane);
        double dHeight = Util.mmToFeet();
        bool bIsSolid = true;
        Extrusion pSolid = doc.FamilyCreate.NewExtrusion(bIsSolid, pProfile, pSketchPlane, dHeight);
        return pSolid;
    }
}
public class Util
{
    //Revit内部单位feet转化为mm即毫米
    public static double mmToFeet(double val) { return val / 304.8; }
    public static double feetToMm(double val) { return val * 304.8; }
    //通过类型与名称找Element
    public static Element findElement(Document _rvtDoc, Type targetType, string targetName)
    {
        // get the elements of the given type
        //
        FilteredElementCollector collector = new FilteredElementCollector(_rvtDoc);
        collector.WherePasses(new ElementClassFilter(targetType));         // parse the collection for the given name
        // using LINQ query here. 
        // 
        var targetElems = from element in collector where element.Name.Equals(targetName) select element;
        List<Element> elems = targetElems.ToList<Element>();         if (elems.Count > )
        {  // we should have only one with the given name. 
            return elems[];
        }         // cannot find it.
        return null;
    }
    // =============================================================
    //   helper function: find a planar face with the given normal
    // =============================================================
    public static PlanarFace findFace(Extrusion pBox, XYZ normal)
    {
        // get the geometry object of the given element
        //
        Options op = new Options();
        op.ComputeReferences = true;
        GeometryObjectArray geomObjs = pBox.get_Geometry(op).Objects;         // loop through the array and find a face with the given normal
        //
        foreach (GeometryObject geomObj in geomObjs)
        {
            if (geomObj is Solid)  // solid is what we are interested in.
            {
                Solid pSolid = geomObj as Solid;
                FaceArray faces = pSolid.Faces;
                foreach (Face pFace in faces)
                {
                    PlanarFace pPlanarFace = (PlanarFace)pFace;
                    if ((pPlanarFace != null) && pPlanarFace.Normal.IsAlmostEqualTo(normal)) // we found the face
                    {
                        return pPlanarFace;
                    }
                }
            }
            // will come back later as needed.
            //
            //else if (geomObj is Instance)
            //{
            //}
            //else if (geomObj is Curve)
            //{
            //}
            //else if (geomObj is Mesh)
            //{
            //}
        }         // if we come here, we did not find any.
        return null;
    }
    #region Formatting and message handlers
    public const string Caption = "Revit Family API Labs";     /// <summary>
    /// MessageBox wrapper for informational message.
    /// </summary>
    public static void InfoMsg(string msg)
    {         System.Diagnostics.Debug.WriteLine(msg);
        WinForm.MessageBox.Show(msg, Caption, WinForm.MessageBoxButtons.OK, WinForm.MessageBoxIcon.Information);
    }     /// <summary>
    /// MessageBox wrapper for error message.
    /// </summary>
    public static void ErrorMsg(string msg)
    {
        WinForm.MessageBox.Show(msg, Caption, WinForm.MessageBoxButtons.OK, WinForm.MessageBoxIcon.Error);
    }
    #endregion // Formatting and message handlers
}

url:http://greatverve.cnblogs.com/p/revit-family-api-add-alignment.html

Revit Family API 添加对齐的更多相关文章

  1. Revit Family API 添加类型

    FamilyManager.NewType("");添加新类型,然后设置参数,就是为新类型设置参数. [TransactionAttribute(Autodesk.Revit.At ...

  2. Revit Family API 添加参数与尺寸标注

    使用FamilyManager其他的与普通添加参数与标注没区别. [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Man ...

  3. Revit Family API 添加几何实体

    先创建一个封闭曲线createProfileLShape();再创建实体,这里需要手工画一个参考平面; ; i < nVerts; ++i)        {            Line l ...

  4. Revit Family API 添加材质参数设置可见性

    start //添加类型 void AddType(FamilyManager familyMgr, string name, double w, double d) {     FamilyType ...

  5. Revit Family API 创建参考平面

    使用API来编辑族时,使用doc.FamilyCreate.NewReferencePlane();创建参考平面. )         {  ];         }         // canno ...

  6. Revit 2015 API 的全部变化和新功能

    这里从SDK的文章中摘录出全部的API变化.主要是希望用户用搜索引擎时能找到相关信息: Major changes and renovations to the Revit API APIchange ...

  7. 工作流JBPM_day01:3-使用JBPM的API添加与执行流程

    工作流JBPM_day01:3-使用JBPM的API添加与执行流程 流程定义画完得到压缩文件--->部署流程定义-->启动流程实例-->查询我的个人任务列表-->办理任务--& ...

  8. 为IIS Host ASP.NET Web Api添加Owin Middleware

    将OWIN App部署在IIS上 要想将Owin App部署在IIS上,只添加Package:Microsoft.OWIN.Host.SystemWeb包即可.它提供了所有Owin配置,Middlew ...

  9. Bing必应地图中国API - 添加实时交通信息

    Bing必应地图中国API - 添加实时交通信息 2011-05-24 14:44:58|  分类: Bing&Google|字号 订阅     2009年4月23日,微软必应地图中国API新 ...

随机推荐

  1. lucene入门创建索引——(二)

    1.程序宏观结构图

  2. linux命令中which、whereis、locate有什么区别?

    1.find find是最常用和最强大的查找命令.它能做到实时查找,精确查找,但速度慢. find的使用格式如下: #find [指定目录] [指定条件] [指定动作] 指定目录:是指所要搜索的目录和 ...

  3. Update Bits

    Given two 32-bit numbers, N and M, and two bit positions, i and j. Write a method to set all bits be ...

  4. linux系统时间不同步解决办法(同步本地时间)

    改变/etc/目录下的localtime文件,既可以改变当前的时区 1.方法是到/usr/share/zoneinfo目录下找到你要相对应的时区文件,例如上海在/usr/share/zoneinfo/ ...

  5. 转载:Linux批量远程管理主机命令_pssh用法详解

    原文:http://www.linuxidc.com/Linux/2011-12/49635p2.htm (一) 使用前提 中心主机连接远程主机可以通过ssh密钥无密码连接 (二) 命令格式 pssh ...

  6. hashlib和hmac

    hashlib hashlib模块用于加密相关的操作,代替了md5和sha模块,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法. #!/usr/bin/env p ...

  7. java 其它可选方法

    异常处理的一个原则时,只有当你在知道如何处理的情况下才捕获异常,异常处理的一个重要目标时将错误处理代码同错误发生的地点相分离. "被检查异常"强制你在还没准备好处理错误的时候被迫加 ...

  8. Zookeeper的java客户端API使用方法(五)

    前面几篇博文,我们简单的介绍了一下zookeeper,如何安装zookeeper集群,以及如何使用命令行等.这篇博文我们重点来看下Zookeeper的java客户端API使用方式. 创建会话 客户端可 ...

  9. nodejs mysql 执行多条sql语句

    执行多条查询语句 为了安全起见,默认情况下是不允许执行多条查询语句的.要使用多条查询语句的功能,就需要在创建数据库连接的时候打开这一功能: var connection = mysql.createC ...

  10. 跟据经纬度实现附近搜索Java实现

    现在很多手机软件都用附近搜索功能,但具体是怎么实现的呢>在网上查了很多资料,mysql空间数据库.矩形算法.geohash我都用过了,当数据上了百万之后mysql空间数据库方法是最强最精确的(查 ...