namespace PdmSwPlugin.PDM.Model
{
public partial class PdmControlModel
{
/////
///// 多线程从打开的根文档中读取BOM信息
/////
///// 树型BOM列表
//public List GetBomsFromDocAsync(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 path = rootComponent.GetPathName();
// 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();
// // 这里放个1,多线程说不准,就扣的快了
// CountdownEvent counter = new CountdownEvent(1);
// // counter.Add 要在每个子任务前执行,不能放到子任务中进行!!!
// // 防止任务数太少,来不及增加计数导致直接Wait结束
// counter.TryAddCount();
// Task.Factory.StartNew(() =>
// {
// GetChildrenBomAsync2(bom, rootComponent, bomInfoCache, 0, cacheList, bom.children, counter);
// });
// /*_ = ThreadPool.QueueUserWorkItem(
// new WaitCallback(GetChildrenBomAsync),
// new object[] {
// bom, rootComponent, bomInfoCache, 0, cacheList, bom.children, counter}
// );*/
// counter.Wait();
// counter.Dispose();
// return result.OrderBy(e => e.name).ToList();
//}
/////
///// 多线程递归获取子BOM
/////
/////
//private static void GetChildrenBomAsync(object param)
//{
// object[] objs = (object[])param;
// // 父BOM
// PdmBom parent = objs[0] as PdmBom;
// // 父Sw组件
// Component2 parentComponent = objs[1] as Component2;
// // BomInfo缓存
// Dictionary bomInfoCache = 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 (bomInfoCache.ContainsKey(childPath))
// {
// BomInfo info = bomInfoCache[childPath];
// bom = ConcatCacheBom(info, level + 1, parent);
// // 就算有缓存,也要把新bom的treeId更新了,id在这里不一定唯一,tree是唯一的
// bom.treeId = Guid.NewGuid().ToString();
// }
// 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();
// counter.TryAddCount();
// ThreadPool.QueueUserWorkItem(new WaitCallback(GetChildrenBomAsync),
// new object[] {
// bom, childComponent, bomInfoCache, bom.level, cacheList, bom.children, counter
// });
// }
// else
// {
// bom.modules = new ObservableCollection();
// }
// }
// // 列表缓存
// 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.OrderBy(e => e.name).ToList());
// return;
// }
// parent.modules = new ObservableCollection();
// }
// finally
// {
// counter.Signal();
// if (level == 0) counter.Signal();
// }
//}
/////
///// 拼接WEB中BomInfo信息和本地图纸中的Pdmbom信息
/////
/////
/////
/////
/////
//private static PdmBom ConcatCacheBom(BomInfo info, int level, PdmBom parent)
//{
// PdmBom bom = new PdmBom
// {
// BomInfo = info,
// treeId = info.id,
// level = level,
// quantity = 1,
// parent = parent,
// };
// // 封装Bom信息
// bom.Init();
// return bom;
//}
}
}