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

901 lines
25 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//-------------------------------------------------------------------------------------------------------+
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
// = FileName : 内部全局函数实现文件
// = Version : ver2.0
// = Author : tg
// = CreateDate : 2002-09-09
// = Description: 内部全局函数的定义
// = Maintainers:
//
//-------------------------------------------------------------------------------------------------------+
#ifndef _TCHPRIVATEGLOBALFUNC_H_
#define _TCHPRIVATEGLOBALFUNC_H_
#include "dbcfilrs.h"
#ifndef _TADSGEPOINT3D_H_
#include "TADSGePoint3d.h"
#endif
#ifndef _TGGEPOLY2D_H_
#include "TGGePoly2D.h"
#endif
#ifndef _TGGECURVESEGMENT_H_
#include "TGGeCurveSegment.h"
#endif
#ifndef _TMASTERPROPERTIES_H_
#include "TMasterProperties.h"
#endif
#ifndef _TGGIEXPLODEDRAWBASE_H_
#include "TGGiExplodeDrawBase.h"
#endif
#ifndef _TACSTRINGLIST_H_
#include "TACStringList.h"
#endif
#ifndef _TGGETRIANGLE_H_
#include "TGGeTriangle.h"
#endif
#ifndef _TGGEPOLYGONEX_H_
#include "TGGePolygonEx.h"
#endif
#ifndef _TGROUPS_H_
#include "TGroups.h"
#endif
#ifndef _TACDBENTITYPTR_H_
#include "TAcDbEntityPtr.h"
#endif
#ifndef _TACDBFACEPTR_H_
#include "TAcDbFacePtr.h"
#endif
#ifndef _TCHGLOBALFUNC_H_
#include "TchGlobalFunc.h"
#endif
#ifndef _TGGEPOLYDIST_H_
#include "TGGePolyDist.h"
#endif
#include <vector>
#include "pp3d.h"
#if ADS < 16
#include "istream.h"
#endif
class TConfigBase;
class TSortWallOnPt;
namespace TchPrivate
{
// 比较两个id是否相等
GEOAPI int CompareObjectId(const AcDbObjectId *id1, const void *id2);
GEOAPI int CompareObjectId(const AcDbSoftPointerId *id1, const void *id2);
//函数作参数
GEOAPI int CompNodeByEqual(const TSortWallOnPt *p1, const void *p2);
//不判断顶点
GEOAPI int HitTestOnEdge(const AcDbFace *pFace, TADSGePoint3d pt, bool bDiscardHideEdge);
GEOAPI int GetApplicationPath(TCHAR *vPath, HINSTANCE hInstance);
GEOAPI int GetArcData(ads_name arc_ent,ads_point cent,ads_real *rad,ads_real *sang,ads_real *eang);
GEOAPI void FixGsView();
GEOAPI void RemoveDup();
GEOAPI void CircleToPoly(const TGGeCircle &cir, TGGePoly &poly, int nDiv);
GEOAPI void DrawCircle(AcGiWorldDraw *pWd, AcGiViewportDraw *pVd, const TGGeCircle &cir, ads_real nHeight);
GEOAPI void DrawCircle(AcGiWorldDraw *pWd, AcGiViewportDraw *pVd, const TGGeCircle &cir);
GEOAPI void DrawLineSeg(TGGiExplodeDrawBase &dc, const TGGeLine &ln, ads_real nHeight, int bShowStart, int bShowEnd);
GEOAPI void DrawLineSeg(AcGiWorldDraw *pWd, AcGiViewportDraw *pVd, const TGGeLine &ln);
GEOAPI void DrawArcSeg(AcGiWorldDraw *pWd, AcGiViewportDraw *pVd, const TGGeArc &ar);
GEOAPI void DrawArcSeg(TGGiExplodeDrawBase &dc, const TGGeArc &ar,ads_real nHeight, int bShowStart, int bShowEnd);
GEOAPI void AsPolyline(const AcDbLine &line, AcDbPolyline &pline);
GEOAPI void AsPolyline(const AcDbArc &line, AcDbPolyline &pline);
GEOAPI void AsPolyline(const AcDbCircle &line, AcDbPolyline &pline);
GEOAPI void _RemoveDupCurves(TDPtrList<TGGeCurveSegment> &lstCurves);
GEOAPI void RemoveDupNoXData();
GEOAPI void RemoveExactDupLines(TDPtrList<TGGeCurveSegment> &lstCurves);
GEOAPI void ThickPoly2Face(TMasterProperties prop, const TGGePoly2D &poly, TADSGePoint3d vtNormal,
double nThick, AcDbVoidPtrArray &entSet, AcGeMatrix3d *pMatTran = NULL);
GEOAPI int GetPointInArcType(ads_point pt, ads_point cenpt, ads_real rad, ads_real ang1, ads_real ang2);
GEOAPI int PointProjectToLine(ads_point src_pt, ads_point cl_pt1, ads_point cl_pt2, ads_point dest_pt);
GEOAPI int GetPointOnLineType(ads_point pt, ads_point line_pt1,ads_point line_pt2);
//测试PT2在PT0-PT1之哪边:1:左边,2:右边,0:共线
GEOAPI int PtAtWhichSide(const AcGePoint3d& pt0,const AcGePoint3d& pt1,const AcGePoint3d& pt2,double tol = TOL);
GEOAPI int GetPickFirst(TPickEntSet &gSet, TPickEntSet &pSet);
GEOAPI AcGeMatrix3d BlockTransform(const AcDbBlockReference *pInsert);
GEOAPI ads_real GetXDirection(const TGGeCurveSegment &cv1, const TGGeCurveSegment &cv2, const TADSGePoint3d &ptLoc);
GEOAPI int _Subtract(const TGGePoly2D &poly1, const TDPtrList<TGGePoly2D> &lstPoly2, TDPtrList<TGGePoly2D> &lstResult);
GEOAPI TADSGePoint3d GetAutoDelPt(TADSGePoint3d ptRef, TADSGePoint3d pt1, TADSGePoint3d pt2);
GEOAPI double GetPolygonDist(const TGGePolygonEx &poly1, const TGGePolygonEx &poly2);
//判断两线段是否重合
GEOAPI BOOL IsEqual(const AcGePoint3d pt11,const AcGePoint3d pt12,const AcGePoint3d pt21,const AcGePoint3d pt22,double tol = TOL);
//判断由p11-p12与p21-p22所在直线是否重合
GEOAPI BOOL IsOverlap(AcGePoint3d& pt11,AcGePoint3d& pt12,AcGePoint3d& pt21,AcGePoint3d& pt22);
GEOAPI BOOL SkipSubErase(const TCHAR *szCmd);
//构造孔板,即外边界和洞之间区域的三角化。
//失败原因:1、洞或者最外边界不封闭
// 2、边界线相交
// 3、孔中包含有孔
// 4、选择了没有外边界的孔
//自动搜索最外边界
GEOAPI BOOL Triangulate(const TDPtrList<TGGePoly2D> &lstHole,TDPtrList<TGGeTriangle> &lstRes);
//自动搜索最外边界
GEOAPI BOOL Triangulate(const TDPtrList<TGGePolygonEx> &lstHole,TDPtrList<TGGeTriangle> &lstRes);
//给定最外边界
GEOAPI BOOL Triangulate(const TGGePoly2D &out,const TDPtrList<TGGePoly2D> &lstHole,TDPtrList<TGGeTriangle> &lstRes);
//给定最外边界
GEOAPI BOOL Triangulate(const TGGePolygonEx &out,const TDPtrList<TGGePoly2D> &lstHole,TDPtrList<TGGeTriangle> &lstRes);
//给定最外边界
GEOAPI BOOL Triangulate(const TGGePolygonEx &out,const TDPtrList<TGGePolygonEx> &lstHole,TDPtrList<TGGeTriangle> &lstRes);
GEOAPI BOOL IsPointAtSameSide(const AcGePlane& plane, const AcGePoint3d& pt1, const AcGePoint3d& pt2);
GEOAPI PGroups VBuildList(int *);
#if (ADS>15)
//去除EXE中的RT_MANIFEST资源
GEOAPI bool RemoveRT_MANIFEST(const TCHAR* fullPath,int resId);
#endif
GEOAPI TCString OsMode2Str(int nMode);
GEOAPI BOOL SearchPathFromCurve(const TDPtrList<TGGeCurveSegment> &curves, TGGePoly2D &polyPath);
GEOAPI TADSGePoint3d GetTextExtend(AcDbObjectId idTextStyle, const TCHAR *pszText, double nHeight, BOOL penups);
GEOAPI char* TGh3cpy(char *, char *, int);
GEOAPI char* TGh2cpy(char *, char *, int);
GEOAPI void TGh1cpy(char *to, const char *from);
GEOAPI TCHAR *StrDelSpace(const TCHAR *src);
GEOAPI double GetViewportPScale(int cvport);
GEOAPI int ConnectPolygons(TDPtrList<TGGePolygonEx> &lstPolygons, TGGePolygonEx &polyEx1);
GEOAPI int ConnectPolygonsNew(TDPtrList<TGGePolygonEx> &lstPolygons, TGGePolygonEx &polyEx1);
// 判断桥接是否合适,即不和任何边有交点(位于边内)
GEOAPI BOOL IsGoodConnector(const TGGeLine &lnConnector, const TGGePolygonEx &rPolygon);
// 取得连接桥
GEOAPI int GetConnector(const TGGePolygonEx &poly1, const TGGePolygonEx &poly2, TGGeLine &lnConnector);
// 判断桥接是否合适
GEOAPI BOOL IsGoodConnector(const TGGeLine &lnConnector, const TDPtrList<TGGePolygonEx> &lstPolygons, int idxExclude);
// 求两线之间的最短距离// 注: 算法不最优(用排序求最小值)
GEOAPI ads_real MinDistance(const TGGeLine &ln1, const TGGeLine &ln2, TADSGePoint3d &ptInt1, TADSGePoint3d &ptInt2);
// result.nIndex1没有赋值, 留给调用程序赋值// 注: 算法不最优(用排序求最小值)
GEOAPI int MinDistance(TGGeLine &ln1, TGGePolygonEx &poly2, TGGePolyDist &result);
// 请两多边形的最短距离// 注: 算法不最优(用排序求最小值)
GEOAPI int MinDistance(TGGePolygonEx &poly1, TGGePolygonEx &poly2, TGGePolyDist &result);
GEOAPI double GetAnglePrecFromRadius(double radius);
GEOAPI double GetParaPrecFromLength(double length);
GEOAPI bool IsParaInSeg(double pa,double prec);
GEOAPI void PointTransformBy(ads_matrix xform,ads_point pt,ads_point newpt);
GEOAPI ads_real PointDistanceToLine(ads_point pt0, ads_point pt1,ads_point pt2);
GEOAPI Acad::ErrorStatus ReadCurve(AcDbDwgFiler *pFiler, TGGeCurveSegment &seg);
GEOAPI Acad::ErrorStatus ReadCurveList(AcDbDwgFiler *pFiler, TDPtrList<TGGeCurveSegment> &lstSegs);
GEOAPI Acad::ErrorStatus WriteCurve(AcDbDwgFiler *pFiler, const TGGeCurveSegment &seg);
GEOAPI Acad::ErrorStatus WriteCurveList(AcDbDwgFiler *pFiler, const TDPtrList<TGGeCurveSegment> &lstSegs);
GEOAPI TGGeCurveSegment GetMaxCurveAfterClip(const TGGeCurveSegment &cvSource, const TGGePoly2D &sPoly, const TGGePoly2D &ePoly);
GEOAPI TGGeCurveSegment GetCurveContainPointAfterClip(TADSGePoint3d ptPick,const TGGeCurveSegment &cvSource, const TGGePoly2D &sPoly, const TGGePoly2D &ePoly);
template <class K> BOOL CopyObject(const K &src, K &dest)
{
AcDbDeepCloneFiler filer;
BOOL bRet = FALSE;
if (src.dwgOutFields(&filer) == Acad::eOk)
{
filer.seek(0L,0);
bRet = (dest.dwgInFields(&filer) == Acad::eOk);
}
return bRet;
}
GEOAPI int MakeArcWallSeg(TGGiExplodeDrawBase &dc, const TGGeArc &arc, ads_real height, ads_real iDist, ads_real oDist, int bShowStart, int bShowEnd);
GEOAPI void MakeArcWallSeg(TGGiExplodeDrawBase &dc,const TGGeArc &iArc, const TGGeArc &oArc, ads_real height, int bShowStart, int bShowEnd);
GEOAPI void Tessellate(TDPtrList<TGGe3DFace> &lstSectFaces, double xBeg, double nStep, int nDivNum, double nHeight, BOOL bHasTop, BOOL bHasBot, BOOL bHasLeft, BOOL bHasRight);
GEOAPI int AsTriangleFaces(const TGGePolygonEx &polyOut, const TDPtrList<TGGePoly2D> &lstHoles, TDPtrList<TGGe3DFace> &lstFaces);
GEOAPI int AsTriangleFaces(const TGGePoly2D &polyOut, const TDPtrList<TGGePoly2D> &lstHoles, TDPtrList<TGGe3DFace> &lstFaces);
GEOAPI BOOL CreateReference(AcGePoint3d org,CString& BlockTableRecordName,double rotAng,CString layerName = "");
//返回实体所在的层名
GEOAPI CString GetEnityLayer(AcDbObjectId objId);
//构造块名
GEOAPI BOOL BlockName(CString& blockName);
//根据entLst创建块
GEOAPI BOOL CreateBlock(CEntityList& entLst,CString& blockName,AcDbObjectId& blockId,AcGePoint3d org);
//返回层layerName的记录ID
GEOAPI AcDbObjectId GetLayerRecordId(CString layerName);
//只删除C3DFface对象,不删除其AcDbFace对象
GEOAPI void ReleaseC3DFaceList(TAcDbFacePtrList& c3dfaceLst);
//只删除TAcDbEntityPtr对象,不删除其AcDbEntity对象
GEOAPI void ReleaseCEntityList(CEntityList& centityLst);
//将链表中的所有实体的层设置为layerName
GEOAPI void SetLayerOfEntities(CEntityList& entLst,CString layerName, int colorNum = 7);
//层layerName是否存在于数据库中
GEOAPI BOOL IsLayerExistInDb(CString layerName);
//设置层,如果不存在则新建。
GEOAPI BOOL SetLayer(CString layerName, int colorNum = 0);
//新建层layerName。
GEOAPI BOOL NewLayer(CString& layerName, int colorNum = 0, BOOL bFreeze = 0);
//将TAcDbFacePtrList转换为CEntityList
GEOAPI void C3DFaceList2EntityList(TAcDbFacePtrList& c3dFaceLst,CEntityList& entLst);
//将层冻结
GEOAPI BOOL SetLayerFrozen(CString layerName, bool bFreeze = 1);
//将层关闭
GEOAPI BOOL SetLayerOff(CString layerName, bool bOff = 1);
//判断ECS与UCS的Z轴是否平行1:同向平行,2:反向平行;0:不平行
GEOAPI int IsZParalECSAndUcs(AcDbObjectId& objId);
//将点从WCS转换到UCS,bVer = 1:转换矢量
GEOAPI void WCS2UCS(AcGePoint3d& pt,BOOL bVer = 0);
//将点从WCS转换到UCS,bVer = 1:转换矢量
GEOAPI void UCS2WCS(AcGePoint3d& pt,BOOL bVer = 0);
//将点从ECS转换到UCS,bVer = 1:转换矢量
GEOAPI void ECS2UCS(AcGePoint3d& pt,AcDbObjectId& objId,BOOL bVer = 0);
//将点从ECS转换到WCS,bVer = 1:转换矢量
GEOAPI void ECS2WCS(AcGePoint3d& pt,AcDbObjectId& objId,BOOL bVer = 0);
//将点从WCS转换到ECS,bVer = 1:转换矢量
GEOAPI void WCS2ECS(AcGePoint3d& pt,AcDbObjectId& objId,BOOL bVer = 0);
GEOAPI void UCS2ECS(AcGePoint3d& pt,AcDbObjectId& objId,BOOL bVer = 0);
//判断一线段与直线是否重合
GEOAPI BOOL IsOverlap(AcGeLine3d& line1,AcGeLineSeg3d& lineSeg2,const AcGeTol& tol);
//x1\x2是否同号
GEOAPI BOOL IsEqualSign(double x1,double x2);
GEOAPI int TXdataExtract(struct resbuf **rb, int *num);
GEOAPI int TXdataExtract(struct resbuf **rb, ads_real *num);
GEOAPI int TXdataExtractPt(struct resbuf **rb, ads_point pt);
GEOAPI int TXdataExtract(struct resbuf **rb, TCHAR *str);
GEOAPI int TXdataExtractHandle(struct resbuf **rb, TCHAR *str);
GEOAPI int TXdataHandleAssocSingle(ads_name ent, int tag, ads_name assoc_ent);
GEOAPI void SetXdataTagItem(struct resbuf **xdata, int tag, struct resbuf *tag_xdata, const TCHAR *appname);
GEOAPI struct resbuf * GetXdataTagItem(struct resbuf *xdata, int tag, struct resbuf **lagptr);
GEOAPI struct resbuf * DetachXdataTagItem(struct resbuf *xdata, int tag);
GEOAPI int DeleteXdataTagItem(struct resbuf *xdata, int tag);
GEOAPI void AddXdataTagBraces(struct resbuf **tagdata);
GEOAPI int GetAppXdata(ads_name ent, const TCHAR *apps, struct resbuf **entdata, struct resbuf **xdata);
GEOAPI int NewStringResbuf(struct resbuf *ebuf, const TCHAR * str,int code);
GEOAPI int MergeCurve(TGGeCurveSegment &curve, TGGeCurveSegment &seg, int bMinusCurve, int bMinusSeg);
GEOAPI AcDbObject* GetDbConfigObjFromDict(AcDbDictionary *pXDict, AcDb::OpenMode mode);
GEOAPI AcDbObject * GetDwgGlobalObj(AcDb::OpenMode opMode, AcDbDatabase *pDb);
GEOAPI AcDbObjectId InitDynTextStyle();
//不封闭pline的裁剪延伸操作,seg与poly同向同心!
GEOAPI void ModifyXPoly2D(TGGePoly2D& poly,TGGeCurveSegment seg);
GEOAPI void ModifyXPoly2DStart(TGGePoly2D& poly,TGGeCurveSegment seg);
GEOAPI void ModifyXPoly2DEnd(TGGePoly2D& poly,TGGeCurveSegment seg);
GEOAPI void StringToList(const TCHAR *s, TCStringList &res, TCHAR cSep);
GEOAPI int operator == (TCStringList &strs1, TCStringList &strs2);
template <class K>
int TGSetVar(LPCTSTR sym, K val)
{
TGroups g(val);
return ads_setvar(sym, (resbuf *)&g);
}
TConfigBase* GetGlobalConfigBase();
//是否曲线段有效参数
inline bool IsParaInSeg(double pa)
{
return UPEQUAL_ZERO(pa) && DOWNEQUAL_ZERO(pa - 1);
}
inline double GZeroF()
{
return TchGeLib::g_fZero;
}
inline double GZeroA()
{
return TchGeLib::g_angleZero;
}
inline double GZeroD()
{
return TchGeLib::g_distZero;
}
inline void PSpace(int *vpId = NULL)
{
int tileMode;
TGGetVar(_T("TILEMODE"), &tileMode);
if (tileMode)
{
TGSetVar(_T("TILEMODE"), 0);
}
if (vpId)
{
TGGetVar(_T("CVPORT"), vpId);
}
SHads_command(RTSTR, _T("PSPACE"), RTNONE);
}
inline void MSpace(int vpId = 0)
{
SHads_command(RTSTR, _T("MSPACE"), RTNONE);
if (vpId)
{
TGSetVar(_T("CVPORT"), vpId);
}
}
inline resbuf * GetClosedCurveMask()
{
return ads_buildlist(-4, _T("<or"),
-4, _T("<and"),
RTDXF0, _T("POLYLINE,LWPOLYLINE"), 70, 1,
-4, _T("and>"),
RTDXF0, _T("CIRCLE"),
-4, _T("or>"), NULL);
}
inline int GetDist(const TCHAR *szPrmpt, ads_real &r, int nBitFlag = 0)
{
TCString sDist = TchExport::Dist2Str(r);
TchGeLib::adsout << szPrmpt << _T("<") << (LPCTSTR)sDist << _T(">:");
ads_initget(nBitFlag, NULL);
return ads_getdist(NULL, _T(""), &r);
}
inline int GetDist(ads_point ptRef, const TCHAR *szPrmpt, ads_real &r, int nBitFlag = 0)
{
TCString sDist = TchExport::Dist2Str(r);
TchGeLib::adsout << szPrmpt << _T("<") << (LPCTSTR)sDist << _T(">:");
ads_initget(nBitFlag, NULL);
return ads_getdist(ptRef, _T(""), &r);
}
inline TCString LayerId2String(AcDbObjectId id)
{
TCString sName;
if (id.isValid())
{
sName = TchExport::GetSymbolName(id);
}
if (!sName)
{
sName = _T("0");
}
return sName;
}
inline AcDbObjectId LayerString2Id(const TCHAR *psz, AcDbDatabase *pDb = NULL)
{
AcDbObjectId id;
if (psz && _tcscmp(psz, _T("0")) != 0)
{
id = GetLayerIdFromString(psz, pDb);
}
return id;
}
inline Acad::ErrorStatus ReadString(AcDbDwgFiler *pFiler, TCString &sResult)
{
TCHAR *pBuffer = NULL;
pFiler->readString(&pBuffer);
//assert(pBuffer);
if (pBuffer == NULL)
{
sResult = _T("");
}
else
{
sResult = pBuffer;
acdbFree(pBuffer);
}
return Acad::eOk;
}
inline COLORREF GetAcadBackColor()
{
AcColorSettings setAcadColor;
acedGetCurrentColors(&setAcadColor);
return setAcadColor.dwGfxModelBkColor;
}
inline int GetReal(const TCHAR *szPrmpt, ads_real &r, int nBitFlag = 0)
{
TchGeLib::adsout << szPrmpt << _T("<") << r <<_T(">:");
ads_initget(nBitFlag, NULL);
return ads_getreal(_T(""), &r);
}
inline int Release(TGroups *pList)
{
return ads_relrb((struct resbuf*)pList);
}
inline TADSGePoint3d Ucs2Wcs(TADSGePoint3d ptSrc, BOOL bVector = FALSE)
{
TADSGePoint3d ptDest;
TGroups g0(0), g1(1);
ads_trans(ptSrc, (resbuf *)&g1, (resbuf *)&g0, bVector, ptDest);
return ptDest;
}
inline TADSGePoint3d Wcs2Ucs(TADSGePoint3d ptSrc, BOOL bVector = FALSE)
{
TADSGePoint3d ptDest;
TGroups g0(0), g1(1);
ads_trans(ptSrc, (resbuf *)g0, (resbuf *)&g1, bVector, ptDest);
return ptDest;
}
inline TADSGePoint3d Ecs2Wcs(TADSGePoint3d ptSrc, TVector3D vtEcs, BOOL bVector = FALSE)
{
TADSGePoint3d ptDest;
TGroups g0(0), g1(1);
ads_trans(ptSrc, (resbuf *)&g0, (resbuf *)&g0, bVector, ptDest);
return ptDest;
}
inline TADSGePoint3d Wcs2Ecs(TADSGePoint3d ptSrc, TVector3D vtEcs, BOOL bVector = FALSE)
{
TADSGePoint3d ptDest;
TGroups gv(vtEcs), g0(0);
ads_trans(ptSrc, (resbuf *)&g0, (resbuf *)&gv, bVector, ptDest);
return ptDest;
}
inline TADSGePoint3d Ucs2Ecs(TADSGePoint3d ptSrc, TVector3D vtEcs, BOOL bVector = FALSE)
{
TADSGePoint3d ptDest;
TGroups gv(vtEcs), g1(1);
ads_trans(ptSrc, (resbuf *)&g1, (resbuf *)&gv, bVector, ptDest);
return ptDest;
}
inline TADSGePoint3d Ecs2Ucs(TADSGePoint3d ptSrc, TVector3D vtEcs, BOOL bVector = FALSE)
{
TADSGePoint3d ptDest;
TGroups gv(vtEcs), g1(1);
ads_trans(ptSrc, (resbuf *)&gv, (resbuf *)&g1, bVector, ptDest);
return ptDest;
}
inline double Ucs2Wcs(double nAng)
{
TVector3D vtUcs(cos(nAng), sin(nAng));
TVector3D vtWcs = Ucs2Wcs(vtUcs, TRUE);
return ads_angle(TADSGePoint3d(), vtWcs);
}
// 点进行矩阵变换
// 参数:pt:被变换点
// newpt:变换结果
// xform:几何变换矩阵
inline void PointTransformBy(ads_matrix xform,ads_point pt,ads_point newpt)
{
int i,j;
ads_point pt0;
newpt[X] = newpt[Y] = newpt[Z] = 0.0;
Cpoint(pt0, pt);
for (i = X; i <= Z; i++)
{
for (j = X; j <= Z; j++)
{
newpt[i] += xform[i][j] * pt0[j];
}
newpt[i] += xform[i][T];
}
}
inline double Wcs2Ucs(double nAng)
{
TVector3D vtWcs(cos(nAng), sin(nAng));
TVector3D vtUcs = Wcs2Ucs(vtWcs, TRUE);
return ads_angle(TADSGePoint3d(), vtUcs);
}
inline void UcsWorld()
{
SHads_command(RTSTR, _T("UCS"), RTSTR, _T(""), RTNONE);
}
inline void AsureWCS()
{
if(!IsWCS())
{
UcsWorld();
}
}
inline void Refresh_DIST_SNAP()
{
TchGeLib::_DIST_SNAP = TchGeLib::_distSnap * _UNIT_SCALE;
}
inline AcGeMatrix3d & AsAcGeMatrix3d(ads_matrix mat)
{
void *p = mat;
return *(AcGeMatrix3d *)p;
}
inline void AsAdsMatrix(const AcGeMatrix3d &mat1, ads_matrix mat2)
{
memcpy(mat2, &mat1, sizeof(ads_matrix));
}
inline double Rad2Degree(double nRad)
{
return (180.0 * nRad / PI);
}
inline double Degree2Rad(double nDeg)
{
return (nDeg * PI / 180.0);
}
inline BOOL Equal(double val1, double val2, double nSnap)
{
return (fabs(val1 - val2) < nSnap);
}
inline BOOL GreatEqual(double val1, double val2, double nSnap = TchGeLib::_DIST_SNAP)
{
BOOL bRet = (Equal(val1, val2, nSnap) || val1 > val2);
return bRet;
}
inline BOOL LessEqual(double val1, double val2, double nSnap = TchGeLib::_DIST_SNAP)
{
BOOL bRet = (Equal(val1, val2, nSnap) || val1 < val2);
return bRet;
}
inline BOOL LessThan(double val1, double val2, double nSnap = TchGeLib::_DIST_SNAP)
{
return (val1 < val2 && !Equal(val1, val2, nSnap));
}
inline double CalArea3p(const ads_point pt1, const ads_point pt2, const ads_point pt3)
{
ads_real l, l1, l2, l3;
l1 = ads_distance(pt1,pt2);
l2 = ads_distance(pt2,pt3);
l3 = ads_distance(pt3,pt1);
l = (l1 + l2 + l3) / 2.0;
return sqrt(fabs(l * (l - l1) * (l - l2) * (l - l3)));
}
inline BOOL GreatThan(double val1, double val2, double nSnap = TchGeLib::_DIST_SNAP)
{
return (val1 > val2 && !Equal(val1, val2, nSnap));
}
inline BOOL IsMirrorMatrix(ads_matrix mat)
{
TADSGePoint3d ptOrg, ptX(1000, 0), ptY(0, 1000);
ptOrg.TransformBy(mat);
ptX.TransformBy(mat);
ptY.TransformBy(mat);
double nAng = TchExport::AngleRangeTo2PI(ads_angle(ptOrg, ptY) - ads_angle(ptOrg, ptX));
return (fabs(nAng - PI * 1.5) < TchGeLib::_angSnap);
}
inline BOOL IsMirrorMatrix(const AcGeMatrix3d &mat)
{
TADSGePoint3d ptOrg, ptX(1000, 0), ptY(0, 1000);
ptOrg.TransformBy(mat);
ptX.TransformBy(mat);
ptY.TransformBy(mat);
double nAng = TchExport::AngleRangeTo2PI(ads_angle(ptOrg, ptY) - ads_angle(ptOrg, ptX));
return (fabs(nAng - PI * 1.5) < TchGeLib::_angSnap);
}
inline ads_real operator & (const TVector3D & pt1, const TVector3D & pt2)
{
return pt1.x * pt2.x + pt2.y * pt1.y + pt1.z * pt2.z;
}
inline TVector3D operator * (const TVector3D &pt1, const Vector3D &pt2)
{
TVector3D vt;
vt.x = pt1.y * pt2.z - pt1.z * pt2.y;
vt.y = pt1.z * pt2.x - pt1.x * pt2.z;
vt.z = pt1.x * pt2.y - pt1.y * pt2.x;
return vt;
}
inline void SubPoint(ads_point dest, ads_point src)
{
Spoint(dest, dest[0] - src[0], dest[1] - src[1], dest[2] - src[2]);
}
inline void AddPoint(ads_point dest, ads_point src)
{
Spoint(dest, dest[0] + src[0], dest[1] + src[1], dest[2] + src[2]);
}
template <class K>
int TGPutSym(const TCHAR *sym, K val)
{
TGroups g(val);
return ads_putsym(sym, (resbuf *)&g);
}
//将弧度规范到[0,2PI)
//NA(angle) = NA(angle+n*PI2) = NA(angle-n*PI2);
inline double NA(double angle)
{
if (UP_ZEROA(angle))
{
double da = angle - PI2;
if (DOWN_ZEROA(da))
{
return angle;
}
else if (UP_ZEROA(da))
{
return NA(da);
}
else
{
return 0;
}
}
else if (DOWN_ZEROA(angle))
{
return NA(angle + PI2);
}
else
{
return 0;
}
}
//转化为反向角度坐标系中角度[0,2PI)
inline double RA(double a)
{
return NA(-a);
}
//从起始角到终止角的角度,[0,2PI),很接近的角度将返回0!
inline double ALEN(double startAngle,double endAngle)
{
return NA(endAngle - startAngle);
}
//角度包含判断,与端角很接近时将返回true,angleLen>=0!
inline bool AIN(double a,double startAngle,double angleLen)
{
return DOWNEQUAL_ZEROA(ALEN(startAngle,a) - angleLen);
}
// 把一角度变为允许标注的角度值(1,4象限即0~PI/2.0或 3*PI/2.0~0)
inline double ChangeAngleTo1_4(double dAngle)
{
double dang1 = 0.0;
double dSnap = PI / 180.0; //1度
dang1 = TchExport::AngleRangeTo2PI(dAngle);
if (GreatThan(dang1, PI/2.0, dSnap) && LessThan(dang1, PI, dSnap))
{
dang1 += PI;
}
else if (GreatEqual(dang1, PI, dSnap) && LessEqual(dang1, PI*1.5, dSnap))
{
dang1 -= PI;
}
return dang1;
}
// 向量的点积
inline ads_real VectorDotProduct(ads_vector pt1, ads_vector pt2)
{
ads_real result;
result = pt1[0] * pt2[1] + pt2[1] * pt1[1] + pt1[2] * pt2[2];
return result;
}
//快速判断两点是否重合
inline BOOL IsEqual(const AcGePoint3d pt1, const AcGePoint3d pt2,double tol = TOL)
{
if (fabs(pt1.x - pt2.x) < tol && fabs(pt1.y - pt2.y) < tol && fabs(pt1.z - pt2.z) < tol)
{
return 1;
}
else
{
return 0;
}
}
//将点PT从ADS格式转换成ARX格式
inline void Ads2ARXPt(const ads_point pt,AcGePoint3d& retPt)
{
retPt[X] = pt[X];
retPt[Y] = pt[Y];
retPt[Z] = pt[Z];
}
//将点PT从ARX格式转换成ADS格式
inline void ARX2AdsPt(const AcGePoint3d pt,ads_point retPt)
{
retPt[X] = pt[X];
retPt[Y] = pt[Y];
retPt[Z] = pt[Z];
}
//计算pt1与pt2决定的直线与X轴的夹角
inline double AngleToX(AcGePoint3d& pt1,AcGePoint3d& pt2)
{
ads_point ads_pt1,ads_pt2;
ARX2AdsPt(pt1,ads_pt1);
ARX2AdsPt(pt2,ads_pt2);
return acutAngle(ads_pt1,ads_pt2);
}
// 由系统的显示模式和构件的显示类型确定显示方式
//0--NONE; 1--2D; 2--3D; 3--2D&3D;
inline int GetDispMethod(int nDrawMode, int nDrawType)
{
return nDrawMode;
}
//pt是否在pt11-pt12所在线段上
inline BOOL IsOnLineSeg(AcGePoint3d pt11,AcGePoint3d pt12,AcGePoint3d pt,double tol = TOL)
{
AcGeTol tol1;
tol1.setEqualPoint(tol);
AcGeLineSeg3d line(pt11,pt12);
if (line.isOn(pt,tol1))
{
return 1;
}
else
{
return 0;
}
}
inline AcGePoint3d polar(AcGePoint3d& pt0,double ang,double dist)
{
AcGePoint3d pt3d;
ads_point ads_pt,ads_ret;
ARX2AdsPt(pt0,ads_pt);
acutPolar(ads_pt,ang,dist,ads_ret);
Ads2ARXPt(ads_ret,pt3d);
return pt3d;
}
template <class K>
inline int Compare(K n1, K n2)
{
if (n1 > n2)
{
return 1;
}
else if (n1 < n2)
{
return -1;
}
else
{
return 0;
}
}
template<class T> inline void Exchange(T& t1,T&t2)
{
T temp = t1;
t1 = t2;
t2 = temp;
}
template<class T> inline T Min2(T t1,T t2)
{
return t2 < t1 ? t2:t1;
}
template<class T> inline T Max2(T t1,T t2)
{
return t2 > t1 ? t2 : t1;
}
};
using namespace TchPrivate;
#endif