public static void DoUpgrade(Word.Document doc) { string module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod().Name}()"; int sel = doc.Application.Selection.Range.Start; Globals.Chem4WordV3.DisableDocumentEvents(doc); try { string extension = doc.FullName.Split('.').Last(); string guid = Guid.NewGuid().ToString("N"); string timestamp = DateTime.Now.ToString("yyyyMMdd-HHmmss", CultureInfo.InvariantCulture); string destination = Path.Combine(Globals.Chem4WordV3.AddInInfo.ProductAppDataPath, "Backups", $"Chem4Word-{timestamp}-{guid}.{extension}"); File.Copy(doc.FullName, destination); } catch (Exception ex) { // Nothing much we can do here :-( Debug.WriteLine(ex.Message); } List <UpgradeTarget> targets = CollectData(doc); int upgradedCCs = 0; int upgradedXml = 0; foreach (var target in targets) { if (target.ContentControls.Count > 0) { upgradedXml++; upgradedCCs += target.ContentControls.Count; } foreach (var cci in target.ContentControls) { foreach (Word.ContentControl cc in doc.ContentControls) { if (cc.ID.Equals(cci.Id)) { if (cci.Type.Equals("2D")) { cc.LockContents = false; cc.Title = Constants.ContentControlTitle; cc.Tag = target.Model.CustomXmlPartGuid; cc.LockContents = true; } else { cc.LockContents = false; cc.Range.Delete(); int start = cc.Range.Start; cc.Delete(); doc.Application.Selection.SetRange(start - 1, start - 1); bool isFormula = false; string source; string text = CustomRibbon.GetInlineText(target.Model, cci.Type, ref isFormula, out source); Word.ContentControl ccn = CustomRibbon.Insert1D(doc.Application, doc, text, isFormula, $"{cci.Type}:{target.Model.CustomXmlPartGuid}"); ccn.LockContents = true; } } } } CMLConverter converter = new CMLConverter(); CustomXMLPart cxml = doc.CustomXMLParts.SelectByID(target.CxmlPartId); cxml.Delete(); doc.CustomXMLParts.Add(converter.Export(target.Model)); } EraseChemistryZones(doc); Globals.Chem4WordV3.EnableDocumentEvents(doc); doc.Application.Selection.SetRange(sel, sel); if (upgradedCCs + upgradedXml > 0) { Globals.Chem4WordV3.Telemetry.Write(module, "Information", $"Upgraded {upgradedCCs} Chemistry Objects for {upgradedXml} Structures"); UserInteractions.AlertUser($"Upgrade Completed{Environment.NewLine}{Environment.NewLine}Upgraded {upgradedCCs} Chemistry Objects for {upgradedXml} Structures"); } }
public static void DoUpgrade(Word.Document doc) { string module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod().Name}()"; int sel = doc.Application.Selection.Range.Start; Globals.Chem4WordV3.DisableDocumentEvents(doc); try { string extension = doc.FullName.Split('.').Last(); string guid = Guid.NewGuid().ToString("N"); string timestamp = DateTime.Now.ToString("yyyyMMdd-HHmmss", CultureInfo.InvariantCulture); string destination = Path.Combine(Globals.Chem4WordV3.AddInInfo.ProductAppDataPath, "Backups", $"Chem4Word-{timestamp}-{guid}.{extension}"); File.Copy(doc.FullName, destination); } catch (Exception ex) { // Nothing much we can do here :-( Debug.WriteLine(ex.Message); } Dictionary <string, CustomXMLPart> customXmlParts = new Dictionary <string, CustomXMLPart>(); List <UpgradeTarget> targets = CollectData(doc); int upgradedCCs = 0; int upgradedXml = 0; foreach (var target in targets) { if (target.ContentControls.Count > 0) { upgradedXml++; upgradedCCs += target.ContentControls.Count; } foreach (var cci in target.ContentControls) { foreach (Word.ContentControl cc in doc.ContentControls) { if (cc.ID.Equals(cci.Id)) { int start; bool isFormula; string source; string text; switch (cci.Type) { case "2D": cc.LockContents = false; cc.Title = Constants.ContentControlTitle; cc.Tag = target.Model.CustomXmlPartGuid; cc.LockContents = true; // ToDo: Regenerate converted 2D structures break; case "new": cc.LockContents = false; cc.Range.Delete(); start = cc.Range.Start; cc.Delete(); doc.Application.Selection.SetRange(start - 1, start - 1); var model = new Model.Model(); var molecule = new Molecule(); molecule.ChemicalNames.Add(new ChemicalName { Id = "m1.n1", Name = cci.Text, DictRef = Constants.Chem4WordUserSynonym }); model.Molecules.Add(molecule); model.CustomXmlPartGuid = Guid.NewGuid().ToString("N"); var cmlConvertor = new CMLConverter(); doc.CustomXMLParts.Add(cmlConvertor.Export(model)); Word.ContentControl ccn = doc.ContentControls.Add(Word.WdContentControlType.wdContentControlRichText, ref _missing); ChemistryHelper.Insert1D(ccn, cci.Text, false, $"m1.n1:{model.CustomXmlPartGuid}"); ccn.LockContents = true; break; default: cc.LockContents = false; cc.Range.Delete(); start = cc.Range.Start; cc.Delete(); doc.Application.Selection.SetRange(start - 1, start - 1); isFormula = false; text = ChemistryHelper.GetInlineText(target.Model, cci.Type, ref isFormula, out source); Word.ContentControl ccr = doc.ContentControls.Add(Word.WdContentControlType.wdContentControlRichText, ref _missing); ChemistryHelper.Insert1D(ccr, text, isFormula, $"{cci.Type}:{target.Model.CustomXmlPartGuid}"); ccr.LockContents = true; break; } } } } CMLConverter converter = new CMLConverter(); CustomXMLPart cxml = doc.CustomXMLParts.SelectByID(target.CxmlPartId); if (customXmlParts.ContainsKey(cxml.Id)) { customXmlParts.Add(cxml.Id, cxml); } doc.CustomXMLParts.Add(converter.Export(target.Model)); } EraseChemistryZones(doc); foreach (var kvp in customXmlParts.ToList()) { kvp.Value.Delete(); } Globals.Chem4WordV3.EnableDocumentEvents(doc); doc.Application.Selection.SetRange(sel, sel); if (upgradedCCs + upgradedXml > 0) { Globals.Chem4WordV3.Telemetry.Write(module, "Information", $"Upgraded {upgradedCCs} Chemistry Objects for {upgradedXml} Structures"); UserInteractions.AlertUser($"Upgrade Completed{Environment.NewLine}{Environment.NewLine}Upgraded {upgradedCCs} Chemistry Objects for {upgradedXml} Structures"); } }
private string FetchStructure() { string module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod().Name}()"; string result = lastSelected; ImportButton.Enabled = false; ListView.SelectedListViewItemCollection selected = Results.SelectedItems; if (selected.Count > 0) { ListViewItem item = selected[0]; string pubchemId = item.Text; PubChemId = pubchemId; if (!pubchemId.Equals(lastSelected)) { Cursor = Cursors.WaitCursor; // https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/241/record/SDF var securityProtocol = ServicePointManager.SecurityProtocol; ServicePointManager.SecurityProtocol = securityProtocol | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; try { var request = (HttpWebRequest)WebRequest.Create( string.Format(CultureInfo.InvariantCulture, "{0}rest/pug/compound/cid/{1}/record/SDF", UserOptions.PubChemRestApiUri, pubchemId)); request.Timeout = 30000; request.UserAgent = "Chem4Word"; HttpWebResponse response; response = (HttpWebResponse)request.GetResponse(); if (HttpStatusCode.OK.Equals(response.StatusCode)) { // we will read data via the response stream using (var resStream = response.GetResponseStream()) { lastMolfile = new StreamReader(resStream).ReadToEnd(); SdFileConverter sdFileConverter = new SdFileConverter(); Model.Model model = sdFileConverter.Import(lastMolfile); if (model.MeanBondLength < Core.Helpers.Constants.MinimumBondLength - Core.Helpers.Constants.BondLengthTolerance || model.MeanBondLength > Core.Helpers.Constants.MaximumBondLength + Core.Helpers.Constants.BondLengthTolerance) { model.ScaleToAverageBondLength(Core.Helpers.Constants.StandardBondLength); } this.display1.Chemistry = model; if (model.AllWarnings.Count > 0 || model.AllErrors.Count > 0) { Telemetry.Write(module, "Exception(Data)", lastMolfile); List <string> lines = new List <string>(); if (model.AllErrors.Count > 0) { Telemetry.Write(module, "Exception(Data)", string.Join(Environment.NewLine, model.AllErrors)); lines.Add("Errors(s)"); lines.AddRange(model.AllErrors); } if (model.AllWarnings.Count > 0) { Telemetry.Write(module, "Exception(Data)", string.Join(Environment.NewLine, model.AllWarnings)); lines.Add("Warnings(s)"); lines.AddRange(model.AllWarnings); } ErrorsAndWarnings.Text = string.Join(Environment.NewLine, lines); } else { CMLConverter cmlConverter = new CMLConverter(); Cml = cmlConverter.Export(model); ImportButton.Enabled = true; } } result = pubchemId; } else { result = string.Empty; lastMolfile = string.Empty; StringBuilder sb = new StringBuilder(); sb.AppendLine($"Bad request. Status code: {response.StatusCode}"); UserInteractions.AlertUser(sb.ToString()); } } catch (Exception ex) { if (ex.Message.Equals("The operation has timed out")) { ErrorsAndWarnings.Text = "Please try again later - the service has timed out"; } else { ErrorsAndWarnings.Text = ex.Message; Telemetry.Write(module, "Exception", ex.Message); Telemetry.Write(module, "Exception", ex.StackTrace); } } finally { ServicePointManager.SecurityProtocol = securityProtocol; Cursor = Cursors.Default; } } } return(result); }
private void GetData(string idlist) { string module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod().Name}()"; var request = (HttpWebRequest) WebRequest.Create( string.Format(CultureInfo.InvariantCulture, "{0}entrez/eutils/esummary.fcgi?db=pccompound&id={1}&retmode=xml", UserOptions.PubChemWebServiceUri, idlist)); request.Timeout = 30000; request.UserAgent = "Chem4Word"; var securityProtocol = ServicePointManager.SecurityProtocol; ServicePointManager.SecurityProtocol = securityProtocol | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; HttpWebResponse response; try { response = (HttpWebResponse)request.GetResponse(); if (HttpStatusCode.OK.Equals(response.StatusCode)) { Results.Enabled = true; // we will read data via the response stream using (var resStream = response.GetResponseStream()) { var resultDocument = XDocument.Load(new StreamReader(resStream)); var compounds = resultDocument.XPathSelectElements("//DocSum"); if (compounds.Any()) { foreach (var compound in compounds) { var id = compound.XPathSelectElement("./Id"); var name = compound.XPathSelectElement("./Item[@Name='IUPACName']"); //var smiles = compound.XPathSelectElement("./Item[@Name='CanonicalSmile']") var formula = compound.XPathSelectElement("./Item[@Name='MolecularFormula']"); ListViewItem lvi = new ListViewItem(id.Value); lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, name.Value)); //lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, smiles.ToString())) lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, formula.Value)); Results.Items.Add(lvi); // Add to a list view ... } } else { Debug.WriteLine("Something went wrong"); } } } else { StringBuilder sb = new StringBuilder(); sb.AppendLine($"Bad request. Status code: {response.StatusCode}"); UserInteractions.AlertUser(sb.ToString()); } } catch (Exception ex) { if (ex.Message.Equals("The operation has timed out")) { ErrorsAndWarnings.Text = "Please try again later - the service has timed out"; } else { ErrorsAndWarnings.Text = ex.Message; Telemetry.Write(module, "Exception", ex.Message); Telemetry.Write(module, "Exception", ex.StackTrace); } } finally { ServicePointManager.SecurityProtocol = securityProtocol; } }
private void ExecuteSearch(int direction) { string module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod().Name}()"; if (!string.IsNullOrEmpty(SearchFor.Text)) { Cursor = Cursors.WaitCursor; string webCall; if (direction == 0) { webCall = string.Format(CultureInfo.InvariantCulture, "{0}entrez/eutils/esearch.fcgi?db=pccompound&term={1}&retmode=xml&relevanceorder=on&usehistory=y&retmax={2}", UserOptions.PubChemWebServiceUri, SearchFor.Text, UserOptions.ResultsPerCall); } else { if (direction == 1) { int startFrom = firstResult + numResults; webCall = string.Format(CultureInfo.InvariantCulture, "{0}entrez/eutils/esearch.fcgi?db=pccompound&term={1}&retmode=xml&relevanceorder=on&usehistory=y&retmax={2}&WebEnv={3}&RetStart={4}", UserOptions.PubChemWebServiceUri, SearchFor.Text, UserOptions.ResultsPerCall, webEnv, startFrom); } else { int startFrom = firstResult - numResults; webCall = string.Format(CultureInfo.InvariantCulture, "{0}entrez/eutils/esearch.fcgi?db=pccompound&term={1}&retmode=xml&relevanceorder=on&usehistory=y&retmax={2}&WebEnv={3}&RetStart={4}", UserOptions.PubChemWebServiceUri, SearchFor.Text, UserOptions.ResultsPerCall, webEnv, startFrom); } } var securityProtocol = ServicePointManager.SecurityProtocol; ServicePointManager.SecurityProtocol = securityProtocol | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; var request = (HttpWebRequest)WebRequest.Create(webCall); request.Timeout = 30000; request.UserAgent = "Chem4Word"; HttpWebResponse response; try { response = (HttpWebResponse)request.GetResponse(); if (HttpStatusCode.OK.Equals(response.StatusCode)) { using (var resStream = response.GetResponseStream()) { var resultDocument = XDocument.Load(new StreamReader(resStream)); // Get the count of results resultsCount = int.Parse(resultDocument.XPathSelectElement("//Count").Value); // Current position firstResult = int.Parse(resultDocument.XPathSelectElement("//RetStart").Value); int fetched = int.Parse(resultDocument.XPathSelectElement("//RetMax").Value); lastResult = firstResult + fetched; // WebEnv for history webEnv = resultDocument.XPathSelectElement("//WebEnv").Value; // Set flags for More/Prev buttons if (lastResult > numResults) { PreviousButton.Enabled = true; } else { PreviousButton.Enabled = false; } if (lastResult < resultsCount) { NextButton.Enabled = true; } else { NextButton.Enabled = false; } var ids = resultDocument.XPathSelectElements("//Id"); var count = ids.Count(); Results.Items.Clear(); if (count > 0) { // Set form title Text = $"Search PubChem - Showing {firstResult + 1} to {lastResult} [of {resultsCount}]"; Refresh(); var sb = new StringBuilder(); for (var i = 0; i < count; i++) { var id = ids.ElementAt(i); if (i > 0) { sb.Append(","); } sb.Append(id.Value); } GetData(sb.ToString()); } else { // Set error box ErrorsAndWarnings.Text = "Sorry, no results were found."; } } } else { StringBuilder sb = new StringBuilder(); sb.AppendLine($"Status code {response.StatusCode} was returned by the server"); Telemetry.Write(module, "Warning", sb.ToString()); UserInteractions.AlertUser(sb.ToString()); } } catch (Exception ex) { if (ex.Message.Equals("The operation has timed out")) { ErrorsAndWarnings.Text = "Please try again later - the service has timed out"; } else { ErrorsAndWarnings.Text = ex.Message; Telemetry.Write(module, "Exception", ex.Message); Telemetry.Write(module, "Exception", ex.StackTrace); } } finally { ServicePointManager.SecurityProtocol = securityProtocol; Cursor = Cursors.Default; } } }
public static void DoUpgrade(Word.Document doc) { string module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod().Name}()"; int sel = doc.Application.Selection.Range.Start; Globals.Chem4WordV3.DisableDocumentEvents(doc); List <UpgradeTarget> targets = CollectData(doc); int upgradedCCs = 0; int upgradedXml = 0; foreach (var target in targets) { if (target.ContentControls.Count > 0) { upgradedXml++; upgradedCCs += target.ContentControls.Count; } foreach (var cci in target.ContentControls) { foreach (Word.ContentControl cc in doc.ContentControls) { if (cc.ID.Equals(cci.Id)) { if (cci.Type.Equals("2D")) { cc.LockContents = false; cc.Title = Constants.ContentControlTitle; cc.Tag = target.Model.CustomXmlPartGuid; cc.LockContents = true; } else { cc.LockContents = false; cc.Range.Delete(); int start = cc.Range.Start; cc.Delete(); doc.Application.Selection.SetRange(start - 1, start - 1); bool isFormula = false; string source; string text = CustomRibbon.GetInlineText(target.Model, cci.Type, ref isFormula, out source); Word.ContentControl ccn = CustomRibbon.Insert1D(doc.Application, doc, text, isFormula, $"{cci.Type}:{target.Model.CustomXmlPartGuid}"); ccn.LockContents = true; } } } } CMLConverter converter = new CMLConverter(); CustomXMLPart cxml = doc.CustomXMLParts.SelectByID(target.CxmlPartId); cxml.Delete(); doc.CustomXMLParts.Add(converter.Export(target.Model)); } EraseChemistryZones(doc); Globals.Chem4WordV3.EnableDocumentEvents(doc); doc.Application.Selection.SetRange(sel, sel); if (upgradedCCs + upgradedXml > 0) { Globals.Chem4WordV3.Telemetry.Write(module, "Information", $"Upgraded {upgradedCCs} Chemistry Objects for {upgradedXml} Structures"); UserInteractions.AlertUser($"Upgrade Completed{Environment.NewLine}{Environment.NewLine}Upgraded {upgradedCCs} Chemistry Objects for {upgradedXml} Structures"); } }