Вы можете попробовать код выше?
import java.util.ArrayList;
import java.util.List;
import org.bimserver.client.BimServerClient;
import org.bimserver.client.json.JsonBimServerClientFactory;
import org.bimserver.emf.IfcModelInterface;
import org.bimserver.interfaces.objects.SProject;
import org.bimserver.models.ifc2x3tc1.IfcBuildingStorey;
import org.bimserver.models.ifc2x3tc1.IfcDistributionControlElement;
import org.bimserver.models.ifc2x3tc1.IfcObject;
import org.bimserver.models.ifc2x3tc1.IfcRelContainedInSpatialStructure;
import org.bimserver.shared.ChannelConnectionException;
import org.bimserver.shared.UsernamePasswordAuthenticationInfo;
import org.bimserver.shared.exceptions.BimServerClientException;
import org.bimserver.shared.exceptions.ServerException;
import org.bimserver.shared.exceptions.ServiceException;
import org.bimserver.shared.exceptions.UserException;
import org.bimserver.shared.interfaces.ServiceInterface;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Connecting {
List<String> names = new ArrayList<String>();
@GetMapping("/BimServerConnection")
@ResponseBody
public List<String> bimConnection() {
try {
BimServerClient client = isBimServerConnected();
List<SProject> projects = getAllSProjects(client);
names = extractIfcObject(client, projects);
} catch (BimServerClientException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
} catch (ChannelConnectionException e) {
e.printStackTrace();
}
return names;
}
private static BimServerClient isBimServerConnected()
throws BimServerClientException, ServiceException, ChannelConnectionException {
JsonBimServerClientFactory factory = new JsonBimServerClientFactory("http://localhost:8082");
BimServerClient client = factory.create(new UsernamePasswordAuthenticationInfo("admin@bimserver.org", "admin"));
if (client.isConnected()) {
System.out.println("Connected");
}
return client;
}
private static List<SProject> getAllSProjects(BimServerClient client) throws ServerException, UserException {
ServiceInterface serviceInterface = client.getServiceInterface();
List<SProject> projects = serviceInterface.getAllWritableProjects();
return projects;
}
private static List<String> extractIfcObject(BimServerClient client, List<SProject> projects)
throws UserException, ServerException {
List<String> detectorNames = new ArrayList<String>();
for (SProject project : projects) {
if (project.getName().equals("WestRiverSideHospitalFireAlarm_1.ifc")) {
IfcModelInterface model = client.getModel(project, project.getLastRevisionId(), false, true, true);
List<IfcBuildingStorey> controller = new ArrayList<IfcBuildingStorey>();
controller.addAll(model.getAllWithSubTypes(IfcBuildingStorey.class));
List<IfcRelContainedInSpatialStructure> spatialStructure = new ArrayList<IfcRelContainedInSpatialStructure>();
for (IfcBuildingStorey control : controller) {
if(control.getName().equals("Level 5")) {
System.out.println(control.getName());
spatialStructure.addAll(control.getContainsElements());
}
}
List<IfcObject> relatedElements = new ArrayList<IfcObject>();
for (IfcRelContainedInSpatialStructure spl : spatialStructure) {
relatedElements.addAll(spl.getRelatedElements());
}
System.out.println("All Devices");
for (IfcObject ifc : relatedElements) {
if (ifc instanceof IfcDistributionControlElement) {
System.out.println(ifc.getName());
detectorNames.add(ifc.getName());
}
}
}
}
return detectorNames;
}
}
Я специально дал операторы импорта, так как вам нужно указать тип проверяемого вами формата ifc, например, ifc2x3 или ifc4. Это мой код, который я использовал, он отлично работает для меня, просто используйте остальную конечную точку.
просто замените название проекта. Дайте мне знать результат. Вы можете извлечь информацию в соответствии с вашими потребностями.
Примечание: Этот код проверен на BimServer 1.5.111 и ifc2x3
Кроме того, IfcBuildingStorey - это этажи или уровни, а IfcRelContainedInSpatialStructure похожи на некоторые детекторы, поэтому вы можете изменять их в соответствии со своими потребностями.