梦想CAD控件网页开发----图形数据库(文字样式)
cad梦想画图
2021年06月15日 16:05:06
只看楼主

文字样式 DWG数据库中,文字样式存放在文字样式表中,表类名: MxDrawTextStyleTable,它的详细接口说明参考 文字样式表中每一条记录称为一种文字样式,类名: MxDrawTextStyleTableRecord,它的详细接口说明参考 文字样式是随图纸保存,不同的图纸使用的文字样式都可能会不一样。 文字样式设置命令:Mx_Style, 比如: mxOcx.SendStringToExecute("Mx_Style")

文字样式

DWG数据库中,文字样式存放在文字样式表中,表类名: MxDrawTextStyleTable,它的详细接口说明参考

文字样式表中每一条记录称为一种文字样式,类名: MxDrawTextStyleTableRecord,它的详细接口说明参考

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

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

mxOcx.SendStringToExecute("Mx_Style")

调用样式界面,如下图:

txtstyle.png

文字样式主要属性有:字体文件名,大字体文件名,新建文本高度,新建文本宽度缩放比例,文字倾斜角度,TrueType字体数据等

DWG数据库默认总是有一个"Standard"文字样式,该文字样式不能被删除。

文字样式在线演示例子

A. 当前文字样式

当前文字样式表示向DWG数据库添加一个文字对象时,使用的默认的文字样式,通过系统变量TEXTSTYLE操作,系统变量设置参考:

设置当前文字样式JS


            // 添加文字样式

            mxOcx.AddTextStyle1("MyTextStyle", "txt.shx", "hztxt.shx", 1);

            // 得到当前数据库

            var database =mxOcx.GetDatabase();

            // 设置当前文字样式

            database.CurrentlyTextStyle =  "MyTextStyle";

取当前文字样式代码:

var sCurrentTextStyle = database.CurrentlyTextStyle;

B. 添加文字样式

下面代码,得到当前数据库中的文字样式表,然后向样式表中添加一个文字样表记录

JS代码:


function CreateText(){

    //返回控件的数据库对象

    var database =mxOcx.GetDatabase();

    //返回数据库中的文字样式表对象

    var mxtst = database.GetTextStyleTable();



    var txtStyle = mxtst.GetAt("duanceng", true);

    if(txtStyle != null)

    {

        // 当前数据已经有该文字样。

        // 如果被删除,就反删除。

        txtStyle.SetProp("unErase", null);

        return;

    }

    

    //增加新的文字样式

    var mxtstr = mxtst.Add("duanceng");

    //设置样式

    //设置文字的TrueType字体,如果文字样式设置了TrueType字体,就不会使用前面设置shx字体

    //参数一为turetype字体名 参数二为是否粗写  参数三为是否斜写  参数四为windows字符集  参数五暂没使用

    mxtstr.SetFont("黑体", false, false, 0, 0);

    //返回文字的高度

    mxtstr.textSize = 5;



}

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

 AddTextStyle("aa");

或者也可以这样:

使用ocx.AddTextStyle1(添加线形字体文字样式),ocx.AddTextStyle2(添加TrueType字体文字样式)添加文字,该函数详细接口说明参考:

比如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. 得到所有文字样式

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


  function GetAllText() {

    var database = mxOcx.GetDatabase();

    // 得到所有图层名

    var sRet = null;

    //返回数据库中的文字样式表对象

    var spTextStyleTable = database.GetTextStyleTable();

    //创建一个遍历层表中所有图层的遍历器

    var spIter = spTextStyleTable.NewIterator();

    //移动当前遍历器位置

    for(;!spIter.Done();spIter.Step(true,true))

    {

        //返回遍历器当前位置的记录

        var spTextStyleRec = spIter.GetRecord();

        //符号表记录名属性

        var sName = spTextStyleRec.Name;

        // 0零层不参加比较

        if(sName != "0")

        {

            if(sRet == null)

                sRet = sName;

            else

            {

                sRet = sRet  "," sName;

            }

        }

    }

    alert(sRet);

}

D. 删除文字样式

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

JS代码如下:


   function DelText() {

    var winWidth = 440;

    var winHeight = 140;

    var winLeft = (screen.width - winWidth) / 2;

    var winTop = (screen.height - winHeight) / 2 - 20;

    var str = 'dialogHeight:'   winHeight   'px;dialogWidth:'   winWidth   'px;dialogTop:'   winTop   'px;dialogLeft:'   winLeft   'px;resizable:yes;center:yes;status:no;'

    var rt = window.showModalDialog("Gettext.htm?tmp="   Math.random(), "输入图层名", str);

    var txt;

    if (typeof (rt) == "undefined") {

        return;

    } else {

        var arr = rt.split(",");

        txt = arr[0];

    }

    var database = mxOcx.GetDatabase();

    //返回数据库中的文字样式表表对象

    var TextStyleTable = database.GetTextStyleTable();

    //得到层表中的文字样式表对象

    var TextStyleRec = TextStyleTable.GetAt(txt, false);

    if (TextStyleRec == null)

        return;

    //删除对象

    TextStyleRec.Erase();

    alert("成功删除文字样式");

}

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

Mx_Style是文字样式命令名

例如代码 JS:

mxOcx.SendStringToExecute("Mx_Style");

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

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

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


        var  ent = mxOcx.GetEntity("选择实体对象:");

        if(ent == null)

        {

            return;

        }

        // 得到数据库对象.

        var database = mxOcx.GetDatabase();

        // 得到文本式表.

        var textStyleTable = database.GetTextStyleTable();

        var sTextStyleName = "MyTextStyleName";

        // 得到文本式

        var textStyle = textStyleTable.GetAt(sTextStyleName, true);

        if (textStyle == null)

        {

            // 如果没有就新建一个。

            mxOcx.AddTextStyle2(sTextStyleName, "黑体", 0.7);

        }

        else

        {

            // 如果被删除,就反删除。

            textStyle.SetProp("unErase", null);

            textStyle.SetFont("黑体", false, false, 0, 0);

        }

        // 设置实体文字样式。

        ent.TextStyle = sTextStyleName;

        alert("已将该实体设置文字样式");

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

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


        var database = mxOcx.GetDatabase();

//返回数据库中的文字样式表表对象

        var textStyleTable = database.GetTextStyleTable();

// 定义选择集对象

        var ss = mxOcx.NewSelectionSet();

//构造一个过滤链表

        var spFilte = mxOcx.NewResbuf();

//得到当前空间的所有实体

        ss.AllSelect (spFilte);



// 遍历所有对象

        for(var i = 0;i 

        {

            var ent = ss.Item(i);

            // 得到对象使用的文字样式记录.

            var rec = textStyleTable.GetAt(ent.TextStyle);

            if (rec == null)

                continue;

            // 得到TrueType字体属性。

            var pTypeface = "";

            var bold = false;

            var italic = false;

            var charset = 0;

            var pitchAndFamily = 0;

            rec.Font(pTypeface,bold,italic,charset,pitchAndFamily);

            var sShxFileName;

            var sBigShxFileName;

            var sShxFileName1;



            // 如果TrueType字体名为空,表示使用的Shx字体。

            if(pTypeface.Length != 0)

            {

                // 得到西文字体

                sShxFileName = rec.fileName;



                // 得到中文字体

                sBigShxFileName = rec.bigFontFileName;

               sShxFileName1=sShxFileName sBigShxFileName;

               

                alert(sShxFileName1);

                

            }



        }

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属性接口说明

免费打赏

相关推荐

APP内打开