/// <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 GetYRightPartDim() { CMrDimSet mrDimSet = new CMrDimSet(); CMrPart yNormalBottomPart = CMrCylinderDoorTopManager.GetInstance().mYNormalBottomPart; CMrPart yNormalTopPart = CMrCylinderDoorTopManager.GetInstance().mTopPart; if (mMrPart == yNormalBottomPart) { mrDimSet.AddPoint(mMrPart.GetMaxXMinYPoint()); mrDimSet.AddPoint(mMrPart.GetMaxXMaxYPoint()); } if (mMrPart == yNormalTopPart) { mrDimSet.AddPoint(mMrPart.GetMaxXMinYPoint()); mrDimSet.AddPoint(mMrPart.GetMaxXMaxYPoint()); } 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 GetYPartMainRightDimSet() { 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; if (partMaxX < CCommonPara.mDblError) { return(null); } CMrPart mrRightPart = CMrCylinderDoorFrontManager.GetInstance().mRightPart; CMrPart mrRightTopPart = CMrCylinderDoorFrontManager.GetInstance().mRightTopPart; CMrPart mrRightTopMiddlePart = CMrCylinderDoorFrontManager.GetInstance().mRightTopMiddlePart; CMrPart mrTopPart = CMrCylinderDoorFrontManager.GetInstance().mTopPart; CMrPart mrZNormalBottomPart = CMrCylinderDoorFrontManager.GetInstance().mZNormalBottomPart; CMrPart mrYNormalBottomPart = CMrCylinderDoorFrontManager.GetInstance().mYNormalBottomPart; Vector normal = mMrPart.mNormal; //1.如果是左下侧法向与z轴平行的零部件; if (mMrPart == mrZNormalBottomPart) { mrDimSet.AddPoint(mMrPart.GetMaxXMinYPoint()); return(mrDimSet); } //2.如果是右上侧的零部件; if (mMrPart == mrRightTopPart) { if (CDimTools.GetInstance().CompareTwoDoubleValue(partMaxX, mainBeamMaxX) < 0) { return(null); } else { mrDimSet.AddPoint(mMrPart.GetMaxXMinYPoint()); return(mrDimSet); } } //3.如果是右上侧中间的零部件; if (mMrPart == mrRightTopMiddlePart) { mrDimSet.AddPoint(mMrPart.GetMaxXMaxYPoint()); return(mrDimSet); } //4.如果是下侧法向与Y轴平行的零部件; if (mMrPart == mrYNormalBottomPart) { mrDimSet.AddPoint(mrYNormalBottomPart.GetMaxXMaxYPoint()); mrDimSet.AddPoint(mrYNormalBottomPart.GetMaxXMinYPoint()); return(mrDimSet); } //5.如果是上侧的零部件; if (mMrPart == mrTopPart) { //A.如果上侧零件的法向与Y轴平行; if (CDimTools.GetInstance().IsTwoVectorParallel(normal, yVector)) { mrDimSet.AddPoint(mrTopPart.GetMaxXMaxYPoint()); mrDimSet.AddPoint(mrTopPart.GetMaxXMinYPoint()); return(mrDimSet); } //B.如果法向不与Y轴平行; else if (CDimTools.GetInstance().IsVectorInXYPlane(normal)) { Point minYPoint = mMrPart.GetMinYPoint(); Point maxYPoint = mMrPart.GetMaxYPoint(); MrSlopeType mrSlopeType = CDimTools.GetInstance().JudgeLineSlope(minYPoint, maxYPoint); if (mrSlopeType == MrSlopeType.LESSTHAN_ZERO) { mrDimSet.AddPoint(mMrPart.GetMaxYPoint()); mrDimSet.AddPoint(mMrPart.GetMaxXPoint()); return(mrDimSet); } } } //6.如果向量与X轴平行,并且该零部件贴在右侧板上或右上侧板上的; if (CDimTools.GetInstance().IsTwoVectorParallel(normal, xVector)) { //A.如果右上侧的零件不为空,并且该零件的左侧就是右上侧的板; if (mrRightTopPart != null && mrRightTopPart.GetMaxXMinYPoint().Y < mMrPart.GetMaxYPoint().Y) { double rightTopMaxX = mrRightTopPart.GetMaxXPoint().X; if (Math.Abs(partMinX - rightTopMaxX) < CCommonPara.mDblError) { mrDimSet.AddPoint(mMrPart.GetMaxXMinYPoint()); CMrCylinderDoorFrontManager.GetInstance().AppendRightDimPart(mMrPart); return(mrDimSet); } else if (partMinX > rightTopMaxX) { CMrCylinderDoorFrontManager.GetInstance().AppendXNormalAloneDimPart(mMrPart); } } //B.如果右上侧中间的零件不为空,并且该零件的左侧就是右上侧中间的板; if (mrRightTopMiddlePart != null && mrRightTopMiddlePart.GetMaxXMinYPoint().Y < mMrPart.GetMaxYPoint().Y) { double rightTopMiddleMaxX = mrRightTopMiddlePart.GetMaxXPoint().X; if (Math.Abs(partMinX - rightTopMiddleMaxX) < CCommonPara.mDblError) { mrDimSet.AddPoint(mMrPart.GetMaxXMinYPoint()); CMrCylinderDoorFrontManager.GetInstance().AppendRightDimPart(mMrPart); return(mrDimSet); } else if (partMinX > rightTopMiddleMaxX) { CMrCylinderDoorFrontManager.GetInstance().AppendXNormalAloneDimPart(mMrPart); } } //C.如果零件的左侧不是右上侧板; else { double rightMaxX = mrRightPart.GetMaxXPoint().X; if (Math.Abs(partMinX - rightMaxX) < CCommonPara.mDblError) { mrDimSet.AddPoint(mMrPart.GetMaxXMinYPoint()); CMrCylinderDoorFrontManager.GetInstance().AppendRightDimPart(mMrPart); return(mrDimSet); } else if (partMinX > rightMaxX) { CMrCylinderDoorFrontManager.GetInstance().AppendXNormalAloneDimPart(mMrPart); } } } //7.如果向量与Y轴平行; else if (CDimTools.GetInstance().IsTwoVectorParallel(normal, yVector)) { double rightMaxX = mrRightPart.GetMaxXPoint().X; if (CDimTools.GetInstance().CompareTwoDoubleValue(partMaxX, rightMaxX) > 0 && CDimTools.GetInstance().CompareTwoDoubleValue(partMinX, rightMaxX) <= 0) { CMrApronPlate mrApronPlate = CMrCylinderDoorFrontManager.GetInstance().FindMrApronPlateByYNormalPart(mMrPart); if (mrApronPlate != null) { if (mrApronPlate.mIsUp == true) { mrDimSet.AddPoint(mMrPart.GetMaxXMinYPoint()); } else { mrDimSet.AddPoint(mMrPart.GetMaxXMaxYPoint()); } } else { mrDimSet.AddPoint(mMrPart.GetMaxXMaxYPoint()); } CMrCylinderDoorFrontManager.GetInstance().AppendRightDimPart(mMrPart); } else if (IsYNormalPartInMainBeamMiddle(mMrPart)) { CMrCylinderDoorFrontManager.GetInstance().AppendYNormalMiddleDimPart(mMrPart); return(null); } } return(mrDimSet); }