Speichern der Elementfarbe in der Navisworks-Datenbank

Aufgabenhintergrund


Für den Kunden ist beispielsweise ein Problem aufgetreten:


  • Werfen Sie die Gebäudemodellelemente in 1C ab.
  • Verwenden Sie in 1C diese Teile des Modells in Verträgen. Nehmen wir beispielsweise an, dass solche und solche Elemente bereits erstellt wurden, solche und solche nur geplant sind usw.
  • In Navisworks können Sie dies in einer Zeichnung sehen, indem Sie beispielsweise Modellelemente in verschiedenen Farben anzeigen. Zu diesem Zweck haben sie ein Plug-In für Navisworks erstellt, mit dem Daten aus Quantifizierungstabellen (Starttabellen) nach 1C kopiert sowie von 1C zurückgenommen und in Starttabellen abgelegt werden können.
    Und in 1C wurde angenommen, dass die im Vertrag verwendeten Modellelemente (Räume) ihre Farbe ändern sollten.

Erst jetzt stellte sich heraus, dass Navisworks nach dem Ändern dieser Tabellendaten in 1C nicht versteht, dass sie sich geändert haben, und dass sie aktualisiert werden müssten. Deshalb muss ich, der Programmierer, ihm das sagen.


Also die Aufgabe für den Programmierer


Nach dem Austausch mit 1C haben sich die Daten in der Tabelle TK_Item geändert - insbesondere das Feld Farbe. Es ist notwendig, die Farben in der angezeigten Zeichnung in Übereinstimmung mit den in der Tabelle angegebenen zu bringen.


Wir suchen nach Möglichkeiten, dies zu tun. Wir graben die Beschreibung. Wir finden die Funktion -


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

Wie Sie Modellelemente finden, die dem ausgewählten TK_Item-Element entsprechen, ist eine andere Geschichte. Ich werde Ihnen ein anderes Mal erzählen, wenn es interessant ist. Aber wer braucht es - und er wird es herausfinden. Aber mit Farbe erwies sich alles als interessanter.
Erstens ist die in den Parametern der Funktion angegebene Farbe nicht System.Drawing.Color, sondern sogar Autodesk.Navisworks.Api.Color mit seinem Blackjack und ... nun, Sie verstehen. Nun, lass es sein, aber er hat einen solchen Konstruktor:


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

Daher werden wir ohne Probleme eine Farbe erstellen, die die Autodesk-API benötigt.
(Eigentlich sollte ich zuerst versuchen, die Elemente zu finden, die dem ausgewählten Element entsprechen, eine Farbe auswählen und auf diese Farbe einstellen.)


Aber. In der Tabelle haben wir im Feld Farbe einen Wert vom Typ Int64. Und wie man es mit einem Objekt vom Typ Farbe vergleicht, ist unklar.


Außerdem konnte ich weder in der Dokumentation noch im Forum noch in den Beispielen finden, wie es in der Datenbank geschrieben ist.


OK, wir werden experimentell graben.


Wir nehmen Navisworks, öffnen Quantifizierung, ändern die Farbe eines Elements. Sagen wir auf einem ehrlichen, sauberen Rot.


Bild


Danach nehmen wir unser Plugin, pumpen ihnen die Daten aus der TK_Item-Tabelle und schauen, was ist in der Tabelle?


(Glücklicherweise bot das Plug-In für Debugging-Zwecke eine solche Option - Daten herunterladen und auf dem Formular anzeigen.)


Es stellt sich heraus, dass es -65536 ist.


Bild


Wiederholen Sie den Vorgang mehrmals und reduzieren Sie die Ergebnisse auf eine Textdatei.


TitelFarbeFarbwert in TabelleBinäre Darstellung der Farbe in einer Tabelle
Wandtyp 1.1 über der Markierung 0,000Rot-655361111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000
Wandtyp 1.2 über der Markierung 0,000Grün-167119361111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 1111 1111 0000 0000
Wandtyp 2.1 über der Markierung 0,000Blau-167769611111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 0000 0000 0000 1111 1111
Wandtyp 0,1 unter der Marke 0,000Rot = 16-157286401111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0001 0000 0000 0000 0000 0000
Wandtyp 0,2 unter der Marke 0,000Rot = 17-156631041111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0001 0001 0000 0000 0000 0000
Krawatten auf einer Höhe. 0,000Rot = 193 Grün = 32 Blau = 7412 656 7140000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100 0001 0010 0000 0100 1010

Anfangs war ich sehr überrascht von den Zahlen in der Tabelle und insbesondere vom Vorhandensein positiver und negativer Werte.


Nachdem ich mit den Werten der Komponenten R, G, B experimentiert hatte, stellte ich fest, dass diese drei Komponenten mit den letzten drei Bytes der Zahl angezeigt werden.


Aber dann ist es seltsam - warum sind die hohen Bytes mit Einheiten gefüllt, nicht mit Nullen?
Wenn wir jedoch annehmen, dass sie immer mit Einheiten gefüllt sind, wird das Vorhandensein negativer Zahlen erklärt. Füllen Sie einfach das High-Byte aus, das das Vorzeichen der Zahl bestimmt.
Es gibt aber nicht immer negative Zahlen!


Und als ich mich nur daran erinnerte, wie die Funktionen >> und << funktionieren, wurde mir klar, dass sie die hohen Bits dumm mit Zahlen füllen können, einschließlich des Vorzeichenbits. Und da die wichtigsten Bits nicht benötigt werden, spielt es keine Rolle, was vorhanden ist.


Dann ist die Frage: Wofür brauchten sie so viel Bedeutung für die Farbe? Bereits 64 Bit? Ich habe mir die Struktur der Tabellen angesehen, in denen diese Daten gespeichert sind - es wird nur Int64 für alle Ganzzahlen verwendet. Wirklich, warum Kleinigkeit?


Zusammenfassung


Der Wert der in der Tabelle aufgezeichneten Farbe wird wie folgt erhalten:


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

Die inverse Transformation - die Tabellenfarbe in die Farbe, die für die Modellelemente verwendet wird - machen wir folgendermaßen:


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


All Articles