[Bprocessor-commit] model/src/net/sourceforge/bprocessor/model Command.java, 1.73, 1.74
Status: Pre-Alpha
Brought to you by:
henryml
From: Michael L. <he...@us...> - 2008-03-27 15:59:59
|
Update of /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv26727/src/net/sourceforge/bprocessor/model Modified Files: Command.java Log Message: Danhaus Index: Command.java =================================================================== RCS file: /cvsroot/bprocessor/model/src/net/sourceforge/bprocessor/model/Command.java,v retrieving revision 1.73 retrieving revision 1.74 diff -C2 -d -r1.73 -r1.74 *** Command.java 27 Feb 2008 13:49:05 -0000 1.73 --- Command.java 27 Mar 2008 14:49:22 -0000 1.74 *************** *** 2110,2113 **** --- 2110,2419 ---- * */ + public static class InsertFrame extends Command { + + /** */ + public static final String WALL = "-1.-205.-01"; + /** */ + public static final String PLATE = "-1.-205.-01.-03"; + + /** + * Constructs a frame + * @param surface Surface + */ + public InsertFrame(Surface surface) { + parameters.put("surface", surface); + parameters.put("post distance", 400.0); + } + + private static int round(double value) { + int n = (int) Math.floor(value); + double rest = value - n; + if (rest < 0.0000001) { + n--; + } + return n; + } + + private void stipple(List<Edge> edges, + List<Vertex> vertices) { + Iterator<Vertex> iter = vertices.iterator(); + for (int k = 0; k < (vertices.size() / 2); k++) { + Vertex f = iter.next(); + Vertex t = iter.next(); + edges.add(new Edge(f, t)); + } + } + + private static boolean isVertical(Edge edge, CoordinateSystem system) { + Vertex from = system.translate(edge.from); + Vertex to = system.translate(edge.to); + double dx = Math.abs(from.x - to.x); + return dx < 0.0001; + } + + /** + * Render frame + * @param element Element + */ + public static void render(Container element) { + Container net = null; + for (Space current : element.getElements()) { + if (current.isNet()) { + net = (Container) current; + } + } + element.clear(); + if (net != null) { + element.add(net); + Container fema1 = new Container("Femacell", Container.CONSTRUCTION, true); + { + Classification classification = Project.getInstance().getClassification(PLATE, 0); + fema1.setClassification(classification); + } + Container fema2 = new Container("Femacell", Container.CONSTRUCTION, true); + Container bitumen = new Container("Bitumen", Container.CONSTRUCTION, true); + Container foot1 = new Container("Bundrem", Container.CONSTRUCTION, true); + Container foot2 = new Container("Fodrem", Container.CONSTRUCTION, true); + Container top1 = new Container("Toprem", Container.CONSTRUCTION, true); + Container top2 = new Container("Toprem", Container.CONSTRUCTION, true); + Container post1 = new Container("Stolpe", Container.CONSTRUCTION, true); + Container post2 = new Container("Stolpe", Container.CONSTRUCTION, true); + element.add(fema1); + element.add(fema2); + element.add(bitumen); + element.add(foot1); + element.add(foot2); + element.add(top1); + element.add(top2); + element.add(post1); + element.add(post2); + + + ParameterBlock parameters = net.getParameters(); + Surface surface = (Surface) parameters.get("surface"); + Vertex n = surface.normal(); + CoordinateSystem system = CoordinateSystem.systemFor(surface.getFirstVertex(), n); + + + { + Map map = new HashMap(); + Container inside = new Container("Inside", Container.CONSTRUCTION, true); + Container outside = new Container("Outside", Container.FUNCTIONAL, false); + Surface base = (Surface) surface.copy(map); + Collection<Surface> sides = new LinkedList(); + Surface top = base.extrusion(0.01, sides); + Collection<Surface> all = new LinkedList(); + all.add(base); + all.addAll(sides); + all.add(top); + fema1.add(inside); + fema1.add(outside); + for (Surface current : all) { + current.setFrontDomain(inside); + current.setBackDomain(outside); + } + Shape.addSurfacesTo(fema1, all); + } + { + Map map = new HashMap(); + Container inside = new Container("Inside", Container.CONSTRUCTION, true); + Container outside = new Container("Outside", Container.FUNCTIONAL, false); + Surface base = (Surface) surface.copy(map); + Vertex normal = base.normal(); + for (Vertex current : base.getVertices()) { + current.set(current.add(normal.scale(0.01))); + } + + Collection<Surface> sides = new LinkedList(); + Surface top = base.extrusion(0.01, sides); + Collection<Surface> all = new LinkedList(); + all.add(base); + all.addAll(sides); + all.add(top); + fema2.add(inside); + fema2.add(outside); + for (Surface current : all) { + current.setFrontDomain(inside); + current.setBackDomain(outside); + } + Shape.addSurfacesTo(fema2, all); + } + { + Map map = new HashMap(); + Container inside = new Container("Inside", Container.CONSTRUCTION, true); + Container outside = new Container("Outside", Container.FUNCTIONAL, false); + Surface base = (Surface) surface.copy(map); + Vertex normal = base.normal(); + double delta = 0.01 + 0.01 + 0.145; + for (Vertex current : base.getVertices()) { + current.set(current.add(normal.scale(delta))); + } + Collection<Surface> sides = new LinkedList(); + Surface top = base.extrusion(0.012, sides); + Collection<Surface> all = new LinkedList(); + all.add(base); + all.addAll(sides); + all.add(top); + bitumen.add(inside); + bitumen.add(outside); + for (Surface current : all) { + current.setFrontDomain(inside); + current.setBackDomain(outside); + } + Shape.addSurfacesTo(bitumen, all); + } + + { + for (Edge current : net.getEdges()) { + if (isVertical(current, system)) { + Vertex v = current.getDirection(); + double length = v.length(); + v.normalize(); + Vertex u = v.cross(n); + Vertex from = current.getFrom(); + from = from.add(v.scale(0.032 + 0.045)); + Vertex a = from.add(n.scale(0.02)); + Vertex b = a.add(n.scale(0.145)); + Vertex c = b.add(u.scale(0.045)); + Vertex d = a.add(u.scale(0.045)); + Edge e1 = new Edge(a, b); + Edge e2 = new Edge(b, c); + Edge e3 = new Edge(c, d); + Edge e4 = new Edge(d, a); + Container inside = new Container("Inside", Container.CONSTRUCTION, true); + Container outside = new Container("Outside", Container.FUNCTIONAL, false); + Surface base = new Surface(Shape.list(e1, e2, e3, e4)); + Collection<Surface> sides = new LinkedList(); + Surface top = base.extrusion(length - (0.032 + 0.045 + 0.045 + 0.045), sides); + Collection<Surface> all = new LinkedList(); + all.add(base); + all.addAll(sides); + all.add(top); + Container post = new Container("Post", Container.CONSTRUCTION, true); + post.add(inside); + post.add(outside); + for (Surface s : all) { + s.setFrontDomain(inside); + s.setBackDomain(outside); + } + Shape.addSurfacesTo(post, all); + element.add(post); + } + } + } + } + } + + /** {@inheritDoc} */ + @Override + public void evaluate() { + Surface surface = (Surface) parameters.get("surface"); + Space front = surface.getFrontDomain(); + Space back = surface.getBackDomain(); + Container element = null; + Classification c1 = front.getClassification(); + Classification c2 = back.getClassification(); + String id1 = c1.getFullId(front); + String id2 = c2.getFullId(back); + if (id1.equals(WALL)) { + element = (Container) front; + } else if (id2.equals(WALL)) { + element = (Container) back; + } else { + element = (Container) front; + } + System.out.println("element = " + element); + double postDistance = parameters.getDouble("post distance"); + + double dx = postDistance / 1000.0; + + { + Container net = Container.createNet("Frame Net"); + net.setParameters(parameters); + HashMap map = new HashMap(); + + List<Edge> contour = new LinkedList(); + for (Edge current : surface.getEdges()) { + contour.add((Edge) current.copy(map)); + } + + + Vertex vertex = surface.getFirstVertex(); + Vertex normal = surface.normal(); + CoordinateSystem system = CoordinateSystem.systemFor(vertex, normal); + + List<Vertex> vertices = new LinkedList(Edge.vertices(contour)); + system.translateIt(vertices); + + HashMap<Edge, List<Vertex>> cuts = new HashMap(); + for (Edge current : contour) { + cuts.put(current, new LinkedList()); + } + + List<Edge> all = new LinkedList(); + + BoundingBox box = new BoundingBox(vertices); + double xmin = box.xmin().getX(); + double xmax = box.xmax().getX(); + double ymin = box.ymin().getY(); + double ymax = box.ymax().getY(); + + double width = xmax - xmin; + double height = ymax - ymin; + int n; + int m; + + + if (dx > 0) { + n = round(width / dx); + } else { + n = 0; + } + + List<Edge> verticals = new LinkedList(); + + for (int i = 0; i < n; i++) { + double x = xmin + (i + 1) * dx; + Vertex from = new Vertex(x, ymin, 0); + Vertex to = new Vertex(x, ymax, 0); + Edge edge = new Edge(from, to); + List<Vertex> intersections = new LinkedList(); + for (Edge current : contour) { + double x0 = current.from.x; + double x1 = current.to.x; + if (x0 > x1) { + double tmp = x1; + x1 = x0; + x0 = tmp; + } + if (x0 <= x && x < x1) { + Vertex intersect = current.intersection(edge); + if (intersect != null) { + intersections.add(intersect); + } + } + } + + if (intersections.size() > 0) { + Vertex.sortByY(intersections); + stipple(verticals, intersections); + } + } + all.addAll(verticals); + all.addAll(contour); + system.unTranslateIt(Edge.vertices(all)); + + Shape.addEdgesTo(net, all); + + element.add(net); + render(element); + } + } + } + + + /** + * + */ public static class InsertGrid extends Command { /** |