MxDraw 发表于 2019-5-15 14:24:18

梦想CAD控件关于id与handle问题

ID和句柄具有各自的特点:

(1) ID:在一个任务中,本次任务中都是独一无二的。在不同的任务中,同一个图形对象的ID可能不同。

(2) 句柄:在一个任务中,不能保证每个对象的句柄都唯一,但是在一个图形数据库中所有对象的句柄都是唯一的。句柄随DWG图形一起保存,在两次任务期间同一对象的句柄是相同的。

一、实体id返回实体对象

IMxDrawDatabase::ObjectIdToObject

实体id返回实体对象,具体详细如下:

参数        说明
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

从文件加载图案定义,详细说明如下:

参数        说明
BSTR pszFileName

图案定义文件

BSTR pszName

图案名称

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

给一个实体的句柄,返回实体的对象,具体详细如下:

参数        说明
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

得到对象的句柄。


页: [1]
查看完整版本: 梦想CAD控件关于id与handle问题