Enregistrement de la couleur des éléments dans la base de données Navisworks

Contexte de la tâche


Par exemple, un problème est survenu pour le client:


  • Jetez les éléments du modèle de bâtiment dans 1C.
  • Dans 1C, utilisez ces parties du modèle dans les contrats - eh bien, disons, indiquent que tel ou tel élément a déjà été construit, tel ou tel n'est que prévu, etc.
  • Dans Navisworks, vous pouvez en quelque sorte voir cela dans un dessin - par exemple, en affichant les éléments du modèle dans différentes couleurs. Pour ce faire, ils ont créé un plug-in pour Navisworks qui peut copier des données de tables de quantification (tables de relevés) vers 1C, ainsi que les récupérer de 1C et les placer dans des tables de relevés.
    Et dans 1C, il était supposé que les éléments du modèle (pièces) utilisés dans le contrat devaient changer de couleur.

Ce n'est que maintenant qu'il s'est avéré qu'après avoir modifié ces données tabulaires dans 1C - Navisworks ne comprend pas qu'elles ont changé et qu'il serait nécessaire de les mettre à jour. Par conséquent, moi, le programmeur, je dois lui dire ceci.


Donc, la tâche du programmeur


Après l'échange avec 1C, les données de la table TK_Item ont changé - en particulier, le champ Couleur. Il est nécessaire d'apporter les couleurs dans le dessin affiché conformément à celles indiquées dans le tableau.


Nous cherchons comment le faire. Nous creusons la description. Nous trouvons la fonction -


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

Eh bien, comment trouver des éléments de modèle qui correspondent à l'élément TK_Item sélectionné est une autre histoire, je vais vous raconter une autre fois si c'est intéressant. Mais qui en a besoin - et il le découvrira. Mais avec la couleur, tout s'est avéré plus intéressant.
Tout d'abord, la couleur spécifiée dans les paramètres de la fonction n'est pas System.Drawing.Color, mais même Autodesk.Navisworks.Api.Color, avec son blackjack et ... eh bien, vous comprenez. Eh bien, que ce soit, mais il a un tel constructeur:


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

Par conséquent, sans problème, nous créerons une couleur telle que l'API Autodesk est nécessaire.
(En fait, la première chose que je devrais essayer est de trouver les éléments qui correspondent à l'élément sélectionné, de sélectionner une couleur - et de la définir sur cette couleur.)


Mais. Dans le tableau, nous avons dans le champ Couleur une valeur de type Int64. Et comment le comparer avec un objet de type Couleur n'est pas clair.


De plus, ni dans la documentation, ni dans le forum, ni dans les exemples je n'ai pu trouver comment il est écrit dans la base de données.


OK, nous allons creuser expérimentalement.


Nous prenons Navisworks, ouvrons la quantification, changeons la couleur d'un élément. Dites, sur un rouge honnête et propre.


image


Après cela, nous prenons notre plugin, leur pompons les données de la table TK_Item et regardons ce qu'il y a dans la table?


(Heureusement, le plug-in à des fins de débogage a fourni une telle option - télécharger des données et afficher sur le formulaire.)


Il s'avère qu'il y a -65536.


image


Répétez la procédure plusieurs fois et réduisez les résultats dans un fichier texte.


Le titreLa couleurValeur de couleur dans le tableauReprésentation binaire de la couleur dans un tableau
Type de mur 1.1 au-dessus de la marque 0,000Rouge-655361111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000
Type de mur 1.2 au-dessus de la marque 0,000Vert-167119361111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 1111 1111 0000 0000
Type de mur 2.1 au-dessus de la marque 0,000Bleu-167769611111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000 1111 1111
Type de mur 0,1 sous la marque 0,000Rouge = 16-157286401111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0001 0000 0000 0000 0000 0000
Type de mur 0,2 sous la marque 0,000Rouge = 17-156631041111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0001 0001 0000 0000 0000 0000
Se noue sur un onze. 0,000Rouge = 193 Vert = 32 Bleu = 7412 656 7140000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100 0001 0010 0000 0100 1010

Au début, j'ai été très surpris par les chiffres du tableau, et surtout par la présence de valeurs positives et négatives.


Après avoir expérimenté les valeurs des composants R, G, B, j'ai réalisé que ces trois composants sont affichés avec les trois derniers octets du nombre.


Mais alors c'est étrange - pourquoi les octets élevés sont-ils remplis d'unités, pas de zéros?
Cependant, si nous supposons qu'ils sont toujours remplis d'unités, la présence de nombres négatifs obtient une explication. Remplissez simplement l'octet de poids fort qui détermine le signe du nombre.
Mais il n'y a pas toujours de nombres négatifs!


Et juste en me rappelant comment fonctionnent les fonctions >> et <<, j'ai réalisé qu'elles pouvaient bêtement remplir les bits hauts avec des nombres, y compris le bit de signe. Et comme les bits les plus significatifs ne sont pas nécessaires, peu importe ce qui s'y trouve.


Alors la question est - pourquoi avaient-ils besoin d'une telle importance pour la couleur? Déjà 64 bits? J'ai regardé la structure des tables dans lesquelles ces données sont stockées - il utilise simplement Int64 pour tous les entiers. Vraiment, pourquoi bagatelle?


Résumé


La valeur de la couleur enregistrée dans le tableau est obtenue comme suit:


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

La transformation inverse - la couleur du tableau à la couleur utilisée pour les éléments du modèle - nous faisons ceci:


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


All Articles