//-------------------------------------------------------------------------------------------------------+ // 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 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 &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 &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 &lstObjects, LPCTSTR pDxfWizard, int nCmpMethod = 0, LPCTSTR pszBlk = ACDB_MODEL_SPACE); GEOAPI Acad::ErrorStatus GetEntFromBlockByDxf2(DList &lstObjects, LPCTSTR pDxfWizard, int nCmpMethod = 0, LPCTSTR pszBlk = ACDB_MODEL_SPACE); GEOAPI Acad::ErrorStatus GetEntFromBlockByClass(DList &lstObjects,AcRxClass *pClass, int nCmpMethod, const TCHAR *pszBlk,LPVOID pReserve = NULL); GEOAPI Acad::ErrorStatus GetEntFromBlockByClass(DList &lstObjects,AcRxClass *pClass, int nCmpMethod, AcDbObjectId idBlock,LPVOID pReserve = NULL); GEOAPI Acad::ErrorStatus GetEntFromBlockByClass2(DList &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 &lstObjects, AcDbDatabase &db, LPCTSTR pDxfWizard, int nCmpMethod, LPCTSTR pszBlock); //增加了区域判断 GEOAPI Acad::ErrorStatus GetEntityFromDatabase(DList &lstObjects, AcDbDatabase &db, LPCTSTR pDxfWizard, int nCmpMethod, LPCTSTR pszBlock,XPoint ptMin,XPoint ptMax); //无类型匹配 GEOAPI Acad::ErrorStatus GetEntityFromDatabase(DList &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*1.5+0.0001) { dAngleTmp -= PI; } return dAngleTmp; } using namespace XExport; #endif