Guardar color del elemento en la base de datos de Navisworks

Tarea de fondo


Por ejemplo, surgió un problema para el cliente:


  • Deseche los elementos del modelo de construcción en 1C.
  • En 1C, use estas partes del modelo en los contratos; bueno, digamos, indique que tal y tal elemento ya se ha construido, tal y tal solo está planeado, etc.
  • En Navisworks, puede ver esto de alguna manera en un dibujo, por ejemplo, al mostrar elementos del modelo en diferentes colores. Para hacer esto, crearon un complemento para Navisworks que puede copiar datos de tablas de cuantificación (tablas de despegue) a 1C, así como recuperarlos de 1C y ponerlos en las tablas de despegue.
    Y en 1C, se suponía que los elementos del modelo (habitaciones) utilizados en el contrato deberían cambiar de color.

Solo ahora resultó que después de cambiar estos datos tabulares en 1C, Navisworks no entiende que han cambiado, y sería necesario actualizarlos. Por lo tanto, yo, el programador, necesito decirle esto.


Entonces, la tarea para el programador


Después del intercambio con 1C, los datos en la tabla TK_Item cambiaron, en particular, el campo Color. Es necesario traer los colores en el dibujo mostrado de acuerdo con los indicados en la tabla.


Estamos buscando cómo hacerlo. Cavamos la descripción. Encontramos la función -


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

Bueno, cómo encontrar elementos del modelo que correspondan al elemento TK_Item seleccionado es otra historia, te contaré en otro momento si es interesante. Pero quién lo necesita, y él lo resolverá. Pero con el color, todo resultó ser más interesante.
En primer lugar, el Color especificado en los parámetros de la función no es System.Drawing.Color, sino incluso Autodesk.Navisworks.Api.Color, con su blackjack y ... bueno, ya entiendes. Bueno, déjalo ser, pero él tiene un constructor así:


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

Por lo tanto, sin problemas, crearemos el color que necesite la API de Autodesk.
(En realidad, lo primero que debería intentar es encontrar los elementos que corresponden al elemento seleccionado, seleccionar un color y establecerlo en este color).


Pero En la tabla, tenemos en el campo Color un valor de tipo Int64. Y cómo compararlo con un objeto de tipo Color no está claro.


Además, ni en la documentación, ni en el foro, ni en los ejemplos pude encontrar cómo está escrito en la base de datos.


OK, cavaremos experimentalmente.


Tomamos Navisworks, abrimos cuantificación, cambiamos el color de un elemento. Digamos, en un honesto, limpio rojo.


imagen


Después de eso, tomamos nuestro complemento, les enviamos los datos de la tabla TK_Item y miramos, ¿qué hay en la tabla?


(Afortunadamente, el complemento para fines de depuración proporcionó esa opción: descargar datos y mostrarlos en el formulario).


Resulta que hay -65536.


imagen


Repita el procedimiento varias veces y reduzca los resultados a un archivo de texto.


TituloColorValor de color en la tablaRepresentación binaria de color en una tabla.
Tipo de pared 1.1 sobre la marca 0,000Rojo-655361111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000
Tipo de pared 1.2 sobre la marca 0,000Verde-167119361111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 1111 1111 0000 0000
Tipo de pared 2.1 sobre la marca 0,000Azul-167769611111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000 1111 1111
Tipo de pared 0.1 debajo de la marca 0,000Rojo = 16-157286401111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0001 0000 0000 0000 0000 0000
Tipo de pared 0.2 debajo de la marca 0,000Rojo = 17-156631041111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0001 0001 0000 0000 0000 0000
Lazos en un elev. 0,000Rojo = 193 Verde = 32 Azul = 7412 656 7140000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100 0001 0010 0000 0100 1010

Al principio, me sorprendieron mucho los números en la tabla, y especialmente la presencia de valores positivos y negativos.


Después de experimentar con los valores de los componentes R, G, B, me di cuenta de que estos tres componentes se muestran con los últimos tres bytes del número.


Pero entonces es extraño: ¿por qué los bytes altos están llenos de unidades, no ceros?
Sin embargo, si suponemos que siempre están llenos de unidades, entonces la presencia de números negativos obtiene una explicación. Simplemente complete el byte alto, que determina el signo del número.
¡Pero no siempre hay números negativos!


Y solo recordando cómo funcionan las funciones >> y <<, me di cuenta de que pueden completar estúpidamente los bits altos con números, incluido el bit de signo. Y como los bits más significativos no son necesarios, no importa lo que haya allí.


Entonces la pregunta es: ¿para qué necesitaban tanta importancia para el color? ¿Ya tienes 64 bits? Observé la estructura de las tablas en las que se almacenan estos datos: solo usa Int64 para todos los enteros. Realmente, ¿por qué bagatela?


Resumen


El valor del color registrado en la tabla se obtiene de la siguiente manera:


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

La transformación inversa, el color de la tabla al color utilizado para los elementos del modelo, hacemos esto:


 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/450248/


All Articles