简介图层文字样式标注样式线型显示顺序比较在网页中绘图,并为新绘的对象写扩展数据和读取扩展数据得到布局名读写dwg文件标题模型空间所有实体得到所有图块名将图块替换成dwg文件向图块记录表插入自定义实体插入图块前修改图块文字插入图块,左下角设置成插入基点求两点的距离得到样条线的,拟合点数据读取实体的中文名称返回控件的构建主版本号和副版本号得到多行文字内容
简介

此实例将演示如何获取图纸上常用的一些信息,如符号表(块表、层表、文字样式表、线型表、点样式表)、字典。点击此处在线演示


下面将介绍如何获取个符号表的一些信息,如下图所示:


15123534486359648.png

图层

新建图层

CAD中我们设置好图层后除了我们平常的绘图时选择线段的颜色,线型,线宽等作用,而且我们还可以在出图时选择性显示图形,冻结图形,已达到我们想要的效果。


主要用到函数说明:


_DMxDrawX::AddLayer


增加新的图层。详细说明如下:


参数说明

BSTR pszName

图层名


IMxDrawMcCmColor::SetRGB


设置颜色的RGB色。详细说明如下:


参数说明

[in] LONG lRed

红色

[in] LONG lGreen

绿色

[in] LONG lBlue

蓝色


js中实现代码说明:


function CreateLayer() {
    //增加新的图层
    var layerId = mxOcx.AddLayer("自定义图层");
    //返回控件的数据库对象
    var database = mxOcx.GetDatabase();
    //实体id返回实体对象
    var layer = database.ObjectIdToObject(layerId);
    //返回图层的颜色
    var newColor = layer.Color;
    //设置图层颜色
    newColor.SetRGB(255,0,0);
    //将设置的颜色赋值给图层
    layer.Color = newColor;
    //当前绘图函数的使用的图层名
    mxOcx.LayerName = "自定义图层";
    //当前控件绘图函数使用的CAD颜色索引值
    mxOcx.DrawCADColorIndex = 256;
}


效果展示:


在兼容模式下打开网页(谷歌支持4.5前的版本,火狐最新版本不支持),运行控件。效果如下:


layer1.png


用户可以通过点击新建图层按钮,新建在js代码中设置的图层,在快捷键那里可以看到新建的图层。如下图所示:


layer2.png


接下就可以运用图层了,下图是用两个图层画的。如下图所示:


layer3.png

隐藏图层

主要用到函数说明:


IMxDrawLayerTable::GetAt


得到层表中的图层对象。详细说明如下:


参数说明

[in] BSTR pName

图层名称

[in,defaultvalue(TRUE) ] VARIANT_BOOL isGetErased

图层被删除掉,是否也能成功得到


js中实现代码说明:


function HideLayer() {
    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 layerTable = database.GetLayerTable();
    //得到层表中的图层对象
    var layerRec = layerTable.GetAt(txt, false);
    if (layerRec == null)
        return;
    //返回图层是否处于关闭状态
    layerRec.IsOff = true;
    alert("成功隐藏图层");
}


效果展示:


用户可以通过点击隐藏图层按钮,触发HideLayer()事件,弹出对话框,在对话框中输入需要隐藏的图层层名,就可以成功隐藏图层。如下图所示:


layer4.png

显示图层

主要用到函数说明:


IMxDrawLayerTable::GetAt


得到层表中的图层对象。详细说明如下:


参数说明

[in] BSTR pName

图层名称

[in,defaultvalue(TRUE) ] VARIANT_BOOL isGetErased

图层被删除掉,是否也能成功得到


js中实现代码说明:


function ShowLayer() {
    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 layerTable = database.GetLayerTable();
    //得到层表中的图层对象
    var layerRec = layerTable.GetAt(txt, false);
    if (layerRec == null)
        return;
    //返回图层是否处于关闭状态
    layerRec.IsOff = false;
    alert("成功显示图层");
}


效果展示:


用户可以通过点击显示图层按钮,触发ShowLayer()事件,弹出对话框,在对话框中输入需要显示的图层层名,就可以成功显示图层。如下图所示:


layer5.png

得到所有图层名

主要用到函数说明:


IMxDrawLayerTableIterator::Step


得到层表中的图层对象。详细说明如下:


参数说明

[in,defaultvalue(TRUE) ] VARIANT_BOOL forward

为ture向前移动一位,为false向后移动位

[in,defaultvalue(TRUE) ] VARIANT_BOOL skipDeleted

是否跳过删除的对象


js中实现代码说明:


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);
}


效果展示:


用户可以通过点击得到全部图层名按钮,触发GetAllLayer()事件,则会弹出所有层层名。如下图所示:


layer13.png

打开所有图层

主要用到函数说明:


IMxDrawLayerTableIterator::Step


得到层表中的图层对象。详细说明如下:


参数说明

[in,defaultvalue(TRUE) ] VARIANT_BOOL forward

为ture向前移动一位,为false向后移动位

[in,defaultvalue(TRUE) ] VARIANT_BOOL skipDeleted

是否跳过删除的对象


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("成功显示图层");
        }

    }

}


效果展示:


用户可以通过点击打开所有图层按钮,触发OpenAllLayer()事件,将关闭的图层全部打开。如下图所示:


layer12.png

隐藏选择实体的图层

具体实现js代码如下:


  // 隐藏选择实体的层。

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;
}

锁定所有图层

具体实现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("成功锁定图层");

    }
}
文字样式

增加文字样式

用户可以增加文字样式到数据库,并设置其字体等属性,具体实现js代码如下:


  function CreateText(){
    //返回控件的数据库对象
    var database =mxOcx.GetDatabase();
    //返回数据库中的文字样式表对象
    var mxtst = database.GetTextStyleTable();
    //增加新的文字样式
    var mxtstr = mxtst.Add("duanceng");
    //设置样式
    //设置文字的TrueType字体,如果文字样式设置了TrueType字体,就不会使用前面设置shx字体
    //参数一为turetype字体名 参数二为是否粗写  参数三为是否斜写  参数四为windows字符集  参数五暂没使用
    mxtstr.SetFont("黑体", false, false, 0, 0);
    //返回文字的高度
    mxtstr.textSize = 5;

    //增加新的文字样式
    var mxtstr = mxtst.Add("duanceng1");
    //设置样式
    //设置文字的TrueType字体,如果文字样式设置了TrueType字体,就不会使用前面设置shx字体
    //参数一为turetype字体名 参数二为是否粗写  参数三为是否斜写  参数四为windows字符集  参数五暂没使用
    mxtstr.SetFont("黑体", false, false, 0, 0);
    //返回文字的高度
    mxtstr.textSize = 9;
    //返回数据库中的文字样式表对象
    //设置为当前文字样式
    database.CurrentlyTextStyle = "duanceng";
}

得到文字样式名

用户可以得到所有文字样式名,具体实现js代码如下:


  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);
}

删除文字样式

用户可以删除某个文字样式,具体实现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("成功删除文字样式");
}
标注样式

增加标注样式

_DMxDrawX::AddDimStyle


增加一个新的标注样式,如果当前已经有指定名的标注样式,就直接失败返回。详细说明如下:


参数说明

BSTR pszName

新增加的标注样式名

BSTR pszDoubleData

标注样式的实数类型属性值,格式为: "变量类型值,实数值,变量类型值,实数值... ..." 可取设置如下变量的值:第一列变量名,第二列是变量的类型值 dimaltf,143 dimasz , 41 dimcen ,141 dimdle , 46 dimdli , 43 dimexe , 44 dimexo , 42 dimgap ,147 dimlfac,144 dimrnd , 45 dimscale, 40 dimtfac,146 dimtm , 48 dimtp , 47 dimtsz ,142 dimtvp ,145 dimtxt ,140 dimaltrnd,148

BSTR pszIntData

标注样式的整数类型属性值,格式为: "变量类型值,整数值,变量类型值,整数值... ..." 可取设置如下变量的值:第一列变量数据类型,第二列变量名,第三列是变量的类型值 Int dimadec,179 Bool dimalt ,170 Int dimaltd ,171 Int dimalttd,274 Int dimalttz,286 Int dimaltu ,273 Int dimaltz ,285 Int dimaunit,275 Color dimclrd ,176 Color dimclre ,177 Color dimclrt ,178 Int dimdec ,271 Int dimfit ,287 Int dimjust ,280 Bool dimlim , 72 Bool dimsah ,173 Bool dimsd1 ,281 Bool dimsd2 ,282 Bool dimse1 , 75 Bool dimse2 , 76 Bool dimsoxd ,175 Int dimtad , 77 Int dimtdec ,272 Bool dimtih , 73 Bool dimtix ,174 Bool dimtofl ,172 Bool dimtoh , 74 Bool dimtol , 71 Int dimtolj ,283 Int dimzin , 78 Int dimunit ,270 Bool dimupt ,288 Int dimtzin ,284 Int dimfrac ,276 Int dimlunit,277 Int dimatfit,289 Int dimtmove,279 Int dimazin, 79

BSTR pszStringData

标注样式的字符串类型属性值,格式为: "变量类型值,字符串值,变量类型值,字符串值... ..." 可取设置如下变量的值:第一列变量名,第二列是变量的类型值 dimapost,4 dimpost,3

BSTR pszIdData

标注样式的对象id类型属性值,格式为: "变量类型值,对象id值,变量类型值,对象id值... ..." 可取设置如下变量的值:第一列变量名,第二列是变量的类型值 dimblk, 342 dimblk1, 343 dimblk2, 344 dimldrblk,341 dimtxsty,340


js代码增加一个标注样式:


   var idTextStyleId = mxOcx.AddTextStyle1("MyTextStyle", "italicc.shx", "gbcbig.shx", 0.7);
                   // 文字高度140,2.5
                // 标注精度: 271,4
 var idDimStyleId = mxOcx.AddDimStyle("MyTest", "41,0.25,141,0.09,40,203,140,2.5", "271,4",
                  "", string.Format("340,{0}", idTextStyleId) );
   var dimRec = mxOcx.ObjectIdToObject(idDimStyleId);           
    // 设置小数点分隔符.
    dimRec.SetDimVarInt(278, '.');              
    // 测量比例因子: 144,2
    dimRec.SetDimVarDouble(144, 2);


用户可以增加标注样式到数据库,具体实现js代码如下:


  function CreateDim(){
    //返回控件的数据库对象
    var database =mxOcx.GetDatabase();
    //返回数据库中的标注样式表对象
    var mxdim = database.GetDimStyleTable();
    //增加新的标注样式
    var dimstr = mxdim.Add("mydim");
    //设置样式
    dimstr.SetDimVarDouble(40, 20.0);
    //返回数据库中的标注样式表对象
    database.CurrentlyDimstyleName = "mydim";

}

得到标注样式名

用户可以得到所有标注样式名,具体实现js代码如下:


  function GetAllDim() {
    var database = mxOcx.GetDatabase();
    // 得到所有图层名
    var sRet = null;
    //返回数据库中的文字样式表对象
    var spDimStyleTable = database.GetDimStyleTable();
    //创建一个遍历层表中所有图层的遍历器
    var spIter = spDimStyleTable.NewIterator();
    //移动当前遍历器位置
    for(;!spIter.Done();spIter.Step(true,true))
    {
        //返回遍历器当前位置的记录
        var spDimStyleTableRec = spIter.GetRecord();
        //符号表记录名属性
        var sName = spDimStyleTableRec.Name;
        // 0零层不参加比较
        if(sName != "0")
        {
            if(sRet == null)
                sRet = sName;
            else
            {
                sRet = sRet +","+sName;
            }
        }
    }
    alert(sRet);
}

删除标注样式

用户可以得到删除某个标注样式,具体实现js代码如下:


 function DelDim() {
    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 DimStyleTable = database.GetDimStyleTable();
    //得到样式表表中的样式对象
    var DimStyleRec = DimStyleTable.GetAt(txt, false);
    if (DimStyleRec == null)
        return;
    //删除对象
    DimStyleRec.Erase();
    alert("成功删除标注样式");
}
线型

增加线型

主要用到函数说明:


_DMxDrawX::AddLinetype


增加一个线型定义。详细说明如下:


参数 说明

BSTR pszName

线型名

BSTR pszLineDefine

线定义字符串


用户可以增加线型到数据库,具体实现js代码如下:


 //新建一个线型
function CreateLineType() {
    //定义虚线数据据,"MyLineType"是线型名,"6,-8"是虚线的一个单位定义,6是实线长,-8是空格长。
    var linetypeId= mxOcx.AddLinetype("MyLineType3", "6,-10");
    //返回控件的数据库对象
    var database = mxOcx.GetDatabase();
    //实体id返回实体对象
    var linetype = database.ObjectIdToObject(linetypeId);
    //设计当前线型为"MyLineType"
    database.CurrentlyLineTypeName  = "MyLineType3";
    alert("添加成功");
}


用户可以增加一个点划线虚线线型到数据库,具体实现js代码如下:


function CreateLineType1() {
   
    var linetypeId= mxOcx.AddLinetype("MyLineType1", "10,-2,3,-2");
    //返回控件的数据库对象
    var database = mxOcx.GetDatabase();
    //实体id返回实体对象
    var linetype = database.ObjectIdToObject(linetypeId);
    //设计当前线型为"MyLineType1"
    database.CurrentlyLineTypeName  = "MyLineType1";
    alert("添加成功");
}


用户可以增加一个带有形的线型到数据库。


主要用到函数说明:


_DMxDrawX::AddTextStyle1


向数据库中增加一个文字样式。详细说明如下:


参数 说明

BSTR pszName

文字样式名称

BSTR pszFileName

shx文件名

BSTR pszBigFontFileName

big shx文件名

DOUBLE dXScale

文字宽度缩放比例


_DMxDrawX::AddLinetypeEx


增加一个带文字的复杂线型。详细说明如下:


参数 说明

BSTR pszName

线型名

BSTR pszLineDefine

线型定义字符串

BSTR pszTextStyle

线型中的文字样式


具体实现js代码如下:


 function CreateLineType2() {
    //增加一个带有形的线型
    mxOcx.AddTextStyle1("MyLineTypeTextStyle", "txt.shx", "hztxt.shx", 1);
    var linetypeId= mxOcx.AddLinetypeEx ("MyLineType2", "(12.7,(\"T=MxDraw\",\"S=2.54\",\"L=-5.08\",\"R=0.0\"," +
        "\"X=-2.54\",\"Y=-1.27\"),-10.08)","MyLineTypeTextStyle");
    //返回控件的数据库对象
    var database = mxOcx.GetDatabase();
    //实体id返回实体对象
    var linetype = database.ObjectIdToObject(linetypeId);
    //设计当前线型为"MyLineType2"
    database.CurrentlyLineTypeName  = "MyLineType2";
    alert("添加成功");
}

得到线型名

用户可以得到所有线型名,具体实现js代码如下:


  
     function GetAllLineType() {
    var database = mxOcx.GetDatabase();
    // 得到所有图层名
    var sRet = null;
    //返回数据库中的线型表对象
    var spLinetypeStyleTable = database.GetLinetypeTable();
    //创建一个遍历所有线型的遍历器
    var spIter = spLinetypeStyleTable.NewIterator();
    //移动当前遍历器位置
    for(;!spIter.Done();spIter.Step(true,true))
    {
        //返回遍历器当前位置的记录
        var spLinetypeStyleTableRec = spIter.GetRecord();
        //符号表记录名属性
        var sName = spLinetypeStyleTableRec.Name;
        // 0零层不参加比较
        if(sName != "0")
        {
            if(sRet == null)
                sRet = sName;
            else
            {
                sRet = sRet +","+sName;
            }
        }
    }
    alert(sRet);
}

