Ejemplo n.º 1
0
        public List <AcadDB.Entity> Draw()
        {
            List <AcadDB.Entity> ents = new List <AcadDB.Entity>();

            if (0 == steel_pos.Count)
            {
                return(ents);
            }

            AcadGeo.Point3d tmp_line = steel_pos[0];
            foreach (var sp in steel_pos)
            {
                AcadDB.Line line = new AcadDB.Line();
                line.StartPoint = sp + length_line * AcadGeo.Vector3d.XAxis + length_line * AcadGeo.Vector3d.YAxis;
                line.EndPoint   = sp - length_line * AcadGeo.Vector3d.XAxis - length_line * AcadGeo.Vector3d.YAxis;
                ents.Add(line);

                if (position.DistanceTo(sp) > position.DistanceTo(tmp_line))
                {
                    tmp_line = sp;
                }
            }
            ents.Add(new AcadDB.Line(position, tmp_line));

            ents.Add(new AcadDB.Circle(position - AcadGeo.Vector3d.XAxis * cir_radius, AcadGeo.Vector3d.ZAxis, cir_radius));

            //Draw number
            {
                AcadDB.DBText text = new AcadDB.DBText();
                text.TextString     = number.ToString();
                text.Justify        = AcadDB.AttachmentPoint.MiddleCenter;
                text.Height         = text_height;
                text.WidthFactor    = text_w_factor;
                text.AlignmentPoint = position - AcadGeo.Vector3d.XAxis * cir_radius;
                ents.Add(text);
            }

            //draw content
            {
                AcadDB.DBText text = new AcadDB.DBText();
                text.TextString     = content;
                text.Justify        = AcadDB.AttachmentPoint.BottomLeft;
                text.Height         = text_height;
                text.WidthFactor    = text_w_factor;
                text.AlignmentPoint = position + AcadGeo.Vector3d.XAxis * 10.0 + AcadGeo.Vector3d.YAxis * 10.0;
                ents.Add(text);
            }

            return(ents);
        }
Ejemplo n.º 2
0
        public List <AcadDB.Entity> Draw()
        {
            AcadGeo.Line3d xline = new AcadGeo.Line3d(position, AcadGeo.Vector3d.XAxis);

            List <AcadDB.Entity> ents = new List <AcadDB.Entity>();

            AcadGeo.Point3d pnt = new AcadGeo.Point3d(position.X, position.Y, position.Z);
            foreach (var sp in steel_pos)
            {
                AcadGeo.Line3d    steel_line       = new AcadGeo.Line3d(sp, new AcadGeo.Vector3d(Math.Sin(angle), Math.Cos(angle), 0.0));
                AcadGeo.Point3d[] intersected_pnts = xline.IntersectWith(steel_line);

                if (intersected_pnts.Length > 0)
                {
                    ents.Add(new AcadDB.Line(intersected_pnts[0], sp));
                    if (intersected_pnts[0].DistanceTo(position) > pnt.DistanceTo(position))
                    {
                        pnt = intersected_pnts[0];
                    }
                }
            }

            ents.Add(new AcadDB.Line(position, pnt));

            ents.Add(new AcadDB.Circle(position - AcadGeo.Vector3d.XAxis * cir_radius, AcadGeo.Vector3d.ZAxis, cir_radius));

            //draw value
            {
                AcadDB.DBText text = new AcadDB.DBText();
                text.TextString     = number.ToString();
                text.Justify        = AcadDB.AttachmentPoint.MiddleCenter;
                text.Height         = text_height;
                text.WidthFactor    = text_w_factor;
                text.AlignmentPoint = position - AcadGeo.Vector3d.XAxis * cir_radius;
                ents.Add(text);
            }

            //draw content
            {
                AcadDB.DBText text = new AcadDB.DBText();
                text.TextString     = content;
                text.Justify        = AcadDB.AttachmentPoint.BottomLeft;
                text.Height         = text_height;
                text.WidthFactor    = text_w_factor;
                text.AlignmentPoint = position + AcadGeo.Vector3d.XAxis * 10.0 + AcadGeo.Vector3d.YAxis * 10.0;
                ents.Add(text);
            }

            return(ents);
        }
