/// <summary> /// 获取法向与Y轴平行的单独进行标注的零部件的标注集合; /// </summary> /// <returns></returns> private CMrDimSet GetYNormalMiddlePartDimSet() { CMrDimSet mrDimSet = new CMrDimSet(); List <CMrPart> yNormalAlonePartList = CMrCylinderDoorFrontManager.GetInstance().mYNormalMiddlePartList; foreach (CMrPart mrPart in yNormalAlonePartList) { if (!IsYNormalMiddlePartNeedDim(mrPart)) { continue; } mrDimSet.AddPoint(mrPart.GetMaxXMinYPoint()); } return(mrDimSet); }
/// <summary> /// 绘制檩托板的零件标记; /// </summary> private void DrawMrApronPlateMark() { DrawingHandler drawingHandler = new DrawingHandler(); TSD.UI.DrawingObjectSelector DS = drawingHandler.GetDrawingObjectSelector(); Dictionary <CMrPart, CMrApronPlate> mapPartToMrApronPlate = CMrCylinderDoorFrontManager.GetInstance().mMapYNormalPartToMrApronPlate; foreach (CMrApronPlate mrApronPlate in mapPartToMrApronPlate.Values) { CMrPart yNormalPart = mrApronPlate.mYNormalPart; CMrPart zNormalPart = mrApronPlate.mZNormalPart; DS.SelectObject(yNormalPart.mPartInDrawing); DS.SelectObject(zNormalPart.mPartInDrawing); } CDimTools.GetInstance().DrawMarkByMacro(); }
/// <summary> /// 判断法向与Y轴平行的主梁中间进行标注的零部件是否需要进行标注; /// </summary> /// <returns></returns> private bool IsYNormalMiddlePartNeedDim(CMrPart mrPart) { List <CMrPart> rightPartList = CMrCylinderDoorFrontManager.GetInstance().mRightDimPartList; int minY = (int)mrPart.GetMaxXMinYPoint().Y; int maxY = (int)mrPart.GetMaxXMaxYPoint().Y; string strY = minY.ToString() + "," + maxY.ToString(); foreach (CMrPart mrHaveDimPart in rightPartList) { minY = (int)mrHaveDimPart.GetMaxXMinYPoint().Y; maxY = (int)mrHaveDimPart.GetMaxXMaxYPoint().Y; string strNewY = minY.ToString() + "," + maxY.ToString(); if (strY.Equals(strNewY)) { return(false); } } return(true); }
/// <summary> /// 创建所有剖面; /// </summary> private void CreateAllPartSection() { double mainBeamMinX = CMrMainBeam.GetInstance().GetMinXPoint().X; double mainBeamMaxX = CMrMainBeam.GetInstance().GetMaxXPoint().X; double mainBeamMinY = CMrMainBeam.GetInstance().GetMinYPoint().Y; CMrPart leftTopPart = CMrCylinderDoorFrontManager.GetInstance().mLeftTopPart; CMrPart rightTopPart = CMrCylinderDoorFrontManager.GetInstance().mRightTopPart; bool bFlag = false; CDimTools.GetInstance().SortMrPartByMaxY(mAllSectionPartList); foreach (CMrPart mrPart in mAllSectionPartList) { double partMinX = mrPart.GetMinXPoint().X; double partMaxX = mrPart.GetMaxXPoint().X; double partMinY = mrPart.GetMinYPoint().Y; Vector normal = mrPart.mNormal; CMrSection mrSection = new CMrSection(MrSectionType.MrSectionCylinder); mrSection.AppendSectionPart(mrPart); if (mrPart == leftTopPart || mrPart == rightTopPart) { Point minXPt = mrPart.GetMinXPoint(); Point maxXpt = mrPart.GetMaxXPoint(); Point minYPt = mrPart.GetMinYPoint(); Point maxYpt = mrPart.GetMaxYPoint(); mrSection.mSectionMaxY = maxYpt.Y; mrSection.mSectionMinY = minYPt.Y; mrSection.mSectionMidX = minXPt.X; mrSection.mSectionMode = MrSectionMode.MrHorizontal; } else if (CDimTools.GetInstance().IsTwoVectorParallel(normal, new Vector(1, 0, 0))) { if (CDimTools.GetInstance().CompareTwoDoubleValue(partMaxX, mainBeamMinX) < 0 || CDimTools.GetInstance().CompareTwoDoubleValue(partMinX, mainBeamMaxX) > 0) { Point minXPt = mrPart.GetMinXPoint(); Point maxXpt = mrPart.GetMaxXPoint(); Point minYPt = mrPart.GetMinYPoint(); Point maxYpt = mrPart.GetMaxYPoint(); mrSection.mSectionMaxY = maxYpt.Y; mrSection.mSectionMinY = minYPt.Y; mrSection.mSectionMidX = (minXPt.X + maxXpt.X) / 2.0; mrSection.mSectionMode = MrSectionMode.MrHorizontal; } else if (CDimTools.GetInstance().CompareTwoDoubleValue(partMinX, mainBeamMinX) > 0 && CDimTools.GetInstance().CompareTwoDoubleValue(partMaxX, mainBeamMaxX) < 0 && CDimTools.GetInstance().CompareTwoDoubleValue(partMinY, mainBeamMinY) > 0) { Point minXPt = mrPart.GetMinXPoint(); Point maxXpt = mrPart.GetMaxXPoint(); Point minYPt = mrPart.GetMinYPoint(); Point maxYpt = mrPart.GetMaxYPoint(); mrSection.mSectionMidX = (minXPt.X + maxXpt.X) / 2.0; mrSection.mSectionMidY = maxYpt.Y; mrSection.mSectionMode = MrSectionMode.MrVertical; } } else if (CDimTools.GetInstance().IsTwoVectorParallel(normal, new Vector(0, 1, 0))) { if (CDimTools.GetInstance().CompareTwoDoubleValue(partMaxX, mainBeamMinX) < 0 || CDimTools.GetInstance().CompareTwoDoubleValue(partMinX, mainBeamMaxX) > 0) { Point minYPt = mrPart.GetMinYPoint(); Point maxYpt = mrPart.GetMaxYPoint(); mrSection.mSectionMidY = (minYPt.Y + maxYpt.Y) / 2.0; mrSection.mSectionMode = MrSectionMode.MrVertical; } if (CDimTools.GetInstance().CompareTwoDoubleValue(partMinX, mainBeamMinX) < 0 && CDimTools.GetInstance().CompareTwoDoubleValue(partMaxX, mainBeamMaxX) > 0) { Point minYPt = mrPart.GetMinYPoint(); Point maxYpt = mrPart.GetMaxYPoint(); mrSection.mSectionMidY = (minYPt.Y + maxYpt.Y) / 2.0; mrSection.mSectionMode = MrSectionMode.MrVertical; } if (CDimTools.GetInstance().CompareTwoDoubleValue(partMinX, mainBeamMinX) > 0 && CDimTools.GetInstance().CompareTwoDoubleValue(partMaxX, mainBeamMaxX) < 0) { CMrApronPlate mrApronPlate = CMrCylinderDoorFrontManager.GetInstance().FindMrApronPlate2ByYNormalPart(mrPart); //梁中间的檩托板只剖一次; if (mrApronPlate != null && bFlag == false) { Point minYPt = mrPart.GetMinYPoint(); Point maxYpt = mrPart.GetMaxYPoint(); mrSection.mSectionMidY = (minYPt.Y + maxYpt.Y) / 2.0; mrSection.mSectionMode = MrSectionMode.MrVertical; bFlag = true; } } } //1.如果零部件已经存在于剖面中则直接返回; if (IsPartInSection(mrPart, mrSection.mSectionMode)) { continue; } if (mrSection.mSectionMode == MrSectionMode.None) { continue; } //2.把所有属于该剖面的零部件加入; AddPartInSection(mrSection); mSectionList.Add(mrSection); if (mrSection.mSectionMode == MrSectionMode.MrHorizontal) { CreateHorizontalSection(mrSection); } if (mrSection.mSectionMode == MrSectionMode.MrVertical) { CreateVerticalSection(mrSection); } } }
/// <summary> /// 构建需要进行剖视的零部件; /// </summary> private void BuildNeedSectionPartList() { CMrPart mainBeam = CMrMainBeam.GetInstance(); double mainBeamMinY = mainBeam.GetMinYPoint().Y; double mainBeamMaxY = mainBeam.GetMaxYPoint().Y; double mainBeamMinX = mainBeam.GetMinXPoint().X; double mainBeamMaxX = mainBeam.GetMaxXPoint().X; CMrPart leftPart = CMrCylinderDoorFrontManager.GetInstance().mLeftPart; CMrPart leftMiddlePart = CMrCylinderDoorFrontManager.GetInstance().mLeftTopMiddlePart; CMrPart leftTopPart = CMrCylinderDoorFrontManager.GetInstance().mLeftTopPart; CMrPart rightPart = CMrCylinderDoorFrontManager.GetInstance().mRightPart; CMrPart rightMiddlePart = CMrCylinderDoorFrontManager.GetInstance().mRightTopMiddlePart; CMrPart rightTopPart = CMrCylinderDoorFrontManager.GetInstance().mRightTopPart; mrPartList.Remove(leftPart); mrPartList.Remove(leftMiddlePart); mrPartList.Remove(rightPart); mrPartList.Remove(rightMiddlePart); foreach (CMrPart mrPart in mrPartList) { double partMinX = mrPart.GetMinXPoint().X; double partMaxX = mrPart.GetMaxXPoint().X; double partMaxY = mrPart.GetMaxYPoint().Y; double partMinY = mrPart.GetMinYPoint().Y; if (!mrPart.IsHaveBolt()) { continue; } Vector normal = mrPart.mNormal; //如果法向量与X轴平行; if (CDimTools.GetInstance().IsTwoVectorParallel(normal, new Vector(1, 0, 0))) { if (mrPart == leftTopPart || mrPart == rightTopPart) { mAllSectionPartList.Add(mrPart); } //1.如果竖直的板在柱子中间; if (CDimTools.GetInstance().CompareTwoDoubleValue(partMinX, mainBeamMinX) > 0 && CDimTools.GetInstance().CompareTwoDoubleValue(partMaxX, mainBeamMaxX) < 0) { mAllSectionPartList.Add(mrPart); } //2.如果竖直的板在主梁侧板的外侧; if (leftPart != null && CDimTools.GetInstance().CompareTwoDoubleValue(partMaxX, leftPart.GetMinXPoint().X) < 0) { mAllSectionPartList.Add(mrPart); } if (rightPart != null && CDimTools.GetInstance().CompareTwoDoubleValue(partMinX, rightPart.GetMaxXPoint().X) > 0) { mAllSectionPartList.Add(mrPart); } } //如果法向量与Y轴平行; else if (CDimTools.GetInstance().IsTwoVectorParallel(normal, new Vector(0, 1, 0))) { //如果是檩托板中的零部件则返回; if (CMrCylinderDoorFrontManager.GetInstance().FindMrApronPlateByYNormalPart(mrPart) != null) { continue; } //如果是底板; if (CDimTools.GetInstance().CompareTwoDoubleValue(mainBeamMinY, partMaxY) == 0) { mAllSectionPartList.Add(mrPart); } //如果是顶板; if (CDimTools.GetInstance().CompareTwoDoubleValue(mainBeamMaxY, partMinY) == 0) { mAllSectionPartList.Add(mrPart); } if (CDimTools.GetInstance().CompareTwoDoubleValue(partMinX, mainBeamMaxX) > 0 || CDimTools.GetInstance().CompareTwoDoubleValue(partMaxX, mainBeamMinX) < 0) { mAllSectionPartList.Add(mrPart); } if (CDimTools.GetInstance().CompareTwoDoubleValue(partMinX, mainBeamMinX) > 0 || CDimTools.GetInstance().CompareTwoDoubleValue(partMaxX, mainBeamMaxX) < 0) { mAllSectionPartList.Add(mrPart); } } } //1.把类型1中檩托板的任意一块板加进来; CMrApronPlate mrApronPlate = CMrCylinderDoorFrontManager.GetInstance().GetFirstMrApronPlateType1(); if (mrApronPlate != null) { mAllSectionPartList.Add(mrApronPlate.mYNormalPart); } }
/// <summary> /// 绘制主梁上螺钉的标注,需要判断螺钉与主梁顶部的距离,如果距离超过一定的阈值只进行单独标注; /// </summary> private void DrawMainBeamBoltDim() { CMrPart mrLeftPart = CMrCylinderDoorFrontManager.GetInstance().mLeftPart; CMrPart mrRightPart = CMrCylinderDoorFrontManager.GetInstance().mRightPart; List <CMrBoltArray> mrBoltArrayList = mMainBeam.GetBoltArrayList(); foreach (CMrBoltArray mrBoltArray in mrBoltArrayList) { Vector normal = mrBoltArray.mNormal; if (!CDimTools.GetInstance().IsTwoVectorParallel(normal, new Vector(0, 0, 1))) { continue; } double distance = Math.Abs(mrBoltArray.GetMaxYPoint().Y - mMainBeam.GetMaxYPoint().Y); if (distance < 200) { //1.标注螺钉组的上侧标注; PointList pointList = new PointList(); foreach (Point point in mrBoltArray.GetMaxYPointList()) { pointList.Add(point); } pointList.Add(mrRightPart.GetMaxXMaxYPoint()); pointList.Add(mrLeftPart.GetMinXMaxYPoint()); double dimDistance = Math.Abs(mMainBeam.GetMaxYPoint().Y - pointList[0].Y) + CCommonPara.mDefaultDimDistance; Vector dimVector = new Vector(0, 1, 0); CDimTools.GetInstance().DrawDimensionSet(mViewBase, pointList, dimVector, dimDistance, CCommonPara.mSizeDimPath); } else { //1.标注螺钉组的上侧标注; PointList pointList = new PointList(); foreach (Point point in mrBoltArray.GetMaxYPointList()) { pointList.Add(point); } Point boltMaxYPt = mrBoltArray.GetMaxYPoint(); Vector leftPartNormal = mrLeftPart.mNormal; Vector rightPartNormal = mrRightPart.mNormal; if (CDimTools.GetInstance().IsTwoVectorParallel(leftPartNormal, new Vector(1, 0, 0))) { pointList.Add(new Point(mrLeftPart.GetMinXPoint().X, boltMaxYPt.Y, 0)); } if (CDimTools.GetInstance().IsTwoVectorParallel(rightPartNormal, new Vector(1, 0, 0))) { pointList.Add(new Point(mrRightPart.GetMaxXPoint().X, boltMaxYPt.Y, 0)); } if (pointList.Count >= 2) { double dimDistance = CCommonPara.mDefaultDimDistance; Vector dimVector = new Vector(0, 1, 0); CDimTools.GetInstance().DrawDimensionSet(mViewBase, pointList, dimVector, dimDistance, CCommonPara.mSizeDimPath); } } } }
/// <summary> /// 初始化函数; /// </summary> protected void Init() { if (mViewBase == null) { return; } //初始化视图的包围盒; CDimTools.GetInstance().InitViewBox(); //获取所有螺钉的数据字典; Dictionary <Identifier, TSD.Bolt> dicIdentifierBolt = CDimTools.GetInstance().GetAllBoltInDrawing(mViewBase); //获取所有Drawing视图中的Part; List <TSD.Part> partList = CDimTools.GetInstance().GetAllPartInDrawing(mViewBase); foreach (TSD.Part partInDrawing in partList) { //1.获取部件的信息; TSM.ModelObject modelObjectInModel = CDimTools.GetInstance().TransformDrawingToModel(partInDrawing); TSM.Part partInModel = modelObjectInModel as TSM.Part; CMrPart mrPart = null; if (CMrMainBeam.GetInstance().mPartInModel.Identifier.GUID == partInModel.Identifier.GUID) { mrPart = CMrMainBeam.GetInstance(); mMainBeam = CMrMainBeam.GetInstance(); mMainBeam.mPartInDrawing = partInDrawing; CDimTools.GetInstance().InitMrPart(modelObjectInModel, mViewBase, mrPart); AppendMrPart(mrPart); } else { mrPart = new CMrPart(partInModel, partInDrawing); CDimTools.GetInstance().InitMrPart(modelObjectInModel, mViewBase, mrPart); AppendMrPart(mrPart); } //2.获取部件中的所有螺钉组; List <BoltArray> boltArrayList = CDimTools.GetInstance().GetAllBoltArray(partInModel); foreach (BoltArray boltArray in boltArrayList) { TSD.Bolt boltInDrawing = dicIdentifierBolt[boltArray.Identifier]; CMrBoltArray mrBoltArray = new CMrBoltArray(boltArray, boltInDrawing); CDimTools.GetInstance().InitMrBoltArray(boltArray, mViewBase, mrBoltArray); mrPart.AppendMrBoltArray(mrBoltArray); } CDimTools.GetInstance().UpdateViewBox(mrPart); } //移除主柱子; mMrPartList.Remove(mMainBeam); //清空零件标记管理器中的零件标记; CMrMarkManager.GetInstance().Clear(); //构建柱标注的拓扑结构; CMrCylinderDoorFrontManager.GetInstance().BuildCylinderDoorFrontTopo(mMrPartList); }
/// <summary> /// 绘制主梁外侧法向与X轴平行的零件标注; /// </summary> private void DrawXNormalAlonePartDim() { List <CMrPart> xNormalAlonePartList = CMrCylinderDoorFrontManager.GetInstance().mXNormalAloneDimPartList; CMrPart leftPart = CMrCylinderDoorFrontManager.GetInstance().mLeftPart; CMrPart leftTopPart = CMrCylinderDoorFrontManager.GetInstance().mLeftTopPart; CMrPart leftTopMiddlePart = CMrCylinderDoorFrontManager.GetInstance().mLeftTopMiddlePart; CMrPart rightPart = CMrCylinderDoorFrontManager.GetInstance().mRightPart; CMrPart rightTopPart = CMrCylinderDoorFrontManager.GetInstance().mRightTopPart; CMrPart rightTopMiddlePart = CMrCylinderDoorFrontManager.GetInstance().mRightTopMiddlePart; double leftPartMinX = leftPart.GetMinXPoint().X; double rightPartMaxX = rightPart.GetMaxXPoint().X; foreach (CMrPart mrPart in xNormalAlonePartList) { double partMinX = mrPart.GetMinXPoint().X; double partMaxX = mrPart.GetMaxXPoint().X; if (partMinX < leftPartMinX) { PointList pointList = new PointList(); Point minXmaxYPoint = mrPart.GetMinXMaxYPoint(); pointList.Add(minXmaxYPoint); double dimDistance = CCommonPara.mDefaultDimDistance; Vector dimVector = new Vector(0, 1, 0); if (leftTopPart != null && leftTopPart.GetMinXMinYPoint().Y < minXmaxYPoint.Y) { pointList.Add(new Point(leftTopPart.GetMinXPoint().X, minXmaxYPoint.Y, 0)); } else if (leftTopMiddlePart != null && leftTopMiddlePart.GetMinXMinYPoint().Y < minXmaxYPoint.Y) { pointList.Add(new Point(leftTopMiddlePart.GetMinXPoint().X, minXmaxYPoint.Y, 0)); } else { pointList.Add(new Point(leftPartMinX, minXmaxYPoint.Y, 0)); } CDimTools.GetInstance().DrawDimensionSet(mViewBase, pointList, dimVector, dimDistance, CCommonPara.mSizeDimPath); } else if (partMaxX > rightPartMaxX) { PointList pointList = new PointList(); Point maxXmaxYPoint = mrPart.GetMaxXMaxYPoint(); pointList.Add(maxXmaxYPoint); double dimDistance = CCommonPara.mDefaultDimDistance; Vector dimVector = new Vector(0, 1, 0); if (rightTopPart != null && rightTopPart.GetMaxXMinYPoint().Y < maxXmaxYPoint.Y) { pointList.Add(new Point(rightTopPart.GetMaxXPoint().X, maxXmaxYPoint.Y, 0)); } else if (rightTopMiddlePart != null && rightTopMiddlePart.GetMaxXMinYPoint().Y < maxXmaxYPoint.Y) { pointList.Add(new Point(rightTopMiddlePart.GetMaxXPoint().X, maxXmaxYPoint.Y, 0)); } else { pointList.Add(new Point(rightPartMaxX, maxXmaxYPoint.Y, 0)); } CDimTools.GetInstance().DrawDimensionSet(mViewBase, pointList, dimVector, dimDistance, CCommonPara.mSizeDimPath); } } }
/// <summary> /// 获取顶部零件的标注集; /// </summary> /// <param name="nFlag">1:左侧,2:右侧</param> /// <returns></returns> private CMrDimSet GetTopPartDimSet(int nFlag) { CMrDimSet mrDimSet = new CMrDimSet(); CMrPart mrTopPart = CMrCylinderDoorFrontManager.GetInstance().mTopPart; CMrPart mrLeftTopPart = CMrCylinderDoorFrontManager.GetInstance().mLeftTopPart; CMrPart mrRightTopPart = CMrCylinderDoorFrontManager.GetInstance().mRightTopPart; //标注顶板右侧的情况; if (nFlag == 2) { //如果顶部零件为空,则把主梁最上面的点加入进去; if (mrTopPart == null) { mrDimSet.AddPoint(mMainBeam.GetMaxYMaxXPoint()); return(mrDimSet); } Vector normal = mrTopPart.mNormal; if (CDimTools.GetInstance().IsTwoVectorParallel(normal, new Vector(0, 1, 0))) { mrDimSet.AddPoint(mrTopPart.GetMaxXMaxYPoint()); mrDimSet.AddPoint(mrTopPart.GetMaxXMinYPoint()); } else { if (mrLeftTopPart != null && mrRightTopPart != null) { if (mrLeftTopPart.GetMaxYPoint().Y > mrRightTopPart.GetMaxYPoint().Y) { mrDimSet.AddPoint(mrLeftTopPart.GetMaxXMaxYPoint()); } else { mrDimSet.AddPoint(mrRightTopPart.GetMaxXMaxYPoint()); } } else if (mrLeftTopPart != null) { mrDimSet.AddPoint(mrLeftTopPart.GetMaxXMaxYPoint()); } else if (mrRightTopPart != null) { mrDimSet.AddPoint(mrRightTopPart.GetMinXMaxYPoint()); } } } //标注顶板左侧的情况; else if (nFlag == 1) { if (mrTopPart == null) { mrDimSet.AddPoint(mMainBeam.GetMaxYMinXPoint()); return(mrDimSet); } Vector normal = mrTopPart.mNormal; if (CDimTools.GetInstance().IsTwoVectorParallel(normal, new Vector(0, 1, 0))) { mrDimSet.AddPoint(mrTopPart.GetMinXMaxYPoint()); mrDimSet.AddPoint(mrTopPart.GetMinXMinYPoint()); } else { if (mrLeftTopPart != null && mrRightTopPart != null) { if (mrLeftTopPart.GetMaxYPoint().Y > mrRightTopPart.GetMaxYPoint().Y) { mrDimSet.AddPoint(mrLeftTopPart.GetMaxXMaxYPoint()); } else { mrDimSet.AddPoint(mrRightTopPart.GetMinXMaxYPoint()); } } else if (mrLeftTopPart != null) { mrDimSet.AddPoint(mrLeftTopPart.GetMaxXMaxYPoint()); } else if (mrRightTopPart != null) { mrDimSet.AddPoint(mrRightTopPart.GetMinXMaxYPoint()); } } } return(mrDimSet); }