明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8430|回复: 16

[符号表] [求助] VB.net创建文字样式的几个问题

  [复制链接]
发表于 2010-7-26 17:12 | 显示全部楼层 |阅读模式

几位老大编写的《AutoCAD VBA & VB.NET开发》一书中讲了文字样式的创建等方法。我今天下午在使用的时候,遇到三个不明白的问题:


(1)“宋体”的文件名称是什么?


我的测试背景是Win7+VS2010+AutoCAD2008,根据文中提供的方法,到控制面板的字体中找到“宋体”的文件名是simsun.ttc,但是按照下面的代码却没有成功地生成字体样式:
                Dim str As New TextStyleTableRecord()
                str.Name = "TextStyle-宋体-横向"
                str.FileName = "simsun.ttc"
我猜是不是应该为“simsun.ttf”,结果运行后字体名显示为“SimSun-ExtB”,也失败了。那到底是什么啊?

 

(2)字体样式里面垂直字体如何定义?


找了半天,在系统里都没看到带有“@”符号或有“竖向”、“垂直”关键字的字体文件,网上也找了半天,没有结果。
自己最后终于找到了TextStyle Members的一个属性IsVertical,设置为True后发现也没有成功。怎么办?

 

以上两个问题总结起来,就是如附件图中所示,需要高手填空:

 

 

(3)手工定义的宋体字体样式查不到文件名

 

《AutoCAD VBA & VB.NET开发》一书“文字样式”章节中有GetTextStyle命令可以显示所用字体的文件名。

我手工设置字体的字体样式为宋体,使用书中的GetTextStyle查询,得到空结果,如下图所示,为什么啊?是不是我的系统有问题?还是其它?

 

本帖子中包含更多资源

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

x
发表于 2011-7-26 22:40 | 显示全部楼层
'创建文字样式
    Public Shared Function CreateStyle(ByVal textstyleName As String, ByVal font1 As String, ByVal bigfont As String, ByVal anger As Double, ByVal textwidth As Double) As ObjectId
        Dim db As Database = HostApplicationServices.WorkingDatabase
        Using trans As Transaction = db.TransactionManager.StartTransaction
            ' 得到文字样式表
            Dim st As TextStyleTable = trans.GetObject(db.TextStyleTableId, OpenMode.ForWrite)
            Dim StyleName As String = textstyleName
            ' 如果名为"工程图"的文字样式不存在,则新建一个文字样式.
            If st.Has(StyleName) = True Then
                'Dim TextstyleId As ObjectId = st(StyleName)
                db.Textstyle = st(StyleName)
                trans.Commit()
            End If
            If st.Has(StyleName) = False Then
                ' 新建一个文字样式表记录.
                Dim str As New TextStyleTableRecord()
                ' 设置文字样式名.
                str.Name = StyleName
                ' 设置TrueType字体(仿宋体)
                If Right(font1, 3) = "ttf" Or Right(font1, 3) = "TTC" Or font1 = "宋体" Then
                    str.FileName = font1
                Else
                    ' 设置SHX字体
                    str.FileName = font1
                    '  设置大字体.
                    str.BigFontFileName = bigfont
                End If
                ' 设置倾斜角(弧度).
                str.ObliquingAngle = anger * Math.PI / 180
                ' 设置宽度比例.
                str.XScale = textwidth
                ' 把文字样式表记录添加到文字样式表中.
                Dim TextstyleId As ObjectId = st.Add(str)
                ' 把文字样式表记录添加到事务处理中.
                trans.AddNewlyCreatedDBObject(str, True)
                ' 将文字样式"工程图"设置为当前文字样式  
                db.Textstyle = TextstyleId
                trans.Commit()
            End If
        End Using
    End Function
回复 支持 1 反对 0

使用道具 举报

发表于 2018-1-2 11:24 | 显示全部楼层
Dim st As TextStyleTable = trans.GetObject(db.TextStyleTableId, OpenMode.ForWrite)
我的怎么只能用读的方式打开呢,用写报错啊!
"Autodesk.AutoCAD.Runtime.Exception"的异常
cad2005 & vs2008

发表于 2020-8-25 10:37 | 显示全部楼层
谢谢楼主和各位大神的解答,本人小白只能慢慢领悟
发表于 2010-7-26 19:55 | 显示全部楼层
手动创建样式,然后用代码读属性。。。
 楼主| 发表于 2010-7-26 21:08 | 显示全部楼层
版主啊,我也是想这么做的呀,可是出现了问题,问题就是我发的帖子中的第三个问题。
发表于 2010-7-26 21:49 | 显示全部楼层
  1.         [CommandMethod("tt4")]
  2.         public void test24()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Editor ed = doc.Editor;
  6.             Database db = doc.Database;
  7.             using (Transaction tr = db.TransactionManager.StartTransaction())
  8.             {
  9.                 TextStyleTableRecord tstr =
  10.                     new TextStyleTableRecord
  11.                     {
  12.                         Name = "Font1",
  13.                         Font =
  14.                             new Autodesk.AutoCAD.GraphicsInterface.FontDescriptor("宋体",false,false,0,34),
  15.                         XScale = 1
  16.                     };
  17.                 TextStyleTable tst = tr.GetObject(db.TextStyleTableId, OpenMode.ForWrite) as TextStyleTable;
  18.                 tst.Add(tstr);
  19.                 tr.AddNewlyCreatedDBObject(tstr, true);
  20.                 tr.Commit();
  21.             }
  22.         }
 楼主| 发表于 2010-7-27 13:16 | 显示全部楼层

非常感谢lzh741206的热心。

使用Font属性之后,问题就解决了。

 

new Autodesk.AutoCAD.GraphicsInterface.FontDescriptor("宋体",false,false,0,34)里面的参数“34”为“the pitch and family attributes”,设置字体间距与Family(字符集?),34指的是DefaultPitch吧?

 

 

 楼主| 发表于 2010-7-28 17:19 | 显示全部楼层
本帖最后由 作者 于 2010-7-28 17:43:40 编辑

根据lzh741206和ObjectARX编程站sbydo的提示,问题解决了。下面总结一下,给后面的同志们作参考。

 

【方法1】创建文字样式时,使用FileName属性来实现。
        Dim str As New TextStyleTableRecord()
        str.FileName= "宋体.ttf"
        或者

        str.FileName= "@宋体.ttf"

【方法2】创建文字样式时,使用Font属性来实现。
        str.Font = New Autodesk.AutoCAD.GraphicsInterface.FontDescriptor(FontName, False, False, 0, 34)

其中,参数FontName的不同取值可以创建不同的文字样式:
            FontName="宋体",则为横向的宋体样式;
            FontName="@宋体",则为竖向的宋体样式。
其它的字体样式同样处理。

评分

参与人数 1明经币 +1 金钱 +10 贡献 +10 激情 +10 收起 理由
雪山飞狐_lzh + 1 + 10 + 10 + 10 【好评】表扬一下

查看全部评分

发表于 2011-7-26 22:42 | 显示全部楼层
Dim tktextstyId As ObjectId = ModelSpace.CreateStyle("图框", "宋体", "", 0, 0.85)
发表于 2011-7-26 22:43 | 显示全部楼层
这样就行了,我已经用过了,可以
发表于 2011-7-26 22:44 | 显示全部楼层
本帖最后由 qazllqaz 于 2011-7-26 22:44 编辑

  1. Dim tktextstyId As ObjectId = ModelSpace.CreateStyle("图框", "宋体", "", 0, 0.85)
  2. 这段代码是调用函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 17:59 , Processed in 0.561777 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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