AutoCAD Map 3D: Farbwerte aus Datenfeldern zur Stilisierung verwenden

Für gewöhnlich nutzen Sie in der Darstellungsverwaltung von AutoCAD Map 3D, um regelbasiert Vektordaten einzufärben. Eine standardisierte Darstellung über ein Darstellungsmodell setzt jedoch voraus, dass sich die Werte bzw. Wertebereiche nicht ändern, die den Stilregeln zugrunde liegen.

In diesem Beitrag erlernen Sie, wie Sie Farbwerte in der datenbankbasierten Fachschale festlegen und anschließend im Darstellungsmodell nutzen.

Dabei können die Farbwerte direkt am Objekt stehen oder aber über einen Katalog bereitgestellt und über eine viewbasierte Objektklasse als Darstellungsmodelllayer bereitgestellt werden.

Vorbereitung im Datenmodell

Um einen Farbwert eingeben zu können, benötigen Sie lediglich ein Textfeld mit etwa 20 Zeichen Länge und weisen im Formular dem Datenfeld das Steuerelement mit der Farbauswahl zu.




In den Eigenschaften des Farbauswahl-Steuerelements bestimmen Sie die bevorzugte Farbtabelle: TB_COLOR_ACAD bietet die 255 Index-Farben von AutoCAD und TB_COLOR_WEB eine vorkonfigurierte Liste von Web-Farben. Aktivieren Sie die Anzeige der RGB-Schaltfläche, können Sie auch zusätzliche Farben wählen.


Liste der ACI-Farben:


Liste der Web-Farben:


Freier RGB-Wert:


Wie Farbwerte gespeichert werden

Die Farben aus der Tabelle TB_COLOR_WEB werden als Hex-Wert beginnend mit dem #-Symbol im Feld gespeichert, aber auch Farbwerte ohne das einleitende #-Symbol werden akzeptiert.

Farben aus der Tabelle TB_COLOR_ACAD werden nur mit der Indexnummer gespeichert. Auf korrespondierende RGB-Werte von TB_COLOR_ACAD können Sie nur zugreifen, wenn Sie explizit Berechtigungen auf die Tabellen im Systembenutzer der Fachschalen-Technologie (MAPSYS) gesetzt haben:

connect mapsys/mapsys@orcl;
grant select on tb_color_acad to bh_grnfl;
grant select on tb_color_web to bh_grnfl;
connect bh_grnfl/avs@orcl;
select rgb_value from mapsys.tb_color_acad where id = '1';


Verwendung im Darstellungsmodell

AutoCAD Map 3D, aber auch der Kartenrenderer MapGuide OpenSource erfordern zur Darstellung der Farben zwingend einen Long-Integer-Wert, der die Informationen aus Transparenz-, Rot-, Grün-, Blauwerten enthält. In den Layerdateien eines Darstellungsmodells werden diese Long-Integer-Farbwerte als Hex-Werte gespeichert, ganz unabhängig davon, ob Sie in AutoCAD Map 3D die Farbe aus der ACI- oder RGB-Farbtabelle gewählt haben. Ein Hex-Wert setzt sich wie folgt zusammen:



Präfix

Transparenz
(Alpha-Kanal)

Rot

Grün

Blau

ARGB-Werte


160

15

255

15

Wert in Tabelle



0F

FF

0F

Farbe im Layer

0x

A0

0F

FF

0F

Dabei sind für alle 4 Parameter Werte zwischen 0 (Hex 00) und 255 (Hex FF) zulässig. Aus der Angabe 0xFFFFFFFF wird beispielsweise ein deckendes Weiß und aus 0x80FF0000 ein halbdurchsichtiges Rot.

Tipp: Im Internet finden Sie eine Reihe geeigneter Online-Werkzeuge zur Konvertierung zwischen RGB- und Hex-Werten, z. B. ColorPicker von w3schools .


Beispiel-Konfiguration eines Fachschalen-Darstellungsmodelllayers in MapGuide OpenSource:


