几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » ObjectARX(C++)
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2009-04-16, 03:02 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】[求助]关于拾取点获得点坐标

[求助]关于拾取点获得点坐标
[求助]关于拾取点获得点坐标
在arx中
1.如何通过pick图形上的点获得点坐标
2.如何通过pick图形上的直线获得两端endpoint的坐标和中点midpoint的坐标
关于第一个问题我选择了acedgetpoint()
但是根据函数定义
int acedgetpoint(
const ads_point pt,
const char *prompt,
ads_point result);
这个函数返回rtnorm等值(这类值是否是整形的?)
函数说明中说该函数将pt与result认为三维点,那么ads_point类型与acgepoint3d这种类型有什么区别?
是否能通过该函数输出pick的点的三维坐标,如果可以的话使用哪个参数输出,类型上需要如何转换?
关于第二个问题我查了一下
有如下几个函数
acgepoint3d endpoint() const;
acgepoint3d midpoint() const;
acedgetpoint()
为了达到我的要求应该选用哪几个函数?能否提供一小段代码让我研究一下
谢谢
可以到xdcad.net上面翻翻置顶的例子
给你个参考
void iterate(acdbobjectid plineid)
{ //遍历多义线的顶点 并且打印出每个顶点的坐标
acdb2dpolyline *ppline;
acdbopenobject(ppline,plineid,acdb::kforread);
acdbobjectiterator*pvertiter = ppline->vertexiterator();
ppline->close();
acdb2dvertex *pvertex;
acgepoint3d location;
acdbobjectid vertexobjid;
for(int vertexnumber=0;!pvertiter->done();
vertexnumber++,pvertiter->step())
{
vertexobjid=pvertiter->objectid();
acdbopenobject(pvertex,vertexobjid,acdb::kforread);
location=pvertex->position();
pvertex->close();
acutprintf("\n顶点 # %d的位置为:%0.3f,%0.3f,%0.3f",vertexnumber,
location[x],location[y],location[z]);
}
delete pvertiter;
}
`~
帮你顶
谢谢楼上几位,我先研究一下
过几天报告研究结果^_^
报告一下我的学习成果
我用objectarx project写了如下的代码
实现的功能是在当前绘图中pick点,将点坐标存在sql server数据库中的同时将pick的点顺序连线
此代码编译通过且加载arx后实现预期功能
但在关闭autocad时,无论选择是否保存都会导致autocad非正常退出(保存能成功)
请帮我看看这段程序的bug在哪里,帮我完善一下,谢谢
#include "stdafx.h"
cstring xpt[100];
cstring ypt[100];
float xco[100];
float yco[100];
//-----------------------------------------------------------------------------
#define szrds _rxst("lemon")
//-----------------------------------------------------------------------------
//----- objectarx entrypoint
class cpickpointapp : public acrxarxapp {
public:
cpickpointapp () : acrxarxapp () {}
virtual acrx::appretcode on_kinitappmsg (void *pkt) {
acrx::appretcode retcode =acrxarxapp:n_kinitappmsg (pkt) ;
// todo: add your initialization code here
return (retcode) ;
}
virtual acrx::appretcode on_kunloadappmsg (void *pkt) {
acrx::appretcode retcode =acrxarxapp:n_kunloadappmsg (pkt) ;
// todo: add your code here
return (retcode) ;
}
virtual void registerservercomponents () {
}
// ----- lemonpickpoint.pp command (do not rename)
static void lemonpickpointpp(void)
{
// add your code for command lemonpickpoint.pp here

ads_point pt;
int nodenumcount; //定义节点数,即最大的节点编号数值
acedgetint("please input the node number:",&nodenumcount);
for(int i=0;i<nodenumcount;i++)
{
if(acedgetpoint(null,"\npick a point:",pt)==rtnorm)
{
xpt[i].format("%g",pt[x]);
ypt[i].format("%g",pt[y]);
acutprintf("\nthe coordinates of the point is:%s,%s",xpt[i],ypt[i]);
}
}
_connectionptr m_pconnection;
afxoleinit();
hresult hr;

hr = m_pconnection.createinstance("adodb.connection");///创建connection对象
if(succeeded(hr))
{
hr = m_pconnection->open("provider=sqloledb;data source=czqday;user id=sa;password=820306;initial catalog=toshiba1","","",admodeunknown);///连接数据库
}

try
{
_variant_t varprojectid,varid,varx,vary;
for(int i=0;i<nodenumcount;i++)
{
atof(xpt[i]);
atof(ypt[i]);
varprojectid = "as001";
varid = i+1;
varx = xpt[i];
vary = ypt[i];
_recordsetptr t_precordset;
t_precordset.createinstance("adodb.recordset");
t_precordset->open("select * from xy",_variant_t((idispatch*)m_pconnection,true),adopenstatic,adlockoptimistic,adcmdtext);
t_precordset->movefirst();
t_precordset->addnew();
t_precordset->putcollect("projectid",varprojectid);
t_precordset->putcollect("id",varid);
t_precordset->putcollect("x",varx);
t_precordset->putcollect("y",vary);
t_precordset->update();//只有写了这句才能刷新数据库!!

//refresh();//只有运行这个函数,才能保存成功
t_precordset->close();
}
}
catch(_com_error e)///捕捉异常
{
afxmessagebox("保存不成功!");///显示错误信息
}
//更改数据类型,cstring->float
for (int j=0;j<nodenumcount;j++)
{
xco[j]=atof(xpt[j]);
yco[j]=atof(ypt[j]);
}
//pick点,连续画直线
acdbblocktablerecord *pblktablercd
=new acdbblocktablerecord();//创建块表记录
//以写方式得到当前块表的指针
acdbblocktable *pblktable=null;
acdbhostapplicationservices()->workingdatabase()
->getsymboltable(pblktable, acdb::kforwrite);
//将新的块表记录加入块表中,并获得块表记录的id
acdbobjectid id;
pblktable->add(id, pblktablercd);
pblktable->close();
for(int k=0;k<nodenumcount;k++)
{
//生成直线
acgepoint3d startpt(xco[k],yco[k],0.0);//定义直线起点
acgepoint3d endpt(xco[k+1],yco[k+1],0.0);//定义直线终点
acdbline *pline=new acdbline(startpt,endpt);
acdbblocktable *pblktable2=null;
acdbhostapplicationservices()->workingdatabase()
->getsymboltable(pblktable2, acdb::kforread);
pblktable2->getat(acdb_model_space, pblktablercd,
acdb::kforwrite);
pblktable2->close();
acdbobjectid lineid;
pblktablercd->appendacdbentity(lineid, pline);
pline->setlayer("layer_frame");//设置创建轮廓线的层为"layer_frame"
pline->close();
}
pblktablercd->close();
}
} ;
//-----------------------------------------------------------------------------
implement_arx_entrypoint(cpickpointapp)
aced_arxcommand_entry_auto(cpickpointapp, lemonpickpoint, pp, pp, acrx_cmd_transparent, null)
我只给你作一下提示:
如果你想在acedgetpoint()函数里直接使用acgepoint3d定义的点类,可以使用如下语句。
acgepoint3d pt ;
acedgetpoint(null, "拾取点:", asdblarray(pt)) ;
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 10:25 AM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多