From 1d0f3939310360e73cc2b363b660a2ac6750c4fd Mon Sep 17 00:00:00 2001 From: bancika Date: Sun, 16 Jan 2011 21:11:41 +0000 Subject: [PATCH] added point by point component creation --- .../DIYLC/config.xml | 4 + .../DIYLC/library/main.jar | Bin 519883 -> 520091 bytes .../src/org/diylc/common/ComponentType.java | 20 ++- .../components/AbstractLeadedComponent.java | 17 +- .../src/org/diylc/core/CreationMethod.java | 6 + .../core/annotations/ComponentDescriptor.java | 8 + .../diylc/presenter/ComponentProcessor.java | 12 +- .../src/org/diylc/presenter/FileManager.java | 0 .../src/org/diylc/presenter/Presenter.java | 148 ++++++++++++------ .../org/diylc/presenter/ProjectPainter.java | 107 +++++++------ .../DIYLC/src/org/diylc/utils/Constants.java | 6 +- .../components/boards/AbstractBoard.java | 2 +- .../diylc/components/boards/PerfBoard.java | 2 +- .../diylc/components/boards/VeroBoard.java | 3 +- .../components/connectivity/CopperTrace.java | 3 +- .../diylc/components/connectivity/Jumper.java | 3 +- .../passive/AxialFilmCapacitor.java | 3 +- .../passive/RadialCeramicDiskCapacitor.java | 3 +- .../passive/RadialFilmCapacitor.java | 3 +- .../diylc/components/passive/Resistor.java | 3 +- 20 files changed, 223 insertions(+), 130 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/CreationMethod.java create mode 100644 diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/FileManager.java diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml index 320bcc98..7c41e4a4 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml @@ -1,2 +1,6 @@ + + lastPath + C:\Documents and Settings\Branislav Stojkovic\Desktop + \ No newline at end of file diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar index c39025ef6929403e43aa85a3075a8dd4a331004d..5f49ce99e4944003cc498ecf8d19ec8ac98181d2 100644 GIT binary patch delta 19408 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

