#pragma once

#include "McDbObject.h"

class McDbEntity;
class McDbSymbolTableRecord;
class McDbSymbolTableIterator;
class McDbSymbolTableImp;
// -------------------------------------------------------------------------
// Summary:
// 		McDbSymbolTable是控件的内建符号表的所有类的基类
// -------------------------------------------------------------------------
class ARXDLL McDbSymbolTable : public McDbObject  
{
	friend class McDbSymbolTableIterator;
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbSymbolTable);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbSymbolTable();

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbSymbolTable();

	// -------------------------------------------------------------------------
	// Summary:
	// 		由符号表名返回符号表记录对象
	// Parameters:
	// 		entryName		-	符号表记录名
	//		pRec			-	返回符号表中的记录指针，在不使用后需要关闭
	//		openMode     	-	符号表记录的打开方式
	//		openErasedRec	-	是否返回删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus getAt (LPCMSTR entryName,
                             McDbSymbolTableRecord*& pRec,
                             McDb::OpenMode openMode,
                             bool openErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		由符号表名返回符号表记录对象
	// Parameters:
	// 		entryName		-	符号表记录名
	//		recordId		-	返回符号表中的记录id
	//		openErasedRec	-	是否返回删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus getAt (LPCMSTR entryName,
                             McDbObjectId& recordId,
                             bool getErasedRecord = false) const;
	
	// -------------------------------------------------------------------------
	// Summary:
	// 		表中是否包含对象名为name的记录
	// Parameters:
	// 		name - 符号表记录名
	// Returns:
	// 		如有返回true
	// -------------------------------------------------------------------------
    bool              has(LPCMSTR name) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		表中是否包含对象ID为id的记录
	// Parameters:
	// 		id - 符号表记录id
	// Returns:
	// 		如有返回true
	// -------------------------------------------------------------------------
    bool              has(McDbObjectId id) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		创建一个遍历器对象，用于遍历SymbolTable中的内容,在不使用时调用delete释放内存
	// Parameters:
	// 		pIterator	-	新创建的遍历器的指针
	// 		atBeginning	-	输入布尔值，表示从表的开始处或结束处开始
	// 		skipDeleted	-	输入布尔值，表示是否忽略已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus newIterator(McDbSymbolTableIterator*& pIterator,
                                  bool atBeginning = true,
                                  bool skipDeleted = true);

	// -------------------------------------------------------------------------
	// Summary:
	// 		往符号表中新添加记录，新加入的符号表记录指针在不使用时，需要调用close函数关闭
	// Parameters:
	// 		pRecord - 新加入的符号表记录指针
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus add(McDbSymbolTableRecord* pRecord);
	
	// -------------------------------------------------------------------------
	// Summary:
	// 		往符号表中新添加记录，新加入的符号表记录指针在不使用时，需要调用close函数关闭
	// Parameters:
	// 		pRecord		-	新加入的符号表记录指针
	//		recordId	-	返回符号表记录id
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus add(McDbObjectId& recordId, McDbSymbolTableRecord* pRecord);

	//:Ignore
	
    virtual Mcad::ErrorStatus dwgInFields (McDbDwgFiler* pFiler);

    virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;

	//


	long getSize() const;


	bool              remove(McDbObjectId id);

	bool              remove(LPCMSTR name);



	MxString  createAnonymityName(LPCTSTR pszInAnonymityFalg = 0) const;


public:

	//:End Ignore
	inline McDbSymbolTableImp* getbSymbolTableImp() const {
		return (McDbSymbolTableImp*)m_pImp;
	}

};

class McDbSymbolTableIteratorImp;
// -------------------------------------------------------------------------
// Summary:
// 		遍历符号表中所有记录的遍历器类型
// -------------------------------------------------------------------------
class ARXDLL McDbSymbolTableIterator
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
    virtual ~McDbSymbolTableIterator();

	// -------------------------------------------------------------------------
	// Summary:
	// 		把遍历器当前位置定位到开始位置/结束位置
	// Parameters:
	// 		atBeginning -	为true定位到开始位置，为false定位到结束位置
	//		skipDeleted	-	输入布尔值，表示是否可定位在一个已删除记录
	// -------------------------------------------------------------------------
    void 	start	(bool atBeginning = true,bool skipDeleted = true);

	// -------------------------------------------------------------------------
	// Summary:
	// 		遍历器是否处于结束位置
	// -------------------------------------------------------------------------
    bool    done	() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回遍历器当前位置的对象的id
	// Parameters:
	// 		id - 对象id
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus 	getRecordId(McDbObjectId& id) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回当前遍历器位置的符号表记录指针，在不使用时调用close函数关闭对象
	// Parameters:
	// 		pRecord			-	返回符号表记录指针
	//		openMode		-	打开方式
	//		openErasedRec	-	是否打开已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus	getRecord(McDbSymbolTableRecord*& pRecord,
				 McDb::OpenMode openMode,
				 bool openErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		移动当前遍历器位置
	// Parameters:
	// 		forward - 为ture向前移动一位，为false向后移动位
	// -------------------------------------------------------------------------
    void	 	step    (bool forward = true,
				 bool skipDeleted = true);

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到id指向的记录处
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus   seek	(McDbObjectId id);

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到pRecord指向的记录处
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus   seek	(const McDbSymbolTableRecord* pRecord);
private:

	//:Ignore

	// 禁用等号和拷贝操作
	McDbSymbolTableIterator(const McDbSymbolTableIterator&){m_pImp = NULL;}
	McDbSymbolTableIterator& operator= (const McDbSymbolTableIterator&){return *this;};

protected:
	friend class McDbSymbolTableImp;
    McDbSymbolTableIterator(McDbSymbolTableIteratorImp*& pImp);
private:
	McDbSymbolTableIteratorImp* m_pImp;
	//:End Ignore
};

class McDbSymbolTableRecordImp;
// -------------------------------------------------------------------------
// Summary:
// 		符号表记录型类型,是不同符号表的记录的基类
// -------------------------------------------------------------------------
class ARXDLL McDbSymbolTableRecord : public  McDbObject
{
protected:
	McDbSymbolTableRecord(McDbSymbolTableRecordImp* pImp);
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
    MCDB_DECLARE_MEMBERS(McDbSymbolTableRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
    McDbSymbolTableRecord();

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
    virtual ~McDbSymbolTableRecord();

    typedef McDbSymbolTable TableType;



	// -------------------------------------------------------------------------
	// Summary:
	// 		返回符号表记录的名称
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus getName(LPCMSTR& pName) const;

	Mcad::ErrorStatus getName(MxString& pName) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置符号表记录的名称
	// Parameters:
	// 		pName	-	新名称,专为空，可以改成匿名块。
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus setName(LPCMSTR pName);

	//:Ignore
	
	
	
	
    virtual Mcad::ErrorStatus dwgInFields (McDbDwgFiler* pFiler);
    virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;


	
	Mcad::ErrorStatus deepClone(
		McDbObject*& pClone,
		McDbCloneIdMapping& idMap) const override;

	Mdesk::Boolean    isAnonymity() const;

	inline McDbSymbolTableRecordImp* getMcDbSymbolTableRecordImp() const {
		return (McDbSymbolTableRecordImp*)m_pImp;
	}


	//:End Ignore
};

class McDbBlockTableRecord;
class McDbBlockTableIterator;

// -------------------------------------------------------------------------
// Summary:
// 		数据库中的块表类，块表中存放着块表记录，我们常见的模型空间就是块表中名为*Model_Space 的块表记录
// Remarks:
// 		例如:遍历块表中所有的块表记录
// 		<code>	
// 			void GetAllBlockRecord()
// 			{
// 				// 读方式打开块表对象
// 				McDbBlockTablePointer spBlkTabl(acdbCurDwg(),McDb::kForRead);
// 				if(spBlkTabl.openStatus() != Mcad::eOk)
// 					return;
// 
// 				// 创建一个遍历器，准备遍历块表
// 				McDbBlockTableIterator* pIterator = NULL;
// 				spBlkTabl->newIterator(pIterator);
// 
// 				if(pIterator == NULL)
// 					return;
// 				// 把遍历器的指针交给智能指针管理
// 				std::unique_ptr<McDbBlockTableIterator> spIterator(pIterator);
// 
// 				// 遍历所有记录
// 				for(;!pIterator->done();pIterator->step())
// 				{
// 					McDbObjectId id;
// 					pIterator->getRecordId(id);
// 
// 					// 读方式打开记录
// 					McDbObjectPointer<McDbBlockTableRecord> spBlkRec(id,McDb::kForRead);
// 					if(spBlkRec.openStatus() != Mcad::eOk)
// 						continue;
// 					LPCMSTR pszName = NULL;
// 					spBlkRec->getName(pszName);
// 
// 					MxString sT;
// 					sT.Format(_T("发现块表记录名:%s"),pszName);
// 					AfxMessageBox(sT);
// 				}
// 			};
// 		</code>
// -------------------------------------------------------------------------
class ARXDLL McDbBlockTable: public McDbSymbolTable
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
    MCDB_DECLARE_MEMBERS(McDbBlockTable);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
    McDbBlockTable();

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
    virtual ~McDbBlockTable();

    //typedef McDbBlockTableRecord RecordType;

