Tuesday 29 October 2013

OracleImport - ORA-01400

Die TB2 Fachschale wurde mit Flatport migriert und konfiguriert. Anschliessend wird die Flatport-Migration in ein weiteres Schema erneut durchgeführt, um den OracleImport (Mapping) zu konfigurieren. Später werden die TB2 Daten in die vorbereitete Map-Fachschale via Flatport und OracleImport migirert.

Bisher hat das Einrichten des OracleImportes und der Import selbst immer funktioniert - bis gestern bei einer Tabelle während des Importes folgende Fehlermeldung ausgegeben wurde:

Fehler:ORA-01400: Einfügen von NULL in ("WT_TB"."WTB_KB_BAUWERK_TBL"."FID") nicht möglich

Die Meldung ist soweit nachvollziehbar - aber warum tritt das Problem plötzlich auf und warum bei einer Tabellen aber nicht bei den anderen Tabellen im Schema?

Die Erkläung ist einfach, leider habe ich doch einige Zeit und letztlich den Hinweis vom Kollegen benötigt - der zugehörige Trigger "WTB_KB_BAUWERK_TBL_FID" war deaktiviert. Warum dies passiert ist kann ich nicht sagen - manuell deaktiviert habe ich ihn nicht. Nach dem Aktivieren lief die Migration ohne weitere Meldungen durch.


Map 2013, SP2

Monday 28 October 2013

Ungültiger View aus TB_Dictionary entfernt / Views per Script registrieren

Wenn man die in der 1-Klick-Wartung gefundenen Probleme beheben lässt und die Option "Fachschalen-Wörterbuch" aktiviert hat sollte man sich darauf einstellen, dass ein ungültiger View aus TB_DICTIONARY entfernt wird. In der Map Hilfe heisst es:

Wörterbuch - Korrigiert oder entfernt ungültige Einträge in TB_DICTIONARY. 

Das war mir nicht bewusst. In diesem Zusammenhang noch der Hinweis - anstelle die Views
(etwas umständlich) über den Map-Administrator manuell einzubinden kann man das auch per Script. Hier ein Beispiel für die Ausführung im SQL Developer:

--in der Fachschale ausführen, hier: wt_fm
declare  n_ret number;
begin
  n_ret:=MAPSYS.FeatureClass.CreateFeatureClass('FM_V_DSP_SW_TRASSEKNOTEN','FM_V_DSP_SW_TRASSEKNOTEN','Darstellung','P', '', 2, 0.00050, '352257', 'anyinteract', 1000000, 1000000, 10000, -10, -10, -10, 1, 1); 
  n_ret:=MAPSYS.FeatureClass.CreateFeatureClass('FM_V_DSP_SW_TRASSEKANTE','FM_V_DSP_SW_TRASSEKANTE','Darstellung','L', '', 2, 0.00050, '352257', 'anyinteract', 1000000, 1000000, 10000, -10, -10, -10, 1, 1);
end;

--separat ausführen:
commit;


Die einzelnen Parameter für CreateFeatureClass sind beschrieben in "Autodesk Topobase ServerSide API Help", Stand 2011. Eine neuere Dokumentation habe ich nicht gefunden. Hier der Auszug aus der CHM Datei (Topobase_ServerSide_API.chm).

FeatureClassFactory.createFeatureClass Methodcreate a feature class with all necessary attributes.

Java
public static AbstractFeatureClass createFeatureClass(
    String featureClassName,
    String caption,
    String topicName,
    String featureClassType,
    int parent_f_class_id,
    int dimensions,
    double tolerance,
    String srid,
    String spatialMask,
    double max_x,
    double max_y,
    double max_z,
    double min_x,
    double min_y,
    double min_z,
    int readOnly,
    int objectExists
) throws SQLException, TopobaseException;
 

Parameters
Parameters  Description  


featureClassName  - name of the new feature class  


caption  - caption of the new feature class  


