ID和句柄具有各自的特点:
(1) ID:在一个任务中,本次任务中都是独一无二的。在不同的任务中,同一个图形对象的ID可能不同。
(2) 句柄:在一个任务中,不能保证每个对象的句柄都唯一,但是在一个图形数据库中所有对象的句柄都是唯一的。句柄随DWG图形一起保存,在两次任务期间同一对象的句柄是相同的。
一、实体id返回实体对象
IMxDrawDatabase::ObjectIdToObject
实体id返回实体对象,具体详细如下:
| 参数 | 说明 |
|---|---|
[in] LONGLONG lId | 实体id |
JS代码中绘一个直线,得到直线id,再调该得到直线对象,然写扩展数据的例子。
function DoCommandEventFunc(iCmd){ if (iCmd == 1) { var mxOcx = document.all.item("MxDrawXCtrl"); mxOcx.focus(); var point1 = mxOcx.GetPoint(null,"n 点取开始点:"); if(point1 == null) { return; } var point2 = mxOcx.GetPoint(point1,"n 点取结束点:"); if(point1 == null) { return; } // 直线的id var lineId = mxOcx.DrawLine(point1.x,point1.y,point2.x,point2.y); // 为新写的直线写一个字符串扩展数据 var database = mxOcx.GetDatabase(); var ent = database.ObjectIdToObject(lineId); if(ent == null) { return; } var exData = mxOcx.Call("Mx_NewResbuf",""); exData.AddString("TestApp",1001); exData.AddString("用户的扩展数据内容。。。",1000); ent.SetXData(exData); }} |
JS代码得到插入块的位置:
mxOcx.DrawColor = 0;//创建一个图层,名为"BlockLayer"mxOcx.AddLayer ("BlockLayer");//设置当前图层为"BlockLayer"mxOcx.LayerName = "BlockLayer";var sBlkName = "Tree";//用户需要出入图块的路径 控件程序在磁盘的文件路径var sBlkFile = mxOcx.GetOcxAppPath() + "\\Blk\\树.dwg";//向控件数据库中插入一个图块,不用它插入匿名块mxOcx.InsertBlock(sBlkFile, "Tree");//绘制块引用对象//参数一为插入点的X坐标;参数二为插入点的Y坐标;//参数三为图块名;参数四为图块缩放比例;参数五为图块的旋转角度var myblock=mxOcx.DrawBlockReference(0, 3600, "Tree", 1, 0) ;var blkref = mxOcx.ObjectIdToObject(myblock);var myposition=blkref.Position;alert(myposition.x );alert(myposition.y); |
JS代码镜像一个实体:
var lineid= mxOcx.DrawLine(0, 0, 100, 0);var pt1 = mxOcx.NewPoint();pt1.x = -200;pt1.y = -200;var pt2 = mxOcx.NewPoint();pt2.x = 200;pt2.y = 200;var database = mxOcx.GetDatabase();var ent = database.ObjectIdToObject(lineid);ent.Mirror(pt1,pt2); |
C#代码插入非等比例的图块:
String sBlkPath = axMxDrawX1.GetOcxAppPath() + "\\Blk\\树.dwg"; axMxDrawX1.InsertBlock(sBlkPath, "MyBlkName"); Int64 iID = axMxDrawX1.DrawBlockReference(100, 100, "MyBlkName", 0.2, 0); MxDrawBlockReference blkRef = (MxDrawBlockReference) axMxDrawX1.ObjectIdToObject(iID); MxDrawScale3d scale = new MxDrawScale3d(); scale.sx = 1; scale.sy = 2; scale.sz = 1; blkRef.ScaleFactors = scale; |
JS代码填充图案如何从文件加载图案定义:
主要用到函数说明:
IMxDrawHatch::LoadPatternDefinition
从文件加载图案定义,详细说明如下:
| 参数 | 说明 |
|---|---|
[in] BSTR pszFileName | 图案定义文件 |
[in] BSTR pszName | 图案名称 |
[in] DOUBLE dPatternScale | 缩放比例,默认传1.0 dPatternAngel -角度,默认传0.0 |
js代码实现如下:
var getPoint = mxOcx.NewComObject("IMxDrawUiPrPoint");getPoint.message = "点取一点";if (getPoint.go() != 1) { return;}var frstPt = getPoint.value();if (frstPt == null) return;mxOcx.PatternDefinition = "SOLID";var id = mxOcx.DrawHatchFromPoint(frstPt.x, frstPt.y, 1.0);if (id == 0) return;// 修改新绘的填充的图案从文件中加载.var sPatternFile = mxOcx.GetOcxAppPath() + "\\mx.pat";var sPatternName = "ANSI35";var hatch = mxOcx.ObjectIdToObject(id);hatch.LoadPatternDefinition(sPatternFile, sPatternName, 300.0, 0.0); |
图案加载的文件如下图所示:

图案加载的文件内容如下图所示:

填充效果如下图所示:

二、实体句柄返回实体对象
IMxDrawDatabase::HandleToObject
给一个实体的句柄,返回实体的对象,具体详细如下:
| 参数 | 说明 |
|---|---|
[in] BSTR handle | 实体的句柄 |
C#代码得到多线的端点,并成填充对象:
private void TestFill(String sHandle) { MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase(); MxDrawMcDbObject obj = database.HandleToObject(sHandle); if (obj == null) return; if (obj is MxDrawPolyline) { MxDrawPolyline poly = (MxDrawPolyline)obj; int i = 0; for (; i < poly.NumVerts; i++) { MxDrawPoint pt = (MxDrawPoint)poly.GetPointAt(i); double dBulge = poly.GetBulgeAt(i); if (i == 0) axMxDrawX1.PathMoveTo(pt.x, pt.y); else axMxDrawX1.PathLineToEx(pt.x, pt.y, 0.0, 0.0, dBulge); } if (i >= 3) { axMxDrawX1.PathMakeClosed(); axMxDrawX1.DrawPathToHatch(1.0); } } } |
三、把实体id转成实体句柄
IMxDrawDatabase::ObjectIdToHandle
把实体id转成实体句柄。
四、把实体的句柄转成实体id
IMxDrawDatabase::HandleToObjectId
把实体的句柄转成实体id。
五、得到对象的句柄
IMxDrawMcDbObject::Handle
得到对象的句柄。