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

874 lines
32 KiB
C++

//-------------------------------------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : 导出全局函数头文件
// = Version : ver2.0
// = Author : lfy
// = CreateDate : 2002-09-09
// = Description: 全局函数的声明
// = Maintainers:
//
//-------------------------------------------------------------------------------------------------------+
#ifndef _TCHGLOBALFUNC_H_
#define _TCHGLOBALFUNC_H_
#ifndef _TACSTRING_H_
#include "TACString.h"
#endif
#ifndef _TWCSTRING_H_
#include "TWCString.h"
#endif
#ifndef _TACSTRINGLIST_H_
#include "TACStringList.h"
#endif
#ifndef _TWCSTRINGLIST_H_
#include "TWCStringList.h"
#endif
#ifndef _TPICKENTSET_H_
#include "TPickEntSet.h"
#endif
#ifndef _TADSGEPOINT3D_H_
#include "TADSGePoint3d.h"
#endif
#ifndef _TMASTERPROPERTIES_H_
#include "TMasterProperties.h"
#endif
#include "dbltrans.h"
class TEntityBase;
namespace TchExport
{
static TADSGePoint3d g_ptBase; // UCS
GEOAPI int MoveSamplerStatic(ads_point pt0, ads_matrix mat);
// 实体添加到模型空间或页面空间
//modify by xlc 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, TADSGePoint3d &ptMax);
// 对一个文件转换代码页, 只能转R10~R14版本
GEOAPI int ConvertDwgCodePage(const TCHAR *tmpFile);
GEOAPI CView* GetCurDwgView();
GEOAPI BOOL IsDigital(const TCHAR *pStr);
#if ADS > 15
// 是否找到 manifest 资源
GEOAPI bool FindRT_MANIFEST();
#endif
GEOAPI void ArxZoomCursor(TADSGePoint3d 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(TPickEntSet &ss, const TCHAR *pszPrompt, const TADSGePoint3d &ptBase, TADSGePoint3d &ptFinal);
GEOAPI int DragMovePickSet(TPickEntSet &ss, const TCHAR *pszPrompt, const TADSGePoint3d &ptBase, TADSGePoint3d &ptFinal,const TCHAR* sKeyword);
GEOAPI int DragRotatePickSet(TPickEntSet &ss, const TCHAR *pszPrompt, TADSGePoint3d ptBase);
// 用于不带橡皮筋的移动
GEOAPI int DragPickSet(TPickEntSet &ss, TADSGePoint3d &ptBase);
// 用于带橡皮筋的复制
GEOAPI int DragPickSet1(TPickEntSet &ss, TADSGePoint3d &ptBase);
GEOAPI Acad::ErrorStatus ExplodeBlockRef(const AcDbBlockTableRecord &blockRec, const AcGeMatrix3d &mat, AcDbVoidPtrArray &entSet);
GEOAPI TCString GetTempFileName(const TCHAR *pExt);
GEOAPI BOOL GetWcsCursor(TADSGePoint3d &ptLoc);
GEOAPI TADSGePoint3d GetCursorWcs();
GEOAPI int ExpInsertDwg(const TCHAR *pszDwg, TADSGePoint3d ptInsert);
GEOAPI int ExpInsertDwg(const TCHAR* pszDwg,TADSGePoint3d ptBase,TADSGePoint3d ptMin,TADSGePoint3d ptMax,TADSGePoint3d ptInsert);
GEOAPI void PostCommand(const TCHAR *str, bool bEcho = false);
GEOAPI BOOL IsKeyPressed(int vk);
GEOAPI int GetBlockExtents(AcDbObjectId idBlock, TADSGePoint3d &ptLow, TADSGePoint3d &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, TCString &sDwb, TCString &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(TPickEntSet &ss, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp, const TCHAR *szDxf,BOOL bRealCornerSel = FALSE);
GEOAPI Acad::ErrorStatus GetSafeSelection(TPickEntSet &ss, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp, const AcRxClass *pClass,BOOL bRealCornerSel = FALSE);
// 安全方式开窗口搜索选择集,以arIDs方式返回[lfy 2011-1-17]
GEOAPI Acad::ErrorStatus GetSafeSelection(AcDbObjectIdArray &arIDs, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp, const TCHAR *pDxfWizard,AcDbObjectId idBlock,BOOL bRealCornerSel = FALSE);
// 安全方式开窗口搜索选择集,以arIDs方式返回[lfy 2011-1-17]
GEOAPI Acad::ErrorStatus GetSafeSelection(AcDbObjectIdArray &arIDs, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp, const AcRxClass *pClass,AcDbObjectId idBlock,BOOL bRealCornerSel = FALSE);
GEOAPI Acad::ErrorStatus GetSafeSelection(TPickEntSet &ss, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp, const AcRxClass *pClass,AcDbObjectId idBlock);
GEOAPI Acad::ErrorStatus GetSafeSelectionEx(TPickEntSet &ss, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp, const AcRxClass *pClass);
GEOAPI Acad::ErrorStatus GetSafeSelectionEx(TPickEntSet &ss, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp, const AcRxClass *pClass,AcDbObjectId idBlock);
GEOAPI Acad::ErrorStatus GetSafeSelection(TPickEntSet &ss, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp,TDPtrList<AcRxClass> &lstClass, AcDbObjectId idLayer);
// sg add 120305,仿照上面的函数,增加一种类型的接口,解决ARX2013下的编译错误问题
GEOAPI Acad::ErrorStatus GetSafeSelection(TPickEntSet &ss, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp,const CStringArray &aryDxfName, AcDbObjectId idLayer);
// 当前工作集搜索选择集
GEOAPI Acad::ErrorStatus GetSafeSelection2(TPickEntSet &ss, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp, const TCHAR *szDxf);
GEOAPI Acad::ErrorStatus GetSafeSelection2(TPickEntSet &ss, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp, const AcRxClass *pClass);
GEOAPI Acad::ErrorStatus GetSafeSelection2(TPickEntSet &ss, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp, const AcRxClass *pClass,AcDbObjectId idBlock);
GEOAPI Acad::ErrorStatus GetSafeSelection2(TPickEntSet &ss, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp,TDPtrList<AcRxClass> &lstClass, AcDbObjectId idLayer);
GEOAPI Acad::ErrorStatus GetSafeSelectionEx2(TPickEntSet &ss, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp, const AcRxClass *pClass);
GEOAPI Acad::ErrorStatus GetSafeSelectionEx2(TPickEntSet &ss, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp, const AcRxClass *pClass,AcDbObjectId idBlock);
//当前视觉空间的图元选择,遇到块引用,选择块对应的rec 中实体[lfy 2011-1-17]
GEOAPI Acad::ErrorStatus GetViewSafeSelection(AcDbObjectIdArray &arIDs, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp,const TCHAR* pszDxf,BOOL bRealCornerSel = FALSE);
GEOAPI Acad::ErrorStatus GetViewSafeSelection(AcDbObjectIdArray &arIDs, BOOL bCrossing, const TADSGePoint3d &ptLow, const TADSGePoint3d &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 ConstructMatrix(const TADSGePoint3d &ptBase, const TADSGePoint3d &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(TDPtrList<AcDbObjectId> &lstObjects, LPCTSTR pDxfWizard, int nCmpMethod = 0, LPCTSTR pszBlk = ACDB_MODEL_SPACE);
GEOAPI Acad::ErrorStatus GetEntFromBlockByDxf2(TDPtrList<AcDbObjectId> &lstObjects, LPCTSTR pDxfWizard, int nCmpMethod = 0, LPCTSTR pszBlk = ACDB_MODEL_SPACE);
GEOAPI Acad::ErrorStatus GetEntFromBlockByClass(TDPtrList<AcDbObjectId> &lstObjects,AcRxClass *pClass, int nCmpMethod, const TCHAR *pszBlk,LPVOID pReserve = NULL);
GEOAPI Acad::ErrorStatus GetEntFromBlockByClass(TDPtrList<AcDbObjectId> &lstObjects,AcRxClass *pClass, int nCmpMethod, AcDbObjectId idBlock,LPVOID pReserve = NULL);
GEOAPI Acad::ErrorStatus GetEntFromBlockByClass2(TDPtrList<AcDbObjectId> &lstObjects,AcRxClass *pClass, int nCmpMethod, AcDbObjectId idBlock,LPVOID pReserve = NULL);
//从当前DWG的模型空间中选取指定的实体
// lstObjects--结果; pDxfWizard--实体DXF类型的过滤;
// nCmpMethod--比较方法, 采用匹配(asd_match)还是相等(stricmp)
GEOAPI Acad::ErrorStatus GetEntByDxf(TPickEntSet &lstObjects, LPCTSTR pDxfWizard, int nCmpMethod=0);
GEOAPI Acad::ErrorStatus GetEntByDxf2(TPickEntSet &lstObjects, LPCTSTR pDxfWizard, int nCmpMethod=0);
//得到块内可见对象
GEOAPI void GetVisibleEnts(AcDbObjectIdArray &idArray,AcDbObjectId idBlock=AcDbObjectId::kNull,bool bTEntityBaseCast = false,LPVOID pReserv = NULL);
// nCmpMethod: 0--Use stricmp; 1--Use ads_TWcmatch
GEOAPI Acad::ErrorStatus GetEntityFromDatabase(TDPtrList<AcDbObjectId> &lstObjects, AcDbDatabase &db, LPCTSTR pDxfWizard, int nCmpMethod, LPCTSTR pszBlock);
//增加了区域判断
GEOAPI Acad::ErrorStatus GetEntityFromDatabase(TDPtrList<AcDbObjectId> &lstObjects, AcDbDatabase &db, LPCTSTR pDxfWizard, int nCmpMethod, LPCTSTR pszBlock,TADSGePoint3d ptMin,TADSGePoint3d ptMax);
//无类型匹配
GEOAPI Acad::ErrorStatus GetEntityFromDatabase(TDPtrList<AcDbObjectId> &lstObjects, AcDbDatabase &db, const TCHAR *pszBlock,TADSGePoint3d ptMin,TADSGePoint3d ptMax);
// 把象素值换算到WCS下的坐标尺寸
GEOAPI double PixelToWcs(int nPixel);
// 得到耙区在WCS下的大小
GEOAPI double GetApertureWcs();
// 得到拾取框的大小
GEOAPI double GetPickBoxWcs();
// 确保ptLow(左下), ptUp(右上)指定的区域在当前视图的显示范围内
// 根据需要进行ZOOM, 以便可以开窗口ssget
GEOAPI Acad::ErrorStatus AssureInCurrentView(const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp);
// 用arx的方法进行ZOOM, 不通过COMMAND接口
GEOAPI Acad::ErrorStatus ArxZoom(const TADSGePoint3d &ptLow, const TADSGePoint3d &ptUp);
GEOAPI Acad::ErrorStatus ArxZoomTo(const TADSGePoint3d &ptCen, double nWidth, double nHeight);
GEOAPI Acad::ErrorStatus ArxPan(const TADSGePoint3d &vtPan);
// 取字样的默认尺寸, 已经根据图纸比例换算成为模型空间的尺寸
GEOAPI double GetTextSize(const TCHAR *m_sTextStyle);
// 获取图块插入的参数
// pBlk(IN)--图块插入; ptBase--基点; nRot--转角
// ptCen--包络中心; nSizeX, nSizeY, nSizeZ--图块尺寸
GEOAPI int GetBlockRefSizeInfo(const AcDbBlockReference *pBlk, TADSGePoint3d &ptBase, double *nRot,TADSGePoint3d &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(TEntitySet &ent, TPickEntSet &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 TEntitySet &ent, ads_matrix mat);
//获取文字实体的边框
GEOAPI int TextGeometry(TEntitySet & textEnt, ads_point cen,double *w, double *h, double *ang);
GEOAPI int TextGeometry(const TCHAR *text, double *w);
GEOAPI int HandleCurveDup(TPickEntSet &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 GetPickPoint(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 TCString GetSymbolName(const AcDbObjectId idSymbolRec);
GEOAPI TCString GetTempSymbolName(const TCHAR *symb);
GEOAPI TCString 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, TPickEntSet &ss, TADSGePoint3d 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 xlc on 101118 由对象的id获得对象ownerId,返回值为ownerId
GEOAPI AcDbObjectId GetOwnerIdFromId(AcDbObjectId idObj);
GEOAPI int GetViewport(int vp, class TEntitySet &res);
GEOAPI AcDbObjectId GetMSpaceId(AcDbDatabase *pDb=NULL);
GEOAPI void GetSearchPath(TCStringList &lstSearchPath);
GEOAPI int GetFileDia(TCString &fullName, int nFlag, const TCHAR *ext, const TCHAR *title);
GEOAPI void MakeFullPath(const TCHAR *pExt, TCString &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 TADSGePoint3d &ptLow, const TADSGePoint3d &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 InverseMatrix3d(double *A, int order, double ep);
// 三点确定的平面法向量
GEOAPI int PlaneNormalBy3Pt(const ads_point pt1, const ads_point pt2,const ads_point pt3, ads_vector result);
// 由点和法向量计算平面的标准方程, 得到plan--存储平面的标准参数
GEOAPI int GetPlaneEquation(const ads_point pt, const ads_vector vt,struct STPlanePara *plan);
// 求线与平面的交点
GEOAPI int LineIntersectWithPlaneA(const ads_point pt1, const ads_point pt2,const struct STPlanePara *plan, ads_point result);
GEOAPI int LineIntersectWithPlaneB(const ads_point pt1, const ads_vector vt,const struct STPlanePara *plan, ads_point result);
// 点到平面的投影
GEOAPI int PointProjectToPlane(const ads_point pt, const struct STPlanePara *plan,ads_point qt);
// 改变向量格式从点格式到长度,角度格式
GEOAPI int Vector3dToPolarCoord(const ads_point vt, double *direct, double *dist);
// 求两向量的夹角
GEOAPI double Vector3dAngleTo(ads_vector pt1, ads_vector pt2);
// 去除文件名的路径, 不改变 FileName 如: FileName = _T("d:\abc\exam.dat"), 返回 _T("exam.dat")
GEOAPI TCHAR * GetFileName(TCHAR *FileName);
// 清除字符数组
GEOAPI void StringBufferMemset(char *strbeg, int strsize);
// Copy file from f1 to f2
GEOAPI int CopyFileTo(const TCHAR *f1, const TCHAR *f2);
//INI 操作:
GEOAPI int GetIniFileValueB(FILE *fp,const TCHAR *topic,const TCHAR *item_id,TCHAR *item_value);
GEOAPI int GetIniFileValueA(const TCHAR *ini_file,const TCHAR *topic,const TCHAR *item_id,TCHAR *item_value);
GEOAPI TCHAR *GetIniBuferValueByKey(const struct STIniStruct *buf, const TCHAR *desc_handle);
GEOAPI int GetIniFileToIniBufer(const TCHAR *ini_file,const TCHAR *topic,struct STIniStruct **res);
GEOAPI int GetIniStringItem(const TCHAR *string, int i, TCHAR *item);
GEOAPI TCHAR *GetStringAtIndex(const TCHAR *string, int i, TCHAR *item);
GEOAPI int SetIniFileValue(const TCHAR *ini_file,const TCHAR *topic,const TCHAR *item_id,const TCHAR *item_value);
GEOAPI int SetIniFileValueB(const TCHAR *ini_file,const TCHAR *topic,const struct STIniStruct *desc);
// 释放 INI描述链表
GEOAPI int FreeIniBuffer(struct STIniStruct *res);
// int变字符, 3 --> _T("3").
GEOAPI int IntToString(int num, TCHAR *nn);
// 改变字符串长度
GEOAPI int StringExtend(TCHAR *str, int len);
// change a string to alphabet string
GEOAPI int StringToUpperOrLower(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, TCStringList &lstSubDirs);
GEOAPI int FindFile(const TCHAR *sDbfPath);
GEOAPI void FindFiles(const TCHAR *sDir, const TCHAR *sFilter, TCStringList &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 TEntitySet & insertEnt, ads_matrix result);
GEOAPI void MatrixMultiply(ads_matrix result, ads_matrix m1, ads_matrix m2, ...);
GEOAPI void CalTransformMatrix(const TADSGePoint3d &base, TVector3D scl, double rot,const TADSGePoint3d &insPt, ads_matrix result);
GEOAPI void ConstructMatrix(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 *StrchrNew(const char *string, int c,bool bToFile=true);
GEOAPI wchar_t *WStrchrNew(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 GetCurDate(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, TCStringList &res);
GEOAPI Acad::ErrorStatus ExplodeAcis(const AcDbEntity *pEnt, AcDbVoidPtrArray &entSet);
GEOAPI double GetBulgeBy3Pt(const AcGePoint3d& ptStart, const AcGePoint3d& ptEnd, const AcGePoint3d& ptSample);
GEOAPI int IsArxAppLoaded(const TCHAR * AppName);
GEOAPI int ReverseMatrix3D(const ads_matrix mat, ads_matrix amat);
GEOAPI int GetScreenCorner(ads_point lowerpt, ads_point upperpt);
GEOAPI int GetScreenSize(double *width, double *height);
GEOAPI int GetNewBlockName(const TCHAR *prefix, TCHAR *blk_name);
GEOAPI void GetCurDwgFileName(TCHAR *curDwg);
GEOAPI struct resbuf *GetResbufAtCode(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 EntToMove(ads_name ssname, ads_point bpt, ads_point res);
GEOAPI int EntToScale(ads_name ssname, ads_point bpt, double *res);
GEOAPI int EntToRotate(ads_name ssname, ads_point bpt, double *res);
GEOAPI struct resbuf *LinkResbufList(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 SetToRotationMatrix(double rotAngle, ads_matrix rotMat);
// 初始化单位矩阵
GEOAPI void SetToIdentityMatrix(ads_matrix id);
// 根据变换点初始化矩阵 Tx: X轴方向变换距离
GEOAPI void SetToTranslationMatrix(ads_matrix tran,double Tx,double Ty,double Tz);
GEOAPI int SetToProductMatrix(ads_matrix mat1, ads_matrix mat2, ads_matrix result);
// 把 pt绕 base旋转 ang 弧度后的结果放回 pt
GEOAPI void PointToRotation(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, TPickEntSet &ss);
GEOAPI int MakeGroup(TPickEntSet &ss, const TCHAR *pGroupName, BOOL bClearOld);
// sg add 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,TADSGePoint3d ptBase,TADSGePoint3d ptMin,TADSGePoint3d ptMax,TADSGePoint3d ptInsert);
//删除模型空间包围盒外的内容
GEOAPI Acad::ErrorStatus EraseEntityFromDatabase(AcDbDatabase &db,TADSGePoint3d ptMin,TADSGePoint3d ptMax);
GEOAPI void MakeVisible(TPickEntSet &ss, bool bTrue);
GEOAPI BOOL IsValidPath(const TCHAR *szPath);
GEOAPI BOOL AsStdPath(TCString &sPath);
GEOAPI BOOL arxWBlock(TPickEntSet &ss, const TCHAR* szFileName, TADSGePoint3d 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 ADS > 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);
inline TCString Int2Char8(unsigned nIndex)
{
TCString sIndex(_T("%d"), nIndex);
size_t nLen = _tcslen(sIndex);
TCString 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 TGGetVar(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 TGGetVar(const TCHAR *var, TADSGePoint3d *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 TGGetVar(LPCTSTR var, TADSGePoint3d &res)
{
return TGGetVar(var,&res);
}
inline int TGGetVar(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 TGGetVar(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 TGGetVar(const TCHAR *var, TCString *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 TGGetSym(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 TGGetSym(const TCHAR *var, TADSGePoint3d *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 TGGetSym(LPCTSTR var, TADSGePoint3d &res)
{
return TGGetSym(var, &res);
}
inline int TGGetSym(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 TGGetSym(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)
{
TCString sFormat;
sFormat << _T("%.") << nPrec << _T("f");
_stprintf(res, sFormat, f);
}
inline TCString Point2d2Str(const TADSGePoint3d &pt)
{
int luprec;
TGGetVar(_T("LUPREC"), &luprec);
TCString sFormats;
sFormats << _T("(%.") << luprec << _T("f,%.") << luprec << _T("f)");
return TCString(sFormats, pt.x, pt.y);
}
inline TCString Point3d2Str(const TADSGePoint3d &pt)
{
int luprec;
TGGetVar(_T("LUPREC"), &luprec);
TCString sFormats;
sFormats << _T("(%.") << luprec << _T("f,%.") << luprec << _T("f,%.") << luprec << _T("f)");
return TCString(sFormats, pt.x, pt.y, pt.z);
}
inline TCString Dist2Str(double nDist)
{
int luprec;
TGGetVar(_T("LUPREC"), &luprec);
TCString sFormat;
sFormat << _T("%.") << luprec << _T("f");
return TCString(sFormat, nDist);
}
inline TCString Angle2Str(double nAng)
{
int luprec;
TGGetVar(_T("AUPREC"), &luprec);
TCString sFormat;
sFormat << _T("%.") << luprec << _T("f");
return TCString(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 AngleRangeTo2PI(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 NullString(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 AngleRangeToPI(double dAngle)
{
dAngle = AngleRangeTo2PI(dAngle);
if (dAngle > PI + 1.0E-9)
{
dAngle = 2 * PI - dAngle;
}
return dAngle;
}
// 求向量 pt1->pt2
inline void Vector3dFrom2Pt(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 TADSGePoint3d Maximum(int n, class TADSGePoint3d r1, ...)
{
MAX_MIN(Max, TADSGePoint3d);
}
inline TADSGePoint3d Minimum(int n, class TADSGePoint3d r1, ...)
{
MAX_MIN(Min, TADSGePoint3d);
}
};
//转为正常观察文字时的角度
inline double AsViewAngle(double ang)
{
double dAngleTmp;
dAngleTmp = TchExport::AngleRangeTo2PI(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 TchExport;
#endif