namespace PdmSwPlugin.PDM.Model
|
{
|
public partial class PdmControlModel
|
{
|
///// <summary>
|
///// 多线程从打开的根文档中读取BOM信息
|
///// </summary>
|
///// <returns>树型BOM列表</returns>
|
//public List<PdmBom> GetBomsFromDocAsync(ModelDoc2 sldDoc)
|
//{
|
// cacheList.Clear();
|
// List<PdmBom> result = new List<PdmBom>();
|
|
// 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<string, BomInfo> bomInfoCache = new Dictionary<string, BomInfo>();
|
// 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<PdmBom>();
|
// // 这里放个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();
|
//}
|
|
///// <summary>
|
///// 多线程递归获取子BOM
|
///// </summary>
|
///// <param name="param"></param>
|
//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<string, BomInfo> bomInfoCache = objs[2] as Dictionary<string, BomInfo>;
|
// // 忘了- -
|
// int level = (int)objs[3];
|
// // 缓存列表
|
// List<PdmBom> cacheList = objs[4] as List<PdmBom>;
|
// // 父BOM的children
|
// Collection<PdmBom> children = objs[5] as Collection<PdmBom>;
|
// // 多线程计数器
|
// CountdownEvent counter = objs[6] as CountdownEvent;
|
|
// try
|
// {
|
// if (parentComponent == null)
|
// {
|
// parent.modules = new ObservableCollection<PdmBom>();
|
// return;
|
// }
|
|
// object[] childrenComponents = parentComponent.GetChildren();
|
// if (childrenComponents == null)
|
// {
|
// parent.modules = new ObservableCollection<PdmBom>();
|
// return;
|
// }
|
|
// // 计算每个子料数量的缓存
|
// Dictionary<string, PdmBom> numCache = new Dictionary<string, PdmBom>();
|
// List<PdmBom> modules = new List<PdmBom>();
|
|
// 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<PdmBom>();
|
// counter.TryAddCount();
|
// ThreadPool.QueueUserWorkItem(new WaitCallback(GetChildrenBomAsync),
|
// new object[] {
|
// bom, childComponent, bomInfoCache, bom.level, cacheList, bom.children, counter
|
// });
|
// }
|
// else
|
// {
|
// bom.modules = new ObservableCollection<PdmBom>();
|
// }
|
// }
|
// // 列表缓存
|
// 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<PdmBom>(modules.OrderBy(e => e.name).ToList());
|
// return;
|
// }
|
// parent.modules = new ObservableCollection<PdmBom>();
|
// }
|
// finally
|
// {
|
// counter.Signal();
|
// if (level == 0) counter.Signal();
|
// }
|
//}
|
|
|
|
///// <summary>
|
///// 拼接WEB中BomInfo信息和本地图纸中的Pdmbom信息
|
///// </summary>
|
///// <param name="info"></param>
|
///// <param name="level"></param>
|
///// <param name="parent"></param>
|
///// <returns></returns>
|
//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;
|
//}
|
}
|
}
|