486 lines
12 KiB
C++
486 lines
12 KiB
C++
#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 <ypeInfor);
|
||
|
||
//读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
|
||
|