welcome to my mini revit
project name: mini revit
project role: main developer
project technique: vs 2005 ,c/c++,c#,MFC
project introduction: this is a design tool to help designers to build the mode of buildings . it has 2D building models ,3D view ,
undo redo ,add-on tools and journals .
project core code:
class ElementManager {
public:
ElementManager();
~ElementManager();
void Init(CAutodeskFinalProjectMiniRevitDoc *pDoc);
// an external event happens, keep this module informed.
int next_operation(COperation & operation);
// undo/redo this operation
int undo_redo_operation(COperation & operation);
// auxiliary methods for undo_redo_operation(..)
int undo_operation(COperation & op);
int redo_operation(COperation & op);
int execute_operation(COperation & op);
// methods for traverse
CElement * get_first(void);
bool has_next(void);
CElement * get_next(void);
// get an Element via its id
CElement * get_Element_via_ID(int elementID);
// get "child" element of a specified element
list <CElement *> get_child_elements(int elementID);
CElement *FindHitElement(CPoint &pt);
bool PickShow(CPoint pt, CPoint& ptBack);
public:
// remove from the list, but not delete the element from memory,
// return ptr to the element
CElement * remove_from(int elementID);
void add_new_elem_ref(CElement * elem_ptr);
// clear all the elements
void clear_list(void);
CAutodeskFinalProjectMiniRevitDoc *m_pDoc;
list<CElement *> elements;
list<CElement *> all_elements;
list<CElement *>::const_iterator iter;
ElementID id_factory;
COperationCollection * undo_redo_manager;
};
class ElementManager;
// base class for all elements
class CElement {
public:
static CDC *pDrawDC;
static ElementManager *pElementManager;
int elementID; // not private, for faster access
CPoint lastPt;
TypeID typeID;
CElement() { };
CElement(int id_, TypeID typeID);
virtual ~CElement() { }
virtual bool is_hit(CPoint pt) {return false;};
virtual void draw2D(void) {};
virtual void changeColor(int nFlags){};
virtual void biaoZhu(bool bRemove){};
virtual int PtInTextRect(CPoint pt){return false;};
virtual void Modify(int nLength,int nFlags,CElement *pParentElement=NULL){};
virtual bool PickMe(CPoint pt,CPoint &ptBack){return false;}
};
class CLine:public CElement
{
public:
COLORREF color;
CPoint startPt,endPt;
CRect textRect;
CRect arcRect;
public:
CLine(const CLine & line);
CLine(CPoint startPt_,CPoint endPt_,COLORREF &s,int id_);
void SetPos(CPoint startPt_,CPoint endPt_)
{
startPt=startPt_;
endPt=endPt_;
}
virtual bool is_hit(CPoint pt);////if the line is selected
virtual void draw2D(); ///show it in the 2D view
virtual void changeColor(int nFlags);///nFlags
virtual void biaoZhu(bool bRemove);//show the biaozhu
void SetColor(COLORREF &s);
virtual int PtInTextRect(CPoint pt);
virtual void Modify(int length,int nFlags,CElement *pParentElement=NULL);
bool PickMe(CPoint pt,CPoint &ptBack);
int IfXiFu(){
if(IsEqual(startPt.x,endPt.x))
{
endPt.x=startPt.x;
return 1;
}
if(IsEqual(startPt.y,endPt.y))
{
endPt.y=startPt.y;
return 2;
}
return -1;
}
};
class CCircle : public CElement {
public:
CPoint center;
double radius;
CCircle(const CCircle & cir_)
: center(cir_.center), radius(cir_.radius),
CElement(cir_.elementID, cir_.typeID /* CIRCLE */) { }
CCircle(CPoint centerPt_, double radius_, int id_)
: center(centerPt_), radius(radius_), CElement(id_, CIRCLE) { }
};
class CRectangle : public CElement {
public:
CPoint startPt, endPt;
CRectangle(const CRectangle & rect_)
: startPt(rect_.startPt), endPt(rect_.endPt),
CElement(rect_.elementID, rect_.typeID /* RECTANGLE */) { }
CRectangle(CPoint startPt_, CPoint endPt_, int id_)
: startPt(startPt_), endPt(endPt_),
CElement(id_, RECTANGLE) { }
};
class CWall : public CElement {
public:
CWall(const CWall & wall_);
CWall(CPoint startPt_, CPoint endPt_,int id_);
void SetPos(CPoint startPt_,CPoint endPt_)
{
startPt=startPt_;
endPt=endPt_;
}
virtual bool is_hit(CPoint pt) ;
virtual void draw2D(void) ;
virtual void changeColor(int nFlags);
virtual void biaoZhu(bool bRemove);
virtual int PtInTextRect(CPoint pt);
virtual void Modify(int length,int nFlags,CElement *pParentElement=NULL);
bool PickMe(CPoint pt,CPoint &ptBack);
int IfXiFu(){
if(IsEqual(startPt.x,endPt.x))
{
endPt.x=startPt.x;
return 1;
}
if(IsEqual(startPt.y,endPt.y))
{
endPt.y=startPt.y;
return 2;
}
return -1;
}
public:
static CString typeName;
CPoint startPt, endPt;
double dHeight, dThickness;
Vec2 direction;
CRect lengthRect,arcRect;
};
class CDoor : public CElement {
public:
CDoor(); // empty ctor
CDoor(const CDoor & door_);
CDoor(CPoint & pt_, int id_, int hostID_);
void SetPt(CPoint pt_);
void SetParentID(int nID){
hostID=nID;
}
virtual bool is_hit(CPoint pt) ;
virtual void draw2D(void) ;
virtual void changeColor(int nFlags);
virtual void biaoZhu(bool bRemove);
virtual int PtInTextRect(CPoint pt);
virtual void Modify(int length,int nFlags,CElement *pParentElement=NULL);
double LengthToWallStartPt();
double GetWallLength();
static CString typeName;
int hostID;
DPoint middlePt;
double dWidth, dHeight;
double relativePos;
Vec2 direction;
CRect textLeftRect,textRightRect;
};
class CWindow : public CElement {
public:
CWindow(int id_)
: CElement(id_, WINDOW) { } // empty ctor
CWindow(const CWindow& wnd_);
CWindow(CPoint & pt_, int id_, int hostID_);
void SetPt(CPoint pt_);
virtual bool is_hit(CPoint pt) ;
virtual void draw2D(void);
virtual void changeColor(int nFlags);
virtual void biaoZhu(bool bRemove);
virtual int PtInTextRect(CPoint pt);
virtual void Modify(int length,int nFlags,CElement *pParentElement=NULL);
double LengthToWallStartPt();
double GetWallLength();
static CString typeName;
int hostID;
DPoint middlePt;
double dWidth, dHeight,dLength;
double dDistanceToLevel;
double relativePos;
Vec2 direction;
CRect textLeftRect,textRightRect;
};
class CFurniture : public CElement {
public:
CFurniture(componentProperty cp,CPoint pt_, int id_)
: CElement(id_, COMPONENT) {
furnitureName=cp.furnitureName;
width=cp.nWidth;
length=cp.nLength;
width3D=cp.width3D;
length3D=cp.length3D;
height3D=cp.height3D;
direction.x=0;
direction.y=1;
pt=pt_;
for(int i=0;i<4;i++)
{
mat_ambient[i]=cp.mat_ambient[i];
mat_diffuse[i]=cp.mat_diffuse[i];
mat_specular[i]=cp.mat_specular[i];
}
mat_shininess[0]=cp.mat_shininess[0];
}
virtual bool is_hit(CPoint pt_);
virtual void draw2D(void);
virtual void Modify(int nLength,int nFlags,CElement *pParentElement=NULL);
virtual void biaoZhu(bool bRemove);
virtual int PtInTextRect(CPoint pt);
virtual void changeColor(int nFlags);
void Rotate();
void SetPt(CPoint pt_)
{
pt=pt_;
}
string furnitureName;
int width,length;
float width3D,length3D,height3D;
DPoint direction;
CPoint pt;
float mat_ambient[4];
float mat_diffuse[4];
float mat_specular[4];
float mat_shininess[1];
};