Java插件IFCToolsProject(⼀)
Java插件IFC Tools Project(⼀)
  这个插件主要由三部分组成:
    (1) 每个 IFC 实体都有相对应的 Java 类。每个Java类都提供能够读取和设置对应 IFC 实体属性的⽅法,利⽤这些类的⽅法可以⾮常⽅便地读取和设置包括反转属性在内的所有属性。IFC 框架体系中所有实体的继承结构都体现到了相对应的 Java 类的继承结构。IFC 框架体系中所有定义类型和实体类型都映射为相应的接⼝。
    (2)IFC ⽂件解析器,可以解析 IFC STEP ⽂件和IFC Zip ⽂件。
    (3)核⼼ IFC 模型 IfcModel,⽤来读取 IFC ⽂件,操 作 IFC 模型中所 包 含 的 IFC 实 体,增 加 与 删 除 IFC实体。
  下⾯主要介绍插件IFC Tools Project的使⽤。
  使⽤IFC Java⼯具箱,可以完全访问基于IFC的BIM模型。 这意味着可以轻松读取,写⼊,修改或创建IFC⽂件。 该⼯具箱是⽤Java实现的。 ⽽且,完全⾯向对象和早期绑定⽤于处理IFC实体。 具有其属性的对应Java类代表每个IFC实体。 从这个意义上讲,可以实例化并处理任何对象。
  IFC Java⼯具箱⽀持在IFC⽅案中指定的所有实体的任何显式和逆属性。 尚不⽀持派⽣的属性,功能和规则。 交换IFC模型所⽀持的⽂件格式为:
STEP (according to ISO 10303-21), and
IFCZIP (according to buildingSMART implementer agreement CV-2x3-154).
1.⼯具箱版本
  由于IFC⽅案的版本不同,我们提供了最新版本的IFC的⼯具箱:
    IFC2X3 Java⼯具箱,⽤于访问和创建IFC2x3⽂件
    IFC4 Java⼯具箱,⽤于访问和创建IFC4⽂件
  此外,除了提供的IFC之外,我们还可以快速实施其他⼯具箱。
2. IFC JAVA⼯具箱的设计
3.读取IFC⽂件
  IFC JAVA⼯具箱可以从实现java.io.InputStream的任何数据源(例如,⽂件系统中的本地⽂件,Web服务器上的远程⽂件或数据库中存储的⽂件)中读取IFC STEP⽂件和IFCZIP⽂件。 调⽤以下读取⽅法之⼀后,⼯具箱将加载IFC⽂件并初始化所描述的IFC实体。 这些对象可以使⽤IfcModel的⽅法进⾏访问和操作。 以下代码⾏演⽰了如何从不同的数据源读取IFC STEP⽂件:
//create a new instance of IfcModel
IfcModel ifcModel =new IfcModel();
//load an IFC STEP file from the file system
File stepFile =new File("C:\\myfile.ifc");
//... or load an IFC STEP file from a web server
URL stepURL =new URL("ifchomepage/myifcstepfile");
/
/... or load an IFC STEP file from any other data source,
//that implements java.io.InputStream (e.g. database connection)
InputStream stepStream = StepFile("1234");
类似读取IFCZIP⽂件:
//create a new instance of IfcModel
IfcModel ifcModel =new IfcModel();
//load an IFCZIP file from the file system
File ifczipFile =new File("C:\\myfile.ifczip");
//... or load an IFCZIP file from a web server
URL ifczipURL =new URL("ifchomepage/myifczipfile");
//... or load an IFCZIP file from any other data source,
//that implements java.io.InputStream (e.g. database connection)
InputStream ifczipStream = IfcZipFile("1234");
4.写⼊IFC⽂件
  IFC JAVA⼯具箱可以写⼊IFC STEP⽂件和IFCZIP⽂件。 如果要导出当前IfcModel的内容,请调⽤相应的写⼊⽅法之⼀。 以下代码⾏演⽰了如何将IFC STEP⽂件写⼊不同的数据接收器:
//write an IFC STEP file to the file system
File stepFile =new File("C:\\myfile.ifc");
ifcModel.writeStepfile(stepFile);
//... or write an IFC STEP file to a web server
URL stepURL =new URL("ifchomepage/myifcstepfile");
ifcModel.writeStepfile(stepURL);
//... or write an IFC STEP file to any other data sink,
//that implements java.io.OutputStream (e.g. database connection)
OutputStream stepStream = StepFile("1234");
ifcModel.writeStepfile(stepStream);
写⼊IFCZIP⽂件:
//write an IFCZIP file to the file system
File ifczipFile =new File("C:\\myfile.ifczip");
ifcModel.writeIfcZipFile(ifczipFile);
/
java stream
/... or write an IFCZIP file to a web server
URL ifczipURL =new URL("ifchomepage/myifczipfile");
ifcModel.writeIfcZipFile(ifczipURL);
//... or write an IFCZIP file to any other data sink,
//that implements java.io.OutputStream (e.g. database connection)
OutputStream ifczipStream = IfcZipFile("1234");
ifcModel.writeIfcZipFile(ifczipStream);
5.获取特定的IFC实体
  加载IFC⽂件后,可能需要访问这些对象。 在IFC中,有⼀个根实体可以作为代码的起点,所谓的IfcProject代表任何分解树的根。 可以访问此实体,如下所⽰:
IfcProject ifcProject = IfcProject();
  如果要获取包含模型中包含的IFC实体的所有实例的集合,请调⽤:
Collection<ClassInterface> ifcObjects = IfcObjects();
  通常,您只需要特定类型的对象。 因此,可以调⽤IfcModel的getCollections(Class classType)⽅法。 它将返回具有指定类型的所有实例的集合。 这包括来⾃指定类型的⼦类型的实例(例如,IfcWall是IfcProduct的⼦类型):
//get all IfcWall instances contained in the model
Collection<IfcWall> walls = Collection(IfcWall.class);
//get all IfcProduct instances contained in the model (includes all walls)
Collection<IfcProduct> products = Collection(IfcProduct.class);
  有时,按实体实例名称(即STEP⾏号)查实体很有⽤。 您可以向模型询问特定的实例,也可以按其实例名称对所有对象进⾏排序,如下所⽰:
//get the object with the specified entity instance name
//(e.g. #123 in STEP physical file).
ClassInterface ifcObject = IfcObjectByEntityInstanceName(123);
//get a map of all IFC entities sorted by their entity instance names
SortedMap<Integer, ClassInterface> ifcObjectMap =
  IFC中的某些对象具有全局唯⼀ID(GUID)。 这些对象是IfcRoot的实例。 您可以要求模型使⽤特定的GUID来获取此类实体,如下所⽰:
//get the object with the specified GUID
IfcRoot ifcObject = IfcObjectByID("23j$pkdXqHseOb00sJH0zG");
//multiple query: get the objects with the specified GUIDs
String[] ids ={"23j$pkdXqHseOb00","56k3xydXqHseOb95","49l5xydXqHokOb12"};
Collection<String> idList = Arrays.asList(ids);
Map<String, IfcRoot> ifcObjectsMap = IfcObjectsByIDs(idList);
6.访问IFC实体的属性
  对于IFC实体的每个显式属性,Java类中都有各⾃的get和set⽅法。 使⽤这些⽅法,您可以读取或修改此属性的值:
//read the product representation
IfcWall ifcWall =...
IfcProductRepresentation representation = Representation();
//set a new product representation
IfcProductRepresentation newRep =new IfcProductRepresentation();
newRep.setName(new IfcLabel(new STRING("myRepresentation",true)));
ifcWall.setRepresentation(newRep);
  如果该属性是⼀个集合,那么还有其他⽅法可以向该集合中添加条⽬或从中删除条⽬:
IfcProductRepresentation representation =new IfcProductRepresentation();
IfcRepresentation rep1 =new IfcRepresentation();
//add a new representation to the product representation
representation.addRepresentations(rep1);
//or remove it
  有时,有必要将实体强制转换为特定类型,以访问该类型的属性:
ClassInterface ifcObject =...
if(ifcObject instanceof IfcWall)
{
//cast ifcObject to IfcWall
IfcWall ifcWall =(IfcWall) ifcObject;
IfcProductRepresentation representation = Representation();
...
}
  IFC实体的某些属性是可选的(请参阅IFC计划的官⽅⽂档)。 如果未指定这些属性,则它们在⼯具箱中将为null。 因此,您必须注意这些属性以避免NullPointerException的! 这意味着在继续执⾏代码之前,必须检查这些属性是否不为空:
Name()!= null)
{
IfcLabel name = Name();
...
}
  可以通过相应的get⽅法访问IFC实体的逆属性。 设置⽅法不是必需的,因为它们会⾃动解决。
SET<IfcRelDecomposes> ifcRelDecomposesSet = IsDecomposedBy_Inverse();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。