public void Process(DataTreeBranch b, DataTreeBranch currentBranch) { List <XYZ> ptArr = new List <XYZ>(); List <double> weights = new List <double>(); foreach (object o in b.Leaves) { ReferencePoint pt = o as ReferencePoint; ptArr.Add(pt.Position); weights.Add(1); } //only make a curve if //there's enough points if (ptArr.Count > 1) { //make a curve NurbSpline ns = dynElementSettings.SharedInstance.Doc.Application.Application.Create.NewNurbSpline(ptArr, weights); double rawParam = ns.ComputeRawParameter(.5); Transform t = ns.ComputeDerivatives(rawParam, false); XYZ norm = t.BasisZ; if (norm.GetLength() == 0) { norm = XYZ.BasisZ; } Plane p = new Plane(norm, t.Origin); SketchPlane sp = dynElementSettings.SharedInstance.Doc.Document.FamilyCreate.NewSketchPlane(p); sps.Add(sp); ModelNurbSpline c = (ModelNurbSpline)dynElementSettings.SharedInstance.Doc.Document.FamilyCreate.NewModelCurve(ns, sp); //add the element to the collection //so it can be deleted later Elements.Append(c); //create a leaf node on the local branch currentBranch.Leaves.Add(c); } foreach (DataTreeBranch b1 in b.Branches) { //every time you read a branch //create a branch DataTreeBranch newBranch = new DataTreeBranch(); this.Tree.Trunk.Branches.Add(newBranch); Process(b1, newBranch); } }