// // Copyright (c) PlaceholderCompany. All rights reserved. // using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Windows.Forms; using GeoSigma.SigmaDrawerUtil; using GeoSigma.UCDraw; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using UCDraw; using WeifenLuo.WinFormsUI.Docking; namespace PcgDraw { /// /// 绘图模块主窗口 /// public partial class FormMain : Form { private bool saveLayout = true; private FrmLayers frmLayers; private FrmProperty frmProperty; private FrmOutput frmOutput; private ToolStripRenderer toolStripProfessionalRenderer = new ToolStripProfessionalRenderer(); private string dockDefaultPath = string.Empty; private string dockPanelPath = string.Empty; private VisualStudioToolStripExtender.VsVersion currThemeVersion; private ThemeBase currTheme; private int nViewCount = 0; private DrawerConfig config = null; // private GeoSigma geo = null; private FileHandler fileHandler; /// /// 正在进行布局操作 /// private bool isOperationLayout = false; private List mainViews = new List(); private MainView viewerCur = null; private string startFile = string.Empty; private List lstArgs = new List(); public double ZColorWidth { get; set; } = 25; /// /// Initializes a new instance of the class. /// public FormMain() { InitializeComponent(); this.dockPanel.DocumentStyle = DocumentStyle.DockingMdi; this.dockPanelPath = Path.Combine(Application.StartupPath, "DockPanel.config"); vsToolStripExtender1.DefaultRenderer = toolStripProfessionalRenderer; loadDockPanel(); config = DrawerConfig.Instance; fileHandler = new FileHandler(); fileHandler.LoadFileEvent += OpenFile; } public void GetLengthAngle(string info) { this.tsslLengthAngle.Text = info; } /// /// Initializes a new instance of the class. /// 带启动文件的构造函数 /// /// 启动文件 public FormMain(string[] args) : this() { if (args.Length > 0) { this.startFile = args[0]; } if (args.Length > 1) { lstArgs.Clear(); for (int i = 1; i < args.Length; i++) { lstArgs.Add(args[i]); } } } private void FormMain_Load(object sender, EventArgs e) { if (!string.IsNullOrEmpty(this.startFile)) { if (this.lstArgs.Count > 0) { string strZC = this.lstArgs.Find(it => { return it.ToUpper().StartsWith("/ZC"); }); if (!string.IsNullOrEmpty(strZC)) { int nSizeIndex = strZC.IndexOf(':'); if (nSizeIndex > 0) { ZColorWidth = Convert.ToInt32(strZC.Substring(nSizeIndex + 1)); } OpenFile(this.startFile, true); this.lstArgs.Clear(); } } else { OpenFile(this.startFile); } } this.tsmiFileSelectSave.Enabled = false; Application.Idle += Application_Idle; int originSet = config.FindConfigValue("Display", "ZoomMode", 0); if (originSet == 0) { tsmiLeftTop.Checked = true; tsmiCenter.Checked = false; } else { tsmiLeftTop.Checked = false; tsmiCenter.Checked = true; } string themeSet = config.FindConfigValue("Theme", "Version", "0"); ToolStripMenuItem themeVersion = new ToolStripMenuItem(); themeVersion = menuItemSchemaVS2015Light; menuItemSchemaVS2015Light.Checked = themeSet.IndexOf(menuItemSchemaVS2015Light.ToString().Replace(" ", "")) > -1; if (menuItemSchemaVS2015Light.Checked) { themeVersion = menuItemSchemaVS2015Light; } menuItemSchemaVS2005.Checked = themeSet.IndexOf(menuItemSchemaVS2005.ToString().Replace(" ", "")) > -1; if (menuItemSchemaVS2005.Checked) { themeVersion = menuItemSchemaVS2005; } menuItemSchemaVS2003.Checked = themeSet.IndexOf(menuItemSchemaVS2003.ToString().Replace(" ", "")) > -1; if (menuItemSchemaVS2003.Checked) { themeVersion = menuItemSchemaVS2003; } menuItemSchemaVS2012Light.Checked = themeSet.IndexOf(menuItemSchemaVS2012Light.ToString().Replace(" ", "")) > -1; if (menuItemSchemaVS2012Light.Checked) { themeVersion = menuItemSchemaVS2012Light; } menuItemSchemaVS2012Blue.Checked = themeSet.IndexOf(menuItemSchemaVS2012Blue.ToString().Replace(" ", "")) > -1; if (menuItemSchemaVS2012Blue.Checked) { themeVersion = menuItemSchemaVS2012Blue; } menuItemSchemaVS2012Dark.Checked = themeSet.IndexOf(menuItemSchemaVS2012Dark.ToString().Replace(" ", "")) > -1; if (menuItemSchemaVS2012Dark.Checked) { themeVersion = menuItemSchemaVS2012Dark; } menuItemSchemaVS2013Light.Checked = themeSet.IndexOf(menuItemSchemaVS2013Light.ToString().Replace(" ", "")) > -1; if (menuItemSchemaVS2013Light.Checked) { themeVersion = menuItemSchemaVS2013Light; } menuItemSchemaVS2013Blue.Checked = themeSet.IndexOf(menuItemSchemaVS2013Blue.ToString().Replace(" ", "")) > -1; if (menuItemSchemaVS2013Blue.Checked) { themeVersion = menuItemSchemaVS2013Blue; } menuItemSchemaVS2013Dark.Checked = themeSet.IndexOf(menuItemSchemaVS2013Dark.ToString().Replace(" ", "")) > -1; if (menuItemSchemaVS2013Dark.Checked) { themeVersion = menuItemSchemaVS2013Dark; } menuItemSchemaVS2015Blue.Checked = themeSet.IndexOf(menuItemSchemaVS2015Blue.ToString().Replace(" ", "")) > -1; if (menuItemSchemaVS2015Blue.Checked) { themeVersion = menuItemSchemaVS2015Blue; } menuItemSchemaVS2015Dark.Checked = themeSet.IndexOf(menuItemSchemaVS2015Dark.ToString().Replace(" ", "")) > -1; if (menuItemSchemaVS2015Dark.Checked) { themeVersion = menuItemSchemaVS2015Dark; } setSchema(themeVersion, null); SetRecentMenu(null); } /// /// 设置最近打开的文件菜单 /// private void SetRecentMenu(string strNewFile) { if (!string.IsNullOrEmpty(strNewFile)) { fileHandler.AddRecentFile(strNewFile); } fileHandler.UpdateMenu(btnOpenFile); btnOpenFile.DropDownItems.Add(tssRecentFile); btnOpenFile.DropDownItems.Add(btnReloadFile); } private void FormMain_FormClosing(object sender, FormClosingEventArgs e) { if (saveLayout) { dockPanel.SaveAsXml(dockPanelPath); } else if (File.Exists(dockPanelPath)) { File.Delete(dockPanelPath); } Application.Idle -= Application_Idle; } private void Application_Idle(object sender, EventArgs e) { SetUIStatus(); // 设置是否被修改的状态 // setDirtyFlag(viewer); } private void SetUIStatus() { bool bEnableDataIO = false; if (this.viewerCur == null) { bEnableDataIO = false; } else { bEnableDataIO = true; } this.tsmiImport.Enabled = bEnableDataIO; this.tsmiExport.Enabled = bEnableDataIO; tsmiShow.Enabled = bEnableDataIO; this.tsmiFileSelectSave.Enabled = bEnableDataIO; tsmiPointSave.Enabled = bEnableDataIO; tsmiCurveSave.Enabled = bEnableDataIO; tsmiSolidSave.Enabled = bEnableDataIO; tsmiText.Enabled = bEnableDataIO; tsmiCleanCurve.Enabled = bEnableDataIO; tsmiXYZFSave.Enabled = bEnableDataIO; tsmiSaveSymbol.Enabled = bEnableDataIO; tsbtnMerge.Enabled = bEnableDataIO; if (this.viewerCur != null && this.viewerCur.IsElementSelected) { this.tsmiFileSelectSave.Enabled = true; } else { this.tsmiFileSelectSave.Enabled = false; } } /// /// 显示坐标状态 /// /// 鼠标坐标状态 private void showMouseXY(string mouseXY) { tsslStatusInfo.Text = mouseXY; } private void showTipMessage(string tipMessage) { tsslTipInfo.Text = tipMessage; } #region 界面设置 private void SetCurrentLayer(object send, PropertyChangedEventArgs e) { if (frmLayers != null) { frmLayers.Text = e.PropertyName; } } private void createView(MainView viewer, bool showDoc) { this.SuspendLayout(); createPanels(); frmLayers.MainControl = viewer.LayerTreeControl; frmProperty.MainControl = viewer.PropertyControl; frmOutput.MainControl = viewer.StaticsControl; frmLayers.Text = viewer.CurrentLayer; viewer.LayerSelected -= SetCurrentLayer; viewer.LayerSelected += SetCurrentLayer; viewer.MouseMoveXYEvent -= showMouseXY; viewer.MouseMoveXYEvent += showMouseXY; viewer.TipMessageHandler += showTipMessage; // 设置工具条 for (int i = this.toolStripContainer1.TopToolStripPanel.Controls.Count; i > 0; i--) { // 删除主工具条以外的其它工具条 if (!object.ReferenceEquals(this.toolStripContainer1.TopToolStripPanel.Controls[i - 1], tspMain)) { this.toolStripContainer1.TopToolStripPanel.Controls.RemoveAt(i - 1); } } ToolStrip tspEle = viewer.ToolstripElements; tspEle.Dock = DockStyle.None; this.toolStripContainer1.TopToolStripPanel.Controls.Add(tspEle); // tspEle.Location = // tspEle.Size ToolStrip tspView = viewer.ToolstripView; tspView.Dock = DockStyle.None; this.toolStripContainer1.TopToolStripPanel.Controls.Add(tspView); tspMain.Left = 0; tspMain.Dock = DockStyle.Top; tspView.Dock = DockStyle.None; tspEle.Dock = DockStyle.None; tspEle.Location = new System.Drawing.Point(0, tspMain.Height + 2); tspView.Location = new System.Drawing.Point(0, tspEle.Height + tspMain.Height + 4); vsToolStripExtender1.SetStyle(tspView, currThemeVersion, currTheme); vsToolStripExtender1.SetStyle(tspEle, currThemeVersion, currTheme); // 设置文档 if (showDoc) { FrmDoc frmDoc = CreateDocByView(viewer); frmDoc.Show(dockPanel, DockState.Document); } this.ResumeLayout(true); } private FrmDoc CreateDocByView(MainView mainView) { if (mainView == null) { return null; } FrmDoc frmDoc = new FrmDoc { HideOnClose = false, CloseButtonVisible = true, }; frmDoc.FormClosing += FrmDoc_FormClosing; frmDoc.Activated += FrmDoc_Activated; // frmDoc.Show(dockPanel, DockState.Document); frmDoc.ID = mainView.ID; frmDoc.MainControl = mainView.ViewControl; // viewer.ViewControl.BorderStyle = BorderStyle.None; if (string.IsNullOrEmpty(mainView.FileFullName)) { frmDoc.FileFullName = null; } else { // FileInfo fi = new FileInfo(mainView.FileFullName); // frmDoc.Text = fi.Name; frmDoc.FileFullName = mainView.FileFullName; } frmDoc.Text = mainView.Text; return frmDoc; } private void FrmDoc_Activated(object sender, EventArgs e) { this.Text = $"地质图形--{((FrmDoc)sender).Text}"; } /// /// 激活图件 /// /// 名称 private bool ActiveDoc(string fullFile) { IDockContent frmDoc = dockPanel.Documents.FirstOrDefault(it => { FrmDoc doc = it as FrmDoc; if (doc.FileFullName.Equals(fullFile, StringComparison.CurrentCultureIgnoreCase)) { return true; } return false; }); if (frmDoc != null) { ((FrmDoc)frmDoc).Activate(); return true; } return false; } private void FrmDoc_FormClosing(object sender, FormClosingEventArgs e) { // 布局操作 if (isOperationLayout) { return; } // 关闭操作 FrmDoc frmDoc = sender as FrmDoc; MainView view = findViewByDocID(frmDoc.ID); if (view != null) { if (saveAndClose(frmDoc)) { view.ClearLayerTree(); mainViews.Remove(view); if (object.ReferenceEquals(view, viewerCur)) { viewerCur = null; } view = null; } else { e.Cancel = true; // 修复Bug:图形修改后点关闭提示是否保存,点击取消也关闭图形。 } } } private bool saveAndClose(FrmDoc frmDoc) { bool bModified = false; if (viewerCur != null && viewerCur.IsDocumentModified()) { bModified = true; } // If the page is dirty then we need to ask if it should be saved if (frmDoc.Text.EndsWith("*") || bModified) { switch (MessageBox.Show( "是否将修改保存到'" + frmDoc.Text.TrimEnd('*') + "' ?", "关闭文档", MessageBoxButtons.YesNoCancel)) { case DialogResult.Cancel: // Returning false indicates the operation was cancelled return false; case DialogResult.Yes: btnSaveFile_Click(null, null); return true; case DialogResult.No: return true; } } return true; } private void dockPanel_ActiveDocumentChanged(object sender, EventArgs e) { FrmDoc frmDoc = dockPanel.ActiveDocument as FrmDoc; if (frmDoc == null) { //this.tsmiImport.Enabled = false; //this.tsmiExport.Enabled = false; return; } MainView viewFind = findViewByDocID(frmDoc.ID); if (viewerCur == null || viewerCur.ID != viewFind.ID) { viewerCur = viewFind; createView(viewerCur, false); } } private void createPanels() { if (frmLayers == null) { frmLayers = new FrmLayers(); frmLayers.Text = "图层"; } if (frmProperty == null) { frmProperty = new FrmProperty(); frmProperty.Text = "属性"; } if (frmOutput == null) { frmOutput = new FrmOutput(); frmOutput.Text = "统计"; } } private void closeAllContents() { // we don't want to create another instance of tool window, set DockPanel to null if (frmLayers != null) { frmLayers.DockPanel = null; } if (frmProperty != null) { frmProperty.DockPanel = null; } if (frmOutput != null) { frmOutput.DockPanel = null; } // Close all other document windows closeAllDocuments(); // IMPORTANT: dispose all float windows. foreach (var window in dockPanel.FloatWindows.ToList()) { window.Dispose(); } } private void closeAllDocuments() { if (dockPanel.DocumentStyle == DocumentStyle.SystemMdi) { foreach (Form form in MdiChildren) { form.Close(); } } else { foreach (IDockContent document in dockPanel.DocumentsToArray()) { FrmDoc frmDoc = document as FrmDoc; frmDoc.Controls.RemoveAt(0); // IMPORANT: dispose all panes. document.DockHandler.DockPanel = null; document.DockHandler.Close(); } } } private void loadDefaultPanels(FrmDoc frmDoc) { createPanels(); dockPanel.SuspendLayout(true); // 加载所有文档 foreach (MainView view in mainViews) { FrmDoc frm = CreateDocByView(view); if (frm != null) { frm.Show(dockPanel, DockState.Document); } } // 输出信息面板居下 frmOutput.Show(dockPanel, DockState.DockBottom); // 图层面板居左 frmLayers.Show(dockPanel, DockState.DockLeft); dockPanel.DockLeftPortion = 186; // 属性面板居右 frmProperty.Show(dockPanel, DockState.DockRight); dockPanel.DockRightPortion = 200; dockPanel.Controls.SetChildIndex(dockPanel.DockWindows[DockState.Document], 0); dockPanel.Controls.SetChildIndex(dockPanel.DockWindows[DockState.DockLeft], 4); dockPanel.Controls.SetChildIndex(dockPanel.DockWindows[DockState.DockRight], 3); dockPanel.Controls.SetChildIndex(dockPanel.DockWindows[DockState.DockTop], 2); dockPanel.Controls.SetChildIndex(dockPanel.DockWindows[DockState.DockBottom], 1); dockPanel.ResumeLayout(true, true); isOperationLayout = false; } private void loadDockPanel() { createPanels(); try { // 根据配置文件动态加载浮动窗体 this.dockPanel.LoadFromXml(this.dockPanelPath, persistString => { // 图层窗体 if (persistString == typeof(FrmLayers).ToString()) { return frmLayers; } // 属性窗体 else if (persistString == typeof(FrmProperty).ToString()) { return frmProperty; } // 输出窗体 else if (persistString == typeof(FrmOutput).ToString()) { return frmOutput; } // 文档窗体 else { string[] parsedStrings = persistString.Split(new char[] { ',' }); if (parsedStrings.Length != 3) { return null; } if (parsedStrings[0] != typeof(FrmDoc).ToString()) { return null; } if (parsedStrings[1] == string.Empty) { return null; } int nDocID = Convert.ToInt32(parsedStrings[1]); MainView view = findViewByDocID(nDocID); FrmDoc frmDoc = CreateDocByView(view); if (frmDoc != null) { //frmDoc.Text = parsedStrings[2]; //frmDoc.HideOnClose = false; //frmDoc.CloseButtonVisible = true; //frmDoc.MainControl = view.ViewControl; //frmDoc.FormClosing += FrmDoc_FormClosing; return frmDoc; } return null; } }); } catch (Exception) { // 配置文件不存在或配置文件有问题时 按系统默认规则加载子窗体 loadDefaultPanels(null); } } private MainView findViewByDocID(int docID) { foreach (MainView view in this.mainViews) { if (view.ID == docID) { return view; } } return null; } /// /// 设置界面主题 /// /// 主题菜单项 /// 参数 private void setSchema(object sender, EventArgs e) { isOperationLayout = true; dockPanel.SaveAsXml(dockPanelPath); closeAllContents(); if (sender == this.menuItemSchemaVS2005) { currThemeVersion = VisualStudioToolStripExtender.VsVersion.Vs2005; currTheme = vS2005Theme1; } else if (sender == this.menuItemSchemaVS2003) { currThemeVersion = VisualStudioToolStripExtender.VsVersion.Vs2003; currTheme = vS2003Theme1; } else if (sender == this.menuItemSchemaVS2012Light) { currThemeVersion = VisualStudioToolStripExtender.VsVersion.Vs2012; currTheme = vS2012LightTheme1; } else if (sender == this.menuItemSchemaVS2012Blue) { currThemeVersion = VisualStudioToolStripExtender.VsVersion.Vs2012; currTheme = vS2012BlueTheme1; } else if (sender == this.menuItemSchemaVS2012Dark) { currThemeVersion = VisualStudioToolStripExtender.VsVersion.Vs2012; currTheme = vS2012DarkTheme1; } else if (sender == this.menuItemSchemaVS2013Blue) { currThemeVersion = VisualStudioToolStripExtender.VsVersion.Vs2013; currTheme = vS2013BlueTheme1; } else if (sender == this.menuItemSchemaVS2013Light) { currThemeVersion = VisualStudioToolStripExtender.VsVersion.Vs2013; currTheme = vS2013LightTheme1; } else if (sender == this.menuItemSchemaVS2013Dark) { currThemeVersion = VisualStudioToolStripExtender.VsVersion.Vs2013; currTheme = vS2013DarkTheme1; } else if (sender == this.menuItemSchemaVS2015Blue) { currThemeVersion = VisualStudioToolStripExtender.VsVersion.Vs2015; currTheme = vS2015BlueTheme1; } else if (sender == this.menuItemSchemaVS2015Dark) { currThemeVersion = VisualStudioToolStripExtender.VsVersion.Vs2015; currTheme = vS2015DarkTheme1; } else { // (sender == this.menuItemSchemaVS2015Light) currThemeVersion = VisualStudioToolStripExtender.VsVersion.Vs2015; currTheme = vS2015LightTheme1; } this.dockPanel.Theme = currTheme; this.enableVSRenderer(currThemeVersion, currTheme); config.WriteString("Theme", "Version", currTheme.ToString()); menuItemSchemaVS2005.Checked = (sender == menuItemSchemaVS2005); menuItemSchemaVS2003.Checked = (sender == menuItemSchemaVS2003); menuItemSchemaVS2012Light.Checked = (sender == menuItemSchemaVS2012Light); menuItemSchemaVS2012Blue.Checked = (sender == menuItemSchemaVS2012Blue); menuItemSchemaVS2012Dark.Checked = (sender == menuItemSchemaVS2012Dark); menuItemSchemaVS2013Light.Checked = (sender == menuItemSchemaVS2013Light); menuItemSchemaVS2013Blue.Checked = (sender == menuItemSchemaVS2013Blue); menuItemSchemaVS2013Dark.Checked = (sender == menuItemSchemaVS2013Dark); menuItemSchemaVS2015Light.Checked = (sender == menuItemSchemaVS2015Light); menuItemSchemaVS2015Blue.Checked = (sender == menuItemSchemaVS2015Blue); menuItemSchemaVS2015Dark.Checked = (sender == menuItemSchemaVS2015Dark); if (dockPanel.Theme.ColorPalette != null) { statusStrip1.BackColor = dockPanel.Theme.ColorPalette.MainWindowStatusBarDefault.Background; toolStripContainer1.TopToolStripPanel.BackColor = dockPanel.Theme.ColorPalette.CommandBarToolbarDefault.Background; } loadDockPanel(); isOperationLayout = false; } private void enableVSRenderer(VisualStudioToolStripExtender.VsVersion version, ThemeBase theme) { IEnumerator ie = this.toolStripContainer1.TopToolStripPanel.Controls.GetEnumerator(); while (ie.MoveNext()) { if (ie.Current is ToolStrip) { ToolStrip tsp = ie.Current as ToolStrip; vsToolStripExtender1.SetStyle(tsp, version, theme); tsp.GripMargin = new Padding(0); tsp.Padding = new Padding(-2); tsp.Margin = new Padding(-2); } } vsToolStripExtender1.SetStyle(statusStrip1, version, theme); } /// /// 加载默认布局 /// /// 默认布局按钮 /// 参数 private void tsbDefaultLayout_Click(object sender, EventArgs e) { isOperationLayout = true; closeAllContents(); loadDefaultPanels(null); } /// /// 锁定布局 /// /// 锁定布局按钮 /// 参数 private void tsbLockLayout_Click(object sender, EventArgs e) { dockPanel.AllowEndUserDocking = !dockPanel.AllowEndUserDocking; } /// /// 显示图层窗口 /// /// 图层菜单项 /// 参数 private void tsbLayer_Click(object sender, EventArgs e) { if (frmLayers == null) { frmLayers = new FrmLayers(); } frmLayers.Show(dockPanel); } /// /// 显示属性窗口 /// /// 属性菜单项 /// 参数 private void tsbProperty_Click(object sender, EventArgs e) { if (frmProperty == null) { frmProperty = new FrmProperty(); } frmProperty.Show(dockPanel); } /// /// 显示输出窗口 /// /// 输出窗口菜单项 /// 参数 private void tsbOutput_Click(object sender, EventArgs e) { ShowAndActiveOutput(); } /// /// Shows and active output. /// private void ShowAndActiveOutput() { if (frmOutput == null) { frmOutput = new FrmOutput(); } frmOutput.Show(dockPanel); // dockPanel.ActiveAutoHideContentChanged += DockPanel_ActiveAutoHideContentChanged; if (DockHelper.IsDockStateAutoHide(frmOutput.DockState)) { dockPanel.ActiveAutoHideContent = frmOutput; if (frmOutput.DockState == DockState.DockBottomAutoHide) { frmOutput.DockState = DockState.DockBottom; } else if (frmOutput.DockState == DockState.DockLeftAutoHide) { frmOutput.DockState = DockState.DockLeft; } else if (frmOutput.DockState == DockState.DockRightAutoHide) { frmOutput.DockState = DockState.DockRight; } else if (frmOutput.DockState == DockState.DockTopAutoHide) { frmOutput.DockState = DockState.DockTop; } } frmOutput.Focus(); } private void toolStripContainer1_TopToolStripPanel_SizeChanged(object sender, EventArgs e) { toolStripContainer1.Height = toolStripContainer1.TopToolStripPanel.Height; } #endregion /// /// 打开文件 /// /// 按钮 /// 参数 private void btnOpenFile_Click(object sender, EventArgs e) { string strFile = DocHelper.OpenDialog(); if (strFile == null) { return; } OpenFile(strFile); } /// /// 为图形文件全路径名添加dfd后缀. /// private string processImageFiles(string fileName) { int index = fileName.LastIndexOf('.'); if (index <= 0) { return fileName; } string postFix = fileName.Substring(index); postFix = postFix.ToUpper(); if (postFix == ".JPG") { return fileName + ".kev"; } return fileName; } /// /// 重新加载文件 /// /// 按钮 /// 事件参数 private void btnReloadFile_Click(object sender, EventArgs e) { viewerCur.ReloadFile(); viewerCur.ToolRedraw(); this.viewerCur.GetLengthAngleEvent += GetLengthAngle; } private void OpenFile(string strFile, bool setZColor = false) { if (this.ActiveDoc(strFile)) { return; } MainView viewer = new MainView(); viewer.ToolMainVisible = false; viewer.DrawerGotFocus += (object sender, EventArgs ea) => { Trace.WriteLine("openFile:" + ea.ToString()); }; viewer.ShowStatisticResult += Viewer_ShowStatisticResult; viewer.ZColorWidth = this.ZColorWidth; if (viewer.OpenFile(strFile, setZColor) == false) { return; } SetRecentMenu(strFile); strFile = processImageFiles(strFile); mainViews.Add(viewer); viewerCur = viewer; //viewer.FileFullName = strFile; createView(viewer, true); viewer.FileModifyEvent += Viewer_FileModifyEvent; this.viewerCur.GetLengthAngleEvent += GetLengthAngle; } //[JsonConverter(typeof(CPListConverter))] List lst; /// /// 新建文件 /// /// 新建文件按钮 /// 事件参数 private void btnNewFile_Click(object sender, EventArgs e) { NewFile(); return; //JObject obj1 = JObject.FromObject(new //{ id = 1, name = "井号", X = 20, }); //JArray jArray = new JArray(); //jArray.Add(obj1); //jArray.Add(obj1); //string strData = jArray.ToString(); //object obj = JsonConvert.DeserializeObject(strData); //List cps = new List(); //B1 b1 = new B1(); //B2 b2 = new B2(); //CP cP = new CP(); //cps.Add(b1); //cps.Add(b2); //cps.Add(cP); //strData = JsonConvert.SerializeObject(cps); //lst = JsonConvert.DeserializeObject>(strData, new CPListConverter()); //List lstOut = lst as List; } //[Json] class CP { public string Test1 { get; set; } = "1"; public string Test2 { get; set; } = "2"; } //[JsonObject(ItemConverterType =typeof(CP))] class B1 : CP { public string TestB { get; set; } = "B1"; } class B2 : CP { public string TestB2 { get; set; } = "B2"; } //class CPListConverter : JsonConverter //{ // public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) // { // var jObject = JObject.Load(reader); // List values = new List(); // foreach (var item in jObject.Properties()) // { // Type type = Type.GetType(item.Name); // var value = item.Value.ToObject(type); // values.Add((T)value); // } // return values; // } // public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) // { // var values = (List)value; JObject jObject = new JObject(); // foreach (var item in values) // { // jObject.Add(item.GetType().FullName, JToken.FromObject(item)); // } // var p = jObject.Properties(); // foreach (var item in p) // { // //Debug.Log(item.Name); // //Debug.Log(item.Name); // } // serializer.Serialize(writer, jObject); // } // public override bool CanConvert(Type objectType) // { // return true; // } //} private void NewFile() { MainView viewer = new MainView(); viewer.DrawerGotFocus += (object senderDrawer, EventArgs ea) => { Trace.WriteLine(ea.ToString()); }; string strPageText = "图形 " + (++nViewCount); if (viewer.NewFile(strPageText) == false) { return; } mainViews.Add(viewer); viewerCur = viewer; createView(viewer, true); viewer.FileModifyEvent += Viewer_FileModifyEvent; this.viewerCur.GetLengthAngleEvent += GetLengthAngle; } private void Viewer_FileModifyEvent(object sender, bool isModified) { MainView view = sender as MainView; FrmDoc docFind = dockPanel.Documents.FirstOrDefault(it => ((FrmDoc)it).ID == view.ID) as FrmDoc; docFind.Text = view.Text; } /// /// 保存文件 /// /// 保存文件按钮 /// 事件参数 private void btnSaveFile_Click(object sender, EventArgs e) { if (viewerCur == null) { return; } if (viewerCur.SaveFile()) { setTitle(viewerCur.FileFullName); this.SetRecentMenu(viewerCur.FileFullName); } } /// /// 另存为 /// /// 另存为按钮 /// 参数 private void btnSaveAs_Click(object sender, EventArgs e) { if (viewerCur == null) { return; } if (viewerCur.SaveAs()) { setTitle(viewerCur.FileFullName); } } private void setTitle(string title) { FileInfo fi = new FileInfo(title); ((FrmDoc)dockPanel.ActiveDocument).Text = fi.Name; } /// /// 显示统计面板 /// /// /// private void Viewer_ShowStatisticResult(object sender, EventArgs e) { ShowAndActiveOutput(); } /// /// 打印事件 /// /// 打印按钮 /// 事件参数 private void tsbPrint_Click(object sender, EventArgs e) { viewerCur.PrintDraw(); } /// /// 符号管理 /// /// 符号管理事件 /// 事件参数 private void btnSymbolManage_Click(object sender, EventArgs e) { this.viewerCur.ShowSymbolManager(null); } /// /// 快捷键处理 /// /// 当前窗体 /// 键盘事件 private void FormMain_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.O) { this.btnOpenFile_Click(null, null); } else if (e.KeyCode == Keys.S && e.Control) { this.btnSaveFile_Click(null, null); } else if (e.KeyCode == Keys.N && e.Control) { this.btnNewFile_Click(null, null); } else if (e.KeyCode == Keys.Escape) { if (viewerCur != null) { viewerCur.Escape(); } } } /// /// 拖放进入 /// /// 窗体 /// 事件参数 private void FormMain_DragEnter(object sender, DragEventArgs e) { // 表示接收到的数据是文件类型 if (e.Data.GetDataPresent(DataFormats.FileDrop)) { // 设置鼠标效果 e.Effect = DragDropEffects.All; } } /// /// 拖放事件 /// /// 窗体 /// 事件参数 private void FormMain_DragDrop(object sender, DragEventArgs e) { // 取出拖放数据,返回类型为 Object,需要强制转换成 string[] 类型 var ary = e.Data.GetData(DataFormats.FileDrop) as string[]; for (int i = 0; i < ary.Length; i++) { // 数组中的每个元素都是一个文件或目录的完整路径 var path = ary[i]; OpenFile(path); } } private void tsmiLeftTop_Click(object sender, EventArgs e) { tsmiLeftTop.Checked = sender == tsmiLeftTop; tsmiCenter.Checked = sender == tsmiCenter; config.WriteString("Display", "ZoomMode", "0"); } private void tsmiCenter_Click(object sender, EventArgs e) { tsmiCenter.Checked = sender == tsmiCenter; tsmiLeftTop.Checked = sender == tsmiLeftTop; config.WriteString("Display", "ZoomMode", "1"); } private enum KeyModifiers { None = 0, Alt = 1, Control = 2, Shift = 4, Windows = 8 } // id hot key identifier [DllImport("user32.dll", SetLastError = true)] private static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk); [DllImport("user32.dll", SetLastError = true)] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); private void RegisterHotKeys() { RegisterHotKey(Handle, 1001, KeyModifiers.Control, Keys.O); RegisterHotKey(Handle, 1002, KeyModifiers.Control, Keys.S); RegisterHotKey(Handle, 1003, KeyModifiers.Control, Keys.N); RegisterHotKey(Handle, 1004, KeyModifiers.None, Keys.Escape); } private void UnRegisterHotKeys() { UnregisterHotKey(Handle, 1001); UnregisterHotKey(Handle, 1002); UnregisterHotKey(Handle, 1003); UnregisterHotKey(Handle, 1004); } private void processHotKey(int hotKeyId) { if (hotKeyId == 1001) { string[] fileNames = DocHelper.SelectMutiFiles(); foreach (var item in fileNames) { if (string.IsNullOrEmpty(item)) { OpenFile(item); } } } else if (hotKeyId == 1002) { //SaveFile(); if (viewerCur == null) { return; } if (viewerCur.SaveFile()) { setTitle(viewerCur.FileFullName); } } else if (hotKeyId == 1003) { NewFile(); } else if (hotKeyId == 1004) { ProcessEscape(); } } protected override void WndProc(ref Message m)//监视Windows消息 { const int WM_HOTKEY = 0x0312; //热键消息 if (m.Msg == WM_HOTKEY) { processHotKey(m.WParam.ToInt32()); } base.WndProc(ref m); } private void FormMain_Activated(object sender, EventArgs e) { RegisterHotKeys(); } private void FormMain_Deactivate(object sender, EventArgs e) { UnRegisterHotKeys(); } private void ProcessEscape() { if (viewerCur == null) return; viewerCur.Escape(); } private void tsbtnMerge_Click(object sender, EventArgs e) { var openFile = new OpenFileDialog(); openFile.Title = "合并文件"; openFile.Filter = "GeoSigma Files (*.gm*)|*.*"; openFile.FilterIndex = 0; openFile.Multiselect = false; if (openFile.ShowDialog() == DialogResult.OK) { viewerCur.FileMerge(openFile.FileName); viewerCur.ToolRedraw(); } } private string GetFileName(string extName) { var sfd = new SaveFileDialog(); sfd.Filter = extName; if (sfd.ShowDialog() != DialogResult.OK) return ""; return sfd.FileName.ToString(); } private void tsmiShow_Click(object sender, EventArgs e) { string extName = "KE Files (*.kev)|*.kev|All file(*.*)|*.*||"; string filePath = this.GetFileName(extName); this.viewerCur.FileSaveView(filePath); } private void tsmiFileSelectSave_Click(object sender, EventArgs e) { string extName = "KE Files (*.kev)|*.kev|All file(*.*)|*.*||"; string filePath = this.GetFileName(extName); this.viewerCur.FileSaveSelect(filePath); } private void tsmiPointSave_Click(object sender, EventArgs e) { string extName = "KE Files (*.kev)|*.kev|All file(*.*)|*.*||"; string filePath = this.GetFileName(extName); if (string.IsNullOrEmpty(filePath)) { return; } this.viewerCur.FileSavePoint(filePath); } private void tsmiCurveSave_Click(object sender, EventArgs e) { string extName = "KE Files (*.kev)|*.kev|All file(*.*)|*.*||"; string filePath = this.GetFileName(extName); if (string.IsNullOrEmpty(filePath)) { return; } this.viewerCur.FileSaveCurve(filePath); } private void tsmiSolidSave_Click(object sender, EventArgs e) { string extName = "KE Files (*.kev)|*.kev|All file(*.*)|*.*||"; string filePath = this.GetFileName(extName); if (!string.IsNullOrEmpty(filePath)) { this.viewerCur.FileSaveSolid(filePath); } } private void tsmiText_Click(object sender, EventArgs e) { string extName = "KE Files (*.kev)|*.kev|All file(*.*)|*.*||"; string filePath = this.GetFileName(extName); if (string.IsNullOrEmpty(filePath)) { return; } this.viewerCur.FileSaveText(filePath); } private void tsmiCleanCurve_Click(object sender, EventArgs e) { string extName = "KE Files (*.kev)|*.kev|All file(*.*)|*.*||"; string filePath = this.GetFileName(extName); if (string.IsNullOrEmpty(filePath)) { return; } this.viewerCur.FileSaveCleanCurve(filePath); } private void tsmiXYZFSave_Click(object sender, EventArgs e) { string extName = "XYZ File (*.xyz)|*.xyz|All Files(*.*)|*.*||"; string filePath = this.GetFileName(extName); if (string.IsNullOrEmpty(filePath)) { return; } this.viewerCur.FileSaveToXyz(filePath); } private void tsmiSaveSymbol_Click(object sender, EventArgs e) { this.viewerCur.FileSaveToMark(); } private void tsmiImport_Click(object sender, EventArgs e) { this.viewerCur.ImportDataFile(); } private void tsmiExport_Click(object sender, EventArgs e) { this.viewerCur.ExportDataFile(); } private void tsmiAbout_Click(object sender, EventArgs e) { FrmAbout frmAbout = new FrmAbout(); frmAbout.ShowDialog(); } } }