示例#1
0
 /// <summary>
 /// モーションして移動する先を指定する
 /// </summary>
 /// <param name="nStep"></param>
 /// <param name="pos"></param>
 public void SetMotionPosition(PartsBase part, CodePos pos, int nStep)
 {
     lock (_tarPos)
     {
         _tarPos[part] = new TargetPosition(pos, nStep);
     }
 }
示例#2
0
        /// <summary>
        /// 指定パーツと重なっているパーツをすべて取得する
        /// </summary>
        /// <param name="partsClass">パーツのクラスタイプ typeof(object)で全て</param>
        /// <param name="tar">取得対象</param>
        /// <param name="rp">ペーン</param>
        /// <param name="checkIllustion"></param>
        /// <returns>パーツのコレクション</returns>
        public override ICollection <PartsBase> GetOverlappedParts(Type partsClass, PartsBase tar, IRichPane rp, bool checkIllustion)
        {
            //HACK: Slow GetOverlappedParts method
            var ret = new List <PartsBase>();

            if (_data.TryGetValue(rp, out var layers))
            {
                var lnos = _layerNos[rp];
                for (var lnosid = 0; lnosid < lnos.Count; lnosid++)
                {
                    if (_layerVisibleSwitch[lnos[lnosid]])
                    {
                        var list = layers[lnos[lnosid]];
                        foreach (var dp in list)
                        {
                            var t = dp.GetType();
                            if (dp != tar && (t.Equals(partsClass) || t.IsSubclassOf(partsClass)))
                            {
                                if (IsOverlapped(rp, tar, rp, dp, checkIllustion))
                                {
                                    ret.Add(dp);
                                }
                            }
                        }
                    }
                }
            }
            return(ret);
        }
示例#3
0
        /// <summary>
        /// パーツ指定してレコードを取得する
        /// </summary>
        /// <param name="key">パーツ</param>
        /// <returns>レコード</returns>
        public RecordBase GetRecord(PartsBase key)
        {
            var ret = GetRecordOrNull(key);

            System.Diagnostics.Debug.Assert(ret != null, "リンク情報がありません");
            return(ret);
        }
示例#4
0
 /// <summary>
 /// 追加処理
 /// </summary>
 /// <param name="target"></param>
 /// <param name="value"></param>
 /// <param name="layerLevel"></param>
 private void _addProc(IRichPane target, PartsBase value, int layerLevel)
 {
     try
     {
         if (!_data.TryGetValue(target, out var layers))
         {
             // ペーンを登録
             _data.Add(target, new Layers());    // TONO
             _addProc(target, value, layerLevel);
             return;
         }
         if (!layers.TryGetValue(layerLevel, out var ps))
         {
             // レイヤーを登録
             makeNewLayer(target, layerLevel, layers);
             _addProc(target, value, layerLevel);
             return;
         }
         ps.Add(value);
     }
     catch (System.NullReferenceException)
     {
         _data[target] = new Layers();
         _addProc(target, value, layerLevel);
     }
 }
示例#5
0
        /// <summary>
        /// パーツを追加する
        /// </summary>
        /// <param name="target"></param>
        /// <param name="value">追加するパーツ</param>
        /// <param name="layerLevel"></param>
        public override void Add(IRichPane target, PartsBase value, int layerLevel)
        {
            lock (_data)
            {
                base.Add(target, value, layerLevel);    // 必須

                _addProc(target, value, layerLevel);
            }
        }
示例#6
0
        /// <summary>
        /// パーツ指定してレコードを取得する(NULLを許可する)
        /// </summary>
        /// <param name="key">パーツ</param>
        /// <returns>レコード</returns>
        public RecordBase GetRecordOrNull(PartsBase key)
        {
            var rs = GetRecordset(key);

            if (rs.Count == 0)
            {
                return(null);
            }
            var e   = rs.GetEnumerator();
            var ret = e.MoveNext();

            return((RecordBase)e.Current);
        }
示例#7
0
        /// <summary>
        /// 指定領域から特定位置のパーツを探す
        /// </summary>
        /// <param name="pos">位置</param>
        /// <param name="pane">検索ペーン</param>
        /// <param name="layer">検索レイヤー</param>
        /// <param name="isSelectableOnly">選択可能のみ</param>
        /// <returns>取得できたパーツ / null=なし</returns>
        public override PartsBase GetPartsAt(ScreenPos pos, IRichPane pane, int layer, bool isSelectableOnly)
        {
            PartsBase ret = null;

            if (_data.TryGetValue(pane, out var layers))
            {
                if (layers.TryGetValue(layer, out var pcol))
                {
                    ret = getparts(pos, pane, isSelectableOnly, pcol, out var rp);
                }
            }
            return(ret);
        }
