找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 913|回复: 8

[ARX函数]:请教:关于获取点坐标问题。

[复制链接]
发表于 2005-7-29 16:07:59 | 显示全部楼层 |阅读模式

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

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

×
用ARX如何获取图的最右上角坐标和最左下角坐标。

是不是有函数可以获取?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-8-1 21:15:20 | 显示全部楼层

Re: [ARX函数]:请教:关于获取点坐标问题。

最初由 梦幻神话 发布
[B]用ARX如何获取图的最右上角坐标和最左下角坐标。

是不是有函数可以获取? [/B]


不好意思,提个建议先:
你的标题如果是“用ARX如何获取图的最右上角坐标和最左下角坐标。”会好很多。

//*********************************************************************************
//用ARX如何获取图的最右上角坐标和最左下角坐标(#include <DBSYMTB.H>)
//Pt0:左下角点,Pt1:右上角点
int GetCurViewPoint(ads_point pt0, ads_point pt1)
{
        SetDispCmdEcho(FALSE);        //显示命令行
        ads_command(RTSTR, "view", RTSTR, "s", RTSTR, "TEMPFORVIEWSAVE13167", RTNONE);

        AcDbViewTable *pVTable = NULL;
        if (Acad::eOk == acdbCurDwg()->getViewTable(pVTable, AcDb::kForWrite))
        {
                AcDbViewTableRecord *pVTabRec = NULL;
                if (Acad::eOk == pVTable->getAt("TEMPFORVIEWSAVE13167", pVTabRec, AcDb::kForRead))
                {
                        AcGePoint2d ptCenter = pVTabRec->centerPoint();
                        double width = pVTabRec->width();
                        double height = pVTabRec->height();
                        pt0[X] = ptCenter[X] - width/2.0f;
                        pt0[Y] = ptCenter[Y] - height/2.0f;
                        pt0[Z] = 0;
                        pt1[X] = ptCenter[X] + width/2.0f;
                        pt1[Y] = ptCenter[Y] + height/2.0f;
                        pt1[Z] = 0;
                       
                        pVTabRec->close();
                }
                pVTable->close();
        }
        ads_command(RTSTR, "view", RTSTR, "d", RTSTR, "TEMPFORVIEWSAVE13167", RTNONE);

        return 1;
}

//显示命令行
void SetDispCmdEcho(BOOL bOn)
{
        struct resbuf eb;
        eb.restype = RTSHORT;
        eb.resval.rint = (int)bOn;
        ads_setvar("CMDECHO", &eb);

}

//关键是取得当前窗口的centerPoint
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-1 23:37:02 | 显示全部楼层
晕 ads_command.................

用AcDbViewportTableRecord
The set of ViewportTableRecords that are currently active will all have the name "*ACTIVE". The first "*ACTIVE" ViewportTableRecord in the ViewportTable is always for the current viewport.
意思是说有个名字叫*ACTIVE的


然后用 AcDbAbstractViewTableRecord::width Function  
AcDbAbstractViewTableRecord::height Function
AcDbAbstractViewTableRecord::centerPoint Function
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-2 21:50:22 | 显示全部楼层
//用ARX如何获取图的最右上角坐标和最左下角坐标(#include <DBSYMTB.H>)
//Pt0:左下角点,Pt1:右上角点
int GetCurViewPoint_Second(ads_point pt0, ads_point pt1)
{
        AcDbViewportTable *pVTable = NULL;
        if (Acad::eOk == acdbCurDwg()->getViewportTable(pVTable, AcDb::kForWrite))
        {
                AcDbViewportTableRecord *pVTabRec = NULL;
                if (Acad::eOk == pVTable->getAt("*ACTIVE", pVTabRec, AcDb::kForRead))
                {
                        AcDbAbstractViewTableRecord *pAbsVTabRec = AcDbAbstractViewTableRecord::cast(pVTabRec);
                        AcGePoint2d ptCenter = pAbsVTabRec->centerPoint();
                        double width = pAbsVTabRec->width();
                        double height = pAbsVTabRec->height();
                        pt0[X] = ptCenter[X] - width/2.0f;
                        pt0[Y] = ptCenter[Y] - height/2.0f;
                        pt0[Z] = 0;
                        pt1[X] = ptCenter[X] + width/2.0f;
                        pt1[Y] = ptCenter[Y] + height/2.0f;
                        pt1[Z] = 0;
                       
                        pVTabRec->close();
                }
                pVTable->close();
        }

        return 1;
}
这是我修改后的代码,不知哪个地方出了问题。
运行结果一直是:
左下角点:0.000, 0.000
右上角点:14.528, 9.000


楼上的主意是不错,不过我调试了一下,没有得到正确结果,可否发个例子学习一下。3Q
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-2 22:56:20 | 显示全部楼层
谢谢楼上几位仁兄.

这只是获取当前视图的点,如果获取整个图纸范围空间的点呢.

如果你没改变过当前视图得到的是楼上的结论.
稍微动一动就可以得到正确滴点....
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-3 20:29:19 | 显示全部楼层
动了,运行结果一直是:
左下角点:0.000, 0.000
右上角点:14.528, 9.000
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-28 09:33:09 | 显示全部楼层
好象可以通过系统变量来计算得到,我记得以前在VBA中处理过的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 21个

财富等级: 恭喜发财

发表于 2005-8-30 18:08:42 | 显示全部楼层
//P1:左下角点,P2:右上角点
void        GetCurWindowCoord(ads_point &p1,ads_point &p2)
{
        double W,H;
        ads_point center,pHW;
        double x,y,dx,dy;
        resbuf *buf=new resbuf();
        acedGetVar("VIEWCTR",buf);
        copyAdsPt(center,buf->resval.rpoint);
        acedGetVar("SCREENSIZE",buf);
        copyAdsPt(pHW,buf->resval.rpoint);
        acedGetVar("VIEWSIZE",buf);
        dy=buf->resval.rreal;
        x=pHW[0];
        y=pHW[1];
        dx=x/y*dy;
        H=dy;
        W=dx;

        p1[0]=center[0]-W/2.0;
        p1[1]=center[0]-H/2.0;
        p1[2]=0;

        p2[0]=center[0]+W/2.0;
        p2[1]=center[0]+H/2.0;
        p2[2]=0;

}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-2 15:30:17 | 显示全部楼层
使用AcDbExtent类即可解决以上问题:即获取模型块表中所有实体的最大包容盒,代码如下:
AcDbExtents allbox;
        Acad::ErrorStatus es;
        AcDbBlockTableRecord *pbtr;
        AcDbBlockTable *ptabl=(AcDbBlockTable*)wyfTool::openSymbolTable(pbtr->desc(),AcDb::kForRead);
        if(ptabl==NULL)
                return Acad::eWrongDatabase;
        es=ptabl->getAt(ACDB_MODEL_SPACE,pbtr,AcDb::kForRead);
        ptabl->close();       
        if(es!=Acad::eOk)
                return es;               
        es=allbox.addBlockExt(pbtr);//重点
        pbtr->close();
        if(es!=Acad::eOk)
                return es;
        allbox.minPoint();//左下点
        allbox.maxPoint();//右上点

对了,忘了说wyfTool::openSymbolTable是我自己的一个库函数用来获取符号表,这不是问题关键,解释一下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 22:02 , Processed in 0.206255 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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