CAD绘制自定义实体(com接口)
在cad使用过程中,用户可以绘制自定义实体。点击此处下载演示实例。
调用DrawCustomEntity函数,绘制一个自定义实体对象。
下面代码绘制一个自定义实体,C#代码实现如下:
private void DrawMlineCommand()
{
MxDrawUiPrPoint getPt = new MxDrawUiPrPoint();
getPt.message = "点取第一点";
if (getPt.go() != MCAD_McUiPrStatus.mcOk)
{
return;
} var frstPt = getPt.value();
if (frstPt == null)
{
return;
} MxDrawUiPrPoint getSecondPt = new MxDrawUiPrPoint(); getSecondPt.message = "点取第二点";
getSecondPt.basePoint = frstPt; getSecondPt.setUseBasePt(false); MxDrawCustomEntity spDrawData = getSecondPt.InitUserDraw("DrawCustEntity");
spDrawData.SetDouble("Width", 30); spDrawData.SetPoint("Point1", frstPt); Int32 lCount = 1;
spDrawData.SetLong("Count", 1); while (true)
{
if (getSecondPt.go() != MCAD_McUiPrStatus.mcOk)
break; var secondPt = getSecondPt.value();
if (secondPt == null)
break; lCount++; String sPointName = "Point" + lCount.ToString(); spDrawData.SetPoint(sPointName, secondPt);
spDrawData.SetLong("Count", lCount);
}
if (lCount > 1)
axMxDrawX1.DrawEntity(spDrawData);
}
需要响应DMxDrawXEvents::CustomEntity_Explode事件。
下面例子,得到自实体的数据,C#代码实现如下:
private void axMxDrawX1_CustomEntity_Explode(object sender, AxMxDrawXLib._DMxDrawXEvents_CustomEntity_ExplodeEvent e)
{
MxDrawCustomEntity pCustomEntity = (MxDrawCustomEntity)e.pCustomEntity;
var sGuid = pCustomEntity.Guid; MxDrawWorldDraw pWorldDraw = (MxDrawWorldDraw)e.pDraw; if (sGuid == "DrawCustEntity")
{
MyDrawMline(pWorldDraw, pCustomEntity, null);
e.pRet = 1;
}
} private void MyDrawMline(MxDrawWorldDraw pWorldDraw, MxDrawCustomEntity pCustomEntity, MxDrawPoint curPt)
{
// 取自定义实体的端点数目,属性。
if (!pCustomEntity.IsHave("Count"))
return;
long lCount = pCustomEntity.GetLong("Count");
MxDrawPolyline tmpPl = new MxDrawPolyline();
for (long i = 0; i < lCount; i++)
{
String sName;
sName = "Point" + (i + 1).ToString();
if (!pCustomEntity.IsHave(sName))
break; // 取自定义实体的端点坐标。
MxDrawPoint pt = pCustomEntity.GetPoint(sName); // 把端点坐标,传给pl线,用于生成双线。
tmpPl.AddVertexAt(pt);
}
if (curPt != null)
tmpPl.AddVertexAt(curPt); if (tmpPl.NumVerts < 2)
{
// 端点数少于2就,不构成直线,就不需要显示。
return;
}
// 求pl线,开始点的导数.
MxDrawVector3d vecFx;
if (!tmpPl.GetFirstDeriv(tmpPl.GetStartParam(), out vecFx))
return;
if (vecFx.IsZeroLength())
return;
// 把向量旋转90度.
vecFx.RotateByXyPlan(3.14159265 / 2.0);
vecFx.Normalize();
// 得到双线的宽度属性。
double dWidth = pCustomEntity.GetDouble("Width");
vecFx.Mult(dWidth);
MxDrawPoint startPt = tmpPl.GetStartPoint(); // 向pl线,两个方向偏移,
MxDrawPoint offsetPt1 = new MxDrawPoint();
offsetPt1.x = startPt.x;
offsetPt1.y = startPt.y;
offsetPt1.Add(vecFx);
MxDrawPoint offsetPt2 = new MxDrawPoint();
offsetPt2.x = startPt.x;
offsetPt2.y = startPt.y;
offsetPt2.Sum(vecFx);
MxDrawText text = new MxDrawText();
text.TextString = "Test";
text.Height = 100;
text.Position = startPt;
text.AlignmentPoint = startPt;
MxDrawPoint pt1, pt2;
text.GetBoundingBox(out pt1, out pt2);
MxDrawPoint pt3 = new MxDrawPoint();
pt3.x = pt1.x;
pt3.y = pt2.y;
MxDrawPoint pt4 = new MxDrawPoint();
pt4.x = pt2.x;
pt4.y = pt1.y;
MxDrawPoints pts = new MxDrawPoints();
pts.Add(pt1.x, pt1.y, 0);
pts.Add(pt3.x, pt3.y, 0);
pts.Add(pt2.x, pt2.y, 0);
pts.Add(pt4.x, pt4.y, 0); Int32 lDraworder = pWorldDraw.Draworder;
pWorldDraw.Draworder = lDraworder + 1;
pWorldDraw.DrawWipeout(pts);
pWorldDraw.Draworder = lDraworder + 2;
pWorldDraw.DrawEntity((MxDrawEntity)text);
pWorldDraw.Draworder = lDraworder;
// pWorldDraw->
{
MxDrawResbuf newobj;
if (tmpPl.OffsetCurves(dWidth, offsetPt1, out newobj))
{
for (Int32 j = 0; j < newobj.Count; j++)
{
MxDrawEntity tmpObj = (MxDrawEntity)newobj.AtObject(j);
if (tmpObj == null)
continue; pWorldDraw.DrawEntity(tmpObj);
}
newobj.RemoveAll();
}
}
{
MxDrawResbuf newobj;
if (tmpPl.OffsetCurves(dWidth, offsetPt2, out newobj))
{
for (Int32 j = 0; j < newobj.Count; j++)
{
MxDrawEntity tmpObj = (MxDrawEntity)newobj.AtObject(j);
if (tmpObj == null)
continue; pWorldDraw.DrawEntity(tmpObj);
}
// 这不使用newobj,需要显示调用RemoveAll函数清楚内存。
// 不然这个可能就会程序退出时才释放,这时它会去释放控件对象指针,有可能会出错。
newobj.RemoveAll();
}
}
}
C#代码实现如下:
private void axMxDrawX1_DynWorldDraw(object sender, AxMxDrawXLib._DMxDrawXEvents_DynWorldDrawEvent e)
{
MxDrawCustomEntity pCustomEntity = (MxDrawCustomEntity)e.pData;
String sGuid = pCustomEntity.Guid;
e.pRet = 0; MxDrawWorldDraw pWorldDraw = (MxDrawWorldDraw)e.pWorldDraw;
MxDrawPoint curPt = new MxDrawPoint();
curPt.x = e.dX;
curPt.y = e.dY; if (sGuid == "DrawCustEntity")
{
MyDrawMline(pWorldDraw, pCustomEntity, curPt);
}
}
需要响应_DMxDrawXEvents::CustomEntity_getGripPoints事件,C#代码实现如下:
private void axMxDrawX1_CustomEntity_getGripPoints(object sender, AxMxDrawXLib._DMxDrawXEvents_CustomEntity_getGripPointsEvent e)
{
MxDrawCustomEntity pCustomEntity = (MxDrawCustomEntity)e.pCustomEntity;
var sGuid = pCustomEntity.Guid;
e.pOk = 0;
if (sGuid == "DrawCustEntity")
{
if (!pCustomEntity.IsHave("Count"))
return; long lCount = pCustomEntity.GetLong("Count"); MxDrawResbuf ret = (MxDrawResbuf)axMxDrawX1.NewResbuf(); for (long i = 0; i < lCount; i++)
{
String sName;
sName = "Point" + (i + 1).ToString();
if (!pCustomEntity.IsHave(sName))
break; // 取自定义实体的端点坐标。
MxDrawPoint pt = pCustomEntity.GetPoint(sName); ret.AddPoint(pt);
}
e.pOk = 1;
axMxDrawX1.SetEventRetEx(ret);
} }
需要响应CustomEntity_moveGripPointsAt事件。
下面例子,夹点移动后,修改自定义实体的属性,C#代码实现如下:
private void axMxDrawX1_CustomEntity_moveGripPointsAt(object sender, AxMxDrawXLib._DMxDrawXEvents_CustomEntity_moveGripPointsAtEvent e)
{
e.pRet = 1;
MxDrawCustomEntity pCustomEntity = (MxDrawCustomEntity)e.pCustomEntity;
var sGuid = pCustomEntity.Guid; if (sGuid == "DrawCustEntity")
{
if (!pCustomEntity.IsHave("Count"))
return; long lCount = pCustomEntity.GetLong("Count"); for (long i = 0; i < lCount; i++)
{
String sName;
sName = "Point" + (i + 1).ToString();
if (!pCustomEntity.IsHave(sName))
break; // 取自定义实体的端点坐标。
MxDrawPoint pt = pCustomEntity.GetPoint(sName); if (i == e.lGridIndex)
{
pt.x = pt.x + e.dOffsetX;
pt.y = pt.y + e.dOffsetY; pCustomEntity.SetPoint(sName, pt);
}
}
}
}
CAD绘制自定义实体(com接口)的更多相关文章
- CAD把自定义实体,变成普通实体(com接口VB语言)
主要用到函数说明: MxDrawXCustomEvent::MxDrawXCustomEntity::explode 把自定义实体,变成普通实体,详细说明如下: 参数 说明 LONGLONG lEnt ...
- CAD实现自定义实体夹点移动(com接口VB语言)
主要用到函数说明: MxDrawXCustomEvent::MxDrawXCustomEntity::moveGripPointsAt 自定义实体事件,自定义实体夹点被移动,详细说明如下: 参数 说明 ...
- CAD得到自定义实体拖放夹点(com接口VB语言)
主要用到函数说明: MxDrawXCustomEvent::MxDrawXCustomEntity::getGripPoints 自定义实体事件,得到拖放夹点,详细说明如下: 参数 说明 LONGLO ...
- 【CAD】自定义实体的步骤(转)
本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h"," ...
- cad.arx 自定义实体之编译第一个项目(甜头)
本篇不从零开始讲如何制造自定义图元,而是教新手们如何设置了环境之后编译张帆书中的代码. 利用vs2010编译 张帆<AutoCAD ObjectARX(VC)开发基础与实例教程>一书中的自 ...
- CAD控件:COM接口实现自定义实体
1. 实现步骤: 3 1. 实现步骤: 参考例子 :Src\MxDraw5.2\samples\ie\iedemoTest.htm 1) 增加自定义实体对象 调用DrawCustomEntity函数, ...
- CAD控件使用教程 自定义实体的实现
自定义实体的实现 1 . 自定义实体... 3 1.1 说明... 3 1.2 类的类型信息... 3 1.3 worldDraw.. 4 1.4 ...
- 梦想CAD控件自定义实体实现
一.增加自定义实体对象 调用DrawCustomEntity函数,绘制一个自定义实体对象. 下面代码绘制一个自定义实体,C#代码实现如下: private void DrawMlineCommand( ...
- CAD由一个自定义实体事件中的id得到自定义实体对象(com接口VB语言)
由一个自定义实体事件中的id得到自定义实体对象.该函数只能在自定义实体事件中调用. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...
随机推荐
- leetcode第一刷_Best Time to Buy and Sell Stock
这样的题就不要去考虑N^2的算法了.肯定会超时的.乍一看,非常可能会想到贪心,可是普通的贪心思路是不行的,比方想找到一个最小值用来买入.尽管它跟最大值之间的差一定是最好的,可是最大值出如今它前面就不行 ...
- 美国诚实签经验——必带材料:护照,证件照,DS160确认页,面试预约确认页,+境外照片
Step3. 准备签证材料这些材料如果准备,请一定围绕着你的DS160表格,不可说谎,但可适当修饰,辅佐它,烘托它,营造出一种——你绝无可能去不复返,绝无可能制造麻烦,绝无想占人便宜的意思,并且随时可 ...
- P4460 [CQOI2018]解锁屏幕
算是我比较擅长的类型,自己想想就会了.普通小状压,状态傻子都能想出来.一开始裸的枚举T了,30.后来与处理之后跑的飞起,就是不对,还是30分.后来看讨论版...mod竟然是1e8+7!!!这不有毒吗. ...
- 洛谷 P2038 无线网络发射器选址 —— 二维树状数组
题目:https://www.luogu.org/problemnew/show/P2038 大水题暴露出我的愚蠢. 用二维树状数组,然而居然忘了它应该那样写,调了一个小时: 正方形可以超出外面,只要 ...
- 7. ExtJS.form中msgTarget
转自:https://www.cnblogs.com/guafuli/articles/msgtarget_values.html Ext表单提示方式:msgTarget:有4中方式:qtip,tit ...
- 19_传智播客iOS视频教程_类和对象
什么是类?什么是对象? 看的见.摸的着.拿过来就可以直接使用.例如报纸就是一个对象. 学生这个东西可不可以只是指一个?就只有那一个才是学生.不是的,学生是有很多个的.它是对一类人的统称.类是统称.所以 ...
- selenium3.4.3 + python3.6 + HTMLTestRunner0.8.0
HTMLTestRunner下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html.该页面下载的HTMLTestRunner默认支持pytho ...
- oracle创建数据库与配置监听器
上述是数据库创建完毕 *检测创建 -------------------------------------------------------------2配置监听器---------------- ...
- js实现页面的全屏与退出
1.在data里面定义: data(){ return{ isScreen:false, } } //是否显示全屏 fullScreen(event){ this.isScreen = !this.i ...
- maptalks 如何加载 ArcGIS 瓦片图层
最近需要加载 ArcGIS 瓦片图层,运行官网加载 ArcGIS 瓦片图层的 demo 是没有问题的.如果把 ArcGIS 瓦片图层 URL 换成是自已发布的 ArcGIS 地图服务,发现加载不出来, ...