示例#8
0
 /// <summary>
 /// Enumeratorを構築する
 /// </summary>
 /// <param name="parent">targetが0件の時に適用されるペーン</param>
 /// <param name="target">dfPartsIllusionProjector型のリスト</param>
 /// <param name="parts">参照中のパーツ</param>
 internal PaneEnumerator(IRichPane parent, IList target, PartsBase parts)
 {
     _parent = parent;
     _dat    = target;
     if (_dat != null)
     {
         if (_dat.Count > 0)
         {
             _parent = ((PartsIllusionProjector)_dat[0]).OriginalPane;
         }
     }
     _parts = parts;
     Reset();
 }
示例#9
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);
     }
 }
示例#10
0
 /// <summary>
 /// 指定したパーツをペーン内、レイヤーないで最上に移動する
 /// </summary>
 /// <param name="tar">移動させるパーツ</param>
 public virtual void MovePartsZOrderToTop(PartsBase tar)
 {
     foreach (var layers in _data.Values)
     {
         foreach (var list in layers.Values)
         {
             if (list.Contains(tar))
             {
                 list.Remove(tar);
                 list.Insert(list.Count, tar);
                 return;
             }
         }
     }
 }
示例#11
0
        /// <summary>
        /// レイヤーを変更する
        /// </summary>
        /// <param name="pane"></param>
        /// <param name="layer_from"></param>
        /// <param name="parts"></param>
        /// <param name="layer_to"></param>
        public void MovePartsLayer(IRichPane pane, int layer_from, PartsBase parts, int layer_to)
        {
            var ls = _data[pane];

            if (ls.TryGetValue(layer_from, out var listf) == false)
            {
                listf = new List <PartsBase>();
            }
            if (ls.TryGetValue(layer_to, out var listt) == false)
            {
                listt = makeNewLayer(pane, layer_to, ls);
            }
            listf.Remove(parts);
            listt.Remove(parts);
            listt.Add(parts);
        }
示例#12
0
        /// <summary>
        /// 指定パーツを削除する
        /// </summary>
        /// <param name="value"></param>
        public override void Remove(PartsBase value)
        {
            base.Remove(value); // 必須

            foreach (var layers in _data.Values)
            {
                foreach (var co in layers.Values)
                {
                    if (co.Contains(value))
                    {
                        co.Remove(value);
                        return;
                    }
                }
            }
        }
示例#13
0
        /// <summary>
        /// パーツを指定してインスタンスを初期化する
        /// </summary>
        /// <param name="parts"></param>
        /// <param name="pane"></param>
        public void AddParts(PartsBase parts, IRichPane pane, CodePos offset)
        {
            _lastDevelpType = DevelopType.Unknown;

            var p = new Pos3
            {
                OrgPane = RichPaneBinder.CreateCopyComplete(pane),
                NowPane = pane,
                Org     = (CodeRect)parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標)
                                                        //p.Org = (uCdRect)parts.Rect.Clone() - parts.GetCdPos(pane, _prevShift); // 符号化の座標(符号しない場合、単なるパーツ座標)
                Pre    = (CodeRect)parts.Rect.Clone(),  // 符号化の座標(符号しない場合、単なるパーツ座標)
                Now    = (CodeRect)parts.Rect.Clone(),  // 符号化の座標(符号しない場合、単なるパーツ座標)
                Offset = (CodePos)offset.Clone()
            };

            base[parts] = p;
        }
示例#14
0
        /// <summary>
        /// 変更されたパーツの値をレコードに反映させる
        /// (このメソッドを行う度にUNDO対象とするかどうかは、IsAutoChunkStateで指定する))
        /// </summary>
        /// <param name="parts">新しくなったパーツ</param>
        /// <returns>反映後レコード参照(参考)</returns>
        public ICollection Equalization(PartsBase parts)
        {
            System.Diagnostics.Debug.Assert(_adapterPtoRs.Count >= 0, "Equalizationするには、まずSetPRAdapterでアダプターを指定する必要があります");
            var records = GetRecordset(parts);

            if (records.Count > 0)
            {
                foreach (RecordBase record in records)
                {
                    foreach (var pra in _adapterPtoRs)
                    {
                        // パーツの値をレコードに反映
                        pra(parts, record);
                    }
                }
            }
            return(records);
        }
示例#15
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);
 }
