夢想cad在網頁開發時如何獲取圖層操作的資訊

ywl0224發表於2021-06-10
簡介

在此示例將演示如何獲取CAD控制元件圖紙上一些常用資訊,如符號表(塊表、層表、文字樣式表、線型表、點樣式表)、字典。

下面將介紹如何獲取符號表的一些資訊,如下圖所示:

15123534486359648.png

圖層操作

DWG資料庫中,圖層存放在圖層層表中,層表類名:MxDrawLayerTable,它的詳細介面說明參考:

層表中每一條記錄稱為層表記錄,類名:MxDrawLayerTableRecord,它的詳細介面說明引數:

每一個層,有顏色,線型,關閉/開啟,凍結等屬性,DWG資料庫預設總是有一個"0"層,該層不能被刪除。

圖層操作線上演示例子:

影片演示:

A. 當前層

當前層表示DWG資料庫預設層,向資料庫中新增一個物件時,預設放到該層上,該屬性隨圖存放,透過系統變數CLAYER操作,系統變數設定參考:

設定當前層程式碼JS:

    // 新建一個圖層    mxOcx.AddLayer("MyLayerName");    // 設定當前層    mxOcx.SetSysVarString("CLAYER", "MyLayerName");    // 設定控制元件Draw函式使得的層    mxOcx.LayerName = "MyLayerName";

或者這樣:

     // 新增層     mxOcx.AddLayer("aaaa");     // 得到當前資料庫     var database = mxOcx.GetDatabase();     // 設定當前層     database.CurrentlyLayerName = "aaaa";

B.新增圖層

呼叫控制元件AddLayer方法新增圖層,詳細介面說明見:

例如JS程式碼:

            // 新建一個圖層            mxOcx.AddLayer("MyLayerName");            // 設定控制元件Draw函式使得的層            mxOcx.LayerName = "MyLayerName";

或使用層表Add方法來新增一個圖層

        // sNewLayerName新建立的圖層名                var sNewLayerName = "TestNewLayer";                //返回控制元件的資料庫物件        var database = mxOcx.GetDatabase();                var layerTable = database.GetLayerTable();        // 向層表中新增一個層表記錄        var layerTableRec = layerTable.Add(sNewLayerName);        // 設定新圖層的顏色。SetRGB        var color = layerTableRec.Color;        color.SetRGB(255, 0, 0);        layerTableRec.Color = color;        // 把新建的層設定成當前層        database.CurrentlyLayerName = sNewLayerName;

C.遍歷所有圖層

下面程式碼是遍歷層表中所有層表記錄,並得到所有圖層名,在遍歷的迴圈中,得到每個層表記錄物件,可以去修改它的屬性

