XModel

Inherited from NItem,

Inherited by NULL

Friend class ModelManager,

Description

XModel封装了一个完整模型的所有信息。一个模型主要包含三个层次的信息,第一个层次是装配信息,即零部件与零部件的装配关系,便于用户对整个模型的访问与管理;第二个层次是几何拓扑信息,一个零部件包含若干顶层几何体,而顶层几何体又分别包含若干下一级几何体(如体包含若干面,面包含若干边,边包含最多两个顶点);第三个层次是网格信息,模型的几何面在视图上都以离散的三角片(三角单元)表达,几何边在视图上以离散的线段(线单元)表达,几何顶点以离散的点(点单元)表达,在截面视图上,以离散的体单元表达截面细节。可参考模型的结构示意图

XModel与大多数其他数据对象不一样,它本身包含了若干对象管理器,包括部件管理器、几何管理器、节点管理器、网格管理器,在一个模型内,部件(包括装配体)、几何实体(体、线、面、点)、节点、网格都有各自唯一的ID,这些管理器不能被XDocument直接访问,因此访问节点、网格、几何实体与部件都首先需要访问XModel,然后再通过XModel提供的接口访问具体的数据对象。

XT从底层构建了undo、redo机制,这套机制对访问和修改数据对象做了区分,其中访问通过getItem接口完成,数据的改动可通过3个接口完成,其中createItem用于增加数据,removeItem用于删除数据,checkOutItem用于修改已有的数据。XModel内部数据的访问和改动也完全遵守这套机制,createNode、createPart、createElement、createGeometry用于增加数据,removeNode、removeElement、removePart、removeGeometry用于删除数据,checkOutNode、checkOutElement、checkOutPart、checkOutGeometry用于修改已有的数据。

为了更方便的访问遍历特定拓扑类型的几何,XModel在几何管理器中为每个拓扑类型都构建了一套哈希表,通过指定拓扑类型,XModel就可以直接绑定其相应的访问迭代器。

XModel可以为不同部件设置不同的角色,不同角色的部件被置于不同的装配树根节点下,装配树根节点在创建XModel对象时自动生成,它的ID为0,因此不能通过ModelCompoenentManager来访问它,只能通过getAssemblyRoot接口访问。目前部件支持Normal和Auxiliary两种角色。

Members

Public interface

Private interface


XBoundBox m_dBoundBox

模型的包围盒

const XAssembly * m_pAssemblyRoot

模型装配树根节点

const XAssembly * m_pAuxiliaryRoot

模型辅助树根节点

XMemPool * m_pHashPool

模型哈希内存池,被模型内部的各种管理器共享使用

XMemPool * m_pGeneralPool

模型通用内存池

real m_dTScale

模型特征尺度,近似等于模型包围盒的最大尺寸,在很多计算的场合用于将坐标归一化处理

bool m_bGLDataReady

模型视图数据是否构建好的标志

bool m_bVisible

模型是否可见

int m_iDomainHdlIDBase

模型的起始域ID,由于模型内部的管理器并不是单一管理器,在需要undo、redo的场合,以该ID索引模型内部对象数据的变动。

OpnRecorder * m_pRecorder

模型数据操作记录器

NodeManager * m_pNodeMgr

模型节点管理器,由模型构建,非单一管理器

ElementManager * m_pElemMgr

模型单元管理器,由模型构建,非单一管理器

GeometryManager * m_pElsetMgr

模型几何管理器,由模型构建,非单一管理器

PartManager * m_pPartMgr

模型部件管理器,由模型构建,非单一管理器

PartSnapshotManager * m_pPSSMgr

部件快照管理器,单一管理器,外部构建


XModel(ulong mid)

~XModel()

void init(OpnRecorder * rec = NULL)

const XPart * getPart(ulong id)const

XNode * checkOutNode(const XNode * n)

XElement * checkOutElement(const XElement * e)

XElement * checkOutElement(ulong id)

XPart * checkOutPart(ulong id)

XPart * checkOutPart(const XPart * p)

void bindPartSnapshotManager(PartSnapshotManager * pssMgr)

PartManager * getPartManager()

NodeManager * getNodeManager()

ElementManager * getElemManager()

GeometryManager * getGeometryManager()

const XAssembly * getAssemblyRoot() const

const XAssembly * getAuxiliaryRoot() const

const XGeometry * getGeometry(ulong id)const

XGeometry * checkOutGeometry(ulong id)

XGeometry * checkOutGeometry(const XGeometry *g)

void bindPartIterator(HashIterator * pIter) const

