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.

607 lines
24 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using KPlan.Util;
using System.Data;
using Teamcenter.Soa.Client.Model;
using System.ComponentModel;
using Teamcenter.Soa.Client.Model.Strong;
using System.IO;
using Eplan.EplApi.DataModel;
using Eplan.EplApi.Base;
using Eplan.EplApi.ApplicationFramework;
using Action = System.Action;
using Eplan.EplApi.HEServices;
using System.Collections.Specialized;
using Label = System.Windows.Controls.Label;
namespace KPlan.Forms {
/// <summary>
/// OpenFromTC.xaml 的交互逻辑
/// </summary>
public partial class OpenFromTC : Window {
private string queryName;
private Dictionary<string, TextBox> queryFieldMap = new Dictionary<string,TextBox>();
private DataTable queryResultData = new DataTable();
private List<string> queryResultConfig = new List<string>();
private List<int> queryResultWidth = new List<int>();
private KBackgroundWorker bgWorker_Query;
private KBackgroundWorker bgWorker_Homer;
private KBackgroundWorker bgWorker_Open;
private ModelObject selectedObject;
public OpenFromTC() {
InitializeComponent();
KUtil.SetOwnerWindow(this);
LoadFromConfiguration();
bgWorker_Query = new KBackgroundWorker(this);
bgWorker_Query.backgroundWorker.DoWork += Async_Query;
bgWorker_Homer = new KBackgroundWorker(this);
bgWorker_Homer.backgroundWorker.DoWork += Async_LoadHome;
bgWorker_Open = new KBackgroundWorker(this);
bgWorker_Open.backgroundWorker.DoWork += Async_Open;
}
private void Async_Open(object sender, DoWorkEventArgs e) {
ModelObject mo = (ModelObject)e.Argument;
if (mo == null) {
return;
}
bgWorker_Open.Progress("正在打开...", 1);
string eplanDSType = KUtil.GetConfigValue(KConfigure.PROJ_SYNC_SECTION, KConfigure.PROJ_SYNC_ZW_DSTYPE);
List<Dataset> target = new List<Dataset>();
if (TCUtil.IsType(mo.SoaType, "Dataset")) {
//if (!TCUtil.IsType(mo.SoaType, TCUtil.TYPE_EPLAN)) {
// KUtil.DispatcherShow(this, "请选择" + TCUtil.TYPE_EPLAN + "数据集进行操作");
// return;
//}
target.Add((Dataset)mo);
}else if (TCUtil.IsType(mo.SoaType, "ItemRevision")) {
ModelObject[] children = TCUtil.GetChildFromPref(mo);
for(int i = 0; i < children.Length; i++) {
if (TCUtil.IsType(children[i].SoaType, eplanDSType)) {
target.Add((Dataset)children[i]);
}
}
}
else {
KUtil.DispatcherShow(this,"请选择版本或数据集进行操作");
return;
}
if (target.Count == 0) {
KUtil.DispatcherShow(this, "当前对象下不存在EPLAN数据集");
return;
}
if (target.Count > 1) {
KUtil.DispatcherShow(this,"当前对象下存在多个数据集,请选择要打开的数据集");
return;
}
Dataset ds = target[0];
List<ImanFile> imanFiles = TCUtil.GetDatasetFile(ds, null);
TCUtil.GetProperties(false, TCUtil.Refresh(ds), "object_string");
if (imanFiles.Count == 0) {
KUtil.DispatcherShow(this, "数据集<"+ds.Object_string+">下没有找到引用文件");
return;
}
if (imanFiles.Count > 1) {
KUtil.DispatcherShow(this, "数据集<" + ds.Object_string + ">下找到多个引用文件");
return;
}
FileInfo file = TCUtil.GetFileInfo(imanFiles[0]);
if (file == null) {
KUtil.DispatcherShow(this, "从数据集<"+ds.Object_string+">下载引用文件失败");
return;
}
if (file.Attributes.ToString().IndexOf("ReadOnly") != -1) {
file.Attributes = FileAttributes.Normal;
}
if (file.FullName.ToLower().EndsWith("zw1")) {
string projName = file.Name.Replace(".zw1", "").Replace(".ZW1", "");
KUtil.Log("打开项目:"+projName+" - "+file.FullName);
string targetFolder = KUtil.GetConfigValue(KConfigure.EPLAN_DATA_SECTION, KConfigure.EPLAN_WORKSAPCE);
if (KUtil.IsEmpty(targetFolder)) {
KUtil.DispatcherShow(this, "未配置项目解压路径");
return;
}
if (!Directory.Exists(targetFolder)) {
Directory.CreateDirectory(targetFolder);
}
RestoreProject(targetFolder,file.FullName, projName);
}
else {
System.Diagnostics.Process.Start(file.FullName);
}
}
private void openDs(ModelObject mo, Progress progress) {
if (mo == null) {
return;
}
string eplanDSType = KUtil.GetConfigValue(KConfigure.PROJ_SYNC_SECTION, KConfigure.PROJ_SYNC_ZW_DSTYPE);
List<Dataset> target = new List<Dataset>();
if (TCUtil.IsType(mo.SoaType, "Dataset")) {
//if (!TCUtil.IsType(mo.SoaType, TCUtil.TYPE_EPLAN)) {
// KUtil.DispatcherShow(this, "请选择" + TCUtil.TYPE_EPLAN + "数据集进行操作");
// return;
//}
target.Add((Dataset)mo);
}
else if (TCUtil.IsType(mo.SoaType, "ItemRevision")) {
ModelObject[] children = TCUtil.GetChildFromPref(mo);
for (int i = 0; i < children.Length; i++) {
if (TCUtil.IsType(children[i].SoaType, eplanDSType)) {
target.Add((Dataset)children[i]);
}
}
}
else {
KUtil.DispatcherShow(this, "请选择版本或数据集进行操作");
return;
}
if (target.Count == 0) {
KUtil.DispatcherShow(this, "当前对象下不存在EPLAN数据集");
return;
}
if (target.Count > 1) {
KUtil.DispatcherShow(this, "当前对象下存在多个数据集,请选择要打开的数据集");
return;
}
Dataset ds = target[0];
List<ImanFile> imanFiles = TCUtil.GetDatasetFile(ds, null);
TCUtil.GetProperties(false, TCUtil.Refresh(ds), "object_string");
if (imanFiles.Count == 0) {
KUtil.DispatcherShow(this, "数据集<" + ds.Object_string + ">下没有找到引用文件");
return;
}
if (imanFiles.Count > 1) {
KUtil.DispatcherShow(this, "数据集<" + ds.Object_string + ">下找到多个引用文件");
return;
}
FileInfo file = TCUtil.GetFileInfo(imanFiles[0]);
if (file == null) {
KUtil.DispatcherShow(this, "从数据集<" + ds.Object_string + ">下载引用文件失败");
return;
}
if (file.Attributes.ToString().IndexOf("ReadOnly") != -1) {
file.Attributes = FileAttributes.Normal;
}
Close();
progress.BeginPart(100.0, "");
progress.ShowImmediately();
progress.SetAllowCancel(true);
if (file.FullName.ToLower().EndsWith("zw1")) {
string projName = file.Name.Replace(".zw1", "").Replace(".ZW1", "");
KUtil.Log("打开项目:" + projName + " - " + file.FullName);
string targetFolder = KUtil.GetConfigValue(KConfigure.EPLAN_DATA_SECTION,KConfigure.EPLAN_WORKSAPCE);
if (KUtil.IsEmpty(targetFolder)) {
KUtil.DispatcherShow(this, "未配置项目解压路径");
return;
}
if (!Directory.Exists(targetFolder)) {
Directory.CreateDirectory(targetFolder);
}
using (new LockingStep()) {
RestoreProject(targetFolder,file.FullName, projName);
}
}
else {
System.Diagnostics.Process.Start(file.FullName);
}
}
private bool RestoreProject(string folderPath,string zipName, string projName) {
Restore restore = new Restore();
StringCollection archives = new StringCollection();
archives.Add(zipName);
restore.Project(archives, folderPath, projName, false, true);
ProjectManager manager = new ProjectManager();
if (File.Exists(folderPath + "\\" + projName + ".elk")) {
manager.OpenProject(folderPath + "\\" + projName + ".elk");
}
else if (File.Exists(folderPath + "\\" + projName + ".ell")) {
manager.OpenProject(folderPath + "\\" + projName + ".ell");
}
else {
throw new Exception("未找到项目文件");
}
/*try {
manager = new ProjectManager();
context = new ActionCallingContext();
context.AddParameter("TYPE", "PROJECT");
context.AddParameter("ARCHIVENAME", zipName);
context.AddParameter("PROJECTNAME", projName);
context.AddParameter("UNPACKPROJECT", "0");
// progress = new Progress("SimpleProgress");
//progress.BeginPart(100.0, "");
//progress.ShowImmediately();
// progress.SetAllowCancel(true);
interpreter = new CommandLineInterpreter();
if (interpreter.Execute("restore", context)) {
//MessageBox.Show("该项目不能恢复!");
}
// progress.EndPart(true);
manager.OpenProject(PathMap.SubstitutePath(projName));
}
catch (Exception exception1) {
KUtil.LogErr(exception1);
KUtil.DispatcherShow(this, exception1.Message);
}*/
return true;
}
private void b_Open_Click(object sender, RoutedEventArgs e) {
if (this.selectedObject == null) {
MessageBox.Show(this, "请选择要打开的对象");
}
else {
Progress progress = new Progress("SimpleProgress");
try {
openDs(selectedObject, progress);
progress.EndPart(true);
}
catch(System.Exception ex) {
KUtil.LogErr(ex);
progress.EndPart(true);
MessageBox.Show(this,"打开出错:"+ex.Message);
}
//bgWorker_Open.Start(this.selectedObject);
}
}
private void LoadFromConfiguration() {
//加载查询条件
LoadQueryFields();
//加载查询结果
LoadQueryTable();
}
private void LoadQueryTable() {
queryResultData.Rows.Clear();
string queryResults = KUtil.GetConfigValue(KConfigure.QUERY_PROJ_SECTION, KConfigure.QUERY_PROJ_RESULTS);
string[] queryResultSplit = queryResults.Split(';');
int len = queryResultSplit.Length;
for (int i = 0; i < len; i++) {
string queryResult = queryResultSplit[i].Trim();
if (KUtil.IsEmpty(queryResult)) {
continue;
}
string titile = queryResult;
string config = queryResult;
int width = 50;
string[] split = queryResult.Split(',');
if (split.Length > 1) {
titile = split[0].Trim();
config = split[1].Trim();
}
if (split.Length > 2) {
Int32.TryParse(split[2].Trim(), out width);
}
queryResultConfig.Add(config);
queryResultWidth.Add(width);
queryResultData.Columns.Add(new DataColumn() {
ColumnName = titile,
DataType = i == 0 ? typeof(TableRowData) : typeof(string)
});
}
//queryResultData.Rows.Add(new object[] { 1 });
datagrid_SearchResult.DataContext = queryResultData.DefaultView;
}
private void LoadQueryFields() {
string heightConfig = KUtil.GetConfigValue(KConfigure.QUERY_PROJ_SECTION, KConfigure.QUERY_PROJ_HEIGHT);
if(!KUtil.IsEmpty(heightConfig)){
double h = 0;
Double.TryParse(heightConfig,out h);
if (h > 0) {
rd_QueryField.Height = new GridLength(h);
}
}
this.queryName = KUtil.GetConfigValue(KConfigure.QUERY_PROJ_SECTION, KConfigure.QUERY_PROJ_NAME);
string queryFields = KUtil.GetConfigValue(KConfigure.QUERY_PROJ_SECTION, KConfigure.QUERY_PROJ_FIELDS);
string[] queryFieldSplit = queryFields.Split(';');
int len = queryFieldSplit.Length;
for (int i = 0; i < len; i++) {
string queryField = queryFieldSplit[i].Trim();
if (KUtil.IsEmpty(queryField)) {
continue;
}
string disName = queryField;
string realName = queryField;
string[] split = queryField.Split(',');
if (split.Length == 2) {
disName = split[0].Trim();
realName = split[1].Trim();
}
if (queryFieldMap.ContainsKey(realName)) {
continue;
}
RowDefinition rd = new RowDefinition();
rd.Height = new GridLength(1.0, GridUnitType.Auto);
grid_QueryField.RowDefinitions.Add(rd);
Label label = new Label();
label.Content = disName;
label.HorizontalContentAlignment=HorizontalAlignment.Right;
Grid.SetRow(label,queryFieldMap.Count);
Grid.SetColumn(label,0);
grid_QueryField.Children.Add(label);
TextBox textBox = new TextBox();
Grid.SetRow(textBox, queryFieldMap.Count);
Grid.SetColumn(textBox, 1);
textBox.Margin = new Thickness(0, 2, 0, 8);
textBox.Height = 24;
textBox.VerticalContentAlignment = VerticalAlignment.Center;
grid_QueryField.Children.Add(textBox);
queryFieldMap.Add(realName, textBox);
}
}
private void Async_Query(object sender, DoWorkEventArgs e) {
Dictionary<string, string> fields = (Dictionary<string, string>)e.Argument;
ModelObject[] queryRes=null;
try {
bgWorker_Query.Progress("正在查询...", 1);
queryRes = TCUtil.query(queryName, fields);
}
catch (System.Exception ex) {
this.Dispatcher.Invoke(new Action(delegate {
MessageBox.Show(this, "查询出错:" + ex.Message, "错误");
}));
KUtil.LogErr(ex);
return;
}
if (queryRes == null) {
return;
}
//提取信息
TCUtil.dmService.RefreshObjects(queryRes);
try {
int len = queryRes.Length;
for (int i = 0; i < len; i++) {
if (bgWorker_Query.IsCancel()) {
e.Cancel = true;
break;
}
bgWorker_Query.Progress("加载数据 " + (i + 1) + "/" + len + " ", (i + 1) * 100 / len);
TableRowData data = new TableRowData(queryRes[i]);
object[] rowData = data.GetRowData(i + 1, queryResultConfig);
this.Dispatcher.Invoke(new Action(delegate {
queryResultData.Rows.Add(rowData);
}));
}
}
catch (System.Exception ex) {
this.Dispatcher.Invoke(new Action(delegate {
MessageBox.Show(this, "读取数据出错:" + ex.Message, "错误");
}));
KUtil.LogErr(ex);
return;
}
}
private void Async_LoadHome(object sender, DoWorkEventArgs e) {
TCTreeItem parent = (TCTreeItem)e.Argument;
if (parent == null) {
//tree_Home.Items.Clear();
if (TCUtil.user == null) {
throw new Exception("加载Home失败用户未登录");
}
Folder home = TCUtil.user.Home_folder;
//TreeViewItem node_home = null;
bgWorker_Homer.Progress("加载中...", 0);
TCTreeItem tree_home = null;
this.Dispatcher.Invoke(new Action(delegate {
tree_home = new TCTreeItem(home);
tree_Home.Items.Add(tree_home);
tree_home.Items.Add(new TCTreeItem(null));
}));
}
else {
Cycle_Home(parent, e);
}
//this.Dispatcher.Invoke(new Action(delegate {
// MessageBox.Show(this,"Home下对象数量"+mo.Length);
//}));
}
private void Cycle_Home(TCTreeItem treeItem, DoWorkEventArgs e) {
if (!(treeItem.Items.Count == 1 && ((TCTreeItem)treeItem.Items.GetItemAt(0)).mo == null)) {
return;
}
this.Dispatcher.Invoke(new Action(delegate {
treeItem.Items.Clear();
}));
ModelObject parent = treeItem.mo;
ModelObject[] children = null;
//var t = parent.GetType();
SoaType soaType = parent.SoaType;
ModelObject[] mo = TCUtil.Refresh(parent);
if (TCUtil.IsType(soaType,"Folder")) {
TCUtil.GetProperties(false, mo, "contents");
children = ((Folder)parent).Contents;
}
else if (TCUtil.IsType(soaType, "Item") || TCUtil.IsType(soaType, "ItemRevision")) {
children = TCUtil.GetChildFromPref(parent);
}
//else if(TCUtil.IsType(soaType,"Item")){
// TCUtil.GetProperties(false, mo, "displayable_revisions");
// children = ((Item)parent).Displayable_revisions;
//}
//else if (TCUtil.IsType(soaType,"ItemRevision")) {
// TCUtil.GetProperties(false, mo, "IMAN_specification");
// children = ((ItemRevision)parent).GetProperty("IMAN_specification").ModelObjectArrayValue;
//}
else if (TCUtil.IsType(soaType,"Dataset")) {
children = null;
}
else {
return;
}
if (children == null) {
return;
}
if (bgWorker_Query.IsCancel()) {
e.Cancel = true;
return;
}
string eplanDSType = KUtil.GetConfigValue(KConfigure.PROJ_SYNC_SECTION, KConfigure.PROJ_SYNC_ZW_DSTYPE);
ItemCollection node_children = null;
this.Dispatcher.Invoke(new Action(delegate {
node_children = treeItem.Items;
}));
int len = children.Length;
for (int i=0;i<len;i++) {
if (bgWorker_Query.IsCancel()) {
e.Cancel = true;
return;
}
bgWorker_Homer.Progress("加载中...( "+(i+1)+" / "+len+" )", (i + 1) * 100 / len);
ModelObject c = children[i];
if (TCUtil.IsType(c.SoaType, "Dataset")&&!TCUtil.IsType(c.SoaType, eplanDSType)) {
continue;
}
TCTreeItem node_child = null;
this.Dispatcher.Invoke(new Action(delegate {
node_child = new TCTreeItem(c);
node_children.Add(node_child);
node_child.Items.Add(new TCTreeItem(null));
}));
//Cycle_Home(c, node_children2, false);
}
//添加视图
if(TCUtil.IsType(soaType, "ItemRevision")&&!TCUtil.IsType(soaType, "SF6_ElecHWDesignRevision")) {
TCUtil.GetProperties(false, new ModelObject[] { parent }, new string[] { "view" });
ModelObject[] bomChildren = ((ItemRevision)parent).View;
int bomCnt = bomChildren == null ? 0 : bomChildren.Length;
if (bomCnt > 0) {
this.Dispatcher.Invoke(new Action(delegate {
TCTreeItem viewNode = new TCTreeItem(parent, "View", "folder_16.png");
node_children.Add(viewNode);
ItemCollection view_children = viewNode.Items;
for(int i = 0; i < bomCnt; i++) {
if (bgWorker_Query.IsCancel()) {
e.Cancel = true;
return;
}
bgWorker_Homer.Progress("加载视图...( " + (i + 1) + " / " + bomCnt + " )", (i + 1) * 100 / bomCnt);
TCTreeItem cc = new TCTreeItem(bomChildren[i]);
view_children.Add(cc);
cc.Items.Add(new TCTreeItem(null));
}
}));
}
}
}
private void WindowLoaded(object sender, RoutedEventArgs e) {
bgWorker_Homer.Start(null);
}
private void ExpandHomeTree(object sender, RoutedEventArgs e) {
TCTreeItem item = e.OriginalSource as TCTreeItem;
bgWorker_Homer.Start(item);
}
private void b_Query_Click(object sender, RoutedEventArgs e) {
queryResultData.Rows.Clear();
//查询
Dictionary<string, string> fields= new Dictionary<string, string>();
foreach (string key in queryFieldMap.Keys) {
string value = queryFieldMap[key].Text;
if (!KUtil.IsEmpty(value)) {
fields.Add(key, value);
}
}
if (fields.Count == 0) {
MessageBox.Show(this, "请输入查询条件", "提示");
return;
}
//异步执行
bgWorker_Query.Start(fields);
//bgWorker = new KBgWorker2(this,backgroundWorker);
//backgroundWorker.RunWorkerAsync(fields);
}
private void b_Reset_Click(object sender, RoutedEventArgs e) {
foreach (TextBox tb in queryFieldMap.Values) {
tb.Text = "";
}
queryResultData.Rows.Clear();
}
//private void DataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e) {
// ScrollViewer scv = (ScrollViewer)sender;
// scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta);
// e.Handled = true;
//}
private void QueryTableLoaded(object sender, RoutedEventArgs e) {
int len = queryResultWidth.Count;
for (int i = 0; i < len; i++) {
datagrid_SearchResult.Columns[i].Width = queryResultWidth[i];
}
}
private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) {
int index = datagrid_SearchResult.SelectedIndex;
if (index < 0) {
tabItem_SearchTarget.Visibility = Visibility.Hidden;
tab_home.SelectedIndex = 0;
selectedObject = null;
return;
}
tabItem_SearchTarget.Visibility = Visibility.Visible;
tab_home.SelectedIndex = 1;
try {
tree_SearchTarget.Items.Clear();
DataRow row = queryResultData.Rows[index];
TableRowData ss = row.Field<TableRowData>(0);
ModelObject mo = ss.mo;
this.selectedObject = mo;
ModelObject[] mos = TCUtil.Refresh(mo);
TCUtil.GetProperties(false, mos, "object_string");
tabItem_SearchTarget.Header = mo.GetPropertyDisplayableValue("object_string");
TCTreeItem target = new TCTreeItem(mo);
tree_SearchTarget.Items.Add(target);
target.Items.Add(new TCTreeItem(null));
this.Dispatcher.Invoke(new Action(delegate {
target.ExpandSubtree();
}));
} catch (System.Exception ex) {
KUtil.LogErr(ex);
MessageBox.Show(ex.Message);
}
}
private void tree_SelectionChanged(object sender, RoutedPropertyChangedEventArgs<object> e) {
TCTreeItem target = e.NewValue as TCTreeItem;
if(target == null) {
this.selectedObject = null;
}
else {
this.selectedObject = target.mo;
}
}
}
}