topicName  - in which topic does the feature class is in 

 
featureClassType  - type of the new feature class [varchar2(1)] -> P - Point, L - Line, O - Polygon, A - Label, C - Collection, T - Attribute, R - Raster, E - Centroid, S - CompoundSurface, I - CompoundLineString, D - AutoCad Collection ,W - WMSMap, M - Dimension   


parent_f_class_id  - parent feature class of the new feature class   


dimensions  - spatial dimension of the new feature class 

 
tolerance  - spatial tolerance of the new feature class  


srid  - spatial reference ID of the new feature class   


spatialMask  - spatial query mask of the new feature class 

 
max_x  - max x value of the new feature class   


max_y  - max y value of the new feature class  


max_z  - max z value of the new feature class  


min_x  - min x value of the new feature class  


min_y  - min y value of the new feature class  


min_z  - min z value of the new feature class  


readOnly  - Feature class is read only   


objectExists  - Table/View already exists (register feature class only)
 

Returns
instance of an abstract feature class object

Remarks

See Also
FeatureClassFactory Class
FeatureClassFactory Members
topobase.feature Package


geändert am 13.11. - die GRANTS sollten nicht erforderlich sein, da die Ausführungsberechtigung bereits der Rolle 'public' zugewiesen wurde. Daher GRANT/REVOKE Verweis im Beispielscript entfernt.

Thursday 24 October 2013

Blog 'Beyond the Box'

Bei Autodesk gibt es noch einen Blog, der sich auch mit Map/AIMS/Topobase beschäftigt - "Beyond the Box". Der Blog vielleicht nicht so bekannt - hat aber gerade einen interessanten Artikel zum Thema AIMS Performance.


Wednesday 16 October 2013

Publizieren nach AIMS - Tooltip

In Map kann man für einen Layer "QuickInfos" erstellen (Kontextmenü zum Layer > Quickinfos einrichten). Leider werden diese beim Publizieren nach AIMS nicht zu "Tooltips".

In AIMS muss man dann die Tooltipps nachträglich konfigurieren. Muss man später das Darstellungsmodell nochmal publizieren gehen die eingerichteten Tooltipps verloren.

Jetzt kann man bei der Erstellung der Darstellungsmodelle schon den Tooltip für AIMS mitkonfigurieren. In Map hat man davon leider nichts aber beim (erneuten) Publizieren nach AIMS sind die Tooltips dann schon vorhanden.

Dazu muss man in der Layer Datei unterhalb <VectorLayerDefinition> den Tooltip definieren. Dieser entspricht einem normalen Map/AIMS "Ausdruck" innerhalb des XML Tags <ToolTip></ToolTip>, z.B.

<ToolTip>Concat ( 'DP-Objekt Nr.: ', OBJEKT, Concat (  '\n', BEZEICHNUNG, CONCAT( '\n', SCHUTZMASSNAHME )  ))</ToolTip>


<ToolTip> Beispiel im Map-Layer   

Tooltip konfiguriert in AIMS/Studio
 Lädt man das Darstellungsmodell in Map wird der <ToolTip> ignoriert. Speichert man das Darstellungsmodell bleibt der <ToolTip> erhalten (zumindest hat das bisher bei mir mit "Speichern" "Speichern unter" funktioniert).

Man hat zwar bei der Erstellung des Darstellunsgmodells einen etwas höheren Aufwand - erspart sich später aber das manuelle Einrichten der Tooltipps in AIMS.

Map 2013, SP2

Monday 14 October 2013

Formulare anpassen per SQL

Im Formular-Designer lassen sich scheinbar nicht die Eigenschaften mehrerer gleichartiger Steuerelemente gleichzeitig ändern - zwar kann man die Steuerelemente auswählen und einen neuen Wert für eine Eigenschaft zuweisen aber die Zuweisung wird ignoriert. Hat man mehrere gleichartige Steuerelemente die man anpassen will ist die Änderung per SQL schneller als jedes Element anzufassen und anzupassen.

Mehrere Checkboxen anpassen....
In der Tabelle TB_GN_DIALOG sucht man sich die ID des fraglichen Formulars. Damit kann man in der Tabelle TB_GN_CONTROL die Steuerlemente des Formulars herausfiltern, z.B. alle CheckBox Elemente:

select * from tb_gn_control where dialog_id = 6 and upper(classname) = 'CHECKBOX';

Um die FALSE und TRUE Werte sowie die Grösse der CheckBox Elemente anzupassen reicht ein UPDATE wie:

update tb_gn_control
set
falsevalue = 'N',
truevalue = 'J',
width = 40
where dialog_id = 6 and upper(classname) = 'CHECKBOX';

 

....Endergebnis
Das Positionieren mehrerer Elemente gleichzeitig - Verschieben per Maus - ist im Dialog Designer möglich.
Map 2013, SP2

Wednesday 9 October 2013

Flatport Migration (TBImport) - "Deleted" Daten werden mit migriert?

Bei einem der TB2 Schemas tritt das merkwürdige Phänomen auf, dass auch die in TB2 gelöschten Datensätze mit migriert werden. In TB2 hat die Fachschale 3 vollzogenen Mutationen und die Flatport-Migration erfolgt mit der Option "legal only" für die Mutationsübernahme.

Bei anderen TB2 Dokumente mit Mutationen, die auf gleiche Art migriert wurden, sind die gelöschten Daten nicht mit übertragen worden.

Warum das Problem nun bei diesem Dokument auftritt ist nicht klar. Leert man vor dem Flatport die Tabelle TB_MUTATIONS erfolgt die Datenübernahme aber wieder so wie erwartet.

Das Problem tritt sowohl mit Map 2012 und Map 2013 auf.

Monday 7 October 2013

Trigger umstellen von TB2 auf Map

Vor kurzem hatte ich schon in einem anderen Beitrag darauf hingewiesen, dass man Formulare besser nicht im Administrator oder in Map ohne Bildaufbau testet. Leider habe ich meine eigene Erkentniss ignoriert und den gleichen Fehler wieder begangen - diesmal im Zusammenhang mit Triggern.

Aus TB2 habe ich einen Trigger übernommen und auf die neuen AW-Tabellen- und Spaltennamen angepasst sowie die Verweise auf "deleted=0" entfernt. Ein kurzer Test mit Map - alles läuft wie erwartet. Dann testet die Kollegin und es geht doch nicht....Unterschied - ich habe ohne Bildaufbau getestet, die Kollegin mit Bildaufbau.

TB2 Trigger:

create or replace
TRIGGER AW_HALTUNG_SPUEL
 BEFORE UPDATE OF SPUEL_INTERVALL ON AW_HALTUNG
FOR EACH ROW...


Ändert sich für eine Haltung das Spülintervall dann wird der nächste reguläre Spültermin neu berechnet. Man kann im Formular aber den nächsten Spültermin auch manuell eintragen.

In Map liess sich nun der nächste Spültermin nicht mehr ändern - bei Angabe eines neuen Datums wurde wieder der vorherige (errechnete) Spültermin eingetragen.

Ursache scheint zu sein, dass beim einem UPDATE in Map alle Spalten aktualisiert werden - nicht nur die Spalte, deren Wert sich im Formular geändert hat. Beim  Setzen des Datums wurde also auch das Spülintervall aktualisiert (mit dem alten Wert) - mit der Folge, dass der Trigger oben ausgelöst, das Spüldatum neu errechnet und wieder auf den vorherigen Wert zurückgesetzt wurde.

Im Trigger ist jetzt ein zusätzlicher Test enthalten der prüft, ob sich der Intervall-Wert tatsächlich geändert hat. Nur dann wird die Berechnung ausgeführt:

-- nur abarbeiten, wenn sich Intervall tatsächlich geändert hat:
   IF (:new.W_WASHING_INTERVAL != :old.W_WASHING_INTERVAL) THEN

   ...

Wenn es nicht mit Map geht....

Aus Map heraus hat der vollständige Interlis Export nicht funktioniert. Führt man den Export aber mit dem Sachdateneditor durch, dann funktioniert der Export auch.

Das ist eventuell nicht nur auf den Interlis Export beschränkt - wer Probleme mit bestimmten Funktionen/Abläufen in Map hat sollte daher mal schauen, ob sich das nicht auch über den Sachdateneditor besser bewerkstelligen lässt.


Sachdateneditor

Friday 4 October 2013

Problem mit TB_SQL bei Job-aktiven Dokumenten

In Map 2013 gibt es Problem bei der Verwendung von TB_SQL in einem Job-aktiven Dokument. Verschiebt man in einem offenen Job z.B. ein Punktfeature kann es zu folgender Meldung kommen:
Meldung in Map - FDO-Befehl konnte nicht ausgeführt werden.
no such function: TB_SQL

Die Meldung wird permanent wiederholt sobald man nur die Maus in der Zeichnung bewegt - das Arbeiten wird so ziemlich abgebremst. Das Objekt selbst wird aber verschoben.

Das Problem tritt nur auf, wenn der Layer keinen Standard-Stil aufweist, wie z.B. hier:


Layer ohne Standard-Stil führt zu Problemen bei TB_SQL und Jobs

Definiert man einen Standard Stil erscheint die Meldung nicht mehr. Problem ist bei Autodesk inzwischen bekannt.

Gerade bei Verwendung von Jobs ist der Einsatz von TB_SQL in der Map - Hilfe beschrieben.

Map 2013, Sp2.1

Layer-Datei Editieren - XML Fehler finden


Beim Editieren der Layer Dateien passieren gelegentlich Tipp-Fehler oder ähnliches. Beim erneuten Laden des Darstellungsmodells erhält man dann eine Meldung wie diese:

Fehlermeldung beim Bildaufbau - XML Struktur einer der Layerdateien stimmt nicht.

Schaut man in der Layer-Datei nach, dann ist in Zeile 249/250 kein Fehler zu finden. 

Kein Fehler in der angegeben Zeile 249/250?

Ohne weitere XML Werkzeuge konnte ich die korrekte Zeilennummer mit Firefox ermitteln. Dazu die Layerdatei mit der Dateiendung "XML" versehen und in den Firefox ziehen (scheinbar gibt es bei meiner FF Version kein "Datei > ÖFFNEN" mehr?). Firefox meldet als Ursache die Zeile 269:

Layerdatei  als XML Datei in Firefox laden
  - dort findet sich dann tatsächlich auch dem Fehler:

Fehler ist tatsächlich in Zeile 269 - "<" fehlt.

Bisher hatte ich bei Map das Gefühl, dass die in der Fehlermeldung gezeigte Zeile auch den Fehler enthält. Aber heute hat das nicht gepasst.

Der IE konnte das früher - glaube ich mich zu erinnern - auch. Jetzt lädt er die XML Datei einfach als Text ohne XML Syntaxprüfung / Syntaxhighlight. Vielleicht auch nur eine Einstellungssache…


Thursday 3 October 2013

TB2 Darstellungsmodell nach Map umstellen – Beispiel 1 – Block


Wer TB2 Darstellungsmodelle auf Map umstellen muss kann vielleicht mit den nachfolgenden Tipps etwas anfangen. 

DM in TB2
-         Leitungskataster, 1:250 und 1:500
-         Blocksymbol - Grösse - 1x1 Einheiten (Meter)
-         Blocksymbol mit Polylinien mit Globaler Breite 0.06
-         TB2 DM Definition ElementSize 4 (1:250), 3 (1:500)




Variante 1 –
In Map für den Layer das Blocksymbol in den Stil-Editor laden und versuchen dort die richtigen Einstellungen für die Grösse zu finden. Falls man per DWG Export eine Zeichnung erstellen will darauf hoffen, dass die Grösse auch richtig exportiert wird.
  
Variante 2 –
In Map für den Layer das Blocksymbol in den Stil-Editor laden und alle weiteren Einstellungen in der Layer Datei selbst vornehmen.
Vorteile – erforderliche Werte sind (weitgehend) nachvollziehbar und herleitbar und lassen sich teilweise direkt aus TB2 übernehmen, Anpassungen an verschiedene Massstabsbereiche sind schnell gemacht in dem nur einige Werte verändert werden müssen. 
 
Ablauf:

1  Stil-Editor öffnen, Grössenkontext auf "Karte" setzen
2  Block aus DWG importieren (wegen Globaler Breite im Block erscheint als Vorschau nur ein  schwarzes Rechteck) – "als Kopie" einfügen!

Symbole mit Globaler Breite erscheinen als schwarze Quadrate in der Vorschau
3  Farbe wie gewünscht auswählen ("Bug" bei Auswahl der Indexfarbe 94)
4  Einstellungen bei Breite/Höhe etc. belassen
5  Anzeigemassstab vorgeben (1-251)
6  Legendenlabel für Massstabereich angeben
7  Filter setzen
8  Massstabsbereich duplizieren und Werte anpassen (250 - 5000)

In Map nur das Grundgerüst der Layer Datei erstellen - Massstabsbereiche, Farben und Symbolimport - den Rest in der Layer Datei einstellen


9  Kontextmenü zum Layer > "Layer Speichern"
10 Layerdatei im Texteditor öffnen
11 Folgende Werte anpassen (beide Massstabsbereiche)

<LineUsage>

<Repeat>1000</Repeat>

</LineUsage>

<AreaUsage>

<RepeatX>1000</RepeatX>

<RepeatY>1000</RepeatY>

</AreaUsage>

Ich bin mir nicht sicher, ob die Werte in allen oder nur bestimmten Fällen gesetzt werden müssen. Müsste man weiter austesten. Warum "1000"? Referenzmassstab 1:1000? Bin mir nicht ganz sicher – auch hier müsste man weiter austesten.

Unterhalb <ParameterOverrides> passt man nun die folgenden Werte an:

LWBYGLOBALWIDTH

Vorgabe bei mir: 60

Neu : 0.06 * 4  (Massstabsbereich 0-251)

Neu : 0.06 * 3  (Massstabsbereich 250-500)

Formel: GlobaleBreite des Elementes im Block * ElementSize aus TB2 DM_Definition


BlockConverterGenerated_ScaleX (bzw. Y)

Vorgabe bei mir: 0.00178571428571429

Neu :  0.004 (Massstabsbereich 0-251)

Neu :  0.003 (Massstabsbereich 250-500)

Formel: Wert ElementSize (in Meter) aus Tb2 übernehmen und Umrechnung in Millimeter.


An den letzten Eintrag </ParameterOverrides> folgende Elemente (falls nicht vorhanden) hinzufügen:
</ParameterOverrides>

<ScaleX>250</ScaleX>

<ScaleY>250</ScaleY>
Bzw. Wert "500" für den Massstabsbereich ab 1:500

Datei speichern und neu einladen.

Darstellung am Bildschirm und im Plot sind nahezu identisch:

 
TBs Darstellung als XREF im Vordergrund, Map Symbol im Hintergrund
Map Symbol im Vordergrund - TB2 Darstellung als XREF im Hintergrund


Map Symbol oben rechts (ohne Drehung), TB2 Symbol unten links als XREF

Ausdruck im Massstab 1:100, Symboldarstellung identisch (links unten TB2 als XREF, oben rechts Map Symbol)


Man kann ähnliches auch für die Linienarten machen - dazu werde ich später mal ein Beitrag erstellen. Für Schraffuren haben wir noch nicht so recht herausgefunden wie man diese in Map wieder "hinbekommt". 
Sowohl für die Blöcke als auch die Linien gilt dann - beim DWG export mit Vorlage stimmt das Exportergebnis mit der Map-Darstellung gut überein. Bei Schraffuren gibt es aber auch noch in Map 2014 Probleme mit der Skalierung des Musters.

