|
Posted by shmuelzon
at Sep 28, 2024, 7:18:04 PM
|
Programmatically Changing Openings
Hey,
As a part of a plugin development, I want to close a door/window in the floor plan. I tried following the code that does this from the UI and my understanding is that modifying the piece of furniture's transformations (hinges and whatnot) also alters its overall dimensions and so, after transforming it, i.e., removing the existing transformations, I need to recalculate the size and position and update the piece of furniture accordingly. I tried to, basically, copy-paste the code from the ModelPreviewComponent class but I guess I'm missing something since, while the door does close, it stays at, more-or-less, the same original dimensions and becomes distorted.
In my code, I find the relevant furniture by traversing home.getFurniture() and, when needed, call a new shutTheDoor() function I created:
private void shutTheDoor(HomeDoorOrWindow furniture) { ModelManager modelManager = ModelManager.getInstance(); HomePieceOfFurniture3D modelNode = new HomePieceOfFurniture3D(furniture, home); BoundingBox oldBounds = modelManager.getBounds(modelNode); System.out.println("oldBounds: " + oldBounds); Point3d oldLower = new Point3d(); oldBounds.getLower(oldLower); System.out.println("oldLower: " + oldLower); Point3d oldUpper = new Point3d(); oldBounds.getUpper(oldUpper); System.out.println("oldUpper: " + oldUpper);
setNodeTransformations(modelNode, null);
BoundingBox newBounds = modelManager.getBounds(modelNode); System.out.println("newBounds: " + newBounds); Point3d newLower = new Point3d(); newBounds.getLower(newLower); System.out.println("newLower: " + newLower); Point3d newUpper = new Point3d(); newBounds.getUpper(newUpper); System.out.println("newUpper: " + newUpper); furniture.setX(furniture.getX() + (float)(newUpper.x + newLower.x) / 2 - (float)(oldUpper.x + oldLower.x) / 2); furniture.setY(furniture.getY() + (float)(newUpper.z + newLower.z) / 2 - (float)(oldUpper.z + oldLower.z) / 2); furniture.setElevation(furniture.getElevation() + (float)(newLower.y - oldLower.y)); furniture.setWidth((float)(newUpper.x - newLower.x)); furniture.setDepth((float)(newUpper.z - newLower.z)); furniture.setHeight((float)(newUpper.y - newLower.y)); furniture.setModelTransformations(null); }
private void setNodeTransformations(Node node, Transformation [] transformations) { if (node instanceof Group) { if (node instanceof TransformGroup && node.getUserData() instanceof String && ((String)node.getUserData()).endsWith(ModelManager.DEFORMABLE_TRANSFORM_GROUP_SUFFIX)) { System.out.println("Setting new transform for " + (String)node.getUserData()); TransformGroup transformGroup = (TransformGroup)node; transformGroup.setTransform(new Transform3D()); if (transformations != null) { String transformationName = (String)node.getUserData(); transformationName = transformationName.substring(0, transformationName.length() - ModelManager.DEFORMABLE_TRANSFORM_GROUP_SUFFIX.length()); for (Transformation transformation : transformations) { if (transformationName.equals(transformation.getName())) { System.out.println("XXX"); float [][] matrix = transformation.getMatrix(); Matrix4f transformMatrix = new Matrix4f(); transformMatrix.setRow(0, matrix[0]); transformMatrix.setRow(1, matrix[1]); transformMatrix.setRow(2, matrix[2]); transformMatrix.setRow(3, new float [] {0, 0, 0, 1}); transformGroup.setTransform(new Transform3D(transformMatrix)); } } } } Enumeration<?> enumeration = ((Group)node).getAllChildren(); while (enumeration.hasMoreElements()) { setNodeTransformations((Node)enumeration.nextElement(), transformations); } } }
These are the old and new bounds, as printed from the above:
oldBounds: Bounding box: Lower=492.4598841340258 0.0 -2029.357666015625 Upper=583.4937291472243 208.5 -1943.9011759098528 newBounds: Bounding box: Lower=492.02176349361724 0.0 -2029.3576131526472 Upper=583.4937291472243 208.5 -1943.9011759098528
As can be seen, they are very similar.
If it helps, the position and dimensions of the door when it's open (the starting state) is:
X= 538, Y= -1986.6, Elevation= 0, Angle= 270, Width= 85.5, Depth= 91, Height= 208.5
When closing it via the "Modify openings..." UI, the position and size become:
X= 507.5, Y= -1982.6, Elevation= 0, Angle= 270, Width= 77.3, Depth= 30.9, Height= 208.5
However, closing it with the above code, results with:
X= 537.8, Y= -1986.6, Elevation= 0, Angle= 270, Width= 91.5, Depth= 85.5, Height= 208.5
Can anyone please point me in the right direction for how to properly close (and later restore) doors/windows?
Thanks in advance!
|