明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3067|回复: 7

如何用.net修改图纸中的文字样式

[复制链接]
发表于 2011-9-28 15:11:33 | 显示全部楼层 |阅读模式
图纸中已经存在很多文字样式,用的字体也都乱七八糟,现在想写一个.net程序,让所有文字都刷成同一种文字样式,使用相同的字体,该怎么做?
我刚开始学着做.net cad,没多少思路,麻烦给提示下。


 楼主| 发表于 2011-9-30 11:32:30 | 显示全部楼层
有人帮助一下吗?
发表于 2011-12-7 19:25:47 | 显示全部楼层
顶一下,我也在找!如何改变dwg中字体!
发表于 2011-12-8 09:20:50 | 显示全部楼层
本帖最后由 liuxu042 于 2011-12-8 09:29 编辑

试试如下代码,需要将字体样式名字改为你想的,为了简单处理,没有加判断处理,所以必须保证图幅中存在此名称的文本样式,使用时请注意
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;

  5.         [CommandMethod("my")]
  6.         public void my()
  7.         {
  8.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  9.             TypedValue[] tv = new TypedValue[1];
  10.             tv[0] = new TypedValue((int)DxfCode.Start, "TEXT");
  11.             SelectionFilter sf = new SelectionFilter(tv);
  12.             PromptSelectionResult psres = ed.GetSelection(sf);
  13.             if (psres.Status != PromptStatus.OK) return;
  14.             SelectionSet sset = psres.Value;
  15.             Database db = HostApplicationServices.WorkingDatabase;
  16.             int num = 0;
  17.             foreach (SelectedObject sobj in sset)
  18.             {
  19.                 using (Transaction ta = db.TransactionManager.StartTransaction())
  20.                 {
  21.                     Entity ent = (Entity)ta.GetObject(sobj.ObjectId, OpenMode.ForRead);
  22.                     if (ent is DBText)
  23.                     {
  24.                         ent.UpgradeOpen();
  25.                         DBText myText = ent as DBText;

  26.                         TextStyleTable tst = ta.GetObject(db.TextStyleTableId, OpenMode.ForRead) as TextStyleTable;
  27.                         myText.TextStyleId = tst["st"];
  28.                         num++;
  29.                     
  30.                     }
  31.                     ta.Commit();
  32.                 }
  33.                
  34.                 ed.WriteMessage("\n修改文本数量:"+num.ToString());
  35.             }
  36.         }
发表于 2011-12-8 13:19:01 | 显示全部楼层
是这效果么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2011-12-8 22:58:18 | 显示全部楼层
本帖最后由 mkhsj928 于 2011-12-8 23:24 编辑

跟我很久以前的想法一样,呵呵,已经基本实现这个功能,只是少数图纸还替换不完全,没找到原因。
CAD文档中牵涉到文字的有如下几种实体:
1.纯文本:DBText,MText'
2.标注样式:DimStyleTableRecord
3.块定义实体(非块参照,只要把块定义中含有的文字样式替换掉,所有参照都替换了):BlockTableRecord
4.属性定义实体:这个好像要对每个块参照都要判断 AttributeReference
5.表格样式和表格单元格中的文字样式:本来以为修改字体样式可以自动修改,但经过试验,好像有些不行
我说实现的就这些,还有木有?知道的说下!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2013-4-15 12:57:43 | 显示全部楼层
请问楼上那个字体预览功能是怎么做的,谢谢!
发表于 2013-4-18 19:35:31 | 显示全部楼层
本帖最后由 guohq 于 2013-4-18 19:36 编辑

如果要改成一个效果,可能通过更改样式表,这样可以将有到此样式的所有文字、块中的文字等全部改掉。
  1.     '''
  2.     ''' 样式改为一种
  3.     '''
  4.     ''' 改后的样式
  5.     '''
  6.     Public Sub TextStyleToSame(ByVal ToStyle As String)
  7.         Using Trans As Transaction = MyBase.DB.TransactionManager.StartTransaction
  8.             Dim StyTab As TextStyleTable = Trans.GetObject(DB.TextStyleTableId, OpenMode.ForWrite)
  9.             ToStyle = ToStyle.Trim.ToUpper
  10.             If StyTab.Has(ToStyle) Then
  11.                 Dim MainStyleRec As TextStyleTableRecord = Trans.GetObject(StyTab(ToStyle), OpenMode.ForWrite)
  12.                 Dim TempRec As TextStyleTableRecord = Nothing, TempName As String = ""
  13.                 For Each ID As ObjectId In StyTab
  14.                     Try
  15.                         TempRec = Trans.GetObject(ID, OpenMode.ForWrite)
  16.                         TempName = TempRec.Name
  17.                         If TempName.Trim = "" Then
  18.                             Continue For
  19.                         End If
  20.                         If TempName.ToUpper <> ToStyle Then
  21.                             TempRec.CopyFrom(MainStyleRec)
  22.                             TempRec.Name = TempName
  23.                         End If
  24.                     Catch ex As Autodesk.AutoCAD.Runtime.Exception

  25.                     End Try
  26.                 Next
  27.             End If
  28.             Trans.Commit()
  29.         End Using
  30.     End Sub


您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 14:46 , Processed in 0.195857 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表