using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using DYH.Tools;
using IFoxCAD.Cad;
namespace DYH.Action
{
public class BiHeMianJi
{
private static double textHeight = 300;//定义一个变量来储存文字高度方便修改
//今天来搞一个标注闭合区域面积的功能
[CommandMethod("BHMJ")]
public void BHMJ()
{
using (var tr = new DBTrans())
{
if (!tr.LayerTable.Has("面积")) tr.LayerTable.Add("面积", 1);//先创建一个图层用来放置边界线与面积//少了个叹号,应该是没有图层的时候创建图层
}
while (true)//循环放置
{
var ppo1 = new PromptPointOptions("\n请选择闭合区域内部或[设置文字高度(D)]") { AllowNone = true };//设置获取坐标选项
ppo1.Keywords.Add("D");//加入关键字D
var r1 = Env.Editor.GetPoint(ppo1);//提示用户获取坐标
if (r1.Status == PromptStatus.OK)//如果用户正确选择坐标
{
//如果用户正确选择坐标执行以下操作
var pt1 = r1.Value.Wcs2Ucs();//拿到用户选择的坐标
var dbc = Env.Editor.TraceBoundary(pt1,false);//根据坐标获取到边界线集合,(false为不进行孤岛检测)
if (dbc.Count == 1)//如果成功检测到边界线,会得到1条曲线,判断数量是否为1(因为不进行孤岛检测所以只能是1或者0)
{
if(dbc[0] is Curve cur && cur.Closed)//以防万一再判断一下dbc里的对象是不是闭合曲线
{
cur.Layer = "面积"; //设置图层
var area = cur.Area / 1e6;//获取面积,单位平方毫米转为平方米除以10的6次方
var midpt = cur.GetBoxMidPoint();//获取闭合区域的包围盒中点坐标,为了吧文字放在这里
var text1 = new DBText()//创建一个文字
{
TextString = "面积:" + area.ToString("0.00") + "m²",//设置文字内容//这里没有保留两位小数导致小数点位数过多
Height = textHeight,//文字高度
Position = midpt,//插入点
VerticalMode=TextVerticalMode.TextVerticalMid,//设置对齐方式为正中
HorizontalMode=TextHorizontalMode.TextCenter,
AlignmentPoint=midpt,//设置对齐点
WidthFactor=0.7,//设置宽度因子
Layer="面积",//设置图层
};
using (var tr = new DBTrans())//建事务
{
tr.CurrentSpace.AddEntity(cur, text1);//将边界线和文字加入到图纸中
}
}
}
}
else if (r1.Status == PromptStatus.Keyword)//如果用户输入了关键字
{
switch (r1.StringResult)
{
case "D":
var r2 = Env.Editor.GetDouble("\n输入文字高度<" + textHeight + ">");//提示用户设置文字高度
if (r2.Status == PromptStatus.OK && r2.Value > 0) textHeight = r2.Value;//如果用户正确输入且数字大于0,将文字高度赋值
break;
}
}
else return;//其他情况退出程序
}
}
}
}