Das bedeutet leider, dass der Farbwert nicht direkt verwendet werden kann. Im Geospatial Navigator Blog hat Markus Briglmeier empfohlen, über ein Berechnungsfeld einen Farbwert zu berechnen, den die Darstellungsverwaltung von AutoCAD Map 3D verarbeiten kann.

Dazu klicken Sie in der Darstellungsverwaltung auf den zu erweiternden Layer und rufen im Kontextmenü den Befehl Berechnung erstellen auf.


Geben Sie eine Bezeichnung für das zusätzliche Feld ein und verwenden den nachstehenden Ausdruck. Achten dabei auf die mehrfach einzelnen Anführungsstriche (es sind keine doppelten Anführungszeichen!):

TB_SQL('SELECT TO_CHAR(TO_NUMBER(''FF''||NVL(REPLACE(FARBE,''#'',''''),''000000''),''xxxxxxxx'')) FROM TOPOGRAPHIE WHERE FID = g.fid')


Zur Erklärung: TB_SQL ist eine Funktion des Autodesk.Topobase-Providers, mit der SQL-Statements auf Datenbankebene (und eben nicht auf FDO-Ebene) ausgeführt werden, um einen konkreten Wert für das aktive Objekt zu ermitteln, welches über g.fid referenziert wird.


Wollen Sie das SQL-Statement im SQL-Sheet von AutoCAD Map 3D im Vorfeld testen, führen Sie folgendes Statement aus:

SELECT TO_CHAR(TO_NUMBER('FF'||NVL(REPLACE(FARBE,'#',''),'000000'),'xxxxxxxx')) FROM TOPOGRAPHIE;


Die Feldberechnung führt dabei folgende Operationen aus:

REPLACE(FARBE,'#','') Entferne ein vorhandenes #-Symbol aus dem Wert des Feldes FARBE
NVL(...,'000000') Wurde kein Wert für FARBE angegeben, verwende schwarz
'FF'||... Setze die Zahl für die Opazität voran (= invers zur Transparenz)
TO_NUMBER(...,'xxxxxxxx') Wandelt den Text in eine Zahl, wobei das Format der Hexadezimalzahl verwendet wird
TO_CHAR(...) Wandelt die Zahl in einen Text, weil der Autodesk.Topobase-Provider keine Int64-Zahlen unterstützt

Übernehmen Sie den Ausdruck mit OK.

Der Darstellungsmodelllayer verfügt nun über eine zusätzliche Spalte mit der darzustellenden Farbe.


Diesen Wert können Sie nun in der Stilisierung verwenden.

Dazu starten Sie den Stil-Editor des Vektorlayers und wählen in der Farbauswahl den Eintrag Ausdruck verwenden. Hier können Sie die neue Eigenschaft ARGB_FARBE auswählen.


Da er allerdings als Textwert bereitgestellt wurde (aufgrund der Zahlengröße), muss dieser zunächst wieder in eine lange Ganzzahl zurückgewandelt werden. Das gelingt mit der Konvertierungsfunktion ToInt64().


Interoperabilität

Es ist unschwer zu erkennen, dass sich die eingegebene Farbe  für Systeme eignet, die reine RGB-Werte als Hex-Werte verarbeiten können (wie beispielsweise der UMN MapServer). Sobald Sie die datengesteuerte Darstellung ohne den Autodesk.Topobase-Provider nutzen wollen, wenn die TB_SQL-Funktion nicht zur Verfügung steht (z. B. in MapGuide OpenSource oder wenn die Daten als SQLite ausgeleitet werden), muss die Farbe auf einem alternativen Weg bereitgestellt werden.

Dabei bieten sich verschiedene Möglichkeiten, wobei nur drei genannt werden sollen:

1. Virtuelle Spalten

Oracle bietet die Technologie virtueller Spalten für Tabellen. Die Daten dieser Spalten werden direkt berechnet und materialisiert.

Um einer Tabelle eine virtuelle Spalte hinzuzufügen, öffnen Sie das SQL-Sheet, melden sich an der Fachschale an und führen nachstehendes Statement aus:

alter table topographie add (argb_farbe as (to_char(to_number('ff'||nvl(replace(farbe,'#',''),'000000'),'xxxxxxxx'))));


Der Nachteil virtueller Spalten besteht darin, dass Autodesk-Produkte beim Einfügen und Ändern von Datensätzen stets alle Felder beschreiben, also auch die virtuelle Spalte. Das ist jedoch nicht zulässig und mündet darin, dass Sie in AutoCAD Map 3D keine Datensätze mehr erstellen oder ändern können.

2. Viewbasierte Objektklasse

Erstellen Sie eine viewbasierte Objektklasse, in der die Farbwerte als eigenes Feld bereitgestellt werden. Selbst wenn dies ebenfalls eine virtuelle Spalte ist und die View später nicht beschreibbar ist, so kann sie zumindest rein lesend für das Darstellungsmodell genutzt werden.


Öffnen Sie dazu im ersten Schritt das SQL-Sheet, melden sich an der Fachschale an und führen nachstehendes Statement aus.

create or replace view v_dsp_topographie as
select a.*, to_char(to_number('ff'||nvl(replace(a.farbe,'#',''),'000000'),'xxxxxxxx')) as argb_farbe
from topographie a;


Erstellen Sie im zweiten Schritt im Infrastructure Administrator eine viewbasierte Objektklasse. Dieser Schritt ist erforderlich, damit die viewbasierte Objektklasse als Vektordatenquelle für das Darstellungsmodell gewählt werden kann.


Nach einer Neuanmeldung in AutoCAD Map 3D ersetzen Sie den Layer der Objektklasse durch die viewbasierte Objektklasse und können nun auf die virtuelle Spalte für das Darstellungsmodell zugreifen.


3. Farbwert in einem weiteren Feld materialisieren

Den berechneten Farbwert in einer eigenen Spalte zu speichern, ist nicht zwingend im Sinne einer nicht-redundanten Datenhaltung, kann aber in bestimmten Situationen erforderlich werden, können beispielsweise keine viewbasierten Objektklassen zur Anwendung kommen. Die Herausforderung besteht nun darin, dafür zu sorgen, dass die zusätzliche Spalte zuverlässig aktualisiert wird, wenn ein Anwender eine neue Farbe eingibt. Zu diesem Zweck greifen Sie auf die serverbasierten Objektregeln zurück (im Gegensatz dazu werden clientseitige Objektregeln in zusätzlichen Programmbibliotheken in AutoCAD Map 3D ausgeführt und reagieren nicht darauf, werden Änderungen außerhalb von AutoCAD Map 3D an den Feldwerten vorgenommen).

Serverbasierte Objektregeln sind PL-/SQL-Ausdrucksblöcke, die zunächst einmal nur in der Datenbank als reiner Text gespeichert werden. Weisen Sie einer Objektklasse dann eine solche serverbasierte Objektregel zu, wird der Textblock gelesen und – je nach Art und Priorität der Objektregel – in den Body eines Oracle-Triggers geschrieben. Ein Oracle-Trigger ist demnach nicht gleichbedeutend mit einer Objektregel. Vielmehr wird aus der Liste der einer Objektklasse zugewiesenen serverbasierten Objektregeln ein großer Trigger zusammengebaut. Und eine serverbasierte Objektregel kann – wenn der Code passt – auch mehreren Objektklassen zugewiesen werden. Anders bei einem Trigger: Ein Trigger gehört ausschließlich zu einer Objektklasse.

Serverbasierte Objektregeln definieren Sie ebenfalls im Infrastructure Administrator. Fügen Sie also eine neue Spalte ebenfalls als Text mit einer Länge von 20 Zeichen hinzu.


Klicken Sie dann mit der rechten Maustaste auf die Objektklasse und starten im Kontextmenü den Befehl Objektregeln bearbeiten.


Stellen Sie die Objektregel als Zeilentrigger vor dem Einfügen eines neuen Datensatzes bzw. vor dem Aktualisieren des Felds FARBE ein und geben nachstehenden Triggertext ein:

declare
begin
  :new.argb_farbe := to_char(to_number('ff'||nvl(replace(:new.farbe,'#',''),'000000'),'xxxxxxxx'));
end;


Klicken Sie auf OK. Die Objektregel taucht nun in der unteren Liste auf. Klicken Sie auf die Schaltfläche Hinzufügen, um die Objektregel der Objektklasse zuzuweisen. Klicken Sie auf Speichern und Schließen, damit die Objektregel angewandt wird.


Anders als in der viewbasierten Objektklasse oder bei virtuellen Spalten wird die materialisierte Spalte nur gefüllt, wenn sich der Wert der Spalte FARBE ändert. Das berechnete Feld der Darstellungsmodellfarbe sollte zudem nicht auf dem Formular erscheinen oder wenn doch, dann zumindest schreibgeschützt sein, damit es vor unerwünschter Manipulation geschützt ist.

Berücksichtigung der Transparenz

Bis jetzt haben wir uns lediglich dem Farbwert gewidmet. Für gewöhnlich gibt man mit der Transparenz den Grad der Durchsichtigkeit von 0 bis 100% an. Bei der Bestimmung teildurchsichtiger Bildschirmpixel bestimmt der Alphakanal hingegen den Grad der Opazität: Mit zunehmender Transparenz eines Pixels nimmt demnach die Opazität ab. 100% Opazität entspricht demnach null Transparenz und umgekehrt. Gespeichert wird der Wert der Opazität im Alphakanal zu Beginn der Farbe, also ARGB (in anderen Grafikprogrammen kann das anders sein) ebenfalls als Hex-Wert, also auch zwischen 0 (0%) und 255 (100%). Will man Anwendende den Grad der Transparenz bestimmen lassen, muss man sich entscheiden, ob sie die Transparenz oder die Opazität und den Bereich 0 bis 100 oder 0 bis 255 eingeben sollen. Es ist zudem immer hilfreich, die Eingabe auf Validität zu überprüfen. Das kann über Prüfregeln in den Eingabefeldern oder, besser, auf Datenbankebene erfolgen.


In diesem Beispiel soll die Transparenz in einem Bereich von 0 bis 100 eingegeben werden können, um sie anschließend die Farbe in der viewbasierten Objektklasse bzw. im materialisierten Feldwert steuern zu lassen.

Fügen Sie dazu im Infrastructure Administrator eine neue nicht-optionale Spalte als Zahlenwert mit maximal 3 Stellen ohne Nachkommastellen und einem Vorgabewert von 0 hinzu. 

Für die Prüfbedingung starten Sie das SQL-Sheet, melden sich an der Fachschale an und führen folgendes Statement aus:

alter table topographie add constraint topographie_chk_transparenz check (transparenz between 0 and 100);


Geben Sie nun im Formular einen Wert außerhalb des Bereichs zwischen 0 und 100 ein, kann der Datensatz nicht gespeichert werden.

Dabei muss der prozentuale Transparenzwert in den korrespondierenden Hex-Wert für den Alphakanal konvertiert werden:


to_char(round(((100-nvl(transparenz,0)) / 100.0)*255.0, 0),'xx')

REPLACE(FARBE,'#','') Entferne ein vorhandenes #-Symbol aus dem Wert des Feldes FARBE
NVL(...,'000000') Wurde kein Wert für FARBE angegeben, verwende schwarz
'FF'||... Setze die Zahl für die Opazität voran (= invers zur Transparenz)
TO_NUMBER(...,'xxxxxxxx') Wandelt den Text in eine Zahl, wobei das Format der Hexadezimalzahl
verwendet wird
TO_CHAR(...) Wandelt die Zahl in einen Text, weil der Autodesk.Topobase-Provider
keine Int64-Zahlen unterstützt

Auf diesem Wege können Sie alle 3 oben genannten Varianten mit der Transparenz versehen.

Virtuelle Spalte

alter table topographie
add (
  argb_farbe as (to_char(to_number(to_char(round(((100-transparenz) / 100.0) * 255.0, 0),'xx')||lower(nvl(replace(farbe,'#',''),'000000')),'xxxxxxxx'))
);

Viewbasierte Objektklasse

create or replace view v_dsp_topographie as
select a.*, to_char(to_number(to_char(round(((100-transparenz) / 100.0) * 255.0, 0),'xx')||lower(nvl(replace(farbe,'#',''),'000000')),'xxxxxxxx')) as argb_farbe
from topographie a;

Farbwert in einem weiteren Feld materialisieren

Hier ist zu beachten, dass beide Felder in der Ausführungsspalte anzugeben sind:


declare
begin
  :new.argb_farbe := to_char(to_number(to_char(round(((100-:new.transparenz) / 100.0) * 255.0, 0),'xx')||lower(nvl(replace(:new.farbe,'#',''),'000000')),'xxxxxxxx'));
end;

Eigene Farbtabelle

Wollen Sie die Liste der zulässigen Farbwerte eingrenzen, erstellen Sie eine eigene Farbtabelle und weisen sie dem Steuerelement der Farbauswahl zu. Die Farbtabelle erstellen Sie idealerweise im SQL-Sheet.

create table topographie_colors (
id varchar2(10 char) not null, 
order_id number(18,0) not null, 
rgb_value varchar2(6 char) not null, 
value varchar2(50 char) not null, 
constraint topographie_colors_p primary key (id));

Dabei enthalten die Spalten dieser Tabelle die folgenden Werte:
ID  Schlüsselwert, der als Fremdschlüssel in den Feldwerten der Objektklassen gespeichert wird 
ORDER_ID  Index in der Anzeigereihenfolge der Farbauswahl
RGB_VALUE  RGB-Wert für die Voransicht in der Farbauswahl
VALUE  Bezeichnung für die Farbauswahl
Befüllen Sie nun die Liste mit den gewünschten Werten:
insert into topographie_colors (id, order_id, rgb_value, value) values ('#000000', 1, '000000', 'Schwarz');
insert into topographie_colors (id, order_id, rgb_value, value) values ('#FFFFFF', 2, 'FFFFFF', 'Weiß');
insert into topographie_colors (id, order_id, rgb_value, value) values ('#FFAAAA', 3, 'FFAAAA', 'Wohnbauflächen');
insert into topographie_colors (id, order_id, rgb_value, value) values ('#BDAD7E', 4, 'BDAD7E', 'Gemischte Bauflächen');
insert into topographie_colors (id, order_id, rgb_value, value) values ('#BEBEBE', 5, 'BEBEBE', 'Gewerbliche Bauflächen');
insert into topographie_colors (id, order_id, rgb_value, value) values ('#FF7F00', 6, 'FF7F00', 'Sonderbauflächen');
insert into topographie_colors (id, order_id, rgb_value, value) values ('#FF00FF', 7, 'FF00FF', 'Gemeinbedarfsflächen');
insert into topographie_colors (id, order_id, rgb_value, value) values ('#FFBF00', 8, 'FFBF00', 'Verkehrsflächen');
insert into topographie_colors (id, order_id, rgb_value, value) values ('#FFFF00', 9, 'FFFF00', 'Versorgungsflächen');
insert into topographie_colors (id, order_id, rgb_value, value) values ('#00FF00', 10, '00FF00', 'Grünflächen');
insert into topographie_colors (id, order_id, rgb_value, value) values ('#00BFFF', 11, '00BFFF', 'Wasserflächen');
insert into topographie_colors (id, order_id, rgb_value, value) values ('#E7E700', 12, 'E7E700', 'Landwirtschaftsflächen');
insert into topographie_colors (id, order_id, rgb_value, value) values ('#008181', 13, '008181', 'Waldflächen');
commit;


Nach dem erneuten Öffnen des Unternehmensprojekts im Infrastructure Administrator, können Sie dem Steuerelement die Farbtabelle zuweisen.


Fortan steht Ihnen die benutzerdefinierte Farbauswahl zur Verfügung.

Viel Spaß beim Ausprobieren!


© 02/2025 Mensch und Maschine acadGraph GmbH. Alle Rechte vorbehalten.