阅读:1981回复:0
创建合理位置的线标注
<P>有时候在AutoCad成图的过程中,需要为线创建合理位置的标注,这个合理位置不同的人可能有不同的理解,或者是不同的项目有不同的需要,就看个人所需了。我这里的合理位置其实就是标注顺着线的方向,标注底部与线有适当的距离,标注的总体位置居于线段的中央。如图:<BR><IMG src="http://www.cnblogs.com/images/cnblogs_com/figo/5.jpg" border=0><BR>思路很简单,先计算两点的中央点座标,再计算线段的旋转角,最后根据旋转角和标记离线段距离计算出标注点的座标。<BR>线的正方向为从下往上。负方向则将旋转角加PI。<BR>代码如下: </P>
<DIV >/// <summary><BR> /// 计算旋转角<BR> /// </summary><BR> /// <param name="x1">起点X座标</param><BR> /// <param name="y1">起点Y座标</param><BR> /// <param name="x2">终点X座标</param><BR> /// <param name="y2">终点Y座标</param><BR> /// <returns>旋转角</returns><BR> private double CountRotation(double x1,double y1,double x2,double y2)<BR> {<BR> double rotation = 0;<BR> double k = 0;<BR> if (x2 == x1)<BR> {<BR> k = 1;<BR> rotation = Math.PI / 2;<BR> }<BR> else<BR> {<BR> k = (y2 - y1) / (x2 - x1);<BR> if (k>=0)<BR> {<BR> rotation = Math.Atan(k);<BR> }<BR> else<BR> {<BR> rotation = Math.Atan(k)+Math.PI;<BR> }<BR> }<BR> <BR> return rotation;<BR> }</DIV> <DIV >/// <summary><BR> /// 生成线标注<BR> /// </summary><BR> /// <param name="x">中央点X</param><BR> /// <param name="y">中央点Y</param><BR> /// <param name="z">中央点Z</param><BR> /// <param name="text">标注文字</param><BR> /// <returns>ObjectId</returns><BR> private ObjectId CreateLineText(double x,double y,double z,double rotation, string text)<BR> {<BR> ObjectId textId;<BR> Database db = HostApplicationServices.WorkingDatabase;<BR> using (Transaction trans = db.TransactionManager.StartTransaction())<BR> {<BR> BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead, false);<BR> BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false);<BR> Point3d point = new Point3d(x - 0.5 * Math.Sin(rotation), y + 0.5 * Math.Cos(rotation), z);<BR> DBText objDBText = new DBText();<BR> //HorizontalMode与VerticalMode非默认值时设置AlignmentPoint<BR> objDBText.HorizontalMode = TextHorizontalMode.TextCenter;<BR> objDBText.AlignmentPoint = point;<BR> objDBText.Rotation = rotation;<BR> objDBText.TextString = text;<BR> objDBText.Height = 1;<BR> textId = btr.AppendEntity(objDBText);<BR> trans.AddNewlyCreatedDBObject(objDBText, true);<BR> trans.Commit();<BR> }<BR> return textId;<BR> }</DIV> |
|
|