//[Ignore("Ironically, it fails.")] public async Task SubscribeCommitCreated() { var streamInput = new StreamCreateInput { description = "Hello World", name = "Super Stream 01" }; streamId = await client.StreamCreate(streamInput); Assert.NotNull(streamId); myServerTransport.StreamId = streamId; // FML var branchInput = new BranchCreateInput { description = "Just testing branch create...", name = "awesome-features", streamId = streamId }; var branchId = await client.BranchCreate(branchInput); Assert.NotNull(branchId); client.SubscribeCommitCreated(streamId); client.OnCommitCreated += Client_OnCommitCreated; Thread.Sleep(1000); //let server catch-up var myObject = new Base(); var ptsList = new List <Point>(); for (int i = 0; i < 100; i++) { ptsList.Add(new Point(i, i, i)); } myObject["Points"] = ptsList; var objectId = await Operations.Send(myObject, new List <ITransport>() { myServerTransport }, false, onErrorAction : (name, err) => { Debug.WriteLine("Err in transport"); Debug.WriteLine(err.Message); }); var commitInput = new CommitCreateInput { streamId = streamId, branchName = "awesome-features", objectId = objectId, message = "sending some test points", sourceApplication = "Tests", totalChildrenCount = 20 }; commitId = await client.CommitCreate(commitInput); Assert.NotNull(commitId); await Task.Run(() => { Thread.Sleep(2000); //let client catch-up Assert.NotNull(CommitCreatedInfo); Assert.AreEqual(commitInput.message, CommitCreatedInfo.message); }); }
/// <summary> /// Converts the Revit elements that have been added to the stream by the user, sends them to /// the Server and the local DB, and creates a commit with the objects. /// </summary> /// <param name="state">StreamState passed by the UI</param> public override async Task SendStream(StreamState state, ProgressViewModel progress) { var kit = KitManager.GetDefaultKit(); var converter = kit.LoadConverter(ConnectorRevitUtils.RevitAppName); converter.SetContextDocument(CurrentDoc.Document); var streamId = state.StreamId; var client = state.Client; var selectedObjects = GetSelectionFilterObjects(state.Filter); state.SelectedObjectIds = selectedObjects.Select(x => x.UniqueId).ToList(); if (!selectedObjects.Any()) { progress.Report.LogOperationError(new Exception("There are zero objects to send. Please use a filter, or set some via selection.")); return; } converter.SetContextObjects(selectedObjects.Select(x => new ApplicationPlaceholderObject { applicationId = x.UniqueId }).ToList()); var commitObject = new Base(); var conversionProgressDict = new ConcurrentDictionary <string, int>(); conversionProgressDict["Conversion"] = 0; progress.Max = selectedObjects.Count(); var convertedCount = 0; var placeholders = new List <Base>(); foreach (var revitElement in selectedObjects) { try { if (revitElement == null) { continue; } if (!converter.CanConvertToSpeckle(revitElement)) { progress.Report.Log($"Skipped not supported type: {revitElement.GetType()}, name {revitElement.Name}"); continue; } if (progress.CancellationTokenSource.Token.IsCancellationRequested) { return; } var conversionResult = converter.ConvertToSpeckle(revitElement); conversionProgressDict["Conversion"]++; progress.Update(conversionProgressDict); placeholders.Add(new ApplicationPlaceholderObject { applicationId = revitElement.UniqueId, ApplicationGeneratedId = revitElement.UniqueId }); convertedCount++; //hosted elements will be returned as `null` by the ConvertToSpeckle method //since they are handled when converting their parents if (conversionResult != null) { var category = $"@{revitElement.Category.Name}"; if (commitObject[category] == null) { commitObject[category] = new List <Base>(); } ((List <Base>)commitObject[category]).Add(conversionResult); } } catch (Exception e) { progress.Report.LogConversionError(e); } } progress.Report.Merge(converter.Report); if (convertedCount == 0) { progress.Report.LogConversionError(new Exception("Zero objects converted successfully. Send stopped.")); return; } if (progress.CancellationTokenSource.Token.IsCancellationRequested) { return; } var transports = new List <ITransport>() { new ServerTransport(client.Account, streamId) }; var objectId = await Operations.Send( @object : commitObject, cancellationToken : progress.CancellationTokenSource.Token, transports : transports, onProgressAction : dict => progress.Update(dict), onErrorAction : (s, e) => { progress.Report.LogOperationError(e); progress.CancellationTokenSource.Cancel(); }, disposeTransports : true ); if (progress.Report.OperationErrorsCount != 0) { return; } if (progress.CancellationTokenSource.Token.IsCancellationRequested) { return; } var actualCommit = new CommitCreateInput() { streamId = streamId, objectId = objectId, branchName = state.BranchName, message = state.CommitMessage != null ? state.CommitMessage : $"Sent {convertedCount} objects from {ConnectorRevitUtils.RevitAppName}.", sourceApplication = ConnectorRevitUtils.RevitAppName, }; if (state.PreviousCommitId != null) { actualCommit.parents = new List <string>() { state.PreviousCommitId }; } try { var commitId = await client.CommitCreate(actualCommit); //await state.RefreshStream(); state.PreviousCommitId = commitId; } catch (Exception e) { progress.Report.LogOperationError(e); } //return state; }
public override async Task SendStream(StreamState state, ProgressViewModel progress) { //throw new NotImplementedException(); var kit = KitManager.GetDefaultKit(); //var converter = new ConverterETABS(); var converter = kit.LoadConverter(ConnectorETABSUtils.ETABSAppName); converter.SetContextDocument(Model); Exceptions.Clear(); var commitObj = new Base(); int objCount = 0; if (state.Filter != null) { state.SelectedObjectIds = GetSelectionFilterObjects(state.Filter); } var totalObjectCount = state.SelectedObjectIds.Count(); if (totalObjectCount == 0) { progress.Report.LogOperationError(new SpeckleException("Zero objects selected; send stopped. Please select some objects, or check that your filter can actually select something.", false)); return; } var conversionProgressDict = new ConcurrentDictionary <string, int>(); conversionProgressDict["Conversion"] = 0; progress.Update(conversionProgressDict); //if( commitObj["@Stories"] == null) //{ // commitObj["@Stories"] = converter.ConvertToSpeckle(("Stories", "ETABS")); //} foreach (var applicationId in state.SelectedObjectIds) { if (progress.CancellationTokenSource.Token.IsCancellationRequested) { return; } Base converted = null; string containerName = string.Empty; var selectedObjectType = ConnectorETABSUtils.ObjectIDsTypesAndNames .Where(pair => pair.Key == applicationId) .Select(pair => pair.Value.Item1).FirstOrDefault(); if (!converter.CanConvertToSpeckle(selectedObjectType)) { progress.Report.Log($"Skipped not supported type: ${selectedObjectType} are not supported"); continue; } Tracker.TrackPageview(Tracker.CONVERT_TOSPECKLE); var typeAndName = ConnectorETABSUtils.ObjectIDsTypesAndNames .Where(pair => pair.Key == applicationId) .Select(pair => pair.Value).FirstOrDefault(); converted = converter.ConvertToSpeckle(typeAndName); if (converted == null) { var exception = new Exception($"Failed to convert object ${applicationId} of type ${selectedObjectType}."); progress.Report.LogConversionError(exception); continue; } //if (converted != null) //{ // if (commitObj[selectedObjectType] == null) // { // commitObj[selectedObjectType] = new List<Base>(); // } // ((List<Base>)commitObj[selectedObjectType]).Add(converted); //} //objCount++; conversionProgressDict["Conversion"]++; progress.Update(conversionProgressDict); } Base ElementCount = converter.ConvertToSpeckle(("ElementsCount", "ETABS")); if (ElementCount.applicationId != null) { objCount = Convert.ToInt32(ElementCount.applicationId); } else { objCount = 0; } if (commitObj["@Model"] == null) { commitObj["@Model"] = converter.ConvertToSpeckle(("Model", "ETABS")); } if (commitObj["AnalysisResults"] == null) { commitObj["AnalysisResults"] = converter.ConvertToSpeckle(("AnalysisResults", "ETABS")); } progress.Report.Merge(converter.Report); if (objCount == 0) { progress.Report.LogOperationError(new SpeckleException("Zero objects converted successfully. Send stopped.", false)); return; } if (progress.CancellationTokenSource.Token.IsCancellationRequested) { return; } var streamId = state.StreamId; var client = state.Client; var transports = new List <SCT.ITransport>() { new SCT.ServerTransport(client.Account, streamId) }; var objectId = await Operations.Send( @object : commitObj, cancellationToken : progress.CancellationTokenSource.Token, transports : transports, onProgressAction : dict => progress.Update(dict), onErrorAction : (Action <string, Exception>)((s, e) => { progress.Report.LogOperationError(e); progress.CancellationTokenSource.Cancel(); }), disposeTransports : true ); if (progress.Report.OperationErrorsCount != 0) { //RaiseNotification($"Failed to send: \n {Exceptions.Last().Message}"); return; } var actualCommit = new CommitCreateInput { streamId = streamId, objectId = objectId, branchName = state.BranchName, message = state.CommitMessage != null ? state.CommitMessage : $"Pushed {objCount} elements from ETABS.", sourceApplication = ConnectorETABSUtils.ETABSAppName }; if (state.PreviousCommitId != null) { actualCommit.parents = new List <string>() { state.PreviousCommitId }; } try { var commitId = await client.CommitCreate(actualCommit); //await state.RefreshStream(); state.PreviousCommitId = commitId; //PersistAndUpdateStreamInFile(state); //RaiseNotification($"{objCount} objects sent to {state.Stream.name}. 🚀"); } catch (Exception e) { //Globals.Notify($"Failed to create commit.\n{e.Message}"); progress.Report.LogOperationError(e); } //return state; }
/// <summary> /// Converts the Revit elements that have been added to the stream by the user, sends them to /// the Server and the local DB, and creates a commit with the objects. /// </summary> /// <param name="state">StreamState passed by the UI</param> public override async Task <StreamState> SendStream(StreamState state) { ConversionErrors.Clear(); OperationErrors.Clear(); var kit = KitManager.GetDefaultKit(); var converter = kit.LoadConverter(ConnectorRevitUtils.RevitAppName); converter.SetContextDocument(CurrentDoc.Document); var streamId = state.Stream.id; var client = state.Client; var selectedObjects = new List <Element>(); if (state.Filter != null) { selectedObjects = GetSelectionFilterObjects(state.Filter, converter); state.SelectedObjectIds = selectedObjects.Select(x => x.UniqueId).ToList(); } else //selection was by cursor { // TODO: update state by removing any deleted or null object ids selectedObjects = state.SelectedObjectIds.Select(x => CurrentDoc.Document.GetElement(x)).Where(x => x != null).ToList(); } if (!selectedObjects.Any()) { state.Errors.Add(new Exception("There are zero objects to send. Please use a filter, or set some via selection.")); return(state); } converter.SetContextObjects(selectedObjects.Select(x => new ApplicationPlaceholderObject { applicationId = x.UniqueId }).ToList()); var commitObject = new Base(); var conversionProgressDict = new ConcurrentDictionary <string, int>(); conversionProgressDict["Conversion"] = 0; Execute.PostToUIThread(() => state.Progress.Maximum = selectedObjects.Count()); var convertedCount = 0; var placeholders = new List <Base>(); foreach (var revitElement in selectedObjects) { try { if (revitElement == null) { continue; } if (!converter.CanConvertToSpeckle(revitElement)) { state.Errors.Add(new Exception($"Skipping not supported type: {revitElement.GetType()}, name {revitElement.Name}")); continue; } var conversionResult = converter.ConvertToSpeckle(revitElement); conversionProgressDict["Conversion"]++; UpdateProgress(conversionProgressDict, state.Progress); placeholders.Add(new ApplicationPlaceholderObject { applicationId = revitElement.UniqueId, ApplicationGeneratedId = revitElement.UniqueId }); convertedCount++; //hosted elements will be returned as `null` by the ConvertToSpeckle method //since they are handled when converting their parents if (conversionResult != null) { var category = $"@{revitElement.Category.Name}"; if (commitObject[category] == null) { commitObject[category] = new List <Base>(); } ((List <Base>)commitObject[category]).Add(conversionResult); } } catch (Exception e) { state.Errors.Add(e); } } if (converter.Report.ConversionErrorsCount != 0) { // TODO: Get rid of the custom Error class. It's not needed. ConversionErrors.AddRange(converter.Report.ConversionErrors); state.Errors.AddRange(converter.Report.ConversionErrors); } if (convertedCount == 0) { Globals.Notify("Zero objects converted successfully. Send stopped."); return(state); } Execute.PostToUIThread(() => state.Progress.Maximum = (int)commitObject.GetTotalChildrenCount()); if (state.CancellationTokenSource.Token.IsCancellationRequested) { return(state); } var transports = new List <ITransport>() { new ServerTransport(client.Account, streamId) }; var objectId = await Operations.Send( @object : commitObject, cancellationToken : state.CancellationTokenSource.Token, transports : transports, onProgressAction : dict => UpdateProgress(dict, state.Progress), onErrorAction : (s, e) => { OperationErrors.Add(e); // TODO! state.Errors.Add(e); state.CancellationTokenSource.Cancel(); }, disposeTransports : true ); if (OperationErrors.Count != 0) { Globals.Notify("Failed to send."); state.Errors.AddRange(OperationErrors); return(state); } if (state.CancellationTokenSource.Token.IsCancellationRequested) { return(null); } var actualCommit = new CommitCreateInput() { streamId = streamId, objectId = objectId, branchName = state.Branch.name, message = state.CommitMessage != null ? state.CommitMessage : $"Sent {convertedCount} objects from {ConnectorRevitUtils.RevitAppName}.", sourceApplication = ConnectorRevitUtils.RevitAppName, }; if (state.PreviousCommitId != null) { actualCommit.parents = new List <string>() { state.PreviousCommitId }; } try { var commitId = await client.CommitCreate(actualCommit); await state.RefreshStream(); state.PreviousCommitId = commitId; WriteStateToFile(); RaiseNotification($"{convertedCount} objects sent to Speckle 🚀"); } catch (Exception e) { state.Errors.Add(e); Globals.Notify($"Failed to create commit.\n{e.Message}"); } return(state); }
public override async Task SendStream(StreamState state, ProgressViewModel progress) { var kit = KitManager.GetDefaultKit(); var converter = kit.LoadConverter(Utils.BentleyAppName); var streamId = state.StreamId; var client = state.Client; if (Control.InvokeRequired) { Control.Invoke(new SetContextDelegate(converter.SetContextDocument), new object[] { Session.Instance }); } else { converter.SetContextDocument(Session.Instance); } var selectedObjects = new List <Object>(); if (state.Filter != null) { if (Control.InvokeRequired) { state.SelectedObjectIds = (List <string>)Control.Invoke(new GetObjectsFromFilterDelegate(GetObjectsFromFilter), new object[] { state.Filter, converter, progress }); } else { state.SelectedObjectIds = GetObjectsFromFilter(state.Filter, converter, progress); } } if (state.SelectedObjectIds.Count == 0 && !ExportGridLines) { progress.Report.LogOperationError(new Exception("Zero objects selected; send stopped. Please select some objects, or check that your filter can actually select something.")); return; } var commitObj = new Base(); var units = Units.GetUnitsFromString(ModelUnits).ToLower(); commitObj["units"] = units; var conversionProgressDict = new ConcurrentDictionary <string, int>(); conversionProgressDict["Conversion"] = 0; Execute.PostToUIThread(() => progress.Max = state.SelectedObjectIds.Count()); int convertedCount = 0; // grab elements from active model var objs = new List <Element>(); #if (OPENROADS || OPENRAIL) bool convertCivilObject = false; var civObjs = new List <NamedModelEntity>(); if (civilElementKeys.Count(x => state.SelectedObjectIds.Contains(x)) > 0) { if (Control.InvokeRequired) { civObjs = (List <NamedModelEntity>)Control.Invoke(new GetCivilObjectsDelegate(GetCivilObjects), new object[] { state }); } else { civObjs = GetCivilObjects(state); } objs = civObjs.Select(x => x.Element).ToList(); convertCivilObject = true; } else { objs = state.SelectedObjectIds.Select(x => Model.FindElementById((ElementId)Convert.ToUInt64(x))).ToList(); } #else objs = state.SelectedObjectIds.Select(x => Model.FindElementById((ElementId)Convert.ToUInt64(x))).ToList(); #endif #if (OPENBUILDINGS) if (ExportGridLines) { var converted = ConvertGridLines(converter, progress); if (converted == null) { progress.Report.LogConversionError(new Exception($"Failed to convert Gridlines.")); } else { var containerName = "Grid Systems"; if (commitObj[$"@{containerName}"] == null) { commitObj[$"@{containerName}"] = new List <Base>(); } ((List <Base>)commitObj[$"@{containerName}"]).Add(converted); // not sure this makes much sense here conversionProgressDict["Conversion"]++; progress.Update(conversionProgressDict); convertedCount++; } } #endif foreach (var obj in objs) { if (progress.CancellationTokenSource.Token.IsCancellationRequested) { return; } if (obj == null) { progress.Report.Log($"Skipped not found object."); continue; } var objId = obj.ElementId.ToString(); var objType = obj.ElementType; if (!converter.CanConvertToSpeckle(obj)) { progress.Report.Log($"Skipped not supported type: ${objType}. Object ${objId} not sent."); continue; } // convert obj Base converted = null; string containerName = string.Empty; try { var levelCache = Model.GetFileLevelCache(); var objLevel = levelCache.GetLevel(obj.LevelId); var layerName = "Unknown"; if (objLevel != null) { layerName = objLevel.Name; } #if (OPENROADS || OPENRAIL) if (convertCivilObject) { var civilObj = civObjs[objs.IndexOf(obj)]; if (Control.InvokeRequired) { converted = (Base)Control.Invoke(new SpeckleConversionDelegate(converter.ConvertToSpeckle), new object[] { civilObj }); Control.Invoke((Action)(() => { containerName = civilObj.Name == "" ? "Unnamed" : civilObj.Name; })); } else { converted = converter.ConvertToSpeckle(civilObj); containerName = civilObj.Name == "" ? "Unnamed" : civilObj.Name; } } else { if (Control.InvokeRequired) { converted = (Base)Control.Invoke(new SpeckleConversionDelegate(converter.ConvertToSpeckle), new object[] { obj }); } else { converted = converter.ConvertToSpeckle(obj); } containerName = layerName; } #else if (Control.InvokeRequired) { converted = (Base)Control.Invoke(new SpeckleConversionDelegate(converter.ConvertToSpeckle), new object[] { obj }); } else { converted = converter.ConvertToSpeckle(obj); } containerName = layerName; #endif if (converted == null) { progress.Report.LogConversionError(new Exception($"Failed to convert object {objId} of type {objType}.")); continue; } } catch { progress.Report.LogConversionError(new Exception($"Failed to convert object {objId} of type {objType}.")); continue; } /* TODO: adding the feature data and properties per object * foreach (var key in obj.ExtensionDictionary) * { * converted[key] = obj.ExtensionDictionary.GetUserString(key); * } */ if (commitObj[$"@{containerName}"] == null) { commitObj[$"@{containerName}"] = new List <Base>(); } ((List <Base>)commitObj[$"@{containerName}"]).Add(converted); conversionProgressDict["Conversion"]++; progress.Update(conversionProgressDict); converted.applicationId = objId; convertedCount++; } progress.Report.Merge(converter.Report); if (progress.Report.OperationErrorsCount != 0) { return; } if (convertedCount == 0) { progress.Report.LogOperationError(new SpeckleException("Zero objects converted successfully. Send stopped.", false)); return; } if (progress.CancellationTokenSource.Token.IsCancellationRequested) { return; } Execute.PostToUIThread(() => progress.Max = convertedCount); var transports = new List <ITransport>() { new ServerTransport(client.Account, streamId) }; var commitObjId = await Operations.Send( commitObj, progress.CancellationTokenSource.Token, transports, onProgressAction : dict => progress.Update(dict), onErrorAction : (err, exception) => { progress.Report.LogOperationError(exception); progress.CancellationTokenSource.Cancel(); }, disposeTransports : true ); var actualCommit = new CommitCreateInput { streamId = streamId, objectId = commitObjId, branchName = state.BranchName, message = state.CommitMessage != null ? state.CommitMessage : $"Pushed {convertedCount} elements from {Utils.AppName}.", sourceApplication = Utils.BentleyAppName }; if (state.PreviousCommitId != null) { actualCommit.parents = new List <string>() { state.PreviousCommitId }; } try { var commitId = await client.CommitCreate(actualCommit); state.PreviousCommitId = commitId; } catch (Exception e) { progress.Report.LogOperationError(e); } }
//GH_Structure<IGH_Goo> transportsInput; /// <summary> /// Registers all the output parameters for this component. /// </summary> /// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param> protected override void SolveInstance(IGH_DataAccess DA) { DA.DisableGapLogic(); if (!foundKit) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "No kit found on this machine."); return; } if (RunCount == 1) { CreateCancelationToken(); OutputWrappers = new List <StreamWrapper>(); DA.GetDataTree(0, out dataInput); //the active document may have changed Converter.SetContextDocument(RhinoDoc.ActiveDoc); // Note: this method actually converts the objects to speckle too converted = Extras.Utilities.DataTreeToNestedLists(dataInput, Converter, source.Token, () => { //ReportProgress("Conversion", Math.Round(convertedCount++ / (double)DataInput.DataCount, 2)); }); } //if (RunCount > 1) // return; if (InPreSolve) { string messageInput = ""; IGH_Goo transportInput = null; DA.GetData(1, ref transportInput); DA.GetData(2, ref messageInput); var transportsInput = new List <IGH_Goo> { transportInput }; //var transportsInput = Params.Input[1].VolatileData.AllData(true).Select(x => x).ToList(); Tracker.TrackPageview("send", "sync"); var task = Task.Run(async() => { if (converted.Count == 0) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Zero objects converted successfully. Send stopped."); return(null); } var ObjectToSend = new Base(); ObjectToSend["@data"] = converted; var TotalObjectCount = ObjectToSend.GetTotalChildrenCount(); if (source.Token.IsCancellationRequested) { Message = "Out of time"; return(null); } // Part 2: create transports var Transports = new List <ITransport>(); if (transportsInput.Count() == 0) { // TODO: Set default account + "default" user stream } var transportBranches = new Dictionary <ITransport, string>(); int t = 0; foreach (var data in transportsInput) { var transport = data.GetType().GetProperty("Value").GetValue(data); if (transport is string s) { try { transport = new StreamWrapper(s); } catch (Exception e) { // TODO: Check this with team. AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, e.Message); } } if (transport is StreamWrapper sw) { if (sw.Type == StreamWrapperType.Undefined) { AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Input stream is invalid."); continue; } if (sw.Type == StreamWrapperType.Commit) { AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Cannot push to a specific commit stream url."); continue; } if (sw.Type == StreamWrapperType.Object) { AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Cannot push to a specific object stream url."); continue; } Account acc; try { acc = sw.GetAccount().Result; } catch (Exception e) { AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, e.InnerException?.Message ?? e.Message); continue; } var serverTransport = new ServerTransport(acc, sw.StreamId) { TransportName = $"T{t}" }; transportBranches.Add(serverTransport, sw.BranchName ?? "main"); Transports.Add(serverTransport); } else if (transport is ITransport otherTransport) { otherTransport.TransportName = $"T{t}"; Transports.Add(otherTransport); } t++; } if (Transports.Count == 0) { AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Could not identify any valid transports to send to."); return(null); } // Part 3: actually send stuff! if (source.Token.IsCancellationRequested) { Message = "Out of time"; return(null); } // Part 3.1: persist the objects var BaseId = await Operations.Send( ObjectToSend, source.Token, Transports, useDefaultCache: UseDefaultCache, onProgressAction: y => { }, onErrorAction: (x, z) => { }, disposeTransports: true); var message = messageInput;//.get_FirstItem(true).Value; if (message == "") { message = $"Pushed {TotalObjectCount} elements from Grasshopper."; } var prevCommits = new List <StreamWrapper>(); foreach (var transport in Transports) { if (source.Token.IsCancellationRequested) { Message = "Out of time"; return(null); } if (!(transport is ServerTransport)) { continue; // skip non-server transports (for now) } try { var client = new Client(((ServerTransport)transport).Account); var branch = transportBranches.ContainsKey(transport) ? transportBranches[transport] : "main"; var commitCreateInput = new CommitCreateInput { branchName = branch, message = message, objectId = BaseId, streamId = ((ServerTransport)transport).StreamId, sourceApplication = Applications.Grasshopper }; // Check to see if we have a previous commit; if so set it. var prevCommit = prevCommits.FirstOrDefault(c => c.ServerUrl == client.ServerUrl && c.StreamId == ((ServerTransport)transport).StreamId); if (prevCommit != null) { commitCreateInput.parents = new List <string>() { prevCommit.CommitId }; } var commitId = await client.CommitCreate(source.Token, commitCreateInput); var wrapper = new StreamWrapper($"{client.Account.serverInfo.url}/streams/{((ServerTransport)transport).StreamId}/commits/{commitId}?u={client.Account.userInfo.id}"); prevCommits.Add(wrapper); } catch (Exception e) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, e.Message); return(null); } } if (source.Token.IsCancellationRequested) { Message = "Out of time"; return(null); } return(prevCommits); }, source.Token); TaskList.Add(task); return; } if (source.IsCancellationRequested) { AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run out of time!"); } else if (!GetSolveResults(DA, out List <StreamWrapper> outputWrappers)) { AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Not running multithread"); } else { OutputWrappers.AddRange(outputWrappers); DA.SetDataList(0, outputWrappers); return; } }
public override async Task <StreamState> SendStream(StreamState state) { ConversionErrors.Clear(); OperationErrors.Clear(); var kit = KitManager.GetDefaultKit(); var converter = kit.LoadConverter(Utils.BentleyAppName); if (Control.InvokeRequired) { Control.Invoke(new SetContextDelegate(converter.SetContextDocument), new object[] { Session.Instance }); } else { converter.SetContextDocument(Session.Instance); } var streamId = state.Stream.id; var client = state.Client; var selectedObjects = new List <Object>(); if (state.Filter != null) { if (Control.InvokeRequired) { state.SelectedObjectIds = (List <string>)Control.Invoke(new GetObjectsFromFilterDelegate(GetObjectsFromFilter), new object[] { state.Filter, converter }); } else { state.SelectedObjectIds = GetObjectsFromFilter(state.Filter, converter); } } if (state.SelectedObjectIds.Count == 0 && !ExportGridLines) { RaiseNotification("Zero objects selected; send stopped. Please select some objects, or check that your filter can actually select something."); return(state); } var commitObj = new Base(); var units = Units.GetUnitsFromString(ModelUnits).ToLower(); commitObj["units"] = units; var conversionProgressDict = new ConcurrentDictionary <string, int>(); conversionProgressDict["Conversion"] = 0; Execute.PostToUIThread(() => state.Progress.Maximum = state.SelectedObjectIds.Count()); int convertedCount = 0; // grab elements from active model var objs = new List <Element>(); #if (OPENROADS || OPENRAIL) bool convertCivilObject = false; var civObjs = new List <NamedModelEntity>(); if (civilElementKeys.Count(x => state.SelectedObjectIds.Contains(x)) > 0) { if (Control.InvokeRequired) { civObjs = (List <NamedModelEntity>)Control.Invoke(new GetCivilObjectsDelegate(GetCivilObjects), new object[] { state }); } else { civObjs = GetCivilObjects(state); } objs = civObjs.Select(x => x.Element).ToList(); convertCivilObject = true; } else { objs = state.SelectedObjectIds.Select(x => Model.FindElementById((ElementId)Convert.ToUInt64(x))).ToList(); } #else objs = state.SelectedObjectIds.Select(x => Model.FindElementById((ElementId)Convert.ToUInt64(x))).ToList(); #endif #if (OPENBUILDINGS) if (ExportGridLines) { // grab grid lines ITFApplication appInst = new TFApplicationList(); if (0 == appInst.GetProject(0, out ITFLoadableProjectList projList) && projList != null) { ITFLoadableProject proj = projList.AsTFLoadableProject; if (null == proj) { return(null); } ITFDrawingGrid drawingGrid = null; if (Control.InvokeRequired) { Control.Invoke((Action)(() => { proj.GetDrawingGrid(false, 0, out drawingGrid); })); } else { proj.GetDrawingGrid(false, 0, out drawingGrid); } if (null == drawingGrid) { return(null); } Base converted; if (Control.InvokeRequired) { converted = (Base)Control.Invoke(new SpeckleConversionDelegate(converter.ConvertToSpeckle), new object[] { drawingGrid }); } else { converted = converter.ConvertToSpeckle(drawingGrid); } if (converted != null) { var containerName = "Grid Systems"; if (commitObj[$"@{containerName}"] == null) { commitObj[$"@{containerName}"] = new List <Base>(); } ((List <Base>)commitObj[$"@{containerName}"]).Add(converted); // not sure this makes much sense here conversionProgressDict["Conversion"]++; UpdateProgress(conversionProgressDict, state.Progress); //gridLine.applicationId = ??; convertedCount++; } } } #endif foreach (var obj in objs) { if (state.CancellationTokenSource.Token.IsCancellationRequested) { return(null); } if (obj == null) { state.Errors.Add(new Exception($"Failed to find local object.")); continue; } var objId = obj.ElementId.ToString(); var objType = obj.ElementType; if (!converter.CanConvertToSpeckle(obj)) { state.Errors.Add(new Exception($"Objects of type ${objType} are not supported")); continue; } // convert obj // try catch to prevent memory access violation crash in case a conversion goes wrong Base converted = null; string containerName = string.Empty; try { var levelCache = Model.GetFileLevelCache(); var objLevel = levelCache.GetLevel(obj.LevelId); var layerName = "Unknown"; if (objLevel != null) { layerName = objLevel.Name; } #if (OPENROADS || OPENRAIL) if (convertCivilObject) { var civilObj = civObjs[objs.IndexOf(obj)]; if (Control.InvokeRequired) { converted = (Base)Control.Invoke(new SpeckleConversionDelegate(converter.ConvertToSpeckle), new object[] { civilObj }); Control.Invoke((Action)(() => { containerName = civilObj.Name == "" ? "Unnamed" : civilObj.Name; })); } else { converted = converter.ConvertToSpeckle(civilObj); containerName = civilObj.Name == "" ? "Unnamed" : civilObj.Name; } } else { if (Control.InvokeRequired) { converted = (Base)Control.Invoke(new SpeckleConversionDelegate(converter.ConvertToSpeckle), new object[] { obj }); } else { converted = converter.ConvertToSpeckle(obj); } containerName = layerName; } #else if (Control.InvokeRequired) { converted = (Base)Control.Invoke(new SpeckleConversionDelegate(converter.ConvertToSpeckle), new object[] { obj }); } else { converted = converter.ConvertToSpeckle(obj); } containerName = layerName; #endif if (converted == null) { state.Errors.Add(new Exception($"Failed to convert object ${objId} of type ${objType}.")); continue; } } catch { state.Errors.Add(new Exception($"Failed to convert object {objId} of type {objType}.")); continue; } /* TODO: adding the feature data and properties per object * foreach (var key in obj.ExtensionDictionary) * { * converted[key] = obj.ExtensionDictionary.GetUserString(key); * } */ if (commitObj[$"@{containerName}"] == null) { commitObj[$"@{containerName}"] = new List <Base>(); } ((List <Base>)commitObj[$"@{containerName}"]).Add(converted); conversionProgressDict["Conversion"]++; UpdateProgress(conversionProgressDict, state.Progress); converted.applicationId = objId; convertedCount++; } Execute.PostToUIThread(() => state.Progress.Maximum = convertedCount); var transports = new List <ITransport>() { new ServerTransport(client.Account, streamId) }; var commitObjId = await Operations.Send( commitObj, state.CancellationTokenSource.Token, transports, onProgressAction : dict => UpdateProgress(dict, state.Progress), onErrorAction : (err, exception) => { Exceptions.Add(exception); } ); if (Exceptions.Count != 0) { RaiseNotification($"Failed to send: \n {Exceptions.Last().Message}"); return(null); } if (convertedCount > 0) { var actualCommit = new CommitCreateInput { streamId = streamId, objectId = commitObjId, branchName = state.Branch.name, message = state.CommitMessage != null ? state.CommitMessage : $"Pushed {convertedCount} elements from {Utils.AppName}.", sourceApplication = Utils.BentleyAppName }; if (state.PreviousCommitId != null) { actualCommit.parents = new List <string>() { state.PreviousCommitId }; } try { var commitId = await client.CommitCreate(actualCommit); await state.RefreshStream(); state.PreviousCommitId = commitId; try { PersistAndUpdateStreamInFile(state); } catch (Exception e) { } RaiseNotification($"{convertedCount} objects sent to {state.Stream.name}."); } catch (Exception e) { Globals.Notify($"Failed to create commit.\n{e.Message}"); state.Errors.Add(e); } } else { Globals.Notify($"Did not create commit: no objects could be converted."); } return(state); }
public override async Task SendStream(StreamState state, ProgressViewModel progress) { var kit = KitManager.GetDefaultKit(); var converter = kit.LoadConverter(Utils.AutocadAppName); var streamId = state.StreamId; var client = state.Client; if (state.Filter != null) { state.SelectedObjectIds = GetObjectsFromFilter(state.Filter, converter); } // remove deleted object ids var deletedElements = new List <string>(); foreach (var handle in state.SelectedObjectIds) { if (Doc.Database.TryGetObjectId(Utils.GetHandle(handle), out ObjectId id)) { if (id.IsErased || id.IsNull) { deletedElements.Add(handle); } } } state.SelectedObjectIds = state.SelectedObjectIds.Where(o => !deletedElements.Contains(o)).ToList(); if (state.SelectedObjectIds.Count == 0) { progress.Report.LogOperationError(new Exception("Zero objects selected; send stopped. Please select some objects, or check that your filter can actually select something.")); return; } var commitObj = new Base(); var units = Units.GetUnitsFromString(Doc.Database.Insunits.ToString()); commitObj["units"] = units; var conversionProgressDict = new ConcurrentDictionary <string, int>(); conversionProgressDict["Conversion"] = 0; Execute.PostToUIThread(() => progress.Max = state.SelectedObjectIds.Count()); int convertedCount = 0; bool renamedlayers = false; using (Transaction tr = Doc.Database.TransactionManager.StartTransaction()) { // set the context doc for conversion - this is set inside the transaction loop because the converter retrieves this transaction for all db editing when the context doc is set! converter.SetContextDocument(Doc); foreach (var autocadObjectHandle in state.SelectedObjectIds) { if (progress.CancellationTokenSource.Token.IsCancellationRequested) { return; } // get the db object from id Handle hn = Utils.GetHandle(autocadObjectHandle); DBObject obj = hn.GetObject(out string type, out string layer); if (obj == null) { progress.Report.Log($"Skipped not found object: ${autocadObjectHandle}."); continue; } if (!converter.CanConvertToSpeckle(obj)) { progress.Report.Log($"Skipped not supported type: ${type}. Object ${obj.Id} not sent."); continue; } // convert obj Base converted = null; string containerName = string.Empty; converted = converter.ConvertToSpeckle(obj); if (converted == null) { progress.Report.LogConversionError(new Exception($"Failed to convert object {autocadObjectHandle} of type {type}.")); continue; } /* TODO: adding the extension dictionary / xdata per object * foreach (var key in obj.ExtensionDictionary) * { * converted[key] = obj.ExtensionDictionary.GetUserString(key); * } */ if (obj is BlockReference) { containerName = "Blocks"; } else { // remove invalid chars from layer name string cleanLayerName = Utils.RemoveInvalidDynamicPropChars(layer); containerName = cleanLayerName; if (!cleanLayerName.Equals(layer)) { renamedlayers = true; } } if (commitObj[$"@{containerName}"] == null) { commitObj[$"@{containerName}"] = new List <Base>(); } ((List <Base>)commitObj[$"@{containerName}"]).Add(converted); conversionProgressDict["Conversion"]++; progress.Update(conversionProgressDict); converted.applicationId = autocadObjectHandle; convertedCount++; } tr.Commit(); } progress.Report.Merge(converter.Report); if (convertedCount == 0) { progress.Report.LogOperationError(new SpeckleException("Zero objects converted successfully. Send stopped.", false)); return; } if (renamedlayers) { progress.Report.Log("Replaced illegal chars ./ with - in one or more layer names."); } if (progress.CancellationTokenSource.Token.IsCancellationRequested) { return; } Execute.PostToUIThread(() => progress.Max = convertedCount); var transports = new List <ITransport>() { new ServerTransport(client.Account, streamId) }; var commitObjId = await Operations.Send( commitObj, progress.CancellationTokenSource.Token, transports, onProgressAction : dict => progress.Update(dict), onErrorAction : (err, exception) => { progress.Report.LogOperationError(exception); progress.CancellationTokenSource.Cancel(); }, disposeTransports : true ); if (progress.Report.OperationErrorsCount != 0) { return; } var actualCommit = new CommitCreateInput { streamId = streamId, objectId = commitObjId, branchName = state.BranchName, message = state.CommitMessage != null ? state.CommitMessage : $"Pushed {convertedCount} elements from {Utils.AppName}.", sourceApplication = Utils.AutocadAppName }; if (state.PreviousCommitId != null) { actualCommit.parents = new List <string>() { state.PreviousCommitId }; } try { var commitId = await client.CommitCreate(actualCommit); state.PreviousCommitId = commitId; } catch (Exception e) { progress.Report.LogOperationError(e); } }
public override async Task <StreamState> SendStream(StreamState state) { if (state.Filter != null) { state.SelectedObjectIds = GetSelectedObjects(); } var commitObject = new Base(); var streamId = state.Stream.id; var client = state.Client; // var selectedObjects = new List <Entity>(); //if (state.Filter != null) //{ // selectedObjects = GetSelectionFilterObjects(state.Filter); // state.SelectedObjectIds = selectedObjects.Select(x => x.UniqueId).ToList(); //} //else //selection was by cursor //{ // // TODO: update state by removing any deleted or null object ids //selectedObjects = state.SelectedObjectIds.Select(x => CurrentDoc.Document.GetElement(x)).Where(x => x != null).ToList(); //selectedObjects = state.SelectedObjectIds.Select(TopSolid.Kernel.UI.Selections.CurrentSelections.GetSelectedEntities()).ToString().ToList(); //} // var transports = new List <ITransport>() { new ServerTransport(client.Account, streamId) }; /* successful test for sending a topSolid line created by code ==> TODO same with line drawn graphically * TopSolid.Kernel.G.D3.Point point1 = new TopSolid.Kernel.G.D3.Point(0, 0, 0); * TopSolid.Kernel.G.D3.Point point2 = new TopSolid.Kernel.G.D3.Point(1, 1, 0); * commitObject = ConvertersSpeckleTopSolid.LineToSpeckle(new TopSolid.Kernel.G.D3.Curves.LineCurve(point1, point2)); */ var objectId = await Operations.Send( @object : commitObject, cancellationToken : state.CancellationTokenSource.Token, transports : transports, //onProgressAction: dict => UpdateProgress(dict, state.Progress), onErrorAction : (s, e) => { //OperationErrors.Add(e); // TODO! state.Errors.Add(e); state.CancellationTokenSource.Cancel(); } ); if (OperationErrors.Count != 0) { Globals.Notify("Failed to send."); state.Errors.AddRange(OperationErrors); return(state); } if (state.CancellationTokenSource.Token.IsCancellationRequested) { return(null); } var actualCommit = new CommitCreateInput() { streamId = streamId, objectId = objectId, branchName = state.Branch.name, message = state.CommitMessage != null ? state.CommitMessage : "Hello from TopSolid",//$"Sent {convertedCount} objects from {ConnectorRevitUtils.RevitAppName}.", sourceApplication = TopSolid.Kernel.UI.Application.Name, }; if (state.PreviousCommitId != null) { actualCommit.parents = new List <string>() { state.PreviousCommitId }; } try { var commitId = await client.CommitCreate(actualCommit); await state.RefreshStream(); state.PreviousCommitId = commitId; //TO DO : Add the Objects Count //WriteStateToFile(); RaiseNotification($" *insert count* objects sent to Speckle 🚀"); } catch (Exception e) { state.Errors.Add(e); Globals.Notify($"Failed to create commit.\n{e.Message}"); } return(state); }
public override async Task <StreamState> SendStream(StreamState state) { var kit = KitManager.GetDefaultKit(); var converter = kit.LoadConverter(Utils.AutocadAppName); var streamId = state.Stream.id; var client = state.Client; if (state.Filter != null) { state.SelectedObjectIds = GetObjectsFromFilter(state.Filter, converter); } // remove deleted object ids var deletedElements = new List <string>(); foreach (var handle in state.SelectedObjectIds) { if (Doc.Database.TryGetObjectId(Utils.GetHandle(handle), out AcadDb.ObjectId id)) { if (id.IsErased || id.IsNull) { deletedElements.Add(handle); } } } state.SelectedObjectIds = state.SelectedObjectIds.Where(o => !deletedElements.Contains(o)).ToList(); if (state.SelectedObjectIds.Count == 0) { RaiseNotification("Zero objects selected; send stopped. Please select some objects, or check that your filter can actually select something."); return(state); } var commitObj = new Base(); /* Deprecated until we decide whether or not commit objs need units. If so, should add UnitsToSpeckle conversion method to connector * var units = Units.GetUnitsFromString(Doc.Database.Insunits.ToString()); * commitObj["units"] = units; */ var conversionProgressDict = new ConcurrentDictionary <string, int>(); conversionProgressDict["Conversion"] = 0; Execute.PostToUIThread(() => state.Progress.Maximum = state.SelectedObjectIds.Count()); int convertedCount = 0; bool renamedlayers = false; using (Transaction tr = Doc.Database.TransactionManager.StartTransaction()) { converter.SetContextDocument(Doc); // set context doc here to capture transaction prop foreach (var autocadObjectHandle in state.SelectedObjectIds) { if (state.CancellationTokenSource.Token.IsCancellationRequested) { return(null); } // get the db object from id AcadDb.Handle hn = Utils.GetHandle(autocadObjectHandle); AcadDb.DBObject obj = hn.GetObject(out string type, out string layer); if (obj == null) { state.Errors.Add(new Exception($"Failed to find local object ${autocadObjectHandle}.")); continue; } if (!converter.CanConvertToSpeckle(obj)) { state.Errors.Add(new Exception($"Objects of type ${type} are not supported")); continue; } // convert obj // try catch to prevent memory access violation crash in case a conversion goes wrong Base converted = null; string containerName = string.Empty; try { converted = converter.ConvertToSpeckle(obj); if (converted == null) { state.Errors.Add(new Exception($"Failed to convert object ${autocadObjectHandle} of type ${type}.")); continue; } } catch { state.Errors.Add(new Exception($"Failed to convert object {autocadObjectHandle} of type {type}.")); continue; } /* TODO: adding the extension dictionary / xdata per object * foreach (var key in obj.ExtensionDictionary) * { * converted[key] = obj.ExtensionDictionary.GetUserString(key); * } */ if (obj is BlockReference) { containerName = "Blocks"; } else { // remove invalid chars from layer name string cleanLayerName = Utils.RemoveInvalidDynamicPropChars(layer); containerName = cleanLayerName; if (!cleanLayerName.Equals(layer)) { renamedlayers = true; } } if (commitObj[$"@{containerName}"] == null) { commitObj[$"@{containerName}"] = new List <Base>(); } ((List <Base>)commitObj[$"@{containerName}"]).Add(converted); conversionProgressDict["Conversion"]++; UpdateProgress(conversionProgressDict, state.Progress); converted.applicationId = autocadObjectHandle; convertedCount++; } tr.Commit(); } if (renamedlayers) { RaiseNotification("Replaced illegal chars ./ with - in one or more layer names."); } if (state.CancellationTokenSource.Token.IsCancellationRequested) { return(null); } Execute.PostToUIThread(() => state.Progress.Maximum = convertedCount); var transports = new List <ITransport>() { new ServerTransport(client.Account, streamId) }; var commitObjId = await Operations.Send( commitObj, state.CancellationTokenSource.Token, transports, onProgressAction : dict => UpdateProgress(dict, state.Progress), onErrorAction : (err, exception) => { Exceptions.Add(exception); }, disposeTransports : true ); if (Exceptions.Count != 0) { RaiseNotification($"Failed to send: \n {Exceptions.Last().Message}"); return(null); } if (convertedCount > 0) { var actualCommit = new CommitCreateInput { streamId = streamId, objectId = commitObjId, branchName = state.Branch.name, message = state.CommitMessage != null ? state.CommitMessage : $"Pushed {convertedCount} elements from {Utils.AppName}.", sourceApplication = Utils.AutocadAppName }; if (state.PreviousCommitId != null) { actualCommit.parents = new List <string>() { state.PreviousCommitId }; } try { var commitId = await client.CommitCreate(actualCommit); await state.RefreshStream(); state.PreviousCommitId = commitId; PersistAndUpdateStreamInFile(state); RaiseNotification($"{convertedCount} objects sent to {state.Stream.name}."); } catch (Exception e) { Globals.Notify($"Failed to create commit.\n{e.Message}"); state.Errors.Add(e); } } else { Globals.Notify($"Did not create commit: no objects could be converted."); } return(state); }
public override async Task <StreamState> SendStream(StreamState state) { var kit = KitManager.GetDefaultKit(); var converter = kit.LoadConverter(Utils.AutocadAppName); converter.SetContextDocument(Doc); var streamId = state.Stream.id; var client = state.Client; if (state.Filter != null) { state.SelectedObjectIds = GetObjectsFromFilter(state.Filter); } if (state.SelectedObjectIds.Count == 0) { RaiseNotification("Zero objects selected; send stopped. Please select some objects, or check that your filter can actually select something."); return(state); } var commitObj = new Base(); var units = Units.GetUnitsFromString(Doc.Database.Insunits.ToString()); commitObj["units"] = units; var conversionProgressDict = new ConcurrentDictionary <string, int>(); conversionProgressDict["Conversion"] = 0; Execute.PostToUIThread(() => state.Progress.Maximum = state.SelectedObjectIds.Count()); int convertedCount = 0; bool renamedlayers = false; foreach (var autocadObjectHandle in state.SelectedObjectIds) { if (state.CancellationTokenSource.Token.IsCancellationRequested) { return(null); } // get the db object from id AcadDb.Handle hn = new AcadDb.Handle(Convert.ToInt64(autocadObjectHandle, 16)); AcadDb.DBObject obj = hn.GetObject(out string type, out string layer); string cleanLayerName = Utils.RemoveInvalidDynamicPropChars(layer); if (!cleanLayerName.Equals(layer)) { renamedlayers = true; } if (obj == null) { state.Errors.Add(new Exception($"Failed to find local object ${autocadObjectHandle}.")); continue; } if (!converter.CanConvertToSpeckle(obj)) { state.Errors.Add(new Exception($"Objects of type ${type} are not supported")); continue; } // convert geo to speckle base if (!converter.CanConvertToSpeckle(obj)) { state.Errors.Add(new Exception($"Skipping object {autocadObjectHandle}, {obj.GetType()} type not supported")); continue; } Base converted = converter.ConvertToSpeckle(obj); if (converted == null) { state.Errors.Add(new Exception($"Failed to convert object ${autocadObjectHandle} of type ${type}.")); continue; } conversionProgressDict["Conversion"]++; UpdateProgress(conversionProgressDict, state.Progress); converted.applicationId = autocadObjectHandle; /* TODO: adding the extension dictionary / xdata per object * foreach (var key in obj.ExtensionDictionary) * { * converted[key] = obj.ExtensionDictionary.GetUserString(key); * } */ if (commitObj[$"@{cleanLayerName}"] == null) { commitObj[$"@{cleanLayerName}"] = new List <Base>(); } ((List <Base>)commitObj[$"@{cleanLayerName}"]).Add(converted); convertedCount++; } if (renamedlayers) { RaiseNotification("Replaced illegal chars ./ with - in one or more layer names."); } if (state.CancellationTokenSource.Token.IsCancellationRequested) { return(null); } Execute.PostToUIThread(() => state.Progress.Maximum = convertedCount); var transports = new List <ITransport>() { new ServerTransport(client.Account, streamId) }; var commitObjId = await Operations.Send( commitObj, state.CancellationTokenSource.Token, transports, onProgressAction : dict => UpdateProgress(dict, state.Progress), onErrorAction : (err, exception) => { Exceptions.Add(exception); } ); if (Exceptions.Count != 0) { RaiseNotification($"Failed to send: \n {Exceptions.Last().Message}"); return(null); } var actualCommit = new CommitCreateInput { streamId = streamId, objectId = commitObjId, branchName = state.Branch.name, message = state.CommitMessage != null ? state.CommitMessage : $"Pushed {convertedCount} elements from AutoCAD.", sourceApplication = Utils.AutocadAppName }; if (state.PreviousCommitId != null) { actualCommit.parents = new List <string>() { state.PreviousCommitId }; } try { var commitId = await client.CommitCreate(actualCommit); await state.RefreshStream(); state.PreviousCommitId = commitId; PersistAndUpdateStreamInFile(state); RaiseNotification($"{convertedCount} objects sent to {state.Stream.name}."); } catch (Exception e) { Globals.Notify($"Failed to create commit.\n{e.Message}"); state.Errors.Add(e); } return(state); }
/// <summary> /// Converts the Revit elements that have been added to the stream by the user, sends them to /// the Server and the local DB, and creates a commit with the objects. /// </summary> /// <param name="state">StreamState passed by the UI</param> public override async Task<StreamState> SendStream(StreamState state) { ConversionErrors.Clear(); OperationErrors.Clear(); var kit = KitManager.GetDefaultKit(); var converter = kit.LoadConverter(ConnectorRevitUtils.RevitAppName); converter.SetContextDocument(CurrentDoc.Document); var streamId = state.Stream.id; var client = state.Client; var convertedObjects = new List<Base>(); if (state.Filter != null) { state.Objects = GetSelectionFilterObjects(state.Filter); } if (state.Objects.Count == 0) { state.Errors.Add(new Exception("There are zero objects to send. Please create a filter, or set some via selection.")); return state; } var commitObject = new Base(); var conversionProgressDict = new ConcurrentDictionary<string, int>(); conversionProgressDict["Conversion"] = 0; Execute.PostToUIThread(() => state.Progress.Maximum = state.Objects.Count()); var convertedCount = 0; var placeholders = new List<Base>(); converter.SetContextObjects(state.Objects.Select(obj => new ApplicationPlaceholderObject { applicationId = obj.applicationId }).ToList()); foreach (var obj in state.Objects) { try { RevitElement revitElement = null; if (obj.applicationId != null) { revitElement = CurrentDoc.Document.GetElement(obj.applicationId); } if (revitElement == null) { continue; } if (!converter.CanConvertToSpeckle(revitElement)) { state.Errors.Add(new Exception($"Skipping {revitElement.GetType()}, not supported")); continue; } var conversionResult = converter.ConvertToSpeckle(revitElement); conversionProgressDict["Conversion"]++; UpdateProgress(conversionProgressDict, state.Progress); placeholders.Add(new ApplicationPlaceholderObject { applicationId = obj.applicationId, ApplicationGeneratedId = obj.applicationId }); convertedCount++; //hosted elements will be returned as `null` by the ConvertToSpeckle method //since they are handled when converting their parents if (conversionResult != null) { var category = $"@{revitElement.Category.Name}"; if (commitObject[category] == null) { commitObject[category] = new List<Base>(); } ((List<Base>)commitObject[category]).Add(conversionResult); } } catch (Exception e) { state.Errors.Add(e); } //var level = (Level) CurrentDoc.Document.GetElement(revitElement.LevelId); //if(commitObject[$"@{level.Name}"] == null) //{ // commitObject[$"@{level.Name}"] = new Base // { // ["@objects"] = new List<Base>(), // ["elevation"] = level.Elevation, // TODO Cast! // }; //} } if (converter.ConversionErrors.Count != 0) { // TODO: Get rid of the custom Error class. It's not needed. ConversionErrors.AddRange(converter.ConversionErrors.Select(x => new Exception($"{x.Message}\n{x.details}"))); state.Errors.AddRange(converter.ConversionErrors.Select(x => new Exception($"{x.Message}\n{x.details}"))); } if (convertedCount == 0) { Globals.Notify("Failed to convert any objects. Push aborted."); return state; } Execute.PostToUIThread(() => state.Progress.Maximum = (int)commitObject.GetTotalChildrenCount()); if (state.CancellationTokenSource.Token.IsCancellationRequested) { return state; } var transports = new List<ITransport>() { new ServerTransport(client.Account, streamId) }; var objectId = await Operations.Send( @object: commitObject, cancellationToken: state.CancellationTokenSource.Token, transports: transports, onProgressAction: dict => UpdateProgress(dict, state.Progress), onErrorAction: (s, e) => { OperationErrors.Add(e); // TODO! state.Errors.Add(e); state.CancellationTokenSource.Cancel(); } ); if (OperationErrors.Count != 0) { Globals.Notify("Failed to send."); state.Errors.AddRange(OperationErrors); return state; } if (state.CancellationTokenSource.Token.IsCancellationRequested) { return null; } var actualCommit = new CommitCreateInput() { streamId = streamId, objectId = objectId, branchName = state.Branch.name, message = state.CommitMessage != null ? state.CommitMessage : $"Sent {convertedCount} objects from {ConnectorRevitUtils.RevitAppName}." }; if (state.PreviousCommitId != null) { actualCommit.previousCommitIds = new List<string>() { state.PreviousCommitId }; } try { var res = await client.CommitCreate(actualCommit); var updatedStream = await client.StreamGet(streamId); state.Branches = updatedStream.branches.items; state.Stream.name = updatedStream.name; state.Stream.description = updatedStream.description; WriteStateToFile(); RaiseNotification($"{convertedCount} objects sent to Speckle 🚀"); } catch (Exception e) { state.Errors.Add(e); Globals.Notify($"Failed to create commit.\n{e.Message}"); } return state; }