Files
envi-code/SourceCode/Code2026/inc/AdsXRx/XGlobalFunc.h
T
2026-09-28 15:28:50 +08:00

891 lines
31 KiB
C++

//-------------------------------------------------------------------------------------------------------+
// Copyright (C), 1998-2007, SH Software Co. Ltd.
// = FileName : 导出全局函数头文件
// = Version : ver2.0
// = Author : zjq
// = CreateDate : 2002-09-09
// = Description: 全局函数的声明
// = Maintainers:
//
//-------------------------------------------------------------------------------------------------------+
#ifndef _XGLOBALFUNC_H_
#define _XGLOBALFUNC_H_
#ifndef _XASTRING_H_
#include "XAString.h"
#endif
#ifndef _XWCSTRING_H_
#include "XWString.h"
#endif
#ifndef _XASTRINGLIST_H_
#include "XAStringList.h"
#endif
#ifndef _XWSTRINGLIST_H_
#include "XWStringList.h"
#endif
#ifndef _PICKSET_H_
#include "PickSet.h"
#endif
#ifndef _XPOINT_H_
#include "XPoint.h"
#endif
#ifndef _XMASTERPROPERTIES_H_
#include "XMasterProperties.h"
#endif
#include "dbltrans.h"
#include <list>
class AEntityBase;
namespace XExport
{
static XPoint g_ptBase; // UCS
GEOAPI int MoveSamplerStatic(ads_point pt0, ads_matrix mat);
// 实体添加到模型空间或页面空间
//modify by zjq on 100824 添加实体时考虑工作集
//GEOAPI AcDbObjectId AddToModelSpace(AcDbEntity *pEntity, Adesk::Boolean bDoneClose = Adesk::kTrue);
//GEOAPI AcDbObjectId AddToPaperSpace(AcDbEntity *pEntity, Adesk::Boolean bDoneClose);
//GEOAPI AcDbObjectId AddToCurrentSpace(AcDbEntity *pEntity, Adesk::Boolean bDoneClose);
GEOAPI AcDbObjectId AddToModelSpace(AcDbEntity *pEntity, Adesk::Boolean bDoneClose = Adesk::kTrue ,Adesk::Boolean bWorkset = Adesk::kFalse);
GEOAPI AcDbObjectId AddToPaperSpace(AcDbEntity *pEntity, Adesk::Boolean bDoneClose ,Adesk::Boolean bWorkset = Adesk::kFalse);
GEOAPI AcDbObjectId AddToCurrentSpace(AcDbEntity *pEntity, Adesk::Boolean bDoneClose ,Adesk::Boolean bWorkset = Adesk::kFalse);
// 把一组新创建的实体添加到模型空间中去
// bDelWhenfail:当某实体添加不成功时,是否删除已成功添加的对象;
// arEntitySet:当返回的状态不正确时,arEntitySet中遗留的对象,需要调用处,负责delete;
GEOAPI int AddArrayToModelSpace(AcDbVoidPtrArray& arEntitySet, AcDbObjectIdArray &arObjId, bool bDelWhenfail = false);
// 取图块插入控制点,另一个控制点应为基点
GEOAPI BOOL GetBlcCtrlPoint(AcDbObjectId blockTableRecordId, XPoint &ptMax);
// 对一个文件转换代码页, 只能转R10~R14版本
GEOAPI int ConvertDwgCodePage(const TCHAR *tmpFile);
GEOAPI CView* GetCurDwgView();
GEOAPI BOOL IsDigital(const TCHAR *pStr);
#if ARX > 17
// 是否找到 manifest 资源
GEOAPI bool FindRT_MANIFEST();
#endif
GEOAPI void arxZoomCursor(XPoint ptDcs, double nScale);
// 让GsView固定下来
GEOAPI BOOL PersistGsView(AcGsView *pGsView);
/* * * 定 义 对 给 定 的 目 标 点 进 行 正 交 和 咬 住 捕 捉 的 函 数 * * */
// ptBase(IN) -- 参考基点, ptDest(IN) -- 目标点, ptCapture(OUT) -- 对ptDest进行捕捉修正后的点
GEOAPI void CapturePoint(const ads_point ptBase, const ads_point ptDest, ads_point ptCapture);
// ptBase--UCS
GEOAPI int DragMovePickSet(PickSet &ss, const TCHAR *pszPrompt, const XPoint &ptBase, XPoint &ptFinal);
GEOAPI int DragMovePickSet(PickSet &ss, const TCHAR *pszPrompt, const XPoint &ptBase, XPoint &ptFinal,const TCHAR* sKeyword);
GEOAPI int DragRotatePickSet(PickSet &ss, const TCHAR *pszPrompt, XPoint ptBase);
// 用于不带橡皮筋的移动
GEOAPI int DragPickSet(PickSet &ss, XPoint &ptBase);
// 用于带橡皮筋的复制
GEOAPI int DragPickSet1(PickSet &ss, XPoint &ptBase);
GEOAPI Acad::ErrorStatus ExplodeBlockRef(const AcDbBlockTableRecord &blockRec, const AcGeMatrix3d &mat, AcDbVoidPtrArray &entSet);
GEOAPI XString GetTempFileName(const TCHAR *pExt);
GEOAPI BOOL GetWcsCursor(XPoint &ptLoc);
GEOAPI XPoint GetCursorWcs();
GEOAPI int ExpInsertDwg(const TCHAR *pszDwg, XPoint ptInsert);
GEOAPI int ExpInsertDwg(const TCHAR* pszDwg,XPoint ptBase,XPoint ptMin,XPoint ptMax,XPoint ptInsert);
GEOAPI void PostCommand(const TCHAR *str, bool bEcho = false);
GEOAPI BOOL IsKeyPressed(int vk);
GEOAPI int GetBlockExtents(AcDbObjectId idBlock, XPoint &ptLow, XPoint &ptUp);
GEOAPI void InitLocalMsg(BOOL bTrue);
GEOAPI void InitGetBegin(int nFlag, const TCHAR *szKeyTable);
GEOAPI BOOL IsOfAcadWindows(HWND hwnd);
// 把$DWB$DWG分解
GEOAPI Acad::ErrorStatus SplitBlockName(const TCHAR *sName, XString &sDwb, XString &sDwg);
GEOAPI Acad::ErrorStatus ConvertToInteger(const VARIANT *val, int *pInt);
GEOAPI Acad::ErrorStatus ConvertToDouble(const VARIANT *val, double *pRes);
// 从块表中取所有的曲线: 包括LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE,以及在INSERT中的前述实体
GEOAPI void Get2DCurveFromBlock(AcDbBlockTableRecord &blockRec, ads_matrix matForInsert);
// 安全方式开窗口搜索选择集
GEOAPI Acad::ErrorStatus GetSafeSelection(PickSet &ss, BOOL bCrossing, const XPoint &ptLow,const XPoint &ptUp, const TCHAR *pDxfWizard,BOOL bRealCornerSel);
GEOAPI Acad::ErrorStatus GetSafeSelection(PickSet &ss, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp, const TCHAR *szDxf);
GEOAPI Acad::ErrorStatus GetSafeSelection(PickSet &ss, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp, const AcRxClass *pClass,BOOL bRealCornerSel = FALSE);
// 安全方式开窗口搜索选择集,以arIDs方式返回[zjq 2009-1-17]
GEOAPI Acad::ErrorStatus GetSafeSelection(AcDbObjectIdArray &arIDs, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp, const TCHAR *pDxfWizard,AcDbObjectId idBlock,BOOL bRealCornerSel = FALSE);
// 安全方式开窗口搜索选择集,以arIDs方式返回[zjq 2009-1-17]
GEOAPI Acad::ErrorStatus GetSafeSelection(AcDbObjectIdArray &arIDs, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp, const AcRxClass *pClass,AcDbObjectId idBlock,BOOL bRealCornerSel = FALSE);
GEOAPI Acad::ErrorStatus GetSafeSelection(PickSet &ss, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp, const AcRxClass *pClass,AcDbObjectId idBlock);
GEOAPI Acad::ErrorStatus GetSafeSelectionEx(PickSet &ss, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp, const AcRxClass *pClass);
GEOAPI Acad::ErrorStatus GetSafeSelectionEx(PickSet &ss, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp, const AcRxClass *pClass,AcDbObjectId idBlock);
GEOAPI Acad::ErrorStatus GetSafeSelection(PickSet &ss, const XPoint &ptLow, const XPoint &ptUp,std::list<AcRxClass*> &lstClass, AcDbObjectId idLayer);
// 当前工作集搜索选择集
GEOAPI Acad::ErrorStatus GetSafeSelection2(PickSet &ss, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp, const TCHAR *szDxf);
GEOAPI Acad::ErrorStatus GetSafeSelection2(PickSet &ss, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp, const AcRxClass *pClass);
GEOAPI Acad::ErrorStatus GetSafeSelection2(PickSet &ss, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp, const AcRxClass *pClass,AcDbObjectId idBlock);
GEOAPI Acad::ErrorStatus GetSafeSelection2(PickSet &ss, const XPoint &ptLow, const XPoint &ptUp,std::list<AcRxClass*> &lstClass, AcDbObjectId idLayer);
GEOAPI Acad::ErrorStatus GetSafeSelectionEx2(PickSet &ss, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp, const AcRxClass *pClass);
GEOAPI Acad::ErrorStatus GetSafeSelectionEx2(PickSet &ss, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp, const AcRxClass *pClass,AcDbObjectId idBlock);
//当前视觉空间的图元选择,遇到块引用,选择块对应的rec 中实体[zjq 2009-1-17]
GEOAPI Acad::ErrorStatus GetViewSafeSelection(AcDbObjectIdArray &arIDs, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp,const TCHAR* pszDxf,BOOL bRealCornerSel = FALSE);
GEOAPI Acad::ErrorStatus GetViewSafeSelection(AcDbObjectIdArray &arIDs, BOOL bCrossing, const XPoint &ptLow, const XPoint &ptUp,const AcRxClass* pClass,BOOL bRealCornerSel = FALSE);
//获取对应名字的blockrec的id
GEOAPI AcDbObjectId GetBlockIdFromString(const TCHAR *pszBlock, AcDbDatabase *pDb=NULL);
//把图层名字转化为ID
GEOAPI AcDbObjectId GetLayerIdFromString(const TCHAR* pStr, AcDbDatabase *pDb=NULL);
//把线型名字转化为ID
GEOAPI AcDbObjectId GetLinetypeIdFromString(const TCHAR* pStr, AcDbDatabase *pDb=NULL);
//把字样名字转化为ID
GEOAPI AcDbObjectId GetTextStyleId(const TCHAR *styleName, AcDbDatabase *pDb=NULL);
//获取标注样式记录的id
GEOAPI AcDbObjectId GetDimStyleId(const TCHAR *styleName, AcDbDatabase *pDb=NULL);
GEOAPI int GetLayerColor(AcDbObjectId idLay);
//把字样ID转化为AcGi的样式
GEOAPI Acad::ErrorStatus GetAcGiTextStyle(AcDbObjectId styleId, AcGiTextStyle &newStyle);
// 把AutoCAD的颜色转成Windows颜色
GEOAPI void ColorToRGB(int nAcadColor, int *nR, int *nG, int *nB);
//构造图块插入的矩阵 (对图块定义的原始坐标用该矩阵进行变换将是WCS下的坐标)
// ptBase--Block定义的基点; ptInsert--图块插入的点; sx,sy,sz--插入比例; rot--旋转弧度
// result--变换矩阵
GEOAPI void get_matrix(const XPoint &ptBase, const XPoint &ptInsert,double sx, double sy, double sz, double rot, ads_matrix result);
//释放对象的指针数组, 不仅把数组清空, 而且把数组元素的内存给释放掉
GEOAPI void ReleaseEntSet(AcDbVoidPtrArray &entSet);
//从当前DWG块表记录中选取指定的实体
// lstObjects--结果; pDxfWizard--实体DXF类型的过滤;
// nCmpMethod--比较方法, 采用匹配(asd_match)还是相等(stricmp); pszBlk--图块名称
GEOAPI Acad::ErrorStatus GetEntFromBlockByDxf(DList<AcDbObjectId> &lstObjects, LPCTSTR pDxfWizard, int nCmpMethod = 0, LPCTSTR pszBlk = ACDB_MODEL_SPACE);
GEOAPI Acad::ErrorStatus GetEntFromBlockByDxf2(DList<AcDbObjectId> &lstObjects, LPCTSTR pDxfWizard, int nCmpMethod = 0, LPCTSTR pszBlk = ACDB_MODEL_SPACE);
GEOAPI Acad::ErrorStatus GetEntFromBlockByClass(DList<AcDbObjectId> &lstObjects,AcRxClass *pClass, int nCmpMethod, const TCHAR *pszBlk,LPVOID pReserve = NULL);
GEOAPI Acad::ErrorStatus GetEntFromBlockByClass(DList<AcDbObjectId> &lstObjects,AcRxClass *pClass, int nCmpMethod, AcDbObjectId idBlock,LPVOID pReserve = NULL);
GEOAPI Acad::ErrorStatus GetEntFromBlockByClass2(DList<AcDbObjectId> &lstObjects,AcRxClass *pClass, int nCmpMethod, AcDbObjectId idBlock,LPVOID pReserve = NULL);
//从当前DWG的模型空间中选取指定的实体
// lstObjects--结果; pDxfWizard--实体DXF类型的过滤;
// nCmpMethod--比较方法, 采用匹配(asd_match)还是相等(stricmp)
GEOAPI Acad::ErrorStatus GetEntByDxf(PickSet &lstObjects, LPCTSTR pDxfWizard, int nCmpMethod=0);
GEOAPI Acad::ErrorStatus GetEntByDxf2(PickSet &lstObjects, LPCTSTR pDxfWizard, int nCmpMethod=0);
//得到块内可见对象
GEOAPI void GetVisibleEnts(AcDbObjectIdArray &idArray,AcDbObjectId idBlock=AcDbObjectId::kNull,bool bAEntityBaseCast = false,LPVOID pReserv = NULL);
// nCmpMethod: 0--Use stricmp; 1--Use ads_TWcmatch
GEOAPI Acad::ErrorStatus GetEntityFromDatabase(DList<AcDbObjectId> &lstObjects, AcDbDatabase &db, LPCTSTR pDxfWizard, int nCmpMethod, LPCTSTR pszBlock);
//增加了区域判断
GEOAPI Acad::ErrorStatus GetEntityFromDatabase(DList<AcDbObjectId> &lstObjects, AcDbDatabase &db, LPCTSTR pDxfWizard, int nCmpMethod, LPCTSTR pszBlock,XPoint ptMin,XPoint ptMax);
//无类型匹配
GEOAPI Acad::ErrorStatus GetEntityFromDatabase(DList<AcDbObjectId> &lstObjects, AcDbDatabase &db, const TCHAR *pszBlock,XPoint ptMin,XPoint ptMax);
// 把象素值换算到WCS下的坐标尺寸
GEOAPI double PixelToWcs(int nPixel);
// 得到耙区在WCS下的大小
GEOAPI double GetApertureWcs();
// 得到拾取框的大小
GEOAPI double GetPickBoxWcs();
// 确保ptLow(左下), ptUp(右上)指定的区域在当前视图的显示范围内
// 根据需要进行ZOOM, 以便可以开窗口ssget
GEOAPI Acad::ErrorStatus AssureInCurrentView(const XPoint &ptLow, const XPoint &ptUp);
// 用arx的方法进行ZOOM, 不通过COMMAND接口
GEOAPI Acad::ErrorStatus arxZoom(const XPoint &ptLow, const XPoint &ptUp);
GEOAPI Acad::ErrorStatus arxZoomTo(const XPoint &ptCen, double nWidth, double nHeight);
GEOAPI Acad::ErrorStatus arxPan(const XPoint &vtPan);
// 取字样的默认尺寸, 已经根据图纸比例换算成为模型空间的尺寸
GEOAPI double GetTextSize(const TCHAR *m_sTextStyle);
// 获取图块插入的参数
// pBlk(IN)--图块插入; ptBase--基点; nRot--转角
// ptCen--包络中心; nSizeX, nSizeY, nSizeZ--图块尺寸
GEOAPI int GetBlockRefSizeInfo(const AcDbBlockReference *pBlk, XPoint &ptBase, double *nRot,XPoint &ptCen, double *nSizeX, double *nSizeY, double *nSizeZ);
// 取得下一个图块的名称, 如根据A(a001)推算下一个不存在的图块, 如A(a002)
// dwb(IN)--图库名称, 全路径; dwg(IN, OUT)--当前图块传人,下一图块名传出
GEOAPI int GetNextItem(const TCHAR *dwb, TCHAR *dwg);
GEOAPI int GetCurveFromInsert2D(Entity &ent, PickSet &ssRes);
// 求由一组曲线组成的边界,返回polyline线,用后需要删除
GEOAPI AcDbCurve* ConvertCurves2Loops(const AcDbVoidPtrArray& arpCurve, AcDbVoidPtrArray& arpResult);
GEOAPI double GetBulgeBy3Pt(const AcGePoint3d& ptStart, const AcGePoint3d& ptEnd, const AcGePoint3d& ptSample);
GEOAPI int LoadArxApp(const TCHAR *pszAppReg, const TCHAR *pszFileName);
GEOAPI resbuf *GetLineFence(double dist, ads_point startPoint, ads_point endPoint);
// 建立一个包含一条线的多边形,除了没有将起点封闭外,其余同上
GEOAPI resbuf *GetLinePoly(double dist, ads_point startPoint, ads_point endPoint);
GEOAPI int LoadBlock(const TCHAR *blk);
GEOAPI int ExplodeBlockReference(const Entity &ent, ads_matrix mat);
//获取文字实体的边框
GEOAPI int TextGeometry(Entity & textEnt, ads_point cen,double *w, double *h, double *ang);
GEOAPI int TextGeometry(const TCHAR *text, double *w);
GEOAPI int HandleCurveDup(PickSet &ss);
GEOAPI int SplitSlbName(const TCHAR *totalName, TCHAR *slbFile, TCHAR *sldFile);
//加载dwb块
GEOAPI int LoadDwbBlock(const TCHAR *sDwbFile, TCHAR *sBlockName);
GEOAPI int LoadDwbBlock(const TCHAR *sDwbFile, TCHAR *sBlockName,AcDbDatabase*pDb);
GEOAPI int LoadDwbBlock(const TCHAR *sDwbFile, const TCHAR *sDwgName, TCHAR *sBlockName);
GEOAPI int LoadDwbBlock(const TCHAR *sDwbFile, const TCHAR *sDwgName, TCHAR *sBlockName,AcDbDatabase*pDb);
GEOAPI int GetColorDlg(int color);
GEOAPI int XGetPoint(const ads_point ref, const TCHAR *prompt, ads_point res);
GEOAPI int YesNoQuestion(const TCHAR *s, int nDefaultAnswer=Q_YES);
GEOAPI BOOL SplitLibraryPath(const TCHAR *totalName, TCHAR *slbFile, TCHAR *sldFile);
GEOAPI XString GetSymbolName(AcDbObjectId idSymbolRec);
GEOAPI XString GetTempSymbolName(const TCHAR *symb);
GEOAPI XString GetTempSymbolName(const TCHAR *symb, const TCHAR *prefix);
GEOAPI AcDbObjectId GetTempEntityId(AcRxClass *pClass, const TCHAR *szBlockName, BOOL *bFirstNew);
//添加文字样式
GEOAPI AcDbObjectId AddTextStyle(AcDbTextStyleTableRecord *pRec, BOOL bDoneClosed, AcDbDatabase *pDb=NULL);
//添加块记录
GEOAPI AcDbObjectId AddBlock(AcDbBlockTableRecord *pRec, BOOL bDoneClosed, AcDbDatabase *pDb=NULL);
//添加标注样式
GEOAPI AcDbObjectId AddDimStyle(AcDbDimStyleTableRecord *pRec, BOOL bDoneClosed, AcDbDatabase *pDb=NULL);
//添加图层记录
GEOAPI AcDbObjectId AddLayer(AcDbLayerTableRecord *pLay, BOOL bDoneClosed, AcDbDatabase *pDb=NULL);
GEOAPI AcDbObjectId InitLineType(const TCHAR *szLineType, AcDbDatabase *pDb=NULL);
GEOAPI AcDbObjectId InitTchLineType(const TCHAR *szLineType, AcDbDatabase *pDb=NULL);
GEOAPI AcDbObjectId MakeBlock(const TCHAR *szBlock, PickSet &ss, XPoint ptInsert);
//arx建立图层或取得已有图层id, bApplyChang-是否调用应用图层的改变,TRUE用于ADS, FALSE用于ARX
GEOAPI AcDbObjectId MakeLayer(const TCHAR *LayName, BOOL bApplyChange);
GEOAPI AcDbObjectId MakeLayer(const TCHAR *LayName, AcDbDatabase*pDb);
// add by zjq on 101118 由对象的id获得对象ownerId,返回值为ownerId
GEOAPI AcDbObjectId GetOwnerIdFromId(AcDbObjectId idObj);
GEOAPI int GetViewport(int vp, class Entity &res);
GEOAPI AcDbObjectId GetMSpaceId(AcDbDatabase *pDb=NULL);
GEOAPI void GetSearchPath(XStringList &lstSearchPath);
GEOAPI int GetFileDia(XString &fullName, int nFlag, const TCHAR *ext, const TCHAR *title);
GEOAPI void MakeFullPath(const TCHAR *pExt, XString &sFileBm1);
// 创建一个指定的目录, 可以不要求事先存在上一级目录
GEOAPI BOOL MakeDir(const TCHAR *pDir);
GEOAPI int arxAssureLayer(const TCHAR *szLayer, int nFlag);
GEOAPI int AssureLayer(const TCHAR *szLayer, int nFlag);
GEOAPI void AssureOnScreen(const XPoint &ptLow, const XPoint &ptUp);
GEOAPI void AssureTileMode(int nMode);
GEOAPI int IsWCS();
GEOAPI int TypeOfCode(int code);
GEOAPI void ApplicationError(const TCHAR *,...);
GEOAPI int MakeEntity(int,...);
GEOAPI void PrintList(const PGroups list);
GEOAPI int CT_Inverse_mat(double *A, int order, double ep);
// 三点确定的平面法向量
GEOAPI int CT_vector_plan3p(const ads_point pt1, const ads_point pt2,const ads_point pt3, ads_vector result);
// 由点和法向量计算平面的标准方程, 得到plan--存储平面的标准参数
GEOAPI int CT_plan_equation(const ads_point pt, const ads_vector vt,struct plan_para *plan);
// 求线与平面的交点
GEOAPI int CT_inter_line_plan1(const ads_point pt1, const ads_point pt2,const struct plan_para *plan, ads_point result);
GEOAPI int CT_inter_line_plan2(const ads_point pt1, const ads_vector vt,const struct plan_para *plan, ads_point result);
// 点到平面的投影
GEOAPI int CT_point_prj_plan(const ads_point pt, const struct plan_para *plan,ads_point qt);
// 改变向量格式从点格式到长度,角度格式
GEOAPI int CT_XYZtoRsita(const ads_point vt, double *direct, double *dist);
// 求两向量的夹角
GEOAPI double CT_VectorAngle(ads_vector pt1, ads_vector pt2);
// 去除文件名的路径, 不改变 FileName 如: FileName = _T("d:\abc\exam.dat"), 返回 _T("exam.dat")
GEOAPI TCHAR * CT_NoPath_FileName(TCHAR *FileName);
// 清除字符数组
GEOAPI void CT_clear_strbuf(char *strbeg, int strsize);
// Copy file from f1 to f2
GEOAPI int CT_cp_file(const TCHAR *f1, const TCHAR *f2);
//INI 操作:
GEOAPI int CT_get_INIB(FILE *fp,const TCHAR *topic,const TCHAR *item_id,TCHAR *item_value);
GEOAPI int CT_get_INIA(const TCHAR *ini_file,const TCHAR *topic,const TCHAR *item_id,TCHAR *item_value);
GEOAPI TCHAR *CT_get_INI2(const struct INI_struct *buf, const TCHAR *desc_handle);
GEOAPI int CT_get_INIs(const TCHAR *ini_file,const TCHAR *topic,struct INI_struct **res);
GEOAPI int CT_ini_item(const TCHAR *string, int i, TCHAR *item);
GEOAPI TCHAR *CT_strnth(const TCHAR *string, int i, TCHAR *item);
GEOAPI int CT_set_INI(const TCHAR *ini_file,const TCHAR *topic,const TCHAR *item_id,const TCHAR *item_value);
GEOAPI int CT_set_INIB(const TCHAR *ini_file,const TCHAR *topic,const struct INI_struct *desc);
// 释放 INI描述链表
GEOAPI int CT_free_INIs(struct INI_struct *res);
// int变字符, 3 --> _T("3").
GEOAPI int CT_itoa(int num, TCHAR *nn);
// 改变字符串长度
GEOAPI int CT_stradj(TCHAR *str, int len);
// change a string to alphabet string
GEOAPI int CT_alphabet_str(const TCHAR *str, TCHAR *res, int res_size);
GEOAPI BOOL IsWindowsNT();
GEOAPI AcDbPolyline* AsPolyline(const AcDbEntity *pEntity);
GEOAPI int DisplaySlide(CWnd *pWnd, const TCHAR *pszSlide);
GEOAPI void FindDirs(const TCHAR *sDir, XStringList &lstSubDirs);
GEOAPI int FindFile(const TCHAR *sDbfPath);
GEOAPI void FindFiles(const TCHAR *sDir, const TCHAR *sFilter, XStringList &lstRes,int bIncludeSubDir=0, time_t tLastModify=0L);
GEOAPI int FindFile(const TCHAR *sPath, TCHAR *sFullPath);
GEOAPI int GetProtectCode();
// 取得矩形的几何参数
GEOAPI int GetRectTangle(resbuf *ptList, Point &cen, double *width, double *height);
GEOAPI int GetInsertMatrix(const Entity & insertEnt, ads_matrix result);
GEOAPI void MatrixMultiply(ads_matrix result, ads_matrix m1, ads_matrix m2, ...);
GEOAPI void CalTransformMatrix(const XPoint &base, XVector3D scl, double rot,const XPoint &insPt, ads_matrix result);
GEOAPI void get_matrix(ads_point pt1,ads_point pt2,ads_point pt3,ads_matrix tran_mt);
GEOAPI int GetCirDivNum(double r, double h);
//编号排序 <-1,==0,>1
GEOAPI int ACmpLabel(const char*sLabel1,const char*sLabel2);
GEOAPI int UCmpLabel(const wchar_t* sLabel1,const wchar_t* sLabel2);
//复制新字符串,外部负责析构
GEOAPI char *strnew(const char *src);
GEOAPI wchar_t *wstrnew(const wchar_t *src);
GEOAPI char *strchr_new(const char *string, int c,bool bToFile=true);
GEOAPI wchar_t *wstrchr_new(const wchar_t *string, int c,bool bToFile=true);
// dest include TCHAR from 'from' to 'to, with EOS
// include 'from', but not include 'to'
GEOAPI char* StrCpy(char *dest, const char *from, const char *to);
GEOAPI wchar_t* StrCpy(wchar_t *dest, const wchar_t *from, const wchar_t *to);
GEOAPI void getdate(STDate *curDate);
GEOAPI STDate operator - (STDate &d1, STDate &d2);
// yyyymmdd
GEOAPI void GetDate(TCHAR *pDate);
GEOAPI int StrToDate(const TCHAR *strDate, STDate &res );
GEOAPI int StringToList(const TCHAR *s, XStringList &res);
GEOAPI Acad::ErrorStatus ExplodeAcis(const AcDbEntity *pEnt, AcDbVoidPtrArray &entSet);
GEOAPI double GetBulgeBy3Pt(const AcGePoint3d& ptStart, const AcGePoint3d& ptEnd, const AcGePoint3d& ptSample);
GEOAPI int AT_loaded(const TCHAR * AppName);
GEOAPI int AT_amatrix(const ads_matrix mat, ads_matrix amat);
GEOAPI int AT_ScrCorner(ads_point lowerpt, ads_point upperpt);
GEOAPI int AT_ScrSize(double *width, double *height);
GEOAPI int AT_get_blkname(const TCHAR *prefix, TCHAR *blk_name);
GEOAPI void AT_GetCurDwg(TCHAR *curDwg);
GEOAPI struct resbuf *AT_get_resbuf(struct resbuf *p,int code);
GEOAPI BOOL IsMaskBlock(AcDbBlockTableRecord &block, AcRxClass *pClass);
//近似0将转化为0,近似PI2*n将转化为0!
GEOAPI int LimitCycle(int n, int nLen);
GEOAPI int AT_move(ads_name ssname, ads_point bpt, ads_point res);
GEOAPI int AT_scale(ads_name ssname, ads_point bpt, double *res);
GEOAPI int AT_rotate(ads_name ssname, ads_point bpt, double *res);
GEOAPI struct resbuf *AT_link_list(struct resbuf *list1, struct resbuf *list2);
GEOAPI int IsEqual(double prec, int n, double num1, double num2, ...);
GEOAPI int IsEqual(int n, int num1, int num2, ...);
// 初始化平面旋转变换的矩阵 rotAngle -- 转角(弧度) rotMat -- 要被初始化的矩阵
GEOAPI void AT_InitRotMatrix(double rotAngle, ads_matrix rotMat);
// 初始化单位矩阵
GEOAPI void AT_InitIdenMat(ads_matrix id);
// 根据变换点初始化矩阵 Tx: X轴方向变换距离
GEOAPI void AT_InitTranMat(ads_matrix tran,double Tx,double Ty,double Tz);
GEOAPI int AT_multiply_matrix(ads_matrix mat1, ads_matrix mat2, ads_matrix result);
// 把 pt绕 base旋转 ang 弧度后的结果放回 pt
GEOAPI void AT_PointRotation(ads_point pt, ads_point base, double ang);
//模拟insert命令,可以处理属性
GEOAPI void InsertInCurrentSpace(AcDbObjectId idBlockRecord,AcGePoint3d ptIns,AcGeScale3d scale,double angle);
GEOAPI int GetPickSetByGroup(const TCHAR *szGroup, PickSet &ss);
GEOAPI int MakeGroup(PickSet &ss, const TCHAR *pGroupName, BOOL bClearOld);
// 100115
// 把一组实体添加成组,若为无名组,pGroupName为_T("*")
GEOAPI int MakeGroup(AcDbObjectIdArray &arObjId, AcDbObjectId &objId, const TCHAR *pGroupName = _T("*"), bool bClearOld = true, bool bSelectable = true);
GEOAPI void InitView(AcDbViewTableRecord &view);
GEOAPI BOOL IsAcadDwgView(HWND hwnd);
GEOAPI BOOL IsCurDwgView(HWND hwnd);
GEOAPI int ExpInsertDwg0(const TCHAR* pszDwg,XPoint ptBase,XPoint ptMin,XPoint ptMax,XPoint ptInsert);
//删除模型空间包围盒外的内容
GEOAPI Acad::ErrorStatus EraseEntityFromDatabase(AcDbDatabase &db,XPoint ptMin,XPoint ptMax);
GEOAPI void MakeVisible(PickSet &ss, bool bTrue);
GEOAPI BOOL IsValidPath(const TCHAR *szPath);
GEOAPI BOOL AsStdPath(XString &sPath);
GEOAPI BOOL arxWBlock(PickSet &ss, const TCHAR* szFileName, XPoint ptIns);
GEOAPI BOOL IsModelSpace(AcDbObjectId idBlock);
#ifdef _REF_EDIT_PATCH
GEOAPI AcDbLongTransWorkSetIterator* GetCurrentWorkSet();
GEOAPI BOOL WorkSetHas(AcDbObjectId idEnt);
#endif
GEOAPI BOOL IsArxLoaded(const TCHAR *pszFileName);
GEOAPI BOOL OnCharAsHotKey(UINT_PTR nChar, UINT_PTR nRepCnt, CPoint ptScreen);
#if ARX > 22
GEOAPI bool LocalHotKeyMonitor(MSG* msg);
#else
GEOAPI BOOL LocalHotKeyMonitor(MSG* msg);
#endif
GEOAPI void InitGeLib(bool bAttach = true);
GEOAPI BOOL IsPaperSpace();
GEOAPI BOOL IsUpdateMVBlock();
GEOAPI void UpdateMVBlockVal(BOOL bTrue);
GEOAPI int IsExplode3D();
GEOAPI void BeginModelRecordZone();
GEOAPI void ModifyModelRecordZone(const AcDbObject* pObj);
GEOAPI void EndModelRecordZone();
GEOAPI bool GetGeomExtentsInRecordZone(AcDbObjectId& id,AcDbExtents& ext);
//提示用户选择一个实体, 或者从PickFirst中选取(如果存在), 排除重合实体
//szPrompt--提示; entResult--结果; ptPick--点取位置; rbBaseMask--DXF过滤表
GEOAPI int SelectEntity1(const TCHAR *szPrompt, Entity &entResult, XPoint &ptPick, RBList &rbBaseMask);
GEOAPI int SelectEntity1(double nPrec, const TCHAR *szPrompt, Entity &entResult, XPoint &ptPick, RBList &rbBaseMask);
//提示用户选择一个实体, 或者从PickFirst中选取(如果存在)
//szPrompt--提示; entResult--结果; ptPick--点取位置; rbBaseMask--DXF过滤表
GEOAPI int SelectEntity(const TCHAR *szPrompt, Entity &entResult, XPoint &ptPick, RBList &rbBaseMask);
//支持关键字,其它同上
GEOAPI int SelectEntity(const TCHAR *szPrompt, Entity &entResult, XPoint &ptPick, RBList &rbBaseMask,const TCHAR* szKeyword,TCHAR& cRet);
//提示用户选择一个实体, 或者从PickFirst中选取(如果存在)
//szPrompt--提示; entResult--结果; rbBaseMask--DXF过滤表
GEOAPI int SelectEntity(const TCHAR *szPrompt, Entity &entResult, RBList &rbBaseMask);
GEOAPI int SelectEntities(const TCHAR *szPrompt, PickSet &ssResult, RBList &rbBaseMask);
GEOAPI int SelectEntities(const TCHAR *szPrompt, PickSet &ssResult, RBList &rbBaseMask,const TCHAR* szKeyword,TCHAR& cRet);
inline XString Int2Char8(unsigned nIndex)
{
XString sIndex(_T("%d"), nIndex);
size_t nLen = _tcslen(sIndex);
XString sRet;
size_t nSpace = 8 - nLen;
for (size_t i = 0; i < nSpace; i++)
{
sRet << _T("0");
}
sRet << sIndex;
ASSERT(sRet.Length() == 8);
return sRet;
}
// 求标准周期内的整数
// nPeriod--周期 (>0)
// nIndex -- 给定的整数
// 返回: 0~nPeriod-1内的数值
inline int DePeriod(int nPeriod, int nIndex)
{
ASSERT(nPeriod>0);
while(nIndex >= nPeriod)
{
nIndex -= nPeriod;
}
while(nIndex < 0)
{
nIndex += nPeriod;
}
return nIndex;
}
//获取系统变量
inline int xg_getvar(const TCHAR *var, int *res)
{
resbuf v;
if (ads_getvar(var, &v) != RTNORM || v.restype != RTSHORT )
{
return RTERROR;
}
*res = v.resval.rint;
return RTNORM;
}
inline int xg_getvar(const TCHAR *var, XPoint *res)
{
resbuf v;
if (ads_getvar(var, &v) != RTNORM || (v.restype != RT3DPOINT && v.restype != RTPOINT) )
{
return RTERROR;
}
*res = v.resval.rpoint;
return RTNORM;
}
inline int xg_getvar(LPCTSTR var, XPoint &res)
{
return xg_getvar(var,&res);
}
inline int xg_getvar(const TCHAR *var, double *res)
{
resbuf v;
if (ads_getvar(var, &v) != RTNORM || v.restype != RTREAL )
{
return RTERROR;
}
*res = v.resval.rreal;
return RTNORM;
}
inline int xg_getvar(const TCHAR *var, TCHAR *res)
{
resbuf v;
if (ads_getvar(var, &v) != RTNORM || v.restype != RTSTR )
{
return RTERROR;
}
_tcscpy(res, v.resval.rstring);
free(v.resval.rstring);
return RTNORM;
}
inline int xg_getvar(const TCHAR *var, XString *res)
{
resbuf v;
if (ads_getvar(var, &v) != RTNORM || v.restype != RTSTR )
{
return RTERROR;
}
_tcscpy(*res, v.resval.rstring);
free(v.resval.rstring);
return RTNORM;
}
inline int xg_getsym(const TCHAR *var, int *res)
{
resbuf *v = NULL;
if (ads_getsym(var, &v) != RTNORM || !v)
{
return RTERROR;
}
if ( v->restype != RTSHORT )
{
ads_relrb(v);
return RTERROR;
}
*res = v->resval.rint;
ads_relrb(v);
return RTNORM;
}
inline int xg_getsym(const TCHAR *var, XPoint *res)
{
resbuf *v = NULL;
if (ads_getsym(var, &v) != RTNORM || !v)
{
return RTERROR;
}
if (v->restype != RT3DPOINT )
{
ads_relrb(v);
return RTERROR;
}
*res = v->resval.rpoint;
ads_relrb(v);
return RTNORM;
}
inline int xg_getsym(LPCTSTR var, XPoint &res)
{
return xg_getsym(var, &res);
}
inline int xg_getsym(const TCHAR *var, double *res)
{
resbuf *v = NULL;
if (ads_getsym(var, &v) != RTNORM || !v)
{
return RTERROR;
}
if (v->restype != RTREAL )
{
ads_relrb(v);
return RTERROR;
}
*res = v->resval.rreal;
ads_relrb(v);
return RTNORM;
}
inline int xg_getsym(const TCHAR *var, TCHAR *res)
{
resbuf *v;
if (ads_getsym(var, &v) != RTNORM || !v)
{
return RTERROR;
}
if (v->restype != RTSTR )
{
ads_relrb(v);
return RTERROR;
}
_tcscpy(res, v->resval.rstring);
ads_relrb(v);
return RTNORM;
}
inline void ftoa(double f, int nPrec, TCHAR *res)
{
XString sFormat;
sFormat << _T("%.") << nPrec << _T("f");
_stprintf(res, sFormat, f);
}
inline XString Point2d2Str(const XPoint &pt)
{
int luprec;
xg_getvar(_T("LUPREC"), &luprec);
XString sFormats;
sFormats << _T("(%.") << luprec << _T("f,%.") << luprec << _T("f)");
return XString(sFormats, pt.x, pt.y);
}
inline XString Point3d2Str(const XPoint &pt)
{
int luprec;
xg_getvar(_T("LUPREC"), &luprec);
XString sFormats;
sFormats << _T("(%.") << luprec << _T("f,%.") << luprec << _T("f,%.") << luprec << _T("f)");
return XString(sFormats, pt.x, pt.y, pt.z);
}
inline XString Dist2Str(double nDist)
{
int luprec;
xg_getvar(_T("LUPREC"), &luprec);
XString sFormat;
sFormat << _T("%.") << luprec << _T("f");
return XString(sFormat, nDist);
}
inline XString Angle2Str(double nAng)
{
int luprec;
xg_getvar(_T("AUPREC"), &luprec);
XString sFormat;
sFormat << _T("%.") << luprec << _T("f");
return XString(sFormat, nAng);
}
inline int TextGeometry(resbuf *textEnt, double *w, double *h)
{
Point lowLeft, upRight;
if (ads_textbox(textEnt, lowLeft, upRight) != RTNORM)
{
return RTERROR;
}
*w = fabs(upRight.x-lowLeft.x);
*h = fabs(upRight.y-lowLeft.y);
return RTNORM;
}
// 改变角度范围在(0~2*PI)
// ang -- 指定源角度
// 返回值 -- 转化结果(0~2*PI)
inline double CT_std_angle(double dAngle)
{
double dAngleTmp = dAngle;
if ( fabs(dAngleTmp - 2.0 * PI) < 1.0E-9 )
{
dAngleTmp = 0.0;
return dAngleTmp;
}
while((dAngleTmp > (PI * 2.0 + 1.0E-9)) || (dAngleTmp < -1.0E-9))
{
if (dAngleTmp < -1.0E-9)
{
dAngleTmp = dAngleTmp + 2.0 * PI;
}
else if (dAngleTmp > (PI * 2.0 + 1.0E-9))
{
dAngleTmp = dAngleTmp - 2.0 * PI;
}
}
return dAngleTmp;
}
// identify a string is null (contains only _T(',') _T(' ') and _T('\t'))
// string -- the specified string
// return:
// 0 -- not null
// 1 -- null
inline int CT_null_string(const TCHAR *string)
{
const TCHAR *p;
p = string;
while(*p != _T('\0'))
{
if (*p != _T(' ') && *p != _T(',') && *p != _T('\t') && *p != _T('\n'))
{
return 0;
}
p++;
}
return 1;
}
//0-PI的角度
inline double CT_acute_angle(double dAngle)
{
dAngle = CT_std_angle(dAngle);
if (dAngle > PI + 1.0E-9)
{
dAngle = 2 * PI - dAngle;
}
return dAngle;
}
// 求向量 pt1->pt2
inline void CT_Vector(ads_point pt1, ads_point pt2, ads_vector result)
{
result[0] = pt2[0] - pt1[0];
result[1] = pt2[1] - pt1[1];
result[2] = pt2[2] - pt1[2];
}
inline int Maximum(int n, int r1, ...)
{
MAX_MIN(max, int);
}
inline double Maximum(int n, double r1, ...)
{
MAX_MIN(max, double);
}
inline int Minimum(int n, int r1, ...)
{
MAX_MIN(min, int);
}
inline double Minimum(int n, double r1, ...)
{
MAX_MIN(min, double);
}
inline XPoint Maximum(int n, class XPoint r1, ...)
{
MAX_MIN(Max, XPoint);
}
inline XPoint Minimum(int n, class XPoint r1, ...)
{
MAX_MIN(Min, XPoint);
}
};
//转为正常观察文字时的角度
inline double AsViewAngle(double ang)
{
double dAngleTmp;
dAngleTmp = XExport::CT_std_angle(ang);
if (dAngleTmp > PI/2.0+0.0001 && dAngleTmp<PI+0.0001)
{
dAngleTmp += PI;
}
else if (dAngleTmp > PI-0.0001 && dAngleTmp < PI*1.5+0.0001)
{
dAngleTmp -= PI;
}
return dAngleTmp;
}
using namespace XExport;
#endif