diff --git a/.classpath b/.classpath index c3745ed..03bddc9 100644 --- a/.classpath +++ b/.classpath @@ -6,6 +6,7 @@ + diff --git a/exe/32/win/IfcGeomServer.exe b/exe/32/win/IfcGeomServer.exe index a5b6513..0166ca0 100644 Binary files a/exe/32/win/IfcGeomServer.exe and b/exe/32/win/IfcGeomServer.exe differ diff --git a/exe/64/linux/IfcGeomServer b/exe/64/linux/IfcGeomServer index 9efc144..8173087 100644 Binary files a/exe/64/linux/IfcGeomServer and b/exe/64/linux/IfcGeomServer differ diff --git a/exe/64/win/IfcGeomServer.exe b/exe/64/win/IfcGeomServer.exe index 114e2da..33df1d0 100644 Binary files a/exe/64/win/IfcGeomServer.exe and b/exe/64/win/IfcGeomServer.exe differ diff --git a/pom.xml b/pom.xml index 780eeee..f06e56b 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 org.opensourcebim ifcopenshellplugin - 0.5.12-SNAPSHOT + 0.5.15-SNAPSHOT UTF-8 @@ -172,7 +172,7 @@ org.opensourcebim pluginbase - 1.5.44-SNAPSHOT + 1.5.73 diff --git a/src/org/ifcopenshell/IfcGeomServerClient.java b/src/org/ifcopenshell/IfcGeomServerClient.java index 484809c..64fa499 100644 --- a/src/org/ifcopenshell/IfcGeomServerClient.java +++ b/src/org/ifcopenshell/IfcGeomServerClient.java @@ -52,7 +52,25 @@ public IfcGeomServerClient(String executableFilename) throws RenderEngineExcepti throw new RenderEngineException(e); } } - + + public void setDeflection(double deflection) throws RenderEngineException { + try { + Deflection d = new Deflection(deflection); + d.write(dos); + } catch (IOException e) { + throw new RenderEngineException(e); + } + } + + public void setLayerSetSlicing(boolean enable) throws RenderEngineException { + try { + Setting s = new Setting(Setting.SettingId.APPLY_LAYERSETS, enable); + s.write(dos); + } catch (IOException e) { + throw new RenderEngineException(e); + } + } + public void loadModel(InputStream inputStream) throws RenderEngineException { IfcModel m = new IfcModel(inputStream); try { @@ -63,18 +81,20 @@ public void loadModel(InputStream inputStream) throws RenderEngineException { } } - private static final int HELLO = 0xff00; - private static final int IFC_MODEL = HELLO + 1; - private static final int GET = IFC_MODEL + 1; - private static final int ENTITY = GET + 1; - private static final int MORE = ENTITY + 1; - private static final int NEXT = MORE + 1; - private static final int BYE = NEXT + 1; - private static final int GET_LOG = BYE + 1; - private static final int LOG = GET_LOG + 1; - - private static String VERSION = "IfcOpenShell-0.5.0-dev"; - + private static final int HELLO = 0xff00; + private static final int IFC_MODEL = HELLO + 1; + private static final int GET = IFC_MODEL + 1; + private static final int ENTITY = GET + 1; + private static final int MORE = ENTITY + 1; + private static final int NEXT = MORE + 1; + private static final int BYE = NEXT + 1; + private static final int GET_LOG = BYE + 1; + private static final int LOG = GET_LOG + 1; + private static final int DEFLECTION = LOG + 1; + private static final int SETTING = DEFLECTION + 1; + + private static String VERSION = "IfcOpenShell-0.5.0-dev-2"; + abstract static class Command { abstract void read_contents(LittleEndianDataInputStream s) throws IOException; abstract void write_contents(LittleEndianDataOutputStream s) throws IOException; @@ -341,7 +361,58 @@ public String getString() { return string; } } - + + static class Deflection extends Command { + private double deflection; + + Deflection(double deflection) { + super(DEFLECTION); + this.deflection = deflection; + } + + @Override + void read_contents(LittleEndianDataInputStream s) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + void write_contents(LittleEndianDataOutputStream s) throws IOException { + s.writeDouble(deflection); + } + } + + static class Setting extends Command { + private int id; + private int value; + + public enum SettingId { + APPLY_LAYERSETS (1 << 17); + + private final int id; + SettingId(int id) { + this.id = id; + } + private int getId() { return id; } + } + + Setting(SettingId i, boolean b) { + super(SETTING); + this.id = i.getId(); + this.value = b ? 1 : 0; + } + + @Override + void read_contents(LittleEndianDataInputStream s) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + void write_contents(LittleEndianDataOutputStream s) throws IOException { + s.writeInt(id); + s.writeInt(value); + } + } + private void terminate() throws RenderEngineException { hasMore = false; if (process == null) return; @@ -402,7 +473,8 @@ private void terminate() throws RenderEngineException { private void askForMore() throws IOException { hasMore = false; - if (dis.readInt() != MORE) { + int readInt = dis.readInt(); + if (readInt != MORE) { LOGGER.error("Invalid command sequence encountered"); throw new IOException(); } diff --git a/src/org/ifcopenshell/IfcOpenShellEngine.java b/src/org/ifcopenshell/IfcOpenShellEngine.java index 064c33e..a88f0d0 100644 --- a/src/org/ifcopenshell/IfcOpenShellEngine.java +++ b/src/org/ifcopenshell/IfcOpenShellEngine.java @@ -40,9 +40,13 @@ public class IfcOpenShellEngine implements RenderEngine { public static final Boolean debug = false; private String filename; private IfcGeomServerClient client; + private double maxDeflection; + private boolean layerSetSlicing; - public IfcOpenShellEngine(String fn) throws IOException { + public IfcOpenShellEngine(String fn, double maxDeflection, boolean layerSetSlicing) throws IOException { filename = fn; + this.maxDeflection = maxDeflection; + this.layerSetSlicing = layerSetSlicing; } @Override @@ -50,6 +54,8 @@ public void init() throws RenderEngineException { LOGGER.debug("Initializing IfcOpenShell engine"); client = new IfcGeomServerClient(filename); + client.setDeflection(maxDeflection); + client.setLayerSetSlicing(layerSetSlicing); } @Override @@ -68,7 +74,8 @@ public RenderEngineModel openModel(InputStream inputStream) throws RenderEngineE client = new IfcGeomServerClient(filename); } try { - return new IfcOpenShellModel(client, filename, inputStream); + IfcOpenShellModel model = new IfcOpenShellModel(client, filename, inputStream); + return model; } catch (IOException e) { throw new RenderEngineException(e); } diff --git a/src/org/ifcopenshell/IfcOpenShellEnginePlugin.java b/src/org/ifcopenshell/IfcOpenShellEnginePlugin.java index caf9deb..4b672dc 100644 --- a/src/org/ifcopenshell/IfcOpenShellEnginePlugin.java +++ b/src/org/ifcopenshell/IfcOpenShellEnginePlugin.java @@ -36,7 +36,13 @@ import java.util.Collections; import org.apache.commons.io.IOUtils; +import org.bimserver.models.store.BooleanType; +import org.bimserver.models.store.DoubleType; import org.bimserver.models.store.ObjectDefinition; +import org.bimserver.models.store.ParameterDefinition; +import org.bimserver.models.store.PrimitiveDefinition; +import org.bimserver.models.store.PrimitiveEnum; +import org.bimserver.models.store.StoreFactory; import org.bimserver.plugins.PluginConfiguration; import org.bimserver.plugins.PluginContext; import org.bimserver.plugins.renderengine.RenderEngine; @@ -48,6 +54,9 @@ import org.slf4j.LoggerFactory; public class IfcOpenShellEnginePlugin implements RenderEnginePlugin { + private static final String MAX_DEFLECTION = "maxdeflection"; + private static final String LAYER_SET_SLICING = "layersetslicing"; + private static final Logger LOGGER = LoggerFactory.getLogger(IfcOpenShellEnginePlugin.class); private boolean initialized = false; @@ -56,7 +65,7 @@ public class IfcOpenShellEnginePlugin implements RenderEnginePlugin { @Override public RenderEngine createRenderEngine(PluginConfiguration pluginConfiguration, String schema) throws RenderEngineException { try { - return new IfcOpenShellEngine(filename); + return new IfcOpenShellEngine(filename, pluginConfiguration.getDouble(MAX_DEFLECTION), pluginConfiguration.getBoolean(LAYER_SET_SLICING)); } catch (IOException e) { throw new RenderEngineException(e); } @@ -125,6 +134,36 @@ public void init(PluginContext pluginContext) throws PluginException { @Override public ObjectDefinition getSettingsDefinition() { - return null; + ObjectDefinition objectDefinition = StoreFactory.eINSTANCE.createObjectDefinition(); + + DoubleType defaultDeflection = StoreFactory.eINSTANCE.createDoubleType(); + defaultDeflection.setValue(1); + + BooleanType defaultLayerSetSlicing = StoreFactory.eINSTANCE.createBooleanType(); + defaultLayerSetSlicing.setValue(false); + + PrimitiveDefinition doubleType = StoreFactory.eINSTANCE.createPrimitiveDefinition(); + doubleType.setType(PrimitiveEnum.DOUBLE); + + PrimitiveDefinition booleanType = StoreFactory.eINSTANCE.createPrimitiveDefinition(); + booleanType.setType(PrimitiveEnum.BOOLEAN); + + ParameterDefinition deflectionParameter = StoreFactory.eINSTANCE.createParameterDefinition(); + deflectionParameter.setName("Max deflection (mm)"); + deflectionParameter.setIdentifier(MAX_DEFLECTION); + deflectionParameter.setDefaultValue(defaultDeflection); + deflectionParameter.setDescription("Maximum deflection in millimeters"); + deflectionParameter.setType(doubleType); + objectDefinition.getParameters().add(deflectionParameter); + + ParameterDefinition layerSetSlicingParameter = StoreFactory.eINSTANCE.createParameterDefinition(); + layerSetSlicingParameter.setName("Layerset slicing"); + layerSetSlicingParameter.setIdentifier(LAYER_SET_SLICING); + layerSetSlicingParameter.setDefaultValue(defaultLayerSetSlicing); + layerSetSlicingParameter.setDescription("Whether to do layerset slicing (http://blog.ifcopenshell.org/2015/10/separating-elements-by-their-material.html)"); + layerSetSlicingParameter.setType(booleanType); + objectDefinition.getParameters().add(layerSetSlicingParameter); + + return objectDefinition; } } \ No newline at end of file diff --git a/src/org/ifcopenshell/IfcOpenShellModel.java b/src/org/ifcopenshell/IfcOpenShellModel.java index ac875a9..9eeb377 100644 --- a/src/org/ifcopenshell/IfcOpenShellModel.java +++ b/src/org/ifcopenshell/IfcOpenShellModel.java @@ -31,6 +31,8 @@ import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import org.bimserver.plugins.renderengine.EntityNotFoundException; @@ -114,4 +116,9 @@ public void setSettings(RenderEngineSettings settings) throws RenderEngineExcept @Override public void setFilter(RenderEngineFilter renderEngineFilter) { } + + @Override + public Collection listInstances() throws RenderEngineException { + return new ArrayList<>(instancesById.values()); + } } \ No newline at end of file diff --git a/test/org/ifcopenshell/test/Test.java b/test/org/ifcopenshell/test/Test.java index 87dad4c..b7b4085 100644 --- a/test/org/ifcopenshell/test/Test.java +++ b/test/org/ifcopenshell/test/Test.java @@ -1,9 +1,11 @@ package org.ifcopenshell.test; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import org.bimserver.plugins.renderengine.RenderEngineException; +import org.bimserver.plugins.renderengine.RenderEngineGeometry; import org.bimserver.plugins.renderengine.RenderEngineInstance; import org.bimserver.plugins.renderengine.RenderEngineModel; import org.ifcopenshell.IfcOpenShellEngine; @@ -15,11 +17,19 @@ public static void main(String[] args) { private void start() { try { - IfcOpenShellEngine ifcOpenShellEngine = new IfcOpenShellEngine("exe/64/win/IfcGeomServer.exe"); - RenderEngineModel model = ifcOpenShellEngine.openModel(new File("E:\\Git\\BIMserver\\TestData\\data\\AC11-FZK-Haus-IFC.ifc")); + IfcOpenShellEngine ifcOpenShellEngine = new IfcOpenShellEngine("exe/64/win/IfcGeomServer.exe", 0.1, false); + ifcOpenShellEngine.init(); +// RenderEngineModel model = ifcOpenShellEngine.openModel(new FileInputStream(new File("D:\\Dropbox\\Shared\\IFC files\\ArenA 2014\\3D IFC\\arena.ifc"))); + RenderEngineModel model = ifcOpenShellEngine.openModel(new FileInputStream(new File("C:\\Git\\TestFiles\\TestData\\data\\06-03-01_windows_in_curved_wall_vw.ifc"))); model.generateGeneralGeometry(); - RenderEngineInstance instance = model.getInstanceFromExpressId(12345); - System.out.println(instance.getTransformationMatrix()); + int nrTriangles = 0; + for (RenderEngineInstance renderEngineInstance : model.listInstances()) { + RenderEngineGeometry geometry = renderEngineInstance.generateGeometry(); + nrTriangles += geometry.getIndices().length / 3; + } + + System.out.println("Nr triangles (1mm): " + nrTriangles); + model.close(); ifcOpenShellEngine.close(); } catch (IOException e) { pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy