梦想CAD控件事件COM接口知识点
一、鼠标事件
_DMxDrawXEvents::MouseEvent
控件中的鼠标事件。
| 参数 | 说明 |
|---|---|
|
LONG lType |
事件类型,1鼠标移动,2是鼠标左键按下,3是鼠标右键按下,4是鼠标左键双击 5是鼠标左键释放 6是鼠标右键释放 7是鼠标中键按下 8是鼠标中键释放 9是鼠标中键双击 10是鼠标中键滚动 |
|
DOUBLE dX |
事件发生时的鼠标X坐标,文档坐标 |
|
DOUBLE dY |
事件发生时的鼠标Y坐标,文档坐标 |
|
LONG* lRet |
lRet 返回非0,消息将不在往下传递 |
响应鼠标点击图片对象js代码:
var draw = document.getElementById("MxDrawXCtrl");
draw.ImplementMouseEventFun = function MouseEvent(dX, dY, lType) {
if(lType == 2)
{
// 鼠标左键按下
// dTol是搜索范围,50是屏幕像素.
var dTol = 50;
// 临时修改CursorWidth的大小,用FindEntAtPoint函数确定搜索范围.
var bak = draw.CursorWidth;
draw.CursorWidth = dTol;
// 搜索过滤条件,只选择图片.
var filter = draw.NewResbuf();
// MxImageMark是图片对象的DXF组码名称,5020在DXF组码,代表MxImageMark是对象类型.
filter.AddStringEx("MxImageMark",5020);
// 查找鼠标点击的实体。
var ent = draw.FindEntAtPoint(dX,dY,filter);
// 恢复光标拾取框的大小.
draw.CursorWidth = bak;
if(ent != null)
{
alert("点击了一个图片");
// 设置1,表示鼠标事件,不再往下传递.
mxOcx.SetEventRet(1);
}
//
};
};
|
提示鼠标双击下被点击的实体C#代码:
if (e.lType == 4)
{
// 鼠标左键双击.
// 构建选择集,找到鼠标左建双击下的实体。
MxDrawSelectionSet ss = new MxDrawSelectionSet();
MxDrawResbuf filter = new MxDrawResbuf();
filter.AddStringEx("LINE",5020);
MxDrawPoint point = new MxDrawPoint();
point.x = e.dX;
point.y = e.dY;
ss.SelectAtPoint(point, filter);
if (ss.Count > 0)
{
MxDrawEntity ent = ss.Item(0);
MessageBox.Show("点击了" + ent.ObjectName + "对象");
/*
if (ent is MxDrawLine)
{
MxDrawLine line = (MxDrawLine)ent;
}
*/
}
e.lRet = 1;
// 取消后面的命令。
axMxDrawX1.SendStringToExecute("");
}
|
提示鼠标双击下被点击的实体js代码:
function MouseEvent(dX,dY,lType)
{ if(lType == 4)
{
var mxOcx = document.getElementById("MxDrawXCtrl");
var ss = mxOcx.Call("Mx_NewSelectionSet","");
var pt = mxOcx.Call("Mx_NewPoint","");
var fil = mxOcx.Call("Mx_NewResbuf","");
pt.x = dX;
pt.y = dY;
ss.SelectAtPoint2(pt,fil);
if(ss.Count > 0)
{
var ent = ss.Item(0);
alert("点击了" + ent.ObjectName + "对象");
}
// 取消后面的命令。
mxOcx.SendStringToExecute("");
return 1;
}
return 0;
}
|
在指定位置弹出一个菜单:
主要用到函数说明:
_DMxDrawX::TrackPopupMenu
在指定位置弹出一个菜单。详细说明如下:
| 参数 | 说明 |
|---|---|
|
DOUBLE dX |
弹出菜单的位置X值,是文档坐标 |
|
DOUBLE dY |
弹出菜单的位置Y值,是文档坐标 |
|
sMenuFile |
菜单定义文件,支持http开头的网络路径 |
_DMxDrawX::FindEntAtPoint
在某点位置处查找实体。详细说明如下:
| 参数 | 说明 |
|---|---|
|
DOUBLE dX |
点X值,文档坐标 |
|
DOUBLE dY |
点Y值,文档坐标 |
|
IDispatch* pFilter |
过滤条件 |
响应鼠标右键事件,弹出菜单c#代码如下:
private void axMxDrawX1_MouseEvent(object sender, AxMxDrawXLib._DMxDrawXEvents_MouseEventEvent e)
{
if (e.lType == 3)
{
// 右键按下
string sCmd = "" ;
if (axMxDrawX1.IsRuningCommand(ref sCmd))
{
// 在命令下运行.
String sMenu = axMxDrawX1.GetOcxAppPath() + "\\mxpoptest.mnu";
axMxDrawX1.TrackPopupMenu(e.dX, e.dY, sMenu);
// 设置1,表示鼠标事件,不再往下传递.
axMxDrawX1.SetEventRet(1);
}
else
{
// 非命令下运行
MxDrawXLib.MxDrawResbuf filter = new MxDrawXLib.MxDrawResbuf();
MxDrawXLib.MxDrawEntity ent = (MxDrawXLib.MxDrawEntity)axMxDrawX1.FindEntAtPoint(e.dX, e.dY, filter);
String sPopMenu;
if(ent != null)
{
axMxDrawX1.ClearCurrentSelect();
axMxDrawX1.AddCurrentSelect(ent.ObjectID,true,true);
sPopMenu = axMxDrawX1.GetOcxAppPath() + "\\MxPopMenuEnt.mnu";
}
else
{
sPopMenu = axMxDrawX1.GetOcxAppPath() + "\\MxPopMenu.mnu";
}
axMxDrawX1.TrackPopupMenu(e.dX, e.dY, sPopMenu);
// 设置1,表示鼠标事件,不再往下传递.
axMxDrawX1.SetEventRet(1);
}
}
}
|
响应命令执行事件,如下:
private void axMxDrawX1_ImplementCommandEvent(object sender, AxMxDrawXLib._DMxDrawXEvents_ImplementCommandEventEvent e)
{
if(e.iCommandId == 99)
{
MessageBox.Show("用户定义命令执行....");
}
}
|
js中使用如下:
function MouseEvent(dX, dY, lType) {
if(lType == 3)
{
// 鼠标右键按下
var filter = mxOcx.NewResbuf();
// 5020 = RTDXF0,只选择直线实体,设置过滤条件
//filter.AddStringEx("LINE",5020);
var ent = mxOcx.FindEntAtPoint(dX, dY, filter);
var sPopMenu;
if(ent != null)
{
mxOcx.ClearCurrentSelect();
mxOcx.AddCurrentSelect(ent.ObjectID,true,true);
sPopMenu = mxOcx.GetOcxAppPath() + "\MxPopMenuEnt.mnu"
}
else
{
sPopMenu = mxOcx.GetOcxAppPath() + "\MxPopMenu.mnu"
}
mxOcx.TrackPopupMenu(dX, dY, sPopMenu);
// 设置1,表示鼠标事件,不再往下传递.
mxOcx.SetEventRet(1);
}
}
|
求面积
将此段js代码放入鼠标事件中:
// 得到鼠标位置
var point = mxOcx.NewPoint();
point.x = dX;
point.y = dY;
// 构造择集,得到鼠标所在闭合区域。
// 设置过滤条件
var filter = mxOcx.NewResbuf();
// 设置PL线为过滤条件
filter.AddStringEx("LWPOLYLINE", 5020);
// 选择范围左下角
var pt1 = mxOcx.NewPoint();
pt1.x = point.x - 100;
pt1.y = point.y - 100;
// 选择范围右上角
var pt2 = mxOcx.NewPoint();
pt2.x = point.x + 100;
pt2.y = point.y + 100;
// 选择pt1,pt2所在范围内的对象.
var ss =mxOcx.NewSelectionSet();
ss.Select(1, pt1, pt2, filter);
for (var i = 0; i < ss.Count; i++)
{
// 遍历所有对象,看当前点是在那个闭合区域内
var pl =ss.Item(i);
var dArea = pl.GetArea2 ();
alert("面积为:" + dArea.toString());
}
|
C#计算鼠标点位置的闭合pl线的面积:
private void axMxDrawX1_MouseEvent(object sender, AxMxDrawXLib._DMxDrawXEvents_MouseEventEvent e)
{
if (e.lType == 4)
{
// 是鼠标左键双击
// 得到鼠标位置
MxDrawPoint point = new MxDrawPoint();
point.x = e.dX;
point.y = e.dY;
// 构造择集,得到鼠标所在闭合区域。
// 设置过滤条件
MxDrawResbuf filter = new MxDrawResbuf();
// 设置PL线为过滤条件
filter.AddStringEx("LWPOLYLINE", 5020);
// 选择范围左下角
MxDrawPoint pt1 = new MxDrawPoint();
pt1.x = point.x - 100;
pt1.y = point.y - 100;
// 选择范围右上角
MxDrawPoint pt2 = new MxDrawPoint();
pt2.x = point.x + 100;
pt2.y = point.y + 100;
// 选择pt1,pt2所在范围内的对象.
MxDrawSelectionSet ss = new MxDrawSelectionSet();
ss.Select(MCAD_McSelect.mcSelectionSetCrossing, pt1, pt2, filter);
for (int i = 0; i < ss.Count; i++)
{
// 遍历所有对象,看当前点是在那个闭合区域内
MxDrawPolyline pl = (MxDrawPolyline)ss.Item(i);
// 得到闭合区域的点坐标。
MxDrawPoints pts = new MxDrawPoints();
for (int j = 0; j < pl.NumVerts; j++)
{
MxDrawPoint pt = pl.GetPointAt(j);
pts.Add(pt.x, pt.y, pt.z);
} if (pts.Count < 3)
continue;
// 判断鼠标点,是不是在这个闭合的区域内.
MxDrawUtility utility = new MxDrawUtility();
if (utility.PointInPolyline(pts, point.x, point.y))
{
// 找到用户点击的闭合区域
double dArea = 0.0;
pl.GetArea(out dArea);
// 对选择的区域填充
for (int k = 0; k < pts.Count; k++)
{
MxDrawPoint tmp = pts.Item(k);
if(k == 0)
axMxDrawX1.PathMoveTo(tmp.x, tmp.y);
else
axMxDrawX1.PathLineTo(tmp.x, tmp.y);
}
axMxDrawX1.DrawCADColorIndex = 3;
axMxDrawX1.DrawPathToHatch(0.0);
axMxDrawX1.UpdateDisplay();
MessageBox.Show("面积为:" + dArea.ToString());
e.lRet = 1;
// 取消后面的命令。
axMxDrawX1.SendStringToExecute("");
break;
}
}
}
}
|
二、超链接事件
_DMxDrawXEvents::HyperlinkClick
有超连接的实体被点击了。
| 参数 | 说明 |
|---|---|
|
IDispatch* pEntity |
IMxDrawEntity,被点击的实体 |
|
DOUBLE dX |
点击位置X,文档坐标 |
|
DOUBLE dY |
点击位置Y,文档坐标 |
|
LONG* pRet |
成功,返回1, *pRet = 1 |
js代码实现:
document.getElementById("MxDrawXCtrl").ImpHyperlinkClickFun = DoHyperlinkClickFun;
function DoHyperlinkClickFun(ent, dX, dY) {
mxOcx.GotoURL(ent.Hyperlinks);
mxOcx.SetEventRet(1);
}
|
三、动态拖放时的绘制事件
_DMxDrawXEvents::DynWorldDraw
动态拖放时的绘制事件。详细说明如下:
| 参数 | 说明 |
|---|---|
|
DOUBLE dX |
当前鼠标位置X坐标 |
|
DOUBLE dY |
当前鼠标位置Y坐标 |
|
IDispatch* pWorldDraw |
IMxDrawWorldDraw对象,用于动态绘制 |
|
IDispatch* pData |
IMxDrawCustomEntity对象,动态绘制数据 |
JS调用代码,动态插入一个图块:
function DoInsert()
{
var mxOcx = document.all.item("MxDrawXCtrl1");
var getPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
getPt.message ="点取插入点";
if(getPt.go() != 1)
{
return;
}
var frstPt =getPt.value();
if(frstPt == null)
{
return;
}
var getSecondPt = mxOcx.NewComObject("IMxDrawUiPrPoint");
var spDrawData =getSecondPt.InitUserDraw("TestDynDraw");
getSecondPt.message = "点取旋转角度";
getSecondPt.basePoint = frstPt;
getSecondPt.setUseBasePt(true);
spDrawData.SetPoint("pt1",frstPt);
var sBlkName = "Tree";
var sBlkFile = mxOcx.GetOcxAppPath() + "\Blk\树.dwg";
mxOcx.InsertBlock(sBlkFile,"Tree");
spDrawData.SetString("BlkName","Tree");
if(getSecondPt.go() != 1)
{
return;
}
spDrawData.Draw();
}
function DoDynWorldDrawFun(dX,dY,pWorldDraw,pData)
{
var mxOcx = document.all.item("MxDrawXCtrl1");
var sGuid = pData.Guid;
mxOcx.SetEventRet(0);
if(sGuid = "TestDynDraw")
{
// 动态插入图块。
var firstPt = pData.GetPoint("pt1");
if(firstPt == null)
return;
var sBlkName = pData.GetString("BlkName");
var secondPt = mxOcx.NewPoint();
secondPt.x = dX;
secondPt.y = dY;
var vec = firstPt.SumVector(secondPt);
var dAng = vec.Angle();
pWorldDraw.DrawBlockReference(firstPt.x,firstPt.y,sBlkName,1.0,dAng * 180.0 / 3.14159265 + 90.0);
mxOcx.SetEventRet(1);
}
}
|
梦想CAD控件事件COM接口知识点的更多相关文章
- 梦想CAD控件图层COM接口知识点
梦想CAD控件图层COM接口知识点 一.新建图层 主要用到函数说明: _DMxDrawX::AddLayer 增加新的图层.详细说明如下: 参数 说明 BSTR pszName 图层名 c#中实现代码 ...
- 梦想CAD控件文字COM接口知识点
一.参数绘制文字 在CAD设计时,需要绘制文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOU ...
- 梦想CAD控件图块COM接口知识点
梦想CAD控件图块COM接口知识点 图块是将多个实体组合成一个整体,并给这个整体命名保存,在以后的图形编辑中图块就被视为一个实体.一个图块包括可见的实体如线.圆.圆弧以及可见或不可见的属性数据.图块的 ...
- 如何在网页中浏览和编辑DWG文件 梦想CAD控件
如何在网页中浏览和编辑DWG文件 梦想CAD控件 www.mxdraw.com 梦想绘图控件5.2 是国内最强,最专业的CAD开发组件(控件),不需要AutoCAD就能独立运行.控件使用VC 201 ...
- 梦想CAD控件COM接口自定义命令
在CAD软件操作中,为方便使用者,使用自定义命令发出命令,完成CAD绘图,修改,保存等操作.点击此处下载演示实例. _DMxDrawX::RegistUserCustomCommand 向CAD控件注 ...
- 梦想CAD控件,用于浏览和编辑DWG文件,在脱离AUTOCAD的情况下独立运行,相当于简易CAD
(百度百科连接) 梦想绘图控件5.2 是国内最强,最专业的CAD开发组件(控件),不需要AutoCAD就能独立运行.控件使用VC 2010开发,最早从2007年第一个版本完成,经过多年的累积已经非常 ...
- 梦想CAD控件网页版关于自定义命令
在CAD控件操作中,为方便使用者,使用自定义命令发出命令,完成CAD绘图,修改,保存等操作.点击此处在线演示. _DMxDrawX::RegistUserCustomCommand 向CAD控件注册一 ...
- 梦想CAD控件网页版搜索图面上的文字
在网页中查找到CAD控件图纸上的文字.点击此处在线演示. 主要用到函数说明: _DMxDrawX::NewSelectionSet 实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数. _DM ...
- 梦想CAD控件安卓界面控制
CAD控件界面上所有元素都可以控制显示或隐藏,下面将逐一介绍详细用法. 设置工具文件 MxFunction.setToolFile 设置工具文件.详细说明如下: 参数 说明 String sFile ...
随机推荐
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第五步--button控制主角Jump&Crouch
说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- SPOJ 15. The Shortest Path 最短路径题解
本题就是给出一组cities.然后以下会询问,两个cities之间的最短路径. 属于反复询问的问题,临时我仅仅想到使用Dijsktra+heap实现了. 由于本题反复查询次数也不多,故此假设保存全部最 ...
- Android源代码文件夹结构说明
在学习Android的过程中,学习写应用还好.一開始不用管太多代码.直接调用函数就能够了,可是工作中却须要改动到framework之类的东东 所以感觉開始纠结了,又是初学,非常多不懂,所以就去找了关于 ...
- python generator iterator和iterable object
1 iterable object list.dict.set.tuple.file(在每行上iterate)等都是iterable object,但是它们不是iterator.但是它们可以转换成it ...
- 【C++&爬虫】C++实现网络爬虫&socket初级教程
2019年了,发现以前的很多教程都不能用了. 我自己写的socket发给服务器总是返回301错误——资源永久转移.很多教程都是这样,困扰了我很久. 终于我发现了一篇能用的爬虫代码,参考MSDN以及众多 ...
- MessageBox.Show
MessageBox.Show()共有21中重载方法.现将其常见用法总结如下: .MessageBox.Show("Hello~~~~"); 最简单的,只显示提示信息. .Mess ...
- 关于Web API中使用ajax发送请求方式的问题
参见以下文章 http://www.west-wind.com/weblog/posts/2012/May/08/Passing-multiple-POST-parameters-to-Web-API ...
- YTU 2530: 小勇玩lol
2530: 小勇玩lol 时间限制: 1 Sec 内存限制: 128 MB 提交: 112 解决: 77 题目描述 小勇是一个忠实的lol玩家,他有自己的战斗力计算方法,每个星期他都会算一下自己的 ...
- Tomcat的jvm配置
Tomcat本身不能直接在计算机上运行,需要依赖于操作系统和一个JAVA虚拟机.Tomcat的内存溢出本质就是JVM内存溢出,JAVA程序启动时JVM会分配一个初始内存和最大内存给程序.当程序需要的内 ...
- bzoj1202: [HNOI2005]狡猾的商人(并查集 差分约束)
1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4127 Solved: 1981[Submit][Sta ...