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