使用工具==CAD2018+VS2022
主要作用==第一是对上一篇(winform窗口很简单,因为刚学会)重新理解,第二是新建图层与在winform中调用问题,第三是标注的简单设置
一:关于winform窗口
1--窗口的创建与运行同上一篇一模一样
2--重点是ShowModalDialog有模式窗口与ShowModelessDialog无模式窗口的理解
2.1--ShowModalDialog有模式窗口:该窗口运行后会占据CAD主界面,该窗口未退出时CAD主界面会锁住导致不能有复杂的操作, 如果要使用此窗口建议使用释放资源Dispose(true),或this.Close()来关闭该窗口。
2.2--手动释放资源Dispose:参数true表示释放所有资源,false表示只释放部分非托管的资源
2.3--ShowModelessDialog无模式窗口,该窗口不会锁定CAD主界面,但当数据有变化时需要手动来锁定文档doc.LockDocument()【属于Document类下面】,如果不锁定CAD会报错
创建窗口:就是下面这两句个代码
Form1 MyForm = new Form1();//实例化窗体
acadApp.Application.ShowModelessDialog(MyForm);//在CAD中展示无模式窗口
acadApp.Application.ShowModalDialog(MyForm);//在CAD中展示有模式窗口
锁定文档代码示例:
//绘制图形
doc.LockDocument();//锁定文档
//当使用ShowModelessDialog窗口时,后面的代码是添加数据到模型空间,不锁定文档就会报错
//绘制封口线
Tools.AddEntityToModelSpace(lin1);
Tools.AddEntityToModelSpace(lin2);
//添加N1
Tools.AddEntityToModelSpace(tN1);
Tools.AddEntityToModelSpace(tN2);
//添加标注
Tools.AddEntityToModelSpace(dimN2);
Tools.AddEntityToModelSpace(dimN1);
Tools.AddEntityToModelSpace(dimB);
Tools.AddEntityToModelSpace(dimH);
Tools.AddEntityToModelSpace(dimRec);
Tools.AddEntityToModelSpace(dimFold1);
Tools.AddEntityToModelSpace(dimFold2);
Tools.AddEntityToModelSpace(p3dim);
//绘制多段线
ObjectId pLineid = Tools.AddEntityToModelSpace(pline);
Tools.AddEntityToModelSpace(plineRec);
//偏移多线
Tools.FoldOffset(pLineid, -thick);
二:创建图层
如果只使用dll类库而不使用winform窗口来创建,可以跳过不用看;如果要使用winform窗口的按钮来创建,当使用ShowModelessDialog无模式窗口时 button1下要锁住文档,或者在主函数(就是要展示CAD窗口)下运行,不然很大几率会报错
主函数运行
Form1 MyForm = new Form1();//实例化窗体
acadApp.Application.ShowModelessDialog(MyForm);
/创建图层代码 或 自定义函数/
创建图层代码展示:
传入 图层名+颜色
public static void AddLayer(string name, short index)
{
Database db = acadApp.Application.DocumentManager.MdiActiveDocument.Database;
Editor ed = acadApp.Application.DocumentManager.MdiActiveDocument.Editor;
//打开事务
using (Transaction trans = db.TransactionManager.StartTransaction())
{
//打开层表
LayerTable lt = db.LayerTableId.GetObject( OpenMode.ForRead) as LayerTable;
//判断 指定图层不存在时
if (!lt.Has(name))
{
//实例化层表记录
LayerTableRecord ltr = new LayerTableRecord();
lt.UpgradeOpen();//升级为可写
ltr.Name = name;//图层名称
ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, index);//图层颜色,ByAci实体跟随图层颜色
lt.Add(ltr);//添加层表记录
trans.AddNewlyCreatedDBObject(ltr, true);//更新数据库对象
trans.Commit();
}
}
}
使用button调用 创建图层函数 代码展示:
private void button1AddLayer_Click(object sender, EventArgs e)
{
acadApp.Document doc = acadApp.Application.DocumentManager.MdiActiveDocument;
string layName = "McbDim03";
doc.LockDocument();//锁定文档
Tools.AddLayer(layName,3);
wind.MessageBox.Show("成功");
Dispose(true);//释放资源 true表示释放所有资源,false表示释放非托管资源
}
三:标注设置
3.1标注样式:
添加标注样式
public static ObjectId AddDimStyle(string dimStyName,int textHight)
{
Database db = acadApp.Application.DocumentManager.MdiActiveDocument.Database;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
//打开标注样式表
DimStyleTable dimT = db.DimStyleTableId.GetObject(OpenMode.ForRead) as DimStyleTable;
if(!dimT.Has(dimStyName))//如果文件中没有 重名的标注样式
{
//打开标注样式记录表
DimStyleTableRecord dimR = new DimStyleTableRecord();
dimT.UpgradeOpen();//升级为可写
dimR.Name = dimStyName;//标注样式名
dimR.Dimasz = 3;//箭头大小
dimR.Dimexe = 3;//超出尺寸线
dimR.Dimtad = 1;//文字位置位于标注线上
dimR.Dimdec = 0;//标注精度
dimR.Dimtxt = textHight;//文字高度
db.SetDimstyleData(dimR); //将标注样式加入数据库
dimT.Add(dimR);//将 标注样式记录表 添加到 标注样式记录
trans.AddNewlyCreatedDBObject(dimR, true);//更新数据库
trans.Commit();
}
return dimT[dimStyName];//返回标注样式id
}
}
3.2:标注样式调用及标注设置(button调用)
//三点 角度标注
Point3AngularDimension p3dim = new Point3AngularDimension();//实例化 三点角度标注
ObjectId dimId = Tools.AddDimStyle("dimB", 10);//添加 标注样式
p3dim.DimensionStyle = db.GetDimensionStyleParentId(dimId);//设置标注样式
p3dim.Layer = layName;
p3dim.ArcPoint = new Point3d((po2.X + po4.X) * 0.5 + 30, (po2.Y + po4.Y) * 0.5, 0);//标注位置
p3dim.XLine1Point = new Point3d(po4.X, po4.Y, 0); ;//起点
p3dim.XLine2Point = new Point3d(po2.X, po2.Y, 0);//终点
p3dim.CenterPoint = new Point3d(po3.X, po3.Y, 0);//中心点
//线型标注
//标注N1
RotatedDimension dimN1 = new RotatedDimension();//实例化线型标注
dimN1.Rotation = Math.PI * 0.5;//Math.PI * 0.5表示垂直,默认为水平
dimN1.DimensionStyle = db.GetDimensionStyleParentId(dimId);//设置标注样式
dimN1.Layer = layName;//指定图层
dimN1.DimLinePoint = new Point3d(poMid45.X - 5, poMid45.Y, 0);//标注位置
dimN1.XLine1Point = po5;//标注 起点
dimN1.XLine2Point = new Point3d(po4.X, po4.Y, 0);//标注 终点