def connector_join(): remote = mmRemote(); remote.connect(); # accept outstanding tools, if there are any mm.accept_tool(remote) [found,id1] = mm.find_object_by_name(remote,'socket') [found,id2] = mm.find_object_by_name(remote,"connector") mm.select_objects(remote,[id1,id2]) # combine part with socket mm.begin_tool(remote, "combine") # select-all and do join # [TODO] support select-boundary-loops in API mm.select_all(remote) mm.begin_tool(remote, "join") mm.accept_tool(remote) [foundconnector,id1] = mm.find_object_by_name(remote,'connector') ## we need to rename the connector back to socket if foundconnector: cmd = mmapi.StoredCommands() cmd.AppendSceneCommand_SetObjectName(id1,'socket') remote.runCommand(cmd) ## [RMS] this block will clean up holes, but requires ability to save & restore selection! ## [TODO] we can do this now, because we can read back facegroup after createFaceGroup... #if False: # # save selection # mm.begin_tool(remote, "createFaceGroup") # mm.clear_face_selection(remote) # # do repair pass, in case join created holes (happens!) # mm.begin_tool(remote, "inspector") # mm.tool_utility_command(remote, "repairAll") # # [TODO] restore selection ## expand selection a few times, then remesh #if True: # for x in range(0,8): # mm.selection_utility_command(remote, "expandByOneRing") # mm.begin_tool(remote, "remesh") # mm.accept_tool(remote) # mm.begin_tool(remote, "smooth") # mm.set_toolparam(remote, "scale", 500.0) # mm.accept_tool(remote) #mm.clear_face_selection(remote) remote.shutdown()
def connector_join(): remote = mmRemote(); remote.connect(); # accept outstanding tools, if there are any mm.accept_tool(remote) [found,id1] = mm.find_object_by_name(remote,SocketName()) [found,id2] = mm.find_object_by_name(remote,ConnectorName()) mm.select_objects(remote,[id1,id2]) # combine part with socket mm.begin_tool(remote, "combine") # select-all and do join # [TODO] support select-boundary-loops in API mm.select_all(remote) mm.begin_tool(remote, "join") mm.accept_tool(remote) # [RMS] this block will clean up holes, but requires ability to save & restore selection! # [TODO] we can do this now, because we can read back facegroup after createFaceGroup... if False: # save selection mm.begin_tool(remote, "createFaceGroup") mm.clear_face_selection(remote) # do repair pass, in case join created holes (happens!) mm.begin_tool(remote, "inspector") mm.tool_utility_command(remote, "repairAll") # [TODO] restore selection # expand selection a few times, then remesh if True: for x in range(0,8): mm.selection_utility_command(remote, "expandByOneRing") mm.begin_tool(remote, "remesh") mm.accept_tool(remote) mm.begin_tool(remote, "smooth") mm.set_toolparam(remote, "scale", 500.0) mm.accept_tool(remote) mm.clear_face_selection(remote) remote.shutdown()
def main(): env_dist = os.environ apipath = env_dist.get('ITF') home_dir1 = apipath + "\\Surface_approximation\\meshmixer_API\\python" home_dir2 = apipath + "\\Surface_approximation\\meshmixer_API\\distrib\\python" sys.path.append(home_dir2) sys.path.append(home_dir1) fname = apipath + "\\Surface_approximation\\Input Parameters.txt" with open(fname, 'r') as f: lines = f.readlines() last_line = lines[-1] #print(sys.path) import mmapi import platform import socket from mmRemote import * import mm import math import shutil # initialize connection remote = mmRemote() remote.connect() examples_dir = os.getcwd() cmd = mmapi.StoredCommands() path = apipath + "\\Surface_approximation\\Examples\\Intermediate" if os.path.isdir(path + "/remesh"): #check if the folder exists shutil.rmtree(path + "/remesh") #if it exists, delete it os.mkdir(path + "/remesh") #if it's not, build it if not os.path.exists(path + "/stl"): print("No stl folder in /Surface_approxiamtion/Examples/Intermediate") print("We will now build it automaticly for you") os.mkdir(path + "/stl") files = os.listdir(path + "/stl") #read names of all stl files #print(files) if files == []: print( "No stl files in folder(/Surface_approxiamtion/Examples/Intermediate/stl/)" ) print( "You should close this window, click the preprocess button and then remesh button" ) time.sleep(1000) os._exit(0) for file in files: input_file = path + "/stl" + "/" + file print(input_file) output_file1 = path + "/remesh" + "/" + file output_file = output_file1[:-3] output_file += "obj" #str_list = list(output_path) #nPos = str_list.index('.') #str_list.insert(nPos,'_remesh') #output_path = "".join(str_list) print(output_file) key = cmd.AppendSceneCommand_AppendMeshFile(input_file) remote.runCommand(cmd) #build remesh parameters EdgeLength mm.tool.begin_tool(remote, "stability") area = mm.tool.get_toolparam(remote, "surfaceArea") mm.tool.accept_tool(remote) #a = area length = math.sqrt(area / 3600) length /= 2 #print(sys.argv[0]) #last_line = last_line[1:-1] #print(last_line) parameter = float(last_line) #print(parameter) length *= parameter #print(length) #length *= 0.0021 #print("area:"+ area) #start remeshing selected_objects_all = mm.select_all(remote) mm.tool.begin_tool(remote, "remesh") mm.tool.set_toolparam(remote, "edgeLength", length) mm.tool.set_toolparam( remote, "boundaryMode", 2) # 0:freeboundary; 1:fixedboundary; 2:refinedfixedboudary mm.tool.set_toolparam( remote, "goalType", 2 ) # RelativeDensity = 0, AdaptiveDensity = 1, TargetEdgeLength = 2, LinearSubdivision = 3 cmd.AppendCompleteToolCommand mm.tool.accept_tool(remote) mm.scene.export_mesh(remote, output_file) #build remeshed stl file #print(mm.scene.get_vertex_count(remote, selected_objects_all)) #str_list = list(input_path) #nPos = str_list.index('.') #str_list.insert(nPos,'_remesh') #output_path = "".join(str_list) #input_path = raw_input("Enter Filename: ") time.sleep(5) remote.shutdown()
# - select a patch on original object and Attract To Target # (coded for default bunny, but should work with other objects) import mmapi from mmRemote import * import mm # initialize connection r = mmRemote() r.connect() # save initial selection list initial_selection = mm.list_selected_objects(r) # generate shell using Offset tool mm.select_all(r) mm.begin_tool(r, "offset") mm.set_toolparam(r, "offsetWorld", 1.25) mm.accept_tool(r) # now Offset is done, and shell is selected. Next we Separate it mm.begin_tool(r, "separate") mm.accept_tool(r) # read back current selection (will be shell) shell_objects = mm.list_selected_objects(r) mm.set_object_name(r, shell_objects[0], "shell") # set current as target (will be offset shell) mm.set_as_target(r)