C++ 读取的dxf文件并用OpenCV绘制出来

正文开始,C++注释很详细,只写了识别块的单层嵌套,只要了解一些DXF文件格式,就可以根据这个例子修改,可以读出线、圆、等等,直接贴源码
 

稍后会把整个工程上传,里面包含测试文件等等

//读线,包括块中的线
void DXFRead::ReadLine(CADDATA &data)
{  
      
    FILE* fp = fopen(FILENAME, "r");  
    if (!fp)  
    {  
        cout << "读取" << FILENAME << "失败,任意键退出" << endl;  
        getchar();  
	        exit(0);  
	    }  
	    else  
	    {  
	        cout << "打开" << FILENAME << "成功,正在读取LINE..." << endl;  
	    }  
	    while (!feof(fp) && !ferror(fp))  
	    {  
	        fscanf(fp, "%s", &str);  
	        //扫描块中线  
	        if (strcmp(str, "BLOCK") == 0)  
	        {  
	            fscanf(fp, "%s", &str);  
	            while (strcmp(str, "2") != 0)  
	            {  
	                fscanf(fp, "%s", &str);  
	            }  
	            //获得块名字  
	            fscanf(fp, "%s", &name);  
	            //如果不是这两个块,做记录  
	            if (strcmp(name,"$MODEL_SPACE") != 0   
	                && strcmp(name, "$PAPER_SPACE") != 0)  
	            {  
	                while (strcmp(str, "ENDBLK") != 0)  
	                {  
	                    fscanf(fp, "%s", &str);  
	                    //扫描块中线  
	                    if (strcmp(str, "LINE") == 0)  
	                    {  
	                        //归属块  
	                        strcpy(tempLine.name, name);  
	                        //x1  
	                        while (strcmp(str, "10") != 0)  
	                        {  
	                            fscanf(fp, "%s", &str);  
	                        }  
	                        fscanf(fp, "%s", &str);  
	                        tempLine.x1 = atof(str);  
	   
	                        //y1  
	                        while (strcmp(str, "20") != 0)  
	                        {  
	                            fscanf(fp, "%s", &str);  
	                        }  
	                        fscanf(fp, "%s", &str);  
	                        tempLine.y1 = atof(str);  
	   
	                        //z1  
	                        while (strcmp(str, "30") != 0)  
	                        {  
	                            fscanf(fp, "%s", &str);  
	                        }  
	                        fscanf(fp, "%s", &str);  
	                        tempLine.z1 = atof(str);  
	   
	                        //x2  
	                        while (strcmp(str, "11") != 0)  
	                        {  
	                            fscanf(fp, "%s", &str);  
	                        }  
	                        fscanf(fp, "%s", &str);  
	                        tempLine.x2 = atof(str);  
	   
	                        //y2  
	                        while (strcmp(str, "21") != 0)  
	                        {  
	                            fscanf(fp, "%s", &str);  
	                        }  
	                        fscanf(fp, "%s", &str);  
	                        tempLine.y2 = atof(str);  
	   
	                        //z2  
	                        while (strcmp(str, "31") != 0)  
	                        {  
	                            fscanf(fp, "%s", &str);  
	                        }  
	                        fscanf(fp, "%s", &str);  
	                        tempLine.z2 = atof(str);  
	   
	                        data.LINE.Add(new LINEPoint(tempLine));  
	                    }  
	                }  
	            }  
	              
	        }  
	        //扫描主坐标系线  
	        else if (strcmp(str, "LINE") == 0)  
	        {  
	            //归属块  
	            strcpy(tempLine.name, "ReferenceBlock");  
	            //x1  
	            while (strcmp(str, "10") != 0)  
	            {  
	                fscanf(fp, "%s", &str);  
	            }  
	            fscanf(fp, "%s", &str);  
	            tempLine.x1 = atof(str);  
	   
	            //y1  
	            while (strcmp(str, "20") != 0)  
	            {  
	                fscanf(fp, "%s", &str);  
	            }  
	            fscanf(fp, "%s", &str);  
	            tempLine.y1 = atof(str);  
	   
	            //z1  
	            while (strcmp(str, "30") != 0)  
	            {  
	                fscanf(fp, "%s", &str);  
	            }  
	            fscanf(fp, "%s", &str);  
	            tempLine.z1 = atof(str);  
	   
	            //x2  
	            while (strcmp(str, "11") != 0)  
	            {  
	                fscanf(fp, "%s", &str);  
	            }  
	            fscanf(fp, "%s", &str);  
	            tempLine.x2 = atof(str);  
	   
	            //y2  
	            while (strcmp(str, "21") != 0)  
	            {  
	                fscanf(fp, "%s", &str);  
	            }  
	            fscanf(fp, "%s", &str);  
	            tempLine.y2 = atof(str);  
	   
	            //z2  
	            while (strcmp(str, "31") != 0)  
	            {  
	                fscanf(fp, "%s", &str);  
	            }  
	            fscanf(fp, "%s", &str);  
	            tempLine.z2 = atof(str);  
	   
	            data.LINE.Add(new LINEPoint(tempLine));  
	        }  
	    }  
	cout << "LINE读取完毕..." << endl;  
	fclose(fp);  
}


 

