internal void SelectionToNative <T>(Action <T, T> assert) { ConverterRevit converter = new ConverterRevit(); converter.SetContextDocument(fixture.SourceDoc); var spkElems = fixture.Selection.Select(x => converter.ConvertToSpeckle(x) as Base).ToList(); converter = new ConverterRevit(); converter.SetContextDocument(fixture.NewDoc); var revitEls = new List <object>(); var resEls = new List <object>(); xru.RunInTransaction(() => { //revitEls = spkElems.Select(x => kit.ConvertToNative(x)).ToList(); foreach (var el in spkElems) { var res = converter.ConvertToNative(el); if (res is List <ApplicationPlaceholderObject> apls) { resEls.AddRange(apls); } else { resEls.Add(el); } } }, fixture.NewDoc).Wait(); Assert.Empty(converter.ConversionErrors); for (var i = 0; i < revitEls.Count; i++) { var sourceElem = (T)(object)fixture.RevitElements[i]; var destElement = (T)((ApplicationPlaceholderObject)resEls[i]).NativeObject; assert(sourceElem, (T)destElement); } }
/// <summary> /// Gets elements from the fixture SourceDoc /// Converts them to Speckle /// Creates a new Doc (or uses the open one if open!) /// Converts the speckle objects to Native /// </summary> /// <typeparam name="T"></typeparam> /// <param name="assert"></param> internal List <object> SpeckleToNative <T>(Action <T, T> assert, UpdateData ud = null) { Document doc = null; IList <Element> elements = null; List <ApplicationPlaceholderObject> appPlaceholders = null; if (ud == null) { doc = fixture.SourceDoc; elements = fixture.RevitElements; } else { doc = ud.Doc; elements = ud.Elements; appPlaceholders = ud.AppPlaceholders; } ConverterRevit converter = new ConverterRevit(); converter.SetContextDocument(doc); //setting context objects for nested routine converter.SetContextObjects(elements.Select(obj => new ApplicationPlaceholderObject { applicationId = obj.UniqueId }).ToList()); var spkElems = elements.Select(x => converter.ConvertToSpeckle(x)).Where(x => x != null).ToList(); converter = new ConverterRevit(); converter.SetContextDocument(fixture.NewDoc); //setting context objects for update routine if (appPlaceholders != null) { converter.SetPreviousContextObjects(appPlaceholders); } converter.SetContextObjects(spkElems.Select(x => new ApplicationPlaceholderObject { applicationId = x.applicationId, NativeObject = x }).ToList()); var resEls = new List <object>(); //used to associate th nested Base objects with eh flat revit ones var flatSpkElems = new List <Base>(); xru.RunInTransaction(() => { foreach (var el in spkElems) { object res = null; try { res = converter.ConvertToNative(el); } catch (Exception e) { converter.ConversionErrors.Add(new Error(e.Message, e.StackTrace)); } if (res is List <ApplicationPlaceholderObject> apls) { resEls.AddRange(apls); flatSpkElems.Add(el); if (el["elements"] != null) { flatSpkElems.AddRange(el["elements"] as List <Base>); } } else { resEls.Add(res); flatSpkElems.Add(el); } } }, fixture.NewDoc).Wait(); Assert.Empty(converter.ConversionErrors); for (var i = 0; i < spkElems.Count; i++) { var sourceElem = (T)(object)elements.FirstOrDefault(x => x.UniqueId == flatSpkElems[i].applicationId); var destElement = (T)((ApplicationPlaceholderObject)resEls[i]).NativeObject; assert(sourceElem, destElement); } return(resEls); }