Пример #1
0
        private void LoadCadObjectContainer()
        {
            WindowController2.BringAutoCadToTop();

            this.currentDwg = Drawing.GetCurrent();
            if (!this.currentDwg.FileName.Contains("Individual"))
            {
                throw new ApplicationException("Please first make, and select the Individual plan.");
            }

            AutoCad.Command.Prepare();
            AutoCad.Command.SetCurrentLayoutToModel();

            //こっちの方が多分楽なので
            this.container = new CadObjectContainer(new List <Drawing>()
            {
                this.currentDwg
            },
                                                    CadObjectTypes.RoomOutline |
                                                    CadObjectTypes.Symbol |
                                                    CadObjectTypes.HouseOutline |
                                                    CadObjectTypes.Clip
                                                    );

            this.container.FillSymbolRooms();
            this.container.FillIsOutsideAndIsOutdoor();
        }
        //JBOXシンボルがJB-D間に接続されていない場合エラー
        public static void WarnJboxConnection(CadObjectContainer container)
        {
            var messageId = @"There is a JC, JCL, JCT which has no wire to JB-D/JB-DA.";
            var validator = new Validator();

            validator.Validate = delegate()
            {
                var errors = new List <Symbol>();
                foreach (var symbol in container.Symbols)
                {
                    if (symbol.IsJBox == false &&
                        symbol.Equipment.Name != Const.EquipmentName.JC &&
                        symbol.Equipment.Name != Const.EquipmentName.JCL &&
                        symbol.Equipment.Name != Const.EquipmentName.JCT)
                    {
                        continue;
                    }

                    if (!container.JboxWires.Exists(p => p.IsConnected(symbol)))
                    {
                        errors.Add(symbol);
                    }
                }

                var jboxSymbols = container.GetWiredJboxSymbols();
                foreach (var parent in jboxSymbols)
                {
                    if (parent.Children.Count == 0)
                    {
                        errors.Add(parent);
                    }

                    foreach (var child in parent.Children)
                    {
                        if (child.Parent == null)
                        {
                            errors.Add(child);
                        }
                        else if (child.Parent.IsJBox == false ||
                                 (child.Equipment.Name != Const.EquipmentName.JC &&
                                  child.Equipment.Name != Const.EquipmentName.JCL &&
                                  child.Equipment.Name != Const.EquipmentName.JCT))
                        {
                            errors.Add(parent);
                            errors.Add(child);
                        }
                    }
                }

                if (errors.Count == 0)
                {
                    return(null);
                }

                var error = new ErrorDialog(messageId, 0);
                errors.ForEach(p => error.AddInfo(p));
                return(error);
            };

            validator.Run(messageId);
        }
        //特定のシンボルがパターンの中心から一定距離空いていなければエラー
        //加工依頼後だと、チェッカーが確認済みのためエラーを表示させる必要はない。7/28中山
        public static void ValidateFireAlarmDistance(CadObjectContainer container)
        {
            var messageId = @"There is the symbol which is too near to a fire alarm.";
            var validator = new Validator();

            validator.Validate = delegate()
            {
                if (Static.Drawing.Prefix == "HJA" || Static.Drawing.Prefix == "HZA")
                {
                    return(null);
                }

                var errors     = new List <Symbol>();
                var errorTexts = new List <TextObject>();

                foreach (var pattern in container.IgnoreSymbols)
                {
                    //パターンの中心にある火災報知機シンボルを探す
                    var alarm = container.Symbols.Find(p => p.Floor == pattern.Floor &&
                                                       p.Room == pattern.Room &&
                                                       p.Equipment.Block.FileName.Contains("FireAlarm") && //火災報知機を一発で拾う方法がないのでやむなく・・・
                                                       p.Contains(pattern.Position));

                    //Supply Air, Nano Electric, circulator
                    var validateTexts = container.Texts.FindAll(p => p.Floor == pattern.Floor &&
                                                                p.Room == pattern.Room &&
                                                                !p.Text.Contains(" ") &&
                                                                (p.Text.StartsWith("NE") || p.Text == Const.Text.サーキュレーター || p.Text == Const.Text.サーキュレーター));

                    //Aircon
                    var airconTexts = container.Texts.FindAll(p => p.Floor == pattern.Floor &&
                                                              p.Room == pattern.Room &&
                                                              !p.Text.Contains(" ") &&
                                                              (p.Text.StartsWith("AC")));
                    //AC①~AC⑳までをエアコンとして判定する
                    foreach (var aircon in airconTexts)
                    {
                        if (aircon.Text.Length < 3)
                        {
                            continue;
                        }

                        var wk = Convert.ToInt32(aircon.Text.Substring(2, 1)[0]);
                        if (wk < 9312 || wk > 9331)
                        {
                            continue;
                        }

                        validateTexts.Add(aircon);
                    }

                    //SAテキスト
                    var saTexts = container.Texts.FindAll(p => p.Floor == pattern.Floor &&
                                                          p.Room == pattern.Room &&
                                                          !p.Text.Contains(" ") &&
                                                          p.Text.Contains("SA"));

                    foreach (var sa in saTexts)
                    {
                        Regex regex = new System.Text.RegularExpressions.Regex(@"SA\d");
                        if (regex.IsMatch(sa.Text))
                        {
                            validateTexts.Add(sa);
                        }
                    }

                    foreach (var text in validateTexts)
                    {
                        var rotate = AutoCad.Db.Text.GetRotation(text.ObjectId) / Math.PI * 180;
                        int rad    = 0;

                        var width    = AutoCad.Db.Text.GetWidth(text.ObjectId);
                        var height   = AutoCad.Db.Text.GetHeight(text.ObjectId);
                        var position = AutoCad.Db.Text.GetPosition(text.ObjectId);

                        //回転角とサイズから四隅を取得する
                        var points = new List <PointD>();
                        if (Int32.TryParse(rotate.ToString(), out rad))
                        {
                            switch (rad)
                            {
                            case 0:
                                points.Add(new PointD(position.X, position.Y + height));
                                points.Add(new PointD(position.X + width, position.Y + height));
                                points.Add(new PointD(position.X + width, position.Y));
                                break;

                            case 90:
                                points.Add(new PointD(position.X, position.Y + height));
                                points.Add(new PointD(position.X - width, position.Y));
                                points.Add(new PointD(position.X - width, position.Y + height));
                                break;

                            case 180:
                                points.Add(new PointD(position.X - width, position.Y));
                                points.Add(new PointD(position.X - width, position.Y - height));
                                points.Add(new PointD(position.X, position.Y - height));
                                break;

                            case 270:
                                points.Add(new PointD(position.X, position.Y - height));
                                points.Add(new PointD(position.X + width, position.Y - height));
                                points.Add(new PointD(position.X + width, position.Y));
                                break;

                            default:
                                break;
                            }
                        }
                        points.Add(position);

                        foreach (var point in points)
                        {
                            var checkDistance = Edsa.AutoCadProxy.Calc.GetDistance(point, pattern.Position);
                            if (1500 > checkDistance)
                            {
                                errorTexts.Add(text);
                                break;
                            }
                        }
                    }

                    //壁付きのときは照明をチェックしない
                    if (alarm != null)
                    {
                        if (alarm.OtherAttributes.Exists(p => p.Value == Const.Text.壁付))
                        {
                            continue;
                        }
                    }

                    var validateSymbols = container.Symbols.FindAll(p => p.Floor == pattern.Floor &&
                                                                    p.Room == pattern.Room &&
                                                                    (p.Equipment.Name == Const.EquipmentName.照明 ||
                                                                     p.Equipment.Name == Const.EquipmentName.照明_01 ||
                                                                     p.Equipment.Name == Const.EquipmentName.照明_02 ||
                                                                     p.Equipment.Name == Const.EquipmentName.照明_05 ||
                                                                     p.Equipment.Name == Const.EquipmentName.照明_30));

                    foreach (var symbol in validateSymbols)
                    {
                        double distance;
                        switch (symbol.Equipment.Name)
                        {
                        case Const.EquipmentName.照明:
                            distance = 300;
                            break;

                        case Const.EquipmentName.照明_01:
                            distance = 700;
                            break;

                        case Const.EquipmentName.照明_02:
                            distance = 300;
                            break;

                        case Const.EquipmentName.照明_05:
                            distance = 700;
                            break;

                        case Const.EquipmentName.照明_30:
                            distance = 700;
                            break;

                        default:
                            continue;
                        }

                        //シンボルは基点だけをチェックする
                        var points = new List <PointD>();
                        points.Add(symbol.Position);
                        //points.Add(new PointD(symbol.PositionBottomLeft.X, symbol.PositionBottomLeft.Y));
                        //points.Add(new PointD(symbol.PositionTopRight.X, symbol.PositionBottomLeft.Y));
                        //points.Add(new PointD(symbol.PositionBottomLeft.X, symbol.PositionTopRight.Y));
                        //points.Add(new PointD(symbol.PositionTopRight.X, symbol.PositionTopRight.Y));

                        foreach (var point in points)
                        {
                            var checkDistance = Edsa.AutoCadProxy.Calc.GetDistance(point, pattern.Position);
                            if (distance > checkDistance)
                            {
                                errors.Add(symbol);
                                break;
                            }
                        }
                    }
                }

                if (errors.Count == 0 && errorTexts.Count == 0)
                {
                    return(null);
                }

                var error = new ErrorDialog(messageId);
                errors.ForEach(p => error.AddInfo(p));
                errorTexts.ForEach(p => error.AddInfo(p));
                return(error);
            };

            validator.Run(messageId);
        }