删除线型

用户可以得到删除某个线型,具体实现js代码如下:


function DelLineType() {
    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 LinetypeStyleTable = database.GetLinetypeTable();
    //得到线型表中的线型对象
    var LinetypeStyleRec = LinetypeStyleTable.GetAt(txt, false);
    if (LinetypeStyleRec == null)
        return;
    //删除对象
    LinetypeStyleRec.Erase();
    alert("成功删除线型");
    mxOcx.Regen();
}
显示顺序

在用户设计图纸时,在默认情况下,重叠对象(例如文字、宽多段线和实体填充多边形)通常按其创建次序显示:新创建的对象显示在现有对象前面。本实例演示了如何控制显示顺序,具体实现js代码如下:


function MxOrder() {

    var database = mxOcx.GetDatabase();
    var ret = database.GetProp("getMinDrawOrder");
    var lMin = ret.AtLong(0);

    var ret2 = database.GetProp("getMaxDrawOrder");
    var lMax = ret2.AtLong(0);

    var sTemp = mxOcx.DrawImage(0, 0, 0, 0, "D:\\mxcad.jpg");
    var ent = database.ObjectIdToObject(sTemp);

    var res = mxOcx.NewResbuf();
    res.AddLong(lMin + 2);

    ent.SetProp("drawOrder", res);
    mxOcx.ZoomAll();
}


由上述设置的js代码可以将我们插入的图片显示到最开始绘制的两个实体之上,之后绘制的实体之下。效果如下图所示:


toolbar.png

比较

全图比较

怎么比较两个CAD图纸文件修改前后的不同部分呢?在工程图纸设计中,我们更多情况下可能需要对同一张工程图的前后修改部分进行对比,以确定工程图纸的改动部分及追溯原因,本教程演示了几种常见的比较方法。点击此处在线演示


实现图纸比较功能,首先将两个控件放入网页中,js代码如下:


<p align="center">

  <object classid="clsid:74A777F8-7A8F-4e7c-AF47-7074828086E2" id="MxDrawXCtrl1"  codebase="http://www.mxdraw.com/MxDrawX52.CAB#version=7.0.0.1" width=48% height=85% align="left">
    <param name="_Version" value="65536">
    <param name="_ExtentX" value="24262">
    <param name="_ExtentY" value="16219">
    <param name="_StockProps" value="0">
    <param name="IsRuningAtIE" value="1">
    <param name="EnablePrintCmd" value="1">
    <param name="ShowStatusBar" value="1">
    <param name="ShowMenuBar" value="1">
    <param name="ShowToolBars"  value="1">
    <param name="ShowCommandWindow" value="1">
    <param name="ShowModelBar" value="1">
    <param name="Iniset" value="AutoActive=N,LoadMrx=PropertyEditor">

    <param name="ToolBarFiles" value="MxDraw-ToolBar.mxt,MxDraw-ToolBar-DrawParam.mxt,MxDraw-ToolBar-Draw.mxt,MxDraw-ToolBar-Edit.mxt">
    <SPAN STYLE="color:red">不能装载CAD控件。请确认你可以连接网络或者检查浏览器的选项中安全设置。<a href="http://www.mxdraw.com/MxDrawX52.msi">http://www.mxdraw.com/MxDrawX52.msi 安载CAD控件</a></SPAN>
  </object>
  <object classid="clsid:74A777F8-7A8F-4e7c-AF47-7074828086E2" id="MxDrawXCtrl2"  codebase="http://www.mxdraw.com/MxDrawX52.CAB#version=7.0.0.1"width=48% height=85% align="right">
    <param name="_Version" value="65536">
    <param name="_ExtentX" value="24262">
    <param name="_ExtentY" value="16219">
    <param name="_StockProps" value="0">
    <param name="IsRuningAtIE" value="1">
    <param name="EnablePrintCmd" value="1">
    <param name="ShowStatusBar" value="1">
    <param name="ShowMenuBar" value="1">
    <param name="ShowToolBars"  value="1">
    <param name="ShowCommandWindow" value="1">
    <param name="ShowModelBar" value="1">
    <param name="Iniset" value="AutoActive=N,LoadMrx=PropertyEditor">

    <param name="ToolBarFiles" value="MxDraw-ToolBar.mxt,MxDraw-ToolBar-DrawParam.mxt,MxDraw-ToolBar-Draw.mxt,MxDraw-ToolBar-Edit.mxt">
    <SPAN STYLE="color:red">不能装载CAD控件。请确认你可以连接网络或者检查浏览器的选项中安全设置。<a href="http://www.mxdraw.com/MxDrawX52.msi">http://www.mxdraw.com/MxDrawX52.msi 安载CAD控件</a></SPAN>
  </object>


首先通过id得到两个控件,返回控件的数据库对象,把两个控件里面不同的内容标记出来,具体实现js代码如下:


