[C# MSCE]ByCell的color问题

通过ElementColor类得到的颜色中有Element类型、Bylevel,ByCell,其中element可以直接得到对应的rgb值,bylevel可以通过levelDefinitonColor获得,那么ByCell的颜色怎么处理呢?当元素是SharedCell时获得的elementcolor就是ByCell源的

Parents
  • 获取到Cell的子元素,从子元素上读取元素的颜色。如果是共享单元的话,就得找到共享单元定义元素,再去迭代子元素去获取颜色

  • 如何找到共享单元定义元素呢?我是想要获取到共享单元的assign material,所以想要得到其颜色

  • 老师,那这种cell的颜色是不是就没办法在当前系统中获取到了啊?

  • 符老师,那我想要获得这个cell的assign material,所需的颜色是创建cell时的颜色吗?有没有办法得到需要的颜色呢?

  • 那这种cell的颜色是不是就没办法在当前系统中获取到了啊?

    SharedCell的颜色可以被覆盖的,所以才会存在ElementColor和ByCell Color。都是可以取得的。

    那我想要获得这个cell的assign material,所需的颜色是创建cell时的颜色吗?有没有办法得到需要的颜色呢?

    Material(材质)中设置的颜色只有在视图显示样式被设置为渲染方式时才会覆盖元素本身的颜色。所以,要正确获得你当前看到的是什么颜色,其实还依赖于很多方面。我记得在另外一个帖子中说过,大概有7个方面都会影响到元素当前的显示颜色。所以,您要先搞清楚想要获得元素在什么状态下的颜色。

    可否提供一个DGN文件,仅包含你这一个想要获取颜色的元素供我们分析。



  • BIM.dgn

    符老师,这是读取颜色遇到问题的几个模型。其中Bylevel 18 38 140 254这几种颜色都没有办法获取到。

  • 在我们学习MS编程前必须要学习MS软件的一些基本概念。许多编程问题其实是概念不清导致的。

    在MS软件中颜色有索引色、真彩色、色簿色等多种表达形式,如下图所示,点开MS的颜色选取器就能看到这三个卡片分别对应索引色、真彩色、色簿色。对于你说的Bylevel 18 38 140 254,18/38/140或254都是索引色,一个索引色又是由具体的RGB色定义的,整个索引色表的定义叫做ColorTable(色表)。使用索引色的好处是:可以方便地更换一个色表就能让整个模型中的元素呈现出不同的颜色来,而元素本身的属性(颜色值)则没有改变。

    而ByLevel的意思是,每个层(Level)定义了一种颜色,默认仍然是以索引色来定义的。打开Level Manager能看到每个层定义的ByLevel的颜色如下:

    当我们指定一个元素的颜色不是具体的某个索引色(0~254)而是-1时,就表示该元素的颜色将会跟随其所在的层的颜色来变化。比如一个元素的颜色被设置成了ByLevel,它位于“电气-桥架-电缆沟”层时就会呈现出绿色来,如果你把这个元素移动到了“设备_35kV”层,则该元素就会呈现白色。

    你如果已经从Element构造了一个ElementColor对象,则取ElementColor对象下的Red、Green、Blue或Rgb属性就能得到对应的RGB色。Index属性就能获得对应的索引色。当然,如果元素的颜色是通过真彩色设定的,则不太可能恰巧对应到某个索引色,只能得到最接近的索引色。因为真彩色有几百万种,而索引色只是其中的254中。

    【注】:255表示视图的背景色



Reply
  • 在我们学习MS编程前必须要学习MS软件的一些基本概念。许多编程问题其实是概念不清导致的。

    在MS软件中颜色有索引色、真彩色、色簿色等多种表达形式,如下图所示,点开MS的颜色选取器就能看到这三个卡片分别对应索引色、真彩色、色簿色。对于你说的Bylevel 18 38 140 254,18/38/140或254都是索引色,一个索引色又是由具体的RGB色定义的,整个索引色表的定义叫做ColorTable(色表)。使用索引色的好处是:可以方便地更换一个色表就能让整个模型中的元素呈现出不同的颜色来,而元素本身的属性(颜色值)则没有改变。

    而ByLevel的意思是,每个层(Level)定义了一种颜色,默认仍然是以索引色来定义的。打开Level Manager能看到每个层定义的ByLevel的颜色如下:

    当我们指定一个元素的颜色不是具体的某个索引色(0~254)而是-1时,就表示该元素的颜色将会跟随其所在的层的颜色来变化。比如一个元素的颜色被设置成了ByLevel,它位于“电气-桥架-电缆沟”层时就会呈现出绿色来,如果你把这个元素移动到了“设备_35kV”层,则该元素就会呈现白色。

    你如果已经从Element构造了一个ElementColor对象,则取ElementColor对象下的Red、Green、Blue或Rgb属性就能得到对应的RGB色。Index属性就能获得对应的索引色。当然,如果元素的颜色是通过真彩色设定的,则不太可能恰巧对应到某个索引色,只能得到最接近的索引色。因为真彩色有几百万种,而索引色只是其中的254中。

    【注】:255表示视图的背景色



Children
  • 谢谢符老师再一次耐心的解答,您说的这些内容我之前在论坛之前的帖子中看到过,也理解了。不过我发的模型中点击单个元素的时候,会有这种情形的出现。

    我不是特别理解,为什么元素的属性中Color显示为空,但是元素选择器里面显示的元素是多个颜色?这种是不是跟shared cell是组合的相关啊?我想获取Element Selection中的颜色,但是编程有些就获取不到

  • 为什么元素的属性中Color显示为空,但是元素选择器里面显示的元素是多个颜色?

    这是单元(Cell)和共享单元(SharedCell)所造成的。因为Cell或SharedCell底层都是由多个子元素组成的,而每个子元素有可能会有不同的颜色,所以,无法在Cell或SharedCell这一层级显示出颜色来。

    我想获取Element Selection中的颜色,但是编程有些就获取不到

    对于SharedCell,你需要先获得其对应的SharedCEllDefinition元素,这个里面才真正保存着子元素,遍历这些子元素口就能拿到各个颜色了。



    Answer Verified By: xz h