-
Clemens Barth authored
Comments ======== This is the fusion of the 3 atomic blender addons from Blender 2.79: 1. PDB (I/O addon for .pdb files, was in trunk before) 2. XYZ (I/O addon for .xyz files, was in contrib before) 3. Utilities (panel for modifying atomic structures, was in contrib before), into one single addon called ‘Atomic Blender PDB/XYZ’.
Clemens Barth authoredComments ======== This is the fusion of the 3 atomic blender addons from Blender 2.79: 1. PDB (I/O addon for .pdb files, was in trunk before) 2. XYZ (I/O addon for .xyz files, was in contrib before) 3. Utilities (panel for modifying atomic structures, was in contrib before), into one single addon called ‘Atomic Blender PDB/XYZ’.
xyz_gui.py 7.47 KiB
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
import bpy
from bpy.types import Operator, AddonPreferences
from bpy_extras.io_utils import ImportHelper, ExportHelper
from bpy.props import (
StringProperty,
BoolProperty,
EnumProperty,
IntProperty,
FloatProperty,
)
from io_mesh_atomic.xyz_import import import_xyz
from io_mesh_atomic.xyz_import import ALL_FRAMES
from io_mesh_atomic.xyz_import import ELEMENTS
from io_mesh_atomic.xyz_import import STRUCTURE
from io_mesh_atomic.xyz_import import build_frames
from io_mesh_atomic.xyz_export import export_xyz
# -----------------------------------------------------------------------------
# Operators
# This is the class for the file dialog.
class IMPORT_OT_xyz(Operator, ImportHelper):
bl_idname = "import_mesh.xyz"
bl_label = "Import XYZ (*.xyz)"
bl_options = {'PRESET', 'UNDO'}
filename_ext = ".xyz"
filter_glob: StringProperty(default="*.xyz", options={'HIDDEN'},)
use_camera: BoolProperty(
name="Camera", default=False,
description="Do you need a camera?")
use_lamp: BoolProperty(
name="Lamp", default=False,
description = "Do you need a lamp?")
ball: EnumProperty(
name="Type of ball",
description="Choose ball",
items=(('0', "NURBS", "NURBS balls"),
('1', "Mesh" , "Mesh balls"),
('2', "Meta" , "Metaballs")),
default='0',)
mesh_azimuth: IntProperty(
name = "Azimuth", default=32, min=1,
description = "Number of sectors (azimuth)")
mesh_zenith: IntProperty(
name = "Zenith", default=32, min=1,
description = "Number of sectors (zenith)")
scale_ballradius: FloatProperty(
name = "Balls", default=1.0, min=0.0001,
description = "Scale factor for all atom radii")
scale_distances: FloatProperty (
name = "Distances", default=1.0, min=0.0001,
description = "Scale factor for all distances")
atomradius: EnumProperty(
name="Type of radius",
description="Choose type of atom radius",
items=(('0', "Pre-defined", "Use pre-defined radius"),
('1', "Atomic", "Use atomic radius"),
('2', "van der Waals", "Use van der Waals radius")),
default='0',)
use_center: BoolProperty(
name = "Object to origin (first frames)", default=False,
description = "Put the object into the global origin, the first frame only")
use_center_all: BoolProperty(
name = "Object to origin (all frames)", default=True,
description = "Put the object into the global origin, all frames")
datafile: StringProperty(
name = "", description="Path to your custom data file",
maxlen = 256, default = "", subtype='FILE_PATH')
use_frames: BoolProperty(
name = "Load all frames?", default=False,
description = "Do you want to load all frames?")
skip_frames: IntProperty(
name="", default=0, min=0,
description="Number of frames you want to skip.")
images_per_key: IntProperty(
name="", default=1, min=1,
description="Choose the number of images between 2 keys.")
# This thing here just guarantees that the menu entry is not active when the
# check box in the addon preferences is not activated! See __init__.py
@classmethod
def poll(cls, context):
pref = context.preferences
return pref.addons[__package__].preferences.bool_xyz
def draw(self, context):
layout = self.layout
row = layout.row()
row.prop(self, "use_camera")
row.prop(self, "use_lamp")
row = layout.row()
col = row.column()
col.prop(self, "ball")
row = layout.row()
row.active = (self.ball == "1")
col = row.column(align=True)
col.prop(self, "mesh_azimuth")
col.prop(self, "mesh_zenith")
row = layout.row()
col = row.column()
col.label(text="Scaling factors")
col = row.column(align=True)
col.prop(self, "scale_ballradius")
col.prop(self, "scale_distances")
row = layout.row()
row.prop(self, "use_center")
row = layout.row()
row.prop(self, "use_center_all")
row = layout.row()
row.prop(self, "atomradius")
row = layout.row()
row.prop(self, "use_frames")
row = layout.row()
row.active = self.use_frames
col = row.column()
col.label(text="Skip frames")
col = row.column()
col.prop(self, "skip_frames")
row = layout.row()
row.active = self.use_frames
col = row.column()
col.label(text="Frames/key")
col = row.column()
col.prop(self, "images_per_key")
def execute(self, context):
del ALL_FRAMES[:]
del ELEMENTS[:]
del STRUCTURE[:]
# This is to determine the path.
filepath_xyz = bpy.path.abspath(self.filepath)
# Execute main routine
import_xyz(self.ball,
self.mesh_azimuth,
self.mesh_zenith,
self.scale_ballradius,
self.atomradius,
self.scale_distances,
self.use_center,
self.use_center_all,
self.use_camera,
self.use_lamp,
filepath_xyz)
# Load frames
if len(ALL_FRAMES) > 1 and self.use_frames:
build_frames(self.images_per_key, self.skip_frames)
return {'FINISHED'}
# This is the class for the file dialog of the exporter.
class EXPORT_OT_xyz(Operator, ExportHelper):
bl_idname = "export_mesh.xyz"
bl_label = "Export XYZ (*.xyz)"
filename_ext = ".xyz"
filter_glob: StringProperty(
default="*.xyz", options={'HIDDEN'},)
atom_xyz_export_type: EnumProperty(
name="Type of Objects",
description="Choose type of objects",
items=(('0', "All", "Export all active objects"),
('1', "Elements", "Export only those active objects which have"
" a proper element name")),
default='1',)
# This thing here just guarantees that the menu entry is not active when the
# check box in the addon preferences is not activated! See __init__.py
@classmethod
def poll(cls, context):
pref = context.preferences
return pref.addons[__package__].preferences.bool_xyz
def draw(self, context):
layout = self.layout
row = layout.row()
row.prop(self, "atom_xyz_export_type")
def execute(self, context):
export_xyz(self.atom_xyz_export_type, bpy.path.abspath(self.filepath))
return {'FINISHED'}