2、读块的插入信息

void DXFRead::ReadInsert(CADDATA &data)
{  
    FILE* fp = fopen(FILENAME, "r");  
    fp = fopen(FILENAME, "r");  
    if (!fp)  
    {  
        cout << "读取" << FILENAME << "失败,任意键退出" << endl;  
        getchar();  
        exit(0);  
    }  
    else  
    {  
        cout << "打开" << FILENAME << "成功,正在读取BLOCK插入信息..." << endl;  
    }  
    while (!feof(fp) && !ferror(fp))  
    {  
        fscanf(fp, "%s", &str);  
        if (strcmp(str, "INSERT") == 0)  
        {  
            //读取插入块名字  
            while (strcmp(str, "2") != 0)  
            {  
                fscanf(fp, "%s", &str);  
            }  
            fscanf(fp, "%s", &str);  
            strcpy(tempBlock.name, str);  
   
            //基点坐标  
            //rx  
            while (strcmp(str, "10") != 0)  
            {  
                fscanf(fp, "%s", &str);  
            }  
            fscanf(fp, "%s", &str);  
            tempBlock.rx = atof(str);  
   
            //ry  
            while (strcmp(str, "20") != 0)  
            {  
                fscanf(fp, "%s", &str);  
            }  
            fscanf(fp, "%s", &str);  
            tempBlock.ry = atof(str);  
   
            //rz  
            while (strcmp(str, "30") != 0)  
            {  
                fscanf(fp, "%s", &str);  
            }  
            fscanf(fp, "%s", &str);  
            tempBlock.rz = atof(str);  
   
            //读取比例因子  
            //cx  
            while (strcmp(str, "41") != 0)  
            {  
                fscanf(fp, "%s", &str);  
            }  
            fscanf(fp, "%s", &str);  
            tempBlock.cx = atof(str);  
   
            //cy  
            while (strcmp(str, "42") != 0)  
            {  
                fscanf(fp, "%s", &str);  
            }  
            fscanf(fp, "%s", &str);  
            tempBlock.cy = atof(str);  
   
            //cz  
            while (strcmp(str, "43") != 0)  
            {  
                fscanf(fp, "%s", &str);  
            }  
            fscanf(fp, "%s", &str);  
            tempBlock.cz = atof(str);  
   
            data.BLOCK.Add(new BLOCKPoint(tempBlock));  
        }  
    }  
    cout << "BLOCK插入信息读取完毕..." << endl;  
    fclose(fp);  
}

3、绘图 

void DXFRead::DrawImage(CADDATA &data)
{  
    LINEPoint* linep = NULL;  
    BLOCKPoint* blockp = NULL;  
    uchar* Img = NULL;  
    cout << "开始绘图..." << endl;  
   
    //创建图像,深度为8,3通道RGB图像   
    cvImg = cvCreateImage(cvSize(15000, 15000), 8, 3);   
    Img = (uchar*) cvImg->imageData;  
   
    int step = cvImg->widthStep / sizeof(uchar);  
    int channels = cvImg->nChannels;  
    //清空图像  
    for (int i = 0; i<cvImg->height; i++)  
        for (int j = 0; j<cvImg->width; j++) {  
            Img[i * step + j * channels + 0] = 0;  
            Img[i * step + j * channels + 1] = 0;  
            Img[i * step + j * channels + 2] = 0;  
        }  
    for (int i = 0; i<data.LINE.GetCount(); i++)  
    {  
        linep = (LINEPoint*) data.LINE.GetAt(i);  
        //如果是正常线  
        if (strcmp(linep->m_line.name, "ReferenceBlock") == 0 )  
        {  
            cvLine(cvImg,
                cvPoint(20 * ((linep->m_line.x1) + 300), 20 * ((linep->m_line.y1) + 300)),  
                cvPoint(20 * ((linep->m_line.x2) + 300), 20 * ((linep->m_line.y2) + 300)),  
                CV_RGB(0, 255, 0), 4);  
        }  
        else  
        {  
            for (int j = 0; j<data.BLOCK.GetCount(); j++)  
            {  
                //获取线归属块信息  
                blockp = (BLOCKPoint*) data.BLOCK.GetAt(j);  
                if (strcmp(linep->m_line.name, blockp->m_block.name) == 0)  
                {  
                    cvLine(cvImg,
                        cvPoint(20 * ((blockp->m_block.cx) * (linep->m_line.x1) + blockp->m_block.rx + 300), 20 * ((blockp->m_block.cy) * (linep->m_line.y1) + blockp->m_block.ry + 300  )  ),  
                        cvPoint(20 * ((blockp->m_block.cx) * (linep->m_line.x2) + blockp->m_block.rx + 300), 20 * ((blockp->m_block.cy) * (linep->m_line.y2) + blockp->m_block.ry + 300  )  ),  
                        CV_RGB(0, 255, 0), 4);  
                }  
            }  
        }  
          
    }  
    cvSaveImage(SAVENAME, cvImg);  
    //释放图像所占的内存  
    cvReleaseImage(&cvImg);   
}

 

  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值