返回介绍

文字样式

发布于 2023-08-09 23:10:34 字数 10422 浏览 0 评论 0 收藏 0

DWG数据库中,文字样式存放在文字样式表中,表类名:MxDrawTextStyleTable ,它的详细接口说明参考:http://www.mxdraw.com/help/IMxDrawTextStyleTable.htm

文字样式表中每一条记录称为一种文字样式,类名:MxDrawTextStyleTableRecord ,它的详细接口说明参考:http://www.mxdraw.com/help/IMxDrawTextStyleTableRecord.htm

文字样式是随图纸保存,不同的图纸使用的文字样式都可能会不一样。

文字样式设置命令:Mx_Style, 比如:

private void AddTextStyle(String sNewTextStyleName)
        {
            MxDrawApplication app = new MxDrawApplication();
            
            //返回数据库中的文字样式表对象 
            MxDrawTextStyleTable txtStyleTable = app.WorkingDatabase().GetTextStyleTable();

            MxDrawTextStyleTableRecord txtStyle = txtStyleTable.GetAt(sNewTextStyleName, true);
            if(txtStyle != null)
            {
                // 当前数据已经有该文字样。
                // 如果被删除,就反删除。
                txtStyle.SetProp("unErase", null);
                return;
            }
            

            //增加新的文字样式
            MxDrawTextStyleTableRecord mxtstr = txtStyleTable.Add(sNewTextStyleName);

            //设置样式的属性,如果文字样式设置了TrueType字体,就不会使用前面设置shx字体
            
            //参数一为turetype字体名 参数二为是否粗写  参数三为是否斜写  参数四为windows字符集  参数五暂没使用
            mxtstr.SetFont("黑体", false, false, 0, 0);
            
            //设置文字样式的高度
            mxtstr.textSize = 5;
        }

调用上面函数,增加"aa"文字样式

 AddTextStyle("aa");

或者也可以这样

使用ocx.AddTextStyle1(添加线形字体文字样式),ocx.AddTextStyle2(添加TrueType字体文字样式)添加文字,该函数详细接口说明参考:http://www.mxdraw.com/help/MxDrawXLib___DMxDrawX__AddTextStyle1@BSTR@BSTR@BSTR@DOUBLE.htm

比如VB代码

        MxDrawX1.AddTextStyle1 "MyTextStyle", "italicc.shx", "gbcbig.shx", 0.7
        MxDrawX1.TextStyle = "MyTextStyle"
        MxDrawX1.DrawColor = 255
        MxDrawX1.DrawText 0, 3000, "梦想绘图控件3.0 www.mxdraw.com", 100, 0, 0, 1

比如添加一个黑体字体的文字样式

       '添加TureType字体
        MxDrawX1.AddTextStyle2 "MyTrueTypeStyle", "黑体", 0.7
        MxDrawX1.TextStyle = "MyTrueTypeStyle"
        MxDrawX1.DrawText 0, 3150, "梦想绘图控件3.0 www.mxdraw.com", 100, 0, 0, 1

效果展示:

addtxtstyle.png

C. 得到所有文字样式

下面代码是遍历文字样式表中所有文字样式,并得到所有文字样式名,在遍历的循环中,得到每个文字样式记录对象,可以去修改它的属性

       private void GetAllTextStyle()
        {
            MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();
            
            //返回数据库中的文字样式表对象
            MxDrawTextStyleTable mxtst = database.GetTextStyleTable();
            
            //创建一个遍历文字样式表中所有文字样式的遍历器
            MxDrawTextStyleTableIterator iter = mxtst.NewIterator();
            if (iter == null)
                return;
            string sRet = null;
            //移动当前遍历器位置
            for (; !iter.Done(); iter.Step(true, false))
            {
                //返回遍历器当前位置的文字样式
                MxDrawTextStyleTableRecord spTextStyleRec = iter.GetRecord();
                
                //得到文字样式名
                sRet = sRet + ',' + spTextStyleRec.Name;
            }
            MessageBox.Show(sRet);
        }

运行效果如下:

alltextstyle.png

D. 删除文字样式

在删除文字样式前,最好判断图上有没有文字对象正在使用该文字样式,如果有的话就不要删除文字样式

c#代码如下:

             private void DelTextStyle(String sTextStyleName)
        {
        
            MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();
            
            //返回数据库中的文字样式表表对象
            MxDrawTextStyleTable TextStyleTable = database.GetTextStyleTable();
            
            //得到文字样表中的文字样式对象
            MxDrawTextStyleTableRecord TextStyleRec = TextStyleTable.GetAt(sTextStyleName, false);
            if (TextStyleRec == null)
                return;
            //删除文字样式
            TextStyleRec.Erase();
            MessageBox.Show("成功删除文字样式");
        }

deltextstyle1.png

deltextstyle2.png

E.调用文字样式管理界面

Mx_Style是文字样式命令名

例如代码 C#:

axMxDrawX1.SendStringToExecute("Mx_Style");

F. 修改文字对象的文字样式

文字对象都一个TextStyle属性,用这个属性可以设置,或取到文字对象的文字样式。

下面代码演示设置一个文字对象的字体为黑体,如果没有文字样式,就添加文字样式。

void SetTextStyle()
        {
            MxDrawUtility mxUtility = new MxDrawUtility();
            // 当用户在图上选择一个对象。
            MxDrawPoint getPt;
            MxDrawEntity ent = mxUtility.GetEntity(out getPt, "\n 选择实体对象:");
            if (ent == null)
            {
                return;
            }
            // 得到数据库对象.
            MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();
            // 得到文本式表.
            MxDrawTextStyleTable textStyleTable = database.GetTextStyleTable();
            string sTextStyleName = "MyTextStyleName";
            // 得到文本式
            MxDrawTextStyleTableRecord textStyle = textStyleTable.GetAt(sTextStyleName, true);
            if (textStyle == null)
            {
                // 如果没有就新建一个。
                axMxDrawX1.AddTextStyle2(sTextStyleName, "黑体", 0.7);
            }
            else
            {
                // 如果被删除,就反删除。
                textStyle.SetProp("unErase", null);
                textStyle.SetFont("黑体", false, false, 0, 0);
            }
            // 设置实体文字样式。
            ent.TextStyle = sTextStyleName;
            MessageBox.Show("已将该实体文字样式");
        }

G. 得到图所有文字对象使用的字体文件

下面代码会遍历图上所有CAD文字对象,然后取它使用的字体信息

void getAllTextFont()
        {
            MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();
            //返回数据库中的文字样式表表对象
            MxDrawTextStyleTable textStyleTable = database.GetTextStyleTable();
            // 定义选择集对象
            MxDrawSelectionSet ss = new MxDrawSelectionSet();
            // 全选图上所有对象。
            ss.AllSelect();
            int i = 0; 
            // 遍历所有对象
            for(;i <ss.Count;i++)
            {
                MxDrawEntity ent = ss.Item(i);
                // 得到对象使用的文字样式记录.
                MxDrawTextStyleTableRecord rec = textStyleTable.GetAt(ent.TextStyle);
                if (rec == null)
                    continue;
                // 得到TrueType字体属性。
                String pTypeface = "";
                Boolean bold = false;
                Boolean italic = false;
                Int32 charset = 0;
                Int32 pitchAndFamily = 0;
                rec.Font(out pTypeface, out bold, out italic, out charset, out pitchAndFamily);
                String sShxFileName;
                String sBigShxFileName;
                // 如果TrueType字体名为空,表示使用的Shx字体。
                if(pTypeface.Length == 0)
                {
                    // 得到西文字体
                    sShxFileName = rec.fileName;
                    // 得到中文字体
                    sBigShxFileName = rec.bigFontFileName;
                }
            }
        }

H. 文字显示号问题原因和解决办法

打开DWG时,图纸中使用的shx字体文件在本地电脑不能找到时,控件会默认使用缺省的字体txt.shx,hztxt.shx来代替,这样一般文字不会显示成问号,但是如果文字中的特殊符号在默认字体也一样找不到,这时就会显示成问号。 使用缺省的字体的代替的文字样式,可能会出现文字显示大小,样子不一至的效果。

这时最好的办法是,把需要使用的字体拷到MxDrawX.ocx所在目录的shx目录下,如果不知道当前用的MxDrawX.ocx在位置,可以命令行输入mx_about看到控件安装位置

mxabout.png

如下图,打开图时,在命令行提示找不到字体

rtxt.png

修改控件Iniset属性,Iniset="ShxPath=D:/shx"添加一个字体搜索位置,

修改控件Iniset属性, Iniset="DownLoadServerFont=Y",设置打开网络图纸时,自动下载服务器上的字体文件。默认不会下载.,服务器需要 设置MIME,增加shx文件类型支持.

修改控件Iniset属性, Iniset="SHXWEBSITEADDRESS=http://www.mxdraw.com/shx",设置字体下载位置

修改控件Iniset属性, Iniset="DefaultText=txt.shx", 设置缺省的shx文件

修改控件Iniset属性, Iniset="DefaultBigText=hztxt.shx", 设置缺省的big shx文件

iniset属性接口说明,参考:http://www.mxdraw.com/help/MxDrawXLib___DMxDrawX__Iniset.htm

I. 修改文字样式

下面代码由文字样式名得到文字样字记录,然后它的属性。

c#代码如下:

             private void ModifyTextStyle(String sTextStyleName)
        {
        
            MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();
            
            //返回数据库中的文字样式表表对象
            MxDrawTextStyleTable TextStyleTable = database.GetTextStyleTable();
            
            //得到文字样表中的文字样式对象
            MxDrawTextStyleTableRecord TextStyleRec = TextStyleTable.GetAt(sTextStyleName, false);
            if (TextStyleRec == null)
                return;
                
            //修改文字样式的字体高度
            TextStyleRec.textSize = 10;
            
            //修改文字宽度缩放比例
            TextStyleRec.xScale = 0.7;
        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文