Thread: [Bprocessor-commit] gl/src/net/sourceforge/bprocessor/gl/tool ExtrusionTool.java, 1.50, 1.51
Status: Pre-Alpha
Brought to you by:
henryml
|
From: rimestad <rim...@us...> - 2007-03-12 16:01:36
|
Update of /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/tool In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv18225/src/net/sourceforge/bprocessor/gl/tool Modified Files: ExtrusionTool.java Log Message: made minor changes to extrudetool, and made extrude of edges extrude against a plane Index: ExtrusionTool.java =================================================================== RCS file: /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/tool/ExtrusionTool.java,v retrieving revision 1.50 retrieving revision 1.51 diff -C2 -d -r1.50 -r1.51 *** ExtrusionTool.java 1 Mar 2007 14:53:56 -0000 1.50 --- ExtrusionTool.java 12 Mar 2007 16:01:32 -0000 1.51 *************** *** 9,16 **** import java.awt.Cursor; import java.awt.event.MouseEvent; import java.util.Collection; import java.util.HashSet; - import java.util.Iterator; import java.util.LinkedList; import java.util.Set; --- 9,17 ---- import java.awt.Cursor; import java.awt.event.MouseEvent; + import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; + import java.util.List; import java.util.Set; *************** *** 20,26 **** --- 21,33 ---- import net.sourceforge.bprocessor.gl.view.Transformation; import net.sourceforge.bprocessor.gl.view.View; + import net.sourceforge.bprocessor.gui.GUI; + import net.sourceforge.bprocessor.model.Constructor; import net.sourceforge.bprocessor.model.Edge; + import net.sourceforge.bprocessor.model.Geometric; + import net.sourceforge.bprocessor.model.Geometry; + import net.sourceforge.bprocessor.model.Line; import net.sourceforge.bprocessor.model.Plane; import net.sourceforge.bprocessor.model.Project; + import net.sourceforge.bprocessor.model.Selection; import net.sourceforge.bprocessor.model.Space; import net.sourceforge.bprocessor.model.Surface; *************** *** 37,40 **** --- 44,50 ---- private Surface extrudesurface; + /** Edges to extrude */ + private List<Edge> extrudeEdges; + /** start x */ private int startx; *************** *** 59,63 **** /** Extrusion */ ! private Collection extrusion; private Plane ontoPlane; --- 69,73 ---- /** Extrusion */ ! private Collection<Surface> extrusion; private Plane ontoPlane; *************** *** 77,84 **** * @param extrusion Collection of surfaces */ ! public void insert(Space space, Collection extrusion) { ! Iterator surfaces = extrusion.iterator(); ! while (surfaces.hasNext()) { ! Surface surface = (Surface) surfaces.next(); space.insert(surface); } --- 87,92 ---- * @param extrusion Collection of surfaces */ ! private void insert(Space space, Collection<Surface> extrusion) { ! for (Surface surface : extrusion) { space.insert(surface); } *************** *** 92,96 **** * @param finish Finish extrusion */ ! public void extrude(double distance, boolean all, boolean finish) { Space space = Project.getInstance().getActiveSpace(); if (extrusion != null) { --- 100,104 ---- * @param finish Finish extrusion */ ! private void extrude(double distance, boolean all, boolean finish) { Space space = Project.getInstance().getActiveSpace(); if (extrusion != null) { *************** *** 99,105 **** extrusion = null; } ! extrusion = new LinkedList(); ! Collection sides = new LinkedList(); ! Set tops = new HashSet(); if (all) { extrudesurface.extrusionall(distance, sides, tops); --- 107,113 ---- extrusion = null; } ! extrusion = new LinkedList<Surface>(); ! Collection<Surface> sides = new LinkedList<Surface>(); ! Set<Surface> tops = new HashSet<Surface>(); if (all) { extrudesurface.extrusionall(distance, sides, tops); *************** *** 125,129 **** * @param finish Finish extrusion */ ! public void extrudeOnto(Plane p, boolean all, boolean finish) { Space space = Project.getInstance().getActiveSpace(); if (extrusion != null) { --- 133,137 ---- * @param finish Finish extrusion */ ! private void extrudeOnto(Plane p, boolean all, boolean finish) { Space space = Project.getInstance().getActiveSpace(); if (extrusion != null) { *************** *** 132,138 **** extrusion = null; } ! extrusion = new LinkedList(); ! Collection sides = new LinkedList(); ! Set tops = new HashSet(); if (p == null) { log.info("Found null plane"); --- 140,146 ---- extrusion = null; } ! extrusion = new LinkedList<Surface>(); ! Collection<Surface> sides = new LinkedList<Surface>(); ! Set<Surface> tops = new HashSet<Surface>(); if (p == null) { log.info("Found null plane"); *************** *** 157,234 **** /** * Moved * @param e MouseEvent */ protected void moved(MouseEvent e) { ! if (extrudesurface == null) { ! //the extrusion isn't started yet ! findTarget(e); ! if (target instanceof Surface) { ! glv.getView().makeTarget(target); ! } else if (target == null) { ! glv.getView().makeTarget(null); ! } ! active = true; ! } else { ! // a extrudesurface have been chosen ! to = glv.getView().toPlaneCoords(e.getX(), e.getY(), dragplane); ! Vertex normal = extrudesurface.normal(); ! //a bit cleanup ! ontoPlane = null; ! // the list of all extruded geometric objects ! Set elements = new HashSet(); ! if (extrusion != null) { ! elements.addAll(extrusion); ! elements.addAll(Surface.edges(extrusion)); ! elements.add(extrudesurface); ! } ! //ignore self when extruding ! Set ignore = new HashSet(2); ! ignore.add(extrudesurface); ! if (extrudesurface.getExterior() != null) { ! ignore.add(extrudesurface.getExterior()); ! } ! findTarget(e, ignore); ! { ! if (target instanceof Surface && extrusion != null && !extrusion.contains(target)) { ! Surface surface = (Surface) target; ! if (!elements.contains(surface)) { ! Vertex n = surface.normal(); ! Vertex cross = normal.cross(n); ! if (cross.isZero()) { ! // the surfaces are coplanar ! Vertex v = surface.getFirstVertex(); ! if (!extrudesurface.plane().contains(v)) { ! to = v; ! } ! calcDistCallExtrude(to, from, normal); ! } else { ! ontoPlane = surface.plane(); ! if (Math.abs(ontoPlane.normal().dot(normal)) <= 0.1) { ! // the two normals have a greater angle between 0 and 84 or 94 and 180 degrees calcDistCallExtrude(to, from, normal); } else { ! extrudeOnto(ontoPlane, all, false); } } ! } ! } else if (target instanceof Edge) { ! Edge edge = (Edge) target; ! if (!elements.contains(edge)) { ! to = edge.center(); ! Vertex v = edge.center(); ! if (!extrudesurface.plane().contains(v)) { ! to = v; } } - calcDistCallExtrude(to, from, normal); } else { ! calcDistCallExtrude(to, from, normal); } } } updateLength(); } ! /** * @param to --- 165,324 ---- /** + * @param plane the plane to extrude onto (give null if none) + * @param finish true if the extrusion should be permanent otherwise false + */ + private void extrudeEdgesOnto(Plane plane, boolean finish) { + Space space = Project.getInstance().getActiveSpace(); + if (extrusion != null) { + space.removeProtected(extrusion); + space.computeNextId(); + extrusion = null; + } + extrusion = new LinkedList<Surface>(); + Vertex dir = to.minus(from); + if (plane != null && Math.abs(plane.normal().dot(dir)) <= 0.1) { + // if the planes are parallel + plane = null; + } + extrusion = Edge.extrude(extrudeEdges, dir, plane); + if (finish) { + insert(space, extrusion); + } else { + space.addProtected(extrusion); + } + } + + /** * Moved * @param e MouseEvent */ protected void moved(MouseEvent e) { ! if (Selection.primary().isEmpty()) { ! // extrude surface ! if (extrudesurface == null) { ! //the extrusion isn't started yet ! findTarget(e); ! if (target instanceof Surface) { ! glv.getView().makeTarget(target); ! } else if (target == null) { ! glv.getView().makeTarget(null); ! } ! active = true; ! ! } else { ! // a extrudesurface have been chosen ! to = glv.getView().toPlaneCoords(e.getX(), e.getY(), dragplane); ! Vertex normal = extrudesurface.normal(); ! //a bit cleanup ! ontoPlane = null; ! // the list of all extruded geometric objects ! Set<Geometric> elements = new HashSet<Geometric>(); ! if (extrusion != null) { ! elements.addAll(extrusion); ! elements.addAll(Surface.edges(extrusion)); ! elements.add(extrudesurface); ! } ! //ignore the extruded surface and holes when extruding ! Set<Surface> ignore = new HashSet<Surface>(2); ! ignore.add(extrudesurface); ! if (extrudesurface.getExterior() != null) { ! ignore.add(extrudesurface.getExterior()); ! } ! findTarget(e, ignore); ! { ! if (target instanceof Surface && extrusion != null && !extrusion.contains(target)) { ! Surface surface = (Surface) target; ! if (!elements.contains(surface)) { ! Vertex n = surface.normal(); ! Vertex cross = normal.cross(n); ! if (cross.isZero()) { ! // the surfaces are coplanar ! Vertex v = surface.getFirstVertex(); ! if (!extrudesurface.plane().contains(v)) { ! to = v; ! } calcDistCallExtrude(to, from, normal); } else { ! ontoPlane = surface.plane(); ! if (Math.abs(ontoPlane.normal().dot(normal)) <= 0.1) { ! // the two normals have a greater angle between 0 and 84 or 94 and 180 degrees ! calcDistCallExtrude(to, from, normal); ! } else { ! extrudeOnto(ontoPlane, all, false); ! } } } ! } else if (target instanceof Edge) { ! Edge edge = (Edge) target; ! if (!elements.contains(edge)) { ! to = edge.center(); ! Vertex v = edge.center(); ! if (!extrudesurface.plane().contains(v)) { ! to = v; ! } } + calcDistCallExtrude(to, from, normal); + } else { + calcDistCallExtrude(to, from, normal); + } + } + } + } else { + //The extrusion should be found in the selection (EDGE EXTRUSION) + if (extrudeEdges != null) { + // the extrusion should begin + to = glv.getView().toPlaneCoords(e.getX(), e.getY(), dragplane); + + //list of moving elements + Set<Geometric> elements = new HashSet<Geometric>(extrudeEdges); + if (extrusion != null) { + elements.addAll(extrusion); + elements.addAll(Surface.edges(extrusion)); + } + + // ignore the extruded surface and holes when extruding + List<Geometric> ignore = new LinkedList<Geometric>(extrudeEdges); + if (extrusion != null) { + ignore.addAll(extrusion); + ignore.addAll(Surface.edges(extrusion)); + ignore.addAll(Geometry.collect(extrusion)); + } + excluded(ignore); + current = findIntersection(e); + if (e.isShiftDown()) { + to = current.vertex(); + } + findTarget(e, ignore); + updateConstructors(); + log.info("Target is " + target); + if (target != null && !elements.contains(target)) { + if (target instanceof Surface) { + ontoPlane = ((Surface) target).plane(); + makeTarget(current); + } else if (target instanceof Plane && target != plane) { + ontoPlane = (Plane)target; + makeTarget(current); + } else if (target instanceof Line || + target instanceof Constructor || + target instanceof Edge) { + to = current.vertex(); + makeTarget(current); + ontoPlane = null; + } else { + ontoPlane = null; } } else { ! ontoPlane = null; } + distance = to.minus(from).length(); + extrudeEdgesOnto(ontoPlane, false); + } else { + current = findIntersection(e); + makeTarget(current); } } updateLength(); } ! /** * @param to *************** *** 247,281 **** */ protected void pressed(MouseEvent e) { ! if (extrudesurface == null) { ! findTarget(e); ! if (target instanceof Surface) { ! extrudesurface = (Surface) target; ! startx = e.getX(); ! starty = e.getY(); ! View view = glv.getView(); ! Transformation trans = view.transformation(); ! double x = startx; ! double y = View.getHeight() - starty; ! Vertex near = new Vertex(x, y, 0.0); ! Vertex far = new Vertex(x, y, 1.0); ! Edge ray = new Edge(near, far); ! ray = trans.unProject(ray); ! Plane plane = extrudesurface.plane(); ! dragplane = plane.orthogonalPlane(ray); ! from = view.toPlaneCoords(startx, starty, dragplane); ! all = !e.isAltDown(); ! } ! } else { ! if (extrusion != null) { ! if (ontoPlane != null) { ! extrudeOnto(ontoPlane, all, true); } else { ! extrude(distance, all, true); } extrusion = null; Project.getInstance().checkpoint(); } - cleanUp(); - moved(e); } } --- 337,419 ---- */ protected void pressed(MouseEvent e) { ! if (!Selection.primary().isEmpty()) { ! // some of the selction should be extruded ! if (extrudeEdges == null) { ! // The extrusion havn't started yet ! extrudeEdges = new ArrayList<Edge>(); ! for (Object o : Selection.primary()) { ! if (o instanceof Edge) { ! extrudeEdges.add((Edge) o); ! } else { ! GUI.getInstance().alert("Selection isn't extrudable, due to other elements than edges"); ! extrudeEdges.clear(); ! } ! } ! if (extrudeEdges.size() != Selection.primary().size()) { ! extrudeEdges = null; } else { ! startx = e.getX(); ! starty = e.getY(); ! View view = glv.getView(); ! Transformation trans = view.transformation(); ! double x = startx; ! double y = View.getHeight() - starty; ! Vertex near = new Vertex(x, y, 0.0); ! Vertex far = new Vertex(x, y, 1.0); ! Edge ray = new Edge(near, far); ! ray = trans.unProject(ray); ! Plane plane = new Plane(0, 0, 1, extrudeEdges.get(0).getFrom()); ! dragplane = plane.orthogonalPlane(ray); ! from = view.toPlaneCoords(startx, starty, dragplane); ! active = true; ! start = findIntersection(e); ! } ! } else { ! // finish the extrusion ! if (extrusion != null) { ! if (ontoPlane != null) { ! extrudeEdgesOnto(ontoPlane, true); ! } else { ! extrudeEdgesOnto(null, true); ! } } extrusion = null; Project.getInstance().checkpoint(); + cleanUp(); + } + } else { + // look at the mouse target + if (extrudesurface == null) { + findTarget(e); + if (target instanceof Surface) { + extrudesurface = (Surface) target; + startx = e.getX(); + starty = e.getY(); + View view = glv.getView(); + Transformation trans = view.transformation(); + double x = startx; + double y = View.getHeight() - starty; + Vertex near = new Vertex(x, y, 0.0); + Vertex far = new Vertex(x, y, 1.0); + Edge ray = new Edge(near, far); + ray = trans.unProject(ray); + Plane plane = extrudesurface.plane(); + dragplane = plane.orthogonalPlane(ray); + from = view.toPlaneCoords(startx, starty, dragplane); + all = !e.isAltDown(); + } + } else { + if (extrusion != null) { + if (ontoPlane != null) { + extrudeOnto(ontoPlane, all, true); + } else { + extrude(distance, all, true); + } + extrusion = null; + Project.getInstance().checkpoint(); + } + cleanUp(); + moved(e); } } } *************** *** 287,294 **** public void apply(double length) { if (extrusion != null) { ! if (distance < 0) { ! length = -length; } - extrude(length, all, true); extrusion = null; Project.getInstance().checkpoint(); --- 425,444 ---- public void apply(double length) { if (extrusion != null) { ! if (extrudesurface != null) { ! if (distance < 0) { ! length = -length; ! } ! extrude(length, all, true); ! } else if (extrudeEdges != null) { ! if (to != null) { ! Vertex dir = to.minus(from); ! dir.normalize(); ! dir.scale(length); ! to = from.add(dir); ! } else { ! to = from.add(new Vertex(0, 0, length)); ! } ! extrudeEdgesOnto(null, true); } extrusion = null; Project.getInstance().checkpoint(); *************** *** 301,307 **** */ public void updateLength() { ! if (extrudesurface == null) { ! glv.setLengthValue(""); ! } else { double value = distance; if (value < 0) { --- 451,455 ---- */ public void updateLength() { ! if (extrudesurface != null) { double value = distance; if (value < 0) { *************** *** 309,321 **** } this.setLength(value); } } /** ! * */ public void cleanUp() { all = false; dragplane = null; from = null; to = null; --- 457,474 ---- } this.setLength(value); + } else if (extrudeEdges != null) { + this.setLength(distance); + } else { + glv.setLengthValue(""); } } /** ! * {@inheritDoc} */ public void cleanUp() { all = false; dragplane = null; + ontoPlane = null; from = null; to = null; *************** *** 327,330 **** --- 480,485 ---- } extrudesurface = null; + extrudeEdges = null; + makeTarget(null); super.cleanUp(); } |