function GetAllLayer() {    var database = mxOcx.GetDatabase();    // 得到所有圖層名    var sRet = null;    //返回資料庫中的層表物件    var spLayerTable = database.GetLayerTable();    //建立一個遍歷層表中所有圖層的遍歷器    var spIter = spLayerTable.NewIterator();    //移動當前遍歷器位置    for(;!spIter.Done();spIter.Step(true,true))    {        //返回遍歷器當前位置的記錄        var spLayerRec = spIter.GetRecord();        //符號表記錄名屬性        var sName = spLayerRec.Name;        // 0零層不參加比較        if(sName != "0")        {            if(sRet == null)                sRet = sName;            else            {                sRet = sRet +","+sName;            }        }    }    alert(sRet);}

D.  隱藏圖層

隱藏一個圖層的實現思路,得到資料庫層表物件,然後根據層名得到層表記錄物件,設定層表記錄IsOff屬性值。

例如程式碼,讓使用者在CAD圖上選擇一個物件,然後隱藏物件所在的圖層C#:

  // 隱藏選擇實體的層。var ent = mxOcx.GetEntity("選擇要關閉圖層的實體:");if(ent == null){    return;}if (ent == null){    return;}var sLayerName = ent.Layer;var database = mxOcx.GetDatabase();var layerTable = database.GetLayerTable();var layerTableRec = layerTable.GetAt(sLayerName, false);if(layerTable != null){    layerTableRec.IsOff = true;}

E. 顯示圖層

如下例子,得到層表,然後迴圈得到所有層表記錄,並開啟圖層顯示

例如程式碼 JS:

function OpenAllLayer() {    var database = mxOcx.GetDatabase();    //返回資料庫中的層表物件    var spLayerTable = database.GetLayerTable();    //建立一個遍歷層表中所有圖層的遍歷器    var spIter = spLayerTable.NewIterator();    //移動當前遍歷器位置    for(;!spIter.Done();spIter.Step(true,true))    {        //返回遍歷器當前位置的記錄        var spLayerRec = spIter.GetRecord();        var sName = spLayerRec.Name;        var layerRec=spLayerTable.GetAt(sName,false);        if(layerRec)        {            layerRec.IsOff = false;            alert("成功顯示圖層");        }     } }

F. 鎖定圖層

鎖定後的圖層上的實體不能編輯,但可以選擇,如果想也不能選擇,設定控制元件InitSet屬性值為: SelectLockLayer=N

下面演示,遍歷所有圖層表記錄,並設定圖層為鎖定狀態,

例如程式碼 JS:

  function LockeAllLayer() {    //返回控制元件的資料庫物件    var database = mxOcx.GetDatabase();    //返回資料庫中的層表物件     var layerTable = database.GetLayerTable();    //建立一個遍歷層表中所有圖層的遍歷器    var iter = layerTable.NewIterator();    for (; !iter.Done(); iter.Step())    {        //返回遍歷器當前位置的記錄        var layerRec = iter.GetRecord();        layerRec.IsLocked = true;        alert("成功鎖定圖層");    }}

F. 凍結圖層

被凍結上的圖層實體,不會參顯示資料的生成,這樣可以加快顯示速度,和開啟圖紙的速度,它與關閉屬性相比,凍結後的圖層不但看不見,並且在記憶體中也不參加顯示。

             // 凍結選擇實體的層。                var ent = mxOcx.GetEntity("選擇要凍結圖層的實體:");        if(ent == null)        {            return;        }        if (ent == null)        {            return;        }        var sLayerName = ent.Layer;        var database = mxOcx.GetDatabase();                var layerTable = database.GetLayerTable();                var layerTableRec = layerTable.GetAt(sLayerName, false);        if(layerTable != null)        {            layerTableRec.IsFrozen = true;            alert("成功凍結圖層");        }

G.呼叫圖層管理介面

例如程式碼JS:

 mxOcx.SendStringToExecute("MxLayerManager");

H.得到圖層上所有物件

我們透過構造選擇集,使用圖層名過慮來得到某個層上所有物件,關於選擇集的類說明參考:

例如程式碼 JS:

         // 建立一個過濾資料連表物件。         var filter = mxOcx.NewResbuf();         // 把層名加入過濾條件,8是DXF組碼,0表示是的是一個層名。         filter.AddStringEx("0", 8);         //定義選擇集物件         var ss = mxOcx.NewSelectionSet();         // 選擇圖上的所有物件。         ss.Select2(5, null, null, null,filter);         var i = 0;        var listId = new Array();         // 遍歷所有物件,得到物件id.         for (; i < ss.Count;i++)         {             var e =  ss.Item(i);             listId.push(e.ObjectID);         }         return listId;

I. 設定指定圖層上的實體不能選擇

透過控制元件InitSet屬性,來設定特定圖層上的實體不能選擇,有關IniSet的詳細說明,參考:

比如 JS:

             // 設定Layer1,Layer2,Layer3圖層上的實體不能選擇            mxOcx.Iniset = "DisableSelectLayer=Layer1;Layer2;Layer3";

J. 設定CAD實體物件,到指定層上

實體物件都有一個層屬性,可以直接修改該屬性。

比如JS:

        var   ent = mxOcx.GetEntity("選擇圖層的實體:");        if(ent == null)        {            return;        }        if (ent == null)        {            return;        }                // 得到資料庫物件.        var database = mxOcx.GetDatabase();        // 得到層表.        var layerTable = database.GetLayerTable();        var sLayerName = "layer";        // 得到層。        var layer = layerTable.GetAt(sLayerName, true);        if (layer == null)        {            // 如果沒有層,就新建一個層。            mxOcx.AddLayer(sLayerName);        }        else        {            // 如果層被刪除,就反刪除。            layer.SetProp("unErase", null);        }        // 設定實體層名到指定層上。        ent.Layer = sLayerName;        alert("已將該實體設定到指定圖層");

K.判斷該層上是否有物件,是不是一個  無用 的層。

在CAD圖上,一般需要遍歷所有塊表記錄中的實體物件,才判斷某個圖層上是有物件實體,然後才能放心刪除一個圖層,因為一個圖層上如果有實體物件,你刪除該圖層時,實體物件就會引用一個無效的圖層。

所以控制元件專門提供一個定製函式,用來判斷該圖上是否有實體物件:

比如 JS:

       MxDrawResbuf param = (MxDrawResbuf)axMxDrawX1.Call("ExApp_isUselessLayer", "圖層1");        if(param.AtLong(1) == 1)        {            MessageBox.Show("該圖層上沒有物件");        }

L.刪除資料庫所有無用的圖層

我們提供一個定製函式,來遍歷圖上的所有物件,判斷出圖層上沒有物件,然後刪除。

比如 JS:

axMxDrawX1.Cal("ExApp_DeleteUselessLayer");

M.修改圖層亮度

控制元件提供,讓CAD圖層上的所有物件,按指定亮度顯示功能,比如亮度設定0,表示物件顯示成灰色,一般一些背景不讓修改的物件放在背景層上,然後把亮度設定成0.

Mx_SetLayerBright 函式詳細說明,參考:

Mx_SetBright&nbsp;函式詳細說明,參考:

例如設定圖層 222按50%顯示, JS程式碼:

    var param = mxOcx.NewResbuf();// 圖層名    param.AddStringEx("222");// 圖層亮度.    param.AddDoubleEx(50);// 不自動呼叫更新函式。    param.AddLongEx(0);    mxOcx.CallEx("Mx_SetLayerBright", param);

N. 得到圖層亮度

下面是得到圖層的亮度,222表示的是圖層名字。

JS程式碼:

    var ret = mxOcx.Call("Mx_GetLayerBright", "222");    if (ret.AtString(0) == "Ok")    {        alert(ret.AtDouble(1).toString());    }

O. 刪除圖層

在刪除圖層前,最好判斷一個該圖層上是否有CAD繪圖物件,如果有的話就不要刪除圖層

JS程式碼:

private bool DeleteLayer(String sLayerName)        {            // 判斷圖上是否物件。            MxDrawResbuf param = (MxDrawResbuf)axMxDrawX1.Call("ExApp_isUselessLayer", sLayerName);            if (param.AtLong(1) != 1)            {                // 圖上還有物件,不能刪除。                return false;            }            // 得到資料庫物件.            MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();            // 得到層表.            MxDrawLayerTable layerTable = database.GetLayerTable();            // 得到層。            MxDrawLayerTableRecord layer = layerTable.GetAt(sLayerName, false);            if (layer == null)            {                // 沒有該層                return false;            }            else            {                // 刪除圖層。                layer.Erase();                return true;            }        }


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

相關文章