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; //} } }