找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4488|回复: 5

[求助] 如何使用acedSSGet函数中的“F”等模式选择对象

[复制链接]
发表于 2014-11-30 10:25:45 | 显示全部楼层 |阅读模式

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

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

×
求助:以下代码利用acedSSGet( )函数中的“F”的模式进行选择集操作,出现选不中对象的问题,请高人指点。
ads_point pt1,pt2,pt3,pt4;
                pt1[X]=pt1[Y]=pt2[Y]=pt4[X]=0.0;
                pt3[X]=5.0;
                pt2[X]=pt3[Y]=pt4[Y]=5.0;
                pt1[Z]=pt2[Z]=pt3[Z]=pt4[Z]=0.0;
                AcDbObjectId Line1Id,Line2Id,Line3Id,Line4Id;
                Line1Id = CEnt0Line(asPnt3d(pt1),asPnt3d(pt2));// 已知两点求直线;
                Line2Id = CEnt0Line(asPnt3d(pt2),asPnt3d(pt3));
                Line3Id = CEnt0Line(asPnt3d(pt3),asPnt3d(pt4));
                Line4Id = CEnt0Line(asPnt3d(pt4),asPnt3d(pt1));
                ads_point pt5,pt6;
                pt5[X]=6.0;
                pt5[Y]=1.0;
                pt6[X]=-1.0;
                pt6[Y]=1.0;
                pt5[Z]=pt6[Z]=0.0;
                AcDbObjectId Line5Id;
                Line5Id = CEnt0Line(asPnt3d(pt5),asPnt3d(pt6)); // 显示栏选的路径
                struct resbuf *pointList;
                ads_name ssName;
                pointList = acutBuildList(RTPOINT,pt5,RTPOINT,pt6,0);
                if (acedSSGet(_T("F"),pointList,NULL,NULL,ssName)!=RTNORM){  // 操作后无选择对象;
                        acutPrintf(_T("\nNothing selected"));
                        return;
                }
                acutRelRb(pointList);                 
                long length;
                acedSSLength(ssName, &length);
                acutPrintf(_T("\nselected entity = %Ld",length));
                acedSSFree(ssName);
                return;
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-11-30 11:32:17 | 显示全部楼层
你看看 acedSSGet(_T("F"),pointList,NULL,NULL,ssName)这句的返回值是什么,别直接判断RTNORM
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-30 12:04:35 来自手机 | 显示全部楼层
lisp习惯,直接比较了
类型要先声明
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-11-30 12:07:35 | 显示全部楼层
你的代码是要选择自己刚画的直线? CEnt0Line 你的这个函数 把实体添加到数据库了吗?添加后要REGEN下,SSGET的显示列表结构才能更新,才能选择到。

点评

您说的,“显示列表才能更新”能否具体讲解一下?我用了另一种办法:先用“L”模式选择一个对象, if (acedSSGet(_T("L"),NULL,NULL,NULL,ssName)!=RTNORM){ acutPrintf(_T("\nNothing selected")); return  详情 回复 发表于 2014-12-1 23:18
是要选择自己画的直线,CEnt0Line函数见下,已经加到数据库了,不知怎么REGEN,请指教! AcDbObjectId CEnt0Line(const AcGePoint3d pt_1st, const AcGePoint3d pt_2nd){ AcDbLine* pLine = new A  详情 回复 发表于 2014-12-1 23:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-1 23:01:55 | 显示全部楼层
XDSoft 发表于 2014-11-30 12:07
你的代码是要选择自己刚画的直线? CEnt0Line 你的这个函数 把实体添加到数据库了吗?添加后要REGEN下,SSG ...

是要选择自己画的直线,CEnt0Line函数见下,已经加到数据库了,不知怎么REGEN,请指教!
AcDbObjectId CEnt0Line(const AcGePoint3d pt_1st,
                                                        const AcGePoint3d pt_2nd){
                                                                AcDbLine* pLine = new AcDbLine(pt_1st,pt_2nd);
                                                                AcDbBlockTable *pBlockTable;
                                                                acdbHostApplicationServices()->workingDatabase()
                                                                        ->getBlockTable(pBlockTable, AcDb::kForRead);
                                                                AcDbBlockTableRecord *pBlockTableRecord;
                                                                pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
                                                                        AcDb::kForWrite);
                                                                pBlockTable->close();
                                                                AcDbObjectId lineObjID;
                                                                pBlockTableRecord->appendAcDbEntity(lineObjID, pLine);   
                                                                pBlockTableRecord->close();
                                                                pLine->close();  
                                                                return lineObjID;       
}

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

使用道具 举报

 楼主| 发表于 2014-12-1 23:18:29 | 显示全部楼层
XDSoft 发表于 2014-11-30 12:07
你的代码是要选择自己刚画的直线? CEnt0Line 你的这个函数 把实体添加到数据库了吗?添加后要REGEN下,SSG ...

您说的,“显示列表才能更新”能否具体讲解一下?我用了另一种办法:先用“L”模式选择一个对象,
if (acedSSGet(_T("L"),NULL,NULL,NULL,ssName)!=RTNORM){
                        acutPrintf(_T("\nNothing selected"));
                        return;
                }
然后用再acedSSAdd函数一个个实体加入到选择集中,是可行的,
                ads_name entName;
                acdbGetAdsName(entName,LlineID1);
                acedSSAdd(entName,ssName,ssName);


那为什么用"L"模式又是可以的呢,这与“F”“C”模式有什么区别呢?请指教!

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 14:21 , Processed in 0.201955 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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