天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 82|回复: 0

arx获取填充边界

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
我个人认为填充边界并不是一组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();        
}

 

 

 

 

arx获取填充边界
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 12:26 , Processed in 0.160147 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表