技术资讯
每一次案例的完美合作,是对我们团队高度认可,相信未来会更好!
技术资讯
成功案例
快速帮助
当前位置:首页 > 技术资讯 > 详情

梦想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();;
梦想CAD控件
梦想CAD是专业的CAD插件(控件),可轻松在网页、手机及BS/CS程序中浏览编辑DWG文件,不需安装AutoCAD即可运行。经十余年累积已非常稳定可靠,有关键的空间搜索算法,并使用汇编优化,可同时处理50万级实体,有非常高的图形显示和处理效率。
联系我们
技术TEL:400-888-5703
185-8173-1060
客服I QQ: 3570505660
技术I QQ: 827867134
技术II QQ:6884123
VIP服务购买
销售TEL:156-8136-8971
销售QQ:710714273
用户交流
控件QQ交流群1:73281982
控件QQ交流群2:112199959
MxCAD软件群 1:515771658
技术I:QQ
827867134
客服I:QQ
3570505660
销售QQ
710714273
联系电话400-888-5703