/// <summary> /// 获取顶视图上方的标注集合; /// </summary> /// <returns></returns> public CMrDimSet GetXUpDimSetNormal() { if (!IsNeedXUpDimNormal()) { return(null); } CMrDimSet mrDimSet = new CMrDimSet(); CMrPart topBeam = CMrBeamDoorManager.GetInstance().mTopBeam; Vector normal = mMrPart.mNormal; Vector topBeamNormal = topBeam.mNormal; Point leftTopPoint = topBeam.mLeftTopPoint; Point rightTopPoint = topBeam.mRightTopPoint; MrSlopeType slopeType = CDimTools.GetInstance().JudgeLineSlope(leftTopPoint, rightTopPoint); if (slopeType == MrSlopeType.MORETHAN_ZERO) { if (CDimTools.GetInstance().IsTwoVectorParallel(normal, new Vector(1, 0, 0))) { mrDimSet.AddPoint(mMrPart.GetMaxXMaxYPoint()); } else { mrDimSet.AddPoint(mMrPart.mRightTopPoint); } } else if (slopeType == MrSlopeType.LESSTHAN_ZERO) { if (CDimTools.GetInstance().IsTwoVectorParallel(normal, new Vector(1, 0, 0))) { mrDimSet.AddPoint(mMrPart.GetMinXMaxYPoint()); } else { mrDimSet.AddPoint(mMrPart.mLeftTopPoint); } } else { mrDimSet.AddPoint(mMrPart.mLeftTopPoint); } return(mrDimSet); }
/// <summary> /// 获得零件左侧的标注,主要是底部和顶部的零部件; /// </summary> /// <returns></returns> public CMrDimSet GetYLeftPartDim() { CMrDimSet mrDimSet = new CMrDimSet(); CMrPart yNormalBottomPart = CMrCylinderDoorTopManager.GetInstance().mYNormalBottomPart; CMrPart yNormalTopPart = CMrCylinderDoorTopManager.GetInstance().mTopPart; if (mMrPart == yNormalBottomPart) { mrDimSet.AddPoint(mMrPart.GetMinXMinYPoint()); mrDimSet.AddPoint(mMrPart.GetMinXMaxYPoint()); } if (mMrPart == yNormalTopPart) { mrDimSet.AddPoint(mMrPart.GetMinXMinYPoint()); mrDimSet.AddPoint(mMrPart.GetMinXMaxYPoint()); } return(mrDimSet); }
/// <summary> /// 计算上翼板的参数; /// </summary> public void ComputeTypeMiddleParas() { Vector topNormal = mTopBeam.mNormal; MrSlopeType mrSlopeType = CDimTools.GetInstance().JudgeLineSlope(new Point(0, 0, 0), topNormal); Point minXmaxYPt = mTopBeam.GetMinXMaxYPoint(); Point maxXmaxYPt = mTopBeam.GetMaxXMaxYPoint(); if (Math.Abs(minXmaxYPt.Y - maxXmaxYPt.Y) > 10) { mMidMaxPoint = new Point((minXmaxYPt.X + maxXmaxYPt.X) / 2.0, (minXmaxYPt.Y + maxXmaxYPt.Y) / 2.0, 0); mType = MrBeamDoorType.TypeMiddle3; } else if (mrSlopeType == MrSlopeType.LESSTHAN_ZERO) { //1.计算出中心Y值最大的点; mMidMaxPoint = mTopBeam.GetMaxYPoint(); mType = MrBeamDoorType.TypeMiddle1; } else if (mrSlopeType == MrSlopeType.MORETHAN_ZERO) { mMidMaxPoint = mTopBeam.GetMinYPoint(); mType = MrBeamDoorType.TypeMiddle2; } //2.计算出左上角和左下角的点; List <Point> pointList = mTopBeam.GetPointList(); List <Point> newPointList = new List <Point>(); foreach (Point point in pointList) { if (point.X < mMidMaxPoint.X) { newPointList.Add(point); } } Point minY = CDimTools.GetInstance().GetMinYPoint(newPointList); Point maxY = CDimTools.GetInstance().GetMaxYPoint(newPointList); mTopBeam.mLeftBottomPoint = minY; mTopBeam.mLeftTopPoint = maxY; newPointList.Clear(); //3.计算右上角和右下角的点; foreach (Point point in pointList) { if (point.X > mMidMaxPoint.X) { newPointList.Add(point); } } maxY = CDimTools.GetInstance().GetMaxYPoint(newPointList); minY = CDimTools.GetInstance().GetMinYPoint(newPointList); mTopBeam.mRightTopPoint = maxY; mTopBeam.mRightBottomPoint = minY; //4.计算左右两边的法向; Vector normal = mTopBeam.mNormal; if (mType == MrBeamDoorType.TypeMiddle1) { mLeftTopVector = new Vector(-Math.Abs(normal.X), Math.Abs(normal.Y), 0); mRightTopVector = new Vector(Math.Abs(normal.X), Math.Abs(normal.Y), 0); } else if (mType == MrBeamDoorType.TypeMiddle2) { mLeftTopVector = new Vector(Math.Abs(normal.X), Math.Abs(normal.Y), 0); mRightTopVector = new Vector(-Math.Abs(normal.X), Math.Abs(normal.Y), 0); } else if (mType == MrBeamDoorType.TypeMiddle3) { mLeftTopVector = normal; mRightTopVector = normal; } }
/// <summary> /// 更新上部板和下部板的四个角点; /// </summary> public void UpdatePartBoxPoint(CMrPart mrPart) { Point minX = mrPart.GetMinXPoint(); Point maxX = mrPart.GetMaxXPoint(); Point minY = mrPart.GetMinYPoint(); Point maxY = mrPart.GetMaxYPoint(); Point minXmaxY = mrPart.GetMinXMaxYPoint(); Point minXminY = mrPart.GetMinXMinYPoint(); Point maxXmaxY = mrPart.GetMaxXMaxYPoint(); Point maxXminY = mrPart.GetMaxXMinYPoint(); MrSlopeType mrYSlopeType = CDimTools.GetInstance().JudgeLineSlope(maxY, minY); //1.如果斜率小于零; if (mrYSlopeType == MrSlopeType.LESSTHAN_ZERO) { if (CDimTools.GetInstance().CompareTwoDoubleValue(minXmaxY.X, minXminY.X) == 0 && CDimTools.GetInstance().CompareTwoDoubleValue(minXmaxY.Y, minXminY.Y) != 0) { mrPart.mLeftBottomPoint = minXminY; mrPart.mLeftTopPoint = minXmaxY; if (CDimTools.GetInstance().CompareTwoDoubleValue(maxXmaxY.X, maxXminY.X) == 0 && CDimTools.GetInstance().CompareTwoDoubleValue(maxXmaxY.Y, maxXminY.Y) != 0) { mrPart.mRightTopPoint = maxXmaxY; mrPart.mRightBottomPoint = maxXminY; } else { mrPart.mRightTopPoint = maxX; mrPart.mRightBottomPoint = minY; } } else { mrPart.mLeftBottomPoint = minX; mrPart.mLeftTopPoint = maxY; if (CDimTools.GetInstance().CompareTwoDoubleValue(maxXmaxY.X, maxXminY.X) == 0 && CDimTools.GetInstance().CompareTwoDoubleValue(maxXmaxY.Y, maxXminY.Y) != 0) { mrPart.mRightTopPoint = maxXmaxY; mrPart.mRightBottomPoint = maxXminY; } else { mrPart.mRightTopPoint = maxX; mrPart.mRightBottomPoint = minY; } } } //2.如果斜率大于零; else if (mrYSlopeType == MrSlopeType.MORETHAN_ZERO) { if (CDimTools.GetInstance().CompareTwoDoubleValue(minXmaxY.X, minXminY.X) == 0 && CDimTools.GetInstance().CompareTwoDoubleValue(minXmaxY.Y, minXminY.Y) != 0) { mrPart.mLeftBottomPoint = minXminY; mrPart.mLeftTopPoint = minXmaxY; if (CDimTools.GetInstance().CompareTwoDoubleValue(maxXmaxY.X, maxXminY.X) == 0 && CDimTools.GetInstance().CompareTwoDoubleValue(maxXmaxY.Y, maxXminY.Y) != 0) { mrPart.mRightTopPoint = maxXmaxY; mrPart.mRightBottomPoint = maxXminY; } else { mrPart.mRightTopPoint = maxY; mrPart.mRightBottomPoint = maxX; } } else { mrPart.mLeftBottomPoint = minY; mrPart.mLeftTopPoint = minX; if (CDimTools.GetInstance().CompareTwoDoubleValue(maxXmaxY.X, maxXminY.X) == 0 && CDimTools.GetInstance().CompareTwoDoubleValue(maxXmaxY.Y, maxXminY.Y) != 0) { mrPart.mRightTopPoint = maxXmaxY; mrPart.mRightBottomPoint = maxXminY; } else { mrPart.mRightTopPoint = maxY; mrPart.mRightBottomPoint = maxX; } } } //3.如果斜率为无穷; else if (mrYSlopeType == MrSlopeType.INFINITY) { mrPart.mLeftBottomPoint = mrPart.GetMinXMinYPoint(); mrPart.mLeftTopPoint = mrPart.GetMinXMaxYPoint(); mrPart.mRightTopPoint = mrPart.GetMaxXMaxYPoint(); mrPart.mRightBottomPoint = mrPart.GetMaxXMinYPoint(); } }
/// <summary> /// 获取主梁左侧的标注集合; /// </summary> /// <returns></returns> public CMrDimSet GetYPartMainLeftDimSet() { CMrDimSet mrDimSet = new CMrDimSet(); Vector xVector = new Vector(1, 0, 0); Vector yVector = new Vector(0, 1, 0); Vector zVector = new Vector(0, 0, 1); double mainBeamMinX = CMrMainBeam.GetInstance().GetMinXPoint().X; double mainBeamMaxX = CMrMainBeam.GetInstance().GetMaxXPoint().X; double partMinX = mMrPart.GetMinXPoint().X; double partMaxX = mMrPart.GetMaxXPoint().X; CMrPart mrLeftPart = CMrCylinderDoorFrontManager.GetInstance().mLeftPart; CMrPart mrLeftTopPart = CMrCylinderDoorFrontManager.GetInstance().mLeftTopPart; CMrPart mrLeftTopMiddlePart = CMrCylinderDoorFrontManager.GetInstance().mLeftTopMiddlePart; CMrPart mrZNormalBottomPart = CMrCylinderDoorFrontManager.GetInstance().mZNormalBottomPart; CMrPart mrYNormalBottomPart = CMrCylinderDoorFrontManager.GetInstance().mYNormalBottomPart; CMrPart mrTopPart = CMrCylinderDoorFrontManager.GetInstance().mTopPart; CMrPart mrRightPart = CMrCylinderDoorFrontManager.GetInstance().mRightPart; Vector normal = mMrPart.mNormal; //1.如果是左下侧法向与z轴平行的零部件; if (mMrPart == mrZNormalBottomPart) { mrDimSet.AddPoint(mMrPart.GetMinXMinYPoint()); return(mrDimSet); } //2.如果是左侧上方的零部件; if (mMrPart == mrLeftTopPart) { if (CDimTools.GetInstance().CompareTwoDoubleValue(partMinX, mainBeamMinX) > 0) { return(null); } else { mrDimSet.AddPoint(mMrPart.GetMinXMinYPoint()); return(mrDimSet); } } //3.如果是左上侧上方中间的零部件; if (mMrPart == mrLeftTopMiddlePart) { mrDimSet.AddPoint(mMrPart.GetMinXMaxYPoint()); return(mrDimSet); } //4.如果是下侧法向与Y轴平行的零部件; if (mMrPart == mrYNormalBottomPart) { mrDimSet.AddPoint(mrYNormalBottomPart.GetMinXMaxYPoint()); mrDimSet.AddPoint(mrYNormalBottomPart.GetMinXMinYPoint()); return(mrDimSet); } //5.如果是上侧的零部件; if (mMrPart == mrTopPart) { //如果上侧零件的法向与Y轴平行; if (CDimTools.GetInstance().IsTwoVectorParallel(normal, yVector)) { mrDimSet.AddPoint(mrTopPart.GetMinXMaxYPoint()); mrDimSet.AddPoint(mrTopPart.GetMinXMinYPoint()); return(mrDimSet); } //如果法向不与Y轴平行; else if (CDimTools.GetInstance().IsVectorInXYPlane(normal)) { Point maxYPoint = mMrPart.GetMaxYPoint(); Point minYPoint = mMrPart.GetMinYPoint(); MrSlopeType mrSlopeType = CDimTools.GetInstance().JudgeLineSlope(minYPoint, maxYPoint); if (mrSlopeType == MrSlopeType.MORETHAN_ZERO) { mrDimSet.AddPoint(mMrPart.GetMaxYPoint()); mrDimSet.AddPoint(mMrPart.GetMinXPoint()); return(mrDimSet); } } } double leftMinX = mrLeftPart.GetMinXPoint().X; //6.如果向量与X轴平行,并且该零部件贴在左侧板上; if (CDimTools.GetInstance().IsTwoVectorParallel(normal, xVector)) { //A:如果左上侧零部件不为空; if (mrLeftTopPart != null && mrLeftTopPart.GetMinXMinYPoint().Y < mMrPart.GetMaxYPoint().Y) { double leftTopMinX = mrLeftTopPart.GetMinXPoint().X; if (Math.Abs(partMaxX - leftTopMinX) < CCommonPara.mDblError) { mrDimSet.AddPoint(mMrPart.GetMinXMinYPoint()); return(mrDimSet); } else if (partMaxX < leftTopMinX) { CMrCylinderDoorFrontManager.GetInstance().AppendXNormalAloneDimPart(mMrPart); } } //B:如果左上侧中间零件不为空; if (mrLeftTopMiddlePart != null && mrLeftTopMiddlePart.GetMinXMinYPoint().Y < mMrPart.GetMaxYPoint().Y) { double leftTopMiddleMinX = mrLeftTopMiddlePart.GetMinXPoint().X; if (Math.Abs(partMaxX - leftTopMiddleMinX) < CCommonPara.mDblError) { mrDimSet.AddPoint(mMrPart.GetMinXMinYPoint()); return(mrDimSet); } else if (partMaxX < leftTopMiddleMinX) { CMrCylinderDoorFrontManager.GetInstance().AppendXNormalAloneDimPart(mMrPart); } } else { if (Math.Abs(partMaxX - leftMinX) < CCommonPara.mDblError) { mrDimSet.AddPoint(mMrPart.GetMinXMinYPoint()); return(mrDimSet); } else if (partMaxX < leftMinX) { CMrCylinderDoorFrontManager.GetInstance().AppendXNormalAloneDimPart(mMrPart); } } } //7.如果向量与Y轴平行; else if (CDimTools.GetInstance().IsTwoVectorParallel(normal, yVector)) { if (CDimTools.GetInstance().CompareTwoDoubleValue(partMinX, leftMinX) < 0 && CDimTools.GetInstance().CompareTwoDoubleValue(partMaxX, leftMinX) >= 0) { CMrApronPlate mrApronPlate = CMrCylinderDoorFrontManager.GetInstance().FindMrApronPlateByYNormalPart(mMrPart); if (mrApronPlate != null) { if (mrApronPlate.mIsUp == true) { mrDimSet.AddPoint(mMrPart.GetMaxXMinYPoint()); } else { mrDimSet.AddPoint(mMrPart.GetMinXMaxYPoint()); } } else { mrDimSet.AddPoint(mMrPart.GetMinXMaxYPoint()); } } } return(mrDimSet); }