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); }
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); } }
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); } }
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)."); }
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()))); }