#ifndef __SKETCH_H #define __SKETCH_H class hGroup; class hRequest; class hEntity; class hParam; class hPoint; class Entity; class Param; class Point; // All of the hWhatever handles are a 32-bit ID, that is used to represent // some data structure in the sketch. class hGroup { public: // bits 10: 0 -- group index DWORD v; }; class hRequest { public: // bits 10: 0 -- request index DWORD v; }; class hEntity { public: // bits 10: 0 -- entity index // 21:11 -- request index DWORD v; }; class hParam { public: // bits 7: 0 -- param index // 18: 8 -- entity index // 29:19 -- request index DWORD v; }; class hPoint { // bits 7: 0 -- point index // 18: 8 -- entity index // 29:19 -- request index public: DWORD v; }; // A set of requests. Every request must have an associated group. A group // may have an associated 2-d coordinate system, in which cases lines or // curves that belong to the group are automatically constrained into that // plane; otherwise they are free in 3-space. class Group { public: static const hGroup HGROUP_REFERENCES; hGroup h; hEntity csys; // or Entity::NO_CSYS, if it's not locked in a 2d csys NameStr name; char *DescriptionString(void); }; // A user request for some primitive or derived operation; for example a // line, or a class Request { public: // Some predefined requests, that are present in every sketch. static const hRequest HREQUEST_REFERENCE_XY; static const hRequest HREQUEST_REFERENCE_YZ; static const hRequest HREQUEST_REFERENCE_ZX; // Types of requests static const int CSYS_2D = 0; static const int LINE_SEGMENT = 1; int type; hRequest h; hGroup group; NameStr name; inline hEntity entity(int i) { hEntity r; r.v = ((this->h.v) << 11) | i; return r; } void AddParam(IdList *param, Entity *e, int index); void Generate(IdList *entity, IdList *point, IdList *param); char *DescriptionString(void); }; class Entity { public: static const hEntity NO_CSYS; static const int CSYS_2D = 100; static const int LINE_SEGMENT = 101; int type; hEntity h; bool visible; Expr *expr[16]; inline hRequest request(void) { hRequest r; r.v = (this->h.v >> 11); return r; } inline hParam param(int i) { hParam r; r.v = ((this->h.v) << 8) | i; return r; } inline hPoint point(int i) { hPoint r; r.v = ((this->h.v) << 8) | i; return r; } struct { bool drawing; Point2d mp; double dmin; } dogd; // state for drawing or getting distance (for hit testing) void LineDrawOrGetDistance(Vector a, Vector b); void DrawOrGetDistance(void); void Draw(void); double GetDistance(Point2d mp); }; class Param { public: hParam h; double val; bool known; void ForceTo(double v); }; class Point { public: // The point ID is equal to the initial param ID. hPoint h; int type; static const int IN_FREE_SPACE = 0; // three params, x y z static const int IN_2D_CSYS = 1; // two params, u v, plus csys static const int BY_EXPR = 2; // three Expr *, could be anything hEntity csys; bool visible; inline hEntity entity(void) { hEntity r; r.v = (h.v >> 8); return r; } inline hParam param(int i) { hParam r; r.v = h.v + i; return r; } // The point, in base coordinates. This may be a single parameter, or // it may be a more complex expression if our point is locked in a // 2d csys. void GetExprs(Expr **x, Expr **y, Expr **z); Vector GetCoords(void); void ForceTo(Vector v); void Draw(void); double GetDistance(Point2d mp); }; #endif