惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿
博客园 - 聂微东
V
Visual Studio Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
M
MIT News - Artificial intelligence
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
L
LangChain Blog
I
InfoQ
T
Tailwind CSS Blog
博客园 - 【当耐特】
V
V2EX
博客园_首页
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
GbyAI
GbyAI
Vercel News
Vercel News
雷峰网
雷峰网
量子位
A
About on SuperTechFans
Martin Fowler
Martin Fowler
H
Help Net Security

博客园 - 费哥

VC++实现应用程序对插件的支持(转) typedef的四个用途和两个陷阱(转) c#动态创建ODBC数据源 设为首页,加入收藏,联系我们 - 费哥 - 博客园 ASP.NET 2.0中CSS失效 ADO.NET更新ACCESS碰到的怪异问题 DataGrid中的數據輸出到Excel 对 Windows 窗体控件进行线程安全调用 将参数传递给线程(Vc#2005) Sql2005导出SQL2000格式的脚本 c#枚举的用法及遍历方法 将外部图块插入当前图形(c#代码) 无法将顶级控件添加到控件 使用Microsoft Visual Studio2005开发ObjectARX设置 CS1595:已在多处定义 软件设计师考试大纲 <<设计模式可复用面向对象软件的基础>>--组合模式(Composite) <<设计模式可复用面向对象软件的基础>>--设计模式怎样解决设计问题 <<设计模式可复用面向对象软件的基础>>读书笔记--(第一章)引言
创建合理位置的线标注
费哥 · 2008-04-01 · via 博客园 - 费哥

有时候在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;
        }