目录

  • 一、转换类
  • 二、数学计算类
  • 三、几何计算类
  • 四、字符串工具类
    • 4.1 类定义
    • 4.2 测试代码
  • 五、文件操作类
    • 5.1 类定义
    • 5.2 测试代码

一、转换类

  • 功能:显式转换不同数据类型
  • 筛选器Other中添加(第(三)篇文件结构为基础)
  • ConvertUtil.h
    #pragma once
    class ConvertUtil
    {public:ConvertUtil();~ConvertUtil();
    public:// 2d点转换为3d点static AcGePoint3d ToPoint3d(const AcGePoint2d& pt, double z = 0);// 3d点转换为2d点static AcGePoint2d ToPoint2d(const AcGePoint3d& pt);// 角度转弧度static double AngleToRadian(double angle);// 弧度转角度static double RadianToAngle(double rad);// 整型转字符串(需要支持MFC)static CString ToString(int val);// 点坐标系转换:世界坐标系wcs->显示坐标系dcsstatic AcGePoint3d WcsPointToDcsPoint(const AcGePoint3d &point);// 点坐标系转换:用户坐标系ucs->世界坐标系wcsstatic AcGePoint3d UcsPointToWcsPoint(const AcGePoint3d &point);// 点坐标系转换:世界坐标系wcs->用户坐标系ucsstatic AcGePoint3d WcsPointToUcsPoint(const AcGePoint3d &point);
    };
    
  • ConvertUtil.cpp
    #include "stdafx.h"
    #include "ConvertUtil.h"
    #include "MathUtil.h"ConvertUtil::ConvertUtil(){}
    ConvertUtil::~ConvertUtil(){}// 2d点转换为3d点
    AcGePoint3d ConvertUtil::ToPoint3d(const AcGePoint2d& pt, double z)
    {return AcGePoint3d(pt.x, pt.y, z);
    }// 3d点转换为2d点
    AcGePoint2d ConvertUtil::ToPoint2d(const AcGePoint3d& pt)
    {return AcGePoint2d(pt.x, pt.y);
    }// 角度转弧度
    double ConvertUtil::AngleToRadion(double angle)
    {return angle * MathUtil::PI() / 180;
    }// 弧度转角度
    double ConvertUtil::RadionToAngle(double rad)
    {return rad * 180 / MathUtil::PI();
    }// 整型转字符串(需要支持MFC)
    CString ConvertUtil::ToString(int val)
    {CString str;str.Format(_T("%d"), val);return str;
    }// 点坐标系转换:世界坐标系wcs->显示坐标系dcs
    AcGePoint3d ConvertUtil::WcsPointToDcsPoint(const AcGePoint3d &point)
    {AcGePoint3d pt;struct resbuf rbFrom, rbTo;rbFrom.restype = RTSHORT;rbFrom.resval.rint = 0;rbTo.restype = RTSHORT;rbTo.resval.rint = 2;// 坐标系转换函数:wcs坐标、wcs标识符(0)、dcs标识符(2)、类型为点(0)、dcs坐标acedTrans(asDblArray(point), &rbFrom, &rbTo, 0, asDblArray(pt));return pt;
    }// 点坐标系转换:用户坐标系ucs->世界坐标系wcs
    AcGePoint3d ConvertUtil::UcsPointToWcsPoint(const AcGePoint3d &point)
    {AcGePoint3d pt;struct resbuf rbFrom, rbTo;rbFrom.restype = RTSHORT;rbFrom.resval.rint = 1;rbTo.restype = RTSHORT;rbTo.resval.rint = 0;// 坐标系转换函数:ucs坐标、ucs标识符(1)、wcs标识符(0)、类型为点(0)、wcs坐标acedTrans(asDblArray(point), &rbFrom, &rbTo, 0, asDblArray(pt));return pt;
    }// 点坐标系转换:世界坐标系wcs->用户坐标系ucs
    AcGePoint3d ConvertUtil::WcsPointToUcsPoint(const AcGePoint3d &point)
    {AcGePoint3d pt;struct resbuf rbFrom, rbTo;rbFrom.restype = RTSHORT;rbFrom.resval.rint = 0;rbTo.restype = RTSHORT;rbTo.resval.rint = 1;// 坐标系转换函数:wcs坐标、ucs标识符(1)、wcs标识符(0)、类型为点(0)、ucs坐标acedTrans(asDblArray(point), &rbFrom, &rbTo, 0, asDblArray(pt));return pt;
    }
    

