![]() |
【转帖】[求助]关于拾取点获得点坐标
[求助]关于拾取点获得点坐标
[求助]关于拾取点获得点坐标 在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::on_kinitappmsg (pkt) ; // todo: add your initialization code here return (retcode) ; } virtual acrx::appretcode on_kunloadappmsg (void *pkt) { acrx::appretcode retcode =acrxarxapp::on_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)) ; |
所有的时间均为北京时间。 现在的时间是 09:21 PM. |