MeshLabXML icon indicating copy to clipboard operation
MeshLabXML copied to clipboard

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

Open HelloMaroon opened this issue 4 years ago • 4 comments

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!

HelloMaroon avatar Jul 27 '21 11:07 HelloMaroon

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

3DLIRIOUS avatar Aug 03 '21 11:08 3DLIRIOUS

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'

HelloMaroon avatar Aug 03 '21 15:08 HelloMaroon

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.

3DLIRIOUS avatar Aug 04 '21 00:08 3DLIRIOUS

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

nref avatar Mar 25 '22 17:03 nref