【原创】HlrApi学习笔记

一、模块介绍:
模块AsdkHlrApi17是用来帮助计算AutoCAD图形的消隐线的,它返回一些线实体,用户程序可以决定是否把这些返回线实体加入当前的图形数据库或其它的数据库。
该模块主要由Cyrille Fauvel & Phil Holcombe两个Autodesk Developer Consulting Group中的大牛于1999年编写。

二、HlrApi模块中,类的介绍:
1. AsdkHlrControl枚举
enum AsdkHlrControl 
{
kProject    =0x0001, //----- 是不是线实体都投影到一个平面
kShowAll    =0x0002, //-----是不是所以的线实体都返回,还是只返回可视的线实体
kEntity    =0x0004, //-----是否要求返回导致很细小的曲线被创建的那些实体 
kBlock     =0x0008, //----- 是否要求不但返回所以被创建的实体ID,而且还返回它们所在

的块
kSubentity    =0x0010, //----- 是否solids或简单图形的子实体信息被返回
kHideTangents   =0x0020, //----- 相切的边是否被压住(应该是遮挡的意思)
kCleanup    =0x0040, //----- 是否在使用后清空存储的数据
kIsolines    =0x0080, //----- 是否isolines能被显示 (和AutoCAD中isolines概念一样)
kUnite     =0x0100, //----- 是否将实体求并集,然后再计算消隐线,这样会使处理过程更加缓慢,但对相关实体来说,结果将更加精确
kReuse     =0x0200, //----- 在算法中使用先期创建时的数据?
kProgress    =0x0400, //----- 设置的处理过程回调函数和中断回调函数是否被调用
kHandlePoints   =0x0800, //----- 是否要显示单个的点(将需要额外的处理时间)
kProcessAll   =0x1000, //----- 是否只考虑实体的投影状态,而不考虑实体的层次信息
kHonorInternals =0x2000, //----- 是否处理内在边的可视性,比如多面网格、普通的ACIS内在边、自定义网格实体、壳,这 样处理的话,会使用速度变慢,但对内部边的计算会更精确 
kMeshSilhouettes =0x4000, //----- 是否生成由AcDbPolyFaceMesh(多面网格)表示的侧面轮廓
kSingleCacheVp =0x8000 //----- HLR对象的缓存,对所有视口都唯一
};

2. AsdkHlrData类:HLR模块的数据对象
//-----------------------------------------------------------------------------
class EXP_IMP AsdkHlrData 
{

public:
//可视状态的枚举
enum Visibility {
   kVisible,    //----- 可视的
   kHidden,    //----- 被其它的面给消隐的
   kOccluded,    //----- 被其它的边给消隐的
   kInternallyHidden, //----- 被内部消隐的
   kUndefined    //----- 未定义的可视状态
} ;

protected:
AcDbEntity *m_pEntity ;    //----- 原实体(用来创建曲线)

AcDbObjectIdArray m_objectIds ; //----- 原实体(产生曲线实体的一系列对象的ID)
AcDbSubentId m_subentId ;   //----- 曲线属于的边和面对象的ID

Visibility m_visibility ;   //----- 曲线的可视状态
Visibility m_hlrVisibility ; //----- 万一m_visibility == kInternallyHidden时,这个状态将返回HLR可视状态,以避免其并不是内部消隐的。
AcDbEntity *m_pResultEntity ; //-----被创建的实体指针(通常是曲线)

public:
AsdkHlrData () : m_pEntity (NULL), m_visibility(kUndefined), m_hlrVisibility(kUndefined),

m_pResultEntity(NULL) {}
virtual ~AsdkHlrData () {
   if ( m_pResultEntity && m_pResultEntity->objectId () == AcDbObjectId::kNull )
    delete m_pResultEntity ;
}

//----- 相应的设置函数,但一般的应该不要由应用程序来调用
void setEntity (AcDbEntity *pEnt)
   { if ( pEnt != NULL ) m_pEntity =pEnt ; }
void setObjectIds (AcDbObjectIdArray id)
   { m_objectIds =id ; }
void setResultEntity (AcDbEntity *pResultEnt)
   { m_pResultEntity =pResultEnt ; }
void setVisibility (Visibility visibility)
   { m_visibility =visibility ; }
void setHlrVisibility (Visibility visibility)
   { m_hlrVisibility =visibility ; }
void setSubentId (AcDbSubentId subentId)
   { m_subentId =subentId ; }

//----- 获取导致产生曲线的实体
AcDbEntity *getEntity ()
   { return (m_pEntity) ; }
//-----获取导致产生曲线的实体ID列表
AcDbObjectIdArray &getObjectIds ()
   { return (m_objectIds) ; }
//----- 返回的曲线实体,但当是单独的点时,这个也可能是返回的点
AcDbEntity *getResultEntity ()
   { return (m_pResultEntity) ; }
//----- 返回曲线的可视性
Visibility getVisibility ()
   { return (m_visibility) ; }
Visibility getHlrVisibility ()
   { return (m_hlrVisibility) ; }
//----- 返回曲线的子实体列表
AcDbSubentId getSubentId ()
   { return (m_subentId) ; }
};