void bindNodeIterator(HashIterator * pIter)const

void bindElementIterator(HashIterator * pIter)const

void bindGeometryIterator(HashIterator * pIter)const

void bindGeometryIterator(HashIterator * pIter,TypeID gt)const

void removeGeometry(const XGeometry * g)

XGeometry * createGeometry(TypeID t,ulong id = 0,XGeometry * parent = 0)

XNode * createNode(const real * coord,ulong nid = 0)

XAssembly * createAssembly(const char * name, ulong id, XAssembly * parent, bool bAuxiliary = false)

XPart * createPart(const char * name, ulong id, XAssembly * parent, bool bAuxiliary = false)

void removeNode(const XNode * pNode)

void moveNode(const XNode * n, const real * coord)

NodePtr getNode(ulong id) const

XElement * createElement(TypeID et, const NodePtr* pNodes,ulong eid = 0,XGeometry * entity = 0, bool bUpdateNodeElemLink = true)

void removeElement(XElement * pElement, bool bDeleteFreeNode = true)

void replaceElemNode(XElement* pElem,const XNode * old, const XNode * new_node,bool notDetachOld = false)

void resetElemNodes(XElement* pElem,const XNode ** ns)

void setElemNode(XElement* pElem,int index, const XNode * new_node)

void updateNodeElementLink(bool bKeepOld)

void updateNodeElementLink(vector<const XPart *> * parts, bool bKeepOld)

void updateNodeElementLink(vector<const XGeometry *> * geoms, bool bKeepOld)

void addCellFacet(ElemPtr pFacet, XElement * cell)

void removeCellFacet(ElemPtr facet, XElement * cell)

void setPolylineNodes(const XNode ** ns, int cnt, XElement* pElem)

void setPolygonNodes(const XNode ** ns, int cnt, XElement* pElem)

void setCellFacets(const XElement ** facets, int cnt, XElement* pElem)

ElemPtr getElement(ulong id) const

void removePart(const XPart * pPart)

int getPartCount(bool bExcludeAsb = true) const

int getElementCount()const

int getNodeCount()const

int getSurfaceElementCount()const

int getGeometryCount(TypeID gt)const

int getGeometryCount() const

void attachElemToGeom(XGeometry * g, XElement * el)

void detachElemFromGeom(XGeometry * g, XElement * el)

void attachPartToAssembly(XAssembly * asb, XPart * p)

void detachPartFromAssembly(XAssembly * asb, XPart * p)

void attachPartSnapshot(XPart * p, XPartSnapshot * asb)

void detachPartSnapshot(XPart * p, XPartSnapshot * asb)

void attachGeomToPart(XGeometry * g, XPart * p)

void detachGeomFromPart(XGeometry * g, XPart * p)

void attachGeomChild(XGeometry * g, const XGeometry * child)

void detachGeomChild(XGeometry * g, const XGeometry * child)

void clear()

void clearViewData()

void updateViewData()

bool isViewDataReady() const

ulong getNextGeometryId()

ulong getNextElementId()

ulong getNextNodeId()

const XBoundBox & getBoundBox() const

void normalizeBoundBox(const real * origin, real scale)

void restoreBoundBox(const real * origin, real scale)

void updateBoundBox()

void setPartVisible(ulong id,bool bVisible)

void setGeomVisible(ulong id, bool bVisible)

XVertex* getVertexByNode(XNode * pNode)

void createDefaultPart()

void write(XBinaryIO * io) const

void save(const char * fname) const

bool load(const char * fname)

void saveH5(const char * fname) const

bool loadH5(const char * fname)

ErrorCode read(XBinaryIO * io)

void write(XH5IO * io, H5Obj * grp) const

bool read(XH5IO * io, H5Obj * grp)

void copy(XModel * mdl)

bool isVisible() const

void setVisible(bool b)

void updateAfterRenumber(TypeID tid)

void setGLDataReady(bool bReady)

real getNormalizedScale()

void setNormalizedScale(real s)

OpnRecorder * getRecorder()

void updateFaceColorByPart(const XPart * p)

void setGeomVisible(const XGeometry * g, bool bVisible)


void writeNodes(XBinaryIO * io) const

ErrorCode readNodes(XBinaryIO * io,int cnt)

void writeElements(XBinaryIO * io) const

ErrorCode readElements(XBinaryIO * io)

void writeAssembly(XBinaryIO * io, TreeNode * pItem = 0) const

ErrorCode readAssembly(XBinaryIO * io, TreeNode * pItem = 0)