如何用.net修改图纸中的文字样式
图纸中已经存在很多文字样式,用的字体也都乱七八糟,现在想写一个.net程序,让所有文字都刷成同一种文字样式,使用相同的字体,该怎么做?我刚开始学着做.net cad,没多少思路,麻烦给提示下。
有人帮助一下吗? 顶一下,我也在找!如何改变dwg中字体! 本帖最后由 liuxu042 于 2011-12-8 09:29 编辑
试试如下代码,需要将字体样式名字改为你想的,为了简单处理,没有加判断处理,所以必须保证图幅中存在此名称的文本样式,使用时请注意 using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
public void my()
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
TypedValue[] tv = new TypedValue;
tv = new TypedValue((int)DxfCode.Start, "TEXT");
SelectionFilter sf = new SelectionFilter(tv);
PromptSelectionResult psres = ed.GetSelection(sf);
if (psres.Status != PromptStatus.OK) return;
SelectionSet sset = psres.Value;
Database db = HostApplicationServices.WorkingDatabase;
int num = 0;
foreach (SelectedObject sobj in sset)
{
using (Transaction ta = db.TransactionManager.StartTransaction())
{
Entity ent = (Entity)ta.GetObject(sobj.ObjectId, OpenMode.ForRead);
if (ent is DBText)
{
ent.UpgradeOpen();
DBText myText = ent as DBText;
TextStyleTable tst = ta.GetObject(db.TextStyleTableId, OpenMode.ForRead) as TextStyleTable;
myText.TextStyleId = tst["st"];
num++;
}
ta.Commit();
}
ed.WriteMessage("\n修改文本数量:"+num.ToString());
}
} 是这效果么?
本帖最后由 mkhsj928 于 2011-12-8 23:24 编辑
跟我很久以前的想法一样,呵呵,已经基本实现这个功能,只是少数图纸还替换不完全,没找到原因。
CAD文档中牵涉到文字的有如下几种实体:
1.纯文本:DBText,MText'
2.标注样式:DimStyleTableRecord
3.块定义实体(非块参照,只要把块定义中含有的文字样式替换掉,所有参照都替换了):BlockTableRecord
4.属性定义实体:这个好像要对每个块参照都要判断 AttributeReference
5.表格样式和表格单元格中的文字样式:本来以为修改字体样式可以自动修改,但经过试验,好像有些不行
我说实现的就这些,还有木有?知道的说下!
请问楼上那个字体预览功能是怎么做的,谢谢! 本帖最后由 guohq 于 2013-4-18 19:36 编辑
如果要改成一个效果,可能通过更改样式表,这样可以将有到此样式的所有文字、块中的文字等全部改掉。 '''
''' 样式改为一种
'''
''' 改后的样式
'''
Public Sub TextStyleToSame(ByVal ToStyle As String)
Using Trans As Transaction = MyBase.DB.TransactionManager.StartTransaction
Dim StyTab As TextStyleTable = Trans.GetObject(DB.TextStyleTableId, OpenMode.ForWrite)
ToStyle = ToStyle.Trim.ToUpper
If StyTab.Has(ToStyle) Then
Dim MainStyleRec As TextStyleTableRecord = Trans.GetObject(StyTab(ToStyle), OpenMode.ForWrite)
Dim TempRec As TextStyleTableRecord = Nothing, TempName As String = ""
For Each ID As ObjectId In StyTab
Try
TempRec = Trans.GetObject(ID, OpenMode.ForWrite)
TempName = TempRec.Name
If TempName.Trim = "" Then
Continue For
End If
If TempName.ToUpper <> ToStyle Then
TempRec.CopyFrom(MainStyleRec)
TempRec.Name = TempName
End If
Catch ex As Autodesk.AutoCAD.Runtime.Exception
End Try
Next
End If
Trans.Commit()
End Using
End Sub
页:
[1]