From a7d401595583d49df460b6377d8f97dccf8e038a Mon Sep 17 00:00:00 2001
From: ?? ? <ulysseskao@ximple.com.tw>
Date: Wed, 07 May 2008 15:10:35 +0800
Subject: [PATCH] update for EOFM-76

---
 xdgnjobs/ximple-spatialjob/src/test/resources/com/ximple/eofms/filter/test-data/testRules.xml    |   15 +++++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java       |  143 +++++++++++++++++++++++++++++++++++++++++++++++
 xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java         |    2 
 xdgnjobs/ximple-spatialjob/src/main/resources/com/ximple/eofms/filter/ElementDispatcherRules.xml |   15 +++++
 4 files changed, 172 insertions(+), 3 deletions(-)

diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java
index bb5c706..4dd3977 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateSymbolStrategy.java
@@ -1,5 +1,146 @@
 package com.ximple.eofms.filter;
 
-public class CreateSymbolStrategy
+import java.util.List;
+
+import org.geotools.feature.FeatureTypeBuilder;
+import org.geotools.feature.FeatureType;
+import org.geotools.feature.SchemaException;
+import org.geotools.feature.AttributeTypeFactory;
+import org.geotools.feature.Feature;
+import org.geotools.feature.IllegalAttributeException;
+
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.Geometry;
+
+import com.ximple.eofms.jobs.TWD97GeometryConverterDecorator;
+import com.ximple.eofms.util.DefaultColorTable;
+import com.ximple.io.dgn7.FrammeAttributeData;
+import com.ximple.io.dgn7.Element;
+import com.ximple.io.dgn7.UserAttributeData;
+import com.ximple.io.dgn7.TextElement;
+import com.ximple.io.dgn7.TextNodeElement;
+
+public class CreateSymbolStrategy implements CreateFeatureTypeStrategy
 {
+    GeometryFactory geometryFactory = new GeometryFactory();
+    FeatureTypeBuilder typeBuilder = null;
+    TWD97GeometryConverterDecorator convertDecorator = new TWD97GeometryConverterDecorator();
+
+    public CreateSymbolStrategy()
+    {
+    }
+
+    protected FrammeAttributeData getFeatureLinkage(Element element)
+    {
+        if (!element.hasUserAttributeData())
+            return null;
+
+        List<UserAttributeData> usrDatas = element.getUserAttributeData();
+        for (UserAttributeData anUsrData : usrDatas)
+        {
+            if (anUsrData instanceof FrammeAttributeData)
+            {
+                return (FrammeAttributeData) anUsrData;
+            }
+        }
+        return null;
+    }
+
+    public FeatureType createFeatureElement(String featureName) throws SchemaException
+    {
+        if (typeBuilder == null)
+        {
+            typeBuilder = FeatureTypeBuilder.newInstance(featureName);
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("GEOM", Geometry.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("TID", Integer.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("OID", Long.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("CID", Integer.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("LID", Integer.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("LEVEL", Integer.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMCOLOR", String.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMWEIGHT", Integer.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMSTYLE", Integer.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("JUST", Integer.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("HEIGHT", Double.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("WIDTH", Double.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("ANGLE", Double.class));
+            typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMBOL", String.class));
+        }
+        return typeBuilder.getFeatureType();
+    }
+
+    public Feature createFeature(FeatureType featureType, Element element) throws IllegalAttributeException
+    {
+        DefaultColorTable colorTable = (DefaultColorTable) DefaultColorTable.getInstance();
+        FrammeAttributeData fLinkage = getFeatureLinkage(element);
+        if (fLinkage == null) return null;
+        if (element instanceof TextElement)
+        {
+            TextElement txtElement = (TextElement) element;
+            double angle = txtElement.getRotationAngle();
+            angle += 180.0;
+            angle = ((angle > 360.0)? (angle - 360.0) : (angle));
+
+            StringBuilder sb = new StringBuilder();
+            sb.append(txtElement.getFontIndex());
+            sb.append('-');
+            char id = txtElement.getText().toCharArray()[0];
+            sb.append(Integer.toOctalString((int) id));
+
+            convertDecorator.setConverter(txtElement);
+            Feature feature = featureType.create(new Object[]{
+                    convertDecorator.toGeometry(geometryFactory),
+                    (int) fLinkage.getFsc(),
+                    (long) fLinkage.getUfid(),
+                    (int) fLinkage.getComponentID(),
+                    0,
+                    txtElement.getLevelIndex(),
+                    colorTable.getColorCode(txtElement.getColorIndex()),
+                    txtElement.getWeight(),
+                    txtElement.getLineStyle(),
+                    txtElement.getJustification(),
+                    txtElement.getTextHeight(),
+                    txtElement.getTextWidth(),
+                    angle,
+                    sb.toString()
+            });
+            return feature;
+        } else if (element instanceof TextNodeElement)
+        {
+            TextNodeElement nodeElement = (TextNodeElement) element;
+            convertDecorator.setConverter(nodeElement);
+            String[] texts = nodeElement.getTextArray();
+            StringBuffer sb = new StringBuffer();
+            for (String text : texts)
+            {
+                if (sb.length() != 0)
+                sb.append("\n");
+                sb.append(text);
+            }
+
+            double angle = nodeElement.getRotationAngle();
+            angle += 180.0;
+            angle = ((angle > 360.0)? (angle - 360.0) : (angle));
+            Feature feature = featureType.create(new Object[]{
+                    convertDecorator.toGeometry(geometryFactory),
+                    (int) fLinkage.getFsc(),
+                    (long) fLinkage.getUfid(),
+                    (int) fLinkage.getComponentID(),
+                    0,
+                    nodeElement.getLevelIndex(),
+                    colorTable.getColorCode(nodeElement.getColorIndex()),
+                    nodeElement.getWeight(),
+                    nodeElement.getLineStyle(),
+                    nodeElement.getFontIndex(),
+                    nodeElement.getJustification(),
+                    nodeElement.getTextNodeHeight(),
+                    nodeElement.getTextNodeLength(),
+                    angle,
+                    sb.toString()
+            });
+            return feature;
+        }
+        return null;
+    }
 }
+
diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java
index ec303b1..584b95c 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java
+++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/filter/CreateTextStrategy.java
@@ -60,7 +60,6 @@
             typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMCOLOR", String.class));
             typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMWEIGHT", Integer.class));
             typeBuilder.addType(AttributeTypeFactory.newAttributeType("SYMSTYLE", Integer.class));
-            typeBuilder.addType(AttributeTypeFactory.newAttributeType("FONT", Integer.class));
             typeBuilder.addType(AttributeTypeFactory.newAttributeType("JUST", Integer.class));
             typeBuilder.addType(AttributeTypeFactory.newAttributeType("HEIGHT", Double.class));
             typeBuilder.addType(AttributeTypeFactory.newAttributeType("WIDTH", Double.class));
@@ -92,7 +91,6 @@
                     colorTable.getColorCode(txtElement.getColorIndex()),
                     txtElement.getWeight(),
                     txtElement.getLineStyle(),
-                    txtElement.getFontIndex(),
                     txtElement.getJustification(),
                     txtElement.getTextHeight(),
                     txtElement.getTextWidth(),
diff --git a/xdgnjobs/ximple-spatialjob/src/main/resources/com/ximple/eofms/filter/ElementDispatcherRules.xml b/xdgnjobs/ximple-spatialjob/src/main/resources/com/ximple/eofms/filter/ElementDispatcherRules.xml
index a16c6e0..a27ecab 100644
--- a/xdgnjobs/ximple-spatialjob/src/main/resources/com/ximple/eofms/filter/ElementDispatcherRules.xml
+++ b/xdgnjobs/ximple-spatialjob/src/main/resources/com/ximple/eofms/filter/ElementDispatcherRules.xml
@@ -22,6 +22,11 @@
         <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
         <set-properties-rule/>
       </pattern>
+      <pattern value="SymbolCreateStrategy">
+        <object-create-rule classname="com.ximple.eofms.filter.CreateSymbolStrategy"/>
+        <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
+        <set-properties-rule/>
+      </pattern>
       <pattern value="LineTextCreateStrategy">
         <object-create-rule classname="com.ximple.eofms.filter.CreateLineTextStrategy"/>
         <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
@@ -50,6 +55,11 @@
       </pattern>
       <pattern value="TextCreateStrategy">
         <object-create-rule classname="com.ximple.eofms.filter.CreateTextStrategy"/>
+        <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
+        <set-properties-rule/>
+      </pattern>
+      <pattern value="SymbolCreateStrategy">
+        <object-create-rule classname="com.ximple.eofms.filter.CreateSymbolStrategy"/>
         <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
         <set-properties-rule/>
       </pattern>
@@ -91,6 +101,11 @@
         <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
         <set-properties-rule/>
       </pattern>
+      <pattern value="SymbolCreateStrategy">
+        <object-create-rule classname="com.ximple.eofms.filter.CreateSymbolStrategy"/>
+        <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
+        <set-properties-rule/>
+      </pattern>
       <pattern value="LineTextCreateStrategy">
         <object-create-rule classname="com.ximple.eofms.filter.CreateLineTextStrategy"/>
         <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
diff --git a/xdgnjobs/ximple-spatialjob/src/test/resources/com/ximple/eofms/filter/test-data/testRules.xml b/xdgnjobs/ximple-spatialjob/src/test/resources/com/ximple/eofms/filter/test-data/testRules.xml
index a16c6e0..a27ecab 100644
--- a/xdgnjobs/ximple-spatialjob/src/test/resources/com/ximple/eofms/filter/test-data/testRules.xml
+++ b/xdgnjobs/ximple-spatialjob/src/test/resources/com/ximple/eofms/filter/test-data/testRules.xml
@@ -22,6 +22,11 @@
         <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
         <set-properties-rule/>
       </pattern>
+      <pattern value="SymbolCreateStrategy">
+        <object-create-rule classname="com.ximple.eofms.filter.CreateSymbolStrategy"/>
+        <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
+        <set-properties-rule/>
+      </pattern>
       <pattern value="LineTextCreateStrategy">
         <object-create-rule classname="com.ximple.eofms.filter.CreateLineTextStrategy"/>
         <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
@@ -50,6 +55,11 @@
       </pattern>
       <pattern value="TextCreateStrategy">
         <object-create-rule classname="com.ximple.eofms.filter.CreateTextStrategy"/>
+        <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
+        <set-properties-rule/>
+      </pattern>
+      <pattern value="SymbolCreateStrategy">
+        <object-create-rule classname="com.ximple.eofms.filter.CreateSymbolStrategy"/>
         <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
         <set-properties-rule/>
       </pattern>
@@ -91,6 +101,11 @@
         <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
         <set-properties-rule/>
       </pattern>
+      <pattern value="SymbolCreateStrategy">
+        <object-create-rule classname="com.ximple.eofms.filter.CreateSymbolStrategy"/>
+        <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>
+        <set-properties-rule/>
+      </pattern>
       <pattern value="LineTextCreateStrategy">
         <object-create-rule classname="com.ximple.eofms.filter.CreateLineTextStrategy"/>
         <set-next-rule methodname="setCreateStrategy" paramtype="com.ximple.eofms.filter.CreateFeatureTypeStrategy"/>

--
Gitblit v0.0.0-SNAPSHOT