PlotterHMI/datafile/dxf/dxflib/ReadAutoCAD.h
huahaiyan 9f74511e69 20240315
1、增加数据分割功能(完成)
2、更换dxf库(进行中)
2024-03-15 16:49:50 +08:00

486 lines
12 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#if !defined (READAUTCAD_H)
#define READAUTCAD_H
#pragma once
#include "PDSMath/StdAfx.h"
#include <iostream>
//#include <afxtempl.h>
#include "GroupCode.h"
/////////////////////////////////Start: CDimension/////////////////////////////////////////
//标注组码, 目前只识别一种标注
class CDimension : public CGroupCode
{
public:
int m_iType; // -1 = 初始化值
// 0 = 转角标注、水平标注或垂直标注
// 1 = 对齐标注
// 2 = 角度标注
// 3 = 直径标注
// 4 = 半径标注
// 5 = 角度三点标注
// 6 = 坐标标注
// 32 = 标注信息在给定的块中
CString m_strBlockName;
CPointData m_ptLU; //文字显示的位置
//标注的显示位置坐标
CPointData m_ptPoint0;
CPointData m_ptPoint1;
CPointData m_ptPoint2;
CPointData m_ptPoint3;
CPointData m_ptPoint4;
CPointData m_ptPoint5;
CPointData m_ptPoint6;
BOOL m_bNoString; //=true 表示标注没有字符串,字符串需要根据计算得到; false 标注字符串为m_strDimension
CString m_strDimension; //用户明确地输入了标注文字(可选,缺省值为测量结果) 如果为空或"<>",以文字方式标注测量结果; 如果为 " "(一个空格),禁止输出文字
public:
CDimension(void);
CDimension(CDimension& a);
~CDimension(void);
BOOL operator==(CDimension& a);
void operator=(CDimension& a);
void Initial(void);
//处理读入的数据
//返回值:
// true 数据可用 =false数据不可用
BOOL DisPoseReadData();
//处理字符串
//说明:
//将读入的字符串"{\fSimSun|b0|i0|c134|p2;线性}",处理为"线性"
void DisPoseText(CString &strString);
//标注设置偏移
//输入参数:
//dOffsetX/dOffsetY 偏移量
//dSin/dCos 旋转角度, 旋转点为CPoint(0,0), 水平为零度
//dScaleX/dScaleY 放大缩小 20220408 XQ
//说明:
// 偏移->旋转->放大缩小
void SetRotateOffset(double dOffsetX, double dOffsetY, double dSin, double dCos, double dScaleX, double dScaleY);
//将标注转成字符串信息
//输出参数:
// TextData 字符串信息
void TransText(CTextData &TextData);
};
class CDimensionList : public CList<CDimension,CDimension&>
{
public:
CDimensionList& operator=(CDimensionList& rhs); // 赋值
//获取指定索引值上的项
//输入参数:
// iIndex 索引值,从0开始,不可越界
//返回值:
CDimension& operator[](int iIndex);
//标注位置偏移
//输入参数:
//dOffsetX/dOffsetY 偏移量
//dSin/dCos 旋转角度, 旋转点为CPoint(0,0), 水平为零度
//dScaleX/dScaleY 放大缩小 20220408 XQ
//说明:
// 偏移->旋转->放大缩小
void SetRotateOffset(double dOffsetX, double dOffsetY, double dSin, double dCos, double dScaleX, double dScaleY);
//将标注转成字符串
void TransText(CTextDataList &listTextData);
};
//////////////////////////////////End: CDimension////////////////////////////////////////
//////////////////////////////////Start: CSolidInfor////////////////////////////////////////
class CSolidInfor : public CGroupCode
{
public:
CCurveNotchInfor m_CurveInfor;
public:
CSolidInfor(void);
CSolidInfor(CSolidInfor& a);
~CSolidInfor(void);
void operator=(CSolidInfor& a);
void Initial(void);
//设置偏移
//输入参数:
//dOffsetX/dOffsetY 偏移量
//dSin/dCos 旋转角度, 旋转点为CPoint(0,0), 水平为零度
//dScaleX/dScaleY 放大缩小 20220408 XQ
//说明:
// 偏移->旋转->放大缩小
void SetRotateOffset(double dOffsetX, double dOffsetY, double dSin, double dCos, double dScaleX, double dScaleY);
//设置放大
//输入参数:
//dScale 放大缩小比例
//void SetScale(double dScale);
};
class CSolidInforList : public CList<CSolidInfor,CSolidInfor&>
{
public:
CSolidInforList& operator=(CSolidInforList& rhs); // 赋值
//获取指定索引值上的项
//输入参数:
// iIndex 索引值,从0开始,不可越界
//返回值:
CSolidInfor& operator[](int iIndex);
//标注位置偏移
//输入参数:
//dOffsetX/dOffsetY 偏移量
//dSin/dCos 旋转角度, 旋转点为CPoint(0,0), 水平为零度
//dScaleX/dScaleY 放大缩小 20220408 XQ
//说明:
// 偏移->旋转->放大缩小
void SetRotateOffset(double dOffsetX, double dOffsetY, double dSin, double dCos, double dScaleX, double dScaleY);
//得到链表中所有曲线
void GetCurveInforList(CCurveNotchInforList &listCurveInfor);
};
///////////////////////////////////End: CSolidInfor///////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//Auto CAD中块信息
class CAuBlockInfor : public CObject
{
public:
CString m_strBlockName; //为了记录BLOCK的块名(在组码2的后面)
CString m_strPatternName; //纸样名
CString m_strSizeName; //号型名
CStringArray m_arrMaterial; //布料名
CUIntArray m_arrQuantity; //总片布料份数 Quantity:<R,L>
//纸样名号型名两个变量是为了防止客户使用AutoCAD读ASTM/TIIP文件
CCurveNotchInforList m_listCurveInfo; //所有的线信息
CTextDataList m_listTextData; //记录标志符为TEXT/MTEXT的数据
CPointDataList m_listPointInfo; //所有点 记录POINT的数据
CDimensionList m_listDimension; //标注信息
CSolidInforList m_listSolidInfor; //实体信息, 标注中的三角形
CInsertDataList m_listInsertData_Block; //块中插入信息
//在m_listCurveInfo/m_listArcCircle/m_listEllispse中找出纸样块
CPatternBlockList m_listPatternBlock; //纸样块
public:
CAuBlockInfor(void);
CAuBlockInfor(CAuBlockInfor& a);
~CAuBlockInfor(void);
void operator=(CAuBlockInfor& a);
void Initial(void);
//位置偏移
//输入参数:
//dOffsetX/dOffsetY 偏移量
//dSin/dCos 旋转角度, 旋转点为CPoint(0,0), 水平为零度
//dScaleX/dScaleY 放大缩小 20220408 XQ
//说明:
// 偏移->旋转->放大缩小
void SetRotateOffset(double dOffsetX, double dOffsetY, double dSin, double dCos, double dScaleX, double dScaleY);
//判断该块是否为空块
//返回值:
// =true 是;=false不是
//说明:
// 空块是没有任何数据,即所有链表为空
BOOL IsEmptyBlock();
//得到纸样块信息存在在m_listPatternBlock中
void GetPatternBlock();
private:
//得到纸样块
//输入参数:
// listAllCurveInfor 所有曲线
// listTextData 所有文字
//输出参数:
// listPatternBlock 纸样块
void GetPatternBlock(CCurveNotchInforList &listAllCurveInfor, CTextDataList &listTextData, CPointDataList &listPointInfo, CPatternBlockList &listPatternBlock);
};
class CAuBlockInfoList : public CList<CAuBlockInfor,CAuBlockInfor&>
{
public:
CAuBlockInfoList& operator=(CAuBlockInfoList& rhs); // 赋值
//获取指定索引值上的项
//输入参数:
// iIndex 索引值,从0开始,不可越界
//返回值:
CAuBlockInfor& operator[](int iIndex);
//根据给定的块名找出对应的块
//[输入] strBlockName 块名
//[输出] BlockInfor 找到的块
//返回值:
// 找到块的位置, 没有找到返回NULL
POSITION FindBlockName(CString strBlockName, CAuBlockInfor &BlockInfor);
//标注位置偏移
//输入参数:
//dOffsetX/dOffsetY 偏移量
//dSin/dCos 旋转角度, 旋转点为CPoint(0,0), 水平为零度
//dScaleX/dScaleY 放大缩小 20220408 XQ
//说明:
// 偏移->旋转->放大缩小
void SetRotateOffset(double dOffsetX, double dOffsetY, double dSin, double dCos, double dScaleX, double dScaleY);
//删除空块(没有任何数据的块)
void DeleteEmptyBlock();
//得到纸样块
void GetPatternBlock();
};
//////////////////////////////////////////////////////////////////////////
//TABLE ->LTYPE
class CLTypeInfor : public CObject
{
public:
//说明: 由于AutoCAD文件中输出的类型都是通过代号表示的这里都使用字符串
CString m_strLTypeName; //线型名称
CString m_strDescribe; //描述
public:
CLTypeInfor(void);
CLTypeInfor(CLTypeInfor& a);
~CLTypeInfor(void);
void operator=(CLTypeInfor& a);
void Initial(void);
};
class CLTypeInforList : public CList<CLTypeInfor,CLTypeInfor&>
{
public:
CLTypeInforList& operator=(CLTypeInforList& rhs); // 赋值
//获取指定索引值上的项
//输入参数:
// iIndex 索引值,从0开始,不可越界
//返回值:
CLTypeInfor& operator[](int iIndex);
};
//////////////////////////////////////////////////////////////////////////
//TABLE ->LAYER
class CLayerInfor : public CObject
{
public:
//说明: 由于AutoCAD文件中输出的类型都是通过代号表示的这里都使用字符串
CString m_strLayerName; //图层名
int m_iStandard; //标准标志值
/*
m_iStandard 标准标志值(位编码值)
1 = 冻结图层,否则图层解冻
2 = 在新视口中缺省设置为冻结图层
4 = 锁定图层
*/
CString m_strColor; //颜色数
CString m_strLineType; //线型名
public:
CLayerInfor(void);
CLayerInfor(CLayerInfor& a);
~CLayerInfor(void);
void operator=(CLayerInfor& a);
void Initial(void);
};
class CLayerInforList : public CList<CLayerInfor,CLayerInfor&>
{
public:
CLayerInforList& operator=(CLayerInforList& rhs); // 赋值
//获取指定索引值上的项
//输入参数:
// iIndex 索引值,从0开始,不可越界
//返回值:
CLayerInfor& operator[](int iIndex);
//给定的层名对应颜色
//输入参数:
// strLayerName 层名
//返回值:
// 层名对应颜色;没有为空
CString FindColor(CString strLayerName);
};
//////////////////////////////////////////////////////////////////////////
class CAuTableInfor : public CObject
{
public:
//说明: 由于AutoCAD文件中输出的类型都是通过代号表示的所有这里都使用字符串
CLTypeInforList m_listLType; //标识符 LTYPE 整个文件所用线型
CLayerInforList m_listLayer; //标识符 LAYER 整个文件图层信息, Entities可以包含该列表中没有的图层信息
public:
CAuTableInfor(void);
CAuTableInfor(CAuTableInfor& a);
~CAuTableInfor(void);
void operator=(CAuTableInfor& a);
void Initial(void);
};
//////////////////////////////////////////////////////////////////////////
class CAutoCADFileInfo : public CObject
{
public:
CAuBlockInfoList m_listBlockInfor;
CAuBlockInfor m_EntitiesInfor;
//层信息
CAuTableInfor m_TableInfor; //层信息 TABLES
public:
CAutoCADFileInfo(void);
CAutoCADFileInfo(CAutoCADFileInfo& a);
~CAutoCADFileInfo(void);
void operator=(CAutoCADFileInfo& a);
void Initial(void);
//得到纸样块
//m_listBlockInfor/m_EntitiesInfor中信息转成CPatternBlockList
void GetPatternBlock();
//除去隐藏不用的BLOCK
void RemoveUnUseBlock();
};
/*
说明:
1.该类中不对坐标进行转换,只是将文件中的坐标按原样读入;
*/
class CReadAutoCAD: public CObject
{
public:
CAutoCADFileInfo m_FileInfo; //读入的所有文件内容
private:
FILE *m_pDXFFile; //文件指针
BOOL m_bReadWindowText; //=ture 读Window/Dos文本文件=false 读Unix/Linux下文本文件
CString m_strValue1, m_strValue2; //用于读组码和数据
BOOL m_bPattern; //=true要创建纸样=false 结构线
BOOL m_bReadSolid; //=true填充标识线=false 不读入
public:
CReadAutoCAD(void);
~CReadAutoCAD(void);
//读入文件
//输入参数:
// strFilePath 文件路径
// bPattern = true 读入纸样;=false 结构线
// bReadSolid = true读入填充标识线=false不读入 20210902 XQ
BOOL ReadAutoCADFile(CString strFilePath, BOOL bPattern, BOOL bReadSolid);
private:
//读组码
//[输入] fFile 文件
//[输出] strString1/strString2 连续两行数据
void ReadGroupString(FILE *fFile, CString &strString1, CString &strString2);
//读数据
// 返回值:
// =true 读数据成功;=false 读数据失败
//说明:
//读入数据存放在m_FileInfo
BOOL ReadFileData();
//读TABLE信息
// TableInfor读到的TABLE信息
// 返回值:
// =true 读数据成功;=false 读数据失败
//说明:
// 在函数中不能对TableInfor初始化
BOOL ReadTableData(CAuTableInfor &TableInfor);
//读标识符LAYER
BOOL ReadLayerData(CLayerInfor &LayerInfor);
//读标识符LTYPE
BOOL ReadLTypeData(CLTypeInfor &LTypeInfor);
//读BLOCK信息
// BlockInfor读到的BLOCK信息
// bReadBlock =true 读BLOCK=false读ENTITIES
// 返回值:
// =true 读数据成功;=false 读数据失败
BOOL ReadBlockData(CAuBlockInfor &BlockInfor, BOOL bReadBlock);
//读标识符ARC信息
BOOL ReadArcData(CCurveNotchInfor &ArcCircleData);
//读标识符CIRCLE信息
BOOL ReadCircleData(CCurveNotchInfor &ArcCircleData);
//读标识符ELLIPSE信息
BOOL ReadEllipseData(CCurveNotchInfor &EllipseData);
//读标识符LINE信息
BOOL ReadLineData(CCurveNotchInfor &CurveInfor);
//读标识符MLINE信息
BOOL ReadMLineData(CCurveNotchInfor &CurveInfor);
//读标识符POLYLINE信息
BOOL ReadPolylineData(CCurveNotchInfor &CurveInfor);
//读标识符LWPOLYLINE信息
BOOL ReadLWPolylineData(CCurveNotchInfor &CurveInfor);
//读标识符SPLINE信息
BOOL ReadSPLineData(CCurveNotchInfor &CurveInfor);
//读标识符TEXT信息
BOOL ReadTEXTData(CTextData &TextData);
//分析字符串是否为纸样名称或者号型名称
//[输入] strRef 参考字符串
//[输出] strName 名称 该值只有在返回值大于0时有效
//返回值:
// =0 不是任何名称
// =1 纸样名称
// =2 号型名称
// =3 布料名
// =4 布料份数
int NameSizeInfor(CString strRef, CString &strName);
//读标识符MTEXT信息
BOOL ReadMTEXTData(CTextData &TextData);
//读标识符POINT信息
BOOL ReadPointData(CPointData &PointData);
//读标识符DIMENSION信息
BOOL ReadDimensionData(CDimension &Dimension);
//读标识符SOLID信息
BOOL ReadSolidData(CSolidInfor &SolidInfor);
//读标识符INSERT信息
BOOL ReadInsertData(CInsertData &InsertData);
//计算SPline曲线
// pBlockInfor 需要计算SPline的块
void CalcuateSPlineCurve(CAuBlockInfor *pBlockInfor);
};
#endif