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
得到对象的句柄。