function AllCompare() {
    var ocx1 = document.getElementById("MxDrawXCtrl1");
    var ocx2 = document.getElementById("MxDrawXCtrl2");

    var database1 = ocx1.GetDatabase();
    var database2 = ocx2.GetDatabase();

    var filter = ocx1.NewResbuf();
    var compare1 = ocx1.NewComObject("IMxDrawCompare");
    //开始比较
    //参数一为比较时使用的原始文件 参数二为修改后的,新的文件 参数三为过滤条件
    compare1.Do(database1, database2, filter);
    //返回比较后,被修改的曲线id
    var aryDifferent1 = compare1.GetCurveIdsOfTheDifferent();
    //把修改的地方,标记出来
    //参数一为缩放比例
    //参数二为当前图纸,是新修改的图纸,该变量为true,那么在原图不能找到的对象,为新增加对象
    compare1.DrawFlag(1.0,false);
    // 反过来比较一下,用来确定,那些对象是新增加的。
    var compare2 = ocx1.NewComObject("IMxDrawCompare");

    compare2.Do(database2, database1, filter);

    var aryDifferent2 = compare2.GetCurveIdsOfTheDifferent();

    compare2.DrawFlag(1.0,true);

    var iErase = 0;
    var iModify = 0;
    var iAdd = 0;

    for (var i = 0;i < aryDifferent1.Count; i++)
    {
        //返回链表中的指定位置的对象id
        var lId = aryDifferent1.AtObjectId(i);
        //返回比较后,被修改的曲线的位置。用于图上标记被修改的对象
        if(compare1.GetIsErase(lId))
        {
            iErase = iErase + 1;
        }
        else
        {
            iModify = iModify +1;
        }
    }
    for(var i = 0; i < aryDifferent2.Count;i++)
    {
        var lId = aryDifferent2.AtObjectId(i);
        if(compare2.GetIsErase(lId))
        {
            iAdd = iAdd + 1;
        }
    }

    var modfColor = ocx1.NewComObject("IMxDrawModifyTheColor");
    modfColor.Do(ocx1.GetDatabase(),3289650);
    //把指定实体颜色
    modfColor.DoEntity(aryDifferent1,255);

    alert(iModify + "对象修改," + iErase + "对象删除," + iAdd + "对象被增加");
}


网页中演示效果如下,用户可以比教在两个控件里面的图纸内容。


ieprint.png

选择范围比较

首先通过id得到两个控件,返回控件的数据库对象,把两个控件里面不同的内容标记出来,具体实现js代码如下:


function DoImpCompare(points, filter) {

    var ocx1 = document.getElementById("MxDrawXCtrl1");
    var ocx2 = document.getElementById("MxDrawXCtrl2");

    var database1 = ocx1.GetDatabase();
    var database2 = ocx2.GetDatabase();

    var compare1 = ocx1.NewComObject("IMxDrawCompare");
    compare1.Bound = points;

    compare1.Do(database1, database2, filter);

    var aryDifferent1 = compare1.GetCurveIdsOfTheDifferent();

    compare1.DrawFlag(1.0, false);
    // 反过来比较一下,用来确定,那些对象是新增加的。
    var compare2 = ocx1.NewComObject("IMxDrawCompare");
    compare2.Bound = points;
    compare2.Do(database2, database1, filter);

    var aryDifferent2 = compare2.GetCurveIdsOfTheDifferent();
    
    compare2.DrawFlag(1.0, true);
    
    var iErase = 0;
    var iModify = 0;
    var iAdd = 0;
    for (var i = 0; i < aryDifferent1.Count; i++) {
        var lId = aryDifferent1.AtObjectId(i);
        if (compare1.GetIsErase(lId)) {
            iErase = iErase + 1;
        }
        else {
            iModify = iModify + 1;
        }
    }
    for (var i = 0; i < aryDifferent2.Count; i++) {
        var lId = aryDifferent2.AtObjectId(i);
        if (compare2.GetIsErase(lId)) {
            iAdd = iAdd + 1;
        }
    }
    alert(iModify + "对象修改," + iErase + "对象删除," + iAdd + "对象被增加");
}


用户可以选取范围内的图纸作比较,具体实现js代码如下:


function BoundCompare() {

    var ocx1  = document.getElementById("MxDrawXCtrl1");
    var getPt = ocx1.NewComObject("IMxDrawUiPrPoint");
    getPt.message = "点取第一点";
    if(getPt.go() != 1)
        return;
    var frstPt = getPt.value();
    var getCorner = ocx1.NewUtility();
    var secondPt =  getCorner.GetCorner(frstPt,"点取第二点:");
    if(secondPt == null)
        return;
    var points = ocx1.NewComObject("IMxDrawPoints");
    points.Add2(frstPt);
    points.Add2(secondPt);
    var filter = ocx1.NewResbuf();
    DoImpCompare( points, filter);
}


网页中演示效果如下,用户可以比教在两个控件里面的图纸内容。


ieprint.png

选择圆形范围比较

