[Bprocessor-commit] /model/src/net/sourceforge/bprocessor/model/modellor ModelBathModellor2.java,
Status: Pre-Alpha
Brought to you by:
henryml
|
From: rimestad <rim...@us...> - 2007-05-20 10:27:10
|
Update of /cvsroot/bprocessor//model/src/net/sourceforge/bprocessor/model/modellor In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv15614/src/net/sourceforge/bprocessor/model/modellor Modified Files: ModelBathModellor2.java Log Message: reached stage one for the bathmodellor Index: ModelBathModellor2.java =================================================================== RCS file: /cvsroot/bprocessor//model/src/net/sourceforge/bprocessor/model/modellor/ModelBathModellor2.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** ModelBathModellor2.java 15 May 2007 16:28:09 -0000 1.1 --- ModelBathModellor2.java 20 May 2007 10:27:07 -0000 1.2 *************** *** 13,16 **** --- 13,17 ---- import java.util.List; import java.util.Map; + import java.util.Set; import net.sourceforge.bprocessor.model.Attribute; *************** *** 18,22 **** import net.sourceforge.bprocessor.model.Edge; import net.sourceforge.bprocessor.model.Geometry; - import net.sourceforge.bprocessor.model.Geometric; import net.sourceforge.bprocessor.model.Net; import net.sourceforge.bprocessor.model.Project; --- 19,22 ---- *************** *** 38,44 **** private Space space; ! private Surface bottom; ! private Surface top; private double shaftOffset; --- 38,48 ---- private Space space; ! private Space floor; ! private Space walls; ! ! private Space ceiling; ! ! private Space bath; private double shaftOffset; *************** *** 56,64 **** private double ceilingThickness = 0.055; - private HashSet<Surface> vertical; - private CoordinateSystem coord; private Net net; /** * the constructor --- 60,73 ---- private double ceilingThickness = 0.055; private CoordinateSystem coord; private Net net; + + private double doorHeight = 2.2; + + private double windowOffset = 1.2; + + private double doorWindow = 0.5; + /** * the constructor *************** *** 121,125 **** /** {@inheritDoc} */ public void update(Object entity) { ! if (entity.equals(net) || entity.equals(this) || entity.equals(space)) { cleanUp(); space.add(net); --- 130,134 ---- /** {@inheritDoc} */ public void update(Object entity) { ! if (entity.equals(net) || entity.equals(this) || entity.equals(space) && isActive()) { cleanUp(); space.add(net); *************** *** 133,138 **** --- 142,270 ---- */ private void generateBath() { + floor = new Space("Floor", Space.CONSTRUCTION, Space.SPACE_LEVEL, true); + space.add(floor); + bath = new Space("Bath cabin", Space.FUNCTIONAL, Space.SPACE_LEVEL, true); + space.add(bath); + walls = new Space("Walls", Space.CONSTRUCTION, Space.SPACE_LEVEL, true); + space.add(walls); + ceiling = new Space("Ceiling", Space.CONSTRUCTION, Space.SPACE_LEVEL, true); + space.add(ceiling); makeFloor(); makeWalls(); + Geometry.simplifyGeometry(space.getSurfaces()); + makeCeiling(); + makeDoorAndWindows(); + } + + private void makeDoorAndWindows() { + for (Edge e : net.getEdges()) { + Object o = e.getParameters().environment().get("Type"); + Selector s = (Selector)o; + if (s != null) { + if (s.getCurrentValue().equals("Door")) { + // make a door + Space doorSpc = new Space("Door", Space.CONSTRUCTION, Space.SPACE_LEVEL, true); + space.add(doorSpc); + doorSpc.setTransparent(true); + List<Edge> door = new ArrayList<Edge>(4); + Edge bottom = e.copy(); + Edge top = e.copy(); + Edge side1 = new Edge(bottom.getFrom(), top.getFrom()); + Edge side2 = new Edge(top.getTo(), bottom.getTo()); + door.add(bottom); + door.add(side1); + door.add(top); + door.add(side2); + CoordinateSystem cs = coord.copy(); + cs.move(0, 0, floorThickness); + bottom.move(new Vertex(0, 0, floorThickness)); + top.move(new Vertex(0, 0, floorThickness + doorHeight)); + Surface sur = new Surface(door); + Vertex center = net.getSurfaces().iterator().next().center(); + Vertex in = center.minus(e.getFrom()); + in.normalize(); + Vertex dir = e.getDirection(); + dir.normalize(); + Vertex up = in.cross(dir); + up.normalize(); + in = dir.cross(up); + sur = space.insert(sur); + Geometry.holeAnalysis(sur); + Collection<Surface> sides = new LinkedList<Surface>(); + Surface t; + if (sur.normal().equalEps(in)) { + sur.setFrontDomain(doorSpc); + t = sur.extrusion(wallThickness, sides); + } else { + sur.setBackDomain(doorSpc); + t = sur.extrusion(-wallThickness, sides); + } + sides.add(t); + for (Surface surface : sides) { + space.insert(surface); + } + Geometry.holeAnalysis(t); + } else if (s.getCurrentValue().equals("Window")) { + //make a window + Space winSpc = new Space("Window", Space.CONSTRUCTION, Space.SPACE_LEVEL, true); + space.add(winSpc); + winSpc.setTransparent(true); + List<Edge> win = new ArrayList<Edge>(4); + Edge bottom = e.copy(); + Edge top = e.copy(); + Edge side1 = new Edge(bottom.getFrom(), top.getFrom()); + Edge side2 = new Edge(top.getTo(), bottom.getTo()); + win.add(bottom); + win.add(side1); + win.add(top); + win.add(side2); + bottom.move(new Vertex(0, 0, floorThickness + windowOffset)); + top.move(new Vertex(0, 0, floorThickness + windowOffset + doorWindow)); + Surface sur = new Surface(win); + Vertex center = net.getSurfaces().iterator().next().center(); + Vertex in = center.minus(e.getFrom()); + Vertex up = in.cross(e.getDirection()); + in = e.getDirection().cross(up); + sur = space.insert(sur); + Geometry.holeAnalysis(sur); + Collection<Surface> sides = new LinkedList<Surface>(); + Surface t; + if (sur.normal().equalEps(in)) { + sur.setFrontDomain(winSpc); + t = sur.extrusion(wallThickness, sides); + } else { + sur.setBackDomain(winSpc); + t = sur.extrusion(-wallThickness, sides); + } + sides.add(t); + for (Surface surface : sides) { + space.insert(surface); + } + Geometry.holeAnalysis(t); + } + } + } + } + + private void makeCeiling() { + //extrude the one space in ceiling + Surface top = null; + for (Surface s : ceiling.getEnvelope()) { + if (s.getExterior() == null) { + top = s; + } + } + if (top != null) { + Collection<Surface> sides = new ArrayList<Surface>(5); + if (top.getFrontDomain() == ceiling) { + sides.add(top.extrusion(ceilingThickness, sides)); + } else { + sides.add(top.extrusion(-ceilingThickness, sides)); + } + space.addAll(sides); + } else { + log.warn("Could not find the right surface for ceiling among " + + ceiling.getEnvelope().toString()); + } } *************** *** 141,145 **** */ private void makeWalls() { ! Collection<Geometric> border = Geometry.copy(net.getEdges()); } --- 273,375 ---- */ private void makeWalls() { ! // create the wall outline ! Surface s = net.getSurfaces().iterator().next(); ! List<Edge> offset = Edge.offset(s.getEdges(), s, -wallThickness); ! CoordinateSystem cs = coord.copy(); ! cs.move(0, 0, floorThickness); ! Geometry.unTranslateGeometry(offset, cs); ! Surface bathcabin = new Surface(offset); ! bathcabin = space.insert(bathcabin); ! bathcabin.setFrontDomain(floor); ! bathcabin.setBackDomain(bath); ! ! Vertex center = s.center(); ! Collection<Edge> remain = new ArrayList<Edge>(net.getEdges()); ! remain.removeAll(s.getEdges()); ! Collection<Surface> extra = new LinkedList<Surface>(); ! for (Edge e : remain) { ! //Copy net edge ! Edge copy = e.copy(); ! //Find sliding dir ! Set<Edge> connected = e.getFrom().getEdges(); ! if (connected.size() == 1) { ! connected = e.getTo().getEdges(); ! } ! connected.remove(e); ! Edge closest = connected.iterator().next(); ! double minangle = Double.MAX_VALUE; ! for (Edge eConnected : connected) { ! double angle = Geometry.angle(e, eConnected); ! if (angle < minangle) { ! closest = eConnected; ! minangle = angle; ! } ! } ! Vertex common = Edge.commonVertex(closest, e); ! Vertex direction = closest.otherVertex(common).minus(common); ! direction.normalize(); ! Vertex alongE = e.otherVertex(common).minus(common); ! alongE.normalize(); ! Vertex cross = direction.cross(alongE); ! Vertex orthoDir = alongE.cross(cross); ! Vertex deltaUnit = orthoDir.copy(); ! orthoDir.scale(wallThickness); ! double slideScale = 0; ! if (deltaUnit.getX() != 0) { ! double dot = direction.dot(deltaUnit); ! slideScale = orthoDir.getX() / (dot * deltaUnit.getX()); ! } else if (deltaUnit.getY() != 0) { ! slideScale = orthoDir.getY() / (direction.dot(deltaUnit) * deltaUnit.getY()); ! } else { ! slideScale = orthoDir.getZ() / (direction.dot(deltaUnit) * deltaUnit.getZ()); ! } ! direction.scale(slideScale); ! //Create other edge and connections ! Edge moved = copy.copy(); ! Edge con1 = new Edge(copy.getFrom(), moved.getFrom()); ! Edge con2 = new Edge(copy.getTo(), moved.getTo()); ! List<Edge> out = new ArrayList<Edge>(4); ! out.add(copy); ! out.add(con1); ! out.add(moved); ! out.add(con2); ! Surface sOut = new Surface(out); ! extra.add(sOut); ! if (common == e.getFrom()) { ! moved.getFrom().move(direction.getX(), direction.getY(), direction.getZ()); ! moved.getTo().move(orthoDir.getX(), orthoDir.getY(), orthoDir.getZ()); ! } else if (common == e.getTo()) { ! moved.getTo().move(direction.getX(), direction.getY(), direction.getZ()); ! moved.getFrom().move(orthoDir.getX(), orthoDir.getY(), orthoDir.getZ()); ! } else { ! log.error("E did not contain common"); ! } ! } ! Geometry.unTranslateGeometry(extra, cs); ! for (Surface sur : extra) { ! space.insert(sur); ! Geometry.assignSame(bathcabin, sur, bath, walls); ! } ! ! // exrrude the created walls ! Collection<Surface> wallsurs = new ArrayList<Surface>(walls.getEnvelope()); ! for (Surface sur : wallsurs) { ! Collection<Surface> sides = new LinkedList<Surface>(); ! Set<Surface> tops = new HashSet<Surface>(); ! double sign = 1.0; ! if (sur.normal().equalEps(new Vertex(0, 0, -1))) { ! sign = -1.0; ! } ! sur.extrusionall(sign * (height - floorThickness - ceilingThickness), sides, tops); ! if (tops.size() > 1) { ! for (Surface top : tops) { ! if (!top.setOppositeSpace(walls, ceiling)) { ! top.setOppositeSpace(bath, ceiling); ! } ! } ! } ! sides.addAll(tops); ! space.addAll(sides); ! } } *************** *** 149,154 **** private void makeFloor() { Surface s = net.getSurfaces().iterator().next(); - Space floor = new Space("Floor", Space.CONSTRUCTION, Space.SPACE_LEVEL, true); - space.add(floor); s = s.copy(space); if (s.normal().getZ() < 0) { --- 379,382 ---- *************** *** 158,161 **** --- 386,394 ---- Collection<Surface> geom = new LinkedList<Surface>(); Surface floorTop = s.extrusion(floorThickness, geom); + if (floorTop.getBackDomain() == floor) { + floorTop.setFrontDomain(walls); + } else { + floorTop.setBackDomain(walls); + } geom.add(floorTop); space.addAll(geom); *************** *** 223,226 **** --- 456,460 ---- /** {@inheritDoc} */ + @Override public void setAttributes(Map<String, Attribute> attributes) { Attribute a = attributes.get("Length"); |