zoukankan      html  css  js  c++  java
  • 创建合理位置的线标注

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

    思路很简单,先计算两点的中央点座标,再计算线段的旋转角,最后根据旋转角和标记离线段距离计算出标注点的座标。
    线的正方向为从下往上。负方向则将旋转角加PI。
     1 /// <summary>
     2         /// 计算旋转角
     3         /// </summary>
     4         /// <param name="x1">起点X座标</param>
     5         /// <param name="y1">起点Y座标</param>
     6         /// <param name="x2">终点X座标</param>
     7         /// <param name="y2">终点Y座标</param>
     8         /// <returns>旋转角</returns>
     9         private double CountRotation(double x1, double y1, double x2, double y2)
    10         {
    11             double rotation = 0;
    12             //两点重合
    13             if (y2==y1 && x2== x1)
    14             {
    15                 rotation = 0;
    16             }
    17             else
    18             {
    19                 //两点在水平线上
    20                 if (y2 == y1)
    21                 {
    22                     if (x2 > x1)
    23                     {
    24                         rotation = 0;
    25                     }
    26                     else
    27                     {
    28                         rotation = Math.PI;
    29                     }
    30                 }
    31                 //两点在垂直线上
    32                 if (x2==x1)
    33                 {
    34                     if (y2>y1)
    35                     {
    36                         rotation = Math.PI / 2;
    37                     }
    38                     else
    39                     {
    40                         rotation = Math.PI / 2 + Math.PI;
    41                     }
    42                 }
    43                 //一般情况
    44                 if (y2!=y1 && x2!= x1)
    45                 {
    46                     double k = k = (y2 - y1) / (x2 - x1);
    47                     //第一象限
    48                     if (y2>y1 && x2> x1)
    49                     {
    50                         rotation = Math.Atan(k);
    51                     }
    52                     //第二象限
    53                     if (y2>y1 && x2<x1)
    54                     {
    55                         rotation = Math.Atan(k) + Math.PI;
    56                     }
    57                     //第三象限
    58                     if (y2<y1 && x2<x1)
    59                     {
    60                         rotation = Math.Atan(k) + Math.PI;
    61                     }
    62                     //第四象限
    63                     if (y2<y1 && x2>x1)
    64                     {
    65                         rotation = Math.Atan(k)+2*Math.PI;
    66                     }
    67                 }
    68             }
    69             return rotation;
    70         }

    代码如下:
    /// <summary>
            
    /// 生成线标注
            
    /// </summary>
            
    /// <param name="x">中央点X</param>
            
    /// <param name="y">中央点Y</param>
            
    /// <param name="z">中央点Z</param>
            
    /// <param name="text">标注文字</param>
            
    /// <returns>ObjectId</returns>
            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;
            }
  • 相关阅读:
    临时禁用大型列表上的列表视图阈值
    临时禁用大型列表上的列表视图阈值
    SharePoint Foundation 2010 托管客户端对象模型概述 创建 Windows 控制台托管的客户端对象模型应用程序
    如何隐藏MOSS2010的网站操作菜单
    MOSS2010的列表视图参数设置以及列表记录样式设置
    使用SharePoint Server 2010搜索PDF文档
    Sharepoint2010如何使用Linq to Sharepoint
    水晶報表字段超鏈結4/28
    4月21自考4/23
    [轉]統籌方法華羅庚
  • 原文地址:https://www.cnblogs.com/figo/p/1130612.html
Copyright © 2011-2022 走看看