//マウス移動時、終端のアンカーポイント移動とその他の制御点の位置調整 private void MyCanvas_MouseMove(object sender, MouseEventArgs e) { PointCollection ps = MySegment.Points; Point mouseP = e.GetPosition(MyCanvas);//マウスカーソル位置 if (ps.Count > 5) { //終端のアンカーの座標は今のカーソル座標 ps[ps.Count - 1] = mouseP; Point preAP = ps[ps.Count - 4]; //一個前のアンカーポイント Point prepreAP; //二個前のアンカーポイント if (ps.Count < 7) { var pg = (PathGeometry)MyPath.Data; var pathFigureCollection = pg.Figures; prepreAP = pathFigureCollection[0].StartPoint; } else { prepreAP = ps[ps.Count - 7]; } //終端アンカーと二個前のアンカーとの距離の1 / 4 double xDiff = (mouseP.X - prepreAP.X) / 4.0; double yDiff = (mouseP.Y - prepreAP.Y) / 4.0; //一個前のアンカーポイントの制御点座標 ps[ps.Count - 5] = new Point(preAP.X - xDiff, preAP.Y - yDiff); //終端から遠いほう ps[ps.Count - 3] = new Point(preAP.X + xDiff, preAP.Y + yDiff); //終端から近いほう //矢印の回転角度 //角度はマウスカーソル座標と一個前のアンカーの手前側の制御点との直線の角度 double angle = Math.Atan2(mouseP.Y - ps[ps.Count - 3].Y, mouseP.X - ps[ps.Count - 3].X); angle = angle / Math.PI * 180; //ラジアンから度数へ変換 angle += 90; //調整、元の矢印は上向きだけど0度は右向きだから //矢印回転 ArrowHead.RenderTransform = new RotateTransform(angle); MyLabel.Content = "Angle = " + angle.ToString(); //矢印の位置、先端をマウスカーソルに合わせる mouseP.Offset(-OffsetFinePoint.X, -OffsetFinePoint.Y); Canvas.SetLeft(ArrowHead, mouseP.X); Canvas.SetTop(ArrowHead, mouseP.Y); //終端座標決定 //矢印の後ろ(接続座標)をベジェ曲線の終端にする //接続座標はTransformToVisualで計算 GeneralTransform gt = ArrowHead.TransformToVisual(MyCanvas); Point lastAnc = gt.Transform(ContactPoint); ps[ps.Count - 1] = lastAnc; //終端(アンカー)と一個前のアンカーの距離の1/4 xDiff = (lastAnc.X - ps[ps.Count - 3].X) / 4.0; yDiff = (lastAnc.Y - ps[ps.Count - 3].Y) / 4.0; //終端の制御点座標 Point lastControlP = new Point(lastAnc.X - xDiff, lastAnc.Y - yDiff); ps[ps.Count - 2] = lastControlP; } else if (ps.Count > 0) { //終端はカーソル位置 ps[ps.Count - 1] = e.GetPosition(MyCanvas);//カーソル位置に //矢印の位置調整 mouseP.Offset(-OffsetFinePoint.X, -OffsetFinePoint.Y); Canvas.SetLeft(ArrowHead, mouseP.X); Canvas.SetTop(ArrowHead, mouseP.Y); } }
public virtual void loadFrom(BinaryReader reader, PersistContext ctx) { backColor = ctx.loadColor(); behavior = (BehaviorType)reader.ReadInt32(); arrowHead = (ArrowHead)reader.ReadInt32(); arrowBase = (ArrowHead)reader.ReadInt32(); arrowInterm = (ArrowHead)reader.ReadInt32(); arrowHeadSize = (float)reader.ReadDouble(); arrowBaseSize = (float)reader.ReadDouble(); arrowIntermSize = (float)reader.ReadDouble(); shadowsStyle = (ShadowsStyle)reader.ReadInt32(); boxFillColor = ctx.loadColor(); arrowFillColor = ctx.loadColor(); boxFrameColor = ctx.loadColor(); arrowColor = ctx.loadColor(); alignToGrid = reader.ReadBoolean(); showGrid = reader.ReadBoolean(); gridColor = ctx.loadColor(); gridSize = (float)reader.ReadDouble(); boxStyle = (BoxStyle)reader.ReadInt32(); shadowColor = ctx.loadColor(); imagePos = (ImageAlign)reader.ReadInt32(); textColor = ctx.loadColor(); activeMnpColor = ctx.loadColor(); selMnpColor = ctx.loadColor(); disabledMnpColor = ctx.loadColor(); arrowStyle = (ArrowStyle)reader.ReadInt32(); arrowSegments = reader.ReadInt16(); scrollX = (float)reader.ReadDouble(); scrollY = (float)reader.ReadDouble(); // zoomFactor was a short, now it is a float if (ctx.FileVersion < 19) zoomFactor = reader.ReadInt16(); else zoomFactor = reader.ReadSingle(); penDashStyle = (DashStyle)reader.ReadInt32(); penWidth = (float)reader.ReadDouble(); int c = reader.ReadInt32(); defPolyShape = reader.ReadBytes(c); docExtents = ctx.loadRectF(); shadowOffsetX = (float)reader.ReadDouble(); shadowOffsetY = (float)reader.ReadDouble(); tableFillColor = ctx.loadColor(); tableFrameColor = ctx.loadColor(); tableRowsCount = reader.ReadInt32(); tableColumnsCount = reader.ReadInt32(); tableColWidth = (float)reader.ReadDouble(); tableRowHeight = (float)reader.ReadDouble(); tableCaptionHeight = (float)reader.ReadDouble(); tableCaption = reader.ReadString(); arrowCascadeOrientation = (Orientation)reader.ReadInt32(); tableCellBorders = (CellFrameStyle)reader.ReadInt32(); boxIncmAnchor = (ArrowAnchor)reader.ReadInt32(); boxOutgAnchor = (ArrowAnchor)reader.ReadInt32(); boxesExpandable = reader.ReadBoolean(); tablesScrollable = reader.ReadBoolean(); }
/// <summary> /// Returns Visio VDX arrow type derived from FlowChart.NET EArrowHead enum /// </summary> /// <param name="eaType">EArrowHead enum value</param> /// <returns>String Visio arrow type</returns> private string ArrowType2String(ArrowHead eaType) { string sTemp = "0"; try { switch ( eaType) { #if _POST_FIX_3 case ArrowHead.Arrow: sTemp = "1"; break; case ArrowHead.BowArrow: sTemp = "6"; break; case ArrowHead.PointerArrow: sTemp = "6"; break; case ArrowHead.DoubleArrow: sTemp = "39"; break; case ArrowHead.Pentagon: sTemp = "4"; break; case ArrowHead.Reversed: sTemp = "27"; break; case ArrowHead.RevWithLine: sTemp = "28"; break; case ArrowHead.RevWithCirc: sTemp = "29"; break; case ArrowHead.RevTriangle: sTemp = "27"; break; case ArrowHead.Circle: sTemp="42"; break; case ArrowHead.BackSlash: sTemp = "9"; break; case ArrowHead.Slash: sTemp = "23"; break; case ArrowHead.Quill: sTemp = "2"; break; #else case ArrowHead.BackSlash: sTemp = "23"; break; case ArrowHead.ahCircle: sTemp="20"; break; case ArrowHead.hDoubleArrow: sTemp = "43"; break; case ArrowHead.Slash: sTemp = "9"; break; #endif case ArrowHead.None: sTemp = "0"; break; case ArrowHead.Triangle: sTemp="2"; break; case ArrowHead.Tetragon: sTemp = "11"; break; case ArrowHead.Rhombus: sTemp = "22"; break; default: sTemp = "0"; break; } } catch (Exception ex) { Trace.WriteLine(String.Format("{0} error {1}\n","ArrowType2String",ex.Message)); sTemp = "0"; } return sTemp; }