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:
Code: Select all
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);
}
}
}Code: Select all
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.9011759098528If it helps, the position and dimensions of the door when it's open (the starting state) is:
Code: Select all
X= 538, Y= -1986.6, Elevation= 0, Angle= 270, Width= 85.5, Depth= 91, Height= 208.5Code: Select all
X= 507.5, Y= -1982.6, Elevation= 0, Angle= 270, Width= 77.3, Depth= 30.9, Height= 208.5Code: Select all
X= 537.8, Y= -1986.6, Elevation= 0, Angle= 270, Width= 91.5, Depth= 85.5, Height= 208.5Thanks in advance!