3. AsdkHlrCollector类:HLR容器
class EXP_IMP AsdkHlrCollector 
{
protected:
AcArray<AcDbEntity *> mEntities ; //----- 保存在内存中的实体列表(AcDbEntity及其派生类)
bool mbDeleteInDestructor ;    //----- 在析购的时候,是否相应的释放指针指向的内存标志
AcDbObjectIdArray mEntityIds ;   //----- 数据库常驻(持久)实体列表

public:
AcArray<AsdkHlrData *> mOutputData ;//----- 返回产生的AsdkHlrData列表 (包括线和数据)

public:
AsdkHlrCollector () : mbDeleteInDestructor(false) {}
AsdkHlrCollector (AcDbObjectIdArray &ids) ;
AsdkHlrCollector (AcArray<AcDbEntity *> &entities, bool deleteInDestructor =false) ;
AsdkHlrCollector (AsdkHlrCollector &collector) ;

virtual ~AsdkHlrCollector () ;

bool getDeleteState ()
   { return (mbDeleteInDestructor) ; }
void setDeleteState (bool bFlag)
   { mbDeleteInDestructor =bFlag ; }

AcArray<AcDbEntity *> &getInputEntities ()
   { return (mEntities) ; }
AcDbObjectIdArray &getInputEntityIds ()
   { return (mEntityIds) ; }

void addEntity (AcDbEntity *pEnt) ;
void addEntities (AcArray<AcDbEntity *> &pEnts) ;
void addEntity (AcDbObjectId id) ;
void addEntities (AcDbObjectIdArray &ids) ;

void removeEntity (AcDbEntity *pEnt) ;
void removeEntities (AcArray<AcDbEntity *> &pEnts) ;
void removeEntity (AcDbObjectId id) ;
void removeEntities (AcDbObjectIdArray &ids) ;

void clear () ;

protected:
//----- 用来打开和关闭数据库常驻对象的接口,由AsdkHlrEngine调用。
virtual int initialize (AcArray<AcDbEntity *> &collection) ;
virtual void close (AcArray<AcDbEntity *> &collection) ;

friend class AsdkHlrEngine ;
};

4. 两个回调函数
//----- 中断时的回调函数
typedef void (*_AbortCallbackFct) (bool *abort) ;
//----- 处理过程中的回调函数
typedef void (*_ProgressCallbackFct) (int percent_completed) ;

