夢想CAD控制元件網頁開發--圖形資料庫(文字樣式)

ywl0224發表於2021-06-15
文字樣式

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 

比如新增一個黑體字型的文字樣式

       '新增TureType字型        MxDrawX1.AddTextStyle2 "MyTrueTypeStyle", "黑體", 0.7        MxDrawX1.TextStyle = "MyTrueTypeStyle"        MxDrawX1.DrawText 0, 3150, "夢想繪圖控制元件3.0 

效果展示:

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 <ss.Count;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=,設定字型下載位置

修改控制元件Iniset屬性, Iniset="DefaultText=txt.shx", 設定預設的shx檔案

修改控制元件Iniset屬性, Iniset="DefaultBigText=hztxt.shx", 設定預設的big shx檔案

iniset屬性介面說明,參考:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29511035/viewspace-2776778/,如需轉載,請註明出處,否則將追究法律責任。

相關文章