0
点赞
收藏
分享

微信扫一扫

梦想CAD控件关于填充问题

快乐与微笑的淘气 2022-11-10 阅读 142


一、绘制填充

1.单击菜单栏,“绘图”->“ 填充”。

2.单击绘图工具栏“绘填充命令”按钮

梦想CAD控件关于填充问题_代码实现


3.在命令行中输入Hatch ,按回车键,显示如下:

梦想CAD控件关于填充问题_数据_02

(1)点击上图图案填充选择键

梦想CAD控件关于填充问题_c#_03

,弹出窗口,如下图所示,选择填充样式:

梦想CAD控件关于填充问题_代码实现_04

(2)点选边界按钮,指定闭合区域中的一点,程序会自动搜索该区域,并填充。填充效果如下:

梦想CAD控件关于填充问题_c#_05

二、由闭合区域内部一点,绘制一个填充对象

1、主要用到函数说明:MxDrawXCustomFunction::Mx_DrawHatchFromPointEx

由闭合区域内部一个点,绘制一个填充对象。

参数

说明

DOUBLE dX

点坐标X 点坐标Y

DOUBLE dPatternScale

填充图案缩放比例

long ladOpt

对填充内部的孤岛的处理.0 =忽略孤岛, 1 = 处理孤岛, 2 = 嵌套处理孤岛

2、c#代码实现如下:

​MxDrawUtility mxUtility  = ​​​​new​​​ ​​MxDrawUtility();​

 

​MxDrawPoint point = (MxDrawPoint)(mxUtility.GetPoint(​​​​null​​​​, ​​​​"点一点:"​​​​) );            ​

​if​​​ ​​(point == ​​​​null​​​​)​

​{​

​MessageBox.Show(​​​​"用户取消.."​​​​);                ​

​return​​​​;​

​}​

 

​MxDrawResbuf param = ​​​​new​​​ ​​MxDrawResbuf();​

​param.AddDouble(point.x);​

​param.AddDouble(point.y);​

​param.AddDouble(1.0);​

​param.AddLong(0);​

 

​axMxDrawX1.CallEx(​​​​"Mx_DrawHatchFromPointEx"​​​​, param);​

3、js代码实现如下:

​var​​​ ​​point =mxOcx.GetPoint(​​​​false​​​​,0,0,​​​​"\n 点取第一点:"​​​​);​

 

​if​​​ ​​(point == ​​​​null​​​​)​

​{​

​alert(​​​​"用户取消.."​​​​);​

​return​​​​;​

​}​

 

​var​​​ ​​param = mxOcx.NewResbuf();​

​param.AddDouble(point.x);​

​param.AddDouble(point.y);​

​param.AddDouble(1.0);​

​param.AddLong(0);​

 

​mxOcx.CallEx(​​​​"Mx_DrawHatchFromPointEx"​​​​, param);​

三、填充图案从文件加载图案定义

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

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

参数

说明

[in] BSTR pszFileName

图案定义文件

[in] BSTR pszName

图案名称

[in] DOUBLE dPatternScale

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

2、c#代码实现如下:

​MxDrawUiPrPoint getPoint = ​​​​new​​​ ​​MxDrawUiPrPoint();​

​getPoint.message = ​​​​"点取一点:"​​​​;                ​

​if​​​ ​​(getPoint.go() != MCAD_McUiPrStatus.mcOk)                    ​

​return​​​​;​

​MxDrawPoint pt = getPoint.value();​

 

​axMxDrawX1.PatternDefinition = ​​​​"SOLID"​​​​;​

​Int64 id = axMxDrawX1.DrawHatchFromPoint(pt.x, pt.y, 1.0);                ​

​if​​​ ​​(id == 0)                    ​

​return​​​​;                ​

​// 修改新绘的填充的图案从文件中加载.​

​String sPatternFile = axMxDrawX1.GetOcxAppPath() + ​​​​"\mx.pat"​​​​;​

​String sPatternName = ​​​​"ANSI35"​​​​;​

 

​MxDrawHatch hatch = (MxDrawHatch)axMxDrawX1.ObjectIdToObject(id);​

​hatch.LoadPatternDefinition(sPatternFile, sPatternName, 300.0, 0.0);​

3、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);​

四、添加图案填充边界

主要用到函数说明:IMxDrawHatch::AppendLoop

添加图案填充边界,详细说明如下:

参数

说明

[in] LONG loopType

边界的类型

[in] IMxDrawResbuf* pData

边界数据

五、设置填充的透明度

c#代码实现如下:

​MxDrawResbuf tran = ​​​​new​​​ ​​MxDrawResbuf();​

​tran.AddLong(150);​

​hatch.SetProp(​​​​"transparency"​​​​, tran);​

六、得到填充的透明度

c#代码实现如下:

​MxDrawResbuf retT = hatch.GetProp(​​​​"transparency"​​​​);​

​MessageBox.Show(retT.AtLong(0).ToString());​

七、增加一个图案填充数据

1、主要用到函数说明:_DMxDrawX::AddPatternDefinition

增加一个图案定义。

参数

说明

BSTR pszName

图案名称

BSTR pszPatternDefinition

图案定义字符串

2、js代码实现如下:

​function​​​ ​​DrawPathToHatch2() {​

​//绘制一个有图案的填充​

​//angle, x-origin,y-origin, delta-x,delta-y,dash-1,dash-2, …​

​//45 = angle 是图案线角度.​

​//0 = x-origin 是第一个填充线经过的点位置X坐标​

​//0 = y-origin 是第一个填充线经过的点位置Y坐标​

​//0 = delta-x   是下一个填充线相对前一个线的X方向偏移​

​//0.125 = delta-y   是下一个填充线相对前一个线的Y方向偏移​

​mxOcx.AddPatternDefinition(​​​​"MyHatchPattern1"​​​​, ​​​​"((45, 0,0, 0,0.125))"​​​​);​

​//把路径变成一个填充对象​

​mxOcx.PatternDefinition = ​​​​"MyHatchPattern1"​​​​;​

​//把路径的开始位置移动指定的点​

​//参数一为点的X坐标 ,参数二为点的Y坐标,参数三为该点处开始宽度,对Polyline线的绘制有效​

​//参数四为该点处结束宽度,对Polyline线的绘制有效​

​//参数五为该点处的凸度,对Polyline线的绘制有效​

​mxOcx.PathMoveToEx(0, 30, 0.3, 0.3, 0.3) ;​

​//路径的一下个点​

​mxOcx.PathLineTo( 100, 30);​

​//路径的一下个点​

​mxOcx.PathLineTo(100, 60);​

​//路径的一下个点​

​mxOcx.PathLineTo(0, 30);​

​//把路径变成一个填充,80,是填充图案的缩放比例.​

​mxOcx.DrawPathToHatch(100);​

 

 

​mxOcx.UpdateDisplay();​

​}​

​function​​​ ​​DrawPathToHatch2() {​

​//绘制图案填充2​

​mxOcx.AddPatternDefinition(​​​​"MyHatchPattern2"​​​​, ​​​​"((0,0,0,0,8)(90,0,0,8,8,8,-8))"​​​​);​

​//把路径变成一个填充对象​

​mxOcx.PatternDefinition = ​​​​"MyHatchPattern2"​​​​;​

​//把路径的开始位置移动指定的点​

​//参数一为点的X坐标 ,参数二为点的Y坐标,参数三为该点处开始宽度,对Polyline线的绘制有效​

​//参数四为该点处结束宽度,对Polyline线的绘制有效​

​//参数五为该点处的凸度,对Polyline线的绘制有效​

​mxOcx.PathMoveToEx(100, 30, 0, 0, 0.3) ;​

​//路径的一下个点​

​mxOcx.PathLineTo( 200, 30);​

​//路径的一下个点​

​mxOcx.PathLineTo(200, 60);​

​//路径的一下个点​

​mxOcx.PathLineTo(100, 30);​

​//把路径变成一个填充,80,是填充图案的缩放比例.​

​mxOcx.DrawPathToHatch(1);​

​mxOcx.UpdateDisplay();​

​}​

