找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 795|回复: 2

[ARX函数]:ARX自定义捕捉(AcDbCustomOsnapInfo)中的两个问题

[复制链接]
发表于 2006-7-8 11:12:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
ARX自定义捕捉(AcDbCustomOsnapInfo)中的两个问题

1. 如果同时捕捉一条直线的中点与最近点,例子如下,但在捕捉中点的时候非常不易,总是受最近点的影响. 猜想可以pickPoint与中点之间的显示距离小于一定像素时,只追加中点,而不再追加最近点,但又不能计算它们之间的显示距离(像素值)

Acad::ErrorStatus
AsdkThirdOsnapCurveInfo::getOsnapInfo(
        AcDbEntity*                                pickedObject,
        int                                                gsSelectionMark,
        const AcGePoint3d&                pickPoint,
        const AcGePoint3d&                lastPoint,
        const AcGeMatrix3d&                viewXform,
        AcArray<AcGePoint3d>&        snapPoints,
        AcArray<int>&                        geomIdsForPts,
        AcArray<AcGeCurve3d*>&        snapCurves,
        AcArray<int>&                        geomIdsForLines)
{
        if(pickedObject->isKindOf(AcDbLine::desc()))
        {
                AcDbLine *pLine=AcDbLine::cast(pickedObject);
                double startParam, endParam;
                Acad::ErrorStatus es=pLine->getStartParam( startParam);
                es=pLine->getEndParam( endParam );

                AcGePoint3d pt;
                es=pLine->getPointAtParam( 0.5*(startParam + endParam), pt );
                snapPoints.append(pt);

                pLine->getClosestPointTo(pickPoint, pt);
                snapPoints.append(pt);
        }
        return Acad::eOk;
}

2. 怎样捕捉圆(圆弧的圆心)?问题是:鼠标移到圆弧上时,并没有显示圆心符号. 如果加上以下一段:
                AcGeLine3d *pLine1=new AcGeLine3d(pt, pt+AcGeVector3d(1, 0, 0));
                snapCurves.append(pLine1);
        能显示圆心符号,并能进行X方向的对象追踪,但鼠标移到圆心位置时,圆心符号即消失.


AsdkThirdOsnapCurveInfo::getOsnapInfo(
        AcDbEntity*                                pickedObject,
        int                                                gsSelectionMark,
        const AcGePoint3d&                pickPoint,
        const AcGePoint3d&                lastPoint,
        const AcGeMatrix3d&                viewXform,
        AcArray<AcGePoint3d>&        snapPoints,
        AcArray<int>&                        geomIdsForPts,
        AcArray<AcGeCurve3d*>&        snapCurves,
        AcArray<int>&                        geomIdsForLines)
{
        if(pickedObject->isKindOf(AcDbArc::desc()))
        {
                AcDbArc *pArc=AcDbArc::cast(pickedObject);
                AcGePoint3d pt;
                pArc->getStartPoint(pt);
                snapPoints.append(pt);
                pArc->getEndPoint(pt);
                snapPoints.append(pt);

                pt=pArc->center();
                snapPoints.append(pt);
                //AcGeLine3d *pLine1=new AcGeLine3d(pt, pt+AcGeVector3d(1, 0, 0));
                //snapCurves.append(pLine1);
                //AcGeLine3d *pLine2=new AcGeLine3d(pt, pt+AcGeVector3d(0, 1, 0));
                //snapCurves.append(pLine2);
                //AcGeCircArc3d *pCircle=new AcGeCircArc3d(pt, AcGeVector3d(0, 0, 1), 1);
                //snapCurves.append(pCircle);

                pArc->getClosestPointTo(pickPoint, pt);
                snapPoints.append(pt);

                geomIdsForPts.append(pArc->id().asOldId());
                geomIdsForPts.append(pArc->id().asOldId());

                return Acad::eOk;
        }
        return Acad::eOk;
}

高手快来帮一把啊,这两个问题搞得我很郁闷.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-7-8 16:46:57 | 显示全部楼层
第一个问题AutoDesk做的绝对是非常合理的,就是这样,你既然选择了两中捕捉模式,当然系统自己去分析当前最合理的一种,然后采纳之。
第而个问题也是合理的,ARX没错。你所说的圆心标记那不是自定义类中处理的,她可能属于AUTOCAD的输入辅助系统一块中。这样的追中标记点在同一时刻最多不能超过大概是7个。当移到圆心处,那是一片空白的区域,ARX找不到任何图形的GS标记,所以那个圆心捕捉模式的黄色圆圈就必然消失。你只有在自定义类在圆心处必须画点东西。画什么都可以。追踪系统非常复杂,而且很隐蔽,我们很难控制。我也不知道AutoDesk是否对二次开发的用户开放了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-11 17:58:56 | 显示全部楼层
感谢回复.但还是没想出解决的方向.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 05:41 , Processed in 0.211254 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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