package com.ximple.eofms.filter; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.geotools.feature.AttributeTypeFactory; import org.geotools.feature.Feature; import org.geotools.feature.FeatureType; import org.geotools.feature.FeatureTypeBuilder; import org.geotools.feature.IllegalAttributeException; import org.geotools.feature.SchemaException; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.ximple.eofms.jobs.TWD97GeometryConverterDecorator; import com.ximple.eofms.util.DefaultColorTable; import com.ximple.io.dgn7.Element; import com.ximple.io.dgn7.FrammeAttributeData; import com.ximple.io.dgn7.TextElement; import com.ximple.io.dgn7.TextNodeElement; import com.ximple.io.dgn7.UserAttributeData; public class CreateTextStrategy implements CreateFeatureTypeStrategy { static final Log logger = LogFactory.getLog(CreateTextStrategy.class); GeometryFactory geometryFactory = new GeometryFactory(); FeatureTypeBuilder typeBuilder = null; TWD97GeometryConverterDecorator convertDecorator = new TWD97GeometryConverterDecorator(); public CreateTextStrategy() { } protected FrammeAttributeData getFeatureLinkage(Element element) { if (!element.hasUserAttributeData()) return null; List 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("CONTEXT", 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(); /* if (angle != 0.0) { angle -= 270.0; angle = -angle; angle = ((angle < 0.0) ? (angle + 360.0) : angle); angle = ((angle > 360.0) ? (angle - 360.0) : (angle)); } */ 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, txtElement.getText() }); return feature; } else if (element instanceof TextNodeElement) { TextNodeElement nodeElement = (TextNodeElement) element; 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(); /* if (angle != 0.0) { angle -= 270.0; angle = -angle; angle = ((angle < 0.0) ? (angle + 360.0) : angle); angle = ((angle > 360.0) ? (angle - 360.0) : (angle)); } */ convertDecorator.setConverter(nodeElement); 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.getJustification(), nodeElement.getTextNodeHeight(), nodeElement.getTextNodeLength(), angle, sb.toString() }); return feature; } return null; } }