2019-08-06 10:09:57 +02:00

137 lines
4.4 KiB
Python

import subprocess as sp
import subprocess
import glob, os
import shutil
import pointcloud as pc
modelType = "off"
samplingRate = 0.003
maxDistance = 0.003
maxAngleDistance = 0.01
errorSigma = 0
k = 16
pointCloudSize = 2048
cutOutProb = 0
maxIterations = 10
toolPath = "C:/Projekte/csg_playground_build/Release/primgen.exe"
def getExtension(modType):
if("off" in modType):
return "off"
elif("obj" in modType):
return "obj"
elif("csg" in modType):
return ".json"
else:
return ""
def run(modelPath, outputFolder):
executable = "{} {} \"{}\" \"{}\" {} {} {} {} {} {} {} {}".format(
toolPath, modelType, modelPath, outputFolder,
samplingRate, maxDistance, maxAngleDistance, errorSigma,
k, pointCloudSize, cutOutProb, maxIterations)
print("Call generator with " + executable)
p = sp.Popen(executable, stdout=subprocess.PIPE)
for line in p.stdout:
print(line)
# Wait until process terminates (without using p.wait())
# while p.poll() is None:
# Process hasn't exited yet, let's wait some
# time.sleep(0.5)
# Get return code from process
return_code = p.returncode
if return_code == -1:
print("Unable to generate primtitives for model {}".format(modelPath));
else:
print("Done. Exist Code: " + str(return_code))
def extract_clusters(outputFolder, cluster_method="none", **kwargs):
if "none" in cluster_method:
return
all_clusters = []
for subdir, dirs, _ in os.walk(outputFolder):
for dir in dirs:
path = os.path.join(subdir, dir)
for _,_,files in os.walk(path):
for file in files:
file = os.path.join(path, file.lower())
print(file)
if file.endswith("_pc.xyz"):
pointcloud = pc.read_pointcloud(file);
clusters = []
if "per_primitive" in cluster_method:
clusters = pc.cluster_per_column(pointcloud, column=7) # primitive id column
elif "cube" in cluster_method:
clusters = pc.cluster_cubes(pointcloud,
kwargs.get("cluster_dims", [1,1,1]))
elif "dbscan" in cluster_method:
clusters = pc.cluster_dbscan(pointcloud,
selected_indices=kwargs.get("selected_indices", [0,1,2,3,4,5]),
eps=kwargs.get("eps", 0.1),
min_samples=kwargs.get("min_samples", None)
)
for idx, cluster in enumerate(clusters):
pos = file.rfind("pc.xyz")
new_file = file[:pos] + str(idx) + "_pc.xyz"
pc.write_pointcloud(new_file, cluster)
# all_clusters.extend(clusters)
return all_clusters
def runForFolder(modelFolder, outputFolder):
os.chdir(modelFolder)
modelFiles = glob.glob("*." + getExtension(modelType))
print("Working on {} model files with extension {} from folder {}.".format(len(modelFiles),getExtension(modelType), modelFolder))
folderIdx = 0
for modelFile in modelFiles:
try:
subfolderPath = outputFolder + str(folderIdx) + "/"
folderIdx += 1
print("Check if output sub folder exists...")
if os.path.exists(subfolderPath) and os.path.isdir(subfolderPath):
shutil.rmtree(subfolderPath)
print("Yes => Existing sub folder was deleted.")
os.mkdir(subfolderPath)
print("Successfully created the directory %s " % subfolderPath)
run(modelFolder + modelFile, subfolderPath)
except OSError as err:
print("Creation of the directory %s failed." % str(err))
if __name__ == "__main__":
outputFolder = "D:/output_0/"
modelFolder = "C:/Users/friedrich/PycharmProjects/data/models/"
# clusters = extract_clusters("C:/Projekte/csg_playground_build/testOFF", "cube",
# cluster_dims=[2,2,2])
# #eps=0.1, min_samples=0.01, selected_indices=[7])
# pc.draw_clusters(clusters)
runForFolder(modelFolder, outputFolder)