#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__)