先建立一个头文件HEAD.H定义如下的结构:VERTEX, SEQUENCE和类CVertex, Csequence。 typedef struct { float x,y,z; }VERTEX; 结构VERTEX用来存储点的坐标
typedef struct { int a,b,c; }SEQUENCE; 结构SEQUENCE用来存储实体的面的组成
typedef struct { char obName[20]; 定义结构myVertex来存储实体的名字,点的坐标以及面的组成, CObArray Vertex; 其中,点的坐标和面的组成是由聚合类CObArray定义的对象来 CObArray Sequence; 在存储的,我们可以把VERTEX结构和SEQUENCE结构加入到 }myVertex; 这两个对象中保存
class CVertex : public CObject { 因为CObArray类的对象中只能加入由CObject派生的对象,所以 protected: 我们还需要建立一个由CObject类派生的CVertex类。在CVertex类 CVertex(); 中有一个VERTEX结构的变量:m_vertex,信息实际上是存储在这 DECLARE_DYNCREATE(CVertex) 个变量中的。 virtual ~CVertex();
// Attributes public: 我们还需要建立一个由CObject类派生的CVertex类。在CVertex类 CVertex(VERTEX& ver); 中有一个VERTEX结构的变量:m_vertex,信息实际上是存储在这个变量中的,函数CVertex(VERTEX& ver)把VERTEX结构的变量 VERTEX m_vertex; 存入CObArray对象中。
};
class CSequence : public CObject { 这也是一个由CObject类派生的类,作用和刚才CVertex类一样, protected: 只不过Csequence类是用来存储实体中面的组成(点序)的。 CSequence(); DECLARE_DYNCREATE(CSequence) virtual ~CSequence();
public: CSequence(SEQUENCE& sequ); SEQUENCE m_sequence; };
声明好结构与类后,我们还需要建立一个.CPP文件,来定义几个函数。 IMPLEMENT_DYNCREATE(CVertex,CObject) CVertex::CVertex() { }
CVertex::~CVertex() 构造函数和销毁函数都是空的 { }
CVertex::CVertex(VERTEX& ver) { 这个函数的作用是:把一个VERTEX结构的数据存入变量m_vertex中 m_vertex = ver; 它是这个类中最重要的一环。 }
IMPLEMENT_DYNCREATE(CSequence,CObject) CSequence::CSequence() { } Csequence类的定义与CVertex类的定义差不多,只是其中的参数 m_sequence的类型和CVertex类中的参数my_vertex的类型不一样 CSequence::~CSequence() { }
CSequence::CSequence(SEQUENCE& sequ) { m_sequence=sequ; }
然后用结构myVertex(如前所定义)定义一个指针*myData,目的在于根据模型中实体的多少来给指针分配合适的内存,使之成为结构数组。 定义一个函数,用于确定模型中有多少个实体,函数的返回值就是实体的个数。 int CJupiterView::getObjectNumber() { char str1[10],str2[10]; char name[]="theFirst"; int num;
num=0;
FILE* fp; fp=fopen("data.dxf","r"); 打开DXF文件,data.dxf while(! feof(fp) && ! ferror(fp)) 这个函数是根据实体的名字来判断实体的个数的 { 所以函数只读取实体的名字,一旦出现新的实体名字, fscanf(fp,"%s\n",str1); 实体数就加一。 if(strcmp(str1,"VERTEX")==0) { fscanf(fp,"%s\n",str2); 打开DXF文件,data.dxf fscanf(fp,"%s\n",str2) ;这个函数是根据实体的名字来判断实体的个数的 if(strcmp(name,str2) != 0) 所以函数只读取实体的名字,一旦出现新的实体名字, {实体数就加一。 strcpy(name,str2); num++; } } } fclose(fp);
return num; }
以下是读取实体点的坐标以及点序的程序代码,在这个程序中,读取了模型中点的坐标的最大值与最小值、实体的名字、点的坐标,以及点序。 void CJupiterView::OnFileInput() { // TODO: Add your command handler code here FILE* fp,*fp2; int i,k,j; float tempX,tempY,tempZ;
float xMin,yMin,zMin,xMax,yMax,zMax,Max; int lab; char str1[20],str2[20],str[20],HT; char myName[20]; int myNumber; VERTEX tempVertex; SEQUENCE tempSequence;
typedef struct { float x,y,z,max; }MAX;
MAX max; HT=9;
objectNumber=getObjectNumber(); myData=new myVertex[objectNumber];
fp=fopen(FileName,"r");
i=0; j=0; k=0;
myNumber=-1; strcpy(myName,"ObjectName");
(编辑:aniston)
|