3DLIRIOUS / MeshLabXML

Create and run MeshLab XML scripts with Python
GNU Lesser General Public License v2.1
202 stars 43 forks source link

MeshLab did not finish successfully. Review the log file and the input file(s) to see what went wrong. #33

Open HelloMaroon opened 3 years ago

HelloMaroon commented 3 years ago

I'm testing the simplifying function on Colab with installation code: pip install meshlabxm

The whole code is like this:

import os
import sys
import inspect
import meshlabxml as mlx
import platform
import glob
import shutil
import time

'''
Description: It takes around 17 minutes with this script to decimate in bulk a 3M faces Model into 7 resolutions
             [100K, 200K, 300K, 400K, 500K, 600K, 750K]. For improving this time, consider using simplifybulkthreaded.py
             for a threaded implementation.
Usage: python3 simplifybulknothreading.py
You can of course include functionality to take arguments from command line/terminal like I did in simplify.py
DO NOT FORGET to change: Decimations_List, originalMesh (name of original mesh), SimplifiedMesh & Textures
Enjoy!
'''
MESHLABSERVER_PATH = 'C:\Program Files\VCG\MeshLab'
os.environ['PATH'] += os.pathsep + MESHLABSERVER_PATH

def simplify(originalMeshName, SimplifiedMeshName, NumberOfFaces, WithTexture):
    # File names
    FilterScript = 'SimplificationFilter.mlx'  # script file
    original_mesh = originalMeshName # input file
    simplified_mesh = SimplifiedMeshName  # output file
    Num_Of_Faces = int(NumberOfFaces)  # Final Number of Faces

    # Check the input mesh number of faces (so that we do not decimate to a higher number of faces than original mesh)
    MetricsMeshDictionary = {}
    MetricsMeshDictionary = mlx.files.measure_topology(original_mesh)
    # print (MetricsMeshDictionary)
    print('\n Number of faces of original mesh is: ' + str(MetricsMeshDictionary['face_num'] )) 

    if(MetricsMeshDictionary['face_num'] <= Num_Of_Faces):
        #exit the script and print a message about it
        print("\n SORRY your decimated mesh can not have higher number of faces that the input mesh.....")
        print("\n ......................................................................................")
        sys.exit()

    # Creating a folder named as the Number of faces: named '150000'
    print('\n Creating a folder to store the decimated model ...........')
    if not os.path.exists(str(Num_Of_Faces)):
        os.makedirs(str(Num_Of_Faces))

    simplified_meshScript = mlx.FilterScript(file_in=original_mesh, file_out=str(Num_Of_Faces) + '/' + simplified_mesh,
                                             ml_version='2016.12')  # Create FilterScript object

    mlx.remesh.simplify(simplified_meshScript, texture=WithTexture, faces=Num_Of_Faces,
                        target_perc=0.0, quality_thr=1.0, preserve_boundary=True,
                        boundary_weight=1.0, preserve_normal=True,
                        optimal_placement=True, planar_quadric=True,
                        selected=False, extra_tex_coord_weight=1.0)
    print('\n Beginning the process of Decimation ...........')

    simplified_meshScript.run_script()  # Run the script
    os.chdir(str(Num_Of_Faces))
    print('\n Process of Decimation Finished ...')
    print('\n Copying textures (PNG and JPEG) into the folder of decimated model....')

    #go back to parent directory so we can copy the textures to the 3D Model folder
    os.chdir('..')

    #Now checking for textures in the folder of the input mesh.... (plz change if needed)
    allfilelist= os.listdir('.')

    for Afile in allfilelist[:]: 
        if not(Afile.endswith(".png") or Afile.endswith(".PNG") or Afile.endswith(".jpg") or Afile.endswith(".JPG")):
            allfilelist.remove(Afile)
    print('\n Found the LIST of images in PNG and JPEG (textures): ')
    print(allfilelist)

    for file in allfilelist:
        shutil.copy(file, str(Num_Of_Faces))

    print('\n sleeping for 3 seconds.... ')
    time.sleep(3)

Decimations_List = [100]
originalMesh = '/content/drive/MyDrive/DGCNN/airplane_0627.obj'
SimplifiedMesh = '/content/drive/MyDrive/DGCNN/airplane_simpliyed_0627.obj'
Textures = True

print("...........Starting timer for the decimation process............")
initial_time = time.time()

for decimation_resolution in Decimations_List:
    simplify(originalMesh, SimplifiedMesh, decimation_resolution, Textures)

finish_time = time.time()
print("---Decimation Process took: %s seconds ---" % (finish_time - initial_time))
print("\n Done.... have a good day!")

Then when I run this code, I have this bug:

...........Starting timer for the decimation process............
meshlabserver cmd = meshlabserver -l TEMP3D_measure_topology_log.txt -i "/content/drive/MyDrive/DGCNN/airplane_0627.obj" -s "TEMP3D_measure_topology.mlx"
***START OF MESHLAB STDOUT & STDERR***

Houston, we have a problem. 
MeshLab did not finish successfully. Review the log file and the input file(s) to see what went wrong.
MeshLab command: "meshlabserver -l TEMP3D_measure_topology_log.txt -i "/content/drive/MyDrive/DGCNN/airplane_0627.obj" -s "TEMP3D_measure_topology.mlx""
Where do we go from here?
 r  - retry running MeshLab (probably after you've fixed any problems with the input files)
 c  - continue on with the script (probably after you've manually re-run and generated the desired output file(s)
 x  - exit, keeping the TEMP3D files and log
 xd - exit, deleting the TEMP3D files and log
Select r, c, x (default), or xd:

And the code shows that the bug happened in this line:

MetricsMeshDictionary = mlx.files.measure_topology(original_mesh)

Could you please tell me how to solve it? Thanks!

3DLIRIOUS commented 3 years ago

The PyPi package is rather out of date, and unfortunately the update process has changed significantly since I last updated. Until I can release a new version, I'd recommend you try the git version instead and let me know if you still have the same error. You should be able to install using:

pip install -e git+git://github.com/3DLIRIOUS/MeshLabXML#egg=MeshLabXML

HelloMaroon commented 3 years ago

I used this sentence: pip install -e git+git://github.com/3DLIRIOUS/MeshLabXML#egg=MeshLabXML and this is the result:

Obtaining MeshLabXML from git+git://github.com/3DLIRIOUS/MeshLabXML#egg=MeshLabXML
  Cloning git://github.com/3DLIRIOUS/MeshLabXML to ./src/meshlabxml
  Running command git clone -q git://github.com/3DLIRIOUS/MeshLabXML /content/src/meshlabxml
Installing collected packages: MeshLabXML
  Running setup.py develop for MeshLabXML
Successfully installed MeshLabXML-2021.7

Then the bug happened in here: import meshlabxml as mlx ModuleNotFoundError: No module named 'meshlabxml'

I thought maybe I should change the name of the module, so I tried this: import MeshLabXML as mlx However, result: ModuleNotFoundError: No module named 'MeshLabXML'

3DLIRIOUS commented 3 years ago

I'm not sure, however there are several hits for this issue, for example here and here.

You could try removing the -e flag, or installing from a local copy instead of the github repo.

nref commented 2 years ago

Removing -e fixed the above error for me. Also, git+git:// doesn't work anymore:

Obtaining MeshLabXML from git+git://github.com/3DLIRIOUS/MeshLabXML#egg=MeshLabXML
  Cloning git://github.com/3DLIRIOUS/MeshLabXML to c:\git\raystation\raycommand.services\motion\scripts\src\meshlabxml
  Running command git clone --filter=blob:none --quiet git://github.com/3DLIRIOUS/MeshLabXML 'C:\git\RayStation\RayCommand.Services\Motion\Scripts\src\meshlabxml'
  fatal: remote error:
    The unauthenticated git protocol on port 9418 is no longer supported.
  Please see https://github.blog/2021-09-01-improving-git-protocol-security-github/ for more information.

Fixed it by using git+https:// instead.

pip install git+https://github.com/3DLIRIOUS/MeshLabXML#egg=MeshLabXML