Click here to Skip to main content
15,896,453 members
Articles / Desktop Programming / MFC

SolidGraph CAD System

Rate me:
Please Sign up or sign in to vote.
4.97/5 (78 votes)
12 Sep 20062 min read 376.1K   29.8K   209  
A SolidGraph CAD system source code.
#ifndef  __sg3D__
#define  __sg3D__

/************************************************************************/
/* 3DObject                                                                */
/************************************************************************/
typedef struct
{
  unsigned short begin_vertex_index;
  unsigned short end_vertex_index;
  unsigned short edge_type;
}  SG_EDGE;

typedef struct 
{
	long   ver_indexes[3];
} SG_INDEX_TRIANGLE;

/* edge_type:*/
#define  SG_EDGE_1_LEVEL          0x0001
#define  SG_EDGE_2_LEVEL          0x0002
#define  SG_EDGE_3_LEVEL          0x0004

typedef enum
{
  SG_UNKNOWN_3D=0,
  SG_BODY,
  SG_SURFACE,
} SG_3DOBJECT_TYPE;

typedef enum
{
	SG_VERTEX_TRIANGULATION,
	SG_DELAUNAY_TRIANGULATION
} SG_TRIANGULATION_TYPE;

typedef struct
{
  int                nTr;
  SG_POINT*          allVertex;
  SG_VECTOR*         allNormals;
  double*            allUV;
} SG_ALL_TRIANGLES;

typedef  enum
{
  SG_MODULATE_MIX_TYPE=1,
  SG_BLEND_MIX_TYPE   =2,
  SG_REPLACE_MIX_TYPE =3
} SG_MIX_COLOR_TYPE;

typedef  enum
{
  SG_CUBE_UV_TYPE      =1,
  SG_SPHERIC_UV_TYPE   =2,
  SG_CYLINDER_UV_TYPE  =3
} SG_UV_TYPE;

typedef  struct
{
  int       MaterialIndex;
  double    TextureScaleU;
  double    TextureScaleV;
  double    TextureShiftU;
  double    TextureShiftV;
  double    TextureAngle;
  bool      TextureSmooth;
  bool      TextureMult;
  SG_MIX_COLOR_TYPE MixColorType;
  SG_UV_TYPE        TextureUVType;
} SG_MATERIAL;

class sgC3DObject;
class sgCBRep;

/************************************************************************/
/* Boundary representation piece                                        */
/************************************************************************/
class sgCore_API   sgCBRepPiece
{
	friend class  sgCBRep;
	PRIVATE_ACCESS
private:
	void*         m_brep_piece_handle;

	SG_POINT*     m_vertexes;
	unsigned int  m_vertexes_count;

	SG_EDGE*      m_edges;
	unsigned int  m_edges_count;

	SG_POINT      m_min;
	SG_POINT      m_max;

	int           m_min_triangle_number;
	int           m_max_triangle_number;
	
	sgCBRepPiece();
	~sgCBRepPiece();
public:
	void             GetLocalGabarits(SG_POINT& p_min, SG_POINT& p_max) const;

	const SG_POINT*  GetVertexes() const;
	unsigned int     GetVertexesCount() const;

	const SG_EDGE*   GetEdges() const;
	unsigned int     GetEdgesCount() const;

	void             GetTrianglesRange(int& min_numb, int& max_numb) const;
};

/************************************************************************/
/* Boundary representation                                              */
/************************************************************************/
class sgCore_API   sgCBRep
{
	friend class sgC3DObject;
	PRIVATE_ACCESS
private:
    sgCBRep();
	~sgCBRep();

	sgCBRepPiece**         m_pieces;
	unsigned int           m_pieces_count;
public:
	sgCBRepPiece*          GetPiece(unsigned int) const;
	unsigned int           GetPiecesCount() const;
};

/************************************************************************/
/* 3D object base class                                                 */
/************************************************************************/
class sgCore_API   sgC3DObject : public sgCObject
{
protected:
  sgC3DObject();
  sgC3DObject(SG_OBJ_HANDLE);

  virtual    ~sgC3DObject();

public:
  static     void         AutoTriangulate(bool,SG_TRIANGULATION_TYPE);

  bool                    Triangulate(SG_TRIANGULATION_TYPE);

  SG_3DOBJECT_TYPE        Get3DObjectType() const;

  sgCBRep*                GetBRep()  const;
  const SG_ALL_TRIANGLES* GetTriangles() const;

  virtual  bool           ApplyTempMatrix();
  const double*           GetWorldMatrixData() const;

  void                    SetMaterial(const SG_MATERIAL&);
  const  SG_MATERIAL*     GetMaterial();
  bool                    CalculateOptimalUV(double& optU, double& optV);

  double                  GetVolume();
  double                  GetSquare();

private:
  SG_3DOBJECT_TYPE    m_objectType;
  sgCBRep*            m_brep;
  bool                CopyBRepStructure();
  SG_ALL_TRIANGLES*   m_triangles;
  void                CalcUV();
  sgCMatrix*          m_world_matrix;
  SG_MATERIAL*        m_material;