二、数学计算类

  • 功能:涉及到数学类的计算
  • Other筛选器中添加(第(三)篇文件结构为基础)
  • MathUtil.h
    #pragma once
    class MathUtil
    {public:MathUtil();~MathUtil();// 定义派值static double PI();// 判断两个双精度浮点数是否相等static bool IsEqual(double a, double b, double tol = 1.0E-7);
    };
    
  • MathUtil.cpp
    #include "stdafx.h"
    #include "MathUtil.h"MathUtil::MathUtil(){}
    MathUtil::~MathUtil(){}// 定义派值
    double MathUtil::PI()
    {   // 数学求派的精确方法return atan(1.0) * 4;
    }// 判断两个双精度浮点数是否相等,因为浮点数都是近似存储
    bool MathUtil::IsEqual(double a, double b, double tol /* = 1.0E-7 */)
    {   // 当两个浮点数的差小于10E-7,则判定两个浮点数相等return (fabs(a - b) < tol);
    }
    

三、几何计算类

  • Geometry筛选器中添加(第(三)篇文件结构为基础)
  • Geometry.h
    #pragma once
    class Geometry
    {public:Geometry();~Geometry();public:// 算两点中点:下面是2d点和3d点重载static AcGePoint2d GetMiddlePoint(const AcGePoint2d &startPt, const AcGePoint2d &endPt);static AcGePoint3d GetMiddlePoint(const AcGePoint3d &startPt, const AcGePoint3d &endPt);// 计算相对坐标:传入基准坐标pt、x偏移量、y偏移量static AcGePoint3d RelativePoint(const AcGePoint3d &pt, double x, double y);
    };
    
  • Geometry.cpp
    #include "stdafx.h"
    #include "Geometry.h"Geometry::Geometry(){}
    Geometry::~Geometry(){}AcGePoint2d Geometry::GetMiddlePoint(const AcGePoint2d &startPt, const AcGePoint2d &endPt)
    {   // 这是提取2d点的三个坐标值,为double类型double x = (startPt.x + endPt.x) *0.5;double y = (startPt.y + endPt.y) *0.5;return AcGePoint2d(x, y);
    }AcGePoint3d Geometry::GetMiddlePoint(const AcGePoint3d &startPt, const AcGePoint3d &endPt)
    {   // 这是提取3d点的三个坐标值,为double类型double x = (startPt.x + endPt.x) *0.5;double y = (startPt.y + endPt.y) *0.5;double z = (startPt.z + endPt.z) *0.5;return AcGePoint3d(x, y, z);
    }AcGePoint3d Geometry::RelativePoint(const AcGePoint3d &pt, double x, double y)
    {AcGePoint3d ptReturn(pt.x + x, pt.y + y, pt.z);return ptReturn;
    }
    

四、字符串工具类

