Thread: [Bprocessor-commit] /model/src/net/sourceforge/bprocessor/model/modellor WallPartingModellor.java,
Status: Pre-Alpha
Brought to you by:
henryml
|
From: rimestad <rim...@us...> - 2007-05-24 21:41:50
|
Update of /cvsroot/bprocessor//model/src/net/sourceforge/bprocessor/model/modellor In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv9416/src/net/sourceforge/bprocessor/model/modellor Modified Files: TileModellor.java ModelBathModellor2.java Added Files: WallPartingModellor.java Log Message: forgot som modellor stuff Index: TileModellor.java =================================================================== RCS file: /cvsroot/bprocessor//model/src/net/sourceforge/bprocessor/model/modellor/TileModellor.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** TileModellor.java 7 May 2007 13:40:18 -0000 1.13 --- TileModellor.java 24 May 2007 21:41:49 -0000 1.14 *************** *** 79,86 **** } else { space = s; ! surface = s.getEnvelope().iterator().next(); ! startPoint = surface.coordinateSystem(); space.getOwner().add(startPoint); - startPoint.relate(surface); space.add(tileColor); updateNet(startPoint); --- 79,90 ---- } else { space = s; ! surface = pickSurface(); ! if (surface != null) { ! startPoint = surface.coordinateSystem(); ! startPoint.relate(surface); ! } else { ! startPoint = Project.getInstance().getActiveCoordinateSystem().copy(); ! } space.getOwner().add(startPoint); space.add(tileColor); updateNet(startPoint); *************** *** 88,92 **** } } ! /** * {@inheritDoc} --- 92,96 ---- } } ! /** * {@inheritDoc} *************** *** 96,100 **** return new TileModellor(s); } ! /** * {@inheritDoc} --- 100,132 ---- return new TileModellor(s); } ! ! private Surface pickSurface() { ! Surface res = null; ! for (Surface s : space.getSurfaces()) { ! Surface ext = s.getExterior(); ! if (ext != null && ext.getOwner().getLevel() < space.getLevel()) { ! // exterior were on a higher level look at the spaces of it ! if ((ext.getFrontDomain().getType() == Space.FUNCTIONAL ! && ext.getFrontDomain().isContainer()) || ! (ext.getBackDomain().getType() == Space.FUNCTIONAL ! && ext.getBackDomain().isContainer())) { ! //the surface is assigned to a ! res = s; ! } ! } else { ! //look for a surface with a funktional space assign that is vertical ! if (s.getFrontDomain().getType() == Space.FUNCTIONAL && ! Math.abs(s.normal().getZ()) < 0.0001) { ! res = s; ! } ! } ! } ! //if none is found and there are surfaces just pick the fist one ! if (res == null && !space.getSurfaces().isEmpty()) { ! res = space.getSurfaces().iterator().next(); ! } ! return res; ! } ! /** * {@inheritDoc} --- NEW FILE: WallPartingModellor.java --- //--------------------------------------------------------------------------------- // $Id: WallPartingModellor.java,v 1.1 2007/05/24 21:41:50 rimestad Exp $ // // Copyright (c) 2005 The BProcessor Team (http://bprocessor.sourceforge.net) // Released under the Lesser GNU Public License v2.1 //--------------------------------------------------------------------------------- package net.sourceforge.bprocessor.model.modellor; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Map; import net.sourceforge.bprocessor.model.Attribute; import net.sourceforge.bprocessor.model.CoordinateSystem; import net.sourceforge.bprocessor.model.Edge; import net.sourceforge.bprocessor.model.Geometry; import net.sourceforge.bprocessor.model.Net; import net.sourceforge.bprocessor.model.Project; import net.sourceforge.bprocessor.model.Selector; import net.sourceforge.bprocessor.model.Space; import net.sourceforge.bprocessor.model.Surface; import net.sourceforge.bprocessor.model.Vertex; /** * A modellor for generating the elements in a wallsystem * create the specified offsets from the outling of the wallsystem * @author rimestad */ public class WallPartingModellor extends Modellor { private Space space; private Net net; private double minZ; private double maxZ; private double wallThickness = 0.055; /** * Constructor for modellor * @param walls the space where the wallsystem reside * @param net the net outlining the walls (can be auto calculated by sending null object) */ public WallPartingModellor(Space walls, Net net) { this.space = walls; if (net != null) { this.net = net; } else { this.net = calcNet(); } } private Net calcNet() { //find bottom surface and copy outer contour from it into a new net Net tmpNet = new Net("Contour"); space.getSurfaces().iterator().next().copy(tmpNet); return tmpNet; } private Map<Vertex, Vertex> findDirection() { return null; } /** * {@inheritDoc} */ @Override public void update(Object entity) { double wallHeight = findHeight(); 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); space.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); space.add(tile); if (s.normal().getZ() == 1.0) { s.setFrontDomain(tile); } else { s.setBackDomain(tile); } tiles.add(s); } CoordinateSystem cs = Project.getInstance().getActiveCoordinateSystem().copy(); cs.move(0, 0, minZ); Geometry.unTranslateGeometry(concretes, cs); Geometry.unTranslateGeometry(tiles, cs); for (Surface s : concretes) { s.setEdges(space.insert(s.getEdges())); space.add(s); } for (Surface s : tiles) { s.setEdges(space.insert(s.getEdges())); space.add(s); } //split edges at crossings Collection<Vertex> verts = space.getVertices(); List<Edge> edges = new LinkedList<Edge>(space.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>(space.getSurfaces()); // extrude wall parting up for (Surface s : bottoms) { double dist = wallHeight; if (s.getFrontDomain() == space.getEmpty()) { dist *= -1; } sides.add(s.extrusion(dist, sides)); for (Surface side : sides) { space.insert(side); } sides.clear(); } } private double findHeight() { minZ = 0; maxZ = 0; for (Vertex v : space.getVertices()) { if (v.getZ() < minZ) { minZ = v.getZ(); } if (v.getZ() > maxZ) { maxZ = v.getZ(); } } return maxZ - minZ; } /** * {@inheritDoc} */ @Override public void delete() { // TODO Auto-generated method stub } /** * {@inheritDoc} */ @Override public void getAttributes(List<Attribute> l) { super.getAttributes(); } /** * {@inheritDoc} */ @Override public void getSubContent(Map<String, Object> c) { } /** * {@inheritDoc} */ @Override public int getUseableLevel() { return Space.ELEMENT_LEVEL; } /** * {@inheritDoc} */ @Override public Modellor newInstance(Space s) { return new WallPartingModellor(s, null); } /** * {@inheritDoc} */ @Override public void setAttributes(Map<String, Attribute> m) { } /** * {@inheritDoc} */ @Override public void setSubContent(Map<String, Object> c) { } } Index: ModelBathModellor2.java =================================================================== RCS file: /cvsroot/bprocessor//model/src/net/sourceforge/bprocessor/model/modellor/ModelBathModellor2.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** ModelBathModellor2.java 24 May 2007 10:55:42 -0000 1.3 --- ModelBathModellor2.java 24 May 2007 21:41:50 -0000 1.4 *************** *** 726,736 **** @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)); --- 726,736 ---- @Override public void getAttributes(List<Attribute> l) { ! l.add(new Attribute("Length", length, false)); ! l.add(new Attribute("Width", width, false)); ! l.add(new Attribute("Height", height, false)); 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", doorHeight, true)); l.add(new Attribute("Window offset", windowOffset, true)); l.add(new Attribute("Window height", windowHeight, true)); |