/// <summary> /// 判断该螺钉是否可以加到该螺钉组中,主要是判断螺钉与该螺钉组的方向向量是否相同,并且距离小于阈值距离; /// </summary> /// <param name="mrBoltArray"></param> /// <param name="mrBoltArrayGroup"></param> /// <returns></returns> private bool IsMrBoltArrayCanAddToMrBoltArrayGroup(CMrBoltArray mrBoltArray, CMrBoltArrayGroup mrBoltArrayGroup) { if (mrBoltArrayGroup.mrBoltArrayList.Count == 0) { return(true); } Vector boltDirectionNormal = mrBoltArray.mDirectionNormal; Vector groupDirectionNormal = mrBoltArrayGroup.mrBoltArrayList[0].mDirectionNormal; if (!CDimTools.GetInstance().IsTwoVectorParallel(boltDirectionNormal, groupDirectionNormal)) { return(false); } Point boltPoint = mrBoltArray.GetMinXMaxYPoint(); foreach (CMrBoltArray groupBoltArray in mrBoltArrayGroup.mrBoltArrayList) { Point groupBoltPoint = groupBoltArray.GetMinXMaxYPoint(); if (Math.Abs(boltPoint.Y - groupBoltPoint.Y) < CCommonPara.mDefaultTwoBoltArrayGap) { return(true); } } return(false); }
/// <summary> /// 获得主梁螺钉在X向的标注集; /// </summary> /// <returns></returns> private List <CMrDimSet> GetMainPartBoltDimSetX() { List <CMrDimSet> mrDimSetList = new List <CMrDimSet>(); //.主梁上剩下未标注的螺钉组; List <CMrBoltArray> lastMrBoltArrayList = new List <CMrBoltArray>(); //构建具有相同属性螺钉组的集合; List <CMrBoltArrayGroup> mrBoltArrayGroupList = new List <CMrBoltArrayGroup>(); //构建主梁中间剩下的螺钉组的链表; foreach (CMrBoltArray mrBoltArray in mMainBeam.GetBoltArrayList()) { if (mrBoltArray.mBoltArrayShapeType != MrBoltArrayShapeType.ARRAY) { continue; } if (!CDimTools.GetInstance().IsTwoVectorParallel(mrBoltArray.mNormal, new Vector(0, 0, 1))) { continue; } lastMrBoltArrayList.Add(mrBoltArray); } //构建剩下螺钉组的组合; int nCount = lastMrBoltArrayList.Count; //螺钉的唯一标识符与螺钉组集合的映射表; Dictionary <Identifier, CMrBoltArrayGroup> mapIdentifierToBoltArrayGroup = new Dictionary <Identifier, CMrBoltArrayGroup>(); for (int i = 0; i < nCount; i++) { CMrBoltArray firstBoltArray = lastMrBoltArrayList[i]; //如果该螺钉已经加到螺钉组的集合中则返回继续查找; if (mapIdentifierToBoltArrayGroup.ContainsKey(firstBoltArray.mBoltArrayInModel.Identifier)) { continue; } CMrBoltArrayGroup mrBoltArrayGroup = new CMrBoltArrayGroup(); mrBoltArrayGroup.AppendMrBoltArray(firstBoltArray); mrBoltArrayGroupList.Add(mrBoltArrayGroup); mapIdentifierToBoltArrayGroup.Add(firstBoltArray.mBoltArrayInModel.Identifier, mrBoltArrayGroup); for (int j = i + 1; j < nCount; j++) { CMrBoltArray secondBoltArray = lastMrBoltArrayList[j]; if (IsMrBoltArrayCanAddToMrBoltArrayGroup(secondBoltArray, mrBoltArrayGroup)) { mrBoltArrayGroup.AppendMrBoltArray(secondBoltArray); mapIdentifierToBoltArrayGroup.Add(secondBoltArray.mBoltArrayInModel.Identifier, mrBoltArrayGroup); } } } //根据组合好的螺钉组集合来进行标注; foreach (CMrBoltArrayGroup mrBoltArrayGroup in mrBoltArrayGroupList) { CMrDimSet yMrDimSet = new CMrDimSet(); foreach (CMrBoltArray mrBoltArray in mrBoltArrayGroup.mrBoltArrayList) { List <Point> minYPointList = mrBoltArray.GetMinYPointList(); yMrDimSet.AddRange(minYPointList); } yMrDimSet.AddPoint(new Point(0, yMrDimSet.GetDimPointList()[0].Y, 0)); //需要判断螺钉是否在柱子的底端或上端; double maxY = mrBoltArrayGroup.GetMaxYPoint().Y; double minY = mrBoltArrayGroup.GetMinYPoint().Y; double mainBeamMaxY = mMainBeam.GetMaxYPoint().Y; double mainBeamMinY = mMainBeam.GetMinYPoint().Y; if (Math.Abs(maxY - mainBeamMaxY) < CCommonPara.mDefaultDimDistanceThreshold) { yMrDimSet.mDimDistance = Math.Abs(yMrDimSet.GetDimPointList()[0].Y - CCommonPara.mViewMaxY) + CCommonPara.mDefaultDimDistance; yMrDimSet.mDimVector = new Vector(0, 1, 0); mrDimSetList.Add(yMrDimSet); } else if (Math.Abs(minY - mainBeamMinY) < CCommonPara.mDefaultDimDistanceThreshold) { yMrDimSet.mDimDistance = Math.Abs(yMrDimSet.GetDimPointList()[0].Y - CCommonPara.mViewMinY) + CCommonPara.mDefaultDimDistance; yMrDimSet.mDimVector = new Vector(0, -1, 0); mrDimSetList.Add(yMrDimSet); } else { yMrDimSet.mDimDistance = CCommonPara.mDefaultDimDistance; yMrDimSet.mDimVector = new Vector(0, -1, 0); mrDimSetList.Add(yMrDimSet); } } return(mrDimSetList); }