前言:近日,接到一些无理的需求,需要在网页上实现预览CAD图纸文件(dwg格式)。为此,本人特意去各大学术论坛调研(百度、Google)。最终寻找到以下方法,本着开源的精神,在此分享出来。
注意:只支持IE浏览器、360浏览器标准模式
以下内容是代码部分
index.html
MxDrawX ActiveX 5.2
function alert(str)
{
var mxOcx = document.getElementById("MxDrawXCtrl");
if(mxOcx)
mxOcx.Call("Mx_Alert",str);
}
function OpenFile()
{
var MxDrawX = document.getElementById("MxDrawXCtrl");
MxDrawX.SendStringToExecute("OpenDwg");
}
function ZoomE()
{
var MxDrawX = document.getElementById("MxDrawXCtrl");
MxDrawX.SendStringToExecute("ZoomE");
}
function WindowZoom()
{
var MxDrawX = document.getElementById("MxDrawXCtrl");
MxDrawX.SendStringToExecute("WindowZoom");
}
function ZoomR()
{
var MxDrawX = document.getElementById("MxDrawXCtrl");
MxDrawX.DoCommand(56);
}
var isShow = false;
function HideToolbar()
{
var MxDrawX = document.getElementById("MxDrawXCtrl");
MxDrawX.ShowToolBar("绘图工具",isShow);
MxDrawX.ShowToolBar("编辑工具",isShow);
isShow = !isShow;
}
function Pan()
{
var MxDrawX = document.getElementById("MxDrawXCtrl");
MxDrawX.DoCommand(55);
}
function ZoomWindow()
{
var MxDrawX = document.getElementById("MxDrawXCtrl");
MxDrawX.SendStringToExecute();
}
function HideLayoutBar()
{
var MxDrawX = document.getElementById("MxDrawXCtrl");
MxDrawX.ShowToolBars = !MxDrawX.ShowToolBars;
}
function PrintCmd()
{
var MxDrawX = document.getElementById("MxDrawXCtrl");
MxDrawX.SendStringToExecute("Plot");
}
打开DWG文件 | 范围缩放 | 窗口缩放 | 实时缩放 | 视区移动 | 显示/隐藏 工具条 | 打印 | 返回主页
绘制自定义实体 | 绘制动画 | 显示水印 | 浏览模式切换 | 设置超连接 | 绘制标记 | 写扩展数据 | 读扩展数据 | 查找图上文字 | 选择范围打印
LoadMxDrawX("https://demo.mxdraw3d.com:3562/test.dwg","https://demo.mxdraw3d.com:3562/MxDrawX52.CAB#version=11,0,0,1","https://demo.mxdraw3d.com:3562/MxDrawx86Setup.exe","https://demo.mxdraw3d.com:3562/MxChromex86Setup.exe");
控件已经购买微软代码签名证书,正常下都能自动在网页中加载,建议使用IE为内核的浏览器,CAB安装包有13M,所以加载需要一定时间(2M网络,一般3分钟左右,),请耐心等待...
如果不能加载,请关掉你电脑上的杀毒软件,特别是360安全卫土和360杀毒,然后再试...
或者下载MxDrawx86Setup.exe,MxDrawx64Setup.exe手动安装后,然后再试...
下载MxDrawX52.CAB自动安装包到本地
下载MxDrawX52.CAB...
下载MxDrawx86Setup.exe手动32位安装包到本地
下载MxDrawx86Setup.exe...
谷歌浏览器使用,安装指定Chrome内核浏览器
下载sogou_explorer_11.0.1_0722.exe...
var mxOcx = document.getElementById("MxDrawXCtrl");
function DoCustomEntity() {
document.getElementById("MxDrawXCtrl").DoCommand(1);
}
function DoDynInsert() {
document.getElementById("MxDrawXCtrl").DoCommand(2);
}
function DoCmd(iCmd) {
mxOcx.DoCommand(iCmd);
}
function DoCommandEventFunc(iCmd) {
if (iCmd == 1) {
//该函数在mxcustom.js中
InsertCustomEntity();
}
else if (iCmd == 2) {
DynInsert();
}
else if (iCmd == 3) {
InsertImage();
}
else if (iCmd == 4) {
DrawGif();
}
else if (iCmd == 5) {
ModifyImage();
}
else if (iCmd == 6) {
BrownerMode();
}
else if (iCmd == 7) {
ShowWatermark();
}
else if (iCmd == 8) {
SetHyperlink();
}
else if (iCmd == 99) {
DoUserCustomMenu();
}
else if (iCmd == 9) {
DrawFlag();
}
else if (iCmd == 10) {
CreateGroup();
}
else if (iCmd == 11) {
WriteXData();
}
else if (iCmd == 12) {
ReadXData();
}
else if (iCmd == 13) {
FindText();
}
else if (iCmd == 14) {
Print();
}
else if (iCmd == 15) {
PrintHtml();
}
else if (iCmd == 55) {
mxOcx.SendStringToExecute("P");
}
else if (iCmd == 56) {
mxOcx.SendStringToExecute("ZoomR");
}
}
function DoDynWorldDrawFun(dX, dY, pWorldDraw, pData) {
var sGuid = pData.Guid;
mxOcx.SetEventRet(0);
if (sGuid == "TestDynDraw") {
// 动态插入图块。
var firstPt = pData.GetPoint("pt1");
if (firstPt == null)
return;
var sBlkName = pData.GetString("BlkName");
var secondPt = mxOcx.NewPoint();
secondPt.x = dX;
secondPt.y = dY;
var vec = firstPt.SumVector(secondPt);
var dAng = vec.Angle();
pWorldDraw.DrawBlockReference(firstPt.x, firstPt.y, sBlkName, 1.0, dAng * 180.0 / 3.14159265 + 90.0);
mxOcx.SetEventRet(1);
}
else if (sGuid == "TestDynDraw1") {
var sBlkName = pData.GetString("BlkName");
pWorldDraw.DrawBlockReference(dX, dY, sBlkName, 1.0, 0.0);
}
}
function DynInsert() {
var sBlkName = "Tree";
var sBlkFile = mxOcx.GetOcxAppPath() + "\Blk\树.dwg";
mxOcx.InsertBlock(sBlkFile, "Tree");
var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
getPssage = "点取插入点";
var spDrawData1 = getPt.InitUserDraw("TestDynDraw1");
spDrawData1.SetString("BlkName", "Tree");
if (getPt.go() != 1) {
return;
}
var frstPt = getPt.value();
if (frstPt == null) {
return;
}
var getSecondPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
var spDrawData = getSecondPt.InitUserDraw("TestDynDraw");
getSecondPssage = "点取旋转角度";
getSecondPt.basePoint = frstPt;
getSecondPt.setUseBasePt(true);
spDrawData.SetPoint("pt1", frstPt);
spDrawData.SetString("BlkName", "Tree");
if (getSecondPt.go() != 1) {
return;
}
spDrawData.Draw();
}
function DoInputPointToolTipFun(ent) {
var sHyperlinks = ent.Hyperlinks;
if (sHyperlinks.length != 0) {
var sClassName = ent.ObjectName;
var tip = "" + sClassName +
"" + sHyperlinks + "";
mxOcx.SetEventRetString(tip);
}
ent = null;
CollectGarbage();
}
function DoHyperlinkClickFun(ent, dX, dY) {
mxOcx.GotoURL(ent.Hyperlinks);
mxOcx.SetEventRet(1);
}
function DoUserCustomMenu() {
var filter = mxOcx.NewResbuf();
var ent = mxOcx.GetPopupMenuEntity(filter);
if (ent == null)
return;
var sName = ent.ObjectName;
var sT = "点击了:" + sName + "实体";
alert(sT);
}
// 控件鼠标事件
function MouseEvent(dX, dY, lType) {
if (lType == 3) {
// 鼠标右键按下
var filter = mxOcx.NewResbuf();
// 5020 = RTDXF0,只选择直线实体,设置过滤条件
//filter.AddStringEx("LINE",5020);
var ent = mxOcx.FindEntAtPoint(dX, dY, filter);
var sPopMenu;
if (ent != null) {
mxOcx.ClearCurrentSelect();
mxOcx.AddCurrentSelect(ent.ObjectID, true, true);
sPopMenu = mxOcx.GetOcxAppPath() + "\MxPopMenuEnt.mnu"
}
else {
sPopMenu = mxOcx.GetOcxAppPath() + "\MxPopMenu.mnu"
}
mxOcx.TrackPopupMenu(dX, dY, sPopMenu);
// 设置1,表示鼠标事件,不再往下传递.
mxOcx.SetEventRet(1);
}
}
//初始化
function InitMxDrawX() {
if (mxOcx) {
if (!mxOcx.IsIniting()) {
clearInterval(mxtime);
mxOcx.ReDraw();
// 控件初始化完成,需要在启动做的事,在这里做
// 启动时打开文件
//var sDwgFile = mxOcx.GetOcxAppPath() + "\管道安装大样图.dwg";
//mxOcx.OpenDwgFile("http://demo.mxdraw3d.com:3562/test.dwg");
//....
mxOcx.ImpInputPointToolTipFun = DoInputPointToolTipFun;
console.log("Init ok")
}
}
}
mxtime = setInterval(InitMxDrawX, 100);
document.getElementById("MxDrawXCtrl").ImplementCommandEventFun = DoCommandEventFunc;
document.getElementById("MxDrawXCtrl").ImpDynWorldDrawFun = DoDynWorldDrawFun;
document.getElementById("MxDrawXCtrl").ImpInputPointToolTipFun = DoInputPointToolTipFun;
document.getElementById("MxDrawXCtrl").ImpHyperlinkClickFun = DoHyperlinkClickFun;
document.getElementById("MxDrawXCtrl").ImplementMouseEventFun = MouseEvent;
document.getElementById("MxDrawXCtrl").ImpExplodeFun = ExplodeFun;
document.getElementById("MxDrawXCtrl").ImpGetGripPointsFun = GetGripPointsFun;
document.getElementById("MxDrawXCtrl").ImpMoveGripPointsAtFun = MoveGripPointsFun;
document.getElementById("MxDrawXCtrl").ImpTransformByFun = TransformByFun;
document.getElementById("MxDrawXCtrl").ImpGetGeomExtentsFun = GetGeomExtentsFun;
function InsertImage() {
var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
getPssage = "点取图片的插入中点";
if (getPt.go() != 1) {
return;
}
var frstPt = getPt.value();
if (frstPt == null) {
return;
}
var sImageFile = mxOcx.GetOcxAppPath() + "\mxcad.jpg";
mxOcx.DrawImageMark(frstPt.x, frstPt.y, -100.0, 0.0, sImageFile, "", true);
}
function DrawGif() {
var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
getPssage = "点取图片的插入中点";
if (getPt.go() != 1) {
return;
}
var frstPt = getPt.value();
if (frstPt == null) {
return;
}
var sImageFile1 = "http://demo.mxdraw3d.com:3562/1.png";
var sImageFile2 = "http://demo.mxdraw3d.com:3562/2.png";
var sImageFile3 = "http://demo.mxdraw3d.com:3562/3.png";
// var lId = mxOcx.DrawImageMark(frstPt.x, frstPt.y, -20, 45.0 * 3.14159265 / 180.0, sImageFile1,
// sImageFile1 + "," + sImageFile2 + "," + sImageFile3, true);
var lId = mxOcx.DrawImageMark(frstPt.x, frstPt.y, 2, 0, sImageFile1,
sImageFile1 + "," + sImageFile2 + "," + sImageFile3, true);
mxOcx.TwinkeEnt(lId);
}
function ModifyImage() {
var selEnt = mxOcx.NewComObject("IMxDrawUiPrEntity");
selEnssage = "选择图像对象";
if (selEnt.go() != 1)
return;
var image = selEnt.Entity();
if (image == null)
return;
if (image.ObjectName != "McDbMxImageMark") {
alert("选择对象不是图像")
return;
}
var sImageFile = mxOcx.GetOcxAppPath() + "\mxcad.jpg";
image.ImageFile = sImageFile;
}
function geturl() {
return document.URL;
}
var isBrowner = false;
function BrownerMode() {
isBrowner = !isBrowner;
mxOcx.BrowseMode = isBrowner;
mxOcx.ShowMenuBar = !isBrowner;
mxOcx.ShowPropertyWindow = !isBrowner;
}
var iShowWatermark = false;
function ShowWatermark() {
iShowWatermark = !iShowWatermark;
if (iShowWatermark) {
mxOcx.Watermark = "http://www.mxdraw.com/download/Watermark.png" + ",20,5,5,1";
mxOcx.ViewColor = 16777215; // 背景色改成白色
}
else {
mxOcx.Watermark = "";
mxOcx.ViewColor = 0; // 背景色改成白色
}
}
function SetHyperlink() {
var selEnt = mxOcx.NewComObject("IMxDrawUiPrEntity");
selEnssage = "选择要设置的对象";
if (selEnt.go() != 1)
return;
var ent = selEnt.Entity();
if (ent == null)
return;
ent.Hyperlinks = "www.mxdraw.com";
mxOcx.DynToolTipTime = 100;
}
function CreateGroup() {
mxOcx.Prompt("选择要做成组的实体:");
var ss = mxOcx.NewSelectionSet();
// var pt1 = mxOcx.NewPoint();
// var pt2 = mxOcx.NewPoint();
// var filter = mxOcx.NewResbuf();
// ss.Select(8, pt1, pt2, filter);
ss.Select2(8, null, null, null);
var param = mxOcx.NewResbuf();
for (var i = 0; i < ss.Count; i++) {
var ent = ss.Item(i);
if (ent == null)
continue;
param.AddObjectId(ent.ObjectID);
}
if (param.Count == 0)
return;
mxOcx.CreateGroup("", param);
}
function DrawFlag() {
while (true) {
var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
getPssage = "点取绘制点";
if (getPt.go() != 1) {
return;
}
var frstPt = getPt.value();
if (frstPt == null)
return;
var dLen = mxOcx.GetCursorPickRect();
dLen = mxOcx.ViewLongToDocCoord(dLen);
dLen *= 3.0;
mxOcx.DrawVectorLine(frstPt.x - dLen, frstPt.y - dLen,
frstPt.x + dLen, frstPt.y + dLen,
255
);
mxOcx.DrawVectorLine(frstPt.x - dLen, frstPt.y + dLen,
frstPt.x + dLen, frstPt.y - dLen,
255
);
mxOcx.DrawVectorCircle(frstPt.x, frstPt.y,
dLen * 0.5, 65280);
mxOcx.UpdateDisplay();
}
}
function WriteXData() {
var selEnt = mxOcx.NewComObject("IMxDrawUiPrEntity");
selEnssage = "选择要写扩展数据的对象";
if (selEnt.go() != 1)
return;
var ent = selEnt.Entity();
if (ent == null)
return;
if (ent.SetxDataString("ExDataName", 0, "ExDataValue")) {
alert("写扩展数据成功");
}
else {
alert("写扩展数据失败");
}
}
function ReadXData() {
var selEnt = mxOcx.NewComObject("IMxDrawUiPrEntity");
selEnssage = "选择要读取扩展数据的对象";
if (selEnt.go() != 1)
return;
var ent = selEnt.Entity();
if (ent == null)
return;
var val = ent.GetxDataString2("ExDataName", 0);
if (mxOcx.IsOk()) {
alert(val);
}
else {
alert("没有扩展数!");
}
}
function FindText() {
var param = mxOcx.NewResbuf();
param.AddString("");
param.AddDouble(3);
var ret = mxOcx.CallEx("Mx_ShowMTextDialog", param);
if (ret.AtString(0) != "Ok") {
return;
}
var txt = ret.AtString(1);
var ss = mxOcx.NewSelectionSet();
var spFilte = mxOcx.NewResbuf();
// 把文字对象,当着过滤条件.
spFilte.AddStringEx("TEXT,MTEXT", 5020);
// 得到图上,所有文字对象.
ss.Select2(5, null, null, null, spFilte);
// 遍历每个文字.
var bFind = false;
for (var i = 0; i < ss.Count; i++) {
var ent = ss.Item(i);
if (ent == null)
continue;
if (ent.ObjectName == "McDbText") {
var sTxt = ent.TextString;
if (sTxt == txt) {
// 把文字放到视区中间.
mxOcx.PutEntityInView(ent.ObjectID, 300);
var dLen = mxOcx.ViewLongToDocCoord(80);
// 绘制一个标记圆.
mxOcx.DrawVectorCircle(ent.Position.x,
ent.Position.y,
dLen, 65280);
bFind = true;
}
}
else if (ent.ObjectName == "McDbMText") {
var param = mxOcx.NewResbuf();
param.AddObjectId(ent.ObjectID);
var ret = mxOcx.CallEx("Mx_GetMTextContent", param);
if (ret.AtString(0) == "Ok") {
if (ret.AtString(1) == txt) {
// 把文字放到视区.
mxOcx.PutEntityInView(ent.ObjectID, 300);
var dLen = mxOcx.ViewLongToDocCoord(80);
// 绘制一个标记圆.
mxOcx.DrawVectorCircle(ent.Location.x,
ent.Location.y,
dLen, 65280);
bFind = true;
break;
}
}
}
ent = null;
}
if (!bFind) {
alert("没有找到文字对象");
}
// 在这里必须显示释放控件的COM对象指针.
ss = null;
spFilte = null;
CollectGarbage();
}
function PrintHtml() {
var print = mxOcx.NewComObject("IMxDrawPrint");
if (print.PrintHtml(true)) {
alert("打印成功");
}
else {
alert("打印失败");
}
}
function Print() {
var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
getPssage = "点取打印范围第一点";
if (getPt.go() != 1) {
return;
}
var frstPt = getPt.value();
if (frstPt == null)
return;
var utl = mxOcx.NewUtility();
var secondPt = utl.GetCorner(frstPt, "点取打印范围第二点");
if (secondPt == null)
return;
var print = mxOcx.NewComObject("IMxDrawPrint");
if (print.Print(frstPt.x, frstPt.y, secondPt.x, secondPt.y)) {
alert("打印成功");
}
else {
alert("打印失败");
}
}
mxcustom.js
// 插入自定义实体函数
function InsertCustomEntity() {
var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
getPssage = "点取第一点";
if (getPt.go() != 1)
return;
var frstPt = getPt.value();
if (frstPt == null)
return;
var getSecondPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
getSecondPssage = "点取第二点";
getSecondPt.basePoint = frstPt;
getSecondPt.setUseBasePt(true);
if (getSecondPt.go() != 1)
return;
var secondPt = getSecondPt.value();
if (secondPt == null)
return;
var ent = mxOcx.DrawCustomEntity("TestMxCustomEntity", "");
ent.SetPoint("spt", frstPt);
ent.SetPoint("ept", secondPt);
ent.SetString("MxObjectAppName", "我的自定义实体名");
}
// 格式化字符串
function formatNumber(num, pattern) {
var strarr = num ? num.toString().split('.') : ['0'];
var fmtarr = pattern ? pattern.split('.') : [''];
var retstr = '';
// 整数部分
var str = strarr[0];
var fmt = fmtarr[0];
var i = str.length - 1;
var comma = false;
for (var f = fmt.length - 1; f >= 0; f--) {
switch (fmt.substr(f, 1)) {
case '#':
if (i >= 0) retstr = str.substr(i--, 1) + retstr;
break;
case '0':
if (i >= 0) retstr = str.substr(i--, 1) + retstr;
else retstr = '0' + retstr;
break;
case ',':
comma = true;
retstr = ',' + retstr;
break;
}
}
if (i >= 0) {
if (comma) {
var l = str.length;
for (; i >= 0; i--) {
retstr = str.substr(i, 1) + retstr;
if (i > 0 && ((l - i) % 3) == 0) retstr = ',' + retstr;
}
}
else retstr = str.substr(0, i + 1) + retstr;
}
retstr = retstr + '.';
// 处理小数部分
str = strarr.length > 1 ? strarr[1] : '';
fmt = fmtarr.length > 1 ? fmtarr[1] : '';
i = 0;
for (var f = 0; f < fmt.length; f++) {
switch (fmt.substr(f, 1)) {
case '#':
if (i < str.length) retstr += str.substr(i++, 1);
break;
case '0':
if (i < str.length) retstr += str.substr(i++, 1);
else retstr += '0';
break;
}
}
return retstr.replace(/^,+/, '').replace(/.$/, '');
}
// 自定义实体绘制函数
function ExplodeFun(pCustomEntity, pWorldDraw) {
var sGuid = pCustomEntity.Guid;
if (sGuid == "TestMxCustomEntity") {
if (!pCustomEntity.IsHave("ept"))
return;
var stp = pCustomEntity.GetPoint("spt");
if (stp == null)
return;
var ept = pCustomEntity.GetPoint("ept");
if (ept == null)
return;
var mxUtility = mxOcx.NewUtility();
var vec = ept.SumVector(stp);
vec.Mult(0.5);
var midPt = mxOcx.NewPoint();
midPt.x = stp.x;
midPt.y = stp.y;
midPt.Add(vec);
var dAng = vec.Angle();
dAng = mxUtility.GetDimAngle(dAng);
var dDis = 0.0;
dDis = stp.DistanceTo(ept);
var sTxt = "L=" + formatNumber(dDis, '#.##');
dAng = dAng * 180.0 / 3.14159265;
vec.RotateByXyPlan(3.14159265 / 2.0);
vec.Normalize();
vec.Mult(10);
stp.Add(vec);
ept.Add(vec);
pWorldDraw.DrawLine(stp.x, stp.y, ept.x, ept.y);
vec.Mult(2);
stp.Sum(vec);
ept.Sum(vec);
pWorldDraw.DrawLine(stp.x, stp.y, ept.x, ept.y);
pWorldDraw.SetColorIndex(1);
pWorldDraw.DrawText(midPt.x, midPt.y, sTxt, 5, dAng,
1, 2);
mxOcx.SetEventRet(1);
}
}
// 返回自定义实体夹点
function GetGripPointsFun(pCustomEntity) {
var sGuid = pCustomEntity.Guid;
if (sGuid == "TestMxCustomEntity") {
if (!pCustomEntity.IsHave("ept"))
return;
var stp = pCustomEntity.GetPoint("spt");
if (stp == null)
return;
var ept = pCustomEntity.GetPoint("ept");
if (ept == null)
return;
var ret = mxOcx.NewResbuf();
ret.AddPoint(stp);
ret.AddPoint(ept);
mxOcx.SetEventRetEx(ret);
}
}
// 移动自定义实体夹点
function MoveGripPointsFun(pCustomEntity, lGridIndex, dOffsetX, dOffsetY) {
var sGuid = pCustomEntity.Guid;
if (sGuid == "TestMxCustomEntity") {
if (!pCustomEntity.IsHave("ept"))
return;
var stp = pCustomEntity.GetPoint("spt");
if (stp == null)
return;
var ept = pCustomEntity.GetPoint("ept");
if (ept == null)
return;
if (lGridIndex == 0) {
stp.x = stp.x + dOffsetX;
stp.y = stp.y + dOffsetY;
pCustomEntity.SetPoint("spt", stp);
}
else {
ept.x = ept.x + dOffsetX;
ept.y = ept.y + dOffsetY;
pCustomEntity.SetPoint("ept", ept);
}
mxOcx.SetEventRet(1);
}
}
// 变换自定义实体
function TransformByFun(pCustomEntity, pMatXform) {
var sGuid = pCustomEntity.Guid;
if (sGuid == "TestMxCustomEntity") {
if (!pCustomEntity.IsHave("ept"))
return;
var stp = pCustomEntity.GetPoint("spt");
if (stp == null)
return;
var ept = pCustomEntity.GetPoint("ept");
if (ept == null)
return;
stp.TransformBy(pMatXform);
ept.TransformBy(pMatXform);
pCustomEntity.SetPoint("spt", stp);
pCustomEntity.SetPoint("ept", ept);
mxOcx.SetEventRet(1);
}
}
// 返回自定义实体最小外包
function GetGeomExtentsFun(pCustomEntity) {
var sGuid = pCustomEntity.Guid;
if (sGuid == "TestMxCustomEntity") {
if (!pCustomEntity.IsHave("ept"))
return;
var stp = pCustomEntity.GetPoint("spt");
if (stp == null)
return;
var ept = pCustomEntity.GetPoint("ept");
if (ept == null)
return;
var ret = mxOcx.NewResbuf();
ret.AddPoint(stp);
ret.AddPoint(ept);
mxOcx.SetEventRetEx(ret);
}
}
function GetOsnapPointsFun(pCustomEntity, lOsnapMode, dPickPointX, dPickPointY, dLastPointX, dLastPointY) {
// enum OsnapMode { kOsModeEnd = 1,
// kOsModeMid = 2,
// kOsModeCen = 3,
// kOsModeNode = 4,
// kOsModeQuad = 5,
// kOsModeIns = 7,
// kOsModePerp = 8,
// kOsModeTan = 9,
// kOsModeNear = 10,
// kOsModeInt = 11
// };
var sGuid = pCustomEntity.Guid;
if (sGuid == "TestMxCustomEntity")
{
if(!pCustomEntity.IsHave("ept") )
return;
var stp = pCustomEntity.GetPoint("spt");
if(stp == null)
return;
var ept = pCustomEntity.GetPoint("ept");
if(ept == null)
return;
if(lOsnapMode == 1)
{
// 端点捕捉。
var pickPoint = mxOcx.NewPoint();
pickPoint.x = dPickPointX;
pickPoint.y = dPickPointY;
var dDis1 = pickPoint.DistanceTo(stp);
var dDis2 = pickPoint.DistanceTo(ept);
var ret = mxOcx.NewResbuf();
if(dDis1 < dDis2)
{
ret.AddDouble(stp.x);
ret.AddDouble(stp.y);
}
else {
ret.AddDouble(ept.x);
ret.AddDouble(ept.y);
}
mxOcx.SetEventRetEx(ret);
}
else if(lOsnapMode == 10)
{
// 最近点捕捉.
var pickPoint = mxOcx.NewPoint();
pickPoint.x = dPickPointX;
pickPoint.y = dPickPointY;
var line = mxOcx.NewEntity("IMxDrawLine");
line.EndPoint = ept;
line.StartPoint = stp;
var closePoint = line.GetClosestPointTo2(pickPoint,false);
if(closePoint != null)
{
var ret = mxOcx.NewResbuf();
ret.AddDouble(closePoint.x);
ret.AddDouble(closePoint.y);
mxOcx.SetEventRetEx(ret);
}
}
}
}
mxocx.js
function LoadMxDrawX(dwgfile,cabpath,msipath,chrompath) {
var s, classid, Sys = {}, ua = navigator.userAgent.toLowerCase();
(s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] : (s = ua.match(/trident/([\d.]+)/)) ? Sys.ie9 = s[1] : (s = ua.match(/firefox/([\d.]+)/)) ? Sys.firefox = s[1] : (s = ua.match(/chrome/([\d.]+)/)) ? Sys.chrome = s[1] : (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] : (s = ua.match(/version/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0,
classid = "74A777F8-7A8F-4e7c-AF47-7074828086E2",
Sys.ie || Sys.ie9 ? (document.write(" "),
document.write(" "),
document.write(' '),
document.write('codebase="' + cabpath + '" width="90%" height="90%" align="left"> '),
document.write(' '),
document.write(' '),
document.write(' '),
document.write(''),
document.write(' '),
document.write(''),
document.write(' '),
document.write(' '),
document.write(' '),
document.write(''),
document.write(' '),
document.write(''),
document.write(''),
document.write(''),
document.write(''),
document.write('不能装载文档控件,使用IE,或QQ,360浏览器兼容模式。请在检查浏览器的选项中检查浏览器的安全设置。请点击安装控件'),
document.write('')) :
Sys.chrome ? (document.write(' |