通过圆形范围把两个控件里面不同的内容标记出来,首先需要动态画一个圆,具体实现js代码如下:


  function DoDynWorldDrawFun(dX, dY, pWorldDraw, pData) {
    var sGuid = pData.Guid;
    var ocx1 = document.getElementById("MxDrawXCtrl1");
    ocx1.SetEventRet(0);
    if (sGuid == "DrawCircle") {
        var pt1 = pData.GetPoint("pt1");
        if (pt1 == null)
            return;
        var pt2 = ocx1.NewPoint();
        pt2.x = dX;
        pt2.y = dY;
        var dR = pt1.DistanceTo(pt2);
        pWorldDraw.DrawCircle(pt1.x, pt1.y, dR);
    }

}


用户可以选取圆形范围内的图纸作比较,具体实现js代码如下:


function CircleCompare() {
    var mxOcx  = document.getElementById("MxDrawXCtrl1");
    var getPt1 = mxOcx.NewComObject("IMxDrawUiPrPoint");
    getPt1.message = "指定圆心";
    if (getPt1.go() != 1) {
        return;
    }
    var getPt2 = mxOcx.NewComObject("IMxDrawUiPrPoint");
    getPt2.message = "指定圆上一点";
    getPt2.basePoint = getPt1.value();
    var spDrawData = getPt2.InitUserDraw("DrawCircle");
    spDrawData.SetPoint("pt1", getPt1.value());
    getPt2.setUseBasePt(true);
    if (getPt2.go() != 1) {
        return;
    }
    var cen = getPt1.value();
    var pt2 = getPt2.value();
    var dR = cen.DistanceTo(pt2);
    var circle = mxOcx.NewEntity("IMxDrawCircle");
    circle.Center = cen;
    circle.Radius = dR;
    var points = circle.GetSamplePoints(0.1);

    if (points.Count < 3) {
        alert("圆太小");
    }
    var filter = mxOcx.NewResbuf();
    DoImpCompare(points, filter);
}


网页中演示效果如下,用户可以比教在两个控件里面的图纸内容。


ieprint.png

在网页中绘图,并为新绘的对象写扩展数据和读取扩展数据

在网页中绘图,并为新绘的对象写扩展数据和读取扩展数据。下面帮助的完整例子,在控件安装目录的 Sample\Ie\iedemo.htm 中。


主要用到函数说明:


_DMxDrawX::InsertBlock


向数据库中插入一个图块,DWG图块文件可以是本地文件,也可以是网络文件。详细说明如下:函数成功返回1,失败返回0。


参数说明
BSTR pszDwgFileName

图块定义的dwg 文件,支持http://开头的网络路径

BSTR pszBlockName

新插入的图块名


_DMxDrawX::DrawBlockReference


绘制一个块引用对象,返回新绘的对象id。详细说明如下:


参数说明
DOUBLE dPosX  

插入点的X坐标

DOUBLE dPosY

插入点的Y坐标

BSTR pszBlkName

图块名

DOUBLE dScale  

图块缩放比例

DOUBLE dAng

图块的旋转角度


MxDrawDatabase::ObjectIdToObject


由实体id返回实体对象。


MxDrawEntity::SetXData


设置实体的扩展数据,详细说明如下:


参数说明
[in] IMxDrawResbuf* pXData

扩展数据链表


MxDrawEntity::GetXData


返回实体的扩展数据。


js中实现代码说明:


绘制一个块引用对象,并向新绘的对象写一个扩展数据,比如GUID,用来标识它。


// 得到网页中的控件对象
mxOcx = document.all.item("MxDrawXCtrl");
mxOcx.focus();
 
把服务器上的dwg文件,插入到控件中,也可以是一个本地文件.
if(mxOcx.InsertBlock("http://www.mxdraw.com/downland/test.dwg","MyBlkName") != 0)
{
// 与用户交互,从图上点取一个插入点.
    var point = mxOcx.GetPoint(null,"\n 点插入点:");
if(point == null)
{
// 用点击了取消键.
return;
}
// 绘制一个块引用对象,point.x,point.y是插入位置,MyBlkName是引用的块表记录名称.
    var blkRefId = mxOcx.DrawBlockReference(point.x,point.y,"MyBlkName",1.0,0.0);
 
    // 得到控件的数据库对象.
         
    var database = mxOcx.GetDatabase();
    //由块引用对象id,得到块引用实体. 
    var ent = database.ObjectIdToObject(blkRefId);
 
    if(ent == null)
    {
          alert("插入失败");
return;
     }
 
// 为新插入的对象写一个扩展数据,值为"guid val 324322"
         WriteGuid("guid val 324322",ent,mxOcx)
 
// 缩放视区,把所有实体都放到视区中显示.
         mxOcx.ZoomAll();
alert("插入成功");
     }
     else
     {
alert("插入失败");
     }
}


读取扩展数据:


// 得到网页中的控件对象.
var mxOcx = document.all.item("MxDrawXCtrl");
 
// 与用户交互,在图上选择一个实体
var ent = mxOcx.GetEntity("选择要读扩展数据的实体:");
 if(ent == null)
  {
// 用户取消了选择.
          return;
}
// 得到WriteGuid函数写的扩展数据.
  alert(ReadGuid(ent) );


写扩展数据:


 
function WriteGuid(guid,ent,mxOcx)
{
// 创建一个扩展数据连表对象.
var exData = mxOcx.CallCustomFunction("Mx_NewResbuf","");

// 添一个扩展数据,应用程序名,1001是AutoCAD dxf组码,表示"对象标注id数据"是一个扩展数据名称.
         exData.AddString("对象标注id数据",1001);

// 设置一个字符串扩展数据,1000是AutoCAD dxf组码,表示是一个字符串
          exData.AddString(guid,1000);
 
// 设置对象扩展数据.
         ent.SetXData(exData);
}
得到布局名

js代码如下:


  var database = mxOcx.GetDatabase();
var sRet = null;
//返回数据库中的布局字典
var spLayoutDictionary = database.GetLayoutDictionary();
//创建一个遍历器
var spIter = spLayoutDictionary.NewIterator();
//移动当前遍历器位置
for(;!spIter.Done();spIter.Step())
{
    //返回遍历器当前位置的记录
    var spLayoutDictionaryRec = spIter.GetObject();
    
    var sName = spLayoutDictionaryRec.LayoutName;
    // 0零层不参加比较
    if(sName != "0")
    {
        if(sRet == null)
            sRet = sName;
        else
        {
            sRet = sRet +","+sName;
        }
    }
}
alert(sRet);


得到控件所有的布局名,js代码如下:


   function myclick()
        {
            var ocx = document.getElementById("MxDrawXCtrl");
            var ret = ocx.Call("GetAllLayoutName", "");           
             if(ret.Count > 1)
            {
                var i = 1;                
                for(;i < ret.Count;i++)
                    {
                            alert(ret.AtString(i));
                    }
            }            
            else
            {
                alert("没有得到");
            }
        }
读写dwg文件标题

js代码如下:


 function ReadDwgTitle() {

    var database = mxOcx.GetDatabase();
    var param = mxOcx.NewResbuf();

    param.AddString("MyTitleVal");

    // 设置dwg文件说明信息标题为"MyTitleVal"
    database.SetProp("setTitle", param);

    // 取dwg文件说明信息标题.
    var ret = database.GetProp("getTitle");
    alert(ret.AtString(0));

}
模型空间所有实体

js代码如下:


  function ModelSpaceEntity() {
    var database = mxOcx.GetDatabase();
    var blkRec = database.GetBlockTable().GetAt("*Model_Space");
    var iter = blkRec.NewIterator();

    if (iter == null)
        return;
    var iNum = 0;
    // 循环得到所有实体

    for (; !iter.Done(); iter.Step(true, false))
    {
        // 得到遍历器当前的实体
        iNum++;

    }
    alert(iNum.toString());

}
得到所有图块名

js代码如下:


 function GetAllBlock() {
    var database = mxOcx.GetDatabase();
    var blkTab = database.GetBlockTable();
    var iter = blkTab.NewIterator();
    for (; !iter.Done(); iter.Step())
    {
        var blkRec = iter.GetRecord();
        alert(blkRec.Name);

    }
}
将图块替换成dwg文件

js代码如下:


function blkchangedwg() {

    var ent = mxOcx.GetEntity("选择图面的属性块:");
    if(ent == null)
    {
        return;
    }
    if (ent.ObjectName != "McDbBlockReference") {
        alert("选择的对象不是块引用");
    }
    else
    {
        var blkref = ent;
        var sBlkFilePath = mxOcx.GetOcxAppPath() + "\\Blk\\Rect.dwg";
        mxOcx.InsertBlock(sBlkFilePath, "MyBlk2");

        var curDatabase = mxOcx.GetDatabase();
        var blkTable = curDatabase.GetBlockTable();
        var myblkRec =  blkTable.GetAt("MyBlk2", false);
        if(myblkRec == null)
        {
            return;
        }
        blkref.BlockTableRecordId = myblkRec.ObjectID;
    }
}
向图块记录表插入自定义实体

js代码如下:


function insertentity() {
    var database = mxOcx.GetDatabase();
    var blkRec = database.CurrentSpace();
    // 调用AddCustomEntity函数绘制自定义实体。 逗号后的字符串"DrawCustEntity"是自定义实体的GUID
    var ret =  blkRec.GetProp("AddCustomEntity,DrawCustEntity");
    // 得到自定义实体。
    var ent = database.ObjectIdToObject(ret.AtObjectId(0));
    // 设置自定义实体的属性。
    ent.BeginSetValue();
    ent.SetDouble("Width", 30);

    var pt1 =mxOcx.NewPoint();
    pt1.x = 10;
    pt1.y = 10;

    var pt2 = mxOcx.NewPoint();
    pt2.x = 20;
    pt2.y = 20;
    ent.SetPoint("Point1", pt1);
    ent.SetPoint("Point2", pt2);
    ent.SetLong("Count", 2);
    ent.EntSetValue();
}
插入图块前修改图块文字

js代码如下:


    
  // 插入块的块名。
var sBlkName = "MyBlkName";

// 把要插入的块文件引入到控件数据库中。
var sBlkFile = mxOcx.GetOcxAppPath() + "\\Blk\\attribblock.dwg";
mxOcx.InsertBlock(sBlkFile, sBlkName);

// 取到控件数据库
var database = mxOcx.GetDatabase();

// 得到块表对象
var blkTable = database.GetBlockTable();

// 当前块表中是否已经有名为sBlkName的块表记录
var blkRec = blkTable.GetAt(sBlkName, true);
if (blkRec == null)
{
    // 证明InsertBlock函数失败,没有成功把文件插入数据库中。
    return;
}

// 创建一个用于遍历块表遍历器
var iter = blkRec.NewIterator();
if (iter == null)
    return;

for (; !iter.Done(); iter.Step(true, false))
{
    // 得到遍历器当前的实体
    var ent = iter.GetEntity();
    if (ent == null)
        continue;
    if (ent.ObjectName == "McDbText") {
        // 当前实体是一个文字
        var text =ent;
        // 修改文字内容为 "MyContent"
        text.TextString = "MyContent";
    }

}

// 创建块引用,把图块插入到当前空间,并显示。
mxOcx.DrawBlockReference(0, 0, sBlkName, 1.0, 0.0);
插入图块,左下角设置成插入基点

js代码如下:


  // 插入块的块名。
var sBlkName = "junxing";
// 把要插入的块文件引入到控件数据库中。
var sBlkFile = mxOcx.GetOcxAppPath() + "\\Blk\\attribblock.dwg";
mxOcx.InsertBlock(sBlkFile, sBlkName);
var database = mxOcx.GetDatabase();
var blkTab =  database.GetBlockTable();
var rec = blkTab.GetAt("junxing");
if (rec == null)
    return;
var iter = rec.NewIterator();
var dMinX = 0, dMinY = 0;
var isSet = false;
for (; !iter.Done(); iter.Step())
{
    var  ent = iter.GetEntity();
    var pt1 =mxOcx.NewPoint();
    var pt2 =mxOcx.NewPoint();
    ent.GetBoundingBox(pt1,pt2);
    if (pt1 == null)
        continue;

    if (isSet)
    {
        if (dMinX > pt1.x)
            dMinX = pt1.x;

        if (dMinY > pt1.y)
            dMinY = pt1.y;
    }
    else
    {
        dMinX = pt1.x;
        dMinY = pt1.y;
        isSet = true;
    }
}
if (isSet)
{
    var pt =mxOcx.NewPoint();
    pt.x = dMinX;
    pt.y = dMinY;
    rec.Origin = pt;

}
mxOcx.DrawBlockReference(0, 0, "junxing", 1, 0);
mxOcx.ZoomAll();
求两点的距离

js代码如下:


  function PointDis() {

    var point1 = mxOcx.GetPoint(false,0,0,"\n 点取第一点:");
    if(point1 == null)
    {
        alert("用户取消");
        return;
    }
    var point2 = mxOcx.GetPoint(true,point1.x,point1.y,"\n 点取第二点:");
    if(point1 == null)
    {
        alert("用户取消");
        return;
    }
    var dDis=Math.abs((point1.x - point2.x) * (point1.x - point2.x)
        + (point1.y - point2.y) * (point1.y - point2.y));
    alert("两点距离:" + dDis.toString());

}
得到样条线的,拟合点数据

js代码如下:


  function GetFitPoints () {
    var ent = mxOcx.GetEntity("选择样条线");
    if (ent == null)
        return;
    if (ent.ObjectName == "McDbSpline"){
        var spl =ent;
        var fitPoints = spl.GetFitPoints();

        for (var i = 0; i < fitPoints.Count; i++)
        {
            var pt = fitPoints.Item(i);

            alert(pt.x.toString() + "," + pt.y.toString());
        }
    }

}
读取实体的中文名称

js代码如下:


  function getentityname() {
    var ent = mxOcx.GetEntity("选择实体");
    if (ent == null)
        return;
    var ret = ent.GetProp("getName");
   alert(ret.AtString(0));
}
返回控件的构建主版本号和副版本号

主要用到函数说明:


_DMxDrawX::AddLayer


返回控件的构建主版本号和副版本号。详细说明如下:


参数 说明

iMajor

返回控件的主版本号

iMinor

返回控件的附版本号


js代码如下:


        var pRet = mxOcx.Cal("GetBulidVersion");
        alert("Major:" + pRet.AtLong(1) + "Minor:" + pRet.AtLong(2));
得到多行文字内容

js代码如下:


// 与用户交互,在图上选择一个实体
          var ent = mxOcx.GetEntity("选择多行文字:");
          if(ent == null)
       {
   // 用户取消了选择.
              return;
       }
        var param = mxOcx.NewResbuf();
        param.AddObjectId(ent.ObjectID);
        var ret = mxOcx.CallEx("Mx_GetMTextContent", param);
if(ret.AtString(0) == "Ok")
              {
   alert(ret.AtString(1));
              }
梦想CAD是专业的CAD插件(控件),可轻松在网页、手机及BS/CS程序中浏览编辑DWG文件,不需安装AutoCAD即可运行。经十余年累积已非常稳定可靠,有关键的空间搜索算法,并使用汇编优化,可同时处理50万级实体,有非常高的图形显示和处理效率。
技术服务
TEL:400-888-5703
185-8173-1060
客服I QQ: 3570505660
技术I QQ: 827867134
技术II QQ:6884123
产品购买
TEL:156-8136-8971
QQ:710714273
用户交流
控件QQ交流群1:73281982
控件QQ交流群2:112199959
MxCAD软件群 1:515771658
技术I:QQ
827867134
客服I:QQ
3570505660
销售QQ
710714273
联系电话400-888-5703