public static void RefreshAllStructures(Word.Document doc) { string module = $"{Product}.{Class}.{MethodBase.GetCurrentMethod().Name}()"; if (Globals.Chem4WordV3.SystemOptions == null) { Globals.Chem4WordV3.LoadOptions(); } IChem4WordRenderer renderer = Globals.Chem4WordV3.GetRendererPlugIn( Globals.Chem4WordV3.SystemOptions.SelectedRendererPlugIn); if (renderer != null) { foreach (CustomXMLPart xmlPart in doc.CustomXMLParts) { var cml = xmlPart.XML; var cxmlId = CustomXmlPartHelper.GetCmlId(xmlPart); CMLConverter cc = new CMLConverter(); var model = cc.Import(cml); renderer.Properties = new Dictionary <string, string>(); renderer.Properties.Add("Guid", cxmlId); renderer.Cml = cml; string tempfileName = renderer.Render(); if (File.Exists(tempfileName)) { UpdateThisStructure(doc, model, cxmlId, tempfileName); } } } }
public static void InsertChemistry(bool isCopy, Application app, FlexDisplay flexDisplay) { string module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod().Name}()"; Document doc = app.ActiveDocument; Selection sel = app.Selection; ContentControl cc = null; if (Globals.Chem4WordV3.SystemOptions == null) { Globals.Chem4WordV3.LoadOptions(); } bool allowed = true; string reason = ""; if (Globals.Chem4WordV3.ChemistryAllowed) { if (sel.ContentControls.Count > 0) { cc = sel.ContentControls[1]; if (cc.Title != null && cc.Title.Equals(Constants.ContentControlTitle)) { reason = "a chemistry object is selected"; allowed = false; } } } else { reason = Globals.Chem4WordV3.ChemistryProhibitedReason; allowed = false; } if (allowed) { app.ScreenUpdating = false; Globals.Chem4WordV3.DisableDocumentEvents(doc); try { CMLConverter cmlConverter = new CMLConverter(); Model.Model chem = cmlConverter.Import(flexDisplay.Chemistry); double before = chem.MeanBondLength; if (before < Constants.MinimumBondLength - Constants.BondLengthTolerance || before > Constants.MaximumBondLength + Constants.BondLengthTolerance) { chem.ScaleToAverageBondLength(Constants.StandardBondLength); double after = chem.MeanBondLength; Globals.Chem4WordV3.Telemetry.Write(module, "Information", $"Structure rescaled from {before.ToString("#0.00")} to {after.ToString("#0.00")}"); } if (isCopy) { // Always generate new Guid on Import chem.CustomXmlPartGuid = Guid.NewGuid().ToString("N"); } string guidString = chem.CustomXmlPartGuid; string bookmarkName = "C4W_" + guidString; if (Globals.Chem4WordV3.SystemOptions == null) { Globals.Chem4WordV3.LoadOptions(); } Globals.Chem4WordV3.SystemOptions.WordTopLeft = Globals.Chem4WordV3.WordTopLeft; IChem4WordRenderer renderer = Globals.Chem4WordV3.GetRendererPlugIn( Globals.Chem4WordV3.SystemOptions.SelectedRendererPlugIn); if (renderer == null) { UserInteractions.WarnUser("Unable to find a Renderer Plug-In"); } else { // Export just incase the CustomXmlPartGuid has been changed string cml = cmlConverter.Export(chem); renderer.Properties = new Dictionary <string, string>(); renderer.Properties.Add("Guid", guidString); renderer.Cml = cml; string tempfileName = renderer.Render(); if (File.Exists(tempfileName)) { cc = CustomRibbon.Insert2D(doc, tempfileName, bookmarkName, guidString); if (isCopy) { doc.CustomXMLParts.Add(cml); } try { // Delete the temporary file now we are finished with it File.Delete(tempfileName); } catch { // Not much we can do here } } } } catch (Exception ex) { new ReportError(Globals.Chem4WordV3.Telemetry, Globals.Chem4WordV3.WordTopLeft, module, ex) .ShowDialog(); } finally { // Tidy Up - Resume Screen Updating and Enable Document Event Handlers app.ScreenUpdating = true; Globals.Chem4WordV3.EnableDocumentEvents(doc); if (cc != null) { // Move selection point into the Content Control which was just edited or added app.Selection.SetRange(cc.Range.Start, cc.Range.End); } } } else { UserInteractions.WarnUser($"You can't insert a chemistry object because {reason}"); } }
public static Word.ContentControl Insert2DChemistry(Word.Document doc, string cml, bool isCopy) { string module = $"{Product}.{Class}.{MethodBase.GetCurrentMethod().Name}()"; if (Globals.Chem4WordV3.SystemOptions == null) { Globals.Chem4WordV3.LoadOptions(); } // Calling routine should check that Globals.Chem4WordV3.ChemistryAllowed = true Word.ContentControl cc = null; Word.Application app = doc.Application; var wordSettings = new WordSettings(app); IChem4WordRenderer renderer = Globals.Chem4WordV3.GetRendererPlugIn( Globals.Chem4WordV3.SystemOptions.SelectedRendererPlugIn); if (renderer != null) { try { app.ScreenUpdating = false; Globals.Chem4WordV3.DisableContentControlEvents(); var converter = new CMLConverter(); var model = converter.Import(cml); var modified = false; double before = model.MeanBondLength; if (before < Constants.MinimumBondLength - Constants.BondLengthTolerance || before > Constants.MaximumBondLength + Constants.BondLengthTolerance) { model.ScaleToAverageBondLength(Constants.StandardBondLength); modified = true; double after = model.MeanBondLength; Globals.Chem4WordV3.Telemetry.Write(module, "Information", $"Structure rescaled from {before.ToString("#0.00")} to {after.ToString("#0.00")}"); } if (isCopy) { // Always generate new Guid on Import model.CustomXmlPartGuid = Guid.NewGuid().ToString("N"); modified = true; } // Ensure each molecule has a Concise Formula set foreach (var molecule in model.Molecules) { if (string.IsNullOrEmpty(molecule.ConciseFormula)) { molecule.ConciseFormula = molecule.CalculatedFormula(); modified = true; } } if (modified) { // Re-export as the CustomXmlPartGuid or Bond Length has been changed cml = converter.Export(model); } string guid = model.CustomXmlPartGuid; renderer.Properties = new Dictionary <string, string>(); renderer.Properties.Add("Guid", guid); renderer.Cml = cml; // Generate temp file which can be inserted into a content control string tempfileName = renderer.Render(); if (File.Exists(tempfileName)) { cc = doc.ContentControls.Add(Word.WdContentControlType.wdContentControlRichText, ref _missing); Insert2D(cc.ID, tempfileName, guid); if (isCopy) { doc.CustomXMLParts.Add(cml); } try { // Delete the temporary file now we are finished with it #if DEBUG #else File.Delete(tempfileName); #endif } catch { // Not much we can do here } } } catch (Exception ex) { throw new Exception("Error in Insert2DChemistry; See InnerException for details", ex); } finally { app.ScreenUpdating = true; Globals.Chem4WordV3.EnableContentControlEvents(); } } wordSettings.RestoreSettings(app); return(cc); }
public static Word.ContentControl Insert2DChemistry(Word.Document doc, string cml, bool isCopy) { string module = $"{Product}.{Class}.{MethodBase.GetCurrentMethod().Name}()"; if (Globals.Chem4WordV3.SystemOptions == null) { Globals.Chem4WordV3.LoadOptions(); } // Calling routine should check that Globals.Chem4WordV3.ChemistryAllowed = true Word.ContentControl cc = null; Word.Application app = doc.Application; var wordSettings = new WordSettings(app); IChem4WordRenderer renderer = Globals.Chem4WordV3.GetRendererPlugIn( Globals.Chem4WordV3.SystemOptions.SelectedRendererPlugIn); if (renderer != null) { try { app.ScreenUpdating = false; Globals.Chem4WordV3.DisableContentControlEvents(); var converter = new CMLConverter(); var model = converter.Import(cml); var modified = false; if (isCopy) { // Always generate new Guid on Import model.CustomXmlPartGuid = Guid.NewGuid().ToString("N"); modified = true; } if (modified) { // Re-export as the CustomXmlPartGuid or Bond Length has been changed cml = converter.Export(model); } string guid = model.CustomXmlPartGuid; renderer.Properties = new Dictionary <string, string>(); renderer.Properties.Add("Guid", guid); renderer.Cml = cml; // Generate temp file which can be inserted into a content control string tempfileName = renderer.Render(); if (File.Exists(tempfileName)) { cc = doc.ContentControls.Add(Word.WdContentControlType.wdContentControlRichText, ref _missing); Insert2D(cc.ID, tempfileName, guid); if (isCopy) { doc.CustomXMLParts.Add(cml); } try { // Delete the temporary file now we are finished with it #if DEBUG #else File.Delete(tempfileName); #endif } catch { // Not much we can do here } } } catch (Exception ex) { throw new Exception("Error in Insert2DChemistry; See InnerException for details", ex); } finally { app.ScreenUpdating = true; Globals.Chem4WordV3.EnableContentControlEvents(); } } wordSettings.RestoreSettings(app); return(cc); }