zoukankan      html  css  js  c++  java
  • 按照excel文档中的内容在当前cad图纸中自动排布实体

    本例实现的主要功能是读取excel文档中的内容,其次是将按照读取的信息在当前cad图纸中添加相应的实体。下面先介绍实现代码:

        CString excelPath; //外部excel文档的地址
        UpdateData();//将对话框中的数据复制给变量
        if (m_excelPath == _T(""))
        { 
            MessageBox(_T("地址不能为空,请选择Excel文档!"));
            return;
        }
        else
        {
            excelPath = m_excelPath;//m_excelPath是与地址对话框绑定的变量
        }
    
        //设置基点,作为自动排布的所有实体的基点
        AcGePoint3d ptBase;
        ptBase.x = m_pointX;
        ptBase.y = m_pointY;
        ptBase.z = m_pointZ;
        
        //打开指定的Excel文档
        CoInitialize(NULL);//初始化
        if (!m_excel.pApp.CreateDispatch(_T("Excel.Application")))
        {
            MessageBox(_T("创建Excel服务失败!"));
            exit(1);
        }
        m_excel.pApp.put_Visible(FALSE);
        m_excel.pBooks.AttachDispatch(m_excel.pApp.get_Workbooks(), true);
        m_excel.pBook.AttachDispatch(m_excel.pBooks.Open(excelPath, vtMissing, vtMissing, vtMissing,
            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
            vtMissing, vtMissing, vtMissing));
        m_excel.pSheets.AttachDispatch(m_excel.pBook.get_Worksheets(), true);
        m_excel.pSheet.AttachDispatch(m_excel.pSheets.get_Item(_variant_t("sheet1")), true);
        m_excel.pRange.AttachDispatch(m_excel.pSheet.get_Cells(), true);
    
        //获得Excel文档中已经使用的行数和列数
        m_excel.pRange = m_excel.pSheet.get_UsedRange();//获得列数
        m_excel.pRange = m_excel.pRange.get_Columns(); 
        int colNum = m_excel.pRange.get_Count();
    
        m_excel.pRange = m_excel.pSheet.get_UsedRange();//获得行数
        m_excel.pRange = m_excel.pRange.get_Rows();
        int RowNum = m_excel.pRange.get_Count();
    
        //读取Excel中指定单元的数据
        for (int i = 2; i <= RowNum; i++)
        {
            CString ptX = m_excel.GetCString(4, i);
            CString ptY = m_excel.GetCString(5, i);
            CString ptZ = m_excel.GetCString(6, i);
            CString rad = m_excel.GetCString(7, i);
            
            //按照excel文档中的数据转化成中心点
            AcGePoint3d ptExcel;
            ptExcel = strToDouble(ptX, ptY, ptZ);//将字符串型数据转换成双精度型,其中strToDouble()函数是自己所写,这里就不另外给出
            double raduis ;
            raduis = strToDouble(rad);//将字符串型rad转换成双精度型
    
            //根据Excel中的图形类型,在模型空间添加相应的实体
            CString grapfType = m_excel.GetCString(2,i);
            if (grapfType == _T(""))
            {
                //根据选择的基点设定圆的中心点
                AcGePoint3d ptCenter;
                ptCenter.x = ptExcel.x + ptBase.x;
                ptCenter.y = ptExcel.y + ptBase.y;
                ptCenter.z = ptExcel.z + ptBase.z;
                AcGeVector3d vec(0,0,1);
                //定义实体圆
                AcDbCircle *pCir = new AcDbCircle(ptCenter, vec, raduis);
                PostToModelSpace(pCir);
            }
            if (grapfType == _T("直线"))
            {
                CString endPointX = m_excel.GetCString(8, i);
                CString endPointY = m_excel.GetCString(9, i);
                CString endPointZ = m_excel.GetCString(10, i);
                AcGePoint3d ptMid = strToDouble(endPointX, endPointY, endPointZ);
                //按照选择的基点设置起点和终点
                AcGePoint3d startPoint;//起点
                startPoint.x = ptExcel.x + ptBase.x;
                startPoint.y = ptExcel.y + ptBase.y;
                startPoint.z = ptExcel.z + ptBase.z;
                AcGePoint3d endPoint;//终点
                endPoint.x = ptMid.x + ptBase.x;
                endPoint.y = ptMid.y + ptBase.y;
                endPoint.z = ptMid.z + ptBase.z;
    
                //将直线添加到模型空间
                AcDbLine *pLine = new AcDbLine(startPoint, endPoint);
                PostToModelSpace(pLine);
            }
        }
        //完成所有操作后一定要清除掉excel文档相关的内容
        m_excel.pRange.ReleaseDispatch();
        m_excel.pSheet.ReleaseDispatch();
        m_excel.pSheets.ReleaseDispatch();
        m_excel.pBook.ReleaseDispatch();
        m_excel.pBooks.ReleaseDispatch();
        m_excel.pApp.Quit();
        m_excel.pApp.ReleaseDispatch();    

    这里只是一个简单的例子,对于excel文档的读取基本操作都有涉及到。

  • 相关阅读:
    Leetcode
    287. Find the Duplicate Number hard
    House Robber III leetcode 动态规划
    将一个数组分成奇数部分和偶数部分,并分别排好序 CVTE
    First Missing Positive && missing number
    permutation II (boss出来了)
    46. Permutations 回溯算法
    字符串分割 函数实现
    Combination Sum II Combinations
    用双缓存技术优化listview异步加载网络图片
  • 原文地址:https://www.cnblogs.com/pengjun-shanghai/p/4897920.html
Copyright © 2011-2022 走看看