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

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

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

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

一、实体id返回实体对象

1、IMxDrawDatabase::ObjectIdToObject

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

参数说明

[in] LONGLONG lId

实体id

(1)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);

 

    }

}

              

(2)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);

(3)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);

(4)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;

2、JS代码填充图案如何从文件加载图案定义

(1)主要用到函数说明:IMxDrawHatch::LoadPatternDefinition

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

参数说明

[in] BSTR pszFileName

图案定义文件

[in] BSTR pszName

图案名称

[in] DOUBLE dPatternScale

缩放比例,默认传1.0 dPatternAngel -角度,默认传0.0

(2)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);

(3)图案加载的文件如下图所示:

tianchong2.png

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

tianchong3.png

(5)填充效果如下图所示:

tianchong1.png

二、实体句柄返回实体对象

1、IMxDrawDatabase::HandleToObject

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

参数说明

[in] BSTR handle

实体的句柄

2、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

得到对象的句柄。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值