八、得到填充名称

js代码实现如下:

​//实例化一个构造选择集进行过滤,该类封装了选择集及其处理函数。​

​var​​​  ​​ss = mxOcx.NewSelectionSet();​

​//构造一个过滤链表​

​var​​​ ​​spFilte = mxOcx.NewResbuf();​

​//得到当前空间的所有实体​

​ss.AllSelect (spFilte);​

​alert(ss.Count);​

​for​​​ ​​(​​​​var​​​ ​​i = 0; i < ss.Count; i++)​

​{​

​var​​​ ​​ent = ss.Item(i);​

​alert(ent.ObjectName);​

​}​

九、读取填充属性,并设置到另一个新建的填充

c#代码实现如下:

​MxDrawEntity ent = (MxDrawEntity)axMxDrawX1.GetEntity(​​​​"hatch"​​​​);                    ​

​if​​​ ​​(ent == ​​​​null​​​​)                        ​

​return​​​​;                    ​

​if​​​ ​​(!(ent ​​​​is​​​ ​​MxDrawHatch) )​

​{                          ​

​return​​​​;​

​}​

 

​MxDrawHatch hatch = (MxDrawHatch)ent;​

 

​MxDrawHatch newHatch = ​​​​new​​​ ​​MxDrawHatch();                    ​

​// 读取选择到填充对象数据,把这个数据传给新建的newHathc对象。​

​newHatch.PatternAngle = hatch.PatternAngle;                    ​

​// 循环得到填充边数据.​

​for​​​ ​​(Int32 i = 0; i < hatch.NumLoops; i++)​

​{                        ​

​if​​​ ​​(!hatch.LoopTypeIsPolyline(i))​

​{                            ​

​// 暂不支持曲线类型的边界.​

​continue​​​​;​

​}​

 

​Int32 iLootType = hatch.LoopTypeAt(i);​

 

​MxDrawResbuf loop = hatch.GetLoopAt(i);                        ​

​if​​​​(loop == ​​​​null​​​​)                            ​

​continue​​​​;                        ​

​// 下面可以得每个点的坐标,凸度.​

​for​​​ ​​(Int32 j = 0; j + 1< loop.Count; )​

​{​

​MxDrawPoint pt = loop.AtPoint(j);                            ​

​double​​​ ​​dBulge = loop.AtDouble(j + 1);​

​j += 2;​

​}                        ​

​// 把得到loop设置给新对象.​

 

​newHatch.AppendLoop(iLootType, loop);​

​}                    ​​​​//​

​newHatch.Elevation = hatch.Elevation;                    ​

​// 读取图案定义数据.​

​for​​​ ​​(Int32 i = 0; i < hatch.NumPatternDefinitions(); i++)​

​{                        ​

​double​​​ ​​Angle = 0.0, baseX = 0.0, baseY = 0.0, offsetX = 0.0, offsetY = 0.0;​

​MxDrawResbuf defData = hatch.GetPatternDefinitionAt(​

​i, ​​​​out​​​ ​​Angle, ​​​​out​​​ ​​baseX, ​​​​out​​​ ​​baseY, ​​​​out​​​ ​​offsetX, ​​​​out​​​ ​​offsetY);                        ​

​if​​​ ​​(defData == ​​​​null​​​​)                            ​

​continue​​​​;                        ​

​// 下面可以得每个图案定义线型数据 。​

​for​​​ ​​(Int32 j = 0; j + 1 < defData.Count; j++ )​

​{                            ​

​double​​​ ​​dDashe = defData.AtDouble(j);​

 

​}​

 

​newHatch.AddPatternDefinition(Angle,baseX,baseY,offsetX,offsetY,defData);​

​}                    ​​​​//​

​newHatch.PatternType = hatch.PatternType;​

​newHatch.PatternName = hatch.PatternName;​

​newHatch.PatternScale = hatch.PatternScale;​

​newHatch.PatternSpace = hatch.PatternSpace;​

​newHatch.PatternDouble = hatch.PatternDouble;​

​newHatch.HatchStyle = hatch.HatchStyle;​

​newHatch.HatchObjectType = hatch.HatchObjectType;​

​newHatch.GradientType = hatch.GradientType;​

​newHatch.GradientName = hatch.GradientName;​

​newHatch.GradientAngle = hatch.GradientAngle;​

​newHatch.GradientOneColorMode = hatch.GradientOneColorMode;​

​newHatch.ShadeTintValue = hatch.ShadeTintValue;                    ​

​// 把新的填充对象增加当前空间。​

​axMxDrawX1.DrawEntity(newHatch);​

十、向记录中增加一个填充对象

c#代码实现如下:

​MxDrawHatch acHatch = (MxDrawHatch)database.CurrentSpace().AddHatch(1,​​​​"SOLID"​​​​);​

十一、绘制填充,从中间挖去一块

1、主要用到函数说明:_DMxDrawX::PathMakeExclude

把当前路径做上排除标记,主要用于填充的绘制,把这个路径组成的闭合区域在填充中挖去。

2、js代码实现如下:

​//绘制一个实心有圆弧边界填充,中间挖去一块.​

 

​//定义一个路径的开始点​

​mxOcx.PathMoveToEx(440, 3310, 0, 0, 0);​

 

​//路径的一下个点​

​mxOcx.PathLineTo(480, 3310);​

 

​//路径的一下个点​

​mxOcx.PathLineTo(480, 3360);​

 

​//路径的一下个点​

​mxOcx.PathLineTo(450, 3340);​

 

​// 把上面定义的路径定义填充排除区域.​

​mxOcx.PathMakeExclude(​​​​true​​​​);​

 

​//定义一个路径的开始点​

​mxOcx.PathMoveToEx(400, 3300, 0, 0, 0.3);​

 

​//路径的一下个点​

​mxOcx.PathLineTo(500, 3300);​

 

​//路径的一下个点​

​mxOcx.PathLineTo(500, 3400);​

 

​//路径的一下个点​

​mxOcx.PathLineTo(400, 3300);​

 

 

​mxOcx.DrawColor = 255;​

 

​//把路径变成一个填充​

​mxOcx.DrawPathToHatch(1);​

梦想CAD控件关于填充问题_数据_06

十二、绘制椭圆填充

c#代码实现如下:

​MxDrawEllipse ellipse = ​​​​new​​​ ​​MxDrawEllipse();​

​MxDrawPoint cen = ​​​​new​​​ ​​MxDrawPoint();​

​cen.x = 100;​

​cen.y = 200;​

 

​ellipse.Center = cen;                ​

​MxDrawVector3d majAxis = ​​​​new​​​ ​​MxDrawVector3d();​

​majAxis.x = 100;​

​majAxis.y = 0;​

 

​ellipse.MajorAxis = majAxis;​

 

​ellipse.RadiusRatio = 0.5;​

 

​MxDrawPoints pts =  ellipse.GetSamplePoints(0.1);                ​

​for​​​ ​​(int i = 0; i < pts.Count; i++)​

​{                    ​

​if​​​ ​​(i == 0)​

​axMxDrawX1.PathMoveTo(pts.Item(i).x, pts.Item(i).y);                    ​

​else​

​axMxDrawX1.PathLineTo(pts.Item(i).x, pts.Item(i).y);​

​}​

 

​axMxDrawX1.PathMakeClosed();​

​axMxDrawX1.DrawPathToHatch(1);​

​axMxDrawX1.ZoomAll();;​

举报

相关推荐

0 条评论