feng_ling 发表于 2004-10-28 11:16:00

[ARX]问一个ARX选择集操作的一个问题

ads_name ss; <BR>AcEdSSGet(NULL,NULL,NULL,NULL,SS); <BR>函数执行时,总要求按确认 <BR>如果我想在执行时点到物体时做单选,没点到物体时窗选,不按确认即执行后续指令,应该怎么做,鼠标形状最好还是方框。 <BR>本想用acedEntSel(const char * str,ads_name entres,ads_point ptres);可出错以后ptres无法获得,窗选时还得输入第一点。

王咣生 发表于 2004-10-28 12:37:00

回复

acedEntSel(const char * str,ads_name entres,ads_point ptres);


控制函数返回值, 如果为RTNORM ,执行你的操作, 否则, 静默退出.

feng_ling 发表于 2004-10-28 14:55:00

本来我也是这样做的,可是if(acedEntSel(const char * str,ads_name entres,ads_point ptres)!=RTNORM) 时调用AcEdSSGet(“W”,Pt1,Pt2,NULL,SS)<BR>做窗选时要有两点,我想只输入第二点,第一点就用acedEntSel时点下的那一点,如何办。

王咣生 发表于 2004-10-28 17:37:00

回复

你这样的想法现实吗? 至少解决的方法不合理, 本来"W"的选择方式就是让你手动选择窗口对角点.

feng_ling 发表于 2004-10-29 10:35:00

if 仅用AcEdSSGet(“W”,NULL,NULL,NULL,SS)时单选时也要点两点,不是我所要的效果,如果方法不合理,你觉得有什么好的办法,能解问题就行。拜托了!!!

amwwcwujqw 发表于 2004-11-15 17:40:00

不知我写的这段代码能不能帮上你!

void NonModelDlg::OnButton1() <BR>{<BR>                BeginEditorCommand();<BR>        ads_name adsent1;<BR>        ads_point pt1;<BR>        int ret;<BR><BR>        int type1;<BR>        AcDbEntity *ent1;<BR>


        ret=acedEntSel(NULL,adsent1,pt1);<BR>//用户中断选择<BR>        if(ret==RTCAN)<BR>        {<BR>                acedPrompt("\n用户中断选择!");<BR>                gpDlg-&gt;endDlg();<BR>                return;<BR>        }<BR>        <BR>//选择失败<BR>        else if(ret==RTERROR)<BR>        {<BR>                acedPrompt("选择失败!");<BR>                gpDlg-&gt;endDlg();<BR>                return;<BR>        }


        acdbGetObjectId(ent1Id,adsent1);<BR>        acdbOpenObject(ent1,ent1Id,AcDb::kForRead);<BR>        type1=GetObjectType(adsent1);//GetObjectType()为判断adsent1为直线还是圆<BR>        switch(type1)<BR>        {<BR>        case 1:<BR>                m_Type=_T("直线");<BR>                break;<BR>        case 2:<BR>                m_Type=_T("圆");<BR>                break;<BR>        default:<BR>                m_Type=_T("请选择圆或直线!");<BR>                break;<BR>        }<BR>        UpdateData(0);<BR>        CompleteEditorCommand();<BR>        ent1-&gt;close();<BR>}<BR>


这是对话框中一个选择按钮中的代码

feng_ling 发表于 2004-11-16 13:23:00

好像不能达到我要的效果。  
我已经找到了好的办法解决这个问题


ads_name SS;


void MYSEL(const char * str)<BR>{<BR>        ads_name SS2;<BR>        ads_point Pt;<BR>        struct resbuf* B1;<BR>        struct resbuf B3;<BR>        struct resbuf B4;<BR>        struct resbuf B2;<BR>        int track=15;<BR>        int type=2;<BR>        long I;<BR>        int KK;<BR>        ads_point Pt2;<BR>        if(acedSSGet("I",NULL,NULL,NULL,SS)!=RTNORM)<BR>        {<BR>                KK=acedEntSel(str,SS2,Pt);<BR>                if (KK!=RTNORM)<BR>                {<BR>                        if (acedGrRead(track,&amp;type,&amp;B2)!=RTNORM)return;<BR>                        if (type==13)<BR>                        {<BR>                                if (acedGrRead(track,&amp;type,&amp;B2)!=RTNORM)return;<BR>                        }


       if (type==12)return;<BR>                        B1=&amp;B2;<BR>                        for (I=0;&amp;B1!=NULL;B1=B1-&gt;rbnext)<BR>                        {<BR>                                if(B1-&gt;restype==RT3DPOINT)<BR>                                {               <BR>                                        Pt=B1-&gt;resval.rpoint;<BR>                                        Pt=B1-&gt;resval.rpoint;<BR>                                        Pt=B1-&gt;resval.rpoint;<BR>                                        break;<BR>                                }<BR>                        }<BR>                        acedGetVar("OSMODE",&amp;B3);<BR>                        B4.restype = RTLONG;<BR>                        B4.resval.rstring = 0; <BR>                        B4.rbnext = NULL; <BR>                        acedSetVar("OSMODE",&amp;B4);<BR>                        acedInitGet(32,NULL);<BR>                        if(acedGetCorner(Pt,"\n指定对角点:",Pt2)!=RTNORM)<BR>                        {<BR>                                acedSetVar("OSMODE",&amp;B3);<BR>                                goto LINE1;<BR>                        }<BR>                        if(acedSSGet("C",Pt,Pt2,NULL,SS)!=RTNORM)<BR>                        {<BR>                                acedSetVar("OSMODE",&amp;B3);<BR>                                goto LINE1;<BR>                        }<BR>                        acedSetVar("OSMODE",&amp;B3);<BR>                }<BR>                else<BR>                {<BR>                        if(acedSSAdd(SS2,NULL,SS)!=RTNORM)goto LINE1;<BR>                }<BR>        }<BR>LINE1:<BR>        acedSSFree(SS2);        <BR>        return;<BR>}
页: [1]
查看完整版本: [ARX]问一个ARX选择集操作的一个问题