public FrmLineInOutParams() { InitializeComponent(); this.LeadwireParam = new LineInOutParamsModel(); this.cmbLineInTypes.SelectedIndex = 0; this.cmbLineOutTypes.SelectedIndex = 0; }
private void GetCircleLeadLineParams(IDrawObject drawObject, LineInOutParamsModel leadInOutParamsModel) { Circle circle = (Circle)drawObject; double angle = HitUtil.LineAngleR(circle.Center, this.p2, 0); leadInOutParamsModel.FigureTotalLength = (float)(angle / (Math.PI * 2)); this.p2 = HitUtil.PointOnCircle(circle.Center, circle.Radius, angle); bool isInner; leadInOutParamsModel.LineInAngle = DrawingOperationHelper.GetLeadLineAngleArc(this.p1, this.p2, circle.Center, circle.IsClockwise, out isInner); leadInOutParamsModel.LineInLength = (float)HitUtil.Distance(this.p1, this.p2); circle.IsInnerCut = isInner; }
public void CalLeadLineParams(IDrawObject drawObject, LineInOutParamsModel leadInOutParamsModel) { //位置(1.计算当前鼠标点位置在图形的第几段线上,2.计算当前鼠标点在当前线段的相对百分位置) switch (drawObject.Id) { case "Circle": this.GetCircleLeadLineParams(drawObject, leadInOutParamsModel); break; case "MultiLineBase": this.GetMultiLineLeadLineParams(drawObject, leadInOutParamsModel); break; case "Arc": this.GetArcLeadLineParams(drawObject, leadInOutParamsModel); break; default: break; } }
public void DoSetLeadwire(List <IDrawObject> drawObjects, List <LineInOutParamsModel> leadwireModels) { List <LineInOutParamsModel> leadwireModelOlds = new List <LineInOutParamsModel>(); foreach (var item in drawObjects) { LineInOutParamsModel leadwireModelOld; if (item.LeadInOutParams.LineInType != item.LeadIn.LeadType || item.LeadInOutParams.LineOutType != item.LeadOut.LeadType) { leadwireModelOld = new LineInOutParamsModel(); leadwireModelOld.LineInType = item.LeadIn.LeadType; leadwireModelOld.LineInLength = item.LeadIn.Length; leadwireModelOld.LineInAngle = item.LeadIn.Angle; leadwireModelOld.LineInRadius = item.LeadIn.ArcRadius; leadwireModelOld.IsAddCircularHole = item.LeadIn.LeadByHole; leadwireModelOld.CircularHoleRadius = item.LeadIn.LeadHoleRadius; leadwireModelOld.LineOutType = item.LeadOut.LeadType; leadwireModelOld.LineOutLength = item.LeadOut.Length; leadwireModelOld.LineOutAngle = item.LeadOut.Angle; leadwireModelOld.LineOutRadius = item.LeadOut.ArcRadius; //其余部分参数在wxf文件中没有保存,所以无法判别,产生bug如下:当是在最长边引入(起点在最长边的一半位置),重新打开文件,按撤销会把起点会回到原始点 } else { leadwireModelOld = item.LeadInOutParams; } leadwireModelOlds.Add(leadwireModelOld); } int i = 0; foreach (var item in drawObjects) { ((IDrawTranslation)item).DoSetLeadwire(leadwireModels[i]); i++; } if (this.undoRedoBuffer.CanCapture) { this.undoRedoBuffer.AddCommand(new EditCommandSetLeadwire(drawObjects, leadwireModels, leadwireModelOlds)); } }
private void GetMultiLineLeadLineParams(IDrawObject drawObject, LineInOutParamsModel leadInOutParamsModel) { MultiSegmentLineBase multiSegmentLine = drawObject as MultiSegmentLineBase; int segment = 0; if (multiSegmentLine != null) { //所在段数必须合法 segment = DrawingOperationHelper.GetPointInLineIndex(multiSegmentLine, this.p2); int nextIndex = (segment + 1 >= multiSegmentLine.PointCount && multiSegmentLine.IsCloseFigure) ? 0 : segment + 1; if (double.IsNaN(multiSegmentLine.Points[segment].Bulge)) { double partLen = HitUtil.Distance(multiSegmentLine.Points[segment].Point, this.p2); double allLen = HitUtil.Distance(multiSegmentLine.Points[segment].Point, multiSegmentLine.Points[nextIndex].Point); float percent = (float)(segment + partLen / allLen); leadInOutParamsModel.FigureTotalLength = (float)(DrawingOperationHelper.GetLengthByPositionInPolyLine(multiSegmentLine.Points, multiSegmentLine.IsCloseFigure, percent) / multiSegmentLine.SizeLength); //角度(p1p2与当前线段所成夹角或与圆弧在当前鼠标点位置的切点出的切线所成夹角) this.p2 = HitUtil.FindApparentIntersectPoint(this.p1, this.p2, multiSegmentLine.Points[segment].Point, multiSegmentLine.Points[nextIndex].Point); double lineAngle = HitUtil.LineAngleR(multiSegmentLine.Points[nextIndex].Point, multiSegmentLine.Points[segment].Point, 0); UnitPoint extensionCordPoint = HitUtil.LineEndPoint(multiSegmentLine.Points[segment].Point, lineAngle, 5); leadInOutParamsModel.LineInAngle = (float)BulgeHelper.CalTwoLinesAngleFromThreePoints(extensionCordPoint, this.p2, this.p1); multiSegmentLine.IsInnerCut = HitUtil.IsClockwiseByCross(this.p1, this.p2, extensionCordPoint) == multiSegmentLine.Clockwise ? false : true; } else { ArcModelMini arcModelMini = DrawingOperationHelper.GetArcParametersFromBulge(multiSegmentLine.Points[segment].Point, multiSegmentLine.Points[nextIndex].Point, (float)multiSegmentLine.Points[segment].Bulge); float percent = segment + DrawingOperationHelper.GetPercentInArcByPoint(arcModelMini, this.p2); leadInOutParamsModel.FigureTotalLength = (float)(DrawingOperationHelper.GetLengthByPositionInPolyLine(multiSegmentLine.Points, multiSegmentLine.IsCloseFigure, percent) / multiSegmentLine.SizeLength); bool isInner; leadInOutParamsModel.LineInAngle = DrawingOperationHelper.GetLeadLineAngleArc(this.p1, this.p2, arcModelMini.Center, arcModelMini.Clockwise, out isInner); multiSegmentLine.IsInnerCut = isInner; } } //长度(p1p2的长度) leadInOutParamsModel.LineInLength = (float)HitUtil.Distance(p1, p2); }
public void OnSetLeadwire(LineInOutParamsModel leadwireModel) { this.drawingComponent1.DoSetLeadwire(leadwireModel); }
private void MouseDownSetStartMovePoint(MouseEventArgs e) { UnitPoint mousePoint = this.ToUnit(this.mouseDownPoint); IDrawObject hitObject = this.Model.GetHitObject(mousePoint); if (hitObject != null && leadLineDone && hitObject.IsCloseFigure) { LineInOutParamsModel leadInOutParamsModel = CopyUtil.DeepCopy(hitObject.LeadInOutParams); leadInOutParamsModel.LinePosition = LinePositions.FigureTotalLength; leadInOutParamsModel.FigureTotalLength = this.CalPercentByPoint(hitObject, mousePoint); this.Model.DoSetLeadwire(new List <IDrawObject>() { hitObject }, new List <LineInOutParamsModel>() { leadInOutParamsModel }); this.DoInvalidate(true); } else//绘制引入线 { if (this.leadLine == null) { this.leadLine = new LeadLine(mousePoint); this.leadLineDone = false; } else { if (hitObject != null) { LineInOutParamsModel leadInOutParamsModel = CopyUtil.DeepCopy(hitObject.LeadInOutParams); leadInOutParamsModel.LinePosition = LinePositions.FigureTotalLength; leadInOutParamsModel.LineInType = CommomModel.DrawModel.LeadLine.LeadLineType.Line; if (hitObject.IsCloseFigure) { DrawObjectMouseDown result = this.leadLine.OnMouseDown(mousePoint); this.leadLine.CalLeadLineParams(hitObject, leadInOutParamsModel); this.Model.DoSetLeadwire(new List <IDrawObject>() { hitObject }, new List <LineInOutParamsModel>() { leadInOutParamsModel }); } else if (HitUtil.PointInPoint(mousePoint, hitObject.FirstDrawPoint, GetThresholdWidth())) { DrawObjectMouseDown result = this.leadLine.OnMouseDown(hitObject.FirstDrawPoint); this.leadLine.CalLeadLineParams(hitObject, leadInOutParamsModel); this.Model.DoSetLeadwire(new List <IDrawObject>() { hitObject }, new List <LineInOutParamsModel>() { leadInOutParamsModel }); } this.leadLine = null; this.leadLineDone = true; } else { this.leadLine = new LeadLine(mousePoint); } this.DoInvalidate(true); } } }