4.1 类定义

  • Other筛选器中添加(第(三)篇文件结构为基础)
  • StringUtil.h
    #pragma once
    #include <vector>class StringUtil
    {public:StringUtil();~StringUtil();// 分割字符串:传入字符串、分割符、接收分割后的字符串容器、分隔符间允许包含空字符(默认)static void Split(const CString &text, const ACHAR *separator, std::vector<CString>&result, bool bAddEmptyStr = true);// 合并字符串:传入字符串容器、分隔符,返回合并的字符串static CString Join(const std::vector<CString> &items, const ACHAR *spearator);
    };
    
  • StringUtil.cpp
    #include "stdafx.h"
    #include "StringUtil.h"StringUtil::StringUtil(){}
    StringUtil::~StringUtil(){}// 分割字符串:传入字符串、分割符、接收分割后的字符串容器、是否允许包含空字符
    void StringUtil::Split(const CString &text, const ACHAR *separator, std::vector<CString>&result, bool bAddEmptyStr )
    {   // 前一个索引号、当前索引号int prev = 0, current = 0;// 将传入的字符串深拷贝一个副本CString strCopyTxt = text;// 删除字符串右侧的空字符strCopyTxt.TrimRight(_T(" "));// 如果没找到分隔符:未找到返回-1,Find见下注释if (strCopyTxt.Find(separator, 0) < 0){   // 如果传入的字符串有长度if (strCopyTxt.GetLength() > 0){   // 整个字符串就是唯一的分割字符串,添加进字符串容器result.push_back(strCopyTxt);}// 如果传入的字符串长度为0,啥也不添加return;}// 以下为至少发现一个分隔符// 获得字符串总长度int length = strCopyTxt.GetLength();bool bExit = false;// 开启无限循环:注意循环中的break语句while (true){  // prev为起始索引值,迭代的关键,Find见下注释current = strCopyTxt.Find(separator, prev);// 循环到最后一个待分割字符串,之后无分隔符if (current == -1){   // 将整个字符串长度赋值current,标识退出变量为真current = length;bExit = true;}// 取最后一个分隔符到结尾的字符串,Mid见下注释CString item = strCopyTxt.Mid(prev, current - prev);// 添加进容器的条件:每个提取的子字符串是否过滤0长度if (bAddEmptyStr || item.GetLength() > 0)  result.push_back(item);//  判断退出条件if (bExit) break;// 更新Find函数的起始索引值,要包含分隔符,否则如 1,,2 会成死循环CString sep = separator;prev = current + sep.GetLength();}
    }// 合并字符串:传入字符串容器、分隔符,返回合并的字符串
    CString StringUtil::Join(const std::vector<CString> &items, const ACHAR *spearator)
    {CString strResult;// 逐个拼接容器中的字符串for (int i = 0; i < items.size(); i++){  strResult += items.at(i) + spearator;}// 删除右侧的空字符strResult.TrimRight(spearator);// 返回拼接好的字符串return strResult;
    }
    