5. AsdkHlrEngine类:核心处理引擎
class EXP_IMP AsdkHlrEngine 
{
protected:
AcDbViewport *mpViewport ;    //-----保存消隐的视口信息
int mnControl ;       //-----相对应的控制设置
_AbortCallbackFct mpAbortCallbackFct ; //-----中断时的回调函数地址
_ProgressCallbackFct mpAcisConvertionProgressCallbackFct ; //-----Acis实体转换过程中的回调函数地址
_ProgressCallbackFct mpAhlProgressCallbackFct ; //-----HLR核心处理过程中的回调函数地址
_ProgressCallbackFct mpAcadConvertionProgressCallbackFct ; //-----ACAD实体转换过程中的回调函数地址

public:
AsdkHlrEngine (int ctrl =kShowAll | kEntity | kBlock | kSubentity | kReuse) ;
AsdkHlrEngine (AcDbObjectId id, int ctrl =kShowAll | kEntity | kBlock | kSubentity | kReuse) ;
AsdkHlrEngine (AcDbViewport *pViewport, int ctrl =kShowAll | kEntity | kBlock | kSubentity | kReuse) ;
AsdkHlrEngine (AcGePoint3d &viewTarget, AcGeVector3d &viewDirection, int ctrl =kShowAll | kEntity |

kBlock | kSubentity | kReuse) ;

virtual ~AsdkHlrEngine () ;

Acad::ErrorStatus run (AsdkHlrCollector &collector) ;   //----- 调用引擎的消隐处理接口

//----- 设置相对应的回调函数
void setAbortCallback (_AbortCallbackFct fct) ;

void setAcisConversionProgressCallBack (_ProgressCallbackFct fct) ;
void setAhlProgressCallBack (_ProgressCallbackFct fct) ;
void setAcadConversionProgressCallBack (_ProgressCallbackFct fct) ;

//----- 三个静态函数,用来清除HLR的缓存的。
static void cleanHlrCache () ;
static void cleanHlrCache (AcDbEntity *pEnt, AcDbViewport *pVp =NULL) ;
static void cleanHlrCache (AcDbEntity *pEnt, AcGePoint3d viewTarget, AcGeVector3d viewDir) ;
} ;

5. AsdkHiddenLineBase类:AsdkHiddenLine协议扩展的抽象基类,派生自AcRxObject(这个有待继续研究,没有实例,

AND中也没有相关的资料)
class EXP_IMP AsdkHiddenLineBase: public AcRxObject 
{
protected:
std::map<AcDbEntity *, AcDbVoidPtrArray *> m_entityBodies ;

public:
ACRX_DECLARE_MEMBERS (AsdkHiddenLineBase) ;

//----- Function to append BODY objects to the list
//----- If required, then it also indicates which objects the
//----- body was created from ( important for blocks )
//----- 向列表中添加Body实体,如果需要,应该还要添加创建Body实体的源实体(对块来说,尤为重要)
virtual Acad::ErrorStatus prepare (AcDbEntity *pEnt, AcDbVoidPtrArray &bodies, int control, const

AcDbViewport *pVp) ;
virtual Acad::ErrorStatus getBody (void *pBodyData, int control) ;

static Acad::ErrorStatus saveData (AcDbEntity *pEnt, void *pBodyData) ;
static Adesk::Boolean retrieveData (AcDbEntity *pEnt, AcDbVoidPtrArray &bodies, const AcDbViewport *pVp

=NULL) ;

static void clear () ;
static void clear (AcDbEntity *pEnt) ;
static void clear (AcDbEntity *pEnt, AcDbViewport *pVp) ;
} ;

6. 从AsdkHlrApi17.lib中导出的函数 ,从三角形创建ACIS的BODY
extern "C" void *createBodyFromTriangles (AcGePoint3dArray &pts, AcGeIntArray &indices) ;
例:
void asdktest6 () 
{
int nPoints =8 ;
int nTriangles =12 ;
int nIndices =3 * nTriangles ;

double p [] ={
   0, 0, 0,
   1, 0, 0,
   1, 1, 0,
   0, 1, 0,
   0, 0, 1,
   1, 0, 1,
   1, 1, 1,
   0, 1, 1
} ;

int i [] ={
   0, 1, 5, 0, 5, 4,
   1, 6, 5, 1, 2, 6,
   4, 5, 6, 4, 6, 7,
   7, 0, 4, 7, 3, 0,
   2, 0, 3, 2, 1, 0,
   7, 6, 3, 6, 2, 3
} ;

AcGeIntArray indices (nIndices) ;
indices.setLogicalLength (nIndices) ;
indices.setPhysicalLength (nIndices) ;
memcpy (indices.asArrayPtr (), i, nIndices * sizeof (int)) ;

AcGePoint3dArray gePts (nPoints) ;
gePts.setLogicalLength (nPoints) ;
gePts.setPhysicalLength (nPoints) ;
memcpy (gePts.asArrayPtr (), p, nPoints * sizeof (AcGePoint3d)) ;

void *acisBody =createBodyFromTriangles (gePts, indices) ;
AcDb3dSolid *b =new AcDb3dSolid ;
b->setBody (acisBody) ;
  
AcDbObjectId id ;
postToDatabase (NULL, b, id) ;
}

转载于:https://www.cnblogs.com/lihao102/archive/2013/04/14/3020233.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值