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

1210 lines
37 KiB
C++

//-----------------------------------------------------------------------------+
// Copyright (C), 1998-2007, SH Software Co. Ltd.
// = FileName : TchGlobalDef.h
// = Version : ver2.0
// = Author :
// = CreateDate : 2002-09-09
// = Description: 全局定义宏
// = Maintainers:
//
//-----------------------------------------------------------------------------+
#ifndef _XGLOBALDEF_H_
#define _XGLOBALDEF_H_
#include "xarchmatchprop.h"
#define _AEC_VERSION 8
#define NEW_GEOMETRY
#define LEFT 1
#define RIGHT 2
#define BOTTOM 4
#define TOP 8
#define REWIND 1
#define CONTINUE 0
#define DRAW_2D 0x01
#define DRAW_3D 0x02
//Intersect
#define INT_NULL 0 //不相交
#define INT_1PT 1 //交于1点
#define INT_2PT 2 //交于2点
#define INT_LINE 10 //交于线
#define INT_CIRCLE 11 //交于圆
#define INT_PLANE 12 //交于平面
#define GR_OUT 0x00000000 //not include
#define GR_IN 0x00000001 //include
#define GR_LEFT 0x00000002 //for curve
#define GR_RIGHT 0x00000004 //for curve
#define GR_INSIDE 0x00000002 //for close curve and close plane
#define GR_OUTSIDE 0x00000004 //for close curve and close plane
#define GR_DOWN 0x00000002 //for plane
#define GR_UP 0x00000004 //for plane
#define GR_EDGE 0x00000008 //for GRegion2D
#define GR_HOLE 0x00000010 //forGRegion2D
extern GEOAPI BOOL DocGetCurMeterUnitDraw();
#define g_bMeterUnitDraw DocGetCurMeterUnitDraw()
//系统单位相对于毫米的数值比例
#define _UNIT_SCALE (g_bMeterUnitDraw ? 0.001 : 1.0)
//把MM单位换算为系统单位
#define _AS_SYS_UNIT(nMM) (nMM * _UNIT_SCALE)
//把系统的距离单位换算为毫米
#define _AS_MM(nDist) ((nDist) / _UNIT_SCALE)
//把系统的距离单位换算为米
#define _AS_METER(nDist) (_AS_MM(nDist) / 1000.0)
//把系统的面积单位换算为平方米
#define _AS_SQMETER(nArea) ((nArea) / (1000.0 * _UNIT_SCALE) / (1000.0 * _UNIT_SCALE))
//把系统的体积单位换算为立方米
#define _AS_CUMETER(nVolume) ((nVolume) / (1000.0 * _UNIT_SCALE) / (1000.0 * _UNIT_SCALE) / (1000.0 * _UNIT_SCALE))
#define MAX_MIN(mn, type) \
{ \
va_list vlst; \
va_start(vlst, r1); \
type res = r1; \
for(int i = 0; i < n-1; i++) { \
type r = va_arg(vlst, type); \
res = mn(res, r); \
} \
va_end(vlst); \
return res; \
}
#ifdef _UNICODE
#define TString UString
#define CmpLabel UCmpLabel
#define _US(s) s
#define _AS(s) AString(s).GetBuffer()
#else
#define TString AString
#define CmpLabel ACmpLabel
#define _US(s) UString(s).GetBuffer()
#define _AS(s) s
#endif/*_UNICODE*/
#ifdef _UNICODE
#define XString XWString
#define tstrchr_new wstrchr_new
#define tstrnew wstrnew
#define XStringList XWStringList
#else
#define XString XAString
#define tstrchr_new strchr_new
#define tstrnew strnew
#define XStringList XAStringList
#endif/*_UNICODE*/
#define OBJ_DELETE 0x01
#define OBJ_APPEND 0x02
#define OBJ_CHANGE 0x04
#define DRAGGER
#define LAY_MASK _T("_AEC_MASK")
#define MXYZ 0
#define SXYZ 1
#define RX 2
#define RY 3
#define RZ 4
#define NOP 5
#define EXIT 6
#define MAXBUFSIZE 1000
#define printf ads_printf
#undef putchar
#define putchar(c) ads_printf(_T("%c"), c)
#define PACKSIZE 8192 //data divided to segment of 2048 bytes
#define COMPRESSFLAG "AS LZW 1.0 "
#define HEADLENGTH 40 // file head is 40 bytes
#define SUCCEED 0 //return flag to note succeed operation
#define NOMEMORY 1 //can not alloc enough memory
#define WRONGDATA 2 //input file has wrong data
#define ILLFORMAT 3 //can decompress only our file format
#define NOCONTENT 4
#if (ARX>15)
#define _ios std::ios_base
#else
#define _ios ios
#endif
//鼠标感应对象
#define g_entMouseOn DocGetEntMouseOn()
//当前选择集(如果实际选择为空,则是g_entMouseOn)
#define g_ssPickFirst DocGetPickFirst()
#define CT_RealEqual(num1, num2, prec) (fabs((num1) - (num2)) < (prec))
#define CT_RevDrt(drt) (CT_std_angle((drt) + PI))
#define CT_IsExactSameDrt(drt1,drt2,prec) ((fabs(CT_std_angle((drt1) - (drt2))) < prec || fabs(CT_std_angle((drt2) - (drt1))) < prec) ? 1:0)
#define CT_IsSameDrt(drt1, drt2, prec) (fabs(sin((drt1) - (drt2))) < prec? 1 : 0)
#define CT_IsOrthDrt(drt1, drt2, prec) (fabs(cos((drt1) - (drt2))) < prec? 1 : 0)
#define AS_INT(f) (f < 0.0 ? int((f) - 0.5) : int((f) + 0.5))
#define OS_NON 0
#define OS_END 1
#define OS_MID 2
#define OS_CEN 4
#define OS_NOD 8
#define OS_QUA 16
#define OS_INT 32
#define OS_INS 64
#define OS_PER 128
#define OS_TAN 256
#define OS_NEA 512
#define OS_QUI 1024
#define OS_APP 2048
#define XD_INT 1070
#define XD_REAL 1040
#define XD_POINT 1010
#define XD_STR 1000
#define XD_HANDLE 1005
#define ELEMENTS(array) (sizeof(array) / sizeof((array)[0]))
#define Spoint(pt, x, y, z) {pt[0] = (x); pt[1] = (y); pt[2] = (z);}
#define Cpoint(to, from) {to[0] = from[0]; to[1] = from[1]; to[2] = from[2];}
#define Midpoint(p1, p2, dest) \
{ \
dest[0] = (p1[0] + p2[0]) / 2.0; \
dest[1] = (p1[1] + p2[1]) / 2.0; \
dest[2] = (p1[2] + p2[2]) / 2.0; \
}
#define NOT_FOUND -1
#define g_bCtrlPressed IsKeyPressed(VK_CONTROL)
#define g_bShiftPressed IsKeyPressed(VK_SHIFT)
#define g_bAltPressed IsKeyPressed(VK_MENU)
#define CMD_LAYER _T("-LAYER")
#define ANORM(expr) \
{ \
int nRetCode=expr; \
assert(nRetCode==RTNORM); \
}
#define BLOCK_SWAP _T("_$001$_")
#define _REF_EDIT_PATCH
//PickSet& DocGetPickFirst();
#define g_ssPickFirst DocGetPickFirst()
#define INITGET_BEG(nFlag, szKeyTable) { XExport::InitGetBegin(nFlag, szKeyTable);
#define INITGET_END() XExport::InitLocalMsg(FALSE); }
#define AS_OPENPOLY(polyRail) \
{\
ASSERT(polyRail.IsClosed()); \
polyRail.SetFlag(0); \
polyRail.AppendNode(*polyRail.Head()); \
}
#define Q_YES 1
#define Q_NO 0
#define LAYSTAT_ON 0x01
#define LAYSTAT_OFF 0x02
#define LAYSTAT_THAW 0x04
#define LAYSTAT_FREEZE 0x08
#define LAYSTAT_UNLOCK 0x10
#define LAYSTAT_LOCK 0x20
#define LAYSTAT_CURRENT 0x40
//插入图块的高级方法
#define IBF_ROT90 0x01 //转90度
#define IBF_MIRLR 0x02 //左右翻转
#define IBF_MIRUD 0x04 //上下翻转
#define IBF_FRAME 0x08 //改外框
#define IBF_ROTATE 0x10 //改转角
#define IBF_BASEPT 0x20 //改基点
#define IBF_RESEL 0x40 //重选择图块
#define IBF_MINSERT 0x80 //多重插入
#define IBF_SCALE 0x800 //改比例
#define IBF_TINSERT 0x100 //$图块
#define IBF_ALIGN 0x200
#define IBF_MULTVIEW 0x400 //多视图
#define acdbSetCurrentView acedSetCurrentView
// For extended data tag_code base
#define EX_INT 11000
#define EX_REAL 11100
#define EX_STRING 11200
#define EX_HANDLE 11300
#define EX_STRUCT 11400
#define EX_END 11500
#define EX_NEW 20000
#define EX_BIND 20000
// For extended data group code
#define XD_SHORT 1070
#ifndef __XDATA_H
#define XD_STR 1000
#define XD_REAL 1040
#define XD_LONG 1071
#define XD_POINT 1010
#define XD_HANDLE 1005
#endif
// For PickSet flag
#define SS_CREATE 0x01
#define SS_FREE 0x02
#define SS_MARK 0x04
//#define fabs __GEOM_FABS
// offset side偏移
#define OFFSET_LEFT 0
#define OFFSET_RIGHT 1
// line style 线形
#define LS_FINITE 1
#define LS_INFINITE 0
// position realationship 位置关系
#define PR_OUTSIDE 0
#define PR_ONPT1 1
#define PR_ONCIRCLE 1
#define PR_ONPT2 2
#define PR_INSIDE 3
#define PR_EXTEND 4
#define PR_EDGE 5
#define PR_INTERS 6
#define LINE_SEGMENT (RTNORM + 1)
#define ARC_SEGMENT (RTNORM + 2)
#define FLAG_UNNORMAL 0x10
#define FLAG_TRIANGLE 0x20 //此时0、3两点相等
#define SIDE1_INVISIBLE 0x01
#define SIDE2_INVISIBLE 0x02
#define SIDE3_INVISIBLE 0x04
#ifndef W_CURVE_MESH_H
#define W_CURVE_MESH_H
#endif
#define VISITED12 0x01
#define VISITED21 0x02
#define INVALID_EDGE 0x04
#define DUP_EDGE 0x08
#define CMP_SENSITIVE 0
#define CMP_INSENSITIVE 1
#define CMP_MATCH 2
#define FLAG_READ 0
#define FLAG_WRITE 1
#define FLAG_APPEND 2
#define FLAG_DELETE 3
#define FLAG_PACK 4
//词典操作宏,数据类型
#define TYPE_WDictItem -1
#define TYPE_WDict 0
#define TYPE_WBoolItem 1
#define TYPE_WCharItem 2
#define TYPE_WLongItem 3
#define TYPE_WDoubleItem 4
#define TYPE_WCStringItem 5
#define TYPE_WSelectItem 6
//打开dict
#define OPEN_DICT(dict) \
{\
WDict*pCurSubDict=&dict;\
{
//打开dict的下层词典
#define OPEN_DICT_EX(dict,KeyPath) \
{\
WDict *pCurSubDict=dict.FindOrAddDict(KeyPath);\
if(pCurSubDict!=NULL)\
{
//关闭当前词典
#define CLOSE_DICT() \
}\
}
//嵌套打开下层词典,如不存在则自动建立
#define OPEN_SUB_DICT(KeyPath) \
{\
WDict* pCurSubDict0 = pCurSubDict;\
pCurSubDict = pCurSubDict0->FindOrAddDict(KeyPath);\
if(pCurSubDict != NULL)\
{\
//关闭嵌套打开的下层词典
#define CLOSE_SUB_DICT() \
}\
pCurSubDict = pCurSubDict0;\
}
//打开dict的子键(也可以是子字典)
#define OPEN_KEY(dict,KeyPath) (dict.FindItem(KeyPath))
//打开当前打开字典的子键(也可以是子字典)
#define OPEN_SUB_KEY(KeyPath) (pCurSubDict->FindItem(KeyPath))
//读入键数据,如果Key不存在,value不变
#define GET_VALUE(KeyPath,value) (pCurSubDict->GetValue(KeyPath,value))
//写入键数据,如果Key不存在,首先建立之
#define SET_VALUE(KeyPath,value) (pCurSubDict->SetValue(KeyPath,value))
//读入BOOL数据
#define GET_BOOL(KeyPath,value) \
{\
bool value0;\
if(pCurSubDict->GetValue(KeyPath,value0))\
value=value0;\
}
//写入键数据,如果Key不存在,首先建立之
#define SET_BOOL(KeyPath,value) \
{\
bool value0 = value;\
pCurSubDict->SetValue(KeyPath,value0);\
}
#define MID_PT 1
#define NOT_FOUND -1
#define PS_DOTE 0
#define PS_NONE 1
#define PS_CROSS 2
#define PS_CROSS_SLANT 3
#define PS_BOX 11
#define IMG_UNISCALE 0x01
#define IMG_DRAW3D 0x02
#define IMG_WCS2UCS 0x04
#define EDF_XSCALE 0x01 // for Text
#define EDF_OBLIQUE 0x02 // for Text
#define EDF_NO_AUTOPROP 0x04 // only for explode control
#define HF_DELETEA 0
#define HF_DELETEB 1
#define HF_MARK_STOP 2
#define HF_DELETE 0
#define HF_MARK 1
#define HF_NONE 2
#define HF_STOP_DELETE 3
#define HF_STOP_NONE 4
#define HF_STOP_MARK 5
#define ads_abort(s) assert(0)
#define RTSTRUCT 5011
typedef int (*AecObjectEditMethod)(AcDbObjectId idEnt); // RTNORM/RTERROR/RTNONE/RTCAN
#if ARX < 17
#define _tstof(x) atof(x)
#endif
//TWallData.m_nWallFlag 使用位操作记录多个属性,只剩0x100可用了
#define WF_EXTERNAL 0x01 // 外墙 (否则为你内墙)
#define WF_LEFTEXT 0x02 // 左侧为外 (外侧是否为左)
#define WF_TOP 0x04 // 需要顶面-三维组合时
#define WF_BOTTOM 0x08 // 需要底面-三维组合时
// 0x08和0x10以前没有用过
#define WF_POLYSHAPE 0x10 // 多义线来确定屋顶形状
#define WF_LEFT_INSULATE 0x20 // 左侧保温
#define WF_RIGHT_INSULATE 0x40 // 右侧保温
#define WF_SECTTERM 0x80 // 剖切的端头形式
#define WF_START_TERM 0x2000 // 强制封起始端
#define WF_END_TERM 0x4000
//新保温参数
#define WF_INSULATE_CAP 0x1000 // 保温强制封口
#define WF_INSULATE_END 0x8000 // 墙端部有保温
// 6.5节能属性
#define WF_DISPART_OWNER 0x200 // 分户墙
#define WF_RIGHTEXT 0x400 // 右侧朝外
#define WF_SHOWEXT 0x800 // 用不同颜色标识外侧,与TDbCurtainWall有重合,但无影响 //zjq10.7.5修改为0x800否则与WF_INSULATE_END冲突
//AecDbWallPatch.m_nFlag 使用位操作记录多个属性
#define WF_PATCH_INSULATE 0x01 // 墙造型加保温
#ifndef MAX_STRING
#define MAX_STRING 255
#endif
#define VERSION_TDBINTERFACEMSGOBJ 1
#define MAX_BASE_CLASS_NUM 5//当前最大支持五个基类
#define DECLARE_RUN_TIME_CLASS(curClass)\
public:\
virtual const WClassInfo* GetCI()const;\
static WClassInfo classInfo;//end
#define DECLARE_DYCREATE_CLASS(curClass)\
DECLARE_RUN_TIME_CLASS(curClass)\
public:\
static WDyCreateClass* NewObject();//end
#define IMPLEMENT_COMMON_RUN_TIME(childClass)\
const WClassInfo*childClass::GetCI()const\
{return &childClass::classInfo;}\
#define IMPLEMENT_RUN_TIME_CLASS5(childClass,nameString,baseClass0,baseClass1,baseClass2,baseClass3,baseClass4)\
IMPLEMENT_COMMON_RUN_TIME(childClass)\
WClassInfo childClass::classInfo(nameString,NULL\
,&(baseClass0::classInfo)\
,&(baseClass1::classInfo)\
,&(baseClass2::classInfo)\
,&(baseClass3::classInfo)\
,&(baseClass4::classInfo));//end
#define IMPLEMENT_RUN_TIME_CLASS4(childClass,nameString,baseClass0,baseClass1,baseClass2,baseClass3)\
IMPLEMENT_COMMON_RUN_TIME(childClass)\
WClassInfo childClass::classInfo(nameString,NULL\
,&(baseClass0::classInfo)\
,&(baseClass1::classInfo)\
,&(baseClass2::classInfo)\
,&(baseClass3::classInfo));//end
#define IMPLEMENT_RUN_TIME_CLASS3(childClass,nameString,baseClass0,baseClass1,baseClass2)\
IMPLEMENT_COMMON_RUN_TIME(childClass)\
WClassInfo childClass::classInfo(nameString,NULL\
,&(baseClass0::classInfo)\
,&(baseClass1::classInfo)\
,&(baseClass2::classInfo));//end
#define IMPLEMENT_RUN_TIME_CLASS2(childClass,nameString,baseClass0,baseClass1)\
IMPLEMENT_COMMON_RUN_TIME(childClass)\
WClassInfo childClass::classInfo(nameString,NULL\
,&(baseClass0::classInfo)\
,&(baseClass1::classInfo));//end
#define IMPLEMENT_RUN_TIME_CLASS1(childClass,nameString,baseClass0)\
IMPLEMENT_COMMON_RUN_TIME(childClass)\
WClassInfo childClass::classInfo(nameString,NULL\
,&(baseClass0::classInfo));//end
#define IMPLEMENT_RUN_TIME_CLASS0(childClass,nameString)\
IMPLEMENT_COMMON_RUN_TIME(childClass)\
WClassInfo childClass::classInfo(nameString,NULL);//end
#define IMPLEMENT_DYCREATE_CLASS5(childClass,nameString,baseClass0,baseClass1,baseClass2,baseClass3,baseClass4)\
IMPLEMENT_COMMON_RUN_TIME(childClass)\
WClassInfo childClass::classInfo(nameString,childClass::NewObject\
,&(baseClass0::classInfo)\
,&(baseClass1::classInfo)\
,&(baseClass2::classInfo)\
,&(baseClass3::classInfo)\
,&(baseClass4::classInfo));\
WDyCreateClass*childClass::NewObject()\
{childClass *pObject = new childClass;return pObject->InitObject();}//end
#define IMPLEMENT_DYCREATE_CLASS4(childClass,nameString,baseClass0,baseClass1,baseClass2,baseClass3)\
IMPLEMENT_COMMON_RUN_TIME(childClass)\
WClassInfo childClass::classInfo(nameString,childClass::NewObject\
,&(baseClass0::classInfo)\
,&(baseClass1::classInfo)\
,&(baseClass2::classInfo)\
,&(baseClass3::classInfo));\
WDyCreateClass*childClass::NewObject()\
{childClass *pObject = new childClass;return pObject->InitObject();}//end
#define IMPLEMENT_DYCREATE_CLASS3(childClass,nameString,baseClass0,baseClass1,baseClass2)\
IMPLEMENT_COMMON_RUN_TIME(childClass)\
WClassInfo childClass::classInfo(nameString,childClass::NewObject\
,&(baseClass0::classInfo)\
,&(baseClass1::classInfo)\
,&(baseClass2::classInfo));\
WDyCreateClass*childClass::NewObject()\
{childClass *pObject = new childClass;return pObject->InitObject();}//end
#define IMPLEMENT_DYCREATE_CLASS2(childClass,nameString,baseClass0,baseClass1)\
IMPLEMENT_COMMON_RUN_TIME(childClass)\
WClassInfo childClass::classInfo(nameString,childClass::NewObject\
,&(baseClass0::classInfo)\
,&(baseClass1::classInfo));\
WDyCreateClass*childClass::NewObject()\
{childClass *pObject = new childClass;return pObject->InitObject();}//end
#define IMPLEMENT_DYCREATE_CLASS1(childClass,nameString,baseClass0)\
IMPLEMENT_COMMON_RUN_TIME(childClass)\
WClassInfo childClass::classInfo(nameString,childClass::NewObject\
,&(baseClass0::classInfo));\
WDyCreateClass*childClass::NewObject()\
{childClass *pObject = new childClass;return pObject->InitObject();}//end
#define IMPLEMENT_DYCREATE_CLASS0(childClass,nameString)\
IMPLEMENT_COMMON_RUN_TIME(childClass)\
WClassInfo childClass::classInfo(nameString,childClass::NewObject);\
WDyCreateClass*childClass::NewObject()\
{childClass *pObject = new childClass;return pObject->InitObject();}//end
//根据pObject的真实类型创建一个的动态对象,参数:WDyCreateClass*pObject
#define NEW_OBJECT(pObject) ((pObject)->GetCI()->NewObject())
//得到一个WRunTimeClass派生类的ID,没有注册时返回-1
#define CLASS_ID(someClass) (someClass::classInfo.GetClassID())
//得到一个WRunTimeClass派生类的注册名称
#define CLASS_NAME(pObj) (pObj->GetCI()->GetClassName())
//测试pObj对象是否是someClass类,或是其派生类
#define IS_CLASS(pObj,someClass) ((pObj)->IsClassOf(&someClass::classInfo))
//测试pObj对象是否是someClass类(不是派生类)
#define IS_TYPE(pObj,someClass) ((pObj)->GetCI() == &someClass::classInfo)
//登记运行时类信息
#define REGISTER_CID(someClass,cid) someClass::classInfo.SetClassID(cid)
//登记运行时类信息(包含构造信息)
#define REGISTER_CLASS(someClass,cid) WClassInfo::RegisterClassInfo(cid,&someClass::classInfo)
//由ID动态构造对象
#define DY_CREATE(cid) WClassInfo::DyCreate(cid)
//动态内存搜集器
#define WGobalBuf WAutoDelBuf
//位标志类
#define LOCKED 0x000000001
#define VISITED 0x000000002
// 角度使用5度
#define MIN_PL_ANGEL (PI/36.0)
#define MIN_PL_DISTANCE 5
#define OPENOBJ_BEGIN(Ent, OpenMode, ClassName, VariableName) {\
XDbObject tObj##VariableName(Ent, OpenMode); \
ClassName *VariableName=!tObj##VariableName? NULL: ClassName::cast(tObj##VariableName.m_pObject);
#define OPENOBJ_END() }
#define ExchangePropValue(name ) \
{ \
if ( bRet ) \
{ \
if ( m_bStoring ) \
{ \
bRet = SetValue( #name , name ) \
} \
else \
{ \
bRet = GetValue( #name , name ); \
} \
ASSERT( bRet ); \
} \
}
#define AttachValues( hKey , name ) AttachValue( hKey , &(name) , #name ) ;
#define PRIV_STR(s) s
#define XDT_MATERIAL 29000
#define append_rblists(xdata, tag_xdata) AT_link_list(*xdata, tag_xdata)
#define TOL 0.0001 //计算允差
#define fTOL 1.e-8 //数学运算误差
#ifndef PI
#define PI 3.1415926535897932384626433832795
#endif
#define DPI 0.017453292519943295
#define PIDD 57.295779513082323
#define PI2 6.2831853071796
//浮点数比较
#define UP_ZERO(a) ((a) > XGeLib::g_fZero)
#define UPEQUAL_ZERO(a) ((a) >= -XGeLib::g_fZero)
#define DOWN_ZERO(a) ((a) < -XGeLib::g_fZero)
#define DOWNEQUAL_ZERO(a) ((a) <= XGeLib::g_fZero)
#define EQUAL_ZERO(a) ((a) >= -XGeLib::g_fZero && (a) <= XGeLib::g_fZero)
#define EQUAL(a,b) EQUAL_ZERO(a-b)
//弧度相关比较
#define UP_ZEROA(a) ((a) > XGeLib::g_angleZero)
#define UPEQUAL_ZEROA(a) ((a) >= XGeLib::g_angleZero)
#define DOWN_ZEROA(a) ((a) < -XGeLib::g_angleZero)
#define DOWNEQUAL_ZEROA(a) ((a) <= XGeLib::g_angleZero)
#define EQUAL_ZEROA(a) ((a) >= -XGeLib::g_angleZero&&(a) <= XGeLib::g_angleZero)
#define EQUALA(a,b) EQUAL_ZEROD(a - b)
//距离相关比较
#define UP_ZEROD(a) ((a) > g_distZero)
#define UPEQUAL_ZEROD(a) ((a) >= -g_distZero)
#define DOWN_ZEROD(a) ((a) < -g_distZero)
#define DOWNEQUAL_ZEROD(a) ((a) <= g_distZero)
#define EQUAL_ZEROD(a) ((a) >= -g_distZero&&(a) <= g_distZero)
#define EQUALD(a,b) EQUAL_ZERO(a - b)
//浮点数比较
#define UP_ZEROEX(a,prec) ((a) > prec)
#define UPEQUAL_ZEROEX(a,prec) ((a) >= -prec)
#define DOWN_ZEROEX(a,prec) ((a) < -prec)
#define DOWNEQUAL_ZEROEX(a,prec) ((a) <= prec)
#define EQUAL_ZEROEX(a,prec) ((a) >= -prec&&(a) <= prec)
#define EQUALEX(a,b,prec) EQUAL_ZEROEX(a - b,prec)
#define A_IN 0x0004 //A GO IN B
#define A_OUT 0x0008 //A GO OUT B
#define B_IN 0x0010 //B GO IN A
#define B_OUT 0x0020 //B GO OUT A
#define A_VISITED 0x0040
#define B_VISITED 0x0080
#define CID_2DFIRST 1
#define CID_GPoint2D 1
#define CID_GLine2D 2
#define CID_GLineRay2D 3
#define CID_GLineSeg2D 4
#define CID_GCircle2D 5
#define CID_GArc2D 6
#define CID_GMLine2D 11
#define CID_GPLine2D 12
#define CID_GMCurve2D 13
#define CID_GPolygon2D 5000
#define CID_GPolygonEx2D 5001
#define CID_GRegionEx2D 5002
#define CID_2DLAST 10000
#define CID_3DFIRST 10001
#define CID_GPoint3D 10001
#define CID_GLine3D 10002
#define CID_GLineRay3D 10003
#define CID_GLineSeg3D 10004
#define CID_GPlane3D 10005
#define CID_GPCurve3D 10006
#define CID_GMLine3D 10011
#define CID_GMCurve3D 10013
#define CLOSED_CURVE 0x00000004 //封闭曲线
#define CLOCKWISE_CURVE 0x00000008 //顺时针方向封闭曲线
#define NO_BOUNDARY_INTER 0x0004 //不允许边界线有临界交
#define WPF_INSULATE 0x01 //保温...
#define MULTI_LINE 0x0001
#define ACAD_ENTITY 0x0002 //非$对象
#define ENT_CLIPPED 0x01
#define ENT_CLIPP 0x02
#define BIF_RECTMASK 0x01 //矩形屏蔽
#define BIF_POLYMASK 0x02 //区域屏蔽
#define BIF_MULTIVIEW 0x04 //多视图
#define BIF_T6BETA1 0x08 //T6Beta1临时标记,需要升级后才可以正常显示
#define CF_FORTIFY 0x01 //构造柱
#define CF_TOP 0x02 //有底面
#define CF_BOTTOM 0x04 //有顶面
#define CF_LABEL 0x08 //启用编号
//
#define CF_SHORT 0x10 //矮柱
//
#define CF_INSULATE 0x20 //保温...
#define BIF_ANNOTATE 0x10 //注释图块...
#define COLU_QUANTUM_1 _T("体积")
#define COLU_QUANTUM_2 _T("高度")
#define COLU_QUANTUM_3 _T("截面积")
#define DICT_ENTRY_NAME _T("AEC_PROTEC_ENTITY")
#define PROTECT_PRINT 0x0001 //不能打印
#define WALL_QUANTUM_1 _T("左壁面积(扣洞口)")
#define WALL_QUANTUM_2 _T("左壁面积(不扣洞口)")
#define WALL_QUANTUM_3 _T("右壁面积(扣洞口)")
#define WALL_QUANTUM_4 _T("右壁面积(不扣洞口)")
#define WALL_QUANTUM_5 _T("墙洞壁面积")
#define WALL_QUANTUM_6 _T("墙体体积")
#define WALL_QUANTUM_7 _T("洞口体积")
#define WALL_QUANTUM_8 _T("墙体厚度")
//节能特性
#define EN_WALL_TRANSPARENT 0x0001 //透明幕墙
typedef DWORD PRPHANDLE;
#define DECLARE_TENTBASE() \
private: \
void *operator new[](size_t nSize) { return 0;} \
void operator delete[](void *p) {}; \
void *operator new[](size_t nSize, const TCHAR *file, int line) { return 0;} \
protected: \
static AecObjectEditMethod g_pEditFun; \
virtual AecObjectEditMethod GetEditMethod() const; \
public: \
static AecObjectEditMethod SetEditMethod(AecObjectEditMethod pNewMethod); \
static void InitMatchProtocol(BOOL bTrue); //提供对格式刷的支持
#define IMPLEMENT_TENTBASE(ClassName) \
AecObjectEditMethod ClassName::g_pEditFun=NULL; \
AecObjectEditMethod ClassName::GetEditMethod() const \
{ return g_pEditFun; } \
AecObjectEditMethod ClassName::SetEditMethod(AecObjectEditMethod pNewMethod) \
{ AecObjectEditMethod pOld=g_pEditFun; g_pEditFun=pNewMethod; return pOld; } \
void ClassName::InitMatchProtocol(BOOL bTrue) { \
static XArchMatchProp *pMatchProp=NULL; \
if(bTrue)\
{\
ASSERT(pMatchProp == NULL); \
pMatchProp = new XArchMatchProp; \
desc()->addX(AcDbMatchProperties::desc(), pMatchProp); \
}\
else\
{\
desc()->delX(XArchMatchProp::desc());\
delete pMatchProp;\
pMatchProp = NULL;\
}\
}
//暂时去掉saveas
//virtual void saveAs(AcGiWorldDraw *pWd,AcDb::SaveType saveType){WorldDraw(pWd);}
#if ARX<18
#define AEC_DECLARE_MEMBERS() \
public: \
virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw *pWd) { return WorldDraw(pWd); } \
virtual void subViewportDraw(AcGiViewportDraw* pMode){ ViewportDraw(pMode); } \
virtual void saveAs(AcGiWorldDraw *pWd,AcDb::SaveType saveType){/*WorldDraw(pWd);*/} \
virtual Acad::ErrorStatus subExplode(AcDbVoidPtrArray& entitySet) const { \
return Explode(entitySet); \
} \
Acad::ErrorStatus subGetGeomExtents(AcDbExtents& extents) const; \
virtual void subList() const; \
Acad::ErrorStatus subGetOsnapPoints(AcDb::OsnapMode osnapMode, \
INT_PTR gsSelectionMark, \
const AcGePoint3d& ptPick, \
const AcGePoint3d& lastPoint, \
const AcGeMatrix3d& viewXform, \
AcGePoint3dArray& snapPoints, \
AcDbIntArray& geomIds) const; \
Acad::ErrorStatus subGetOsnapPoints(AcDb::OsnapMode osnapMode, \
INT_PTR gsSelectionMark, \
const AcGePoint3d& ptPick, \
const AcGePoint3d& lastPoint, \
const AcGeMatrix3d& viewXform, \
AcGePoint3dArray& snapPoints, \
AcDbIntArray& geomIds, \
const AcGeMatrix3d& insersionMat) const; \
Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent, \
AcDb::Intersect intType, \
AcGePoint3dArray& points, \
INT_PTR thisGsMarker, \
INT_PTR otherGsMarker) const; \
Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent, \
AcDb::Intersect intType, \
const AcGePlane& projPlane, \
AcGePoint3dArray& points, \
INT_PTR thisGsMarker, \
INT_PTR otherGsMarker) const; \
Acad::ErrorStatus setPropertiesFrom( const AcDbEntity* pEntity, Adesk::Boolean doSubents = Adesk::kTrue); \
virtual AcDbObjectId GetOwnerId() const { return ownerId(); } \
AcDbObjectId AddToMSpace(Adesk::Boolean bClosed); \
AcDbObjectId AddToCSpace(Adesk::Boolean bClosed); \
AcDbObjectId AddToPSpace(Adesk::Boolean bClosed); \
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform); \
virtual Acad::ErrorStatus subGetTransformedCopy(const AcGeMatrix3d& xform,AcDbEntity*& ent) const; \
virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler*); \
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const; \
virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler*); \
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const; \
protected: \
virtual AcDbEntity * GetMe() { return this; } \
virtual const AcDbEntity * GetMe() const { return this; } \
private: \
void *operator new[](size_t nSize) { return 0;} \
void operator delete[](void *p) {}; \
void *operator new[](size_t nSize, const TCHAR *file, int line) { return 0;} \
public:
#else
#define AEC_DECLARE_MEMBERS() \
public: \
virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw *pWd) { return WorldDraw(pWd); } \
virtual void subViewportDraw(AcGiViewportDraw* pMode){ ViewportDraw(pMode); }\
virtual void saveAs(AcGiWorldDraw *pWd,AcDb::SaveType saveType){/*WorldDraw(pWd);*/} \
virtual Acad::ErrorStatus subExplode(AcDbVoidPtrArray& entitySet) const { \
return Explode(entitySet); \
} \
Acad::ErrorStatus subGetGeomExtents(AcDbExtents& extents) const; \
virtual void subList() const; \
Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent, \
AcDb::Intersect intType, \
AcGePoint3dArray& points, \
INT_PTR thisGsMarker, \
INT_PTR otherGsMarker) const; \
Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent, \
AcDb::Intersect intType, \
const AcGePlane& projPlane, \
AcGePoint3dArray& points, \
INT_PTR thisGsMarker, \
INT_PTR otherGsMarker) const; \
Acad::ErrorStatus setPropertiesFrom( const AcDbEntity* pEntity, Adesk::Boolean doSubents = Adesk::kTrue); \
virtual AcDbObjectId GetOwnerId() const { return ownerId(); } \
AcDbObjectId AddToMSpace(Adesk::Boolean bClosed); \
AcDbObjectId AddToCSpace(Adesk::Boolean bClosed); \
AcDbObjectId AddToPSpace(Adesk::Boolean bClosed); \
Acad::ErrorStatus subGetOsnapPoints(AcDb::OsnapMode osnapMode, \
INT_PTR gsSelectionMark, \
const AcGePoint3d& ptPick, \
const AcGePoint3d& lastPoint, \
const AcGeMatrix3d& viewXform, \
AcGePoint3dArray& snapPoints, \
AcDbIntArray& geomIds) const; \
Acad::ErrorStatus subGetOsnapPoints(AcDb::OsnapMode osnapMode, \
INT_PTR gsSelectionMark, \
const AcGePoint3d& ptPick, \
const AcGePoint3d& lastPoint, \
const AcGeMatrix3d& viewXform, \
AcGePoint3dArray& snapPoints, \
AcDbIntArray& geomIds, \
const AcGeMatrix3d& insersionMat) const; \
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform); \
virtual Acad::ErrorStatus subGetTransformedCopy(const AcGeMatrix3d& xform,AcDbEntity*& ent) const; \
virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler*); \
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const; \
virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler*); \
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const; \
protected: \
virtual AcDbEntity * GetMe() { return this; } \
virtual const AcDbEntity * GetMe() const { return this; } \
private: \
void *operator new[](size_t nSize) { return 0;} \
void operator delete[](void *p) {}; \
void *operator new[](size_t nSize, const TCHAR *file, int line) { return 0;} \
public:
#endif //ARX < 18
#if ARX<18
#define AEC_IMPLEMENT_MEMBERS(className, parentClass) \
Acad::ErrorStatus className::setPropertiesFrom(const AcDbEntity* pEntity, Adesk::Boolean doSubents) \
{ \
assertWriteEnabled(); \
Acad::ErrorStatus es=parentClass::setPropertiesFrom(pEntity, doSubents); \
CopyPropertiesFrom((AcDbEntity *)pEntity, 0); \
return es; \
}\
AcDbObjectId className::AddToMSpace(Adesk::Boolean bClosed) \
{ \
const TCHAR *pszLayer=GetDefaultLayer(); \
if(pszLayer) { \
InitLayer(pszLayer, TRUE); \
setLayer(pszLayer); \
} \
return AddToModelSpace(this, bClosed, Adesk::kTrue); \
} \
AcDbObjectId className::AddToPSpace(Adesk::Boolean bClosed) \
{ \
const TCHAR *pszLayer=GetDefaultLayer(); \
if(pszLayer) { \
InitLayer(pszLayer, TRUE); \
setLayer(pszLayer); \
} \
return AddToPaperSpace(this, bClosed, Adesk::kTrue); \
} \
AcDbObjectId className::AddToCSpace(Adesk::Boolean bClosed) \
{ \
const TCHAR *pszLayer=GetDefaultLayer(); \
if(pszLayer) { \
InitLayer(pszLayer, TRUE); \
setLayer(pszLayer); \
} \
return AddToCurrentSpace(this, bClosed, Adesk::kTrue); \
} \
void className::subList() const \
{ \
assertReadEnabled(); \
AEntityBase::ListInfo(); \
} \
Acad::ErrorStatus className::subGetGeomExtents(AcDbExtents& extents) const \
{ \
XPoint ptLow, ptUp; \
Acad::ErrorStatus es=GetExtents(ptLow, ptUp); \
if(es==Acad::eOk) \
extents.set(ptLow, ptUp); \
return es; \
} \
Acad::ErrorStatus className::subGetOsnapPoints( \
AcDb::OsnapMode osnapMode, \
INT_PTR gsSelectionMark, \
const AcGePoint3d& ptPick, \
const AcGePoint3d& lastPoint, \
const AcGeMatrix3d& viewXform, \
AcGePoint3dArray& snapPoints, \
AcDbIntArray& geomIds) const \
{ \
assertReadEnabled(); \
return GetOsnapPoints(osnapMode, gsSelectionMark, ptPick, lastPoint, viewXform, \
snapPoints, geomIds); \
} \
Acad::ErrorStatus className::subGetOsnapPoints( \
AcDb::OsnapMode osnapMode, \
INT_PTR gsSelectionMark, \
const AcGePoint3d& ptPick, \
const AcGePoint3d& lastPoint, \
const AcGeMatrix3d& viewXform, \
AcGePoint3dArray& snapPoints, \
AcDbIntArray& geomIds, \
const AcGeMatrix3d& insertionMat) const \
{ \
assertReadEnabled(); \
return GetOsnapPoints(osnapMode, gsSelectionMark, ptPick, lastPoint, viewXform, \
snapPoints, geomIds ,insertionMat); \
} \
Acad::ErrorStatus className::subIntersectWith(const AcDbEntity* ent, \
AcDb::Intersect intType, \
AcGePoint3dArray& points, \
INT_PTR thisGsMarker, \
INT_PTR otherGsMarker) const \
{ \
assertReadEnabled(); \
return IntersectWith(ent, intType, points, thisGsMarker, otherGsMarker); \
} \
Acad::ErrorStatus className::subIntersectWith(const AcDbEntity* ent, \
AcDb::Intersect intType, \
const AcGePlane& projPlane, \
AcGePoint3dArray& points, \
INT_PTR thisGsMarker, \
INT_PTR otherGsMarker) const \
{ \
assertReadEnabled(); \
return IntersectWith(ent, intType, projPlane, points, thisGsMarker, otherGsMarker); \
} \
Acad::ErrorStatus className::subTransformBy(const AcGeMatrix3d& xform) \
{ \
assertWriteEnabled(); \
if(g_bLayoutRotate) { \
AcGeVector3d vt(cos(m_nLayoutRotation), sin(m_nLayoutRotation), 0.0); \
vt.transformBy(xform); \
m_nLayoutRotation = ads_angle(XPoint(), XPoint(vt[0], vt[1])); \
} \
return Acad::eOk; \
} \
Acad::ErrorStatus className::subGetTransformedCopy(const AcGeMatrix3d& xform, \
AcDbEntity*& pEnt) const \
{ \
assertReadEnabled(); \
AcDbEntity *pCloned=(AcDbEntity *)clone(); \
Acad::ErrorStatus es=pCloned->transformBy(xform); \
if(es==Acad::eOk) \
pEnt=pCloned; \
else \
delete pCloned; \
return es; \
} \
Acad::ErrorStatus className::dwgInFields(AcDbDwgFiler* pFiler) \
{ \
assertWriteEnabled(); \
Acad::ErrorStatus es = parentClass::dwgInFields(pFiler); \
if(es != Acad::eOk) return es; \
return AEntityBase::DwgInFields(pFiler); \
} \
Acad::ErrorStatus className::dwgOutFields(AcDbDwgFiler* pFiler) const \
{ \
assertReadEnabled(); \
VERIFY(parentClass::dwgOutFields(pFiler)==Acad::eOk); \
return AEntityBase::DwgOutFields(pFiler); \
} \
Acad::ErrorStatus className::dxfInFields (AcDbDxfFiler* pFiler) \
{ \
assertWriteEnabled(); \
if(!g_bSubEntity/*add by w on 050706*/) \
{ \
Acad::ErrorStatus es = parentClass::dxfInFields(pFiler);\
if(es!=Acad::eOk) return es; \
} \
if(!pFiler->atSubclassData(_T(#className))) \
return Acad::eBadDxfSequence; \
return AEntityBase::DxfInFields(pFiler); \
} \
Acad::ErrorStatus className::dxfOutFields(AcDbDxfFiler* pFiler) const\
{ \
assertReadEnabled();\
if(objectId()!=AcDbObjectId::kNull/*add by w on 050706*/) \
VERIFY(parentClass::dxfOutFields(pFiler)==Acad::eOk); \
VERIFY(pFiler->writeItem(AcDb::kDxfSubclass, _T(#className))==Acad::eOk); \
return AEntityBase::DxfOutFields(pFiler); \
}
#else
#define AEC_IMPLEMENT_MEMBERS(className, parentClass) \
Acad::ErrorStatus className::setPropertiesFrom(const AcDbEntity* pEntity, Adesk::Boolean doSubents) \
{ \
assertWriteEnabled(); \
Acad::ErrorStatus es=parentClass::setPropertiesFrom(pEntity, doSubents); \
CopyPropertiesFrom((AcDbEntity *)pEntity, 0); \
return es; \
}\
AcDbObjectId className::AddToMSpace(Adesk::Boolean bClosed) \
{ \
const TCHAR *pszLayer=GetDefaultLayer(); \
if(pszLayer) { \
InitLayer(pszLayer, TRUE); \
setLayer(pszLayer); \
} \
return AddToModelSpace(this, bClosed, Adesk::kTrue); \
} \
AcDbObjectId className::AddToPSpace(Adesk::Boolean bClosed) \
{ \
const TCHAR *pszLayer=GetDefaultLayer(); \
if(pszLayer) { \
InitLayer(pszLayer, TRUE); \
setLayer(pszLayer); \
} \
return AddToPaperSpace(this, bClosed, Adesk::kTrue); \
} \
AcDbObjectId className::AddToCSpace(Adesk::Boolean bClosed) \
{ \
const TCHAR *pszLayer=GetDefaultLayer(); \
if(pszLayer) { \
InitLayer(pszLayer, TRUE); \
setLayer(pszLayer); \
} \
return AddToCurrentSpace(this, bClosed, Adesk::kTrue); \
} \
void className::subList() const \
{ \
assertReadEnabled(); \
AEntityBase::ListInfo(); \
} \
Acad::ErrorStatus className::subGetGeomExtents(AcDbExtents& extents) const \
{ \
XPoint ptLow, ptUp; \
Acad::ErrorStatus es=GetExtents(ptLow, ptUp); \
if(es==Acad::eOk) \
extents.set(ptLow, ptUp); \
return es; \
} \
Acad::ErrorStatus className::subIntersectWith(const AcDbEntity* ent, \
AcDb::Intersect intType, \
AcGePoint3dArray& points, \
INT_PTR thisGsMarker, \
INT_PTR otherGsMarker) const \
{ \
assertReadEnabled(); \
return IntersectWith(ent, intType, points, thisGsMarker, otherGsMarker); \
} \
Acad::ErrorStatus className::subIntersectWith(const AcDbEntity* ent, \
AcDb::Intersect intType, \
const AcGePlane& projPlane, \
AcGePoint3dArray& points, \
INT_PTR thisGsMarker, \
INT_PTR otherGsMarker) const \
{ \
assertReadEnabled(); \
return IntersectWith(ent, intType, projPlane, points, thisGsMarker, otherGsMarker); \
} \
Acad::ErrorStatus className::subGetTransformedCopy(const AcGeMatrix3d& xform, \
AcDbEntity*& pEnt) const \
{ \
assertReadEnabled(); \
AcDbEntity *pCloned=(AcDbEntity *)clone(); \
Acad::ErrorStatus es=pCloned->transformBy(xform); \
if(es==Acad::eOk) \
pEnt=pCloned; \
else \
delete pCloned; \
return es; \
} \
Acad::ErrorStatus className::dwgInFields(AcDbDwgFiler* pFiler) \
{ \
assertWriteEnabled(); \
Acad::ErrorStatus es = parentClass::dwgInFields(pFiler); \
if(es != Acad::eOk) return es; \
return AEntityBase::DwgInFields(pFiler); \
} \
Acad::ErrorStatus className::dwgOutFields(AcDbDwgFiler* pFiler) const \
{ \
assertReadEnabled(); \
VERIFY(parentClass::dwgOutFields(pFiler)==Acad::eOk); \
return AEntityBase::DwgOutFields(pFiler); \
} \
Acad::ErrorStatus className::dxfInFields (AcDbDxfFiler* pFiler) \
{ \
assertWriteEnabled(); \
if(!g_bSubEntity/*add by w on 050706*/) \
{ \
Acad::ErrorStatus es = parentClass::dxfInFields(pFiler);\
if(es!=Acad::eOk) return es; \
} \
if(!pFiler->atSubclassData(_T(#className))) \
return Acad::eBadDxfSequence; \
return AEntityBase::DxfInFields(pFiler); \
} \
Acad::ErrorStatus className::subTransformBy(const AcGeMatrix3d& xform) \
{ \
assertWriteEnabled(); \
if(g_bLayoutRotate) { \
AcGeVector3d vt(cos(m_nLayoutRotation), sin(m_nLayoutRotation), 0.0); \
vt.transformBy(xform); \
m_nLayoutRotation = ads_angle(XPoint(), XPoint(vt[0], vt[1])); \
} \
return Acad::eOk; \
} \
Acad::ErrorStatus className::subGetOsnapPoints( \
AcDb::OsnapMode osnapMode, \
INT_PTR gsSelectionMark, \
const AcGePoint3d& ptPick, \
const AcGePoint3d& lastPoint, \
const AcGeMatrix3d& viewXform, \
AcGePoint3dArray& snapPoints, \
AcDbIntArray& geomIds) const \
{ \
assertReadEnabled(); \
return GetOsnapPoints(osnapMode, gsSelectionMark, ptPick, lastPoint, viewXform, \
snapPoints, geomIds); \
} \
Acad::ErrorStatus className::subGetOsnapPoints( \
AcDb::OsnapMode osnapMode, \
INT_PTR gsSelectionMark, \
const AcGePoint3d& ptPick, \
const AcGePoint3d& lastPoint, \
const AcGeMatrix3d& viewXform, \
AcGePoint3dArray& snapPoints, \
AcDbIntArray& geomIds, \
const AcGeMatrix3d& insertionMat) const \
{ \
assertReadEnabled(); \
return GetOsnapPoints(osnapMode, gsSelectionMark, ptPick, lastPoint, viewXform, \
snapPoints, geomIds ,insertionMat); \
} \
Acad::ErrorStatus className::dxfOutFields(AcDbDxfFiler* pFiler) const \
{ \
assertReadEnabled();\
if(objectId()!=AcDbObjectId::kNull/*add by w on 050706*/) \
VERIFY(parentClass::dxfOutFields(pFiler)==Acad::eOk); \
VERIFY(pFiler->writeItem(AcDb::kDxfSubclass, _T(#className))==Acad::eOk); \
return AEntityBase::DxfOutFields(pFiler); \
}
#endif //ADS<18
#endif