	// -------------------------------------------------------------------------
	// Summary:
	// 		由块名返回块表记录对象
	// Parameters:
	// 		entryName		-	块表记录名
	//		pRec			-	返回块表中的记录指针，在不使用后需要关闭
	//		openMode     	-	块表记录的打开方式
	//		openErasedRec	-	是否返回删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus getAt (LPCMSTR entryName,
                             McDbBlockTableRecord*& pRec,
                             McDb::OpenMode openMode,
                             bool openErasedRec = false) const;


	// -------------------------------------------------------------------------
	// Summary:
	// 		由块表名返回块表记录对象
	// Parameters:
	// 		entryName		-	块表记录名
	//		recordId		-	返回块表中的记录id
	//		openErasedRec	-	是否返回删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus getAt (LPCMSTR entryName,
                             McDbObjectId& recordId,
                             bool getErasedRec = false) const;
							 
	// -------------------------------------------------------------------------
	// Summary:
	// 		表中是否包含对象名为name的记录
	// Parameters:
	// 		name - 块表记录名
	// Returns:
	// 		如有返回true
	// -------------------------------------------------------------------------
    bool              has   (LPCMSTR name) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		表中是否包含对象ID为id的记录
	// Parameters:
	// 		id - 块表记录id
	// Returns:
	// 		如有返回true
	// -------------------------------------------------------------------------
    bool              has   (McDbObjectId id) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		创建一个遍历器对象，用于遍历SymbolTable中的内容,在不使用时调用delete释放内存
	// Parameters:
	// 		pIterator	-	新创建的遍历器的指针
	// 		atBeginning	-	输入布尔值，表示从表的开始处或结束处开始
	// 		skipDeleted	-	输入布尔值，表示是否忽略已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus newIterator(McDbBlockTableIterator*& pIterator,
                                  bool atBeginning = true,
                                  bool skipDeleted = true) const;
	
	// -------------------------------------------------------------------------
	// Summary:
	// 		往块表中新添加记录，新加入的块表记录指针在不使用时，需要调用close函数关闭
	// Parameters:
	// 		pRecord - 新加入的块表记录指针
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus add   (McDbBlockTableRecord* pRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		往块表中新添加记录，新加入的块表记录指针在不使用时，需要调用close函数关闭
	// Parameters:
	// 		pRecord		-	新加入的块表记录指针
	//		recordId	-	返回块表记录id
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus add   (McDbObjectId& recordId, McDbBlockTableRecord* pRecord);

	//:Ignore
	

	//:End Ignore
};

// -------------------------------------------------------------------------
// Summary:
// 		遍历块表中所有记录的遍历器类型
// -------------------------------------------------------------------------
class ARXDLL McDbBlockTableIterator : public McDbSymbolTableIterator
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		返回当前遍历器位置的块表记录指针，在不使用时调用close函数关闭对象
	// Parameters:
	// 		pRecord			-	返回块表记录指针
	//		openMode		-	打开方式
	//		openErasedRec	-	是否打开已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus getRecord(McDbBlockTableRecord*& pRecord,
        McDb::OpenMode openMode, bool openErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到id指向的记录处
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus seek(McDbObjectId id);

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到pRecord指向的记录处
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus seek(const McDbBlockTableRecord* pRecord);

protected:
	//:Ignore
	
    McDbBlockTableIterator(McDbSymbolTableIteratorImp* pImpIter);
    friend class McDbBlockTable;
	//:End Ignore
};


class McDbBlockTableRecordIterator;
class McDbBlockTableRecordImp;
// -------------------------------------------------------------------------
// Summary:
// 		数据库的块表记录类型，所有可见实体都会放到块表记录中用于显示
// Remarks:
// 		例如:遍历图所有实体信息，并修改实体的颜色
// 		<code>
// 			void ModifyAllEntity()
// 			{
// 				// 下面读取图中指定块的属性。
// 				McDbBlockTableRecordPointer spBlkRec(MCDB_MODEL_SPACE,
// 					acdbCurDwg(),McDb::kForRead);
// 
// 				if(spBlkRec.openStatus() != Mcad::eOk)
// 				{
// 					return;
// 				}
// 
// 				// 生成遍历数据库用的遍历器.
// 				McDbBlockTableRecordIterator* pIterator = NULL;
// 				spBlkRec->newIterator(pIterator);
// 
// 				if(pIterator == NULL)
// 					return;
// 
// 				std::unique_ptr<McDbBlockTableRecordIterator> spIter(pIterator);
// 
// 				// 遍历数据库
// 				for(;!pIterator->done();pIterator->step() )
// 				{
// 					McDbObjectId id;
// 					pIterator->getEntityId(id);
// 
// 					McDbObjectPointer<AcDbEntity> spEntity(id,McDb::kForWrite);
// 					if(spEntity.openStatus() != Mcad::eOk)
// 						continue;
// 
// 					spEntity->setColorIndex(MrxDbgUtils::kWhite);
// 
// 					if(McDbLine::cast(spEntity.object()) != NULL)
// 					{
// 						// 是个直线实体
// 						McDbLine* pLine = McDbLine::cast(spEntity.object());
// 					}
// 					else if(McDbArc::cast(spEntity.object()) != NULL)
// 					{
// 						// 是个圆弧实体
// 						McDbArc* pArc = McDbArc::cast(spEntity.object());
// 					}
// 					else if(McDbText::cast(spEntity.object()) != NULL)
// 					{
// 						// 是个文字实体
// 						McDbText* pText = McDbText::cast(spEntity.object());
// 					}
// 					/*
// 					else if... ...
// 					*/
// 
// 				}
// 			}
// 		</code>
// -------------------------------------------------------------------------
class ARXDLL McDbBlockTableRecord: public  McDbSymbolTableRecord
{
	friend class McDbBlockTableRecordIterator;
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbBlockTableRecord);
	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbBlockTableRecord();
	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbBlockTableRecord();
	typedef McDbBlockTable TableType;
	typedef McArray<Mdesk::UInt8> PreviewIcon;
	
	// -------------------------------------------------------------------------
	// Summary:
	// 		向块表记录中添加实体，pEnity在添加后不使用时，需要调用close关闭对象
	// Parameters:
	// 		pEntity - 输入指向要增加的实体的指针
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus appendAcDbEntity(McDbEntity* pEntity);

	// -------------------------------------------------------------------------
	// Summary:
	// 		向块表记录中添加实体，pEnity在添加后不使用时，需要调用close关闭对象
	// Parameters:
	// 		pEntity		-	输入指向要增加的实体的指针
	//		pOutputId	-	返回增加的实体的对象ID
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus appendAcDbEntity(McDbObjectId& pOutputId,
        McDbEntity* pEntity);


	// -------------------------------------------------------------------------
	// Summary:
	// 		创建一个遍历器，用于遍历块表记录中的所有实体，返回的遍历器指针在不使用时需要调用delete释放内存
	// Parameters:
	// 		pIterator	-	返回新创建的遍历器指针
	//		atBeginning	-	暂没有使用
	//		skipDeleted	-	是否跳过已经删除的对象
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus newIterator(
	McDbBlockTableRecordIterator*& pIterator,
	bool atBeginning = true,
	bool skipDeleted = true) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回块表记录的插入原点
	// -------------------------------------------------------------------------
	McGePoint3d origin() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置块表记录的插入原点
	// Parameters:
	// 		origin	-	块表记录的插入原点 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	void setOrigin(const McGePoint3d& origin);


	//:Ignore
	

	bool              isAnonymous() const;

	bool              isFromExternalReference() const;

	bool              isFromOverlayReference() const;

	bool              isLayout() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		图块外部参照的文件名。
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus pathName(const MCHAR*& pPath) const;
	Mcad::ErrorStatus pathName(MCHAR*& pPath) const;
	Mcad::ErrorStatus setPathName(const MCHAR* pathStr);

	McDbObjectId      getLayoutId() const;
	Mcad::ErrorStatus setLayoutId(McDbObjectId);

	virtual Mcad::ErrorStatus dwgInFields (McDbDwgFiler* pFiler);
	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;

	bool			  isInstanceworldDraw() const;

	void			  setIsInstanceworldDraw(bool b);

	Mcad::ErrorStatus getMinMaxDrawOrder(double& dMin, double& dMax);


	Mcad::ErrorStatus deepClone(
		McDbObject*& pClone,
		McDbCloneIdMapping& idMap) const override;

public:
	inline McDbBlockTableRecordImp* getBlockTableRecordImp() const {
		return (McDbBlockTableRecordImp*)m_pImp;
	}
	//:End Ignore
};

class McDbBlockTableRecordIteratorImp;
// -------------------------------------------------------------------------
// Summary:
// 		遍历块表记录中所有实体的的遍历器
// -------------------------------------------------------------------------
class ARXDLL McDbBlockTableRecordIterator
{
	friend class McDbBlockTableRecordImp;
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
    virtual ~McDbBlockTableRecordIterator();

	// -------------------------------------------------------------------------
	// Summary:
	// 		把遍历器定位到开始位置/结束位置
	// Parameters:
	// 		atBeginning		-	为true定位在开始，为false定位在结束
	//		skipDeleted		-	是否跳过删除的对象
	// -------------------------------------------------------------------------
    void 			  start (bool atBeginning = true,
		   	     bool skipDeleted = true);

	// -------------------------------------------------------------------------
	// Summary:
	// 		遍历器的位置是否已经在结束位置
	// -------------------------------------------------------------------------
    bool              done  () const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回遍历器当前位置的实体id
	// Parameters:
	// 		entityId - 返回的实体id
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus getEntityId (McDbObjectId& entityId) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		打开遍历器当前位置的实体，把实体指针赋给pEntity变量
	// Parameters:
	// 		pEntity				-	返回实体的指针,在不使用时，调用close函数关闭对象
	//		openMode			-	打开方式
	//		openErasedEntity	-	是否打开删除的对象
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus getEntity(McDbEntity*& pEntity, McDb::OpenMode openMode,
				bool openErasedEntity = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回遍历器遍历的块表记录对象
	// -------------------------------------------------------------------------
    const McDbBlockTableRecord* blockTableRecord() const;


	// -------------------------------------------------------------------------
	// Summary:
	// 		移动当前遍历器位置
	// Parameters:
	// 		forward - 为ture向前移动一位，为false向后移动位
	// -------------------------------------------------------------------------

    void			  step (bool forward = true,
			    bool skipDeleted = true);

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到id指向的实体处
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus seek (McDbObjectId id);

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到pEntity指向的实体处
	// -------------------------------------------------------------------------
    Mcad::ErrorStatus seek (const McDbEntity* pEntity);
//:Ignore

protected:
    McDbBlockTableRecordIterator(McDbBlockTableRecordIteratorImp* pIterImp);
private:
	// 禁用等号和拷贝操作
	McDbBlockTableRecordIterator(const McDbBlockTableRecordIterator&){m_pIterImp = NULL;}
	McDbBlockTableRecordIterator& operator= (const McDbBlockTableRecordIterator&){return *this;};

private:
	McDbBlockTableRecordIteratorImp* m_pIterImp;
//:End Ignore
};

// 层表

class McDbLayerTableRecord;
class McDbLayerTableIterator;

// -------------------------------------------------------------------------
// Summary:
// 		数据库中的层表，所有图层信息都存放在层表中
// Remarks:
// 		例如:得到所有层名
// 		<code>
// 			void GetAllLayerName()
// 			{
// 				// 读方式打开层表对象
// 				McDbLayerTablePointer spLayerTabl(acdbCurDwg(),McDb::kForRead);
// 				if(spLayerTabl.openStatus() != Mcad::eOk)
// 					return;
// 
// 				// 创建一个遍历器，准备遍历块表
// 				McDbLayerTableIterator* pIterator = NULL;
// 				spLayerTabl->newIterator(pIterator);
// 
// 				if(pIterator == NULL)
// 					return;
// 				// 把遍历器的指针交给智能指针管理
// 				std::unique_ptr<McDbLayerTableIterator> spIterator(pIterator);
// 
// 				// 遍历所有记录
// 				for(;!pIterator->done();pIterator->step())
// 				{
// 					McDbObjectId id;
// 					pIterator->getRecordId(id);
// 
// 					// 读方式打开记录
// 					McDbObjectPointer<McDbLayerTableRecord> spLayerRec(id,McDb::kForRead);
// 					if(spLayerRec.openStatus() != Mcad::eOk)
// 						continue;
// 					LPCMSTR pszName = NULL;
// 					spLayerRec->getName(pszName);
// 
// 					MxString sT;
// 					sT.Format(_T("发现层名:%s"),pszName);
// 					AfxMessageBox(sT);
// 				}
// 			};
// 		</code>
//		打开所有层的代码
// 		<code>
// 			void CTestCommands::TestOpenAllLayer()
// 			{
// 				AcDbLayerTablePointer spLayerTable(acdbHostApplicationServices()->workingDatabase(),
// 					AcDb::kForRead);
// 				if(spLayerTable.openStatus() != Acad::eOk)
// 					return;
// 
// 				AcDbLayerTableIterator* pLayerIter = NULL;
// 				spLayerTable->newIterator(pLayerIter);
// 				if(pLayerIter != NULL)
// 				{
// 					for(pLayerIter->start();!pLayerIter->done();pLayerIter->step())
// 					{
// 						McDbLayerTableRecord* pRecord = NULL;
// 						pLayerIter->getRecord(pRecord,AcDb::kForWrite);
// 						if(pRecord != NULL)
// 						{
// 							pRecord->setIsOff(false);
// 							pRecord->close();
// 						}
// 					}
// 					delete pLayerIter;
// 				}
// 			}
// 		</code>
// -------------------------------------------------------------------------
class ARXDLL McDbLayerTable: public McDbSymbolTable
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbLayerTable);
	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbLayerTable();

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbLayerTable();

	//typedef McDbLayerTableRecord RecordType;

	// -------------------------------------------------------------------------
	// Summary:
	// 		由层名返回层表记录对象
	// Parameters:
	// 		entryName		-	层名
	//		pRec			-	返回层表中的记录指针，在不使用后需要关闭
	//		openMode     	-	层表记录的打开方式
	//		openErasedRec	-	是否返回删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getAt(LPCMSTR entryName,
		McDbLayerTableRecord*& pRec,
		McDb::OpenMode openMode,
		bool openErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		由层名返回层表记录对象
	// Parameters:
	// 		entryName		-	层名
	//		recordId		-	返回层表记录id
	//		openErasedRec	-	是否返回删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getAt(LPCMSTR entryName,
		McDbObjectId& recordId,
		bool getErasedRecord = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		层表中是否包含层名为name的记录
	// Parameters:
	// 		name - 层名
	// Returns:
	// 		如有返回true
	// -------------------------------------------------------------------------
	bool              has  (LPCMSTR name) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		表中是否包含对象ID为id的记录
	// Parameters:
	// 		id - 层记录id
	// Returns:
	// 		如有返回true
	// -------------------------------------------------------------------------
	bool              has  (McDbObjectId id) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		创建一个遍历器对象，用于遍历层表中的内容,在不使用时调用delete释放内存
	// Parameters:
	// 		pIterator	-	新创建的遍历器的指针
	// 		atBeginning	-	输入布尔值，表示从表的开始处或结束处开始
	// 		skipDeleted	-	输入布尔值，表示是否忽略已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus newIterator(McDbLayerTableIterator*& pIterator,
		bool atBeginning = true,
		bool skipDeleted = true) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		往层表中新添加一个层，新加入层记录指针在不使用时，需要调用close函数关闭
	// Parameters:
	// 		pRecord - 新加入的层记录指针
	// Returns:
	// 		如果成功返回Mcad::eOk
	// Remarks:
	// 		例如:新创建一个层的代码
	// 		<code>
	// 			void CTestCommands::AddLayer()
	// 			{
	// 				CAddLayerDialog addLayerDlg;
	// 				if(addLayerDlg.DoModal() == IDOK)
	// 				{
	// 					MxString sNewLayerName = addLayerDlg.m_sLayerName;
	// 
	// 					AcDbLayerTablePointer spLayerTable(acdbCurDwg(),AcDb::kForWrite);
	// 					if(spLayerTable.openStatus() == Acad::eOk)
	// 					{
	// 						if(spLayerTable->has(sNewLayerName) )
	// 						{
	// 							MxString sT;
	// 							sT.Format(_T("当前数据库已经有该层名:%s 的层，不能再新增加"),sNewLayerName);
	// 							AfxMessageBox(sT);
	// 							return;
	// 						}
	// 						AcDbLayerTableRecord* pLayerRecord = new AcDbLayerTableRecord;
	// 						pLayerRecord->setName(sNewLayerName);
	// 						spLayerTable->add(pLayerRecord);
	// 						pLayerRecord->close();
	// 
	// 						AfxMessageBox(_T("增加层成功"));
	// 					}
	// 					else
	// 					{
	// 						AfxMessageBox(_T("打开层表失败"));
	// 					}
	// 				}
	// 			}
	// 		</code>
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus add (McDbLayerTableRecord* pRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		往层表中新添加一个层，新加入层记录指针在不使用时，需要调用close函数关闭
	// Parameters:
	// 		pRecord		-	新加入的层记录指针
	//		recordId	-	返回新加入的层记录id
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus add (McDbObjectId& recordId, McDbLayerTableRecord* pRecord);

	//:Ignore
protected:

		virtual void OnObjectCloseEvent();
	//:End Ignore
};


// -------------------------------------------------------------------------
// Summary:
// 		遍历所有图层的遍历器
// -------------------------------------------------------------------------
class ARXDLL McDbLayerTableIterator : public McDbSymbolTableIterator
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		返回当前遍历器位置的层记录指针，在不使用时调用close函数关闭对象
	// Parameters:
	// 		pRecord			-	返回层记录指针
	//		openMode		-	打开方式
	//		openErasedRec	-	是否打开已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getRecord(McDbLayerTableRecord*& pRecord,
		McDb::OpenMode openMode, bool openErasedRec = false) const;
	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到id指向的记录处
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus seek(McDbObjectId id);

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到pRecord指向的记录处
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus seek(const McDbLayerTableRecord* pRecord);

	//:Ignore
	
protected:
	McDbLayerTableIterator(McDbSymbolTableIteratorImp* pImpIter);
	friend class McDbLayerTable;
	//:End Ignore
};

// McDbLayerTableRecord
class McCmColor;
class McDbLayerTableRecordImp;

// -------------------------------------------------------------------------
// Summary:
// 		数据库的层表记录类型，提供图层相关所有的属性操作
// -------------------------------------------------------------------------
class ARXDLL McDbLayerTableRecord: public  McDbSymbolTableRecord
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbLayerTableRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbLayerTableRecord();

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbLayerTableRecord();

	typedef McDbLayerTable TableType;

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回图层是否处于冻结状态
	// -------------------------------------------------------------------------
	bool              isFrozen() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置图层冻结状态
	// Parameters:
	// 		frozen	-	是否冻结图层
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus setIsFrozen(bool frozen);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回图层是否处于关闭状态
	// -------------------------------------------------------------------------
	bool              isOff() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置图层关闭状态
	// Parameters:
	// 		off	-	是否关闭图层 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	void              setIsOff(bool off);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回图层是否处于锁定状态
	// -------------------------------------------------------------------------
	bool              isLocked() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置图层锁定状态
	// Parameters:
	// 		locked	-	是否锁定图层
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	void              setIsLocked(bool locked);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回图层的颜色
	// -------------------------------------------------------------------------
	const McCmColor&         color() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置图层的颜色
	// Parameters:
	// 		color	-	图层的颜色 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	void              setColor(const McCmColor &color);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回图层的线型id
	// -------------------------------------------------------------------------
	McDbObjectId      linetypeObjectId() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置图层的线型
	// Parameters:
	// 		id	-	线型id 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	void              setLinetypeObjectId(McDbObjectId id);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回图层的线重
	// -------------------------------------------------------------------------
	McDb::LineWeight  lineWeight() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置图层的线重
	// Parameters:
	// 		weight	-	图层的线重
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus setLineWeight(McDb::LineWeight weight);



	// -------------------------------------------------------------------------
	// Summary:
	// 		返图图层的亮度,默认值为20 ~ 255
	// -------------------------------------------------------------------------
	BYTE bright();

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置图层的亮度
	// Parameters:
	// 		iBright - 图层的亮度,取值为20 ~ 255
	// -------------------------------------------------------------------------
	void setBright(BYTE iBright);

	//:Ignore
	
	bool              isPlottable() const;
	Mcad::ErrorStatus setIsPlottable(bool plot);


	virtual Mcad::ErrorStatus dwgInFields (McDbDwgFiler* pFiler);
	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;

