You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
380 lines
15 KiB
380 lines
15 KiB
using DevExpress.XtraEditors; |
|
using ESRI.ArcGIS.Carto; |
|
using ESRI.ArcGIS.Geodatabase; |
|
using KGIS.Framework.Utils.Helper; |
|
using KGIS.Plugin.LayerProperty.Utils; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.ComponentModel; |
|
using System.Data; |
|
using System.Drawing; |
|
using System.Linq; |
|
using System.Text; |
|
using System.Text.RegularExpressions; |
|
using System.Threading.Tasks; |
|
using System.Windows.Forms; |
|
|
|
namespace KGIS.Plugin.LayerProperty.View |
|
{ |
|
public partial class FormLabelExpression : XtraForm |
|
{ |
|
private ILabelEngineLayerProperties2 m_LabelEngineLayerProperties; |
|
private IAnnotationExpressionEngine m_ExpressionEngine; |
|
private bool m_IsExpressionSimple; |
|
private string labelExpression; |
|
private bool isSampleExpression; |
|
public string LabelExpression |
|
{ |
|
get |
|
{ |
|
return this.labelExpression; |
|
} |
|
set |
|
{ |
|
this.labelExpression = value; |
|
this.memoSQLInfo.Text = value; |
|
} |
|
} |
|
public bool IsSampleExpression |
|
{ |
|
get |
|
{ |
|
return this.isSampleExpression; |
|
} |
|
set |
|
{ |
|
this.isSampleExpression = value; |
|
} |
|
} |
|
public FormLabelExpression() |
|
{ |
|
InitializeComponent(); |
|
} |
|
private void InitForm(IFields fields) |
|
{ |
|
try |
|
{ |
|
this.lstField.Items.Clear(); |
|
int fieldCount = fields.FieldCount; |
|
for (int i = 0; i < fieldCount; i++) |
|
{ |
|
IField field = fields.get_Field(i); |
|
if (field.Type != esriFieldType.esriFieldTypeGeometry && field.Type != esriFieldType.esriFieldTypeBlob && field.Type != esriFieldType.esriFieldTypeRaster) |
|
{ |
|
ItemInfo<IField, string> item = new ItemInfo<IField, string>(field, field.Name); |
|
this.lstField.Items.Add(item); |
|
} |
|
} |
|
this.lstField.SelectedItem = this.lstField.Items[0]; |
|
} |
|
catch (Exception ex) |
|
{ |
|
//RdbUtil.AddException(ex); |
|
} |
|
} |
|
internal void InitForm(ILabelEngineLayerProperties2 labelEngineLayerProperties, IFields iFields) |
|
{ |
|
this.m_LabelEngineLayerProperties = labelEngineLayerProperties; |
|
this.InitForm(iFields); |
|
if (labelEngineLayerProperties != null) |
|
{ |
|
this.m_IsExpressionSimple = labelEngineLayerProperties.IsExpressionSimple; |
|
this.m_ExpressionEngine = labelEngineLayerProperties.ExpressionParser; |
|
if (labelEngineLayerProperties.IsExpressionSimple) |
|
{ |
|
this.memoSQLInfo.Text = labelEngineLayerProperties.Expression; |
|
return; |
|
} |
|
if (this.m_ExpressionEngine is AnnotationJScriptEngineClass) |
|
{ |
|
this.cmbParser.SelectedIndex = 0; |
|
} |
|
else |
|
{ |
|
this.cmbParser.SelectedIndex = 1; |
|
} |
|
//this.chkAdvanced.Checked = true; |
|
} |
|
} |
|
private void lstField_DoubleClick(object sender, System.EventArgs e) |
|
{ |
|
try |
|
{ |
|
this.Cursor = Cursors.AppStarting; |
|
this.InsertString("[" + this.lstField.SelectedItem.ToString().Trim() + "]"); |
|
this.memoSQLInfo.SendMouseUp(this.memoSQLInfo.Location, MouseButtons.Left); |
|
this.Cursor = Cursors.Default; |
|
} |
|
catch (Exception ex) |
|
{ |
|
//RdbUtil.AddException(ex); |
|
this.Cursor = Cursors.Default; |
|
} |
|
} |
|
private void InsertString(string mStr) |
|
{ |
|
int selectionStart = this.memoSQLInfo.SelectionStart; |
|
string text = this.memoSQLInfo.Text; |
|
if (selectionStart == text.Length) |
|
{ |
|
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(selectionStart, mStr).Trim(); |
|
this.memoSQLInfo.SelectionStart = selectionStart + mStr.Length; |
|
return; |
|
} |
|
Regex regex = new Regex("\\[\\s*\\]"); |
|
MatchCollection matchCollection = regex.Matches(text); |
|
for (int i = 0; i < matchCollection.Count; i++) |
|
{ |
|
Match match = matchCollection[i]; |
|
if (selectionStart > match.Index && selectionStart <= match.Index + match.Length) |
|
{ |
|
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(match.Index + match.Length, mStr).Trim(); |
|
this.memoSQLInfo.SelectionStart = match.Index + match.Length + mStr.Length; |
|
return; |
|
} |
|
} |
|
regex = new Regex("\\[\\w*\\W*\\]"); |
|
matchCollection = regex.Matches(text); |
|
for (int j = 0; j < matchCollection.Count; j++) |
|
{ |
|
Match match2 = matchCollection[j]; |
|
if (selectionStart > match2.Index && selectionStart <= match2.Index + match2.Length) |
|
{ |
|
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(match2.Index + match2.Length, mStr).Trim(); |
|
this.memoSQLInfo.SelectionStart = match2.Index + match2.Length + mStr.Length; |
|
return; |
|
} |
|
} |
|
Match match3 = regex.Match(text, selectionStart); |
|
if (!match3.Success) |
|
{ |
|
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(selectionStart, mStr).Trim(); |
|
this.memoSQLInfo.SelectionStart = selectionStart + mStr.Length; |
|
return; |
|
} |
|
match3 = regex.Match(text, selectionStart); |
|
int index = match3.Index; |
|
regex = new Regex("\\]"); |
|
match3 = regex.Match(text, selectionStart); |
|
if (match3.Index < index && match3.Index + 1 == index) |
|
{ |
|
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(match3.Index + 1, mStr).Trim(); |
|
this.memoSQLInfo.SelectionStart = match3.Index + 1 + mStr.Length; |
|
return; |
|
} |
|
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(selectionStart, mStr).Trim(); |
|
this.memoSQLInfo.SelectionStart = selectionStart + mStr.Length; |
|
} |
|
private void AppendString(string mStr) |
|
{ |
|
} |
|
private void InsertStringNospace(string mStr) |
|
{ |
|
mStr = (mStr.Trim() ?? ""); |
|
int selectionStart = this.memoSQLInfo.SelectionStart; |
|
this.memoSQLInfo.Text = this.memoSQLInfo.Text.Insert(selectionStart, mStr).Trim(); |
|
if (mStr.EndsWith("() ")) |
|
{ |
|
this.memoSQLInfo.SelectionStart = mStr.Length + selectionStart - 2; |
|
return; |
|
} |
|
this.memoSQLInfo.SelectionStart = mStr.Length + selectionStart; |
|
} |
|
private void btnAppend_Click(object sender, System.EventArgs e) |
|
{ |
|
ItemInfo<IField, string> itemInfo = this.lstField.SelectedItem as ItemInfo<IField, string>; |
|
if (itemInfo != null) |
|
{ |
|
if (this.memoSQLInfo.Text.Length > 0) |
|
{ |
|
this.InsertString("& \" \" &[" + itemInfo.InnerValue.Name + "]"); |
|
return; |
|
} |
|
this.InsertString("[" + itemInfo.InnerValue.Name + "]"); |
|
} |
|
} |
|
private void btnOk_Click(object sender, System.EventArgs e) |
|
{ |
|
if (this.LabelExpressionFinish()) |
|
{ |
|
this.labelExpression = this.memoSQLInfo.Text; |
|
#region BUG12168 郑英杰 2018-09-06 |
|
//int num = 0; |
|
//Regex regex = new Regex("\\[\\s*\\]"); |
|
//MatchCollection matchCollection = regex.Matches(this.labelExpression); |
|
//num = matchCollection.Count + num; |
|
//regex = new Regex("\\[\\w*\\W*\\]"); |
|
//matchCollection = regex.Matches(this.labelExpression); |
|
//num = matchCollection.Count + num; |
|
//if (num > 1) |
|
//{ |
|
// this.isSampleExpression = false; |
|
//} |
|
//else |
|
//{ |
|
// this.isSampleExpression = true; |
|
//} |
|
#endregion |
|
this.m_LabelEngineLayerProperties.IsExpressionSimple = this.m_IsExpressionSimple; |
|
base.DialogResult = DialogResult.OK; |
|
base.Close(); |
|
} |
|
} |
|
private bool LabelExpressionFinish() |
|
{ |
|
if (this.memoSQLInfo.Text.Length == 0) |
|
{ |
|
MessageHelper.ShowTips("表达式不能为空!"); |
|
return false; |
|
} |
|
this.m_LabelEngineLayerProperties.ExpressionParser = this.m_ExpressionEngine; |
|
this.m_LabelEngineLayerProperties.Expression = this.memoSQLInfo.Text; |
|
this.m_LabelEngineLayerProperties.IsExpressionSimple = !this.chkAdvanced.Checked; |
|
return this.VerifyExpression(); |
|
} |
|
private void btnReset_Click(object sender, System.EventArgs e) |
|
{ |
|
this.memoSQLInfo.Text = this.labelExpression; |
|
} |
|
private void btnVerify_Click(object sender, System.EventArgs e) |
|
{ |
|
if (this.VerifyExpression()) |
|
{ |
|
MessageHelper.ShowTips("表达式正确!"); |
|
} |
|
} |
|
private bool VerifyExpression() |
|
{ |
|
try |
|
{ |
|
IAnnotationExpressionParser annotationExpressionParser; |
|
if (this.chkAdvanced.Checked) |
|
{ |
|
annotationExpressionParser = this.m_ExpressionEngine.SetCode(this.memoSQLInfo.Text, "FindLabel"); |
|
if (annotationExpressionParser.AttributeCount == 0) |
|
{ |
|
MessageHelper.ShowTips("表达式错误,请检查!"); |
|
bool result = false; |
|
return result; |
|
} |
|
} |
|
else |
|
{ |
|
annotationExpressionParser = this.m_ExpressionEngine.SetExpression("", this.memoSQLInfo.Text); |
|
} |
|
if (annotationExpressionParser.AttributeCount == 0) |
|
{ |
|
MessageHelper.ShowTips("表达式错误,请检查!"); |
|
bool result = false; |
|
return result; |
|
} |
|
int num = 0; |
|
int num2 = 0; |
|
string text = ""; |
|
annotationExpressionParser.LastError(ref num, ref num2, ref text); |
|
if (text == null) |
|
{ |
|
bool result = true; |
|
return result; |
|
} |
|
if (!(text.Contains("MSScript.ocx is either not installed or not registered") || text.Trim().Replace(" ", "").Contains("MSScript.ocx没有安装或没有注册") || text.Trim().Replace(" ", "").Contains("MSScript.ocx未安装或未注册"))) |
|
{ |
|
MessageHelper.ShowTips(text); |
|
bool result = false; |
|
return result; |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
//RdbUtil.AddException(ex); |
|
} |
|
return true; |
|
} |
|
private void memoSQLInfo_TextChanged(object sender, System.EventArgs e) |
|
{ |
|
if (this.memoSQLInfo.Text.Length == 0) |
|
{ |
|
this.btnVerify.Enabled = false; |
|
return; |
|
} |
|
this.btnVerify.Enabled = true; |
|
} |
|
private void chkAdvanced_CheckedChanged(object sender, System.EventArgs e) |
|
{ |
|
if (this.chkAdvanced.Checked) |
|
{ |
|
|
|
this.memoSQLInfo.Text = this.GetScriptSentence(this.m_ExpressionEngine, this.m_LabelEngineLayerProperties.Expression); |
|
#region BUG10428 2018-09-03 郑英杰 |
|
this.m_IsExpressionSimple = false; |
|
#endregion |
|
} |
|
else |
|
{ |
|
|
|
this.memoSQLInfo.Text = this.GetExpressionByCode(this.m_ExpressionEngine, this.m_LabelEngineLayerProperties.Expression); |
|
#region BUG10428 2018-09-03 郑英杰 |
|
this.m_IsExpressionSimple = true; |
|
#endregion |
|
} |
|
|
|
#region BUG10428 2018-09-03 郑英杰 |
|
//this.m_IsExpressionSimple = !this.m_IsExpressionSimple; |
|
#endregion |
|
} |
|
private string GetScriptSentence(IAnnotationExpressionEngine pExpressionEngine, string m_LabelExpression) |
|
{ |
|
if (this.m_IsExpressionSimple && this.m_LabelEngineLayerProperties.IsExpressionSimple) |
|
{ |
|
IAnnotationExpressionParser annotationExpressionParser = pExpressionEngine.SetExpression("", m_LabelExpression); |
|
string text = ""; |
|
for (int i = 0; i < annotationExpressionParser.AttributeCount; i++) |
|
{ |
|
if (i == 0) |
|
{ |
|
text = "[" + annotationExpressionParser.get_Attribute(0) + "]"; |
|
} |
|
else |
|
{ |
|
text = text + ", [" + annotationExpressionParser.get_Attribute(i) + "]"; |
|
} |
|
} |
|
return pExpressionEngine.CreateFunction("FindLabel", text, m_LabelExpression); |
|
} |
|
return this.m_LabelEngineLayerProperties.Expression; |
|
} |
|
private string GetExpressionByCode(IAnnotationExpressionEngine pExpressionEngine, string fullCode) |
|
{ |
|
if (!this.m_IsExpressionSimple && !this.m_LabelEngineLayerProperties.IsExpressionSimple) |
|
{ |
|
IAnnotationExpressionParser annotationExpressionParser = pExpressionEngine.SetCode(fullCode, "FindLabel"); |
|
string text = ""; |
|
for (int i = 0; i < annotationExpressionParser.AttributeCount; i++) |
|
{ |
|
if (i == 0) |
|
{ |
|
text = "[" + annotationExpressionParser.get_Attribute(0) + "]"; |
|
} |
|
else |
|
{ |
|
text = text + "&\"\"& [" + annotationExpressionParser.get_Attribute(i) + "]"; |
|
} |
|
} |
|
return text; |
|
} |
|
return this.m_LabelEngineLayerProperties.Expression; |
|
} |
|
private void cmbParser_SelectedIndexChanged(object sender, System.EventArgs e) |
|
{ |
|
if (this.cmbParser.SelectedIndex == 0) |
|
{ |
|
this.m_ExpressionEngine = new AnnotationJScriptEngineClass(); |
|
} |
|
else |
|
{ |
|
this.m_ExpressionEngine = new AnnotationVBScriptEngineClass(); |
|
} |
|
this.chkAdvanced.Checked = false; |
|
} |
|
} |
|
}
|
|
|