Search in sources :

Example 1 with Bounds

use of org.bimserver.database.queries.Bounds in project BIMserver by opensourceBIM.

the class Draw2DAABB method createImage.

private void createImage() {
    Graphics graphics = image.getGraphics();
    try (JsonBimServerClientFactory factory = new JsonBimServerClientFactory("http://localhost:8080")) {
        try (BimServerClient client = factory.create(new UsernamePasswordAuthenticationInfo("admin@bimserver.org", "admin"))) {
            List<SProjectSmall> allRelatedProjects = client.getServiceInterface().getAllRelatedProjects(13500417L);
            Bounds totalBounds = new Bounds();
            Bounds screenBounds = new Bounds(0, 0, 0, width, height, 1000);
            for (SProjectSmall projectSmall : allRelatedProjects) {
                if (projectSmall.getLastRevisionId() != -1 && projectSmall.getNrSubProjects() == 0) {
                    SProject project = client.getServiceInterface().getProjectByPoid(projectSmall.getOid());
                    SBounds bounds = client.getServiceInterface().getModelBounds(project.getLastRevisionId());
                    if (bounds != null) {
                        totalBounds.integrate(new Bounds(bounds));
                    }
                }
            }
            System.out.println("Model bounds: " + totalBounds);
            System.out.println("Screen bounds: " + screenBounds);
            for (SProjectSmall projectSmall : allRelatedProjects) {
                if (projectSmall.getLastRevisionId() != -1 && projectSmall.getNrSubProjects() == 0) {
                    SProject project = client.getServiceInterface().getProjectByPoid(projectSmall.getOid());
                    SBounds bounds = client.getServiceInterface().getModelBounds(project.getLastRevisionId());
                    if (bounds != null) {
                        Bounds subModelBounds = new Bounds(bounds);
                        Bounds subModelScreenBounds = subModelBounds.scale(totalBounds, screenBounds);
                    }
                }
            }
        }
    } catch (BimServerClientException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Also used : Graphics(java.awt.Graphics) SBounds(org.bimserver.interfaces.objects.SBounds) UsernamePasswordAuthenticationInfo(org.bimserver.shared.UsernamePasswordAuthenticationInfo) JsonBimServerClientFactory(org.bimserver.client.json.JsonBimServerClientFactory) Bounds(org.bimserver.database.queries.Bounds) SBounds(org.bimserver.interfaces.objects.SBounds) SProjectSmall(org.bimserver.interfaces.objects.SProjectSmall) SProject(org.bimserver.interfaces.objects.SProject) BimServerClientException(org.bimserver.shared.exceptions.BimServerClientException) BimServerClient(org.bimserver.client.BimServerClient) BimServerClientException(org.bimserver.shared.exceptions.BimServerClientException)

Example 2 with Bounds

use of org.bimserver.database.queries.Bounds in project BIMserver by opensourceBIM.

the class Node method add.

public Node add(GeometryObject v, boolean forcedLevel) {
    // TODO do we really have to do this here? What if one of our children takes this one?
    minimumBounds.integrate(v.getBounds());
    if (level != maxDepth && !forcedLevel) {
        int localId = 1;
        for (int x = 0; x <= 1; x++) {
            for (int y = 0; y <= 1; y++) {
                for (int z = 0; z <= 1; z++) {
                    Bounds offset = this.bounds.offset(x, y, z);
                    if (v.getBounds().within(offset)) {
                        Node node = nodes[x * 4 + y * 2 + z];
                        if (node == null) {
                            node = new Node(root, offset, this.level + 1, this.id, localId, maxDepth);
                            nodes[x * 4 + y * 2 + z] = node;
                        }
                        Node addedNode = node.add(v);
                        return addedNode;
                    }
                    localId++;
                }
            }
        }
    }
    // System.out.println(q++ + ", " + this.level);
    if (!values.add(v)) {
    }
    return this;
}
Also used : Bounds(org.bimserver.database.queries.Bounds)

Example 3 with Bounds

use of org.bimserver.database.queries.Bounds in project BIMserver by opensourceBIM.

the class GeometryAccellerator method generateOctree.

private Octree generateOctree(OctreeKey key) {
    LOGGER.info("Generating octree: " + key);
    Long start = System.nanoTime();
    try (DatabaseSession databaseSession = bimServer.getDatabase().createSession(OperationType.READ_ONLY)) {
        Bounds totalBounds = new Bounds();
        for (long roid : key.getRoids()) {
            Revision revision = databaseSession.get(roid, OldQuery.getDefault());
            totalBounds.integrate(revision.getBoundsMm());
        }
        Octree octree = new Octree(totalBounds, 9);
        // Assuming all given roids are of projects that all have the same
        // schema
        Revision revision = databaseSession.get(key.getRoids().iterator().next(), OldQuery.getDefault());
        PackageMetaData packageMetaData = bimServer.getMetaDataManager().getPackageMetaData(revision.getProject().getSchema());
        Set<EClass> excluded = new HashSet<>();
        if (key.getExcludedClasses() != null) {
            for (String exclude : key.getExcludedClasses()) {
                excluded.add(packageMetaData.getEClass(exclude));
            }
        }
        Query query = new Query(packageMetaData);
        QueryPart queryPart = query.createQueryPart();
        queryPart.addType(packageMetaData.getEClass("IfcProduct"), true, excluded);
        Include product = queryPart.createInclude();
        product.addType(packageMetaData.getEClass("IfcProduct"), true);
        product.addFieldDirect("geometry");
        Include geometryInfo = product.createInclude();
        geometryInfo.addType(GeometryPackage.eINSTANCE.getGeometryInfo(), false);
        geometryInfo.addFieldDirect("data");
        geometryInfo.addFieldDirect("boundsMm");
        Include boundsInclude = geometryInfo.createInclude();
        boundsInclude.addType(GeometryPackage.eINSTANCE.getBounds(), false);
        boundsInclude.addFieldDirect("min");
        boundsInclude.addFieldDirect("max");
        Include dataInclude = geometryInfo.createInclude();
        dataInclude.addType(GeometryPackage.eINSTANCE.getGeometryData(), false);
        dataInclude.addFieldDirect("boundsMm");
        Include dataBoundsInclude = dataInclude.createInclude();
        dataBoundsInclude.addType(GeometryPackage.eINSTANCE.getBounds(), false);
        dataBoundsInclude.addFieldDirect("min");
        dataBoundsInclude.addFieldDirect("max");
        QueryObjectProvider queryObjectProvider = new QueryObjectProvider(databaseSession, bimServer, query, key.getRoids(), packageMetaData);
        HashMapVirtualObject next = queryObjectProvider.next();
        Map<Long, GeometryDataObject> map = new HashMap<>();
        while (next != null) {
            AbstractHashMapVirtualObject geometry = next.getDirectFeature(packageMetaData.getEReference("IfcProduct", "geometry"));
            if (geometry != null) {
                float density = (float) geometry.get("density");
                long geometryDataId = (long) geometry.get("data");
                AbstractHashMapVirtualObject boundsMm = geometry.getDirectFeature(GeometryPackage.eINSTANCE.getGeometryInfo_BoundsMm());
                GeometryDataObject geometryDataObject = null;
                if (key.getGeometryIdsToReuse().contains(geometryDataId)) {
                    // Special case, we now have to use the complete
                    // bounding box of all reused objects, instead of using
                    // the object's aabb
                    HashMapVirtualObject geometryData = (HashMapVirtualObject) geometry.getDirectFeature(GeometryPackage.eINSTANCE.getGeometryInfo_Data());
                    boundsMm = geometryData.getDirectFeature(GeometryPackage.eINSTANCE.getGeometryData_BoundsMm());
                    geometryDataObject = map.get(geometryData.getOid());
                    if (geometryDataObject == null) {
                        geometryDataObject = new GeometryDataObject(geometryData);
                        map.put(geometryData.getOid(), geometryDataObject);
                    }
                }
                if (boundsMm != null) {
                    AbstractHashMapVirtualObject min = boundsMm.getDirectFeature(GeometryPackage.eINSTANCE.getBounds_Min());
                    AbstractHashMapVirtualObject max = boundsMm.getDirectFeature(GeometryPackage.eINSTANCE.getBounds_Max());
                    HashMapVirtualObject geometryData = (HashMapVirtualObject) geometry.getDirectFeature(GeometryPackage.eINSTANCE.getGeometryInfo_Data());
                    int saveableTriangles = (int) geometryData.get("saveableTriangles");
                    int reused = (int) geometryData.get("reused");
                    int triangles = (int) geometryData.get("nrIndices") / 3;
                    org.bimserver.database.queries.Bounds objectBounds = new org.bimserver.database.queries.Bounds((double) min.get("x"), (double) min.get("y"), (double) min.get("z"), (double) max.get("x"), (double) max.get("y"), (double) max.get("z"));
                    GeometryObject geometryObject = new GeometryObject(next.getOid(), next.eClass(), next.getCroid(), saveableTriangles, reused, triangles, density, objectBounds);
                    Node node = octree.add(geometryObject);
                    geometryObject.setTileId(node.getId());
                    geometryObject.setTileLevel(node.getLevel());
                    geometryObject.setGeometryDataObject(geometryDataObject);
                }
            }
            next = queryObjectProvider.next();
        }
        AtomicLong totalTriangles = new AtomicLong();
        octree.traverseBreathFirst(new Traverser() {

            @Override
            public void traverse(Node node) {
                for (GeometryObject geometryObject : node.getValues()) {
                    totalTriangles.addAndGet(geometryObject.getTriangles());
                }
            }
        });
        LOGGER.info("Total triangles: " + totalTriangles);
        octree.moveGeometryDown(new MoveGeometryDownDecider() {

            @Override
            public boolean shouldMoveDown(GeometryObject geometryObject) {
                GeometryDataObject geometryDataObject = geometryObject.getGeometryDataObject();
                if (geometryDataObject == null) {
                    // It's not reused at all
                    return false;
                }
                return false;
            }
        });
        octree.moveUp(new MoveUpDecider() {

            @Override
            public boolean moveUp(Node node) {
                // TODO use more heuristics
                int totalTriangles = 0;
                for (GeometryObject geometryObject : node.getValues()) {
                    totalTriangles += geometryObject.getTriangles();
                }
                if (totalTriangles < 1200) {
                    return true;
                }
                return false;
            }
        });
        long end = System.nanoTime();
        LOGGER.info("Octree generated in " + ((end - start) / 1000000) + " ms");
        return octree;
    } catch (BimserverDatabaseException e) {
        LOGGER.error("", e);
    } catch (IOException e) {
        LOGGER.error("", e);
    } catch (QueryException e) {
        LOGGER.error("", e);
    }
    return null;
}
Also used : Query(org.bimserver.database.queries.om.Query) OldQuery(org.bimserver.database.OldQuery) DatabaseSession(org.bimserver.database.DatabaseSession) HashMap(java.util.HashMap) QueryPart(org.bimserver.database.queries.om.QueryPart) Include(org.bimserver.database.queries.om.Include) BimserverDatabaseException(org.bimserver.BimserverDatabaseException) EClass(org.eclipse.emf.ecore.EClass) AbstractHashMapVirtualObject(org.bimserver.shared.AbstractHashMapVirtualObject) QueryObjectProvider(org.bimserver.database.queries.QueryObjectProvider) HashSet(java.util.HashSet) PackageMetaData(org.bimserver.emf.PackageMetaData) Bounds(org.bimserver.database.queries.Bounds) Bounds(org.bimserver.database.queries.Bounds) IOException(java.io.IOException) AtomicLong(java.util.concurrent.atomic.AtomicLong) QueryException(org.bimserver.database.queries.om.QueryException) Revision(org.bimserver.models.store.Revision) HashMapVirtualObject(org.bimserver.shared.HashMapVirtualObject) AbstractHashMapVirtualObject(org.bimserver.shared.AbstractHashMapVirtualObject) AtomicLong(java.util.concurrent.atomic.AtomicLong)

Aggregations

Bounds (org.bimserver.database.queries.Bounds)3 Graphics (java.awt.Graphics)1 IOException (java.io.IOException)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 AtomicLong (java.util.concurrent.atomic.AtomicLong)1 BimserverDatabaseException (org.bimserver.BimserverDatabaseException)1 BimServerClient (org.bimserver.client.BimServerClient)1 JsonBimServerClientFactory (org.bimserver.client.json.JsonBimServerClientFactory)1 DatabaseSession (org.bimserver.database.DatabaseSession)1 OldQuery (org.bimserver.database.OldQuery)1 QueryObjectProvider (org.bimserver.database.queries.QueryObjectProvider)1 Include (org.bimserver.database.queries.om.Include)1 Query (org.bimserver.database.queries.om.Query)1 QueryException (org.bimserver.database.queries.om.QueryException)1 QueryPart (org.bimserver.database.queries.om.QueryPart)1 PackageMetaData (org.bimserver.emf.PackageMetaData)1 SBounds (org.bimserver.interfaces.objects.SBounds)1 SProject (org.bimserver.interfaces.objects.SProject)1 SProjectSmall (org.bimserver.interfaces.objects.SProjectSmall)1