|
发表于 2006-3-2 19:59:00
|
显示全部楼层
我试过了,这个可以。是转载别处的代码
//而且目前所有的参考书上对AcEdJig类的使用都是以拖动一个椭圆为例(作者都互相抄袭)
//因此我就想,把要生成的系列图形定义成一个自定义实体,不就可以使用AcEdJig了吗!
class CMARectWindow : public AcDbEntity
{
public:
ACRX_DECLARE_MEMBERS(CMARectWindow);
CMARectWindow();
virtual ~CMARectWindow();
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const;
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler);
virtual Adesk::Boolean worldDraw(AcGiWorldDraw* mode);
//设置插入基点
Acad::ErrorStatus setStartPt(const AcGePoint3d startPt);
//取得插入基点
AcGePoint3d startPt();
private:
//成员变量,图形插入基点
AcGePoint3d m_startPt;
};
///////////////CMARectWindow 类实现文件//////////////////
ACRX_DXF_DEFINE_MEMBERS(CMARectWindow, AcDbEntity,
AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
AcDbProxyEntity::kNoOperation,
CMAWINDO_INFO, PGL_02);
CMARectWindow::CMARectWindow()
{
m_startPt.set(0.0, 0.0, 0.0);
}
CMARectWindow::~CMARectWindow()
{
// TODO: clean up.
}
Adesk::Boolean CMARectWindow::worldDraw(AcGiWorldDraw* mode)
{
assertReadEnabled();
AcGePoint3d pt; //插入点
AcGePoint3d pt1, pt2, pt3, pt4; //四个角点
AcGeVector3d vec;
AcGeVector3d normal(0.0, 0.0, 1.0);
//
pt = startPt();
//
vec.set(0, 50, 0);
pt1 = pt - vec;
pt4 = pt + vec;
vec.set(60, 0, 0);
pt2 = pt1 + vec;
pt3 = pt4 + vec;
AcGePoint3d pLineArray[5];
pLineArray[0] = pt1;
pLineArray[1] = pt2;
pLineArray[2] = pt3;
pLineArray[3] = pt4;
pLineArray[4] = pt1;
//设置颜色为红色
mode->subEntityTraits().setColor(1);
//绘制矩形
mode->geometry().polyline(5, pLineArray);
//绘制圆
mode->geometry().circle(pt, 30.0, normal);
return AcDbEntity::worldDraw(mode);
}
Acad::ErrorStatus CMARectWindow::dwgInFields(AcDbDwgFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es;
if ((es = AcDbEntity::dwgInFields(pFiler)) != Acad::eOk)
{
return es;
}
pFiler->readItem(&m_startPt);
return pFiler->filerStatus();
}
Acad::ErrorStatus CMARectWindow::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es;
if ((es = AcDbEntity::dwgOutFields(pFiler)) != Acad::eOk)
{
return es;
}
pFiler->writeItem(m_startPt);
return pFiler->filerStatus();
}
AcGePoint3d CMARectWindow::startPt()
{
assertReadEnabled();
return m_startPt;
}
Acad::ErrorStatus CMARectWindow::setStartPt(const AcGePoint3d startPt)
{
assertWriteEnabled();
m_startPt = startPt;
return Acad::eOk;
}
/////////////////////////////////////////////
/////////////////////////////////////////////
/////////////////////////////////////////////
////////////拖动函数/////////////////////////
class pglyxqLine : public AcEdJig
{
public:
pglyxqLine();
void doIt();
virtual DragStatus sampler();
virtual Adesk::Boolean update();
virtual AcDbEntity* entity() const;
private:
CMARectWindow *pRectWindow;
AcGePoint3d ptm, movePt;
};
///////////////构造函数//////////////////////////////////////
pglyxqLine::pglyxqLine()
{
//
//
}
///////////////拖动图形/////////////////////////////////////
void
pglyxqLine::doIt()
{
pRectWindow = new CMARectWindow;
if(!pRectWindow)
{
acutPrintf("****CMARectWindow对象不存在****");
return;
}
setDispPrompt("\n指定位置: ");
AcEdJig:ragStatus stat = drag();
append();
}
//////////////捕获定点设备并作出分析////////////////////////
AcEdJig:ragStatus
pglyxqLine::sampler()
{
DragStatus stat;
static AcGePoint3d tempPoint;
stat = acquirePoint(movePt);
if (tempPoint != movePt)
tempPoint = movePt;
else if (stat == AcEdJig::kNormal)
return AcEdJig::kNoChange;
return stat;
}
/////////更新数据///////并更新类成员变量的值/////////////////
Adesk::Boolean
pglyxqLine::update()
{
ptm = movePt;
pRectWindow->setStartPt(ptm);
return Adesk::kTrue;
}
//////////////////更新实体///////////////////////////////////
AcDbEntity*
pglyxqLine::entity() const
{
return pRectWindow;
}
////////////命令执行函数//////////////////////////////////////////////
void
create_tuxing()
{
//初始化一个拖动派生类实体
pglyxqLine *pJig = new pglyxqLine();
//拖动实体
pJig->doIt();
delete pJig;
}
void
initApp()
{
acedRegCmds->addCommand("PGL_YXQ", "PGLYXQ", "PGLYXQ", ACRX_CMD_MODAL, create_tuxing);
//自定义类初始化函数
CMARectWindow::rxInit();
acrxBuildClassHierarchy();
}
void
unloadApp()
{
acedRegCmds->removeGroup("PGL_YXQ");
deleteAcRxClass(CMARectWindow::desc());
}
extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
switch (msg)
{
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(appId);
acrxDynamicLinker->registerAppMDIAware(appId);
initApp();
break;
case AcRx::kUnloadAppMsg:
unloadApp();
}
return AcRx::kRetOK;
}
|
|