I know this is possible with obj and other formats that Blender understands, however I am trying to import several .ascii files, which Blender cannot normally open and requires a plugin. The plugin works fine, but because I have so many of these files I would like to make an automated importer, similar to those for .obj.
Where should I look, or what should I try?
Something like this?
Though you will have to bring your own importer or operator here:
'txt':'bpy.ops.import_scene.your_own_ascii_importer'
Yes, thank you.
I am trying to make the importer, however ops.py from bpy cannot call the operator.
Traceback (most recent call last):
File "\Text", line 23, in <module>
File "\Text", line 20, in import_models_from_directory
File "C:\blender-git\build_windows_x64_vc16_Release\bin\Release\3.0\scripts\modules\bpy\ops.py", line 132, in __call__
ret = _op_call(self.idname_py(), None, kw)
AttributeError: Calling operator "bpy.ops.import_mesh.ascii" error, could not be found
Error: Python script failed, check the message in the system console
I added this to the init.py file for the plugin:
lass ImportXNA(bpy.types.Operator, ImportHelper):
"""Load a XNALara file"""
bl_idname = "import_mesh.xna"
bl_label = "Import XNA"
bl_options = {'PRESET','UNDO'}
files: CollectionProperty(
name="File Path",
description="File path used for importing the XNA file",
type=bpy.types.OperatorFileListElement,
)
#I don't know what I am doing :[
hide_props_region: BoolProperty(
name="Hide Operator Properties",
description="Collaps the region displaying the operator settings",
default=True,
)
directory: StringProperty()
filename_ext = ".ascii"
filter_glob: StringProperty(
default="*.ascii;*.mesh",
options={'HIDDEN'}
)
def exeute(self, context):
import os
from . import import_xnalara_model
print('Started executing')
context.window.cursor_set('WAIT')
paths = [
os.path.join(self.directory, name.name)
for name in self.files
]
if not paths:
paths.append(self.filepath)
for path in paths:
#import_xnalara_model.load(self, context, path)
import_xnalara_model.loadXpsFile(self, path)
context.window.cursor_set('DEFAULT')
return {'FINISHED'}
I added the class so it would register and unregister as well. What should I do to fix the ops error?
I just updated the previous code I made earlier. Do only class initialization and call the method. You can attach it to any GUI you have.
import bpy
import os
class MultiImporter:
def __init__(self):
# directory that contains all of the models
self.dirpath = ''
# models with this extensions that will be imported
self.importedext = ''
# all of the supported extensions with their
# corresponding import function
self.extensions = {
'fbx' : bpy.ops.import_scene.fbx,
'obj' : bpy.ops.import_scene.obj,
'ascii' : bpy.ops.xps_tools.import_model
}
def import_models_from_directory(self, dir, ext):
# validate extension
if ext not in self.extensions.keys():
print(f'extension {ext} is not supported')
return
# validate directory
dir = bpy.path.abspath(dir)
if not os.path.isdir(dir):
print(f'directory [{dir}] does not exist')
return
# get all files with this extension
files = []
for f in os.listdir(dir):
# extension of file must be the same
if ext == f.split('.')[-1]:
files.append(os.path.join(dir, f))
# make sure that enough files are loaded
if len(files) == 0:
print(f'could not find files with extension {ext}')
return
# otherwise import files using the specified function
for f in files:
self.extensions[ext](filepath=f)
imp = MultiImporter()
imp.import_models_from_directory(
r'E:\graphics\blender\collections\00\[HS] Bowsette',
'ascii'
)
1 Like