1、所有对象都一个唯一的标识id和句柄,都是用来标识对象,知道对象的Id或句柄,就能找到对象并修改属性。id是只在当前内存中唯一,下次再打开id就会发生变化,句柄会随图纸保存,并会一直不变。

2、对象Id,指针,句柄三者之前的转换关系:

(1)从 ID 到对象指针:通过Mx::mcdbOpenObject 打开对象,或使用智能指针打开, McDbObjectPointer。

(2)从对象指针到 ID: 所有的数据库对象都继承自McDbObject,调用McDbObject::objectId()返回对象的ID。

(3)从  句  柄  到  ID: 使用McDbDatabase::getAcDbObjectId 函数。

(4)从   ID  到  句 柄: 使用McDbObjectId::handle 函数。

(5)从 指 针 到 句 柄:使用 McDbObject::getAcDbHandle 函数。

修改对象颜色

1、上一节中:函数McDbObjectId CreateLine1(McGePoint3d pt1,McGePoint3d pt2)会返回新绘制的对象id。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

​// -------------------------------------------------------------------------​

​// Summary:​

​//      改变实体颜色​

​// Parameters:​

​//      id          -   实体的id​

​//      color       -   实体的新颜色​

​// Returns:​

​//      成功返回true​

​// -------------------------------------------------------------------------​

​bool​​​ ​​ChangeColor(McDbObjectId id,​​​​const​​​ ​​McCmColor& color)​

​{​

​// 用智能指针打开对象,写方式打开。智能指针会自动关闭对象.​

​McDbObjectPointer spEnt(id,McDb::kForWrite);​

​if​​​​(spEnt.openStatus() != Mcad::eOk)​

​{​

​// 如果对象,在其它地方打开,就会打开的失败.​

​return​​​ ​​false​​​​;​

​}​

 

​// 设置对象颜色​

​spEnt->setColor(color);​

 

​return​​​ ​​true​​​​;​

​}​

2、COM接口调用方式,如C#代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

​// -------------------------------------------------------------------------​

​// Summary:​

​//         改变实体颜色​

​// Parameters:​

​//         id            -    实体的id.​

​//         iR,  iG,iB    -   实体的颜色​

​// Returns:​

​//         成功返回true​

​// -------------------------------------------------------------------------​

​bool​​​ ​​ChangeColor(Int64 id,​​​​int​​​ ​​iR,​​​​int​​​ ​​iG,​​​​int​​​ ​​iB)​

​{​

​// 由id得到实体对象.​

​MxDrawEntity ent = (MxDrawEntity)axMxDrawX1.ObjectIdToObject(id);​

​if​​​ ​​(ent == null)​

​return​​​ ​​false​​​​;​

​MxDrawMcCmColor color = ​​​​new​​​ ​​MxDrawMcCmColor();​

​color.SetRGB(iR, iG, iB);​

 

​// 设置实体颜色。​

​ent.TrueColor = color;​

​return​​​ ​​true​​​​;​

​}​

修改实体的其他特性

下面实现修改其它属性的函数,比如:

修改图层属性:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

​// -------------------------------------------------------------------------​

​// Summary:​

​//      修改对象图层.​

​// Parameters:​

​//      id              -   实体的id.​

​//      pszLayerName    -   层名,如果数据库,没有该层名,返回失败。​

​// Returns:​

​//      成功返回true​

​// -------------------------------------------------------------------------​

​bool​​​ ​​ChangeLayer(McDbObjectId id,​​​​LPCTSTR​​​ ​​pszLayerName)​

​{​

​// 用智能指针打开对象,写方式打开。智能指针会自动关闭对象.​

​McDbObjectPointer spEnt(id,McDb::kForWrite);​

​if​​​​(spEnt.openStatus() != Mcad::eOk)​

​{​

​// 如果对象,在其它地方打开,就会打开的失败.​

​return​​​ ​​false​​​​;​

​}​

 

​// 设置对象颜色​

​if​​​​(spEnt->setLayer(pszLayerName) != Mcad::eOk)​

​return​​​ ​​false​​​​;​

 

​return​​​ ​​true​​​​;​

​}​

比如修改线型属性:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

​// -------------------------------------------------------------------------​

​// Summary:​

​//      修改对象线型.​

​// Parameters:​

​//      id              -   实体的id.​

​//      pszLinetypeName -   线型名,如果数据库,没有线型名,返回失败。​

​// Returns:​

​//      成功返回true​

​// -------------------------------------------------------------------------​

​bool​​​ ​​ChangeLinetype(McDbObjectId id,​​​​LPCTSTR​​​ ​​pszLinetypeName)​

​{​

​// 用智能指针打开对象,写方式打开。智能指针会自动关闭对象.​

​McDbObjectPointer spEnt(id,McDb::kForWrite);​

​if​​​​(spEnt.openStatus() != Mcad::eOk)​

​{​

​// 如果对象,在其它地方打开,就会打开的失败.​

​return​​​ ​​false​​​​;​

​}​

 

​// 设置对象颜色​

​if​​​​(spEnt->setLinetype(pszLinetypeName) != Mcad::eOk)​

​return​​​ ​​false​​​​;​

 

​return​​​ ​​true​​​​;​

​}​