  PRIVATE_ACCESS
};



/************************************************************************/
/* Box                                                                  */
/************************************************************************/

typedef struct
{
  double  SizeX;
  double  SizeY;
  double  SizeZ;
} SG_BOX;

class sgCore_API   sgCBox : public sgC3DObject
{
private:
  sgCBox();
  sgCBox(SG_OBJ_HANDLE);
  virtual    ~sgCBox();

public:
  static   sgCBox*    Create(double sizeX, double sizeY, double sizeZ);
  void                GetGeometry(SG_BOX& ) const;
  PRIVATE_ACCESS
};
#define  sgCreateBox  sgCBox::Create



/************************************************************************/
/* Sphere                                                                 */
/************************************************************************/

typedef struct
{
  double  Radius;
  short   MeridiansCount;
  short   ParallelsCount;
} SG_SPHERE;

class sgCore_API   sgCSphere : public sgC3DObject
{
private:
  sgCSphere();
  sgCSphere(SG_OBJ_HANDLE);
  virtual    ~sgCSphere();

public:
  static   sgCSphere*    Create(double rad, short merid, short parall);
  void                   GetGeometry(SG_SPHERE&) const;
  PRIVATE_ACCESS
};
#define  sgCreateSphere  sgCSphere::Create



/************************************************************************/
/* Cylinder                                                                 */
/************************************************************************/

typedef struct
{
  double  Radius;
  double  Height;
  short   MeridiansCount;
} SG_CYLINDER;

class sgCore_API   sgCCylinder : public sgC3DObject
{
private:
  sgCCylinder();
  sgCCylinder(SG_OBJ_HANDLE);
  virtual    ~sgCCylinder();

public:

  static   sgCCylinder*    Create(double rad, double heig, short merid);
  void           GetGeometry(SG_CYLINDER&) const;
  PRIVATE_ACCESS
};
#define  sgCreateCylinder  sgCCylinder::Create




/************************************************************************/
/* Cone                                                                 */
/************************************************************************/

typedef struct
{
  double  Radius1;
  double  Radius2;
  double  Height;
  short   MeridiansCount;
} SG_CONE;

class sgCore_API   sgCCone : public sgC3DObject
{
private:
  sgCCone();
  sgCCone(SG_OBJ_HANDLE);
  virtual    ~sgCCone();

public:
  static   sgCCone*    Create(double rad_1,double rad_2,double heig, short merid);
  void         GetGeometry(SG_CONE&) const;
  PRIVATE_ACCESS
};
#define  sgCreateCone  sgCCone::Create

/************************************************************************/
/* Torus                                                                 */
/************************************************************************/

typedef struct
{
  double  Radius1;
  double  Radius2;
  short   MeridiansCount1;
  short   MeridiansCount2;
} SG_TORUS;

class sgCore_API   sgCTorus : public sgC3DObject
{
private:
  sgCTorus();
  sgCTorus(SG_OBJ_HANDLE);
  virtual    ~sgCTorus();

public:

  static   sgCTorus*    Create(double r1,double r2,short m1,short m2);
  void          GetGeometry(SG_TORUS&) const;
  PRIVATE_ACCESS
};
#define  sgCreateTorus  sgCTorus::Create

/************************************************************************/
/* Ellipsoid                                                                 */
/************************************************************************/

typedef struct
{
  double  Radius1;
  double  Radius2;
  double  Radius3;
  short   MeridiansCount;
  short   ParallelsCount;
} SG_ELLIPSOID;

class sgCore_API   sgCEllipsoid : public sgC3DObject
{
private:
  sgCEllipsoid();
  sgCEllipsoid(SG_OBJ_HANDLE);
  virtual    ~sgCEllipsoid();

public:

  static   sgCEllipsoid*    Create(double radius1, double radius2, double radius3,
                    short merid_cnt, short parall_cnt);
  void            GetGeometry(SG_ELLIPSOID&) const;
  PRIVATE_ACCESS
};
#define  sgCreateEllipsoid  sgCEllipsoid::Create

/************************************************************************/
/* SphericBand                                                                 */
/************************************************************************/

typedef struct
{
  double  Radius;
  double  BeginCoef;
  double  EndCoef;
  short   MeridiansCount;
} SG_SPHERIC_BAND;

class sgCore_API   sgCSphericBand : public sgC3DObject
{
private:
  sgCSphericBand();
  sgCSphericBand(SG_OBJ_HANDLE);
  virtual    ~sgCSphericBand();

public:
  static   sgCSphericBand*    Create(double radius, double beg_koef,
                      double end_koef,
                      short merid_cnt);
  void              GetGeometry(SG_SPHERIC_BAND&) const;

  PRIVATE_ACCESS
};
#define  sgCreateSphericBand    sgCSphericBand::Create


#endif

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions