一、绘制填充
1.单击菜单栏,“绘图”->“ 填充”。
2.单击绘图工具栏“绘填充命令”按钮。
3.在命令行中输入Hatch ,按回车键,显示如下:
点击上图图案填充选择键,弹出窗口,如下图所示,选择填充样式:
点选边界按钮,指定闭合区域中的一点,程序会自动搜索该区域,并填充。填充效果如下:
二、由闭合区域内部一点,绘制一个填充对象
主要用到函数说明:
MxDrawXCustomFunction::Mx_DrawHatchFromPointEx
由闭合区域内部一个点,绘制一个填充对象。
参数 | 说明 |
---|---|
DOUBLE dX | 点坐标X 点坐标Y |
DOUBLE dPatternScale | 填充图案缩放比例 |
long ladOpt | 对填充内部的孤岛的处理.0 =忽略孤岛, 1 = 处理孤岛, 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); |
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); |
三、填充图案从文件加载图案定义
主要用到函数说明:
IMxDrawHatch::LoadPatternDefinition
从文件加载图案定义,详细说明如下:
参数 | 说明 |
---|---|
[in] BSTR pszFileName | 图案定义文件 |
[in] BSTR pszName | 图案名称 |
[in] DOUBLE dPatternScale | 缩放比例,默认传1.0 dPatternAngel -角度,默认传0.0 |
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); |
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()); |
七、增加一个图案填充数据
主要用到函数说明:
_DMxDrawX::AddPatternDefinition
增加一个图案定义。
参数 | 说明 |
---|---|
BSTR pszName | 图案名称 |
BSTR pszPatternDefinition | 图案定义字符串 |
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" ); |
十一、绘制填充,从中间挖去一块
主要用到函数说明:
_DMxDrawX::PathMakeExclude
把当前路径做上排除标记,主要用于填充的绘制,把这个路径组成的闭合区域在填充中挖去。
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); |
十二、绘制椭圆填充
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();; |