use of org.bimserver.models.geometry.Bounds in project BIMserver by opensourceBIM.
the class OfflineGeometryGenerator method processExtends.
private void processExtends(GeometryInfo geometryInfo, double[] transformationMatrix, ByteBuffer vertices, int index, GenerateGeometryResult generateGeometryResult) {
double x = vertices.get(index);
double y = vertices.get(index + 1);
double z = vertices.get(index + 2);
double[] result = new double[4];
Matrix.multiplyMV(result, 0, transformationMatrix, 0, new double[] { x, y, z, 1 }, 0);
x = result[0];
y = result[1];
z = result[2];
Bounds bounds = geometryInfo.getBounds();
bounds.getMin().setX(Math.min(x, bounds.getMin().getX()));
bounds.getMin().setY(Math.min(y, bounds.getMin().getY()));
bounds.getMin().setZ(Math.min(z, bounds.getMin().getZ()));
bounds.getMax().setX(Math.max(x, bounds.getMax().getX()));
bounds.getMax().setY(Math.max(y, bounds.getMax().getY()));
bounds.getMax().setZ(Math.max(z, bounds.getMax().getZ()));
generateGeometryResult.getMinBounds().setX(Math.min(x, generateGeometryResult.getMinBounds().getX()));
generateGeometryResult.getMinBounds().setY(Math.min(y, generateGeometryResult.getMinBounds().getY()));
generateGeometryResult.getMinBounds().setZ(Math.min(z, generateGeometryResult.getMinBounds().getZ()));
generateGeometryResult.getMaxBounds().setX(Math.max(x, generateGeometryResult.getMaxBounds().getX()));
generateGeometryResult.getMaxBounds().setY(Math.max(y, generateGeometryResult.getMaxBounds().getY()));
generateGeometryResult.getMaxBounds().setZ(Math.max(z, generateGeometryResult.getMaxBounds().getZ()));
}
use of org.bimserver.models.geometry.Bounds in project BIMserver by opensourceBIM.
the class ServiceImpl method getTotalUntransformedBounds.
@Override
public SBounds getTotalUntransformedBounds(Set<Long> roids) throws ServerException, UserException {
// TODO duplicate code with getTotalBounds
try (DatabaseSession session = getBimServer().getDatabase().createSession(OperationType.READ_ONLY)) {
double[] totalMin = new double[] { Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE };
double[] totalMax = new double[] { -Double.MAX_VALUE, -Double.MAX_VALUE, -Double.MAX_VALUE };
for (Long roid : roids) {
Revision revision = session.get(roid, OldQuery.getDefault());
Bounds bounds = revision.getBoundsUntransformedMm();
if (bounds.getMin().getX() == Double.MAX_VALUE || bounds.getMin().getY() == Double.MAX_VALUE || bounds.getMin().getZ() == Double.MAX_VALUE || bounds.getMax().getX() == -Double.MAX_VALUE || bounds.getMax().getY() == -Double.MAX_VALUE || bounds.getMax().getZ() == -Double.MAX_VALUE) {
// Probably no objects or weird error, let's skip this one
continue;
}
Vector3f min = bounds.getMin();
Vector3f max = bounds.getMax();
if (min.getX() < totalMin[0]) {
totalMin[0] = min.getX();
}
if (min.getY() < totalMin[1]) {
totalMin[1] = min.getY();
}
if (min.getZ() < totalMin[2]) {
totalMin[2] = min.getZ();
}
if (max.getX() > totalMax[0]) {
totalMax[0] = max.getX();
}
if (max.getY() > totalMax[1]) {
totalMax[1] = max.getY();
}
if (max.getZ() > totalMax[2]) {
totalMax[2] = max.getZ();
}
}
SBounds sBounds = new SBounds();
SVector3f sMin = new SVector3f();
SVector3f sMax = new SVector3f();
sBounds.setMin(sMin);
sBounds.setMax(sMax);
sMin.setX(totalMin[0]);
sMin.setY(totalMin[1]);
sMin.setZ(totalMin[2]);
sMax.setX(totalMax[0]);
sMax.setY(totalMax[1]);
sMax.setZ(totalMax[2]);
return sBounds;
} catch (Exception e) {
return handleException(e);
}
}
use of org.bimserver.models.geometry.Bounds in project BIMserver by opensourceBIM.
the class ServiceImpl method listBoundingBoxes.
public List<SBounds> listBoundingBoxes(Set<Long> roids) throws ServerException, UserException {
try (DatabaseSession session = getBimServer().getDatabase().createSession(OperationType.READ_ONLY)) {
List<SBounds> results = new ArrayList<>();
Set<Region> regions = new HashSet<>();
for (long roid : roids) {
Revision revision = session.get(roid, OldQuery.getDefault());
for (ConcreteRevision concreteRevision : revision.getConcreteRevisions()) {
Bounds bounds = concreteRevision.getBounds();
if (bounds.getMin().getX() == Double.MAX_VALUE || bounds.getMin().getY() == Double.MAX_VALUE || bounds.getMin().getZ() == Double.MAX_VALUE || bounds.getMax().getX() == -Double.MAX_VALUE || bounds.getMax().getY() == -Double.MAX_VALUE || bounds.getMax().getZ() == -Double.MAX_VALUE) {
// Probably no objects or weird error, let's skip this one
continue;
}
scaleBounds(bounds, concreteRevision.getMultiplierToMm());
boolean integrated = false;
for (Region region : regions) {
if (region.canAccept(bounds)) {
region.integrate(bounds);
integrated = true;
break;
}
}
if (!integrated) {
Region region = new Region(bounds);
regions.add(region);
}
}
}
for (Region region : regions) {
results.add(region.toSBounds());
}
return results;
} catch (Exception e) {
return handleException(e);
}
}
use of org.bimserver.models.geometry.Bounds in project BIMserver by opensourceBIM.
the class ServiceImpl method getModelBounds.
@Override
public SBounds getModelBounds(Long roid) throws ServerException, UserException {
DatabaseSession session = getBimServer().getDatabase().createSession(OperationType.READ_ONLY);
try {
Revision revision = session.get(roid, OldQuery.getDefault());
ConcreteRevision lastConcreteRevision = revision.getLastConcreteRevision();
Bounds bounds = lastConcreteRevision.getBounds();
Vector3f min = bounds.getMin();
Vector3f max = bounds.getMax();
if (lastConcreteRevision.getMultiplierToMm() != 1f) {
min.setX(min.getX() * lastConcreteRevision.getMultiplierToMm());
min.setY(min.getY() * lastConcreteRevision.getMultiplierToMm());
min.setZ(min.getZ() * lastConcreteRevision.getMultiplierToMm());
max.setX(max.getX() * lastConcreteRevision.getMultiplierToMm());
max.setY(max.getY() * lastConcreteRevision.getMultiplierToMm());
max.setZ(max.getZ() * lastConcreteRevision.getMultiplierToMm());
}
return getBimServer().getSConverter().convertToSObject(bounds);
} catch (Exception e) {
return handleException(e);
} finally {
session.close();
}
}
use of org.bimserver.models.geometry.Bounds in project BIMserver by opensourceBIM.
the class ServiceImpl method getTotalBounds.
@Override
public SBounds getTotalBounds(Set<Long> roids) throws ServerException, UserException {
DatabaseSession session = getBimServer().getDatabase().createSession(OperationType.READ_ONLY);
try {
double[] totalMin = new double[] { Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE };
double[] totalMax = new double[] { -Double.MAX_VALUE, -Double.MAX_VALUE, -Double.MAX_VALUE };
for (Long roid : roids) {
Revision revision = session.get(roid, OldQuery.getDefault());
Bounds bounds = revision.getBoundsMm();
if (bounds.getMin().getX() == Double.MAX_VALUE || bounds.getMin().getY() == Double.MAX_VALUE || bounds.getMin().getZ() == Double.MAX_VALUE || bounds.getMax().getX() == -Double.MAX_VALUE || bounds.getMax().getY() == -Double.MAX_VALUE || bounds.getMax().getZ() == -Double.MAX_VALUE) {
// Probably no objects or weird error, let's skip this one
continue;
}
Vector3f min = bounds.getMin();
Vector3f max = bounds.getMax();
// }
if (min.getX() < totalMin[0]) {
totalMin[0] = min.getX();
}
if (min.getY() < totalMin[1]) {
totalMin[1] = min.getY();
}
if (min.getZ() < totalMin[2]) {
totalMin[2] = min.getZ();
}
if (max.getX() > totalMax[0]) {
totalMax[0] = max.getX();
}
if (max.getY() > totalMax[1]) {
totalMax[1] = max.getY();
}
if (max.getZ() > totalMax[2]) {
totalMax[2] = max.getZ();
}
}
SBounds sBounds = new SBounds();
SVector3f sMin = new SVector3f();
SVector3f sMax = new SVector3f();
sBounds.setMin(sMin);
sBounds.setMax(sMax);
sMin.setX(totalMin[0]);
sMin.setY(totalMin[1]);
sMin.setZ(totalMin[2]);
sMax.setX(totalMax[0]);
sMax.setY(totalMax[1]);
sMax.setZ(totalMax[2]);
return sBounds;
} catch (Exception e) {
return handleException(e);
} finally {
session.close();
}
}
Aggregations