土木在线论坛 \ 建筑设计 \ CAD下载及教程 \ 梦想CAD控件关于id与handle问题

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

发布于:2019-05-15 13:45:15 来自:建筑设计/CAD下载及教程 [复制转发]

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


得到对象的句柄。


全部回复(0 )

只看楼主 我来说两句抢沙发

CAD下载及教程

返回版块

52.07 万条内容 · 655 人订阅

猜你喜欢

阅读下一篇

?微信接收到的图纸文件打开后其图层如何进行指定关闭?

微信接收到的图纸文件打开后其图层如何进行指定关闭?工作中完成绘制的CAD图纸文件都是通过微信或是其他通讯工具来进行传输的,这边再接收到CAD图纸文件之后需要打开将其进行查看就需要使用到的是专门的看图软件来进行,如果打开图纸过大的话就会影响对图纸的查看,我们就需要的是关闭其对应的图层来进行,具体应该怎么样进行操作,下面小编就要来教大家的就是微信接收到的图纸文件打开后其图层如何进行指定关闭的全部操作步骤,希望能够帮助到你们,望采纳!

回帖成功

经验值 +10