Thread: [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-24 10:55:43
|
Update of /cvsroot/bprocessor//model/src/net/sourceforge/bprocessor/model/modellor In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv17199/src/net/sourceforge/bprocessor/model/modellor Modified Files: ModelBathModellor2.java Log Message: improvements on the modellor Index: ModelBathModellor2.java =================================================================== RCS file: /cvsroot/bprocessor//model/src/net/sourceforge/bprocessor/model/modellor/ModelBathModellor2.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ModelBathModellor2.java 20 May 2007 10:27:07 -0000 1.2 --- ModelBathModellor2.java 24 May 2007 10:55:42 -0000 1.3 *************** *** 18,21 **** --- 18,22 ---- import net.sourceforge.bprocessor.model.CoordinateSystem; import net.sourceforge.bprocessor.model.Edge; + import net.sourceforge.bprocessor.model.Geometric; import net.sourceforge.bprocessor.model.Geometry; import net.sourceforge.bprocessor.model.Net; *************** *** 46,51 **** private Space bath; - private double shaftOffset; - private double length; --- 47,50 ---- *************** *** 68,72 **** private double windowOffset = 1.2; ! private double doorWindow = 0.5; /** --- 67,73 ---- private double windowOffset = 1.2; ! private double windowHeight = 0.5; ! ! private Collection<Space> doorAndWindows = new ArrayList<Space>(); /** *************** *** 75,79 **** public ModelBathModellor2() { super(); - shaftOffset = 100; } --- 76,79 ---- *************** *** 130,138 **** /** {@inheritDoc} */ public void update(Object entity) { ! if (entity.equals(net) || entity.equals(this) || entity.equals(space) && isActive()) { ! cleanUp(); ! space.add(net); ! checkNetProperties(); ! generateBath(); } } --- 130,150 ---- /** {@inheritDoc} */ public void update(Object entity) { ! if (isActive()) { ! boolean doIt = false; ! if (entity instanceof Geometric) { ! Geometric g = (Geometric)entity; ! if (g.getOwner() == net || g.getOwner() == space) { ! doIt = true; ! } ! } ! if (entity.equals(net) || entity.equals(this) || entity.equals(space)) { ! doIt = true; ! } ! if (doIt) { ! cleanUp(); ! space.add(net); ! checkNetProperties(); ! generateBath(); ! } } } *************** *** 155,158 **** --- 167,380 ---- makeCeiling(); makeDoorAndWindows(); + + elementWalls(); + //addTileModellors(); + } + + private void addTileModellors() { + for (Space elem : walls.getElements()) { + elem.setModellor(new TileModellor(elem)); + } + } + + private void elementWalls2() { + WallPartingModellor wpm = new WallPartingModellor(walls, net); + + walls.setModellor(wpm); + wpm.update(walls); + } + + /** + * Part the walls space into elements + */ + private void elementWalls() { + double wallHeight = height - floorThickness - ceilingThickness; + Vertex toInnerOffset = null; + Vertex fromInnerOffset = null; + Vertex center = net.getSurfaces().iterator().next().center(); + List<List<Edge>> straights = new LinkedList<List<Edge>>(); + List<Edge> remainingEdges = new ArrayList<Edge>(net.getEdges()); + while (!remainingEdges.isEmpty()) { + List<Edge> parallel = remainingEdges.get(0).parrallelRun(); + straights.add(parallel); + remainingEdges.removeAll(parallel); + } + List<Surface> concretes = new ArrayList<Surface>(straights.size()); + List<Surface> tiles = new ArrayList<Surface>(straights.size()); + for (List<Edge> list : straights) { + Edge outer = new Edge(list.get(0).getFrom(), + list.get(list.size() - 1).getTo()); + Edge outerCopy = outer.copy(); + Edge tileCopy = outer.copy(); + //Check if from corner should belong to outer + Object info = outer.getFrom().getParameters().environment().get("Corner"); + if (info != null) { + if (info instanceof Selector) { + Selector<String> s = (Selector<String>)info; + String corner = s.getCurrentValue(); + if (corner.equals("Left")) { + Vertex delta = outer.getDirection(); + delta.normalize(); + delta.scale(wallThickness - 0.005); + outerCopy.getFrom().move(delta.getX(), delta.getY(), delta.getZ()); + delta.normalize(); + delta.scale(wallThickness); + tileCopy.getFrom().move(delta.getX(), delta.getY(), delta.getZ()); + fromInnerOffset = null; + } else { + Vertex delta = outer.getDirection(); + delta.normalize(); + delta.scale(wallThickness); + tileCopy.getFrom().move(delta.getX(), delta.getY(), delta.getZ()); + if (corner.equals("Split")) { + fromInnerOffset = delta; + fromInnerOffset.normalize(); + fromInnerOffset.scale(wallThickness - 0.005); + } + } + } + } + //check if to corner should belong to outer + info = outer.getTo().getParameters().environment().get("Corner"); + if (info != null) { + if (info instanceof Selector) { + Selector<String> s = (Selector<String>)info; + String corner = s.getCurrentValue(); + if (corner.equals("Right")) { + Vertex delta = outer.getDirection(); + delta.normalize(); + delta.scale(-1); + delta.scale(wallThickness - 0.005); + outerCopy.getTo().move(delta.getX(), delta.getY(), delta.getZ()); + delta.normalize(); + delta.scale(wallThickness); + tileCopy.getTo().move(delta.getX(), delta.getY(), delta.getZ()); + toInnerOffset = null; + } else { + Vertex delta = outer.getDirection(); + delta.normalize(); + delta.scale(-1); + delta.scale(wallThickness); + tileCopy.getTo().move(delta.getX(), delta.getY(), delta.getZ()); + if (corner.equals("Split")) { + toInnerOffset = delta; + toInnerOffset.normalize(); + toInnerOffset.scale(wallThickness - 0.005); + } + } + } + } + //create a surface for the outline of the wall element + //surface for concrete + Edge inner = outerCopy.copy(); + if (toInnerOffset != null) { + inner.getTo().move(toInnerOffset); + } + if (fromInnerOffset != null) { + inner.getFrom().move(fromInnerOffset); + } + Vertex inter = inner.intersection(center); + Vertex dir = center.minus(inter); + dir.normalize(); + Vertex usedDir = dir.copy(); + usedDir.scale(wallThickness - 0.005); + inner.move(usedDir); + Edge between1 = new Edge(outerCopy.getFrom(), inner.getFrom()); + Edge between2 = new Edge(inner.getTo(), outerCopy.getTo()); + Surface s = new Surface(inner, between1, outerCopy, between2); + Space concrete = new Space("Concrete", Space.CONSTRUCTION, Space.ELEMENT_LEVEL, true); + walls.add(concrete); + if (s.normal().getZ() == 1.0) { + s.setFrontDomain(concrete); + } else { + s.setBackDomain(concrete); + } + concretes.add(s); + //surface for tiles + dir.normalize(); + dir.scale(wallThickness - 0.005); + tileCopy.move(dir); + Edge inner2 = tileCopy.copy(); + dir.normalize(); + dir.scale(0.005); + inner2.move(dir); + between1 = new Edge(tileCopy.getFrom(), inner2.getFrom()); + between2 = new Edge(inner2.getTo(), tileCopy.getTo()); + s = new Surface(inner2, between1, tileCopy, between2); + Space tile = new Space("Tile", Space.CONSTRUCTION, Space.ELEMENT_LEVEL, true); + walls.add(tile); + if (s.normal().getZ() == 1.0) { + s.setFrontDomain(tile); + } else { + s.setBackDomain(tile); + } + tiles.add(s); + } + CoordinateSystem cs = coord.copy(); + cs.move(0, 0, floorThickness); + Geometry.unTranslateGeometry(concretes, cs); + Geometry.unTranslateGeometry(tiles, cs); + for (Surface s : concretes) { + s.setEdges(walls.insert(s.getEdges())); + walls.add(s); + } + for (Surface s : tiles) { + s.setEdges(walls.insert(s.getEdges())); + walls.add(s); + } + + //split edges at crossings + Collection<Vertex> verts = walls.getVertices(); + List<Edge> edges = new LinkedList<Edge>(walls.getEdges()); + while (!edges.isEmpty()) { + Edge e = edges.get(0); + for (Vertex v : verts) { + if (!e.contains(v) && e.coincides(v) && !e.getFrom().equalEps(v) && + !e.getTo().equalEps(v)) { + Vertex intersection = e.intersection(v); + edges.addAll(e.split(intersection)); + break; + } + } + edges.remove(0); + } + + Collection<Surface> sides = new ArrayList<Surface>(5); + Collection<Surface> bottoms = new ArrayList<Surface>(walls.getSurfaces()); + // extrude concrete and tiles up + for (Surface s : bottoms) { + double dist = wallHeight; + if (s.getFrontDomain() == walls.getEmpty()) { + dist *= -1; + } + sides.add(s.extrusion(dist, sides)); + for (Surface side : sides) { + walls.insert(side); + } + sides.clear(); + } + // copy doors and windows in + for (Space spc : doorAndWindows) { + double maxDist = 0; + Surface outer = null; + for (Surface s : spc.getEnvelope()) { + Surface news = s.copy(walls); + double dist = news.center().distance(center); + Geometry.holeAnalysis(news); + if (dist > maxDist && + Math.abs(news.normal().getZ()) < 0.0001 && + news.getExterior() != null) { + maxDist = dist; + outer = news; + } + } + sides.clear(); + Surface s = outer.extrusion(-(wallThickness - 0.005), sides); + walls.insert(s); + for (Surface sur : sides) { + walls.insert(sur); + } + + } } *************** *** 165,168 **** --- 387,391 ---- // make a door Space doorSpc = new Space("Door", Space.CONSTRUCTION, Space.SPACE_LEVEL, true); + doorAndWindows.add(doorSpc); space.add(doorSpc); doorSpc.setTransparent(true); *************** *** 190,194 **** in = dir.cross(up); sur = space.insert(sur); - Geometry.holeAnalysis(sur); Collection<Surface> sides = new LinkedList<Surface>(); Surface t; --- 413,416 ---- *************** *** 204,211 **** 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); --- 426,433 ---- space.insert(surface); } } else if (s.getCurrentValue().equals("Window")) { //make a window Space winSpc = new Space("Window", Space.CONSTRUCTION, Space.SPACE_LEVEL, true); + doorAndWindows.add(winSpc); space.add(winSpc); winSpc.setTransparent(true); *************** *** 220,224 **** 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(); --- 442,446 ---- win.add(side2); bottom.move(new Vertex(0, 0, floorThickness + windowOffset)); ! top.move(new Vertex(0, 0, floorThickness + windowOffset + windowHeight)); Surface sur = new Surface(win); Vertex center = net.getSurfaces().iterator().next().center(); *************** *** 268,272 **** } } ! /** * Generate wall element --- 490,494 ---- } } ! /** * Generate wall element *************** *** 402,410 **** Map<String, Object> env = e.getParameters().environment(); if (!env.containsKey("Type")) { ! List options = new LinkedList(); ! options.add("Wall"); ! options.add("Door"); ! options.add("Window"); ! Selector sel = new Selector(options); sel.setCurrentValue("Wall"); e.getParameters().put(new Attribute("Type", sel)); --- 624,628 ---- Map<String, Object> env = e.getParameters().environment(); if (!env.containsKey("Type")) { ! Selector<String> sel = new Selector<String>("Wall", "Door", "Window"); sel.setCurrentValue("Wall"); e.getParameters().put(new Attribute("Type", sel)); *************** *** 416,431 **** if (!env.containsKey("Corner")) { switch (v.getEdges().size()) { - case 3 : - v.getParameters().put(new Attribute("Corner", "Straight")); - break; case 2 : ! List options = new LinkedList(); ! options.add("Left"); ! options.add("Right"); ! Selector sel = new Selector(options); sel.setCurrentValue("Left"); v.getParameters().put(new Attribute("Corner", sel)); break; ! default: break; } --- 634,648 ---- if (!env.containsKey("Corner")) { switch (v.getEdges().size()) { case 2 : ! Selector<String> sel = new Selector<String>("Left", "Right", "Split"); sel.setCurrentValue("Left"); v.getParameters().put(new Attribute("Corner", sel)); break; ! } ! } else { ! switch (v.getEdges().size()) { ! case 1 : ! case 3 : ! v.getParameters().clear(); break; } *************** *** 435,438 **** --- 652,656 ---- /** {@inheritDoc} */ + @Override public Modellor newInstance(Space s) { if (s.getLevel() == Space.SPACE_LEVEL) { *************** *** 444,447 **** --- 662,666 ---- /** {@inheritDoc} */ + @Override public void delete() { space.setModellor(null); *************** *** 453,456 **** --- 672,682 ---- private void cleanUp() { space.clear(); + if (walls != null) { + walls.clear(); + floor.clear(); + bath.clear(); + ceiling.clear(); + } + doorAndWindows.clear(); } *************** *** 470,476 **** height = (Double)a.getValue(); } ! a = attributes.get("Shaft-offset"); if (a != null) { ! shaftOffset = (Double)a.getValue(); } update(space); --- 696,722 ---- height = (Double)a.getValue(); } ! a = attributes.get("Floor thickness"); if (a != null) { ! floorThickness = (Double)a.getValue(); ! } ! a = attributes.get("Wall thickness"); ! if (a != null) { ! wallThickness = (Double)a.getValue(); ! } ! a = attributes.get("Ceiling thickness"); ! if (a != null) { ! ceilingThickness = (Double)a.getValue(); ! } ! a = attributes.get("Door height"); ! if (a != null) { ! doorHeight = (Double)a.getValue(); ! } ! a = attributes.get("Window offset"); ! if (a != null) { ! windowOffset = (Double)a.getValue(); ! } ! a = attributes.get("Window height"); ! if (a != null) { ! windowHeight = (Double)a.getValue(); } update(space); *************** *** 478,489 **** /** {@inheritDoc} */ public void getAttributes(List<Attribute> l) { l.add(new Attribute("Length", length, true)); l.add(new Attribute("Width", width, true)); l.add(new Attribute("Height", height, true)); ! l.add(new Attribute("Shaft-offset", shaftOffset, true)); } /** {@inheritDoc} */ public String getName() { return "New Bath-module"; --- 724,742 ---- /** {@inheritDoc} */ + @Override public void getAttributes(List<Attribute> l) { l.add(new Attribute("Length", length, true)); l.add(new Attribute("Width", width, true)); l.add(new Attribute("Height", height, true)); ! l.add(new Attribute("Floor thickness", floorThickness, true)); ! l.add(new Attribute("Wall thickness", wallThickness, true)); ! l.add(new Attribute("Ceiling thickness", ceilingThickness, true)); ! l.add(new Attribute("Door height", floorThickness, true)); ! l.add(new Attribute("Window offset", windowOffset, true)); ! l.add(new Attribute("Window height", windowHeight, true)); } /** {@inheritDoc} */ + @Override public String getName() { return "New Bath-module"; *************** *** 491,494 **** --- 744,748 ---- /** {@inheritDoc} */ + @Override public String getGeneralName() { return "New Bath-module modellor"; *************** *** 496,506 **** --- 750,782 ---- /** {@inheritDoc} */ + @Override public void setSubContent(Map<String, Object> m) { space = (Space)m.get("Space"); + net = (Net)m.get("Net"); + wallThickness = (Double)m.get("wallThickness"); + floorThickness = (Double)m.get("floorThickness"); + ceilingThickness = (Double)m.get("ceilingThickness"); + length = (Double)m.get("length"); + width = (Double)m.get("width"); + height = (Double)m.get("height"); + windowOffset = (Double)m.get("windowOffset"); + windowHeight = (Double)m.get("windowHeight"); + doorHeight = (Double)m.get("doorHeight"); } /** {@inheritDoc} */ + @Override public void getSubContent(Map<String, Object> m) { m.put("Space", space); + m.put("Net", net); + m.put("wallThickness", wallThickness); + m.put("floorThickness", floorThickness); + m.put("ceilingThickness", ceilingThickness); + m.put("length", length); + m.put("height", height); + m.put("widht", width); + m.put("windowOffset", windowOffset); + m.put("windowHeight", windowHeight); + m.put("doorHeight", doorHeight); } |