67 |
67 |
import com.iver.utiles.XMLEntity;
|
68 |
68 |
|
69 |
69 |
/**
|
|
70 |
* PictureLineSymbol allows to use any symbol defined as an image (by an image file)
|
|
71 |
* supported by gvSIG.This symbol will be used as an initial object.The line will be
|
|
72 |
* painted as a succession of puntual symbols through the path defined by it(the line).
|
|
73 |
*
|
70 |
74 |
* @author jaume dominguez faus - jaume.dominguez@iver.es
|
71 |
75 |
*/
|
72 |
76 |
public class PictureLineSymbol extends AbstractLineSymbol {
|
... | ... | |
79 |
83 |
private boolean selected;
|
80 |
84 |
private double xScale = 1;
|
81 |
85 |
private double yScale = 1;
|
82 |
|
|
|
86 |
/**
|
|
87 |
* Constructor method
|
|
88 |
*
|
|
89 |
*/
|
83 |
90 |
public PictureLineSymbol() {
|
84 |
91 |
super();
|
85 |
92 |
}
|
|
93 |
/**
|
|
94 |
* Constructor method
|
|
95 |
* @param imageURL, URL of the normal image
|
|
96 |
* @param selImageURL, URL of the image when it is selected in the map
|
|
97 |
* @throws IOException
|
|
98 |
*/
|
86 |
99 |
|
87 |
100 |
public PictureLineSymbol(URL imageURL, URL selImageURL) throws IOException {
|
88 |
101 |
this(new File(imageURL.getFile()), selImageURL !=null ? new File(selImageURL.getFile()) : null);
|
89 |
102 |
}
|
90 |
|
|
|
103 |
/**
|
|
104 |
* Constructor method
|
|
105 |
* @param imageFile, File of the normal image
|
|
106 |
* @param selImageFile, File of the image when it is selected in the map
|
|
107 |
* @throws IOException
|
|
108 |
*/
|
91 |
109 |
public PictureLineSymbol(File imageFile, File selImageFile) throws IOException {
|
92 |
110 |
setImage(imageFile);
|
93 |
111 |
if (selImageFile!=null)
|
94 |
112 |
setSelImage(selImageFile);
|
95 |
113 |
}
|
96 |
|
|
|
114 |
/**
|
|
115 |
* Sets the file for the image to be used as a picture line symbol
|
|
116 |
* @param imageFile, File
|
|
117 |
* @throws IOException
|
|
118 |
*/
|
97 |
119 |
public void setImage(File imageFile) throws IOException{
|
98 |
120 |
img = ImageIO.read(imageFile);
|
99 |
121 |
imagePath = imageFile.getAbsolutePath();
|
100 |
122 |
// imageOutline = null;
|
101 |
123 |
}
|
102 |
|
|
|
124 |
/**
|
|
125 |
* Sets the file for the image to be used as a picture line symbol (when it is selected in the map)
|
|
126 |
* @param imageFile, File
|
|
127 |
* @throws IOException
|
|
128 |
*/
|
103 |
129 |
public void setSelImage(File imageFile) throws IOException{
|
104 |
130 |
if (imageFile!=null && imageFile.exists()) {
|
105 |
131 |
selImg = ImageIO.read(imageFile);
|
... | ... | |
131 |
157 |
return selectionSym;
|
132 |
158 |
|
133 |
159 |
}
|
134 |
|
|
|
160 |
/**
|
|
161 |
* Returns the image that will substitute the picture line symbol when it is selected
|
|
162 |
* in the map
|
|
163 |
* @return img, BufferedImage
|
|
164 |
* @throws IOException
|
|
165 |
*/
|
135 |
166 |
private BufferedImage getImg() throws IOException {
|
136 |
167 |
if (img == null) {
|
137 |
168 |
img = ImageIO.read(new File(imagePath));
|
138 |
169 |
}
|
139 |
170 |
return img;
|
140 |
171 |
}
|
141 |
|
|
|
172 |
/**
|
|
173 |
* Returns the image that will substitute the picture line symbol when it is selected
|
|
174 |
* in the map
|
|
175 |
* @return selImg, BufferedImage
|
|
176 |
* @throws IOException
|
|
177 |
*/
|
142 |
178 |
private BufferedImage getSelImg() throws IOException {
|
143 |
179 |
if (selImg == null) {
|
144 |
180 |
if (selImagePath!= null) {
|
... | ... | |
156 |
192 |
if (xScale<=0 && yScale<=0)
|
157 |
193 |
return;
|
158 |
194 |
AffineTransform scaleInstance = AffineTransform.getScaleInstance(xScale, yScale);
|
159 |
|
|
|
195 |
|
160 |
196 |
final double imageWidth = img.getWidth() * xScale;
|
161 |
197 |
final double imageHeight = img.getHeight() * yScale;
|
162 |
|
|
|
198 |
|
163 |
199 |
if (imageWidth==0 || imageHeight==0) return;
|
164 |
200 |
double halfImageHeight = imageHeight*.5;
|
165 |
|
|
|
201 |
|
166 |
202 |
PathLength pl = new PathLength(shp);
|
167 |
203 |
PathIterator iterator = ((FPolyline2D) shp).getPathIterator(null, 0.8);
|
168 |
204 |
double[] theData = new double[6];
|
... | ... | |
173 |
209 |
}
|
174 |
210 |
}
|
175 |
211 |
float currentPathLength = 1;
|
176 |
|
|
|
212 |
|
177 |
213 |
while (!iterator.isDone()) {
|
178 |
214 |
|
179 |
215 |
int theType = iterator.currentSegment(theData);
|
... | ... | |
201 |
237 |
double a = endPoint.getX() - startPoint.getX();
|
202 |
238 |
double b = endPoint.getY() - startPoint.getY();
|
203 |
239 |
double theta = pl.angleAtLength(currentPathLength);
|
204 |
|
|
|
240 |
|
205 |
241 |
double x = startPoint.getX();
|
206 |
242 |
double y = startPoint.getY();
|
207 |
243 |
|
208 |
244 |
// Theorem of Pythagoras
|
209 |
245 |
float segmentLength = (float) Math.sqrt(a*a + b*b);
|
210 |
|
|
|
246 |
|
211 |
247 |
// compute how many times the image has to be drawn
|
212 |
248 |
// to completely cover this segment's length
|
213 |
249 |
int count = (int) Math.ceil(segmentLength/imageWidth);
|
214 |
|
|
|
250 |
|
215 |
251 |
for (int i = 0; i < count; i++) {
|
216 |
252 |
g.translate(x, y);
|
217 |
253 |
g.rotate(theta);
|
218 |
|
|
|
254 |
|
219 |
255 |
double xOffsetTranslation = imageWidth*i;
|
220 |
256 |
|
221 |
257 |
g.translate(xOffsetTranslation, -halfImageHeight);
|
222 |
258 |
g.drawImage(img, scaleInstance, null);
|
223 |
259 |
g.translate(-xOffsetTranslation, halfImageHeight);
|
224 |
|
|
|
260 |
|
225 |
261 |
g.rotate(-theta);
|
226 |
262 |
g.translate(-x, -y);
|
227 |
263 |
}
|
228 |
|
|
|
264 |
|
229 |
265 |
startPoint = endPoint;
|
230 |
|
currentPathLength += segmentLength;
|
|
266 |
currentPathLength += segmentLength;
|
231 |
267 |
iterator.next();
|
232 |
268 |
}
|
233 |
269 |
|
... | ... | |
277 |
313 |
setUnit(xml.getIntProperty("unit"));
|
278 |
314 |
|
279 |
315 |
}
|
280 |
|
|
|
316 |
/**
|
|
317 |
* Sets the yscale for the picture line symbol
|
|
318 |
* @param yScale
|
|
319 |
*/
|
281 |
320 |
public void setYScale(double yScale) {
|
282 |
321 |
this.yScale = yScale;
|
283 |
322 |
|
284 |
323 |
}
|
285 |
|
|
|
324 |
/**
|
|
325 |
* Sets the xscale for the picture line symbol
|
|
326 |
* @param xScale
|
|
327 |
*/
|
286 |
328 |
public void setXScale(double xScale) {
|
287 |
329 |
this.xScale = xScale;
|
288 |
330 |
}
|
... | ... | |
297 |
339 |
throw new Error("Not yet implemented!");
|
298 |
340 |
|
299 |
341 |
}
|
300 |
|
|
|
342 |
/**
|
|
343 |
* Return the path of the image that is used as a picture line symbol (when it
|
|
344 |
* is selected in the map)
|
|
345 |
* @return selimagePath,String
|
|
346 |
*/
|
301 |
347 |
public String getSelImagePath() {
|
302 |
348 |
return selImagePath;
|
303 |
349 |
}
|
304 |
|
|
|
350 |
/**
|
|
351 |
* Return the path of the image that is used as a picture line symbol
|
|
352 |
* @return imagePath,String
|
|
353 |
*/
|
305 |
354 |
public String getImagePath() {
|
306 |
355 |
return imagePath;
|
307 |
356 |
}
|
308 |
|
|
|
357 |
/**
|
|
358 |
* Returns the xscale for the picture line symbol
|
|
359 |
* @param xScale
|
|
360 |
*/
|
309 |
361 |
public double getXScale() {
|
310 |
362 |
return xScale;
|
311 |
363 |
}
|
312 |
|
|
|
364 |
/**
|
|
365 |
* Returns the yscale for the picture line symbol
|
|
366 |
* @param yScale
|
|
367 |
*/
|
313 |
368 |
public double getYScale() {
|
314 |
369 |
return yScale;
|
315 |
370 |
}
|
316 |
|
|
|
371 |
|
317 |
372 |
}
|