|
本人刚在学习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;
} |
|