任务背景
例如,给客户带来了一个问题:
- 在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。

重复该过程几次,然后将结果简化为文本文件。
首先,我对表中的数字感到非常惊讶,尤其是正负值的出现。
通过对分量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);