protected:
	virtual void OnObjectCloseEvent();
	//:End Ignore

public:
	inline McDbLayerTableRecordImp* getLayerTableRecordImp() const {
		return (McDbLayerTableRecordImp*)m_pImp;
	}
};

// 线型表记录 McDbLinetypeTableRecord
class McDbLinetypeTableRecord;
class McDbLinetypeTableIterator;

// -------------------------------------------------------------------------
// Summary:
// 		数据库中的线型表，所有的线型定义都存放在这里
// Remarks:
// 		例如:得到所有的线型
// 		<code>
// 			void GetAllLineTypeName()
// 			{
// 				// 读方式打开线型表
// 				McDbLinetypeTablePointer spLinetypeTable(acdbCurDwg(),McDb::kForRead);
// 				if(spLinetypeTable.openStatus() != Mcad::eOk)
// 					return;
// 
// 				// 创建一个遍历器，准备遍历块表
// 				McDbLinetypeTableIterator* pIterator = NULL;
// 				spLinetypeTable->newIterator(pIterator);
// 
// 				if(pIterator == NULL)
// 					return;
// 				// 把遍历器的指针交给智能指针管理
// 				std::unique_ptr<McDbLinetypeTableIterator> spIterator(pIterator);
// 
// 				// 遍历所有记录
// 				for(;!pIterator->done();pIterator->step())
// 				{
// 					McDbObjectId id;
// 					pIterator->getRecordId(id);
// 
// 					// 读方式打开记录
// 					McDbObjectPointer<McDbLinetypeTableRecord> spLinetypeRec(id,McDb::kForRead);
// 					if(spLinetypeRec.openStatus() != Mcad::eOk)
// 						continue;
// 					LPCMSTR pszName = NULL;
// 					spLinetypeRec->getName(pszName);
// 
// 					MxString sT;
// 					sT.Format(_T("发现线型名:%s"),pszName);
// 					AfxMessageBox(sT);
// 				}
// 			};
// 		</code>
// 		例如:向控件增加一个简单线型
// 		<code>
// 			AcDbObjectId AddLinetype(MxDraw::MXDRAWOCXHANDLE m_hDrawOcx,
// 									 LPCMSTR pszName, LPCMSTR pszLineDefine)
// 			{
// 				MxString sName(pszName);
// 				if(sName.IsEmpty() )
// 					return AcDbObjectId::kNull;
// 
// 				{
// 					AcDbLinetypeTableRecordPointer spLinTypeTabRec(sName,
// 						MxDraw::GetDatabase(m_hDrawOcx),McDb::kForRead);
// 					if(spLinTypeTabRec.openStatus() == Mcad::eOk)
// 					{
// 						// 控件内已经有该名称的线型了。
// 						return AcDbObjectId::kNull;
// 					}
// 				}
// 
// 				AcDbLinetypeTablePointer spLineTypeTable(MxDraw::GetDatabase(m_hDrawOcx),AcDb::kForWrite);
// 				if(spLineTypeTable.openStatus() != Acad::eOk)
// 				{
// 					return AcDbObjectId::kNull;
// 				}
// 
// 				// 读取线数据定义。
// 				std::vector<mxreal> vecLineData;
// 
// 				MxStrList list(pszLineDefine);
// 				int iCount = list.GetCount();
// 				for(int i = 0; i < iCount;i++)
// 				{
// 					mxreal d = list.GetDoubleAt(i);
// 
// 					vecLineData.push_back(d);
// 
// 				}
// 
// 				if(vecLineData.size() < 1)
// 				{
// 					return AcDbObjectId::kNull;
// 				}
// 
// 				// 创建线形数据。
// 				AcDbLinetypeTableRecord* pNewRec = new AcDbLinetypeTableRecord;
// 				MxString strT;
// 				strT.Format(_T("custom line type: %s"),sName);
// 				pNewRec->setName(sName);
// 				pNewRec->setAsciiDescription(strT);
// 				pNewRec->setPatternLength(1.0);
// 				pNewRec->setNumDashes((int)(vecLineData.size() ) );
// 
// 				for(unsigned int k = 0; k < vecLineData.size();k++)
// 				{
// 					pNewRec->setDashLengthAt(k,vecLineData[k]);
// 				}
// 
// 				AcDbObjectId linetypeId;
// 				spLineTypeTable->add(linetypeId,pNewRec);
// 				pNewRec->close();
// 
// 				return linetypeId;
// 			}
// 
// 			// 调用代码
// 			AddLinetype(MxDraw::GetCurOcxHandle(),
// 						_T("MyLineType"), _T("6,-10"));
// 		</code>
// 		例如:向控件增加一个带文字的线型
// 		<code>
// 			McDbObjectId AddLinetypeEx(MxDraw::MXDRAWOCXHANDLE m_hDrawOcx,
// 									   LPCMSTR pszName, LPCMSTR pszLineDefine,
// 									   LPCMSTR pszTextStyle)
// 			{
// 				MxString sName(pszName);
// 				if(sName.IsEmpty() )
// 					return McDbObjectId::kNull;
// 
// 				MxString sTextStyle(pszTextStyle);
// 				if(sTextStyle.IsEmpty() )
// 					return McDbObjectId::kNull;
// 
// 
// 				{
// 					AcDbLinetypeTableRecordPointer spLinTypeTabRec(sName,
// 						MxDraw::GetDatabase(m_hDrawOcx),McDb::kForRead);
// 					if(spLinTypeTabRec.openStatus() == Mcad::eOk)
// 					{
// 						// 控件内已经有该名称的线型了。
// 						return McDbObjectId::kNull;
// 					}
// 				}
// 
// 				McDbObjectId lineTypeId;
// 				{
// 					McDbTextStyleTableRecordPointer spTextStyleTabRec(sTextStyle,
// 						MxDraw::GetDatabase(m_hDrawOcx),McDb::kForRead);
// 					if(spTextStyleTabRec.openStatus() != Mcad::eOk)
// 					{
// 
// 						return McDbObjectId::kNull;
// 					}
// 
// 					lineTypeId = spTextStyleTabRec->objectId();
// 				}
// 
// 
// 				AcDbLinetypeTablePointer spLineTypeTable(MxDraw::GetDatabase(m_hDrawOcx),AcDb::kForWrite);
// 				if(spLineTypeTable.openStatus() != Acad::eOk)
// 				{
// 					return McDbObjectId::kNull;
// 				}
// 
// 
// 				enum UnitType
// 				{
// 					kInvalid= 0,		// 无效的类型，用于dwgOutFields,dwgInFields
// 					kNormal	= 1,		// 正常的Dashe数据
// 					kText	= 2,		// 复合的文字的数据,因为线型中可以有文字
// 					kShap	= 3			// 复合的形数据
// 				};
// 
// 
// 				enum RotationType
// 				{
// 					kA,		// 旋转角度是相对于坐标系统的X轴
// 					kR		// 旋转角度是相对曲线该点处的切线方向
// 				};
// 
// 
// 				// 临时的线型数据。
// 				struct stuLineUnit
// 				{
// 					UnitType type;				// 数据类型
// 
// 					mxreal d;					// Dashe的长度
// 
// 					MxString sTxt;						// 文字内容
// 					McDbHardPointerId  textStyleId;	// 文字风格ID。
// 					mxreal  dScale;						// 缩放比例
// 					RotationType     rotationType;			//  旋转角度的类型
// 					mxreal  dRotation;					// 旋转角度
// 					mxreal  dXoffset;					// 文字在线型上位置的X偏移
// 					mxreal  dYoffset;					// 文字在线型上位置的Y偏移	
// 
// 					int     iShapeNumber;				// 形在形文件中的编号.
// 
// 					stuLineUnit()
// 					{
// 						d = 0.0;
// 						type = kNormal;
// 
// 						dScale = 1.0;
// 						rotationType = kR;
// 						dRotation = 0.0;
// 						dXoffset = 0.0;
// 						dYoffset = 0.0;
// 
// 						iShapeNumber = 0;
// 					}
// 				};
// 
// 
// 				// 读取线数据定义。
// 				std::vector<stuLineUnit> vecLineData;
// 
// 				CStrList list(pszLineDefine);
// 				int iCount = list.GetCount();
// 				for(int i = 0; i < iCount;i++)
// 				{
// 					stuLineUnit tmp;
// 					tmp.textStyleId = lineTypeId;
// 
// 					MxString sShpDef = list.GetStrAt(i);
// 					if(Mx::IsNumerical(sShpDef) )
// 					{
// 						tmp.d		= _tstof(sShpDef);
// 						tmp.type	= kNormal;
// 						vecLineData.push_back(tmp);
// 					}
// 					else
// 					{
// 						// 可能是个复杂的形文字。
// 						if(sShpDef.IsEmpty()
// 							|| sShpDef[0] != _T('(')
// 							|| sShpDef[sShpDef.GetLength() - 1] != _T(')')
// 							)
// 							continue;
// 
// 						bool isGetTxt     = false;
// 						bool iShapeNumber = false;
// 
// 						CStrList lstShpDef(sShpDef);
// 						int iShpDefCount = lstShpDef.GetCount();
// 						for(int j = 0; j < iShpDefCount;j++)
// 						{
// 							MxString sTmpV = lstShpDef.GetStrAt(j);
// 							if(sTmpV.IsEmpty() || sTmpV.GetLength() < 3)
// 								continue;
// 
// 							MxString sFlag = sTmpV.Left(2);
// 							MxString sDefV = sTmpV.Mid(2); 
// 							sFlag.MakeUpper();
// 							if(sFlag == _T("T=") )
// 							{
// 								isGetTxt = true;
// 								tmp.sTxt = sDefV;
// 								tmp.iShapeNumber = 0;
// 								tmp.type = kText;
// 							}
// 							else if(sFlag == _T("I=") )
// 							{
// 								if(Mx::IsNumerical(sDefV) )
// 								{
// 									tmp.iShapeNumber = _tstoi(sDefV);
// 									if(tmp.iShapeNumber > 0)
// 									{
// 										tmp.sTxt = _T("");
// 										iShapeNumber = true;
// 										tmp.type = kShap;
// 									}	
// 								}
// 							}
// 							else if(sFlag == _T("X=") )
// 							{
// 								if(Mx::IsNumerical(sDefV) )
// 								{
// 									tmp.dXoffset = _tstof(sDefV);
// 								}
// 							}
// 
// 							else if(sFlag == _T("Y=") )
// 							{
// 								if(Mx::IsNumerical(sDefV) )
// 								{
// 									tmp.dYoffset = _tstof(sDefV);
// 								}
// 							}
// 
// 							else if(sFlag == _T("S=") )
// 							{
// 								if(Mx::IsNumerical(sDefV) )
// 								{
// 									tmp.dScale = _tstof(sDefV);
// 								}
// 							}
// 
// 							else if(sFlag == _T("R=") )
// 							{
// 								if(Mx::IsNumerical(sDefV) )
// 								{
// 									tmp.dRotation = _tstof(sDefV);
// 									tmp.dRotation *= 3.14159265 / 180.0;
// 									tmp.rotationType = kR;
// 								}
// 							}
// 
// 							else if(sFlag == _T("A=") )
// 							{
// 								if(Mx::IsNumerical(sDefV) )
// 								{
// 									tmp.dRotation = _tstof(sDefV);
// 									tmp.dRotation *= 3.14159265 / 180.0;
// 									tmp.rotationType = kA;
// 								}
// 							}
// 
// 							else if(sFlag == _T("L=") )
// 							{
// 								if(Mx::IsNumerical(sDefV) )
// 								{
// 									tmp.d = _tstof(sDefV);
// 								}
// 							}
// 						}
// 
// 						if(isGetTxt || iShapeNumber)
// 						{
// 							vecLineData.push_back(tmp);
// 						}
// 
// 					}
// 
// 				}
// 
// 				if(vecLineData.size() < 1)
// 				{
// 					return 0;
// 				}
// 
// 				// 创建线形数据。
// 				AcDbLinetypeTableRecord* pNewRec = new AcDbLinetypeTableRecord;
// 				MxString strT;
// 				strT.Format(_T("custom line type: %s"),sName);
// 				pNewRec->setName(sName);
// 				pNewRec->setAsciiDescription(strT);
// 				pNewRec->setPatternLength(1.0);
// 				pNewRec->setNumDashes((int)(vecLineData.size() ) );
// 
// 				for(unsigned int k = 0; k < vecLineData.size();k++)
// 				{
// 					stuLineUnit tmp = vecLineData[k];
// 					pNewRec->setDashLengthAt(k,tmp.d);
// 					if(tmp.type == kText || tmp.type == kShap)
// 					{
// 						pNewRec->setShapeStyleAt(k,tmp.textStyleId);
// 						pNewRec->setShapeNumberAt(k,tmp.iShapeNumber);
// 
// 						McGeVector2d vec(tmp.dXoffset,tmp.dYoffset);
// 						pNewRec->setShapeOffsetAt(k,vec);
// 
// 						pNewRec->setShapeScaleAt(k,tmp.dScale );
// 						pNewRec->setShapeRotationAt(k,tmp.dRotation);
// 						pNewRec->setShapeIsUcsOrientedAt(k,tmp.rotationType == kA);
// 						pNewRec->setTextAt(k,tmp.sTxt);
// 					}
// 				}
// 
// 				AcDbObjectId linetypeId;
// 				spLineTypeTable->add(linetypeId,pNewRec);
// 				pNewRec->close();
// 
// 				return (LONG)(linetypeId.asOldId() );
// 			}
// 			// 调用代码
// 			AddLinetypeEx(_T("MyLineType3"), 
// 						  _T("(12.7,(\"T=MxDraw\",\"S=2.54\",\"L=-5.08\",\"R=0.0\",\"X=-2.54\",\"Y=-1.27\"),-10.08)"),
// 						  _T("MyLineTypeTextStyle") );
// 		</code>
// -------------------------------------------------------------------------
class ARXDLL McDbLinetypeTable: public McDbSymbolTable
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbLinetypeTable);
	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbLinetypeTable();

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbLinetypeTable();

	//typedef McDbLinetypeTableRecord RecordType;

	// -------------------------------------------------------------------------
	// Summary:
	// 		由线型名返回线型表记录对象
	// Parameters:
	// 		entryName		-	线型名
	//		pRec			-	返回线型表中的记录指针，在不使用后需要关闭
	//		openMode     	-	线型表记录的打开方式
	//		openErasedRec	-	是否返回删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getAt(LPCMSTR entryName,
		McDbLinetypeTableRecord*& pRec,
		McDb::OpenMode openMode,
		bool openErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		由线型名返回线型表记录对象
	// Parameters:
	// 		entryName		-	线型名
	//		recordId		-	返回线型表中的记录id
	//		openErasedRec	-	是否返回删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getAt(LPCMSTR entryName,
		McDbObjectId& recordId,
		bool getErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		表中是否包含线型名为name的记录
	// Parameters:
	// 		name - 线型名
	// Returns:
	// 		如有返回true
	// -------------------------------------------------------------------------
	bool              has  (LPCMSTR name) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		表中是否包含对象ID为id的记录
	// Parameters:
	// 		id - 线型记录id
	// Returns:
	// 		如有返回true
	// -------------------------------------------------------------------------
	bool              has  (McDbObjectId id) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		创建一个遍历器对象，用于遍历所有线型,在不使用时调用delete释放内存
	// Parameters:
	// 		pIterator	-	新创建的遍历器的指针
	// 		atBeginning	-	输入布尔值，表示从表的开始处或结束处开始
	// 		skipDeleted	-	输入布尔值，表示是否忽略已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus newIterator(McDbLinetypeTableIterator*& pIterator,
		bool atBeginning = true,
		bool skipDeleted = true) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		往线型表中添加新的线型，新加入的线型表记录指针在不使用时，需要调用close函数关闭
	// Parameters:
	// 		pRecord - 新加入的线型表记录指针
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus add  (McDbLinetypeTableRecord* pRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		往线型表中添加新的线型，新加入的线型表记录指针在不使用时，需要调用close函数关闭
	// Parameters:
	// 		pRecord		-	新加入的线型表记录指针
	//		recordId	-	返回新加入的线型表记录id
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus add  (McDbObjectId& recordId,
		McDbLinetypeTableRecord* pRecord);

	//:Ignore

protected:
	virtual void OnObjectCloseEvent();
	//:End Ignore
};

