From 1c26cea5fc02b782c522d5a0a1516be84bf38d87 Mon Sep 17 00:00:00 2001 From: Torrin Leonard <82110564+torrinworx@users.noreply.github.com> Date: Thu, 25 Aug 2022 09:41:22 -0400 Subject: [PATCH] Trying to implement logging for debug --- __init__.py | 24 +++++++++++++++++++++--- main/dna_generator.py | 43 +++++++++++++++++++++++++++++-------------- main/exporter.py | 36 +++++++++++++++++++++--------------- main/helpers.py | 17 ----------------- main/intermediate.py | 4 +--- main/logic.py | 1 - 6 files changed, 72 insertions(+), 53 deletions(-) diff --git a/__init__.py b/__init__.py index 7c755fb..5655103 100644 --- a/__init__.py +++ b/__init__.py @@ -160,7 +160,9 @@ class BMNFTData: sender_from: str email_password: str receiver_to: str + enable_debug: bool + log_path: str custom_fields: dict = None fail_state: Any = False @@ -225,7 +227,9 @@ def getBMNFTData(): sender_from=bpy.context.scene.input_tool.sender_from, email_password=bpy.context.scene.input_tool.email_password, receiver_to=bpy.context.scene.input_tool.receiver_to, - enable_debug=bpy.context.scene.input_tool.enable_debug + + enable_debug=bpy.context.scene.input_tool.enable_debug, + log_path=bpy.context.scene.input_tool.log_path, ) return data @@ -540,6 +544,13 @@ class BMNFTS_PGT_Input_Properties(bpy.types.PropertyGroup): description="Allows you to run Blend_My_NFTs without generating any content files and includes more " "console information." ) + log_path: bpy.props.StringProperty( + name="Debug Log Path", + description="Path where BMNFT_Log.txt is located.", + default="", + maxlen=1024, + subtype="FILE_PATH" + ) # API Panel properties: api_key: bpy.props.StringProperty( @@ -669,6 +680,7 @@ class ResumeFailedBatch(bpy.types.Operator): receiver_to=render_settings["receiver_to"], enable_debug=render_settings["enable_debug"], + log_path=render_settings["log_path"], fail_state=_fail_state, failed_batch=_failed_batch, @@ -1069,6 +1081,8 @@ class BMNFTS_PT_Other(bpy.types.Panel): row = layout.row() row.prop(input_tool_scene, "enable_debug") + if bpy.context.scene.input_tool.enable_debug: + row.prop(input_tool_scene, "log_path") row = layout.row() @@ -1080,8 +1094,12 @@ class BMNFTS_PT_Other(bpy.types.Panel): icon='URL').url = "https://github.com/torrinworx/Blend_My_NFTs" row = layout.row() - row.operator("wm.url_open", text="YouTube Tutorials", - icon='URL').url = "https://www.youtube.com/watch?v=ygKJYz4BjRs&list=PLuVvzaanutXcYtWmPVKu2bx83EYNxLRsX" + row.operator( + "wm.url_open", + text="YouTube Tutorials", + icon='URL' + ).url = "https://www.youtube.com/watch?v=ygKJYz4BjRs&list=PLuVvzaanutXcYtWmPVKu2bx83EYNxLRsX" + row = layout.row() row.operator("wm.url_open", text="Join Our Discord Community!", icon='URL').url = "https://discord.gg/UpZt5Un57t" diff --git a/main/dna_generator.py b/main/dna_generator.py index d98060d..1b5314b 100644 --- a/main/dna_generator.py +++ b/main/dna_generator.py @@ -5,11 +5,19 @@ import os import time import json import random +import logging import traceback from functools import partial + from . import logic, material_generator, helpers from .helpers import TextColors +logging.basicConfig( + level=logging.INFO, + format='[%(levelname)s][%(asctime)s]\n%(message)s\n', + datefmt='%Y-%m-%d %H:%M:%S' +) + def generate_nft_dna( collection_size, @@ -18,7 +26,6 @@ def generate_nft_dna( logic_file, enable_materials, materials_file, - enable_debug ): """ Returns batchDataDictionary containing the number of NFT combinations, hierarchy, and the dna_list. @@ -95,7 +102,7 @@ def generate_nft_dna( single_dna = ''.join(single_dna.split('-', 1)) return single_dna - def singleCompleteDNA(): + def single_complete_dna(): """ This function applies Rarity and Logic to a single DNA created by createDNASingle() if Rarity or Logic specified """ @@ -103,21 +110,25 @@ def generate_nft_dna( single_dna = "" if not enable_rarity: single_dna = create_dna_random(hierarchy) - # print("============") - # print(f"Original DNA: {single_dna}") + logging.debug(f"============\nOriginal DNA: {single_dna}") + print("============") + print(f"Original DNA: {single_dna}") + if enable_rarity: single_dna = create_dna_rarity(hierarchy) - # print(f"Rarity DNA: {single_dna}") + logging.debug(f"Rarity DNA: {single_dna}") + print(f"Rarity DNA: {single_dna}") if enable_logic: single_dna = logic.logicafy_dna_single(hierarchy, single_dna, logic_file, enable_rarity) - # print(f"Logic DNA: {single_dna}") + logging.debug(f"Logic DNA: {single_dna}") + print(f"Logic DNA: {single_dna}") if enable_materials: single_dna = material_generator.apply_materials(hierarchy, single_dna, materials_file, enable_rarity) - # print(f"Materials DNA: {single_dna}") - - # print("============\n") + logging.debug(f"Materials DNA: {single_dna}\n============\n") + print(f"Materials DNA: {single_dna}") + print("============\n") return single_dna @@ -129,7 +140,7 @@ def generate_nft_dna( dna_set_return = set() for i in range(collection_size): - dna_push_to_list = partial(singleCompleteDNA) + dna_push_to_list = partial(single_complete_dna) dna_set_return |= {''.join([dna_push_to_list()]) for _ in range(collection_size - len(dna_set_return))} @@ -151,8 +162,6 @@ def generate_nft_dna( dna_list = create_dna_list() - # Messages: - helpers.raise_warning_collection_size(dna_list, collection_size) # Data stored in batchDataDictionary: @@ -234,7 +243,8 @@ def send_to_record( materials_file, blend_my_nfts_output, batch_json_save_path, - enable_debug + enable_debug, + log_path ): """ Creates NFTRecord.json file and sends "batch_data_dictionary" to it. NFTRecord.json is a permanent record of all DNA @@ -243,6 +253,12 @@ def send_to_record( repeat DNA. """ + if enable_debug: + logging.basicConfig( + filename=os.path.join(log_path, "BMNFTS_Log.txt"), + level=logging.DEBUG + ) + # Checking Scene is compatible with BMNFTs: helpers.check_scene() @@ -280,7 +296,6 @@ def send_to_record( logic_file, enable_materials, materials_file, - enable_debug, ) nft_record_save_path = os.path.join(blend_my_nfts_output, "NFTRecord.json") diff --git a/main/exporter.py b/main/exporter.py index fa3d134..e51e3b3 100644 --- a/main/exporter.py +++ b/main/exporter.py @@ -96,6 +96,7 @@ def save_generation_state(input): "receiver_to": input.receiver_to, "enable_debug": input.enable_debug, + "log_path": input.log_path, "custom_fields": input.custom_fields, }, @@ -258,9 +259,9 @@ def render_and_save_nfts(input): except KeyError: raise TypeError( f"\n{TextColors.ERROR}Blend_My_NFTs Error:\n" - f"The Collection '{j}' appears to be missing or has been renamed. If you made any changes to " - f"your .blend file scene, ensure you re-create your NFT Data so Blend_My_NFTs can read your " - f"scene. For more information see:{TextColors.RESET}" + f"The Collection '{j}' appears to be missing or has been renamed. If you made any changes " + f"to your .blend file scene, ensure you re-create your NFT Data so Blend_My_NFTs can read " + f"your scene. For more information see:{TextColors.RESET}" f"\nhttps://github.com/torrinworx/Blend_My_NFTs#blender-file-organization-and-structure\n" ) @@ -354,7 +355,7 @@ def render_and_save_nfts(input): if not os.path.exists(animation_folder): os.makedirs(animation_folder) - if input.animation_file_format =="MP4": + if input.animation_file_format == 'MP4': bpy.context.scene.render.filepath = animation_path bpy.context.scene.render.image_settings.file_format = "FFMPEG" @@ -362,7 +363,7 @@ def render_and_save_nfts(input): bpy.context.scene.render.ffmpeg.codec = 'H264' bpy.ops.render.render(animation=True) - elif input.animation_file_format =='PNG': + elif input.animation_file_format == 'PNG': if not os.path.exists(animation_path): os.makedirs(animation_path) @@ -370,7 +371,7 @@ def render_and_save_nfts(input): bpy.context.scene.render.image_settings.file_format = input.animation_file_format bpy.ops.render.render(animation=True) - elif input.animation_file_format =='TIFF': + elif input.animation_file_format == 'TIFF': if not os.path.exists(animation_path): os.makedirs(animation_path) @@ -421,7 +422,7 @@ def render_and_save_nfts(input): # if obj.name in remove_objects: # obj.select_set(False) - if input.model_file_format =='GLB': + if input.model_file_format == 'GLB': check_failed_exists(f"{model_path}.glb") bpy.ops.export_scene.gltf( filepath=f"{model_path}.glb", @@ -430,7 +431,7 @@ def render_and_save_nfts(input): export_keep_originals=True, use_selection=True ) - if input.model_file_format =='GLTF_SEPARATE': + if input.model_file_format == 'GLTF_SEPARATE': check_failed_exists(f"{model_path}.gltf") check_failed_exists(f"{model_path}.bin") bpy.ops.export_scene.gltf( @@ -440,7 +441,7 @@ def render_and_save_nfts(input): export_keep_originals=True, use_selection=True ) - if input.model_file_format =='GLTF_EMBEDDED': + if input.model_file_format == 'GLTF_EMBEDDED': check_failed_exists(f"{model_path}.gltf") bpy.ops.export_scene.gltf( filepath=f"{model_path}.gltf", @@ -449,35 +450,35 @@ def render_and_save_nfts(input): export_keep_originals=True, use_selection=True ) - elif input.model_file_format =='FBX': + elif input.model_file_format == 'FBX': check_failed_exists(f"{model_path}.fbx") bpy.ops.export_scene.fbx( filepath=f"{model_path}.fbx", check_existing=True, use_selection=True ) - elif input.model_file_format =='OBJ': + elif input.model_file_format == 'OBJ': check_failed_exists(f"{model_path}.obj") bpy.ops.export_scene.obj( filepath=f"{model_path}.obj", check_existing=True, use_selection=True, ) - elif input.model_file_format =='X3D': + elif input.model_file_format == 'X3D': check_failed_exists(f"{model_path}.x3d") bpy.ops.export_scene.x3d( filepath=f"{model_path}.x3d", check_existing=True, use_selection=True ) - elif input.model_file_format =='STL': + elif input.model_file_format == 'STL': check_failed_exists(f"{model_path}.stl") bpy.ops.export_mesh.stl( filepath=f"{model_path}.stl", check_existing=True, use_selection=True ) - elif input.model_file_format =='VOX': + elif input.model_file_format == 'VOX': check_failed_exists(f"{model_path}.vox") bpy.ops.export_vox.some_data(filepath=f"{model_path}.vox") @@ -577,7 +578,12 @@ def render_and_save_nfts(input): batch_info = {"Batch Render Time": batch_complete_time, "Number of NFTs generated in Batch": x - 1, "Average time per generation": batch_complete_time / x - 1} - batch_info_folder = os.path.join(input.nft_batch_save_path, "Batch" + str(input.batch_to_generate), "batch_info.json") + batch_info_folder = os.path.join( + input.nft_batch_save_path, + "Batch" + str(input.batch_to_generate), + "batch_info.json" + ) + save_batch(batch_info, batch_info_folder) # Send Email that Batch is complete: diff --git a/main/helpers.py b/main/helpers.py index 15e9f25..c86128d 100644 --- a/main/helpers.py +++ b/main/helpers.py @@ -10,23 +10,6 @@ from shutil import get_terminal_size from collections import Counter, defaultdict -# ======== ENABLE DEBUG ======== # - -# This section is used for debugging, coding, or general testing purposes. - - -def enable_debug(enable_debug_bool): - if enable_debug_bool: - import logging - - logging.basicConfig( - filename="./log.txt", - level=logging.DEBUG, - format='[%(levelname)s][%(asctime)s]\n%(message)s\n', - datefmt='%Y-%m-%d %H:%M:%S' - ) - - # ======== CONSTANTS ======== # # Constants are used for storing or updating constant values that may need to be changes depending on system diff --git a/main/intermediate.py b/main/intermediate.py index ae0eece..0088748 100644 --- a/main/intermediate.py +++ b/main/intermediate.py @@ -29,7 +29,6 @@ def send_to_record(input, reverse_order=False): "IF": item_list1.split(','), rule_type: item_list2.split(',') } - print(rule_type) num += 1 else: input.logic_file = {} @@ -42,8 +41,6 @@ def send_to_record(input, reverse_order=False): "IF": item_list1.split(','), rule_type: item_list2.split(',') } - print(rule_type) - num += 1 dna_generator.send_to_record( @@ -58,6 +55,7 @@ def send_to_record(input, reverse_order=False): input.blend_my_nfts_output, input.batch_json_save_path, input.enable_debug, + input.log_path ) diff --git a/main/logic.py b/main/logic.py index 86dafc0..7f2b0de 100644 --- a/main/logic.py +++ b/main/logic.py @@ -261,7 +261,6 @@ def logicafy_dna_single(hierarchy, single_dna, logic_file, enable_rarity): did_reconstruct = False for rule in logic_file: # Items from 'IF' key for a given rule - print(logic_file) if_dict = create_dicts(hierarchy, logic_file[rule]["IF"], "IF") result_dict_type = ""