其他分享
首页 > 其他分享> > 梦想CAD控件关于填充问题

梦想CAD控件关于填充问题

作者:互联网

一、绘制填充

 

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

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

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

 

mc116.png

 

点击上图图案填充选择键mc117.png,弹出窗口,如下图所示,选择填充样式:

 

mc118.png

 

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

 

mc119.png

 

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

 

主要用到函数说明:

 

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);

 

tianchong.png

 

十二、绘制椭圆填充

 

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();;

标签:控件,mxOcx,填充,路径,newHatch,图案,hatch,CAD
来源: https://blog.csdn.net/u013725001/article/details/90258562