/// <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); }
/// <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); }
/// <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); } }
/// <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); }
/// <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 } } }