// -------------------------------------------------------------------------
// Summary:
// 		遍历所有线型的遍历器
// -------------------------------------------------------------------------
class ARXDLL McDbLinetypeTableIterator : public McDbSymbolTableIterator
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		返回当前遍历器位置的线型记录指针，在不使用时调用close函数关闭对象
	// Parameters:
	// 		pRecord			-	返回线型表记录指针
	//		openMode		-	打开方式
	//		openErasedRec	-	是否打开已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getRecord(McDbLinetypeTableRecord*& pRecord,
		McDb::OpenMode openMode, bool openErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到id指向的记录处
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus seek(McDbObjectId id);

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到pRecord指向的记录处
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus seek(const McDbLinetypeTableRecord* pRecord);

	//:Ignore
protected:
	McDbLinetypeTableIterator(McDbSymbolTableIteratorImp* pImpIter);
	friend class McDbLinetypeTable;
	//:End Ignore
};

class McDbLinetypeTableRecordImp;
// -------------------------------------------------------------------------
// Summary:
// 		线型记录类型，实现了对线型的属性相关操作函数
// -------------------------------------------------------------------------
class ARXDLL McDbLinetypeTableRecord: public  McDbSymbolTableRecord
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbLinetypeTableRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbLinetypeTableRecord();

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbLinetypeTableRecord();

	typedef McDbLinetypeTable TableType;



	// -------------------------------------------------------------------------
	// Summary:
	// 		返回线型定义数组的长度
	// -------------------------------------------------------------------------
	int    numDashes() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置线型定义数组的长度
	// Parameters:
	// 		count	-	线型数组的长度 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus    setNumDashes(int count);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回线型定义数组中index位置的值，返回的是mxreal变量，正值代表实线段，负值代表线段中的空格
	// -------------------------------------------------------------------------
	mxreal dashLengthAt(int index) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置线型定义数组中的值
	// Parameters:
	// 		index	-	线型定义数组中索引
	//		value	-	正值代表实线段，负值代表线段中的空格
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus    setDashLengthAt(int index , mxreal value);


	// -------------------------------------------------------------------------
	// Summary:
	// 		返回线型说明字符串
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus comments(LPCMSTR& pString) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置线型说明字符串
	// Parameters:
	// 		pString	-	线型说明字符串
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus setComments(LPCMSTR pString);

	//:Ignore


	
	McDbObjectId shapeStyleAt(int index) const;
	void         setShapeStyleAt(int index, McDbObjectId id);

	int    shapeNumberAt(int index) const;
	void   setShapeNumberAt(int index, int shapeNumber);

	McGeVector2d shapeOffsetAt(int index) const;
	void         setShapeOffsetAt(int index, const McGeVector2d& offset);

	mxreal shapeScaleAt(int index) const;
	void   setShapeScaleAt(int index, mxreal scale);

	bool isScaledToFit() const;
	void           setIsScaledToFit(bool scaledToFit);


	double patternLength() const;
	Mcad::ErrorStatus    setPatternLength(double patternLength);
	// 


	bool shapeIsUcsOrientedAt(int index) const;
	void           setShapeIsUcsOrientedAt(int index, bool isUcsOriented);

	mxreal         shapeRotationAt(int index) const;
	void           setShapeRotationAt(int index, mxreal rotation);

	Mcad::ErrorStatus textAt(int index, LPCMSTR& text) const;
	Mcad::ErrorStatus setTextAt(int index, LPCMSTR text);

	virtual Mcad::ErrorStatus dwgInFields (McDbDwgFiler* pFiler);
	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;

