arx获取填充边界

我个人认为填充边界并不是一组AcDb对象,而是一组AcGe对象,在网上没有相关资料,

我是看帮助后这样理解的,因此不一定正确。我们在屏幕上用"Hatch"命令拾取点后,

只不过是利用图形构造一组AcGe对象而已。因此,通过程序获得这些数学表达的对象

后,如何进一步处理就是用户的事了(如可以根据数学表达对象构建相应的AcDb对象

并添加到数据库中),下面的例子很肤浅的表达了上面的意思,如果你有更深的研究,

拿出来,大家可以共同提高。


// 程序编译通过,可以在CAD中画各种填充图案测试,结果正确
// 即使把填充图案的边界实体删除后测试结果也一样
void windo()
{
        Acad::ErrorStatus es;
        
        Adesk::Int32 LoopType;
        
        AcGeVoidPointerArray edgeptrAry;
        AcGeIntArray edgeTypesAry;
        
        AcGePoint2dArray vertices;  
        AcGeDoubleArray bulges;
        
        
        ads_point pt;
    ads_name en;
    if(acedEntSel("\n选择填充图案:", en, pt) != RTNORM)  return;
     
    AcDbObjectId Id;   
    acdbGetObjectId(Id, en);
        
    AcDbEntity *pEnt = NULL;
        acdbOpenObject(pEnt, Id, AcDb::kForRead);      
        
        AcDbHatch *pHatch = AcDbHatch::cast(pEnt);        
        if(pHatch == NULL)
        {
                pEnt->close();
                return;
        }        
        
        //获得填充边界的数目
        int LoopNum = pHatch->numLoops();        
        
        for (int i=0; i<LoopNum; i++)
        {
                //获取边界类型
                LoopType = pHatch->loopTypeAt(i);
                //如果边界是多义线
                if (LoopType & AcDbHatch::kPolyline)
                {
                        //取得边界定义数据(polyline)的顶点数组和凸度数组,它们是一一对应的
                        es = pHatch->getLoopAt(i, LoopType, vertices, bulges);
                        //acutPrintf("\n多义线");
                        //是不是根据这些顶点数组和凸度数组构造一条AcDb多义线取决于你        
                }
                else
                {
                        //几乎可以取得除polyline外的所有边界定义数据
                        //第三个参数返回值是无值指针数组
                        //第四个参数返回值是组成边界的每一条边的类型
                        //它们也是一一对应的关系
                        es = pHatch->getLoopAt(i, LoopType, edgeptrAry, edgeTypesAry);
                        
                        //遍历,因为每一条边界又可能由多种AcGe曲线构成
                        for (int j=0; j<edgeTypesAry.length(); j++)
                        {
                                
                                if(edgeTypesAry[j]==AcDbHatch::kLine)//直线
                                {
                                        AcGeLineSeg2d *LnSeg=(AcGeLineSeg2d *)edgeptrAry;
                                        //acutPrintf("\n直线");
                                }
                                else if(edgeTypesAry[j]==AcDbHatch::kCirArc)//圆弧
                                {
                                        AcGeCircArc2d *CirArc=(AcGeCircArc2d *)edgeptrAry;
                                        //acutPrintf("\n圆弧");
                                        //可以根据数学圆弧构造相应的AcDb圆弧,取决于你(以下同)
                                }
                                else if(edgeTypesAry[j]==AcDbHatch::kEllArc)//椭圆弧
                                {
                                        AcGeEllipArc2d *EllArc=(AcGeEllipArc2d *)edgeptrAry;
                                        //acutPrintf("\n椭圆弧");
                                }
                                else if(edgeTypesAry[j]==AcDbHatch::kSpline)//NURBS曲线
                                {
                                        AcGeNurbCurve2d *Spline=(AcGeNurbCurve2d *)edgeptrAry;
                                        //acutPrintf("\nNURBS曲线");
                                }
                        }        
                }
        }        
               
        pEnt->close();        
}

http://bimcad.org/thread-5803-1-1.html

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值