Ejemplo n.º 3
0
        //open -> opened -> modified -> (1) tr.Dispose() -> closed   -> (2) closed    (

        public void ClosedHandler(object sender, AcadDb.ObjectClosedEventArgs args)
        {
            using (var tr = AcadFuncs.GetActiveDb().TransactionManager.StartOpenCloseTransaction())
            {
                AcadDb.BlockTableRecord model_space = AcadFuncs.GetModelSpace(tr);
                model_space.UpgradeOpen();

                AcadDb.DBText text = new AcadDb.DBText();
                text.Position   = curr_pl.StartPoint;
                text.TextString = curr_pl.Length.ToString();

                model_space.AppendEntity(text);
                tr.AddNewlyCreatedDBObject(text, true);
                tr.Commit();
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 根据参数绘制边坡。
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        public static AcDb.Entity[] MakeBianpo(BpDesignView param)
        {
            var result = new List <AcDb.Entity>();
            var db     = AcAp.Application.DocumentManager.MdiActiveDocument.Database;

            // 边坡顶点。
            var vertexes = new List <Point2d>();

            // 线路顶部。
            vertexes.Add(new Point2d(-param.Lujiankuan * 0.5, 0));
            vertexes.Add(new Point2d(param.Lujiankuan * 0.5, 0));

            // 路肩宽标注。
            result.Add(new AcDb.AlignedDimension(
                           new Point3d(-param.Lujiankuan * 0.5, 1, 0),
                           new Point3d(param.Lujiankuan * 0.5, 1, 0),
                           new Point3d(0, 1.5, 0), null, AcDb.ObjectId.Null));

            // 路肩高程标记。
            var lujianTriangle = EntityHelper.CreatePolygon(new[]
            {
                -param.Lujiankuan * 0.5, 0,
                -param.Lujiankuan * 0.5 + 0.2, 0.4,
                -param.Lujiankuan * 0.5 - 0.2, 0.4,
            });

            result.Add(lujianTriangle);
            result.Add(lujianTriangle.GetTransformedCopy(
                           AcGe.Matrix3d.Displacement(Vector3d.XAxis * param.Lujiankuan)));

            // 路肩高程文字。
            var lujianHeight = new AcDb.DBText();

            lujianHeight.SetDatabaseDefaults(db); // 重要!
            lujianHeight.TextString     = param.Lujiangaocheng.ToString("0.##");
            lujianHeight.HorizontalMode = AcDb.TextHorizontalMode.TextCenter;
            lujianHeight.AlignmentPoint = new Point3d(-param.Lujiankuan * 0.5, 0.5, 0);
            lujianHeight.AdjustAlignment(db); // 重要!
            result.Add(lujianHeight);
            result.Add(lujianHeight.GetTransformedCopy(
                           AcGe.Matrix3d.Displacement(Vector3d.XAxis * param.Lujiankuan)));

            // 一级边坡。
            var yijipogao = param.HasErjibianpo ? param.Yijipogao :
                            (param.Lujiangaocheng - param.Churukougaocheng);

            vertexes.Insert(0, vertexes.First() +
                            new Vector2d(-yijipogao * param.Yijipolv, -yijipogao));
            vertexes.Add(vertexes.Last() +
                         new Vector2d(yijipogao * param.Yijipolv, -yijipogao));

            // 一级边坡坡率。
            var yjbppl = new AcDb.DBText();

            yjbppl.SetDatabaseDefaults(db); // 重要!
            yjbppl.TextString     = "1:" + param.Yijipolv.ToString("0.##");
            yjbppl.HorizontalMode = AcDb.TextHorizontalMode.TextCenter;
            var yjbppl1 = yjbppl.Clone() as AcDb.DBText; // 右侧对称。

            yjbppl.AlignmentPoint = new Point3d(
                -(param.Lujiankuan + yijipogao * param.Yijipolv) * 0.5,
                -yijipogao * 0.5 + 0.1, 0);
            yjbppl.Rotation = Math.Atan2(1, param.Yijipolv);
            yjbppl.AdjustAlignment(db); // 重要!
            result.Add(yjbppl);
            yjbppl1.AlignmentPoint = new Point3d(
                (param.Lujiankuan + yijipogao * param.Yijipolv) * 0.5,
                -yijipogao * 0.5 + 0.1, 0);
            yjbppl1.Rotation = -Math.Atan2(1, param.Yijipolv);
            yjbppl1.AdjustAlignment(db); // 重要!
            result.Add(yjbppl1);

            // 一级边坡宽度标注。
            result.Add(new AcDb.AlignedDimension(
                           new Point3d(-param.Lujiankuan * 0.5, 1, 0),
                           new Point3d(-param.Lujiankuan * 0.5 - yijipogao * param.Yijipolv, 1, 0),
                           new Point3d(0, 1.5, 0), null, AcDb.ObjectId.Null));
            result.Add(new AcDb.AlignedDimension(
                           new Point3d(param.Lujiankuan * 0.5, 1, 0),
                           new Point3d(param.Lujiankuan * 0.5 + yijipogao * param.Yijipolv, 1, 0),
                           new Point3d(0, 1.5, 0), null, AcDb.ObjectId.Null));

            // 二级边坡。
            if (param.HasErjibianpo)
            {
                // 1米加宽平台。
                vertexes.Insert(0, vertexes.First() + new Vector2d(-1, 0));
                vertexes.Add(vertexes.Last() + new Vector2d(1, 0));
                // 标注。
                result.Add(new AcDb.AlignedDimension(
                               new Point3d(vertexes[0].X, vertexes[0].Y, 0),
                               new Point3d(vertexes[1].X, vertexes[1].Y, 0),
                               new Point3d(0, 1.5, 0), null, AcDb.ObjectId.Null));
                result.Add(new AcDb.AlignedDimension(
                               new Point3d(vertexes[vertexes.Count - 1].X, vertexes[vertexes.Count - 1].Y, 0),
                               new Point3d(vertexes[vertexes.Count - 2].X, vertexes[vertexes.Count - 2].Y, 0),
                               new Point3d(0, 1.5, 0), null, AcDb.ObjectId.Null));

                // 二级边坡。
                var erjipogao = param.HasSanjibianpo ? param.Erjipogao :
                                (param.Lujiangaocheng - param.Churukougaocheng - yijipogao);
                vertexes.Insert(0, vertexes.First() +
                                new Vector2d(-erjipogao * param.Erjipolv, -erjipogao));
                vertexes.Add(vertexes.Last() +
                             new Vector2d(erjipogao * param.Erjipolv, -erjipogao));

                // 二级边坡坡率。
                var ejbppl = new AcDb.DBText();
                ejbppl.SetDatabaseDefaults(db); // 重要!
                ejbppl.TextString     = "1:" + param.Erjipolv.ToString("0.##");
                ejbppl.HorizontalMode = AcDb.TextHorizontalMode.TextCenter;
                var ejbppl1 = ejbppl.Clone() as AcDb.DBText; // 右侧对称。
                ejbppl.AlignmentPoint = new Point3d(
                    -param.Lujiankuan * 0.5 - yijipogao * param.Yijipolv
                    - 1 - erjipogao * param.Erjipolv * 0.5,
                    -yijipogao - erjipogao * 0.5 + 0.1, 0);
                ejbppl.Rotation = Math.Atan2(1, param.Erjipolv);
                ejbppl.AdjustAlignment(db); // 重要!
                result.Add(ejbppl);
                ejbppl1.AlignmentPoint = new Point3d(
                    param.Lujiankuan * 0.5 + yijipogao * param.Yijipolv
                    + 1 + erjipogao * param.Erjipolv * 0.5,
                    -yijipogao - erjipogao * 0.5 + 0.1, 0);
                ejbppl1.Rotation = -Math.Atan2(1, param.Erjipolv);
                ejbppl1.AdjustAlignment(db); // 重要!
                result.Add(ejbppl1);

                // 二级边坡宽度标注。
                result.Add(new AcDb.AlignedDimension(
                               new Point3d(-param.Lujiankuan * 0.5 - yijipogao * param.Yijipolv - 1, 1, 0),
                               new Point3d(-param.Lujiankuan * 0.5 - yijipogao * param.Yijipolv - 1
                                           - erjipogao * param.Erjipolv, 1, 0),
                               new Point3d(0, 1.5, 0), null, AcDb.ObjectId.Null));
                result.Add(new AcDb.AlignedDimension(
                               new Point3d(param.Lujiankuan * 0.5 + yijipogao * param.Yijipolv + 1, 1, 0),
                               new Point3d(param.Lujiankuan * 0.5 + yijipogao * param.Yijipolv + 1
                                           + erjipogao * param.Erjipolv, 1, 0),
                               new Point3d(0, 1.5, 0), null, AcDb.ObjectId.Null));
            }

            // TODO 三级边坡。

            result.Add(EntityHelper.CreatePolygon(
                           vertexes.SelectMany(p2d => p2d.ToArray()).ToArray(),
                           closed: false));

            return(result.ToArray());
        }