默认头像
捉鬼专家
捉鬼专家
  • 注册日期2004-08-13
  • 发帖数552
  • QQ
  • 铜币2462枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2015回复:0

创建合理位置的线标注

楼主#
更多 发布于:2008-04-01 23:33

有时候在AutoCad成图的过程中,需要为线创建合理位置的标注,这个合理位置不同的人可能有不同的理解,或者是不同的项目有不同的需要,就看个人所需了。我这里的合理位置其实就是标注顺着线的方向,标注底部与线有适当的距离,标注的总体位置居于线段的中央。如图:

思路很简单,先计算两点的中央点座标,再计算线段的旋转角,最后根据旋转角和标记离线段距离计算出标注点的座标。
线的正方向为从下往上。负方向则将旋转角加PI。
代码如下:

///
       /// 计算旋转角
       ///

       /// 起点X座标
       /// 起点Y座标
       /// 终点X座标
       /// 终点Y座标
       /// 旋转角
       private double CountRotation(double x1,double y1,double x2,double y2)
       {
           double rotation = 0;
           double k = 0;
           if (x2 == x1)
           {
               k = 1;
               rotation = Math.PI / 2;
           }
           else
           {
               k = (y2 - y1) / (x2 - x1);
               if (k>=0)
               {
                   rotation = Math.Atan(k);
               }
               else
               {
                   rotation = Math.Atan(k)+Math.PI;
               }
           }
           
           return rotation;
       }
///
       /// 生成线标注
       ///

       /// 中央点X
       /// 中央点Y
       /// 中央点Z
       /// 标注文字
       /// ObjectId
       private ObjectId CreateLineText(double x,double y,double z,double rotation, string text)
       {
           ObjectId textId;
           Database db = HostApplicationServices.WorkingDatabase;
           using (Transaction trans = db.TransactionManager.StartTransaction())
           {
               BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead, false);
               BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);
               Point3d point = new Point3d(x - 0.5 * Math.Sin(rotation), y + 0.5 * Math.Cos(rotation), z);
               DBText objDBText = new DBText();
               //HorizontalMode与VerticalMode非默认值时设置AlignmentPoint
               objDBText.HorizontalMode = TextHorizontalMode.TextCenter;
               objDBText.AlignmentPoint = point;
               objDBText.Rotation = rotation;
               objDBText.TextString = text;
               objDBText.Height = 1;
               textId = btr.AppendEntity(objDBText);
               trans.AddNewlyCreatedDBObject(objDBText, true);
               trans.Commit();
           }
           return textId;
       }
喜欢0 评分0
A friend is never known till a man has need. ...CL
默认头像

返回顶部