using PdmSwPlugin.Common.Entity.Pdm;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading;
namespace PdmSwPlugin.PDM.Model
{
public partial class PdmControlModel
{
/////
///// 多线程递归获取子BOM
/////
/////
//private static void GetChildrenBomAsync2(object param)
//{
// object[] objs = (object[])param;
// // 父BOM
// PdmBom parent = objs[0] as PdmBom;
// // 父Sw组件
// Component2 parentComponent = objs[1] as Component2;
// // BomInfo缓存
// Dictionary bomCache = objs[2] as Dictionary;
// // 层级
// int level = (int)objs[3];
// // 缓存列表
// List cacheList = objs[4] as List;
// // 父BOM的children
// Collection children = objs[5] as Collection;
// // 多线程计数器
// CountdownEvent counter = objs[6] as CountdownEvent;
// try
// {
// if (parentComponent == null)
// {
// parent.modules = new ObservableCollection();
// return;
// }
// object[] childrenComponents = parentComponent.GetChildren();
// if (childrenComponents == null)
// {
// parent.modules = new ObservableCollection();
// return;
// }
// // 计算每个子料数量的缓存
// Dictionary numCache = new Dictionary();
// List modules = new List();
// foreach (object child in childrenComponents)
// {
// Component2 childComponent = child as Component2;
// ModelDoc2 childDoc = childComponent.GetModelDoc2();
// string childPath = childComponent.GetPathName();
// PdmBom bom = null;
// if (bomCache.ContainsKey(childPath))
// {
// bom = bomCache[childPath].ShallowCopy();
// bom.level = level + 1;
// bom.parent = parent;
// // 就算有缓存,也要把新bom的treeId更新了,id在这里不一定唯一,tree是唯一的
// bom.treeId = Guid.NewGuid().ToString();
// }
// else
// {
// BomInfo info = GetBomInfoFromDoc(childComponent);
// if (info == null)
// {
// // 可能会返回null,说明这是个模拟件,直接跳过
// continue;
// }
// bom = ConcatCacheBom(info, level + 1, parent);
// if (!bom.lost)
// {
// // // 如果bom没有丢失,处理子料
// if (bom.drawingType == (int)swDocumentTypes_e.swDocASSEMBLY)
// {
// bom.children = new ObservableCollection();
// counter.TryAddCount();
// ThreadPool.QueueUserWorkItem(new WaitCallback(GetChildrenBomAsync2),
// new object[] {
// bom, childComponent, bomCache, bom.level, cacheList, bom.children, counter
// });
// }
// else
// {
// bom.modules = new ObservableCollection();
// }
// }
// bomCache[childPath] = bom;
// }
// // 列表缓存
// cacheList.Add(bom);
// modules.Add(bom);
// // 丢没丢都要处理数量
// if (numCache.ContainsKey(bom.name))
// {
// numCache[bom.name].quantity++;
// }
// else
// {
// numCache[bom.name] = bom;
// children.Add(bom);
// }
// }
// if (modules != null && modules.Count > 0)
// {
// parent.modules = new ObservableCollection(modules);// new ObservableCollection(modules.OrderBy(e => e.name).ToList());
// return;
// }
// parent.modules = new ObservableCollection();
// }
// finally
// {
// counter.Signal();
// if (level == 0) counter.Signal();
// }
//}
/////
///// 从一个 SolidWorks 的部件递归得到全部的子BOM
/////
///// 父BOM
///// 当前部件
///// 当前部件的名称
///// 层级,从 0 开始的
///// 装所有核价项的列表
//private static List GetChildrenBomDev2(PdmBom parent,
// Component2 parentComponent,
// Dictionary bomInfoCache,
// int level,
// List cacheList,
// Collection children)
//{
// if (parentComponent == null)
// {
// return null;
// }
// object[] childrenComponents = parentComponent.GetChildren();
// if (childrenComponents == null)
// {
// return null;
// }
// // 计算每个子料数量的缓存
// Dictionary numCache = new Dictionary();
// List modules = new List();
// foreach (object child in childrenComponents)
// {
// Component2 childComponent = child as Component2;
// ModelDoc2 childDoc = childComponent.GetModelDoc2();
// string childPath = childComponent.GetPathName();
// PdmBom bom = null;
// if (bomInfoCache.ContainsKey(childPath))
// {
// BomInfo info = bomInfoCache[childPath];
// bom = ConcatCacheBom(info, level + 1, parent);
// }
// else
// {
// BomInfo info = GetBomInfoFromDoc(childComponent);
// if (info == null)
// {
// // 可能会返回null,说明这是个模拟件,直接跳过
// continue;
// }
// bomInfoCache[childPath] = info;
// bom = ConcatCacheBom(info, level + 1, parent);
// }
// if (!bom.lost)
// {
// // // 如果bom没有丢失,处理子料
// if (bom.drawingType == (int)swDocumentTypes_e.swDocASSEMBLY)
// {
// bom.children = new ObservableCollection();
// bom.modules = new ObservableCollection(
// GetChildrenBomDev2(bom, childComponent, bomInfoCache, bom.level, cacheList, bom.children)
// );
// }
// else
// {
// bom.modules = null;
// }
// }
// // 列表缓存
// cacheList.Add(bom);
// modules.Add(bom);
// // 丢没丢都要处理数量
// if (numCache.ContainsKey(bom.name))
// {
// numCache[bom.name].quantity++;
// }
// else
// {
// numCache[bom.name] = bom;
// children.Add(bom);
// }
// }
// if (modules != null && modules.Count > 0)
// {
// return modules.OrderBy(e => e.name).ToList();
// }
// else { return modules; }
//}
/////
///// 从打开的文档中读取BOM信息
/////
///// 树型BOM列表
//public List GetBomsFromDocDev(ModelDoc2 sldDoc)
//{
// cacheList.Clear();
// List result = new List();
// if (sldDoc == null)
// {
// return result;
// }
// int drawingType = sldDoc.GetType();
// Configuration activeConfiguration = sldDoc.GetActiveConfiguration() as Configuration;
// if (activeConfiguration == null)
// {
// return result;
// }
// Component2 rootComponent = activeConfiguration.GetRootComponent3(false);
// string rootComponentName = rootComponent.Name2;
// if (drawingType != (int)swDocumentTypes_e.swDocASSEMBLY)
// {
// // 装配件才有子节点
// return result;
// }
// Dictionary bomInfoCache = new Dictionary();
// BomInfo bomInfo = GetBomInfoFromDoc(rootComponent);
// PdmBom bom = ConcatCacheBom(bomInfo, 0, null);
// /// ConcatBom 可能会返回null,说明这是个模拟件
// if (bom == null)
// {
// return result;
// }
// bomInfoCache[rootComponent.GetPathName()] = bomInfo;
// cacheList.Add(bom);
// result.Add(bom);
// bom.children = new ObservableCollection();
// bom.modules = new ObservableCollection
// (GetChildrenBomDev2(bom, rootComponent, bomInfoCache, 0, cacheList, bom.children));
// return result.OrderBy(e => e.name).ToList();
//}
}
}