高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】[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;
}
|