Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

287 lines
13 KiB
C++

#if !defined(__KTCADUTILITY_H__)
#define __KTCADUTILITY_H__
// Description:
// 类CKTCadUtility用于提供ObjectARX的有关AutoCAD的所有常用的操作函数, 作为
// AutoCAD的函数库使用.
// Company: Kingtouch Software Corporation. Copyright 2002-2005
// Author: WangYongguang
// Date: 2002.05.01
#ifdef EARTHWORM_EXPORT
#define DLLIMPEXP __declspec(dllexport)
#else
#define DLLIMPEXP __declspec(dllimport)
#endif
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class DLLIMPEXP CKTCadUtility
{
public:
static BOOL HighLightEntity(AcDbObjectId idObj, BOOL bHighLight,AcApDocument* pDoc);
static BOOL CanHighLight(AcDbObjectId idObj);
static AcDbObjectId Initlayer(const TCHAR *szLayer, Adesk::UInt16 nCr = 256 ,AcDbDatabase *pDb = NULL);
static AcDbObjectId InitTextStyle(const TCHAR *pszStyle, AcDbDatabase *pDb = NULL);
// 取得系统变量值
static BOOL GetSystemVar(LPCTSTR pszVarName, short& iVal);
static BOOL GetSystemVar(LPCTSTR pszVarName, int& iVal);
static BOOL GetSystemVar(LPCTSTR pszVarName, long& lVal);
static BOOL GetSystemVar(LPCTSTR pszVarName, double& dVal);
static BOOL GetSystemVar(LPCTSTR pszVarName, CString& sVal);
static BOOL GetSystemVar(LPCTSTR pszVarName, ads_point ptVal);
// 设置系统变量值
static BOOL SetSystemVar(LPCTSTR pszVarName, short iVal);
static BOOL SetSystemVar(LPCTSTR pszVarName, int iVal);
static BOOL SetSystemVar(LPCTSTR pszVarName, long lVal);
static BOOL SetSystemVar(LPCTSTR pszVarName, double dVal);
static BOOL SetSystemVar(LPCTSTR pszVarName, LPCTSTR pszVal);
static BOOL SetSystemVar(LPCTSTR pszVarName, ads_point ptVal);
// 加入块表记录
static Acad::ErrorStatus AddToBlockTableRecord(AcDbEntity* pEnt, // 实体对象
LPCTSTR pszBlock = NULL, // 块名, 默认为模型空间
AcDbDatabase* pDb = NULL); // 数据库名, 默认为当前数据库
// 加入块表记录
static Acad::ErrorStatus AddToBlockTableRecord(AcDbObjectId& idEnt, // 返回对象ID
AcDbEntity* pEnt, // 实体对象
LPCTSTR pszBlock = NULL, // 块名, 默认为模型空间
AcDbDatabase* pDb = NULL); // 数据库名, 默认为当前数据库
static Acad::ErrorStatus AddToCurrentSpace(AcDbEntity* pEnt);
static Acad::ErrorStatus AddToCurrentSpace(AcDbEntity* pEnt, AcDbObjectId& idEnt);
// 在相同Database中,拷贝实体, 仅适合简单实体, 且复制对象没有加入数据库
static Acad::ErrorStatus CloneObject(AcDbObject*& pObjDest, const AcDbObject* pObjSrc);
// 在相同Database中,拷贝实体, 仅适合加入数据库的实体, pObjDest必须传入NULL
static Acad::ErrorStatus DeepCloneObject(AcDbObject*& pObjDest, // 返回目标对象
AcDbObject* pObjSrc, // 被拷贝对象
AcDbObjectId idOwner = AcDbObjectId::kNull);// 目标对象的属主
// 创建一个块,如果块名为NULL则为无名块
static AcDbObjectId CreateBlockTableRecord(AcDbVoidPtrArray& arpEnt,// 原实体
const AcGePoint3d& ptOrigin,// 块表记录原点
LPCTSTR pszBlk = NULL, // 块名, 默认为无名块
AcDbDatabase* pDb = NULL, // 数据库名, 默认为当前数据库
BOOL bDeleteSrc = TRUE); // 是否删除原对象(对在数据库中的)
static AcDbObjectId CreateBlockTableRecord(AcDbObjectIdArray& arid, // 原实体
const AcGePoint3d& ptOrigin,// 块表记录原点
LPCTSTR pszBlk = NULL, // 块名, 默认为无名块
AcDbDatabase* pDb = NULL, // 数据库名, 默认为当前数据库
BOOL bDeleteSrc = TRUE); // 是否删除原对象
static AcDbObjectId CreateBlockTableRecord(AcDbObjectIdArray& arid, // 原实体
const AcGePoint3d& ptOrigin,// 块表记录原点
LPCTSTR pszBlk = NULL, // 块名, 默认为无名块
LPCTSTR pszComments = NULL, //备注
AcDbDatabase* pDb = NULL, // 数据库名, 默认为当前数据库
BOOL bDeleteSrc = TRUE); // 是否删除原对象
// 创建一个组,如果组名为NULL则为无名组
static AcDbObjectId CreateAcDbGroup(const AcDbObjectIdArray& arid, // 原实体
LPCTSTR pszGroup = NULL, // 块名, 默认为无名组
bool bSelectable = true); // 是否可以选择
static bool AddEntToGroup(AcDbObjectId& id2, AcDbObjectId& idGroup);
// 获得对象所在的所有组
static int GetItemGroups(const AcDbObjectId& idObj, AcDbObjectIdArray& aridGroups);
// 获得组中含的所有对象
static int GetGroupItems(const AcDbObjectId& idGroup, AcDbObjectIdArray& aridObjs);
// 自动区分动态库类型,并加载它(arx, dll)
static HINSTANCE LoadApplication(CString sPathName); // 文件全路径
// 自动区分动态库类型,并卸载它
static BOOL UnloadApplication(HINSTANCE hDll); // 加载时返回的句柄
// 自动区分动态库类型,并卸载它
static BOOL UnloadApplication(LPCTSTR pszAppFile); // 文件名
// 取得当前视口的数据
static BOOL GetActiveViewPortInfo(double &dHeight, // 高度
double &dWidth, // 宽度
AcGePoint3d &ptTarget, // 目标点
AcGeVector3d &vecViewDir, // 方向
double &dViewTwist, // ViewTwist
BOOL bGetViewCenter); // 是否取视口中心
// 取得当前视口数据
static BOOL GetCurrentViewInfo(AcGePoint3d & ptPosition, // 位置点
AcGePoint3d & ptTarget, // 目标点
AcGeVector3d& vecUpVector, // UpVector
double& dFieldWidth, // 宽度
double& dFieldHeight); // 高度
#if ARX<20
// 取得ShadeMode系统变量值
static AcGsView::RenderMode GetShadeMode(int iVP);
// 取得ShadeMode系统变量值
static AcGsView::RenderMode GetCurrentShadeMode();
#endif
// 取得当前视口的大小,世界坐标系
static BOOL GetCurrentViewSize(double& dWidth, double& dHeight);
static BOOL GetCurrentViewSize(AcGePoint3d& ptMin, AcGePoint3d& ptMax);
// 缩放图形窗口
static BOOL ZoomExtents();
static BOOL Zoom(const AcGePoint3d& ptMin, const AcGePoint3d& ptMax);
// 平移绘图窗口
static BOOL Pan(const AcGeVector3d& vecPan);
// 将窗口缩放/平移到当前视口中
static BOOL ZoomInCurrentView(const AcGePoint3d& ptMin, const AcGePoint3d& ptMax);
// 取得UCS坐标系统信息
static AcGeVector3d GetUcsXAxis();
static AcGeVector3d GetUcsYAxis();
static AcGeVector3d GetUcsZAxis();
static AcGePoint3d GetUcsOrigin();
// 对角度Ucs和Wcs转换
static double Ucs2Wcs(double dAngle);
static double Wcs2Ucs(double dAngle);
// 点和向量Ucs和Wcs转换
static AcGePoint3d Ucs2Wcs(const AcGePoint3d& pt);
static AcGePoint3d Wcs2Ucs(const AcGePoint3d& pt);
static AcGeVector3d Ucs2Wcs(const AcGeVector3d& vec);
static AcGeVector3d Wcs2Ucs(const AcGeVector3d& vec);
// 取得屏幕和视口转换
static int Wcs2Pixel(double dLen);
static CPoint Wcs2Pixel(const AcGePoint3d& pt);
static double Pixel2Wcs(int iLen);
static AcGePoint3d Pixel2Wcs(const CPoint& pt);
// 得到耙区在WCS下的大小
static double GetApertureSize();
// 得到拾取框在WCS下的大小
static double GetPickBoxSize();
// 取得两点构成的立方体的最小点/最大点
static AcGePoint3d GetMinPoint(const AcGePoint3d& pt1, const AcGePoint3d& pt2);
static AcGePoint3d GetMaxPoint(const AcGePoint3d& pt1, const AcGePoint3d& pt2);
static AcGePoint2d GetMinPoint(const AcGePoint2d& pt1, const AcGePoint2d& pt2);
static AcGePoint2d GetMaxPoint(const AcGePoint2d& pt1, const AcGePoint2d& pt2);
// 判断点是否在立体框内
static BOOL IsPointInBox(const AcGePoint3d pt, const AcGePoint3d& ptBox1, const AcGePoint3d& ptBox2);
static BOOL IsPointInBox(const AcGePoint2d pt, const AcGePoint2d& ptBox1, const AcGePoint2d& ptBox2);
// 取得中点
static AcGePoint3d GetMiddlePoint(const AcGePoint3d& pt1, const AcGePoint3d& pt2);
static AcGePoint2d GetMiddlePoint(const AcGePoint2d& pt1, const AcGePoint2d& pt2);
// acutPolar包装
static AcGePoint3d GetPolarPoint(const AcGePoint3d& ptBase, double dAngle, double dDistance);
// acutAngle包装
static double GetAngle(const AcGePoint3d& pt1, const AcGePoint3d& pt2);
static double GetAngle(const AcGePoint2d& pt1, const AcGePoint2d& pt2);
static double GetAngle(const AcGeVector3d& vec);
static double GetAngle(const AcGeVector2d& vec);
static double GetAngle(const AcGeVector3d& vec1, const AcGeVector3d& vec2);
// pt1->pt2与vecNormal.perpVector()夹角
static double GetAngle(const AcGePoint3d& pt1, const AcGePoint3d& pt2, const AcGeVector3d& vecNormal);
// 由起点到终点和bulge定义的圆弧,求圆弧中心,半径,始末角
static BOOL GetArcParam(const AcGePoint3d& ptStart, const AcGePoint3d&ptEnd, double dBulge, const AcGeVector3d& vecNormal,
AcGePoint3d& ptCenter, double& dRadius, double& dStartAngle, double& dEndAngle);
// 比较resbuf数据>, =, <
static int CompareResBuf(const struct resbuf* pRb1, const struct resbuf* pRb2);
// 拷贝resbuf, 如有string和binary, 也拷贝(拷贝当前节点)
static BOOL CopyResBuf(struct resbuf* pRbDest, const struct resbuf* pRbSrc);
// 将resbuf中的restype类型(AcDb::kDxfCode和RTREAL, RT..)转换为AcDb::DwgDataType类型
static AcDb::DwgDataType ResBufType2DwgDataType(int iType);
// 将resbuf中有效的string和binary中的内容释放掉(释放当前节点), 其它数据不变
static void FreeResBuf(struct resbuf* pRb);
// 将rbList中所有内容都释放掉
static void FreeRbList(struct resbuf* pRbList);
// 判断实体是否符合过滤表
static BOOL FilterEntity(ads_name adsEnt, const struct resbuf* pRbFilter = NULL);
// 取得当前选择集
static BOOL GetCurrentPickSet(ads_name ssSet, const struct resbuf* pRbFilter = NULL);
// 按给定的过滤表选择实体(考虑当前选择集), 返回RTNORM...RTNULL...
static int SelectEntity(LPCTSTR pszPrompt, ads_name adsEnt, const struct resbuf* pRbFilter = NULL,
ads_point adsPt = NULL, int iFlag = -1, LPCTSTR pszKeyWord = NULL);
static int SelectEntity1(LPCTSTR pszPrompt, ads_name adsEnt, const struct resbuf* pRbFilter = NULL,
ads_point adsPt = NULL, int iFlag = -1, LPCTSTR pszKeyWord = NULL, double dPickTol = -1.0);
static int SelectEntity2(LPCTSTR pszPrompt, ads_name adsEnt, const struct resbuf* pRbFilter = NULL);
// 按给定的过滤表选择多个实体(考虑当前选择集)
static int SelectEntities(LPCTSTR pszPrompt, ads_name ssSet, const struct resbuf* pRbFilter = NULL);
// 按给定的过滤表选择多个实体(考虑当前选择集),支持关键字
static int SelectEntities2(LPCTSTR pszPrompt
, ads_name ssSet
, const struct resbuf* pRbFilter = NULL
, LPCTSTR keyWordList = NULL
, resbuf *(*key_func) (const ACHAR *) = NULL);
// 将数组中的点都进行旋转变换
static void RotateBy(AcGePoint3dArray& arpt, double dAngle, const AcGeVector3d& vecNormal, const AcGePoint3d& ptOrg);
// 将数组中的向量都进行旋转变换
static void RotateBy(AcGeVector3dArray& arvec, double dAngle, const AcGeVector3d& vecNormal);
// 将数组中的点都进行比例变换
static void ScaleBy(AcGePoint3dArray& arpt, double dScale, const AcGePoint3d& ptOrg);
// 将数组中的向量都进行比例变换
static void ScaleBy(AcGeVector3dArray& arvec, double dScale);
// 将数组中的点都进行位移变换
static void MoveBy(AcGePoint3dArray& arpt, const AcGeVector3d& vecMove);
// 将数组中的点都通过xform变换
static void TransformBy(AcGePoint3dArray& arpt, const AcGeMatrix3d& xform);
// 将数组中的向量都通过xform变换
static void TransformBy(AcGeVector3dArray& arvec, const AcGeMatrix3d& xform);
// 将AcDbEntity对象通过矩阵变换,传入的元素必须是AcDbEntity派生的
static void TransformBy(AcDbVoidPtrArray& arpEnties, const AcGeMatrix3d& xform);
// 取得一组点的中心点
static AcGePoint3d GetCenterPoint(const AcGePoint3dArray& arpt);
// 求点在直线上的投影点
static AcGePoint3d GetProjectPoint(const AcGePoint3d& pt, const AcGePoint3d& ptLine, const AcGeVector3d& vecLine);
// 求旋转后的点
static AcGePoint3d GetRotatePoint(const AcGePoint3d& pt, double dAngle, const AcGeVector3d& vecNormal, const AcGePoint3d& ptOrg);
// 求旋转后的向量
static AcGeVector3d GetRotateVector(const AcGeVector3d& vec, double dAngle, const AcGeVector3d& vecNormal);
// 求文字外框尺寸
static BOOL GetTextBox(AcDbExtents& ext, LPCTSTR pszTextStr, LPCTSTR pszTextStyle, double dHeight, double dWidthFactor = 1.0, double dOblique = 0.0);
// 得到当前 visual style
static CString GetCurrentVS();
public:
// 比较计算的精度
static double m_KTTol;
};
// 取得UCS坐标系统信息
#define UcsXAxis CKTCadUtility::GetUcsXAxis()
#define UcsYAxis CKTCadUtility::GetUcsYAxis()
#define UcsZAxis CKTCadUtility::GetUcsZAxis()
#define UcsOrigin CKTCadUtility::GetUcsOrigin()
// 取得WCS坐标系统信息
#define WcsXAxis AcGeVector3d::kXAxis
#define WcsYAxis AcGeVector3d::kYAxis
#define WcsZAxis AcGeVector3d::kZAxis
#define WcsOrigin AcGePoint3d::kOrigin
//////////////////////////////////////////////////////////////////////////
//
#include "aecdbObjXDataMap.h"
struct EWSegment;
struct EWFnctNode;
namespace EWDimData
{
void writeXDataMap(AcDbEntity *pEnt, const EWSegment &seg, const int idx);
void writeXDataMap(AcDbEntity *pEnt, const EWFnctNode &node);
}
#endif // !defined(__KTCADUTILITY_H__)