Schade, dass es Map (bzw. Autodesk) einem hier so schwer macht - der Stil-Editor ist  oft recht verwirrend hinsichtlich den Werte für Grösse/Breite etc. Zudem kann man nicht alle Einstellungen im Editor vornehmen, die im Layer möglich sind - hier bleibt nur die Bearbeitung der XML Datei. Der grösste Nachteil ist und bleibt aber die nicht vorhandene Dokumentation für diesen recht zentralen Bereich des Programms. Vielleicht will ja der eine oder andere nicht ganz zufriedene Map Nutzer eine Nachricht hinterlassen (unten bei "Products") :-)

Hier noch die zwei Layerdateien - direkt aus Map und Bearbeitet wie beschrieben.

Map 2103, SP2

Featuregeometrie ändern - Doppelklick öffnet AutoCAD Eigenschaftenfenster

Bearbeitet man eine Feature und klickt das Feature nach der Bearbeitung zweimal an öffnet sich das AutoCAD Eigenschaftenfenster und nicht das Formular. Um das Formular zu öffnen verwendet man entweder den "Info" Knopf aus dem Ribbon oder man checkt das Feature über das Kontextmenü zunächst ein und führt dann den Doppelklick aus.


Map 2013, SP2.11

Tuesday 1 October 2013

Plotmodul API in Map

Vor einiger Zeit hatte ich geschaut, ob sich die ca. 400 TB2 Inselpläne in Map automatisiert neu erstellen lassen. In der Migration werden beim Inselplan z.B. Einfügepunkt und Drehung nach Map übernommen, nicht aber der eigentliche Plan und das Layout.

Zunächst muss man in Map ein neues Planlayout erstellen (siehe auch hier). Mit dem Layout kann man nun manuell den jeweiligen Inselplan erstellen. Einfacher geht es über die Map-API. Hier hat es mich aber einige Zeit gekostet. Schwierig war herauszufinden, wie letztlich der Plot über die API erzeugt wird - die API Dokumentation hat mir dort nicht geholfen  und es waren Rückfragen bei Autodesk erforderlich (ein Vorteil der Advanced Subscription - diese beinhaltet auch ADN Support). Die anderen Fragen im Zusammenhang mit dem Plot Modul liessen sich mit Hilfe der Dokumentation beantworten.







Um den Plot zu erzeugen verwende ich folgende Funktion:

private long createNewPlot

(IPlotTemplate template, 
 IPlotGroup plotgroup, 
 string plotname, 
 Autodesk.Map.IM.Graphic.Point plotUrsprung, 
 Scale scale, 
 int drehung, 
 FeatureList ftLPlangebiet, 
 Autodesk.Map.IM.Graphic.Point plotUrsprungUEKarte, 
 Scale UEKarteMassstab)
{
    //neuer Plot
    IPlot newPlot = template.Instantiate(plotname, plotgroup);
    //UEKarte erstellen
    //GetMap(1) - UEKartenplatzhalter hat DrawOrder = 1
    IPlotMap plotMapUEK = newPlot.GetMap(1);
    //neuen Einfügepunkt für Karte setzen
    plotMapUEK.ResetCapture(plotUrsprungUEKarte, 0, UEKarteMassstab);
    //neue Haupt-Karte im Plot

    IPlotMap plotMap = newPlot.MainMap;                                  
    //neuen Einfügepunkt für Karte setzen
    plotMap.ResetCapture(plotUrsprung, drehung, scale);
    //Puffereinstellungen für Inselkarte
    double[] dbBuffer = new double[2] { 50.0, 150.0 };   
    //Inselkarte erstellen
    plotMap.CreateIslandMap(ftLPlangebiet, dbBuffer);
    long lFidNeuerPlot = plotMap.Parent.Feature.FID;
    //FID des neuen Plots zurückgeben
    return lFidNeuerPlot;                 

}
Map 2013, SP2.