//マウス移動時、終端のアンカーポイント移動とその他の制御点の位置調整
        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);
            }
        }
示例#2
0
			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();
			}
示例#3
0
		/// <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;
		}