![]() |
【转帖】[arx]
[arx]
[arx] 本人刚在学习objectarx,出现如下问题望各位看看: 1:在acdbentity派生类中定义了getgrippoints()函数,但在cad中看不到夹点, 是何原因(下附原程序). 2:在worlddraw()函数中采用acdbtext *ptext=new acdbtext()与 mode->geometry().text()定义实体有何区别. 类定义: class dllimpexp dingteclass : public acdbcurve { public: acrx_declare_members(dingteclass); // constructor / destructor dingteclass(); virtual ~dingteclass(); //{{afx_arx_methods(dingteclass) virtual acad::errorstatus dxfoutfields(acdbdxffiler* pfiler) const; virtual acad::errorstatus dxfinfields(acdbdxffiler* pfiler); virtual acad::errorstatus dwgoutfields(acdbdwgfiler* pfiler) const; virtual acad::errorstatus dwginfields(acdbdwgfiler* pfiler); virtual acad::errorstatus getstartpoint(acgepoint3d& x0) const; virtual acad::errorstatus getendpoint(acgepoint3d& x0) const; virtual acad::errorstatus getgrippoints(acgepoint3darray& grippoints, acdbintarray& osnapmodes, acdbintarray& geomids) const; virtual acad::errorstatus movegrippointsat(const acdbintarray& indices, const acgevector3d& offset); virtual acad::errorstatus transformby(const acgematrix3d& xform); virtual adesk::boolean worlddraw(acgiworlddraw* mode); //}}afx_arx_methods //{{afx_arx_data_access(dingteclass) acad::errorstatus setentpoint(const acgepoint3d entpoint); acad::errorstatus entpoint(acgepoint3d& entpoint); acad::errorstatus setstartpoint(const acgepoint3d startpoint); acad::errorstatus startpoint(acgepoint3d& startpoint); //}}afx_arx_data_access private: //{{afx_arx_data(dingteclass) acgepoint3d m_entpoint; acgepoint3d m_startpoint; //}}afx_arx_data private: void *operator new[](unsigned nsize) { return 0; } void operator delete[](void *p) {}; void *operator new[](unsigned nsize, const char *file, int line) { return 0; } }; 类实现: adesk::boolean dingteclass::worlddraw(acgiworlddraw* mode) { assertreadenabled(); // todo: implement this function. //acgepoint3d startpoint,entpoint; //this->startpoint(startpoint); //this->entpoint(entpoint); //acgevector3d normal(0.0, 0.0, 1.0); //acgevector3d direction=m_startpoint-m_entpoint; //mode->geometry().text(m_startpoint,normal,direction,5,0.8,0,"toolte"); //acgepoint3d *pverts=new acgepoint3d[2]; //pverts[0]=m_startpoint; //pverts[1]=m_entpoint; //mode->geometry().polyline(2,pverts); acdbtext *ptext=new acdbtext(); ptext->settextstring("hello"); ptext->setposition(m_startpoint); ptext->setheight(5.0); ptext->worlddraw(mode); acdbline *line; line=new acdbline(m_startpoint,m_entpoint); line->worlddraw(mode); return acdbentity::worlddraw(mode); } acad::errorstatus dingteclass::startpoint(acgepoint3d& startpoint) { assertreadenabled(); startpoint = m_startpoint; return acad::eok; } acad::errorstatus dingteclass::setstartpoint(const acgepoint3d startpoint) { assertwriteenabled(); m_startpoint = startpoint; return acad::eok; } acad::errorstatus dingteclass::entpoint(acgepoint3d& entpoint) { assertreadenabled(); entpoint = m_entpoint; return acad::eok; } acad::errorstatus dingteclass::setentpoint(const acgepoint3d entpoint) { assertwriteenabled(); m_entpoint = entpoint; return acad::eok; } acad::errorstatus dingteclass::transformby(const acgematrix3d& xform) { assertwriteenabled(); // todo: implement this function. m_startpoint.transformby(xform); m_entpoint.transformby(xform); return acdbentity::transformby(xform); } acad::errorstatus dingteclass::movegrippointsat(const acdbintarray& indices, const acgevector3d& offset) { assertwriteenabled(); // todo: implement this function. dingteclass* te=new dingteclass(); acgepoint3d entpoint,startpoint; te->getendpoint(entpoint); te->getstartpoint(startpoint); startpoint +=offset; entpoint +=offset; te->setentpoint(entpoint); te->setstartpoint(startpoint); return acdbentity::movegrippointsat(indices, offset); } acad::errorstatus dingteclass::getgrippoints(acgepoint3darray& grippoints, acdbintarray& osnapmodes, acdbintarray& geomids) const { assertreadenabled(); // todo: implement this function. acgepoint3d entpoint,startpoint; acgevector3d normal(0.0, 0.0, 1.0); startpoint=m_startpoint; entpoint=m_entpoint; acdbecs2wcs(asdblarray(startpoint), asdblarray(startpoint),asdblarray(normal),adesk::kfalse); acdbecs2wcs(asdblarray(entpoint), asdblarray(entpoint),asdblarray(normal),adesk::kfalse); grippoints.append(startpoint); grippoints.append(entpoint); return acdbentity::getgrippoints(grippoints, osnapmodes, geomids); } acad::errorstatus dingteclass::getendpoint(acgepoint3d& x0) const { assertreadenabled(); // todo: implement this function. x0=m_entpoint; return acdbcurve::getendpoint(x0); } acad::errorstatus dingteclass::getstartpoint(acgepoint3d& x0) const { assertreadenabled(); // todo: implement this function. x0=m_startpoint; return acdbcurve::getstartpoint(x0); } acad::errorstatus dingteclass::dwginfields(acdbdwgfiler* pfiler) { assertwriteenabled(); acad::errorstatus es; // call dwginfields from acdbcurve if ((es = acdbcurve::dwginfields(pfiler)) != acad::eok) { return es; } // read version number. adesk::uint16 version; pfiler->readitem(&version); if (version > version_dingteclass) return acad::emakemeproxy; // read the data members. switch (version) { case (1): pfiler->readitem(&m_startpoint); pfiler->readitem(&m_entpoint); // todo: here you can file datamembers not // created by the objectarx add-in. break; } return pfiler->filerstatus(); } acad::errorstatus dingteclass::dwgoutfields(acdbdwgfiler* pfiler) const { assertreadenabled(); acad::errorstatus es; // call dwgoutfields from acdbcurve if ((es = acdbcurve::dwgoutfields(pfiler)) != acad::eok) { return es; } // write version number. pfiler->writeitem((adesk::uint16) version_dingteclass); // write the data members. pfiler->writeitem(m_startpoint); pfiler->writeitem(m_entpoint); // todo: here you can file datamembers not // created by the objectarx add-in. return pfiler->filerstatus(); } acad::errorstatus dingteclass::dxfinfields(acdbdxffiler* pfiler) { assertwriteenabled(); struct resbuf rb; if ((acdbcurve::dxfinfields(pfiler) != acad::eok) || !pfiler->atsubclassdata("dingteclass")) return pfiler->filerstatus(); // read version number. pfiler->readitem(&rb); if (rb.restype != acdb::kdxfint16) { pfiler->pushbackitem(); pfiler->seterror(acad::einvaliddxfcode, "nerror: expected object version group code %d", acdb::kdxfint16); return pfiler->filerstatus(); } else { adesk::uint16 version = rb.resval.rint; if (version > version_dingteclass) return acad::emakemeproxy; } pfiler->readitem(&rb); if (rb.restype == acdb::kdxfxcoord) { m_startpoint = aspnt3d(rb.resval.rpoint); } else { pfiler->pushbackitem(); pfiler->seterror(acad::einvaliddxfcode, "nerror: expected group code %d", acdb::kdxfxcoord); return pfiler->filerstatus(); } pfiler->readitem(&rb); if (rb.restype == acdb::kdxfxcoord + 1) { m_entpoint = aspnt3d(rb.resval.rpoint); } else { pfiler->pushbackitem(); pfiler->seterror(acad::einvaliddxfcode, "nerror: expected group code %d", acdb::kdxfxcoord + 1); return pfiler->filerstatus(); } // todo: here you can file datamembers not // created by the objectarx add-in. return pfiler->filerstatus(); } acad::errorstatus dingteclass::dxfoutfields(acdbdxffiler* pfiler) const { assertreadenabled(); acad::errorstatus es; if ((es = acdbcurve::dxfoutfields(pfiler)) != acad::eok) return es; // write subclass marker. pfiler->writeitem(acdb::kdxfsubclass, "dingteclass"); // write version number. pfiler->writeitem(acdb::kdxfint16, (adesk::uint16) version_dingteclass); pfiler->writeitem(acdb::kdxfxcoord, m_startpoint); pfiler->writeitem(acdb::kdxfxcoord + 1, m_entpoint); // todo: here you can file datamembers not // created by the objectarx add-in. return es; } |
所有的时间均为北京时间。 现在的时间是 11:54 PM. |