using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Windows;
using DYH.Tools;
using IFoxCAD.Cad;
using System.Collections.Generic;
using Acap = Autodesk.AutoCAD.ApplicationServices.Application;
namespace DYH.Action._03.递增编号
{
public class DiZengBianHao
{
private static double textHeight = 300;//存放一个变量用于存储字高以便进行修改
//递增编号
[CommandMethod("DZBH")]
public void DZBH()
{
var form = new DZBHForm();//建窗体
form.Location = Acap.MainWindow.GetLocation();//窗体左上角设置为cad窗体左上角
form.Show();//打开窗体(此时焦点会被新打开的窗体夺走)
Win32Api.SetFocus(Acap.MainWindow.Handle);//再将窗体焦点设置回cad
try
{
while (true)//循环放置
{
//建拖拽类
var j1 = new JigEx((mouthPoint, drawEntities) =>
{
var text = new DBText()//建一个单行文字
{
TextString = DZBHForm.Qz + DZBHForm.number.ToString("00") + DZBHForm.Hz,//设置文字内容
TextStyleId = Env.Database.Textstyle,//文字样式设置为当前图纸文字样式
Height = textHeight,//文字高度
Position = mouthPoint,//插入点
VerticalMode = TextVerticalMode.TextVerticalMid,//对齐方式
HorizontalMode = TextHorizontalMode.TextCenter,
AlignmentPoint = mouthPoint,//对齐点
};
//由于拖拽文字点为左下角,想将其视觉效果设置为中心需要进行计算
var midPoint=text.GetBoxMidPoint();//获取包围盒中点
text.Position = new Point3d(2 * mouthPoint.X - midPoint.X, 2 * mouthPoint.Y - midPoint.Y, 0);//计算相对中心点的插入点位置
drawEntities.Enqueue(text);//文字加入拖拽队列
});
j1.SetOptions("\n选择编号位置s", new Dictionary<string, string>() { { "S", "设置文字高度(S)" } });//设置用户提示文字和关键字选项用来修改文字高度
var r1 = j1.Drag();//开始拖拽
if (r1.Status == PromptStatus.OK)//如果用户正确点击
{
using (var tr = new DBTrans())//建事务
{
tr.CurrentSpace.AddEntity(j1.Entitys);//将最后的图元加到图纸当前空间
}
//然后将编号加一
DZBHForm.NumberUp(form);
}
else if (r1.Status == PromptStatus.Keyword)//如果用户输入了关键字
{
switch (r1.StringResult)
{
case "S"://如果用户输入了S,更改文字高度
var r2 = Env.Editor.GetDouble("\n请输入文字高度");
if (r2.Status == PromptStatus.OK) textHeight = r2.Value;//如果用户正确输入,赋值给textHeight
break;
case " "://如果用户输入空格,程序结束
return;
}
}
else return;//其他情况程序结束
}
}
finally
{
while (!form.IsDisposed)
{
form.Close();//最后关闭窗体
}
}
}
}
}
窗体建议自己写一遍,不要复制我的
//其他用到的函数
//包围盒
public static Extents3d BoundingBox(this Entity ent)
{
try
{
if (ent is BlockReference brf) return brf.GeometryExtentsBestFit();
else return ent.GeometricExtents;
}
catch (Exception ex)
{
throw new Exception("获取包围盒错误"+ex.Message);
}
}
/// <summary>
/// 获取包围盒中点
/// </summary>
/// <param name="ent">实体</param>
/// <returns>中点坐标</returns>
public static Point3d GetBoxMidPoint(this Entity ent)
{
return ent.BoundingBox().MidPoint();
}
//获取焦点
public static class Win32Api
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr SetFocus(IntPtr hwnd);
}