示例#1
0
        private Value GetCurvesFromFamily(Autodesk.Revit.DB.FamilyInstance fi, int count,
                                          Autodesk.Revit.DB.Options options)
        {
            FamilySymbol fs = fi.Symbol;

            //Autodesk.Revit.DB.GeometryElement geomElem = fs.get_Geometry(options);
            Autodesk.Revit.DB.GeometryElement geomElem = fi.get_Geometry(options);
            // our particular case of a loaded mass family with no joins has no geom in the instance

            //fi.GetOriginalGeometry(options);
            //fi.GetTransform()

            Autodesk.Revit.DB.CurveArray     curves    = new CurveArray();
            Autodesk.Revit.DB.ReferenceArray curveRefs = new ReferenceArray();


            //Find all curves and insert them into curve array
            AddCurves(fi, geomElem, count, ref curves);

            //curves.Append(GetCurve(fi, options)); //test

            //extract references for downstream use
            foreach (Curve c in curves)
            {
                curveRefs.Append(c.Reference);
            }

            //convert curvearray into list using Stephens MakeEnumerable
            Value result = Value.NewList(Utils.SequenceToFSharpList(
                                             dynUtils.MakeEnumerable(curves).Select(Value.NewContainer)
                                             ));


            return(result);
        }
示例#2
0
        public override Value Evaluate(FSharpList <Value> args)
        {
            var input = args[0];

            //create some geometry options so that we compute references
            Autodesk.Revit.DB.Options opts = new Options();
            opts.ComputeReferences        = true;
            opts.DetailLevel              = ViewDetailLevel.Medium;
            opts.IncludeNonVisibleObjects = false;


            if (input.IsList)
            {
                var familyList = (input as Value.List).Item;
                int count      = 0;

                var result = Value.NewList(
                    Utils.SequenceToFSharpList(
                        familyList.Select(
                            x =>
                            this.GetCurvesFromFamily(
                                (FamilyInstance)((Value.Container)x).Item,
                                count++,
                                opts
                                )
                            )
                        )
                    );

                foreach (var e in this.Elements.Skip(count))
                {
                    this.DeleteElement(e);
                }

                return(result);
            }
            else // single instance passed in
            {
                int count  = 0;
                var result = this.GetCurvesFromFamily(
                    (FamilyInstance)((Value.Container)input).Item,
                    count,
                    opts
                    );

                foreach (var e in this.Elements.Skip(1)) // cleanup in case of going from list to single instance.
                {
                    this.DeleteElement(e);
                }

                return(result);
            }
        }
示例#3
0
        public override Value Evaluate(FSharpList <Value> args)
        {
            var fs    = (FamilySymbol)((Value.Container)args[1]).Item;
            var input = args[0];
            var level = (Autodesk.Revit.DB.Level)((Value.Container)args[2]).Item;

            if (input.IsList)
            {
                var locList = (input as Value.List).Item;

                int count = 0;

                var result = Value.NewList(
                    Utils.SequenceToFSharpList(
                        locList.Select(
                            x =>
                            this.makeFamilyInstance(
                                ((Value.Container)x).Item,
                                fs,
                                count++,
                                level
                                )
                            )
                        )
                    );

                foreach (var e in this.Elements.Skip(count))
                {
                    this.DeleteElement(e);
                }

                return(result);
            }
            else
            {
                var result = this.makeFamilyInstance(
                    ((Value.Container)input).Item,
                    fs,
                    0,
                    level
                    );

                foreach (var e in this.Elements.Skip(1))
                {
                    this.DeleteElement(e);
                }

                return(result);
            }
        }
示例#4
0
        public override Value Evaluate(FSharpList <Value> args)
        {
            var instance = (FamilyInstance)((Value.Container)args[0]).Item;

            // ADAPTIVE COMPONENT
            if (AdaptiveComponentInstanceUtils.IsAdaptiveComponentInstance(instance))
            {
                var refPtIds = AdaptiveComponentInstanceUtils.GetInstancePlacementPointElementRefIds(instance);
                FSharpList <Value> refPts = FSharpList <Value> .Empty;
                foreach (var id in refPtIds)
                {
                    var pt = dynRevitSettings.Doc.Document.GetElement(id) as ReferencePoint;
                    refPts = FSharpList <Value> .Cons(Value.NewContainer(pt.Position), refPts);
                }
                return(Value.NewList(Utils.SequenceToFSharpList(refPts.Reverse())));
            }

            // INSTANCE WITH PLACEMENT POINT
            var ptRefs = instance.GetFamilyPointPlacementReferences();

            if (ptRefs.Any())
            {
                var pts        = ptRefs.Select(x => x.Location.Origin);
                var containers = pts.Select(Value.NewContainer);
                return(Value.NewList(Utils.SequenceToFSharpList(containers)));
            }

            LocationPoint point = null;
            LocationCurve c     = null;

            // INSTANCE WITH LOCATION POINT
            point = instance.Location as LocationPoint;
            if (point != null)
            {
                return(Value.NewContainer(point.Point));
            }


            //INSTANCE WITH LOCATION CURVE
            c = instance.Location as LocationCurve;
            if (c != null)
            {
                return(Value.NewContainer(c.Curve));
            }

            throw new Exception("A location could not be found for the selected family instance(s).");
        }
示例#5
0
        public override Value Evaluate(FSharpList <Value> args)
        {
            var e = new Expression(FormulaString.ToLower(), EvaluateOptions.IgnoreCase);

            e.Parameters["pi"] = 3.14159265358979;

            var functionLookup = new Dictionary <string, Value>();

            foreach (var arg in args.Select((arg, i) => new { Value = arg, Index = i }))
            {
                var parameter = InPortData[arg.Index].NickName;
                if (arg.Value.IsFunction)
                {
                    functionLookup[parameter] = arg.Value;
                }
                else
                {
                    if (arg.Value.IsNumber)
                    {
                        e.Parameters[parameter] = ((Value.Number)arg.Value).Item;
                    }
                    else if (arg.Value.IsContainer)
                    {
                        e.Parameters[parameter] = Utils.UnwrapToSIUnit(arg.Value).Value *dynSettings.Controller.UnitsManager.UiLengthConversion;
                    }
                }
            }

            e.EvaluateFunction += delegate(string name, FunctionArgs fArgs)
            {
                if (functionLookup.ContainsKey(name))
                {
                    var func = ((Value.Function)functionLookup[name]).Item;
                    fArgs.Result = ((Value.Number)func.Invoke(
                                        Utils.ToFSharpList(
                                            fArgs.Parameters.Select(
                                                p => Value.NewNumber(Convert.ToDouble(p.Evaluate())))))).Item;
                }
                else
                {
                    fArgs.HasResult = false;
                }
            };

            return(Value.NewNumber(Convert.ToDouble(e.Evaluate())));
        }