Пример #1
0
        /// <summary>
        /// 指定したパーツコレクションから、該当するパーツを検索する
        /// </summary>
        /// <param name="pos"></param>
        /// <param name="pane"></param>
        /// <param name="isSelectableOnly"></param>
        /// <param name="pcol"></param>
        /// <param name="rp">ペーンを返す(イリュージョンプロジェクタのペーンが返るので、paneと異なる場合がある)</param>
        /// <returns></returns>
        private PartsBase getparts(ScreenPos pos, IRichPane pane, bool isSelectableOnly, IList pcol, out IRichPane rp)
        {
            for (var pidx = pcol.Count - 1; pidx >= 0; pidx--)
            {
                var dp = (PartsBase)pcol[pidx];

                if (dp is IPartsVisible)
                {
                    if (((IPartsVisible)dp).Visible == false)
                    {
                        continue;
                    }
                }
                if (isSelectableOnly)
                {
                    if (dp is IPartsSelectable == false)
                    {
                        continue;
                    }
                }
                // プロジェクタを通して、パーツ座標を調査する
                foreach (IRichPane pp in PartsIllusionProjector.GetEnumerator(pane, getProjectors(pane, false), dp))
                {
                    if (dp.IsOn(pos, pp) != PartsBase.PointType.Outside)
                    {
                        rp = pp;
                        return(dp);
                    }
                }
            }
            rp = null;
            return(null);
        }
Пример #2
0
        /// <summary>
        /// イリュージョンプロジェクタを登録する
        /// </summary>
        /// <param name="original">投影元</param>
        /// <param name="idtext"></param>
        /// <returns></returns>
        public PartsIllusionProjector AddIllusionProjector(IRichPane original, string idtext)
        {
            var ret = new PartsIllusionProjector(original, idtext);

            if (_projectors.TryGetValue(original, out var prs) == false)
            {
                _projectors.Add(original, prs = new Illustios());
            }
            prs.Add(ret);
            _projectorsRevKey.Add(ret.ScreenPane, original);
            return(ret);
        }
Пример #3
0
 /// <summary>
 /// 領域更新を予約する(プロジェクタをサポートしているので、これを使用してください)
 /// </summary>
 /// <param name="parts">更新するパーツ</param>
 /// <param name="rp">使用するペーン</param>
 public override void Invalidate(PartsBase parts, IRichPane rp)
 {
     try
     {
         foreach (IRichPane pp in PartsIllusionProjector.GetEnumerator(rp, getProjectors(rp, false), parts))
         {
             base.Invalidate(parts, pp);
         }
     }
     catch (Exception e)
     {
         System.Diagnostics.Debug.WriteLine(e.Message);
     }
 }
Пример #4
0
 /// <summary>
 /// 指定した二つのパーツの重なり判定をする
 /// </summary>
 /// <param name="p1">パーツ1</param>
 /// <param name="p2">パーツ2</param>
 /// <param name="isIllusionCheck">true = イリュージョンを考慮する</param>
 /// <returns>true = 重なっている / false = 重なっていない</returns>
 public override bool IsOverlapped(IRichPane pane1, PartsBase parts1, IRichPane pane2, PartsBase parts2, bool isIllusionCheck)
 {
     try
     {
         if (isIllusionCheck)
         {
             foreach (IRichPane pp1 in PartsIllusionProjector.GetEnumerator(pane1, getProjectors(pane1, false), parts1))
             {
                 var sr1 = parts1.GetScRect(pp1, parts1.Rect);
                 foreach (IRichPane pp2 in PartsIllusionProjector.GetEnumerator(pane2, getProjectors(pane2, false), parts2))
                 {
                     var sr2   = parts2.GetScRect(pp2, parts2.Rect);
                     var union = sr1 & sr2;
                     if (union != null)
                     {
                         return(true);
                     }
                 }
             }
         }
         else
         {
             if (pane1 == pane2)
             {
                 var pt1 = parts1.GetPtRect(parts1.Rect);
                 var pt2 = parts2.GetPtRect(parts2.Rect);
                 return(pt1.IsIn(pt2));
             }
             else
             {
                 var sr1 = parts1.GetScRect(pane1, parts1.Rect);
                 var sr2 = parts2.GetScRect(pane2, parts2.Rect);
                 return(sr1.IsIn(sr2));
             }
         }
     }
     catch (Exception e)
     {
         System.Diagnostics.Debug.WriteLine("IsOverlappedは次の例外でキャンセル; " + e.Message);
     }
     return(false);
 }
Пример #5
0
        /// <summary>
        /// レイヤーを描画
        /// </summary>
        /// <param name="pane">描画するペーン</param>
        /// <param name="pts">描画するパーツ</param>
        protected virtual void drawLayer(IRichPane pane, int layerid, IEnumerable <PartsBase> pts)
        {
            foreach (var dp in pts)
            {
                foreach (IRichPane pp in PartsIllusionProjector.GetEnumerator(pane, getProjectors(pane, false), dp))
                {
#if DEBUG
                    try
                    {
                        dp.Draw(pp);
                    }
                    catch (Exception ex)
                    {
                        LOG.WriteLineException(ex);
                        //throw exinner;	// ここにブレークポイントを設けると、どのパーツで例外発生したか特定できる
                    }
#else
                    dp.Draw(pp);
#endif
                }
            }
        }