protected:
		virtual void OnObjectCloseEvent();

	//:End Ignore
public:
		inline McDbLinetypeTableRecordImp* getLinetypeTableRecordImp() const {
			return (McDbLinetypeTableRecordImp*)m_pImp;
		}
	
};

class McDbTextStyleTableRecord;
class McDbTextStyleTableIterator;

// -------------------------------------------------------------------------
// Summary:
// 		数据库的文字样式表
// Remarks:
// 		例如:得到所有的文字样式
// 		<code>
// 			void GetAllTextStyle()
// 			{
// 				// 读方式打开文字样表
// 				McDbTextStyleTablePointer spTextStyleTable(acdbCurDwg(),McDb::kForRead);
// 				if(spTextStyleTable.openStatus() != Mcad::eOk)
// 					return;
// 
// 				// 创建一个遍历器，准备遍历块表
// 				McDbTextStyleTableIterator* pIterator = NULL;
// 				spTextStyleTable->newIterator(pIterator);
// 
// 				if(pIterator == NULL)
// 					return;
// 				// 把遍历器的指针交给智能指针管理
// 				std::unique_ptr<McDbTextStyleTableIterator> spIterator(pIterator);
// 
// 				// 遍历所有记录
// 				for(;!pIterator->done();pIterator->step())
// 				{
// 					McDbObjectId id;
// 					pIterator->getRecordId(id);
// 
// 					// 读方式打开记录
// 					McDbObjectPointer<McDbTextStyleTableRecord> spTextStyleRec(id,McDb::kForRead);
// 					if(spTextStyleRec.openStatus() != Mcad::eOk)
// 						continue;
// 					LPCMSTR pszName = NULL;
// 					spTextStyleRec->getName(pszName);
// 
// 					MxString sT;
// 					sT.Format(_T("发现文字样式名:%s"),pszName);
// 					AfxMessageBox(sT);
// 				}
// 			};
// 		</code>
// 		例如:添加文字样式
// 		<code>
// 			McDbObjectId AddTextStyle1(MxDraw::MXDRAWOCXHANDLE m_hDrawOcx,
// 									   LPCMSTR pszName, LPCMSTR pszFileName, 
// 									   LPCMSTR pszBigFontFileName, DOUBLE dXScale)
// 			{
// 				MxString sName(pszName);
// 				if(sName.IsEmpty() )
// 					return McDbObjectId::kNull;
// 
// 				MxString sFileName(pszFileName);
// 				if(sFileName.IsEmpty() )
// 					return McDbObjectId::kNull;
// 
// 				MxString sBigFontFileName(pszBigFontFileName);
// 				if(sBigFontFileName.IsEmpty() )
// 					return McDbObjectId::kNull;
// 
// 				if(dXScale < 0.1)
// 					dXScale = 1.0;
// 
// 
// 
// 				{
// 					McDbTextStyleTableRecordPointer spTextTabRec(sName,
// 						MxDraw::GetDatabase(m_hDrawOcx),McDb::kForRead);
// 					if(spTextTabRec.openStatus() == Mcad::eOk)
// 					{
// 						// 控件内已经有该名称的文字样式。
// 						return McDbObjectId::kNull;
// 					}
// 				}
// 
// 				McDbTextStyleTablePointer spTextStyleTable(MxDraw::GetDatabase(m_hDrawOcx),AcDb::kForWrite);
// 				if(spTextStyleTable.openStatus() != Acad::eOk)
// 				{
// 					return McDbObjectId::kNull;
// 				}
// 
// 				McDbTextStyleTableRecord* pRecord = new McDbTextStyleTableRecord;
// 				pRecord->setName(sName);
// 				pRecord->setFileName(sFileName);
// 				pRecord->setBigFontFileName(sBigFontFileName);
// 				pRecord->setXScale(dXScale);
// 
// 				spTextStyleTable->add(pRecord);
// 
// 				McDbObjectId recId = pRecord->objectId();
// 				pRecord->close();
// 
// 				return recId;
// 			}
// 
// 			McDbObjectId  AddTextStyle2(MxDraw::MXDRAWOCXHANDLE m_hDrawOcx,
// 										LPCMSTR pszName, LPCMSTR pszTrueTypeFontName,
// 										DOUBLE dXScale)
// 			{
// 				MxString sName(pszName);
// 				if(sName.IsEmpty() )
// 					return McDbObjectId::kNull;
// 				MxString sTrueTypeFontName(pszTrueTypeFontName);
// 				if(sTrueTypeFontName.IsEmpty() )
// 					return McDbObjectId::kNull;
// 
// 				if(dXScale < 0.1)
// 					dXScale = 1.0;
// 				{
// 					McDbTextStyleTableRecordPointer spTextTabRec(sName,
// 						MxDraw::GetDatabase(m_hDrawOcx),McDb::kForRead);
// 					if(spTextTabRec.openStatus() == Mcad::eOk)
// 					{
// 						// 控件内已经有该名称的文字样式。
// 						return McDbObjectId::kNull;
// 					}
// 				}
// 
// 				McDbTextStyleTablePointer spTextStyleTable(MxDraw::GetDatabase(m_hDrawOcx),AcDb::kForWrite);
// 				if(spTextStyleTable.openStatus() != Acad::eOk)
// 				{
// 					return McDbObjectId::kNull;
// 				}
// 
// 				McDbTextStyleTableRecord* pRecord = new McDbTextStyleTableRecord;
// 				pRecord->setName(sName);
// 				pRecord->setFont(sTrueTypeFontName, Mdesk::kFalse, 
// 					Mdesk::kFalse, DEFAULT_CHARSET, DEFAULT_PITCH | FF_SWISS);
// 
// 				pRecord->setXScale(dXScale);
// 				spTextStyleTable->add(pRecord);
// 
// 				McDbObjectId recId = pRecord->objectId();
// 
// 				pRecord->close();
// 
// 				return recId;
// 			}
// 			// 使用代码
// 			// 增加一个shx字体样式
// 			AddTextStyle1 (MxDraw::GetCurOcxHandle(),_T("MyTextStyle"), _T("italicc.shx"), _T("gbcbig.shx"), 0.7);
// 
// 			// 增加一个TrueType字体样式
// 			AddTextStyle2 (MxDraw::GetCurOcxHandle(),_T("MyTrueTypeStyle"), _T("黑体"), 0.7);
// 		</code>
// -------------------------------------------------------------------------
class ARXDLL McDbTextStyleTable: public McDbSymbolTable
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbTextStyleTable);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbTextStyleTable();
	
	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbTextStyleTable();

	//typedef McDbTextStyleTableRecord RecordType;

	// -------------------------------------------------------------------------
	// Summary:
	// 		由文字样式表名返回文字样式表记录对象
	// Parameters:
	// 		entryName		-	文字样式表记录名
	//		pRec			-	返回文字样式表中的记录指针，在不使用后需要关闭
	//		openMode     	-	文字样式表记录的打开方式
	//		openErasedRec	-	是否返回删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getAt(LPCMSTR pszEntryName,
		McDbTextStyleTableRecord*& pRec,
		McDb::OpenMode openMode,
		bool openErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		由文字样式表名返回文字样式表记录对象
	// Parameters:
	// 		entryName		-	文字样式表记录名
	//		recordId		-	返回文字样式表中的记录id
	//		openErasedRec	-	是否返回删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getAt (LPCMSTR pszEntryName,
		McDbObjectId& recordId,
		bool getErasedRecord = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		表中是否包含对象名为name的记录
	// Parameters:
	// 		name - 文字样式表记录名
	// Returns:
	// 		如有返回true
	// -------------------------------------------------------------------------
	bool              has   (LPCMSTR pszName) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		表中是否包含对象ID为id的记录
	// Parameters:
	// 		id -  文字样式表记录id
	// Returns:
	// 		如有返回true
	// -------------------------------------------------------------------------
	bool              has   (McDbObjectId id) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		创建一个遍历器对象，用于遍历所有的文字样式,在不使用时调用delete释放内存
	// Parameters:
	// 		pIterator	-	新创建的遍历器的指针
	// 		atBeginning	-	输入布尔值，表示从表的开始处或结束处开始
	// 		skipDeleted	-	输入布尔值，表示是否忽略已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus newIterator(McDbTextStyleTableIterator*& pIterator,
		bool atBeginning = true,
		bool skipDeleted = true) const;


	// -------------------------------------------------------------------------
	// Summary:
	// 		往文字样式表中新添加记录，新加入的文字样式表记录指针在不使用时，需要调用close函数关闭
	// Parameters:
	// 		pRecord - 新加入的文字样式表记录指针
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus add   (McDbTextStyleTableRecord* pRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		往文字样式表中新添加记录，新加入的文字样式表记录指针在不使用时，需要调用close函数关闭
	// Parameters:
	// 		pRecord		-	新加入的文字样式表记录指针
	//		recordId	-	返回文字样式表表记录id
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus add   (McDbObjectId&  recordId,
		McDbTextStyleTableRecord* pRecord);
};

