Exemple #1
0
        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));
        }
Exemple #2
0
        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();
        }
Exemple #3
0
        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();
        }
Exemple #4
0
        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();
        }
Exemple #5
0
        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();
        }
Exemple #6
0
        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();
        }