• 【Revit】族及项目下创建拉伸,融合,放样


    族:

    Ps. 函数里面的ConvertToInternalUnits这个方法,是将毫米单位转成recit内部单位,这个转换可以自行转换,代码这边没有贴出来。

    public static Element GetHostInstance(Document doc, CurveArrArray curveArrs, XYZ faceNormal, double start, double end, bool IsSolid = true)
            {
                Element element = null;
    #if Revit2018
                element = doc.FamilyCreate.NewExtrusion(IsSolid,
                curveArrs,
                SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(faceNormal, new XYZ(start * faceNormal.X, start * faceNormal.Y, start * faceNormal.Z).ConvertToInternalUnits())),
                Math.Abs(end - start).ConvertToInternalUnits());
    #elif Revit2019
                element = doc.FamilyCreate.NewExtrusion(IsSolid, curveArrs,
                            SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(faceNormal, new XYZ(start * faceNormal.X, start * faceNormal.Y, start * faceNormal.Z).ConvertToInternalUnits())),
                            Math.Abs(end - start).ConvertToInternalUnits());
    #else
                element = doc.FamilyCreate.NewExtrusion(IsSolid, curveArrs,
                SketchPlane.Create(doc, new Plane(faceNormal, new XYZ(start * faceNormal.X, start * faceNormal.Y, start * faceNormal.Z).ConvertToInternalUnits())),
                Math.Abs(end - start).ConvertToInternalUnits());
    #endif
                return element;
            }
            //创建拉伸
            public static Extrusion CreateExtrusion(Document doc, CurveArrArray curveArrs, XYZ faceNormal, double start, double end, bool IsSolid = true)
            {
                return GetHostInstance(doc, curveArrs, faceNormal, start, end, IsSolid) as Extrusion;
            }
         //创建融合
            public static Blend CreateBlend(Document doc, CurveArray topCurves, CurveArray bottomCurves, XYZ faceNormal, double start, bool IsSolid = true)
            {
                var plane = CreateSketchPlane(doc, faceNormal, start);
                var blend = doc.FamilyCreate.NewBlend(IsSolid, topCurves, bottomCurves, plane);
                return blend;
            }
          //创建放样
            public static Sweep CreateSweep(Document doc, CurveArrArray profileArray, XYZ start, XYZ end, bool IsSolid = true)
            {
                XYZ xvec = new XYZ(end.X - start.X, end.Y - start.Y, 0).Normalize();
                XYZ yvec = XYZ.BasisZ;
                start = start.ConvertToInternalUnits();
                end = end.ConvertToInternalUnits();
                var plane = SketchPlane.Create(doc, CreatePlane(xvec, yvec, start));
                SweepProfile profile = doc.Application.Create.NewCurveLoopsProfile(profileArray);
    
                Curve curve = Line.CreateBound(start, end);
                CurveArray curves = new CurveArray();
                curves.Append(curve);
                return doc.FamilyCreate.NewSweep(IsSolid, curves, plane, profile, 0, ProfilePlaneLocation.Start);
            }
    
            public static SketchPlane CreateSketchPlane(Document doc, XYZ faceNormal, XYZ origin)
            {
                SketchPlane element = null;
    #if Revit2018
               element = SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(faceNormal, origin));
    #elif Revit2019
                element = SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(faceNormal, origin));
    #else
                element = SketchPlane.Create(doc, new Plane(faceNormal, origin));
    #endif
                return element;
            }
    
            public static SketchPlane CreateSketchPlane(Document doc, XYZ faceNormal, double start)
            {
                SketchPlane element = null;
    #if Revit2018
               element = SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(faceNormal, new XYZ(start * faceNormal.X, start * faceNormal.Y, start * faceNormal.Z).ConvertToInternalUnits()));
    #elif Revit2019
                element = SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(faceNormal, new XYZ(start * faceNormal.X, start * faceNormal.Y, start * faceNormal.Z).ConvertToInternalUnits()));
    #else
                element = SketchPlane.Create(doc, new Plane(faceNormal, new XYZ(start * faceNormal.X, start * faceNormal.Y, start * faceNormal.Z).ConvertToInternalUnits()));
    #endif
                return element;
            }

    项目:

     先来一段项目文档下,拉伸的测试。复制可直接用(需要自己开事务):

            public static void CreateCubicDirectShape(Autodesk.Revit.UI.UIApplication app)
            {
                List<Curve> profile = new List<Curve>();
    
                double edgeLength = 2.0;
                XYZ p1 = new XYZ(edgeLength, 0, 0);
                XYZ p2 = new XYZ(edgeLength, edgeLength, 0);
                XYZ p3 = new XYZ(0, edgeLength, 0);
                XYZ p4 = new XYZ(0, 0, 0);
    
                profile.Add(Line.CreateBound(p1, p2));
                profile.Add(Line.CreateBound(p2, p3));
                profile.Add(Line.CreateBound(p3, p4));
                profile.Add(Line.CreateBound(p4, p1));
    
                CurveLoop curveLoop = CurveLoop.Create(profile);
                SolidOptions options = new SolidOptions(ElementId.InvalidElementId, ElementId.InvalidElementId);
                Solid cubic = GeometryCreationUtilities.CreateExtrusionGeometry(new CurveLoop[] { curveLoop }, XYZ.BasisZ, 10);
                // create direct shape and assign the sphere shape
                DirectShape ds = DirectShape.CreateElement(app.ActiveUIDocument.Document, new ElementId(BuiltInCategory.OST_Floors), app.ActiveAddInId.GetGUID().ToString(), "");
    
    
                ds.AppendShape(new GeometryObject[] { cubic });
    
                edgeLength = 3.0;
                p1 = new XYZ(edgeLength, 0, 0);
                p2 = new XYZ(edgeLength, edgeLength, 0);
                p3 = new XYZ(0, edgeLength, 0);
                p4 = new XYZ(0, 0, 0);
                profile = new List<Curve>();
                profile.Add(Line.CreateBound(p1, p2));
                profile.Add(Line.CreateBound(p2, p3));
                profile.Add(Line.CreateBound(p3, p4));
                profile.Add(Line.CreateBound(p4, p1));
    
                var curveLoop2 = CurveLoop.Create(profile);
                var cubic2 = GeometryCreationUtilities.CreateExtrusionGeometry(new CurveLoop[] { curveLoop2 }, -XYZ.BasisZ, 5);
                ds.AppendShape(new GeometryObject[] { cubic2 });
            }

    以下是正式代码:

     正式代码没有了。。。因为目前没有找到在项目下空心剪切的实现方法,那就没必要继续研究下去了。。

  • 相关阅读:
    Mac下Mysql启动异常["ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)"]
    Appium的前世今生
    appium自动化测试
    ubuntu下nvm,node以及npm的安装与使用
    Android反编译
    Android 常用 adb 命令总结
    Android SDK开发常用工具的使用及其异常处理
    如何获取android app的Activity
    Android 上多方式定位元素(python)
    获得android应用的版本号
  • 原文地址:https://www.cnblogs.com/mqxs/p/12652036.html
Copyright © 2020-2023  润新知