// -------------------------------------------------------------------------
// Summary:
// 		遍历所有文字样式的遍历器
// -------------------------------------------------------------------------
class ARXDLL McDbTextStyleTableIterator : public McDbSymbolTableIterator
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		返回当前遍历器位置的文字样式表记录指针，在不使用时调用close函数关闭对象
	// Parameters:
	// 		pRecord			-	返回文字样式表记录指针
	//		openMode		-	打开方式
	//		openErasedRec	-	是否打开已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getRecord(McDbTextStyleTableRecord*& pRecord,
		McDb::OpenMode openMode, bool openErasedRec = false) const;
	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到id指向的记录处
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus seek(McDbObjectId id);

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到pRecord指向的记录处
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus seek(const McDbTextStyleTableRecord* pRecord);

	//:Ignore
protected:
	McDbTextStyleTableIterator(McDbSymbolTableIteratorImp* pImpIter);
	friend class McDbTextStyleTable;
	//:End Ignore
};

class McDbTextStyleTableRecordImp;

// -------------------------------------------------------------------------
// Summary:
// 		文字样式类型，提供了文字样式的属性操作函数
// -------------------------------------------------------------------------
class ARXDLL McDbTextStyleTableRecord: public  McDbSymbolTableRecord
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbTextStyleTableRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbTextStyleTableRecord();

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbTextStyleTableRecord();

	typedef McDbTextStyleTable TableType;

	// -------------------------------------------------------------------------
	// Summary:
	// 		该记录是否是一个形文件
	// -------------------------------------------------------------------------
	Mdesk::Boolean isShapeFile() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置成一个形文件
	// Parameters:
	// 		shape	-	是否设置成一个形文件
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	void setIsShapeFile(Mdesk::Boolean shape);

	// -------------------------------------------------------------------------
	// Summary:
	// 		文字是否竖向绘制
	// -------------------------------------------------------------------------
	Mdesk::Boolean isVertical() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置文字是否竖向绘制
	// -------------------------------------------------------------------------
	void setIsVertical(Mdesk::Boolean vertical);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回文字样式的文字高度
	// -------------------------------------------------------------------------
	mxreal textSize() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置文字样式的文字高度
	// Parameters:
	// 		size	-	文字高度
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus setTextSize(mxreal size);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回文字样式的宽度缩放比例
	// -------------------------------------------------------------------------
	mxreal xScale() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置文字样式的宽度缩放比例
	// Parameters:
	// 		xScale	-	宽度缩放比例 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus setXScale(mxreal xScale);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回文字显示时的倾斜角（弧度）。有效范围为-1.48335至+1.4835 弧度（-85至85度）
	// -------------------------------------------------------------------------
	mxreal obliquingAngle() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置文字显示时的倾斜角（弧度）,有效范围为-1.48335至+1.4835 弧度（-85至85度）
	// Parameters:
	// 		obliquingAngle	-	文字显示时的倾斜角（弧度） 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus setObliquingAngle(mxreal obliquingAngle);

	//:Ignore
	
	// 字体标致字节,只有第二位和第三位被使用。
	// 如果第二位被设置，它表示文本向后书写（即，X方向镜像）。
	// 如果第三位被设置，它表示向上书写（即，Y方向镜像）
	Mdesk::UInt8 flagBits() const;
	void setFlagBits(Mdesk::UInt8 flagBits);

	
	//:End Ignore

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回文字样式的字体文件名，shx字体文件,fileName在不使用时需要调用Mx::mcutDelString函数释放内存
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus fileName(LPTSTR& fileName) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回文字样式的字体文件名，shx字体文件
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus fileName(LPCMSTR& fileName) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置文字样式的字体文件名
	// Parameters:
	// 		fileName	-	文字样式的字体文件名 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus setFileName(LPCMSTR fileName);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回文字样式的大字体文件名，shx字体文件,fileName在不使用时需要调用Mx::mcutDelString函数释放内存
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus bigFontFileName(LPTSTR& fileName) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回文字样式的大字体文件名，shx字体文件
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus bigFontFileName(LPCMSTR& fileName) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置文字样式的大字体文件名，shx字体文件
	// Parameters:
	// 		fileName	-	文字样式的大字体文件名，shx字体文件 
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus setBigFontFileName(LPCMSTR fileName);

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置文字样式的TrueType字体，如果文字样式设置了TrueType字体，就不会使用前面设置shx字体
	// Parameters:
	//		pTypeface   	- 	turetype字体名
	//		bold        	-	是否粗写
	//		italic       	-	是否斜写
	//		charset      	-	windows字符集
	//		pitchAndFamily 	-	暂没使用
	// Returns:
	// 		如果成功返回Mcad::eOk，如果传递的数据非法则返回Mcad::eInvalidInput
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus setFont(LPCMSTR pTypeface, Mdesk::Boolean bold,
		Mdesk::Boolean italic, int charset, int pitchAndFamily);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回文字样式设置的TrueType字体信息
	// Parameters:
	//		pTypeface   	-	turetype字体名
	//		bold        	-	是否粗写
	//		italic       	-	是否斜写
	//		charset      	-	windows字符集
	//		pitchAndFamily 	-	暂没使用
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus font   (LPTSTR& pTypeface, Mdesk::Boolean& bold, Mdesk::Boolean& italic,
		int& charset, int& pitchAndFamily) const;

	Mcad::ErrorStatus font   (LPCMSTR& pTypeface, Mdesk::Boolean& bold, Mdesk::Boolean& italic,
		int& charset, int& pitchAndFamily) const;
	//:Ignore
	
	virtual Mcad::ErrorStatus dwgInFields(McDbDwgFiler* pFiler);
	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;


	//:End Ignore

public:
	inline McDbTextStyleTableRecordImp* getTextStyleTableRecordImp() const {
		return (McDbTextStyleTableRecordImp*)m_pImp;
	}
};

// 视与视口符号表.
class McDbAbstractViewTableRecord;
class McDbAbstractViewTableIterator;

// -------------------------------------------------------------------------
// Summary:
// 		McDbAbstractViewTable是两个符号表类McDbViewTable和McDbViewportTable的基类
//		用来存放控件中所有视对象集合
// -------------------------------------------------------------------------
class ARXDLL McDbAbstractViewTable: public McDbSymbolTable
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbAbstractViewTable);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbAbstractViewTable();

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbAbstractViewTable();

	//typedef McDbAbstractViewTableRecord RecordType;

	// -------------------------------------------------------------------------
	// Summary:
	// 		由符号表名返回符号表记录对象
	// Parameters:
	// 		entryName		-	符号表记录名
	//		pRec			-	返回符号表中的记录指针，在不使用后需要关闭
	//		openMode     	-	符号表记录的打开方式
	//		openErasedRec	-	是否返回删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getAt(LPCMSTR pszEntryName,
		McDbAbstractViewTableRecord*& pRec,
		McDb::OpenMode openMode,
		bool openErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		由符号表名返回符号表记录对象
	// Parameters:
	// 		entryName		-	符号表记录名
	//		recordId		-	返回符号表中的记录id
	//		openErasedRec	-	是否返回删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getAt (LPCMSTR pszEntryName,
		McDbObjectId& recordId,
		bool getErasedRecord = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		表中是否包含对象名为name的记录
	// Parameters:
	// 		name - 符号表记录名
	// Returns:
	// 		如有返回true
	// -------------------------------------------------------------------------
	bool              has   (LPCMSTR pszName) const;
	
	// -------------------------------------------------------------------------
	// Summary:
	// 		表中是否包含对象ID为id的记录
	// Parameters:
	// 		id - 符号表记录id
	// Returns:
	// 		如有返回true
	// -------------------------------------------------------------------------
	bool              has   (McDbObjectId id) const;


	// -------------------------------------------------------------------------
	// Summary:
	// 		创建一个遍历器对象，用于遍历SymbolTable中的内容,在不使用时调用delete释放内存
	// Parameters:
	// 		pIterator	-	新创建的遍历器的指针
	// 		atBeginning	-	输入布尔值，表示从表的开始处或结束处开始
	// 		skipDeleted	-	输入布尔值，表示是否忽略已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus newIterator(McDbAbstractViewTableIterator*& pIterator,
		bool atBeginning = true,
		bool skipDeleted = true) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		往符号表中新添加记录，新加入的符号表记录指针在不使用时，需要调用close函数关闭
	// Parameters:
	// 		pRecord - 新加入的符号表记录指针
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus add   (McDbAbstractViewTableRecord* pRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		往符号表中新添加记录，新加入的符号表记录指针在不使用时，需要调用close函数关闭
	// Parameters:
	// 		pRecord		-	新加入的符号表记录指针
	//		recordId	-	返回符号表记录id
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus add   (McDbObjectId&  recordId,
		McDbAbstractViewTableRecord* pRecord);
};



// -------------------------------------------------------------------------
// Summary:
// 		遍历所有视对象的遍历器
// -------------------------------------------------------------------------
class ARXDLL McDbAbstractViewTableIterator : public McDbSymbolTableIterator
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		返回当前遍历器位置的符号表记录指针，在不使用时调用close函数关闭对象
	// Parameters:
	// 		pRecord			-	返回符号表记录指针
	//		openMode		-	打开方式
	//		openErasedRec	-	是否打开已删除的记录
	// Returns:
	// 		如果成功返回Mcad::eOk
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus getRecord(McDbAbstractViewTableRecord*& pRecord,
		McDb::OpenMode openMode, bool openErasedRec = false) const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到id指向的记录处
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus seek(McDbObjectId id);

	// -------------------------------------------------------------------------
	// Summary:
	// 		此函数定位遍历器位置到pRecord指向的记录处
	// -------------------------------------------------------------------------
	Mcad::ErrorStatus seek(const McDbAbstractViewTableRecord* pRecord);
