private static LevelBlockDetails GenerateOrUpdateBlock(Editor ed, Database db, GenerateArgs args) { if (IsNewBlock(ed)) { var endPoint = ed.PromptForPosition(Resources.Command_Prompt_SelectEndPoint); if (!endPoint.HasValue) { return(LevelBlockDetails.CreateEmpty()); } var levelArgs = CreateNewBlockLevelBlockArgs(args, endPoint.Value); return(LevelBlockHelper.NewLevelBlockAtPoint(db, levelArgs)); } var trans = db.TransactionManager.TopTransaction; var existing = LevelBlockHelper.GetPromptedBlockDetails(Resources.Command_Prompt_SelectExistingLevelBlock, ed, trans); if (!existing.IsValid) { return(LevelBlockDetails.CreateEmpty()); } if (args.HasLevel) { return(LevelBlockHelper.UpdateExistingLevelBlock(existing.BlockReference, args.BlockLevel)); } var endLevel = CalculateLevel(args.StartPoint, existing.Point3d, args.StartLevel, args.Gradient); return(LevelBlockHelper.UpdateExistingLevelBlock(existing.BlockReference, endLevel)); }
public static void CalculateLevelFromLevelBlockWithInvert() { HousingExtensionApplication.Current.Logger.LogCommand(typeof(LevelBlockCommands), nameof(CalculateLevelFromLevelBlockWithInvert)); var doc = Application.DocumentManager.MdiActiveDocument; var db = doc.Database; var ed = doc.Editor; using var trans = db.TransactionManager.StartTransaction(); if (!LevelBlockHelper.HasLevelBlock(db)) { throw new ArgumentException(Resources.Exception_NoLevelBlock); } var start = LevelBlockHelper.GetPromptedBlockDetails(Resources.Command_Prompt_SelectStartLevelBlock, ed, trans); if (!start.IsValid) { return; } var invert = ed.PromptForDouble(Resources.Command_Prompt_EnterInvert, _invert); if (!invert.HasValue) { return; //Assume user cancelled } var endLevel = start.Level - invert.Value; var end = GenerateOrUpdateBlock(ed, db, new GenerateArgs(endLevel, start.Rotation, start.Rotate)); if (!end.IsValid) { return; //Assume user cancelled } if (ShouldIncludeGradient(ed)) { GradientBlockHelper.GenerateBlock(db, start, end); } _invert = invert.Value; trans.Commit(); }
public static void CalculateLevelFromPointAtGradient() { HousingExtensionApplication.Current.Logger.LogCommand(typeof(LevelBlockCommands), nameof(CalculateLevelFromPointAtGradient)); var doc = Application.DocumentManager.MdiActiveDocument; var ed = doc.Editor; var db = doc.Database; using var trans = db.TransactionManager.StartTransaction(); if (!LevelBlockHelper.HasLevelBlock(db)) { throw new ArgumentException(Resources.Exception_NoLevelBlock); } var startPoint = ed.PromptForPosition(Resources.Command_Prompt_SelectStartPoint); if (!startPoint.HasValue) { return; //Assume user cancelled } var startLevel = ed.PromptForDouble(Resources.Command_Prompt_EnterLevel, _level); if (!startLevel.HasValue) { return; //Assume user cancelled } var gradient = ed.PromptForDouble(Resources.Command_Prompt_EnterGradient, _gradient); if (!gradient.HasValue) { return; //Assume user cancelled } var endBlock = GenerateOrUpdateBlock(ed, db, new GenerateArgs(startPoint.Value, startLevel.Value, gradient.Value)); if (endBlock == null) { return; //Assume user cancelled } _level = startLevel.Value; _gradient = gradient.Value; trans.Commit(); }
private static void AddBackOfFootwayLevel(double level) { var doc = Application.DocumentManager.MdiActiveDocument; var ed = doc.Editor; var db = doc.Database; using var trans = db.TransactionManager.StartTransaction(); if (!LevelBlockHelper.HasLevelBlock(db)) { throw new ArgumentException(Resources.Exception_NoLevelBlock); } var roadString = SelectRoadString(db, ed); if (roadString == null) { HousingExtensionApplication.Current.Logger.Entry(Resources.Message_No_Road_String_Selected); return; } using (var plane = new Plane(Point3d.Origin, Vector3d.ZAxis)) { var point = ed.PromptForPosition(Resources.Command_Prompt_SelectFootwayPoint); while (point.HasValue) { var roadPoint = roadString.GetClosestPointTo(point.Value, plane.Normal, false); var roadLevel = Math.Round(roadPoint.Z, 3); var footwayLevel = roadLevel + level; LevelBlockHelper.NewLevelBlockAtPoint(db, new LevelBlockArgs(point.Value, footwayLevel)); point = ed.PromptForPosition(Resources.Command_Prompt_SelectFootwayPoint); } } trans.Commit(); }
public static void CalculateLevelBetweenLevels() { HousingExtensionApplication.Current.Logger.LogCommand(typeof(LevelBlockCommands), nameof(CalculateLevelBetweenLevels)); var doc = Application.DocumentManager.MdiActiveDocument; var ed = doc.Editor; var db = doc.Database; using var trans = db.TransactionManager.StartTransaction(); if (!LevelBlockHelper.HasLevelBlock(db)) { throw new ArgumentException(Resources.Exception_NoLevelBlock); } var details = CommandHelper.GetStartEndDetails(ed, trans); if (!details.IsValid) { return; } var s = new Point3d(details.Start.Point2d.X, details.Start.Point2d.Y, 0); var e = new Point3d(details.End.Point2d.X, details.End.Point2d.Y, 0); Point3d?midPoint; using var line = new Line(s, e) { Color = Color.FromRgb(0, 255, 0) }; { var acBlkTbl = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead); var acBlkTblRec = (BlockTableRecord)trans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite); acBlkTblRec.AppendEntity(line); trans.AddNewlyCreatedDBObject(line, true); db.TransactionManager.QueueForGraphicsFlush(); // TODO: Review graphics flush in core console. midPoint = ed.PromptForPosition(Resources.Command_Prompt_SelectMidPoint); while (midPoint.HasValue) { var m = new Point3d(midPoint.Value.X, midPoint.Value.Y, 0); if (line.GetGeCurve().IsOn(m)) { break; } midPoint = ed.PromptForPosition(Resources.Command_Prompt_SelectMidPoint); } line.Erase(); db.TransactionManager.QueueForGraphicsFlush(); // TODO: Review graphics flush in core console. } if (!midPoint.HasValue) { return; //Assume user cancelled } var gradient = 1 / ((details.End.Level - details.Start.Level) / line.Length); var midLevel = CalculateLevel(details.Start.Point3d, midPoint.Value, details.Start.Level, gradient); var args = new LevelBlockArgs(midPoint.Value, midLevel, details.Start.Rotation, details.Start.Rotate); LevelBlockHelper.NewLevelBlockAtPoint(db, args); trans.Commit(); }
public static void GeneratePolyline3dFromLevels() { HousingExtensionApplication.Current.Logger.LogCommand(typeof(PolylineCommands), nameof(GeneratePolyline3dFromLevels)); var doc = Application.DocumentManager.MdiActiveDocument; var ed = doc.Editor; var db = doc.Database; using var trans = db.TransactionManager.StartTransaction(); var initial = LevelBlockHelper.GetPromptedBlockDetails(Resources.Command_Prompt_SelectInitialBlock, ed, trans); if (!initial.IsValid) { return; } var points = new List <Point3d> { initial.Point3d }; var nextLevel = true; var options = new PromptEntityOptions(Resources.Command_Prompt_SelectNextBlock); options.SetRejectMessage(Resources.Command_Prompt_RejectBlockReference); options.AddAllowedClass(typeof(BlockReference), true); options.AppendKeywordsToMessage = true; foreach (var keyword in PolylineOptions) { options.Keywords.Add(keyword); } PromptEntityResult result = null; while (nextLevel) { nextLevel = false; result = ed.GetEntity(options); if (result.Status == PromptStatus.OK) { var details = new LevelBlockDetails(LevelBlockHelper.GetBlockReference(result.ObjectId, trans)); if (!details.IsValid) { HousingExtensionApplication.Current.Logger.Entry(Resources.Message_Invalid_Level_Block_Selected, Severity.Warning); return; } if (points.Any(p => p.Y.Equals(details.Point3d.Y) && p.X.Equals(details.Point3d.X) && p.Z.Equals(details.Point3d.Z))) { HousingExtensionApplication.Current.Logger.Entry(Resources.Message_Block_Already_Selected, Severity.Information); } else { points.Add(details.Point3d); } nextLevel = true; } } var close = false; if (result.Status == PromptStatus.Keyword) { close = result.StringResult == PolylineOptions[0]; } CreatePolyline3dFromPoints(db, points, close); trans.Commit(); }