public ConnectionPort NearConnectionPort(Point Location) { if (Ports.Count == 0) { return(null); } double[] distance = new double[Ports.Count]; for (int i = 0; i < Ports.Count; i++) { CoreRectRange range = Ports.ElementAt(i).getRange(); Point center = new Point((range.TopLeft.X + range.BottomRight.X) / 2, (range.TopLeft.Y + range.BottomRight.Y) / 2); double dx = Math.Abs(Location.X - center.X); double dy = Math.Abs(Location.Y - center.Y); distance[i] = Math.Pow(dx * dx + dy * dy, 0.5); } double min = distance[0]; int index = 0; for (int i = 0; i < Ports.Count; i++) { if (distance[i] < min) { min = distance[i]; index = i; } } return(Ports.ElementAt(index)); }
public CoreRectRange getRange() { Point Center = getCenter(); CoreRectRange Range = new CoreRectRange(Center.X - Width / 2, Center.Y - Height / 2, Center.X + Width / 2, Center.Y + Height / 2); return(Range); }
public override void Draw(DrawingContext dc) { const double BorderWidth = 3; double Width = Range.Width; double Height = Range.Height; Point Center = new Point((Range.TopLeft.X + Range.BottomRight.X) / 2, (Range.TopLeft.Y + Range.BottomRight.Y) / 2); double a = Math.Max(Range.Height, Range.Width) / 2; //長邊半徑 double b = Math.Min(Range.Height, Range.Width) / 2; //短邊半徑 double c = 2 * b * b / a; //計算正焦距 //s+w=2a, (2c)^2+w^2=s^2 我們現在要求垂直於左焦點的線長w*2,以及c*2為內接四邊形的長和寬 //s^2-w^2=(2c)^2 --> (s+w)(s-w)=(2c)^2 --> (s-w)=(2c)^2/(s+w) --> (s-w)=(2c)^2/(2a) --> (s-w)=2c^2/a --> 2w = 2*a - ((2*c*c)/a) double w = (2 * a - ((2 * c * c) / a)) / 2; Point InsideRectTopLeft = new Point(Center.X - c, Center.Y - w); Point InsideRectBottomRight = new Point(Center.X + c, Center.Y + w); //畫出整個外觀 CoreDraw.DrawEllipse(dc, Center, Width, Height, Brushes.AliceBlue); //畫出Title CoreRectRange TitleRange = new CoreRectRange(InsideRectTopLeft, InsideRectBottomRight); //CoreDraw.DrawBorder(dc, TitleRange, 2, Brushes.Red, CoreDraw.BorderStyle_StraightLine); CoreDraw.DrawText(dc, Name, TitleRange, Brushes.Black, 12); //劃出外框 CoreDraw.DrawEllipseBorder(dc, Center, Width, Height, BorderWidth, Brushes.Black); //畫出選擇點 if (Selected) { foreach (ConnectionPort Port in Ports) { Port.Draw(dc); } } return; }
public void Do_Group() { List <BaseUMLObject> Target = new List <BaseUMLObject>(); foreach (BaseUMLShape shape in UMLShapes) { if (shape as BaseUMLObject != null) { BaseUMLObject obj = shape as BaseUMLObject; if (obj.getSelected()) { Target.Add(obj); } } } foreach (BaseUMLObject obj in Target) { obj.setSelected(false); UMLShapes.Remove(obj); } GroupUMLObject Group = new GroupUMLObject(CoreRectRange.Default()); Group.SetChildrens(Target); AddShape(Group); }
public ClassUMLObject(CoreRectRange Range) : base(Range) { TitleText = "UMLClass(" + ID + ")"; MemberText = "Members:"; MethodText = "Methods:"; }
public override bool Inside(CoreRectRange r) { if (Range.TopLeft.X > r.TopLeft.X && Range.TopLeft.Y > r.TopLeft.Y && Range.BottomRight.X < r.BottomRight.X && Range.BottomRight.Y < r.BottomRight.Y) { return(true); } return(false); }
//enum GraphicDetail {DrawID,DrawText,DrawBorder,DrawBorder,DrawObject} public BaseUMLObject(CoreRectRange _Range) : base() { Range = _Range; Ports = new List <ConnectionPort>(); Ports.Add(new ConnectionPort(this, ConnectionPort.Location.TopConnectionPort)); Ports.Add(new ConnectionPort(this, ConnectionPort.Location.RightConnectionPort)); Ports.Add(new ConnectionPort(this, ConnectionPort.Location.LeftConnectionPort)); Ports.Add(new ConnectionPort(this, ConnectionPort.Location.BottomConnectionPort)); }
public void SetChildrens(List <BaseUMLObject> Objects) { Childrens = Objects; List <CoreRectRange> Ranges = new List <CoreRectRange>(); foreach (BaseUMLObject obj in Objects) { Ranges.Add(obj.getRange()); } Range = new CoreRectRange(Ranges); }
public virtual void Move(Point Location, int Type = Move_Normal) { if (Type == Move_Normal) { Range = new CoreRectRange(Location.X, Location.Y, Location.X + Range.Width, Location.Y + Range.Height); } else if (Type == Move_Relative) { Point p = new Point(Range.TopLeft.X + Location.X, Range.TopLeft.Y + Location.Y); Range = new CoreRectRange(p.X, p.Y, p.X + Range.Width, p.Y + Range.Height); } }
public override void Draw(DrawingContext dc) { const double BorderWidth = 3; double Width = Range.Width; double Height = Range.Height; Point Title_Top_LeftPoint = new Point(Range.TopLeft.X, Range.TopLeft.Y); Point Title_Top_RightPoint = new Point(Range.BottomRight.X, Range.TopLeft.Y); Point Title_Member_LeftPoint = new Point(Range.TopLeft.X, Range.TopLeft.Y + Height * 0.25); Point Title_Member_RightPoint = new Point(Range.BottomRight.X, Range.TopLeft.Y + Height * 0.25); Point Member_Method_LeftPoint = new Point(Range.TopLeft.X, Range.TopLeft.Y + Height * 0.65); Point Member_Method_RightPoint = new Point(Range.BottomRight.X, Range.TopLeft.Y + Height * 0.65); Point Method_Bottom_LeftPoint = new Point(Range.TopLeft.X, Range.TopLeft.Y + Height); Point Method_Bottom_RightPoint = new Point(Range.BottomRight.X, Range.TopLeft.Y + Height); //畫出整個外觀 CoreDraw.DrawRect(dc, Range, Brushes.AliceBlue); //畫出第一條分隔線 CoreDraw.DrawLine(dc, Title_Member_LeftPoint, Title_Member_RightPoint, BorderWidth, Brushes.Black, CoreDraw.LineStyle_StraightLine); //畫出第二條分隔線 CoreDraw.DrawLine(dc, Member_Method_LeftPoint, Member_Method_RightPoint, BorderWidth, Brushes.Black, CoreDraw.LineStyle_StraightLine); //畫出Title CoreRectRange TitleRange = new CoreRectRange(Title_Top_LeftPoint.X + BorderWidth, Title_Top_LeftPoint.Y + BorderWidth, Title_Member_RightPoint.X - BorderWidth, Title_Member_RightPoint.Y - BorderWidth); //CoreDraw.DrawBorder(dc, TitleRange, 2, Brushes.Red, CoreDraw.BorderStyle_StraightLine); CoreDraw.DrawText(dc, TitleText, TitleRange, Brushes.Black, 12); //畫出Member CoreRectRange MembersRange = new CoreRectRange(Title_Member_LeftPoint.X + BorderWidth, Title_Member_LeftPoint.Y + BorderWidth, Member_Method_RightPoint.X - BorderWidth, Member_Method_RightPoint.Y - BorderWidth); //CoreDraw.DrawBorder(dc, MembersRange, 2, Brushes.Red, CoreDraw.BorderStyle_StraightLine); CoreDraw.DrawText(dc, MemberText, MembersRange, Brushes.Black, 12); //畫出Methods CoreRectRange Methodsange = new CoreRectRange(Member_Method_LeftPoint.X + BorderWidth, Member_Method_LeftPoint.Y + BorderWidth, Method_Bottom_RightPoint.X - BorderWidth, Method_Bottom_RightPoint.Y - BorderWidth); //CoreDraw.DrawBorder(dc, Methodsange, 2, Brushes.Red, CoreDraw.BorderStyle_StraightLine); CoreDraw.DrawText(dc, MethodText, Methodsange, Brushes.Black, 12); //劃出外框 CoreDraw.DrawBorder(dc, Range, BorderWidth, Brushes.Black, CoreDraw.BorderStyle_StraightLine); //畫出選擇點 if (Selected) { foreach (ConnectionPort Port in Ports) { Port.Draw(dc); } } return; }
public override void Draw(DrawingContext dc) { double BorderWidth = 1; foreach (BaseUMLObject obj in Childrens) { obj.Draw(dc); } CoreDraw.DrawBorder(dc, Range, BorderWidth, Brushes.Red, CoreDraw.BorderStyle_MultipleSegment); CoreRectRange TextRange = new CoreRectRange(Range.TopLeft.X + BorderWidth * 1.5, Range.TopLeft.Y + BorderWidth * 1.5 - 30, Range.BottomRight.X - BorderWidth * 1.5, Range.TopLeft.Y + Range.Height / 3 - BorderWidth * 1.5 - 30); CoreDraw.DrawText(dc, "UMLGroup(" + ID + ")", TextRange, Brushes.Black, 12); if (Selected) { foreach (ConnectionPort Port in Ports) { Port.Draw(dc); } } return; }
public GroupUMLObject(CoreRectRange Range) : base(Range) { }
public override bool Inside(CoreRectRange r) { return(false); }
public UseCaseUMLObject(CoreRectRange Range) : base(Range) { Name = "UMLUseCase(" + ID + ")"; }
public abstract bool Inside(CoreRectRange r);