示例#16
0
        /// <summary>
        /// 描画させる(Paintイベントから実行されるため、ユーザーは実行禁止
        /// </summary>
        public override void ProvideDrawFunction()
        {
            try
            {
                for (IDictionaryEnumerator de = _data.GetEnumerator(); de.MoveNext();)
                {
                    var pane = (IRichPane)de.Key;
                    pane.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

                    // 全体に影響する描画処理
                    var clipRect = pane.GetPaintClipRect() & pane.GetPaneRect();
                    if (clipRect != null)     // クリップとペイントの領域内のみ描画する
                    {
                        PartsBase.Mask(pane); // ペーン領域をマスクする
                                              //System.Diagnostics.Debug.WriteLine(clipRect.ToString());
                        using (Brush brush = new SolidBrush(pane.Control.BackColor))
                        {
                            pane.Graphics.FillRectangle(brush, clipRect); // 背景を描画
                        }

                        // レイヤーでループする
                        var layers = (Layers)de.Value;
                        var lnos   = _layerNos[pane];
                        for (var layerid = 0; layerid < lnos.Count; layerid++)
                        {
                            if (_layerVisibleSwitch[lnos[layerid]])
                            {
                                IEnumerable <PartsBase> pts = layers[lnos[layerid]];
                                // 描画する
                                drawLayer(pane, lnos[layerid], pts);
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine("描画中に例外;" + e.Message);
            }
        }
示例#17
0
 /// <summary>
 /// 指定パーツと重なっているパーツをすべて取得する
 /// </summary>
 /// <param name="partsClass">パーツのクラスタイプ typeof(object)で全て</param>
 /// <param name="tar">取得対象</param>
 /// <param name="rp">ペーン</param>
 /// <param name="checkIllustion"></param>
 /// <returns>パーツのコレクション</returns>
 public virtual ICollection <PartsBase> GetOverlappedParts(Type partsClass, PartsBase tar, IRichPane rp, bool checkIllustion)
 {
     return(new List <PartsBase>());
 }
示例#18
0
 /// <summary>
 /// 指定パーツを削除する
 /// </summary>
 /// <param name="value"></param>
 public virtual void Remove(PartsBase value)
 {
     _removedParts.Add(value);
 }
示例#19
0
 /// このメソッドは消してください by Tono チェックアウトできなかったので、暫定
 public ICollection Equalization(PartsBase parts, bool dummy)
 {
     return(Equalization(parts));
 }
示例#20
0
 /// <summary>
 /// パーツを指定してリンク情報を削除する
 /// </summary>
 /// <param name="parts">削除するパーツ</param>
 public abstract void RemoveEquivalent(PartsBase parts);
示例#21
0
 public override ICollection GetRecordset(PartsBase key)
 {
     return(Const.ZeroCollection);
 }
示例#22
0
 public override void SetEquivalent(RecordBase record, PartsBase parts)
 {
 }
示例#23
0
 /// <summary>
 /// パーツ指定してレコードを取得する
 /// </summary>
 /// <param name="key">パーツ</param>
 /// <returns>レコードのコレクション</returns>
 public abstract ICollection GetRecordset(PartsBase key);
示例#24
0
 /// <summary>
 /// 指定したキーの移動情報を削除する
 /// </summary>
 /// <param name="key">削除する位置情報のパーツ</param>
 public void Remove(PartsBase key)
 {
     base.Remove(key);
 }
示例#25
0
 /// <summary>
 /// パーツを指定して POSを得る
 /// </summary>
 /// <param name="key"></param>
 /// <returns></returns>
 public Pos3 this[PartsBase key] => (Pos3) base[key];
示例#26
0
        /// <summary>
        /// 指定パーツを再描画要求する
        /// </summary>
        /// <param name="parts">再描画するパーツの領域</param>
        /// <param name="rp">指定パーツに属すリッチペーン</param>
        public virtual void Invalidate(PartsBase parts, IRichPane rp)
        {
            var r = ((ScreenRect)parts.GetScRect(rp, parts.Rect).GetPpSize()) & rp.GetPaneRect();

            rp.Invalidate(r);
        }
示例#27
0
 /// <summary>
 /// 初期化コンストラクタ
 /// </summary>
 /// <param name="parts">パーツ</param>
 /// <param name="pane">ペーン</param>
 /// <param name="layerLevel">レベル値</param>
 public PartsEntry(PartsBase parts, IRichPane pane, int layerLevel)
 {
     Parts      = parts;
     Pane       = pane;
     LayerLevel = layerLevel;
 }
示例#28
0
 /// <summary>
 /// データのリンク情報を保存する
 /// </summary>
 /// <param name="record">テーブルのレコード</param>
 /// <param name="parts">パーツ</param>
 public abstract void SetEquivalent(RecordBase record, PartsBase parts);
示例#29
0
 /// <summary>
 /// パーツを追加する
 /// </summary>
 /// <param name="target">主ペーン</param>
 /// <param name="value">追加するパーツ</param>
 /// <param name="layerLevel">パーツのレイヤー(0が最下)</param>
 public virtual void Add(IRichPane target, PartsBase value, int layerLevel)
 {
     _addedParts.Add(new PartsCollectionBase.PartsEntry(value, target, layerLevel));
 }
示例#30
0
 public override void RemoveEquivalent(PartsBase parts)
 {
 }