CAD二次开发IFoxCAD框架系列(21)-线型表的操作
1. 线型表的查询(查询常用的三种线型)
每个 AutoCAD 图形会自动加载 3 种线形:ByLayer、ByBlock和 CONTINUOUS,可以通过下述方式获得这三种线型的 ObjectId。
[CommandMethod(nameof(getLinetypeObjectId))]public void getLinetypeObjectId(){using var tr = new DBTrans();ObjectId byBlockId = SymbolUtilityServices.GetLinetypeByBlockId(tr.Database);ObjectId byLayerId = SymbolUtilityServices.GetLinetypeByLayerId(tr.Database);ObjectId continuousId = SymbolUtilityServices.GetLinetypeContinuousId(tr.Database);Env.Printl("byBlockId: " + byBlockId + " byLayerId: " + byLayerId + " continuousId: " + continuousId);}
-
随层(ByLayer):
随层的意思就是对象的颜色、线型和线宽属性继承当前层的属性,也就是在定义块时将图形对象绘制在0层,将当前层的颜色、线型和线宽属性设置为随层。 -
随块(ByBlock):
随块的意思就是对象的颜色、线型和线宽属性使用它所在的图块的属性,就是图块内部的对象属性的改变只能是在块编辑或块定义时才能改变。即假如按上面的步骤改变颜色,新插入的块将不会改变颜色。但如果在块编辑的情况下改变颜色,新插入的块也会改变颜色。 -
连续线(continuous)
这是AutoCAD默认的线型,也就是我们说的实线。
输入LTYPE命令,直接可以在『线型管理器』对话框中看到默认加载的线型:ByLayer,ByBlock和Continuous,如下:
2. 根据名称查询线型
查看线型表中是否含有名为“CENTER”的线型。
using var tr = new DBTrans();
if (tr.LinetypeTable.Has("CENTER"))
{
//要执行的操作
}
3. 线型名称遍历
遍历线型表并打印每个线型的名字 。
[CommandMethod(nameof(getLinetypeNames))]public void getLinetypeNames(){using var tr = new DBTrans();tr.LinetypeTable.GetRecordNames().ForEach(action: (linetypeName) => linetypeName.Print());}
4. 线型的新增
4.1 加载已有线型
从 acadiso.lin 线型文件中加载指定线型 CENTER ,并返回 CENTER 线型的 ObjectId。
[CommandMethod(nameof(loadLineTypeFile))]public void loadLineTypeFile(){using var tr = new DBTrans();if(!tr.LinetypeTable.Has("CENTER")){tr.Database.LoadLineTypeFile("CENTER", "acadiso.lin");var objectId = tr.LinetypeTable["CENTER"];Env.Printl("objectId: " + objectId);}}
4.2 加载自定义 *.lin 文件里的所有线型(已有线形会触发异常)
try
{using var tr = new DBTrans();tr.Database.LoadLineTypeFile("*", "D:\\文件名.lin");
}catch (Exception)
{
}
4.3 新建自定义线型
自定义一个 DASHLINES 线型。
[CommandMethod(nameof(LinetypeAdd))]public void LinetypeAdd(){using var tr = new DBTrans();tr.LinetypeTable.Add("DASHLINES", (ltr) =>{ltr.AsciiDescription = "虚线";//线型说明ltr.PatternLength = 0.95;//组成线型的图案长度(划线、空格、点)ltr.NumDashes = 4;//组成线型的图案数目ltr.SetDashLengthAt(0, 0.5);//0.5个单位的划线ltr.SetDashLengthAt(1, -0.25);//0.25个单位的空格ltr.SetDashLengthAt(2, 0);//一个点ltr.SetDashLengthAt(3, -0.25);//0.25个单位的空格});}
4.4 自定义一个带文字的线型
[CommandMethod(nameof(LinetypeAddText))]public void LinetypeAddText(){using var tr = new DBTrans();tr.LinetypeTable.Add("文字线型", ltrText =>{//添加带文字的线型ltrText.AsciiDescription = "文字";//线型说明ltrText.PatternLength = 0.9;//组成线型的图案长度(划线、空格、点)ltrText.NumDashes = 3;//组成线型的图案数目ltrText.SetDashLengthAt(0, 0.5);//0.5个单位的划线ltrText.SetDashLengthAt(1, -0.2);//0.2个单位的空格ltrText.SetShapeStyleAt(1, tr.TextStyleTable["Standard"]);//设置文字的文字样式//文字在线型的 X 轴方向上向左移动0.1个单位,在Y轴方向向下移动0.05个单位。ltrText.SetShapeOffsetAt(1, new Vector2d(-0.1, -0.05));ltrText.SetShapeScaleAt(1, 0.1);//文字的缩放比例ltrText.SetShapeRotationAt(1, 0);//文字的旋转角度为0(不旋转)ltrText.SetTextAt(1, "GAS");//文字内容ltrText.SetDashLengthAt(2, -0.2);//0.2个单位的空格});}
5. 当前线型的设置
将 CENTER 设为当前线型
[CommandMethod(nameof(SetCurrentLineType))]public void SetCurrentLineType(){using var tr = new DBTrans();//查找是否包含CENTER线型if(!tr.LinetypeTable.Has("CENTER")){tr.Database.LoadLineTypeFile("CENTER", "acadiso.lin"); //导入CENTER线型}tr.Database.Celtype = tr.LinetypeTable["CENTER"];}
在未选中任何对象的状态下,按ctrl+1打开特性选项板,即可查看当前线型。
修改后为
这里也可以查看
6. 线型删除
卸载 CENTER 线型。
[CommandMethod(nameof(DeleteLineType))]public void DeleteLineType(){using var tr = new DBTrans();tr.LinetypeTable["CENTER"].Erase();}
注意 : 不能卸载如下线型:
- BYBLOCK
- BYLAYER
- CONTINUOUS
- 当前线型
- 已使用的线型
- 外部参照的线形
- 块定义中的线型
删除会提示错误