mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-28 03:05:33 +00:00
Throw in experimental import and bulk rename script
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
#import sys
|
||||
#sys.path.append('C:/Program Files/Python37/Lib/site-packages')
|
||||
import ifcopenshell
|
||||
import ifcopenshell.geom
|
||||
import bpy
|
||||
import time
|
||||
import mathutils
|
||||
|
||||
class ImportIFC():
|
||||
def __init__(self):
|
||||
self.file = None
|
||||
self.settings = ifcopenshell.geom.settings()
|
||||
self.meshes = {}
|
||||
|
||||
def execute(self):
|
||||
self.load_file()
|
||||
n = 0
|
||||
elements = self.file.by_type('IfcElement')
|
||||
for element in elements:
|
||||
self.create_object(element)
|
||||
n += 1
|
||||
if n > 1000:
|
||||
break
|
||||
|
||||
def load_file(self):
|
||||
self.file = ifcopenshell.open('C:/cygwin64/home/moud308/Projects/IFCAudit/big.ifc')
|
||||
|
||||
def create_object(self, element):
|
||||
try:
|
||||
if element.is_a('IfcOpeningElement'):
|
||||
return
|
||||
|
||||
shape = ifcopenshell.geom.create_shape(self.settings, element)
|
||||
mesh_name = 'mesh-{}'.format(shape.geometry.id)
|
||||
|
||||
mesh = self.meshes.get(mesh_name)
|
||||
if mesh is None:
|
||||
mesh = self.create_mesh(element, shape)
|
||||
self.meshes[mesh_name] = mesh
|
||||
else:
|
||||
print('we reused a mesh!')
|
||||
|
||||
materials = shape.geometry.materials
|
||||
for material in materials:
|
||||
if material.has_diffuse:
|
||||
alpha = 1.
|
||||
blender_material = bpy.data.materials.new('mymaterial')
|
||||
blender_material.diffuse_color = material.diffuse + (alpha,)
|
||||
mesh.materials.append(blender_material)
|
||||
|
||||
object = bpy.data.objects.new('{}/{}'.format(element.is_a(), element.Name), mesh)
|
||||
m = shape.transformation.matrix.data
|
||||
matrix = mathutils.Matrix((
|
||||
[m[0], m[1], m[2], 0],
|
||||
[m[3], m[4], m[5], 0],
|
||||
[m[6], m[7], m[8], 0],
|
||||
[m[9], m[10], m[11], 1]))
|
||||
matrix.transpose()
|
||||
object.matrix_world = matrix
|
||||
bpy.context.scene.collection.objects.link(object)
|
||||
except:
|
||||
print('Could not create object for {}: {}/{}'.format(
|
||||
element.GlobalId, element.is_a(), element.Name))
|
||||
|
||||
def create_mesh(self, element, shape):
|
||||
try:
|
||||
mesh = bpy.data.meshes.new(shape.geometry.id)
|
||||
f = shape.geometry.faces
|
||||
v = shape.geometry.verts
|
||||
vertices = [[v[i], v[i + 1], v[i + 2]]
|
||||
for i in range(0, len(v), 3)]
|
||||
faces = [[f[i], f[i + 1], f[i + 2]]
|
||||
for i in range(0, len(f), 3)]
|
||||
mesh.from_pydata(vertices, [], faces)
|
||||
return mesh
|
||||
except:
|
||||
print('Could not create mesh for {}: {}/{}'.format(
|
||||
element.GlobalId, element.is_a(), element.Name))
|
||||
|
||||
print('# Starting import')
|
||||
start = time.time()
|
||||
import_ifc = ImportIFC()
|
||||
import_ifc.execute()
|
||||
print('# Finished in {}s'.format(time.time() - start))
|
||||
Reference in New Issue
Block a user