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 ...
随机推荐
- neo4j 张一鸣 8
头条关注 粉丝关系 张一鸣 8
- PHP MySQL mysql.sock的问题
SQLSTATE[HY000] [2002] No such file or directory 原因是找不到mysql.sock这个文件..一般出现的症状就是能用ip连接mysql.但不能使用loc ...
- HDU 1394 线段树or 树状数组~
Minimum Inversion Number Description The inversion number of a given number sequence a1, a2, ..., an ...
- lodop
一.控件参数 Lodop有如下控件参数,以页面object对象元素的参数形式使用: Caption名称:设置控件的显示标题格式: < pa ram name="Caption" ...
- bzoj 1017 魔兽地图DotR
题目大意: 他们需要购买装备来提升自己的力量值,每件装备都可以使佩戴它的英雄的力量值提高固定的点数,所以英雄的力量值等于它购买的所有装备的力量值之和.装备分为基本装备和高级装备两种.基本装备可以直接从 ...
- Eclipse 安装 Maven 插件的几种方法
转自:https://blog.csdn.net/oqqHun123/article/details/79674994 昨天直接在机器上配置了Maven环境,今天顺便把Eclipse等IDE环境配置好 ...
- bzoj [Usaco2010 Hol]cowpol 奶牛政坛【树链剖分】
意识流虚树 首先考虑只有一个党派,那么可以O(n)求树的直径,步骤是随便指定一个根然后找距离根最远点,然后再找距离这个最远点最远的点,那么最远点和距离这个最远点最远的点之间的距离就是直径 那么考虑多党 ...
- datatable-bootstrap 基本配置
function doSearch() { if(dtable!=null){ dtable.fnClearTable(0); dtable.fnDraw(); // 重新加载数据 }else{ dt ...
- [HAOI2006]均分数据
题解 今天下午刚学了模拟退火 借这个题来总结下模拟退火的要注意的问题吧 1 : \(eps\)不要设的太大 2 : 初温\(T\)在2000左右就差不多可以了 3 : 注意题目要求是要求最大值还是最小 ...
- [洛谷3930]SAC E#1 - 一道大水题 Knight
Description 他们经常在一起玩一个游戏,不,不是星际争霸,是国际象棋.毒奶色觉得F91是一只鸡.他在一个n×n的棋盘上用黑色的城堡(车).骑士(马).主教(象).皇后(副).国王(帅).士兵 ...