4.2 测试代码

  • Commands.h

    #include "StdAfx.h"void AddCommands();
    void Seperate();
    void Unit();
    
  • Commands.cpp
    #include "StdAfx.h"
    #include "Commands.h"
    #include "Editor.h"
    #include "StringUtil.h"void AddCommands()
    {   // 分割字符串Editor::AddCommand(L"Seperate", ACRX_CMD_MODAL, Seperate);// 合并字符串Editor::AddCommand(L"unit", ACRX_CMD_MODAL, Unit);}
    void Seperate()
    {std::vector<CString> lines;ACHAR line[128];ACHAR separator[10];if (acedGetString(NULL, _T("\n请输入待分割内容:"), line) != RTNORM){return;}if (acedGetString(NULL, _T("\n请输入分隔符:"), separator) == RTNORM){CString str = line;StringUtil::Split(str, separator, lines);}for (int i = 0; i < lines.size(); i++){acutPrintf(lines.at(i));acutPrintf(_T("\n"));}acutPrintf(_T("%d"), lines.size());
    }void Unit()
    {std::vector<CString> lines;ACHAR line[128];while (acedGetString(NULL, _T("\n请输入待组合内容:"), line)== RTNORM){CString temp = line;if (temp == _T("exit")) break;lines.push_back(line);}CString unitline = StringUtil::Join(lines, _T(","));acutPrintf(unitline);
    }
    

五、文件操作类

5.1 类定义

  • IO筛选器中添加(第(三)篇文件结构为基础)
  • TextFileUtil.h
    #pragma once
    #include <vector>
    class TextFileUtil
    {public:TextFileUtil();~TextFileUtil();// 覆盖式存到文件:文件名(绝对路径)、接收CString字符串容器static void ToFile(const ACHAR *fileName, const std::vector<CString>&lines);// 从文件读取:文件名(绝对路径)、输出CString字符串容器static bool FromFile(const ACHAR *fileName, std::vector<CString>&lines);// 通过对话框选择获取文件绝对路径(多选)static bool SelectFilePath(CStringArray & fileNameArray);
    };
    
  • TextFileUtil.cpp
    #include "stdafx.h"
    #include "TextFileUtil.h"TextFileUtil::TextFileUtil(){}
    TextFileUtil::~TextFileUtil(){}// 覆盖式存到文件:文件名(绝对路径)、接收CString字符串容器
    void TextFileUtil::ToFile(const ACHAR *fileName, const std::vector<CString>&lines)
    {   // 以下是支持MFC才有的,相当于open函数功能CStdioFile file(fileName, CFile::modeCreate | CFile::modeWrite | CFile::typeText);// 逐个读取容器中的字符串,并在每个字符串后面加换行符for (int i = 0; i < lines.size(); i++){file.WriteString(lines.at(i));file.WriteString(_T("\n"));}file.Close();
    }// 从文件读取:文件名(绝对路径)、输出CString字符串容器
    bool TextFileUtil::FromFile(const ACHAR *fileName, std::vector<CString>&lines)
    {   // 纠错函数:如果文件不存在打印if (PathFileExists(fileName) != TRUE){acutPrintf(_T("\n文件不存在!"));return false;}else{ // 首先格式化容器lines.clear();// 以读的方式打开文件CStdioFile file(fileName, CFile::modeRead | CFile::typeText);CString strLine;// 只要读取成功,就循环读每一行while (file.ReadString(strLine)){  // 将每一行添加到CString字符串容器lines.push_back(strLine);}return true;}
    }// 通过对话框选择获取文件绝对路径(多选):一些MFC语句,了解即可,重点看注释语句
    bool TextFileUtil::SelectFilePath(CStringArray & fileNameArray)
    {   // 构建文件过滤器CNavFilter *filter;// 过滤的注释LPCTSTR filterDesc[] = { _T("可选文件格式"), NULL };// 过滤的后缀名:可以在null前增加后缀LPCTSTR filterDWG[] = { _T("*.dwg"),_T("*.dxf"), NULL };LPCTSTR *filterSpec[] = { filterDWG, NULL };CNavFilterArray gFilterArray;gFilterArray.RemoveAllData();int i = 0, j;while (filterSpec[i] != NULL){filter = gFilterArray.AddData();if (filter != NULL){filter->SetDescription(filterDesc[i]);j = 0;while (filterSpec[i][j] != NULL){filter->Add(filterSpec[i][j]);j++;}}i++;}fileNameArray.RemoveAll();CNavDataArray gDataArray;while (true){    // 获取autoCAD的窗口句柄HWND acadhandle = adsw_acadMainWnd();// 使句柄成为当前窗口::EnableWindow(acadhandle, true);// 设置焦点::SetFocus(acadhandle);// 获取MFC的主窗口CWnd *pWnd = CWnd::FromHandle(acadhandle);   CAcUiNavDialog dlg(gDataArray, gFilterArray, 0, pWnd);// 开启多选模式dlg.SetMultiSelectAllowed(true);// 对话框标题dlg.SetDialogCaption(_T("多选对话框"));// 设置当前点选的文件可见缩略图dlg.SetPreviewPresent(true);dlg.SetPreviewVisible(true);// 如果点选了确认按钮if (dlg.DoModal() == IDOK){for (int i = 0; i < gDataArray.GetCount(); i++){LPITEMIDLIST id = gDataArray.GetAt(i)->GetID();// 获取并打印:每个选择到的 文件绝对路径 的 字符串fileNameArray.Add(gDataArray.GetAt(i)->GetText());}}// 跳出循环break;}if (fileNameArray.GetCount() > 0)return true;elsereturn false;
    }
    

5.2 测试代码

  • Commands.h

    #include "StdAfx.h"void AddCommands();
    void ToFile();
    void FromFile();
    void SelectFile();
    
  • Commands.cpp
    #include "StdAfx.h"
    #include "Commands.h"
    #include "Editor.h"
    #include "TextFileUtil.h"void AddCommands()
    {   // 输出到桌面文件Editor::AddCommand(L"tofile", ACRX_CMD_MODAL, ToFile);// 从桌面文件输入Editor::AddCommand(L"fromfile", ACRX_CMD_MODAL, FromFile);// 打印选择文件路径Editor::AddCommand(L"showpath", ACRX_CMD_MODAL, SelectFile);}
    void ToFile()
    {std::vector<CString> lines;ACHAR line[128];while (acedGetString(NULL, _T("\n请输入行内容:"), line) == RTNORM){CString str = line;lines.push_back(str);}TextFileUtil::ToFile(_T("C:\\Users\\Administrator\\Desktop\\test.txt"), lines);
    }void FromFile()
    {std::vector<CString> lines;// 包含纠错函数:打开失败情况TextFileUtil::FromFile(_T("C:\\Users\\Administrator\\Desktop\\test.txt"), lines);for (int i = 0; i < lines.size() ; i++){acutPrintf(lines.at(i));acutPrintf(_T("\n"));}
    }void SelectFile()
    {CStringArray fileNamePath;bool isseletct = TextFileUtil::SelectFilePath(fileNamePath);if (!isseletct){return;}// 遍历cstringArray每一项for (int i = 0; i < fileNamePath.GetCount(); i++){    // Cstring定位和打印方法CString filepath = fileNamePath.GetAt(i);acutPrintf(_T("\n文件路径为:%s"), filepath);}
    }
    
  • showpath命令效果


传送门 返回 列表

objectArx --- 工具类相关推荐

  1. java日期转化工具类

    package com.rest.ful.utils;import java.text.DateFormat; import java.text.ParseException; import java ...

  2. java数据类型相互转换工具类

    package com.rest.ful.utils;import java.util.ArrayList; import java.util.HashMap; import java.util.Li ...

  3. 客快物流大数据项目(五十六): 编写SparkSession对象工具类

    编写SparkSession对象工具类 后续业务开发过程中,每个子业务(kudu.es.clickhouse等等)都会创建SparkSession对象,以及初始化开发环境,因此将环境初始化操作封装成工 ...

  4. [JAVA EE] Thymeleaf 常用工具类

    Thymeleaf 提供了丰富的表达式工具类,例如: #strings:字符串工具类 #dates:时间操作和时间格式化 #numbers:格式化数字对象的方法 #bools:常用的布尔方法 #str ...

  5. httpclient工具类,post请求发送json字符串参数,中文乱码处理

    在使用httpclient发送post请求的时候,接收端中文乱码问题解决. 正文: 我们都知道,一般情况下使用post请求是不会出现中文乱码的.可是在使用httpclient发送post请求报文含中文 ...

  6. spring boot 文件上传工具类(bug 已修改)

    以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...

  7. SharePreference工具类

    安卓开发一般都需要进行数据缓存,常用操作老司机已为你封装完毕,经常有小伙伴问怎么判断缓存是否可用,那我告诉你,你可以用这份工具进行存储和查询,具体可以查看源码,现在为你开车,Demo传送门. 站点 S ...

  8. java录排名怎么写_面试官:Java排名靠前的工具类你都用过哪些?

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 推荐:https://www.xttblog.com/?p=5158 在Java ...

  9. 【转】 Android快速开发系列 10个常用工具类 -- 不错

    原文网址:http://blog.csdn.net/lmj623565791/article/details/38965311 转载请标明出处:http://blog.csdn.net/lmj6235 ...

最新文章

  1. Bootstrap-下拉菜单
  2. ui与html界面区别,ui前端和web前端的区别是什么?
  3. .NET Framework总结二
  4. tsc - error TS2304 Cannot find name 'Set'/'Promise'
  5. 架构解密从分布式到微服务:微服务架构到底是什么?
  6. mysql的binlog意义_带你解析MySQL binlog
  7. 安装ubuntu出现BUG soft lockup的解决方法(16.04 14.04)
  8. c mysql dll_PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰
  9. python实现动态壁纸_如何实现一个 windows 桌面动态壁纸
  10. python凹多边形分割_Unity 凹多边形三角剖分
  11. 某度起诉“文库下载神器”,索赔300万
  12. 支付宝显示服务器网关错误,支付宝服务窗网关问题
  13. 【转载】BAPI_GOODSMVT_CREATE FUNCITON FOR MIGO 各种移动类型 源代码参考
  14. 计算机刚启动时的背景怎样改,通达信启动界面图片怎么改,怎么修改系统登陆时候欢迎界面的背景图片?...
  15. dpdk-16.04 扩展新网卡驱动过程
  16. 一种基于知识图谱的新闻推荐模型
  17. 11月14号作业:定义一个学生信息结构体
  18. REPAIR TABLE导致死锁
  19. Python使用ffmpeg下载m3u8高清视频
  20. html 地球页面代码,纯CSS3实现地球自转实现代码(图文教程附送源码)

热门文章

  1. 小学教育怎么选择特别容易写的论文选题?
  2. Modelsim的使用方法
  3. Scrapy爬取P2P新闻入门教程
  4. HTTP Referer介绍和使用
  5. 2021-2027全球与中国触控板市场现状及未来发展趋势
  6. 基于STM32F103C8T6与ESP8266的物联网智能温度采集与蓝牙OLED数字钟的设计与实现
  7. 加入域时提示“不能访问网络位置” 域
  8. 2021高考成绩内蒙查询,2021内蒙古高考成绩查询入口
  9. Vue+element通过接口上传图片给后端
  10. 电脑其实很好玩,玩好了其实很无耻