j_z=I;FdkWM9vL8YK9W(|mG(l!`5C_<5Lrv45 z3dB1Nf=K)w0FD}L(u@s*Vvy=IxDB#<17d(~-2duQli2tm>^O+psHY(Hl_tOI4+1Ne zh+u$hvTLwXp{LVe2=I>sqB{Vg#(vp_X5e;BE*mHu(t5yg{Dy$U-G=QOvoIrbhN=D) zWQxF}^BWxU4cXu>zJ<9q0>nQD9)m{Tg6aS^2obIWq;TZjh#6TM?Ajd6#@>L)3!n}p zH3`aYsDtNWH7N#BW1-G@&>V!RL1ynjHJ~Bur_8(} nih%LmpYrcZfr4xppafv`1oCHqTCA_3JO(JmAu$3c&#?R#kI$J& delta 19241 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 instanceClass; private double zOrder; private boolean stretchable; private boolean sticky; - @SuppressWarnings("unchecked") - public ComponentType(String name, String description, String category, String namePrefix, - String author, Icon icon, Class instanceClass, - double zOrder, boolean stretchable, boolean sticky) { + public ComponentType(String name, String description, CreationMethod creationMethod, + String category, String namePrefix, String author, Icon icon, + Class instanceClass, double zOrder, boolean stretchable, + boolean sticky) { super(); this.name = name; this.description = description; + this.creationMethod = creationMethod; this.category = category; this.namePrefix = namePrefix; this.author = author; @@ -50,6 +53,10 @@ public class ComponentType { return description; } + public CreationMethod getCreationMethod() { + return creationMethod; + } + public String getCategory() { return category; } @@ -66,7 +73,6 @@ public class ComponentType { return icon; } - @SuppressWarnings("unchecked") public Class getInstanceClass() { return instanceClass; } @@ -78,7 +84,7 @@ public class ComponentType { public boolean isStretchable() { return stretchable; } - + public boolean isSticky() { return sticky; } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java index 19858af2..213e79dc 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java @@ -31,10 +31,10 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp private static final long serialVersionUID = 1L; - public static Color LEAD_COLOR = Color.black; + public static Color LEAD_COLOR = Color.decode("#65909A"); public static Color LABEL_COLOR = Color.black; public static Color LABEL_COLOR_SELECTED = Color.red; - public static Size LEAD_THICKNESS = new Size(0.3d, SizeUnit.mm); + public static Size LEAD_THICKNESS = new Size(0.8d, SizeUnit.mm); public static Size DEFAULT_SIZE = new Size(1d, SizeUnit.in); protected Size width; @@ -91,12 +91,15 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : borderColor); g2d.draw(shape); // Draw leads. - g2d.setStroke(new BasicStroke(getLeadThickness().convertToPixels())); + int leadThickness = getLeadThickness().convertToPixels(); + g2d.setStroke(new BasicStroke(leadThickness)); g2d.setColor(getLeadColor(componentState)); g2d.drawLine((int) (shapeRect.width - distance) / 2, (int) shapeRect.height / 2, - (int) ((shapeRect.width - distance) / 2 + leadLenght), (int) shapeRect.height / 2); + (int) ((shapeRect.width - distance) / 2 + leadLenght) - leadThickness / 2, + (int) shapeRect.height / 2); g2d.drawLine((int) (shapeRect.width + distance) / 2, (int) shapeRect.height / 2, - (int) ((shapeRect.width + distance) / 2 - leadLenght), (int) shapeRect.height / 2); + (int) ((shapeRect.width + distance) / 2 - leadLenght) + leadThickness / 2, + (int) shapeRect.height / 2); // Do not track the label because that area was already covered. drawingObserver.stopTracking(); // Draw label. @@ -204,12 +207,12 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp public void setHeight(Size height) { this.height = height; } - + @EditableProperty public Display getDisplay() { return display; } - + public void setDisplay(Display display) { this.display = display; } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/CreationMethod.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/CreationMethod.java new file mode 100644 index 00000000..e8c44864 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/CreationMethod.java @@ -0,0 +1,6 @@ +package org.diylc.core; + +public enum CreationMethod { + + SINGLE_CLICK, POINT_BY_POINT; +} diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/annotations/ComponentDescriptor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/annotations/ComponentDescriptor.java index d5e9b44b..d03c1af6 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/annotations/ComponentDescriptor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/annotations/ComponentDescriptor.java @@ -3,6 +3,7 @@ package org.diylc.core.annotations; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; /** @@ -24,6 +25,13 @@ public @interface ComponentDescriptor { */ String description(); + /** + * @return method that should be used to create a component. If + * CreationMethod.POINT_BY_POINT is used, user will + * have to select ending points before the component is created. + */ + CreationMethod creationMethod() default CreationMethod.SINGLE_CLICK; + /** * @return component category, e.g. "Passive", "Semiconductors", etc. */ diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentProcessor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentProcessor.java index 76b90772..3dd4d1d6 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentProcessor.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ComponentProcessor.java @@ -17,6 +17,7 @@ import javax.swing.ImageIcon; import org.apache.log4j.Logger; import org.diylc.common.ComponentType; import org.diylc.common.PropertyWrapper; +import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; @@ -54,6 +55,7 @@ public class ComponentProcessor { public ComponentType createComponentTypeFrom(Class> clazz) { String name; String description; + CreationMethod creationMethod; String category; String namePrefix; String author; @@ -65,6 +67,7 @@ public class ComponentProcessor { ComponentDescriptor annotation = clazz.getAnnotation(ComponentDescriptor.class); name = annotation.name(); description = annotation.description(); + creationMethod = annotation.creationMethod(); category = annotation.category(); namePrefix = annotation.instanceNamePrefix(); author = annotation.author(); @@ -74,6 +77,7 @@ public class ComponentProcessor { } else { name = clazz.getSimpleName(); description = ""; + creationMethod = CreationMethod.SINGLE_CLICK; category = "Uncategorized"; namePrefix = "Unknown"; author = "Unknown"; @@ -88,9 +92,7 @@ public class ComponentProcessor { Image image = new BufferedImage(Presenter.ICON_SIZE, Presenter.ICON_SIZE, java.awt.image.BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = (Graphics2D) image.getGraphics(); - g2d - .setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); componentInstance.drawIcon(g2d, Presenter.ICON_SIZE, Presenter.ICON_SIZE); icon = new ImageIcon(image); } catch (InstantiationException e) { @@ -98,8 +100,8 @@ public class ComponentProcessor { } catch (IllegalAccessException e) { e.printStackTrace(); } - ComponentType componentType = new ComponentType(name, description, category, namePrefix, - author, icon, clazz, zOrder, stretchable, sticky); + ComponentType componentType = new ComponentType(name, description, creationMethod, + category, namePrefix, author, icon, clazz, zOrder, stretchable, sticky); return componentType; } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/FileManager.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/FileManager.java new file mode 100644 index 00000000..e69de29b diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java index daf4acd6..ff897b2b 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -38,6 +39,7 @@ import org.diylc.common.IComponentFiler; import org.diylc.common.IPlugIn; import org.diylc.common.IPlugInPort; import org.diylc.common.PropertyWrapper; +import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; import org.diylc.core.Project; import org.diylc.core.measures.SizeUnit; @@ -103,7 +105,10 @@ public class Presenter implements IPlugInPort { private Point previousDragPoint = null; private Project preDragProject = null; + // Component creation private ComponentType componentSlot; + private Point controlPointSlot; + private Point potentialControlPoint; private boolean snapToGrid = true; @@ -307,8 +312,9 @@ public class Presenter implements IPlugInPort { drawControlPoints.add(component); } } - projectPainter.draw(g2d, currentProject, drawOptions, filter, selectionRect, - selectedComponents, drawControlPoints, dragInProgress, zoomLevel); + projectPainter.drawProject(g2d, currentProject, drawOptions, filter, selectionRect, + selectedComponents, drawControlPoints, Arrays.asList(controlPointSlot, + potentialControlPoint), dragInProgress, zoomLevel); } @Override @@ -347,13 +353,34 @@ public class Presenter implements IPlugInPort { .format("mouseClicked(%s, %s, %s, %s)", point, ctrlDown, shiftDown, altDown)); Point scaledPoint = scalePoint(point); if (componentSlot != null) { - try { - instantiateComponent(componentSlot, scaledPoint); - } catch (Exception e) { - LOG.error("Error instatiating component of type: " - + componentSlot.getInstanceClass().getName(), e); + switch (componentSlot.getCreationMethod()) { + case SINGLE_CLICK: + try { + instantiateComponent(componentSlot, scaledPoint); + } catch (Exception e) { + LOG.error("Error instatiating component of type: " + + componentSlot.getInstanceClass().getName(), e); + } + setNewComponentSlot(null); + break; + case POINT_BY_POINT: + if (controlPointSlot != null) { + try { + instantiateComponent(componentSlot, controlPointSlot, scaledPoint); + } catch (Exception e) { + LOG.error("Error instatiating component of type: " + + componentSlot.getInstanceClass().getName(), e); + } + setNewComponentSlot(null); + } else { + controlPointSlot = scaledPoint; + snapPointToGrid(controlPointSlot); + messageDispatcher.dispatchMessage(EventType.REPAINT); + } + break; + default: + LOG.error("Unknown creation method: " + componentSlot.getCreationMethod()); } - setNewComponentSlot(null); } else { List> components = findComponentsAt(scaledPoint); // If there's nothing under mouse cursor deselect all. @@ -388,38 +415,46 @@ public class Presenter implements IPlugInPort { public void mouseMoved(Point point, boolean ctrlDown, boolean shiftDown, boolean altDown) { Map, Set> components = new HashMap, Set>(); Point scaledPoint = scalePoint(point); - // Go backwards so we take the highest z-order components first. - for (int i = currentProject.getComponents().size() - 1; i >= 0; i--) { - IDIYComponent component = currentProject.getComponents().get(i); - ComponentType componentType = componentTypeMap.get(component.getClass().getName()); - for (int pointIndex = 0; pointIndex < component.getControlPointCount(); pointIndex++) { - Point controlPoint = component.getControlPoint(pointIndex); - // Only consider selected components that are not grouped. - if (selectedComponents.contains(component) && componentType.isStretchable() - && findAllGroupedComponents(component).size() == 1) { - try { - if (scaledPoint.distance(controlPoint) < ProjectPainter.CONTROL_POINT_SIZE) { - Set indices = new HashSet(); - if (componentType.isStretchable()) { - indices.add(pointIndex); - } else { - for (int j = 0; j < component.getControlPointCount(); j++) { - indices.add(j); + if (componentSlot != null + && componentSlot.getCreationMethod() == CreationMethod.POINT_BY_POINT) { + potentialControlPoint = scaledPoint; + snapPointToGrid(potentialControlPoint); + messageDispatcher.dispatchMessage(EventType.REPAINT); + } else { + // Go backwards so we take the highest z-order components first. + for (int i = currentProject.getComponents().size() - 1; i >= 0; i--) { + IDIYComponent component = currentProject.getComponents().get(i); + ComponentType componentType = componentTypeMap.get(component.getClass().getName()); + for (int pointIndex = 0; pointIndex < component.getControlPointCount(); pointIndex++) { + Point controlPoint = component.getControlPoint(pointIndex); + // Only consider selected components that are not grouped. + if (selectedComponents.contains(component) && componentType.isStretchable() + && findAllGroupedComponents(component).size() == 1) { + try { + if (scaledPoint.distance(controlPoint) < ProjectPainter.CONTROL_POINT_SIZE) { + Set indices = new HashSet(); + if (componentType.isStretchable()) { + indices.add(pointIndex); + } else { + for (int j = 0; j < component.getControlPointCount(); j++) { + indices.add(j); + } } + components.put(component, indices); + break; } - components.put(component, indices); - break; + } catch (Exception e) { + LOG.warn("Error reading control point for component of type: " + + component.getClass().getName()); } - } catch (Exception e) { - LOG.warn("Error reading control point for component of type: " - + component.getClass().getName()); } } + // // If CTRL is pressed, we only care about the top most + // component. + // if (altDown && components.size() > 0) { + // break; + // } } - // // If CTRL is pressed, we only care about the top most component. - // if (altDown && components.size() > 0) { - // break; - // } } messageDispatcher.dispatchMessage(EventType.MOUSE_MOVED, scaledPoint); @@ -637,6 +672,16 @@ public class Presenter implements IPlugInPort { return (Math.round(1f * x / grid) * grid); } + private void snapPointToGrid(Point point) { + int x = point.x; + int y = point.y; + if (snapToGrid) { + x = roundToGrid(x); + y = roundToGrid(y); + } + point.setLocation(x, y); + } + @Override public void dragEnded(Point point) { LOG.debug(String.format("dragEnded(%s)", point)); @@ -719,7 +764,6 @@ public class Presenter implements IPlugInPort { messageDispatcher.dispatchMessage(EventType.REPAINT); } - @SuppressWarnings("unchecked") @Override public void setSelectionDefaultPropertyValue(String propertyName, Object value) { LOG.info(String.format("setSelectionDefaultPropertyValue(%s, %s)", propertyName, value)); @@ -887,8 +931,8 @@ public class Presenter implements IPlugInPort { } } - @SuppressWarnings("unchecked") - private void instantiateComponent(ComponentType componentType, Point point) throws Exception { + private void instantiateComponent(ComponentType componentType, Point... points) + throws Exception { LOG.info("Instatiating component of type: " + componentType.getInstanceClass().getName()); Project oldProject = cloner.deepClone(currentProject); @@ -919,17 +963,23 @@ public class Presenter implements IPlugInPort { selectedComponents.add(component); // Translate them to the desired location. - if (point != null) { - for (int j = 0; j < component.getControlPointCount(); j++) { - Point controlPoint = new Point(component.getControlPoint(j)); - int x = controlPoint.x + point.x; - int y = controlPoint.y + point.y; - if (snapToGrid) { - x = roundToGrid(x); - y = roundToGrid(y); + if (points != null) { + switch (componentType.getCreationMethod()) { + case SINGLE_CLICK: + for (int j = 0; j < component.getControlPointCount(); j++) { + Point controlPoint = new Point(component.getControlPoint(j)); + controlPoint.translate(points[0].x, points[0].y); + snapPointToGrid(controlPoint); + component.setControlPoint(controlPoint, j); } - controlPoint.setLocation(x, y); - component.setControlPoint(controlPoint, j); + break; + case POINT_BY_POINT: + for (int j = 0; j < points.length; j++) { + Point point = points[j]; + snapPointToGrid(point); + component.setControlPoint(point, j); + } + break; } } @@ -1064,6 +1114,8 @@ public class Presenter implements IPlugInPort { LOG.info(String.format("setNewComponentSlot(%s)", componentType == null ? null : componentType.getName())); this.componentSlot = componentType; + this.controlPointSlot = null; + this.potentialControlPoint = null; selectedComponents.clear(); fireSelectionChanged(); // messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, @@ -1098,6 +1150,6 @@ public class Presenter implements IPlugInPort { if (findAllGroupedComponents(component).size() > 1) { return false; } - return selectedComponents.contains(component); + return true; } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectPainter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectPainter.java index 172826bb..06625a02 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectPainter.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectPainter.java @@ -16,7 +16,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.log4j.Logger; import org.diylc.common.ComponentSelection; import org.diylc.common.DrawOption; import org.diylc.common.IComponentFiler; @@ -33,9 +32,7 @@ import org.diylc.utils.Constants; */ public class ProjectPainter { - private static final Logger LOG = Logger.getLogger(ProjectPainter.class); - - public static final int CONTROL_POINT_SIZE = 5; + public static final int CONTROL_POINT_SIZE = 7; public static boolean ENABLE_ANTIALIASING = true; public static boolean DEBUG_COMPONENT_AREAS = false; @@ -51,9 +48,10 @@ public class ProjectPainter { lastDrawnStateMap = new HashMap, ComponentState>(); } - public void draw(Graphics2D g2d, Project project, Set drawOptions, + public void drawProject(Graphics2D g2d, Project project, Set drawOptions, IComponentFiler filter, Rectangle selectionRect, ComponentSelection selectedComponents, - Set> drawControlPoints, boolean dragInProgress, double zoomLevel) { + Set> drawControlPoints, List controlPointSlot, + boolean dragInProgress, double zoomLevel) { if (project == null) { return; } @@ -93,57 +91,64 @@ public class ProjectPainter { // g2dWrapper.resetTx(); - List> components = project.getComponents(); // componentAreaMap.clear(); - if (components != null) { - for (IDIYComponent component : components) { - // Do not draw the component if it's filtered out. - if (filter != null && !filter.testComponent(component)) { - continue; - } - ComponentState state = ComponentState.NORMAL; - if (drawOptions.contains(DrawOption.SELECTION) - && selectedComponents.contains(component)) { - if (dragInProgress) { - state = ComponentState.DRAGGING; - } else { - state = ComponentState.SELECTED; - } - } - // Do not track the area if component is not invalidated and was - // drawn in the same state. - boolean trackArea = lastDrawnStateMap.get(component) != state; - g2dWrapper.startedDrawingComponent(); - if (!trackArea) { - g2dWrapper.stopTracking(); - } - // Draw the component through the g2dWrapper. - component.draw(g2dWrapper, state, project, g2dWrapper); - Area area = g2dWrapper.finishedDrawingComponent(); - if (trackArea) { - componentAreaMap.put(component, area); - lastDrawnStateMap.put(component, state); + for (IDIYComponent component : project.getComponents()) { + // Do not draw the component if it's filtered out. + if (filter != null && !filter.testComponent(component)) { + continue; + } + ComponentState state = ComponentState.NORMAL; + if (drawOptions.contains(DrawOption.SELECTION) + && selectedComponents.contains(component)) { + if (dragInProgress) { + state = ComponentState.DRAGGING; + } else { + state = ComponentState.SELECTED; } } - // Draw control points. - for (IDIYComponent component : components) { - if (drawOptions.contains(DrawOption.CONTROL_POINTS)) { + // Do not track the area if component is not invalidated and was + // drawn in the same state. + boolean trackArea = lastDrawnStateMap.get(component) != state; + g2dWrapper.startedDrawingComponent(); + if (!trackArea) { + g2dWrapper.stopTracking(); + } + // Draw the component through the g2dWrapper. + component.draw(g2dWrapper, state, project, g2dWrapper); + Area area = g2dWrapper.finishedDrawingComponent(); + if (trackArea) { + componentAreaMap.put(component, area); + lastDrawnStateMap.put(component, state); + } + } + + // Draw control points of the component in the slot. + if (controlPointSlot != null) { + for (Point point : controlPointSlot) { + if (point != null) { + g2dWrapper.setColor(Constants.SELECTED_CONTROL_POINT_COLOR); + g2dWrapper.fillOval(point.x - CONTROL_POINT_SIZE / 2, point.y + - CONTROL_POINT_SIZE / 2, CONTROL_POINT_SIZE, CONTROL_POINT_SIZE); + } + } + } + + g2dWrapper.setColor(Constants.CONTROL_POINT_COLOR); + // Draw control points. + for (IDIYComponent component : project.getComponents()) { + if (drawOptions.contains(DrawOption.CONTROL_POINTS)) { + if (drawControlPoints.contains(component)) { + boolean isSelected = selectedComponents.contains(component); + g2dWrapper.setColor(isSelected ? Constants.SELECTED_CONTROL_POINT_COLOR + : Constants.CONTROL_POINT_COLOR); for (int i = 0; i < component.getControlPointCount(); i++) { Point controlPoint = component.getControlPoint(i); - try { - if (drawControlPoints.contains(component)) { - g2dWrapper.setColor(Constants.CONTROL_POINT_COLOR); - g2dWrapper.setStroke(new BasicStroke(2)); - // g2d.drawOval(controlPoint.x - 2, - // controlPoint.y - 2, 4, 4); - g2dWrapper.fillOval(controlPoint.x - CONTROL_POINT_SIZE / 2, - controlPoint.y - CONTROL_POINT_SIZE / 2, - CONTROL_POINT_SIZE, CONTROL_POINT_SIZE); - } - } catch (Exception e) { - LOG.error("Could not obtain control points for component of type " - + component.getClass().getName()); + int pointSize = CONTROL_POINT_SIZE; + if (!isSelected) { + pointSize -= 2; } + g2dWrapper.fillOval(controlPoint.x - pointSize / 2, controlPoint.y + - pointSize / 2, pointSize, pointSize); } } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java index 5ddd7743..99abeed7 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java @@ -7,14 +7,16 @@ import java.awt.Stroke; public class Constants { - public static final int PIXELS_PER_INCH = 100;//Toolkit.getDefaultToolkit().getScreenResolution(); + public static final int PIXELS_PER_INCH = 120;//Toolkit.getDefaultToolkit().getScreenResolution(); public static int GRIDS_PER_INCH = 8; // public static Size GRID_SIZE = new Size(1d / GRIDS_PER_INCH, SizeUnit.in); // public static final int GRID = 20; public static Color CANVAS_COLOR = Color.white; public static Color GRID_COLOR = new Color(240, 240, 240); - public static Color CONTROL_POINT_COLOR = Color.blue; + public static Color CONTROL_POINT_COLOR = Color.black; + public static Color SELECTED_CONTROL_POINT_COLOR = Color.blue; + public static Color CREATION_POINT_COLOR = Color.decode("#32CD32"); public static Font LABEL_FONT = new Font("Tahoma", Font.BOLD, 11); diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java index bf72a54d..3c0f1faa 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java @@ -19,7 +19,7 @@ public abstract class AbstractBoard extends AbstractTransparentComponent private static final long serialVersionUID = 1L; - public static Color BOARD_COLOR = Color.decode("#BCED91"); + public static Color BOARD_COLOR = Color.decode("#F8EBB3"); public static Color BORDER_COLOR = BOARD_COLOR.darker(); public static Size DEFAULT_WIDTH = new Size(1.5d, SizeUnit.in); public static Size DEFAULT_HEIGHT = new Size(1d, SizeUnit.in); diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/PerfBoard.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/PerfBoard.java index 89c12e0b..4be884d1 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/PerfBoard.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/PerfBoard.java @@ -20,7 +20,7 @@ public class PerfBoard extends AbstractBoard { private static final long serialVersionUID = 1L; - public static Color PAD_COLOR = Color.decode("#B87333"); + public static Color PAD_COLOR = Color.decode("#F3926C"); public static Size SPACING = new Size(0.1d, SizeUnit.in); public static Size PAD_SIZE = new Size(0.08d, SizeUnit.in); diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/VeroBoard.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/VeroBoard.java index 7d9c615c..363cd6d0 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/VeroBoard.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/VeroBoard.java @@ -21,8 +21,7 @@ public class VeroBoard extends AbstractBoard { private static final long serialVersionUID = 1L; - public static Color BOARD_COLOR = Color.decode("#BCED91"); - public static Color PAD_COLOR = Color.decode("#B87333"); + public static Color PAD_COLOR = Color.decode("#F3926C"); public static Color BORDER_COLOR = BOARD_COLOR.darker(); public static Size SPACING = new Size(0.1d, SizeUnit.in); diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/CopperTrace.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/CopperTrace.java index d3902e93..acc7c371 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/CopperTrace.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/CopperTrace.java @@ -7,13 +7,14 @@ import java.awt.Shape; import org.diylc.components.AbstractLeadedComponent; import org.diylc.core.ComponentState; +import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; -@ComponentDescriptor(name = "Copper Trace", author = "Branislav Stojkovic", category = "Connectivity", instanceNamePrefix = "Trace", description = "", zOrder = IDIYComponent.ABOVE_BOARD, sticky = true) +@ComponentDescriptor(name = "Copper Trace", author = "Branislav Stojkovic", category = "Connectivity", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "Trace", description = "", zOrder = IDIYComponent.ABOVE_BOARD, sticky = true) public class CopperTrace extends AbstractLeadedComponent { private static final long serialVersionUID = 1L; diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/Jumper.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/Jumper.java index 77a6842a..d792478f 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/Jumper.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/Jumper.java @@ -7,12 +7,13 @@ import java.awt.Shape; import org.diylc.components.AbstractLeadedComponent; import org.diylc.core.ComponentState; +import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; import org.diylc.core.measures.Size; -@ComponentDescriptor(name = "Jumper", author = "Branislav Stojkovic", category = "Connectivity", instanceNamePrefix = "J", description = "", zOrder = IDIYComponent.ABOVE_BOARD, sticky = true) +@ComponentDescriptor(name = "Jumper", author = "Branislav Stojkovic", category = "Connectivity", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "J", description = "", zOrder = IDIYComponent.ABOVE_BOARD, sticky = true) public class Jumper extends AbstractLeadedComponent { private static final long serialVersionUID = 1L; diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/AxialFilmCapacitor.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/AxialFilmCapacitor.java index 6c03fc6f..2484ae04 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/AxialFilmCapacitor.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/AxialFilmCapacitor.java @@ -6,6 +6,7 @@ import java.awt.Shape; import java.awt.geom.Rectangle2D; import org.diylc.components.AbstractLeadedComponent; +import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; @@ -14,7 +15,7 @@ import org.diylc.core.measures.CapacitanceUnit; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; -@ComponentDescriptor(name = "Axial Film Capacitor", author = "Branislav Stojkovic", category = "Passive", instanceNamePrefix = "C", description = "test", zOrder = IDIYComponent.COMPONENT, sticky = true) +@ComponentDescriptor(name = "Axial Film Capacitor", author = "Branislav Stojkovic", category = "Passive", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "C", description = "test", zOrder = IDIYComponent.COMPONENT, sticky = true) public class AxialFilmCapacitor extends AbstractLeadedComponent { private static final long serialVersionUID = 1L; diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/RadialCeramicDiskCapacitor.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/RadialCeramicDiskCapacitor.java index 2342c00d..6d07405c 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/RadialCeramicDiskCapacitor.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/RadialCeramicDiskCapacitor.java @@ -6,6 +6,7 @@ import java.awt.Shape; import java.awt.geom.Ellipse2D; import org.diylc.components.AbstractLeadedComponent; +import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; @@ -14,7 +15,7 @@ import org.diylc.core.measures.CapacitanceUnit; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; -@ComponentDescriptor(name = "Ceramic Capacitor", author = "Branislav Stojkovic", category = "Passive", instanceNamePrefix = "C", description = "test", zOrder = IDIYComponent.COMPONENT, sticky = true) +@ComponentDescriptor(name = "Ceramic Capacitor", author = "Branislav Stojkovic", category = "Passive", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "C", description = "test", zOrder = IDIYComponent.COMPONENT, sticky = true) public class RadialCeramicDiskCapacitor extends AbstractLeadedComponent { private static final long serialVersionUID = 1L; diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/RadialFilmCapacitor.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/RadialFilmCapacitor.java index 58d0cb24..373bb68d 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/RadialFilmCapacitor.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/RadialFilmCapacitor.java @@ -6,6 +6,7 @@ import java.awt.Shape; import java.awt.geom.RoundRectangle2D; import org.diylc.components.AbstractLeadedComponent; +import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; @@ -14,7 +15,7 @@ import org.diylc.core.measures.CapacitanceUnit; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; -@ComponentDescriptor(name = "Radial Film Capacitor", author = "Branislav Stojkovic", category = "Passive", instanceNamePrefix = "C", description = "test", zOrder = IDIYComponent.COMPONENT, sticky = true) +@ComponentDescriptor(name = "Radial Film Capacitor", author = "Branislav Stojkovic", category = "Passive", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "C", description = "test", zOrder = IDIYComponent.COMPONENT, sticky = true) public class RadialFilmCapacitor extends AbstractLeadedComponent { private static final long serialVersionUID = 1L; diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/Resistor.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/Resistor.java index 0b966805..340db6f2 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/Resistor.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/Resistor.java @@ -6,6 +6,7 @@ import java.awt.Shape; import java.awt.geom.Rectangle2D; import org.diylc.components.AbstractLeadedComponent; +import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; @@ -14,7 +15,7 @@ import org.diylc.core.measures.ResistanceUnit; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; -@ComponentDescriptor(name = "Resistor", author = "Branislav Stojkovic", category = "Passive", instanceNamePrefix = "R", description = "test", zOrder = IDIYComponent.COMPONENT, sticky = true) +@ComponentDescriptor(name = "Resistor", author = "Branislav Stojkovic", category = "Passive", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "R", description = "test", zOrder = IDIYComponent.COMPONENT, sticky = true) public class Resistor extends AbstractLeadedComponent { private static final long serialVersionUID = 1L;