static List <ElevationBox> BuildElevationBoxesFrom( Transaction transaction, List <ObjectId> boxes, List <ObjectId> labels) { var elevationBoxes = new List <ElevationBox>(); foreach (var box in boxes) { var polyline = transaction.GetObject(box, OpenMode.ForRead) as Polyline; foreach (var label in labels) { var mtext = transaction.GetObject(label, OpenMode.ForRead) as MText; if (mtext == null) { continue; } for (int i = 0; i < polyline.NumberOfVertices; i++) { if (PointExtensions.IsNear(mtext.Location, polyline.GetPoint3dAt(i)) && !elevationBoxes.Exists(b => b.Id == polyline.Id)) { var match = Regex.Match( mtext.Text, @"Elevation (\d+)", RegexOptions.IgnoreCase); if (!match.Success) { continue; } int elevation = int.Parse(match.Groups[1].Value); var b = new ElevationBox(polyline) { Id = polyline.Id, Elevation = elevation }; b.SetSides(polyline); elevationBoxes.Add(b); continue; } } } } return(elevationBoxes); }
public static void Insert(Point3d point) { var boxes = ElevationBox.InsideElevationBoxes(point); if (boxes.Count == 0) { Editor().WriteMessage("\nError! You must insert a riser inside an elevation box."); return; } if (boxes.Count(b => b.FloorTag != null) != 1) { Editor().WriteMessage("\nError! You must insert a floor tag on each floor."); return; } var floorTag = boxes.Select(b => b.FloorTag).Single(); var offset = new Point3d( x: point.X - floorTag.Position.X, y: point.Y - floorTag.Position.Y, 0); var allFloorTags = FloorTag.GetFloorTags(); if (allFloorTags.Count > 10) { Editor().WriteMessage("\nError! LoopCAD cannot handle more than ten floors."); return; } var selectedFloorTags = new List <FloorTag>() { floorTag }; if (allFloorTags.Count > 1) { var pko = new PromptKeywordOptions(""); foreach (var ft in allFloorTags) { if (ft.Name != floorTag.Name) { pko.Keywords.Add($"{allFloorTags.IndexOf(ft)}: {ft.Name}"); } } pko.Message = "\nChoose floor to run riser pipe to "; pko.AllowNone = false; PromptResult result = Editor().GetKeywords(pko); if (result.Status == PromptStatus.OK) { int floorIndex = int.Parse(result.StringResult[0].ToString()); selectedFloorTags.Add(allFloorTags[floorIndex]); } } if (selectedFloorTags.Count != 2) { Editor().WriteMessage("Error! The riser could not be inserted on two floors."); return; } char suffix = (char)((byte)RiserLabel.HighestSuffix() + 1); int number = RiserLabel.HighestNumber() + 1; foreach (var ft in selectedFloorTags) { // This point will be disposed, so clone it var newPoint = new Point3d( x: ft.Position.X + offset.X, y: ft.Position.Y + offset.Y, z: ft.Position.Z + offset.Z); Riser.Insert(newPoint); var labeler = new Labeler( new LabelSpecs { Tag = RiserLabel.TagName, BlockName = RiserLabel.BlockName, Layer = RiserLabel.LayerName, LayerColorIndex = ColorIndices.Cyan, TextHeight = 8.0, XOffset = 15.0, }); labeler.CreateLabel($"R.{number}.{suffix}", position: newPoint); // Number increments, but suffix is shared between the // upper and lower riser, and used to match them. number++; } }