protected:
	McDbAbstractViewTableIterator(McDbSymbolTableIteratorImp* pImpIter);
	friend class McDbAbstractViewTable;
};


class McDbAbstractViewTableRecordImp;

//:Ignore
class ARXDLL McGiViewportTraits
{
public:
	enum DefaultLightingType {
		kOneDistantLight = 0,
		kTwoDistantLights,
		kBackLighting,
	};
};

//:End Ignore

// -------------------------------------------------------------------------
// Summary:
// 		此类是McDbViewTableRecord和McDbViewportTableRecord类的基类
//		包括了对视区的操作函数
// -------------------------------------------------------------------------
class ARXDLL McDbAbstractViewTableRecord: public  McDbSymbolTableRecord
{
protected:
	McDbAbstractViewTableRecord(McDbAbstractViewTableRecordImp* pImp);

public:

	//:Ignore
	
	enum RenderMode {
		k2DOptimized,
		kWireframe,
		kHiddenLine,
		kFlatShaded,
		kGouraudShaded,
		kFlatShadedWithWireframe,
		kGouraudShadedWithWireframe
	};

	//:End Ignore

	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbAbstractViewTableRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbAbstractViewTableRecord();

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbAbstractViewTableRecord();

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回视图的中点
	// -------------------------------------------------------------------------
	McGePoint2d    centerPoint() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置视图的中点
	// Parameters:
	// 		pt	-	视图的中点 
	// -------------------------------------------------------------------------
	void           setCenterPoint(const McGePoint2d& pt);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回视图的高度
	// -------------------------------------------------------------------------
	mxreal         height() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置视图的高度
	// Parameters:
	// 		height	-	视图的高度 
	// -------------------------------------------------------------------------
	void           setHeight(mxreal height);

	// -------------------------------------------------------------------------
	// Summary:
	// 		返回视图的宽度
	// -------------------------------------------------------------------------
	mxreal         width() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置视图的宽度
	// Parameters:
	// 		width	-	视图的宽度 
	// -------------------------------------------------------------------------
	void           setWidth(mxreal width);


	// -------------------------------------------------------------------------
	// Summary:
	// 		返回视图的旋转角度，弧度
	// -------------------------------------------------------------------------
	mxreal         viewTwist() const;

	// -------------------------------------------------------------------------
	// Summary:
	// 		设置视图的旋转角度，弧度
	// Parameters:
	// 		angle	-	视图的旋转角度，弧度 
	// -------------------------------------------------------------------------
	void           setViewTwist(mxreal angle);

	//:Ignore
	McGePoint3d    target() const;
	void           setTarget(const McGePoint3d& target);

	McGeVector3d   viewDirection() const;
	void           setViewDirection(const McGeVector3d& viewDirection);

	mxreal         lensLength() const;
	void           setLensLength(mxreal length);

	mxreal         frontClipDistance() const;
	void           setFrontClipDistance(mxreal distance);

	mxreal         backClipDistance() const;
	void           setBackClipDistance(mxreal distance);

	bool           perspectiveEnabled() const;
	void           setPerspectiveEnabled(bool enabled);

	bool           frontClipEnabled() const;
	void           setFrontClipEnabled(bool enabled);

	bool           backClipEnabled() const;
	void           setBackClipEnabled(bool enabled);

	bool           frontClipAtEye() const;
	void           setFrontClipAtEye(bool atEye);

	void           setRenderMode(RenderMode mode);
	RenderMode     renderMode() const;

	bool                isDefaultLightingOn() const;
	Mcad::ErrorStatus   setDefaultLightingOn(bool on);
	McGiViewportTraits::DefaultLightingType defaultLightingType() const;
	Mcad::ErrorStatus   setDefaultLightingType(McGiViewportTraits::DefaultLightingType typ);


	mxreal              brightness() const;
	Mcad::ErrorStatus   setBrightness(mxreal);

	mxreal              contrast() const;
	Mcad::ErrorStatus   setContrast(mxreal);

	McCmColor           ambientLightColor() const;
	Mcad::ErrorStatus   setAmbientLightColor(const McCmColor& clr);

	Mcad::ErrorStatus getUcs            ( McGePoint3d& origin,
		McGeVector3d& xAxis,
		McGeVector3d& yAxis ) const;

	mxreal            elevation         () const;


	Mcad::ErrorStatus setUcs        ( const McGePoint3d& origin,
		const McGeVector3d& xAxis,
		const McGeVector3d& yAxis );

	Mcad::ErrorStatus setElevation  ( mxreal elev );

	//
	virtual Mcad::ErrorStatus dwgInFields (McDbDwgFiler* pFiler);
	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;

	virtual void objectClose    (const McDbObject* dbObj);

	virtual void openedForModify (const McDbObject* dbObj);

	virtual void unappended      (const McDbObject* dbObj);

	void setIsUpDisplay(bool isUpDispaly);

	//:End Ignore

public:
		inline McDbAbstractViewTableRecordImp* getAbstractViewTableRecordImp() const {
			return (McDbAbstractViewTableRecordImp*)m_pImp;
		}
};

//:Ignore

// McDbViewportTable
class McDbViewportTableRecord;
class McDbViewportTableIterator;

class ARXDLL McDbViewportTable: public McDbAbstractViewTable
{
public:
	MCDB_DECLARE_MEMBERS(McDbViewportTable);
	McDbViewportTable();
	virtual ~McDbViewportTable();

	//typedef McDbViewportTableRecord RecordType;

	Mcad::ErrorStatus getAt(LPCMSTR pszEntryName,
		McDbViewportTableRecord*& pRec,
		McDb::OpenMode openMode,
		bool openErasedRec = false) const;

	Mcad::ErrorStatus getAt (LPCMSTR pszEntryName,
		McDbObjectId& recordId,
		bool getErasedRecord = false) const;

	bool              has   (LPCMSTR pszName) const;
	bool              has   (McDbObjectId id) const;
	Mcad::ErrorStatus newIterator(McDbViewportTableIterator*& pIterator,
		bool atBeginning = true,
		bool skipDeleted = true) const;

	Mcad::ErrorStatus add   (McDbViewportTableRecord* pRecord);
	Mcad::ErrorStatus add   (McDbObjectId&  recordId,
		McDbViewportTableRecord* pRecord);
};

// McDbViewportTableIterator
class ARXDLL McDbViewportTableIterator : public McDbAbstractViewTableIterator
{
public:
	Mcad::ErrorStatus getRecord(McDbViewportTableRecord*& pRecord,
		McDb::OpenMode openMode, bool openErasedRec = false) const;
	Mcad::ErrorStatus seek(McDbObjectId id);
	Mcad::ErrorStatus seek(const McDbViewportTableRecord* pRecord);

protected:
	McDbViewportTableIterator(McDbSymbolTableIteratorImp* pImpIter);
	friend class McDbViewportTable;
};
//:End Ignore

class McDbViewportTableRecordImp;


class ARXDLL McDbViewportTableRecord: public  McDbAbstractViewTableRecord
{
public:
	// -------------------------------------------------------------------------
	// Summary:
	// 		申明类型信息
	// -------------------------------------------------------------------------
	MCDB_DECLARE_MEMBERS(McDbViewportTableRecord);

	// -------------------------------------------------------------------------
	// Summary:
	// 		构造函数
	// -------------------------------------------------------------------------
	McDbViewportTableRecord();

	// -------------------------------------------------------------------------
	// Summary:
	// 		析构函数
	// -------------------------------------------------------------------------
	virtual ~McDbViewportTableRecord();



	//:Ignore

	virtual Mcad::ErrorStatus dwgInFields (McDbDwgFiler* pFiler);
	virtual Mcad::ErrorStatus dwgOutFields(McDbDwgFiler* pFiler) const;

	McGePoint2d    lowerLeftCorner() const;
	void           setLowerLeftCorner(const McGePoint2d& pt);

	McGePoint2d    upperRightCorner() const;
	void           setUpperRightCorner(const McGePoint2d& pt);

	bool           ucsFollowMode() const;
	void           setUcsFollowMode(bool enabled);

	Mdesk::UInt16  circleSides() const;
	void           setCircleSides(Mdesk::UInt16 circleSides);

	bool           fastZoomsEnabled() const;
	void           setFastZoomsEnabled(bool enabled);

	bool           iconEnabled() const;
	void           setIconEnabled(bool enabled);

	bool           iconAtOrigin() const;
	void           setIconAtOrigin(bool atOrigin);

	bool           gridEnabled() const;
	void           setGridEnabled(bool enabled);


	McGePoint2d    gridIncrements() const;
	void           setGridIncrements(const McGePoint2d& base);

	bool           snapEnabled() const;
	void           setSnapEnabled(bool enabled);

	bool           isometricSnapEnabled() const;
	void           setIsometricSnapEnabled(bool enabled);

	Mdesk::Int16   snapPair() const;
	void           setSnapPair(Mdesk::Int16 pairType);

	mxreal         snapAngle() const;
	void           setSnapAngle(mxreal angle);

	McGePoint2d    snapBase() const;
	void           setSnapBase(const McGePoint2d& base);

	McGePoint2d    snapIncrements() const;
	void           setSnapIncrements(const McGePoint2d& base);


	bool           isUcsSavedWithViewport () const;
	void           setUcsPerViewport ( bool ucsvp );

	// GridDisplay
	bool           isGridBoundToLimits() const;
	void           setGridBoundToLimits(bool enabled);

	bool           isGridAdaptive() const;
	void           setGridAdaptive(bool enabled);

	bool           isGridSubdivisionRestricted() const;
	void           setGridSubdivisionRestricted(bool enabled);

	bool           isGridFollow() const;
	void           setGridFollow(bool enabled);

	Mdesk::Int16   gridMajor() const;
	void           setGridMajor(Mdesk::Int16 value);

	//:End Ignore
	typedef McDbViewportTable TableType;
};
