将项目颜色保存在Navisworks数据库中

任务背景


例如,给客户带来了一个问题:


  • 在1C中丢弃建筑模型元素。
  • 在1C中,在合同中使用模型的这些部分-可以说,表明此类要素已经建立,此类要素只是计划中的,等等。
  • 在Navisworks中,您可以通过某种方式在图形中看到它-例如,通过以不同的颜色显示模型元素。 为此,他们为Navisworks制作了一个插件,该插件可以将数据从“定量”表(“起飞”表)复制到1C,也可以将其从1C取回并放入“起飞”表。
    在1C中,假定合同中使用的模型元素(房间)应更改颜色。

直到现在,事实证明,在1C中更改了这些表格数据后,Navisworks不了解它们已更改,因此有必要对其进行更新。 因此,我(程序员)需要告诉他这一点。


因此,程序员的任务


与1C交换后,TK_Item表中的数据发生了变化-特别是“颜色”字段。 必须按照表中指示的颜色在显示的图形中显示颜色。


我们正在寻找方法。 我们挖掘描述。 我们找到功能-


public void OverridePermanentColor(IEnumerable<ModelItem> items, Color color) 

好吧,如何找到与所选TK_Item元素相对应的模型元素是另一回事,我会再次告诉您它是否有趣。 但是谁需要它-他会解决的。 但是有了颜色,一切都变得更加有趣。
首先,在函数的参数中指定的Color不是System.Drawing.Color,而是Autodesk.Navisworks.Api.Color,它带有二十一点,而且...您知道。 好吧,顺其自然,但是他有一个这样的构造函数:


 public static unsafe Color FromByteRGB(byte red, byte green, byte blue) 

因此,没有问题,我们将制作需要Autodesk API的颜色。
(实际上,我应该尝试的第一件事是找到与所选项目相对应的元素,选择一种颜色-并将其设置为此颜色。)


但是 在表中,我们在颜色字段中有一个Int64类型的值。 以及如何将其与Color类型的对象进行比较尚不清楚。


而且,无论是在文档,论坛还是示例中,我都找不到如何在数据库中编写它。


好,我们将进行实验性挖掘。


我们采用Navisworks,打开“量化”,更改元素的颜色。 用诚实,干净的红色说。


图片


之后,我们拿起我们的插件,从TK_Item表中抽取数据,看看表中有什么?


(幸运的是,用于调试目的的插件提供了这样的选项-下载数据并显示在表单上。)


原来那里是-65536。


图片


重复该过程几次,然后将结果简化为文本文件。


职称色泽表中的颜色值表中颜色的二进制表示
标记上方的墙壁类型1.1 0,000红色的-655361111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000
墙型1.2以上标记 0,000绿色的-167119361111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 1111 1111 0000 0000
墙式2.1以上标记 0,000蓝色的-167769611111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000 1111 1111
墙型低于标记0.1 0,000红色= 16-157286401111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0001 0000 0000 0000 0000 0000
墙面类型0.2以下标记 0,000红色= 17-156631041111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0001 0001 0000 0000 0000 0000
并举。 0,000红色= 193绿色= 32蓝色= 74126567140000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100 0001 0001 0010 0000 0100 1010

首先,我对表中的数字感到非常惊讶,尤其是正负值的出现。


通过对分量R,G,B的值进行实验,我意识到这三个分量与数字的最后三个字节一起显示。


但是,这很奇怪-为什么高字节填充单位而不是零?
但是,如果我们假设它们始终充满单位,那么负数的存在将得到解释。 只需填写高字节,即可确定数字的符号。
但是并不总是有负数!


仅仅记得>>和<<函数是如何工作的,我意识到它们可以愚蠢地用数字(包括符号位)填充高位。 而且由于不需要最高有效位,所以这里没有什么也没关系。


然后的问题是-他们为什么需要如此重要的色彩? 已经是64位? 我查看了存储该数据的表的结构-它仅对所有整数使用Int64。 真的,为什么要琐事?


总结


表中记录的颜色值按以下方式获得:


 Int64 dbColor = Rb<<16 + Gb<<8 + Bb; 

逆变换-将表格颜色转换为用于模型元素的颜色-我们执行以下操作:


 byte R = (byte)(dbColorValue >> 16 % 256); byte G = (byte)(dbColorValue >> 8 % 256); byte B = (byte) (dbColorValue % 256); var color = Autodesk.Navisworks.Api.Color.FromByteRGB(R, G, B); 

Source: https://habr.com/ru/post/zh-CN450248/


All Articles