Initial commit.
This commit is contained in:
parent
68d9a17dd1
commit
29ffa13092
17 changed files with 224546 additions and 0 deletions
0
src/product_gen/__init__.py
Normal file
0
src/product_gen/__init__.py
Normal file
BIN
src/product_gen/__init__.pyc
Normal file
BIN
src/product_gen/__init__.pyc
Normal file
Binary file not shown.
101
src/product_gen/generate_lamp.py
Normal file
101
src/product_gen/generate_lamp.py
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
# freecad setup
|
||||||
|
FREECADPATH = "/usr/lib/freecad/lib/"
|
||||||
|
sys.path.append(FREECADPATH)
|
||||||
|
import numpy as np
|
||||||
|
import FreeCAD
|
||||||
|
import Part
|
||||||
|
|
||||||
|
# def generate_bulb(height, radius, thickness):
|
||||||
|
#
|
||||||
|
# light_angle = np.arcsin(0.25) + np.pi/2.0
|
||||||
|
# light_arc_length = radius*light_angle+np.pi/2.0
|
||||||
|
# num_divisions = 25
|
||||||
|
# segment_length = light_arc_length/float(num_divisions)
|
||||||
|
#
|
||||||
|
# edges = []
|
||||||
|
# for idx in range(1, num_divisions):
|
||||||
|
# angle0 = float(idx-1)/float(num_divisions)*light_angle
|
||||||
|
# angle1 = float(idx)/float(num_divisions)*light_angle
|
||||||
|
# x0 = -radius*np.sin(angle0)
|
||||||
|
# y0 = -radius*np.cos(angle0)
|
||||||
|
# x1 = -radius*np.sin(angle1)
|
||||||
|
# y1 = -radius*np.cos(angle1)
|
||||||
|
# edges.append(Part.makeLine((x0, y0, 0),
|
||||||
|
# (x1, y1, 0)))
|
||||||
|
#
|
||||||
|
# edge0 = Part.makeLine((0.0, height, 0),
|
||||||
|
# (-radius, 0.0, 0))
|
||||||
|
# edge1 = Part.makeLine((-radius, 0.0, 0),
|
||||||
|
# (-radius -thickness, 0.0, 0))
|
||||||
|
# edge2 = Part.makeLine((-radius -thickness, 0.0, 0),
|
||||||
|
# (-radius -thickness, height, 0))
|
||||||
|
# edge3 = Part.makeLine((-radius -thickness, height, 0),
|
||||||
|
# (0.0, height, 0))
|
||||||
|
# wire1 = Part.Wire([edge0, edge1, edge2, edge3])
|
||||||
|
# face = Part.Face([wire1,])
|
||||||
|
#
|
||||||
|
# pos = FreeCAD.Vector(0.0, 0.0, 0.0)
|
||||||
|
# vec = FreeCAD.Vector(0.0, 1.0, 0.0)
|
||||||
|
# angle = 360
|
||||||
|
# solid = face.revolve(pos, vec, angle)
|
||||||
|
# return solid
|
||||||
|
|
||||||
|
def generate_chord(height, radius, thickness):
|
||||||
|
|
||||||
|
edge0 = Part.makeLine((0.0, height, 0),
|
||||||
|
(-radius, 0.0, 0))
|
||||||
|
edge1 = Part.makeLine((-radius, 0.0, 0),
|
||||||
|
(-radius -thickness, 0.0, 0))
|
||||||
|
edge2 = Part.makeLine((-radius -thickness, 0.0, 0),
|
||||||
|
(-radius -thickness, height, 0))
|
||||||
|
edge3 = Part.makeLine((-radius -thickness, height, 0),
|
||||||
|
(0.0, height, 0))
|
||||||
|
wire1 = Part.Wire([edge0, edge1, edge2, edge3])
|
||||||
|
face = Part.Face([wire1,])
|
||||||
|
|
||||||
|
pos = FreeCAD.Vector(0.0, 0.0, 0.0)
|
||||||
|
vec = FreeCAD.Vector(0.0, 1.0, 0.0)
|
||||||
|
angle = 360
|
||||||
|
solid = face.revolve(pos, vec, angle)
|
||||||
|
return solid
|
||||||
|
|
||||||
|
def generate_base(height, radius, thickness):
|
||||||
|
|
||||||
|
edge0 = Part.makeLine((0.0, 0.0, 0),
|
||||||
|
(-radius, -height, 0))
|
||||||
|
edge1 = Part.makeLine((-radius, -height, 0),
|
||||||
|
(-radius -thickness, -height, 0))
|
||||||
|
edge2 = Part.makeLine((-radius -thickness, -height, 0),
|
||||||
|
(-thickness, 0.0, 0))
|
||||||
|
edge3 = Part.makeLine((-thickness, 0.0, 0),
|
||||||
|
(0.0, 0.0, 0))
|
||||||
|
wire1 = Part.Wire([edge0, edge1, edge2, edge3])
|
||||||
|
face = Part.Face([wire1,])
|
||||||
|
|
||||||
|
pos = FreeCAD.Vector(0.0, 0.0, 0.0)
|
||||||
|
vec = FreeCAD.Vector(0.0, 1.0, 0.0)
|
||||||
|
angle = 360
|
||||||
|
solid = face.revolve(pos, vec, angle)
|
||||||
|
return solid
|
||||||
|
|
||||||
|
def generate_shade(height, radius, thickness):
|
||||||
|
|
||||||
|
edge0 = Part.makeLine((0.0, 0.0, 0),
|
||||||
|
(-radius, -height, 0))
|
||||||
|
edge1 = Part.makeLine((-radius, -height, 0),
|
||||||
|
(-radius -thickness, -height, 0))
|
||||||
|
edge2 = Part.makeLine((-radius -thickness, -height, 0),
|
||||||
|
(-thickness, 0.0, 0))
|
||||||
|
edge3 = Part.makeLine((-thickness, 0.0, 0),
|
||||||
|
(0.0, 0.0, 0))
|
||||||
|
wire1 = Part.Wire([edge0, edge1, edge2, edge3])
|
||||||
|
face = Part.Face([wire1,])
|
||||||
|
|
||||||
|
pos = FreeCAD.Vector(0.0, 0.0, 0.0)
|
||||||
|
vec = FreeCAD.Vector(0.0, 1.0, 0.0)
|
||||||
|
angle = 360
|
||||||
|
solid = face.revolve(pos, vec, angle)
|
||||||
|
return solid
|
BIN
src/product_gen/generate_lamp.pyc
Normal file
BIN
src/product_gen/generate_lamp.pyc
Normal file
Binary file not shown.
87
src/product_gen/render_lamp.py
Normal file
87
src/product_gen/render_lamp.py
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
import numpy as np
|
||||||
|
import vtk
|
||||||
|
|
||||||
|
def render_lamp(shade_file_path,
|
||||||
|
base_file_path,
|
||||||
|
chord_file_path,
|
||||||
|
image_file_path,
|
||||||
|
color):
|
||||||
|
|
||||||
|
# create a rendering window and renderer
|
||||||
|
ren = vtk.vtkRenderer()
|
||||||
|
ren.SetBackground(1.0, 1.0, 1.0)
|
||||||
|
renWin = vtk.vtkRenderWindow()
|
||||||
|
renWin.AddRenderer(ren)
|
||||||
|
WIDTH=640
|
||||||
|
HEIGHT=480
|
||||||
|
renWin.SetSize(WIDTH,HEIGHT)
|
||||||
|
|
||||||
|
# create a renderwindowinteractor
|
||||||
|
iren = vtk.vtkRenderWindowInteractor()
|
||||||
|
iren.SetRenderWindow(renWin)
|
||||||
|
|
||||||
|
# shade
|
||||||
|
reader = vtk.vtkSTLReader()
|
||||||
|
reader.SetFileName(shade_file_path)
|
||||||
|
reader.Update()
|
||||||
|
shade = reader.GetOutput()
|
||||||
|
shade_mapper = vtk.vtkPolyDataMapper()
|
||||||
|
shade_mapper.SetInputData(shade)
|
||||||
|
shade_actor = vtk.vtkActor()
|
||||||
|
shade_actor.SetMapper(shade_mapper)
|
||||||
|
shade_actor.GetProperty().SetColor(np.array(color)/255.0)
|
||||||
|
|
||||||
|
# base
|
||||||
|
base_reader = vtk.vtkSTLReader()
|
||||||
|
base_reader.SetFileName(base_file_path)
|
||||||
|
base_reader.Update()
|
||||||
|
base = base_reader.GetOutput()
|
||||||
|
base_mapper = vtk.vtkPolyDataMapper()
|
||||||
|
base_mapper.SetInputData(base)
|
||||||
|
base_actor = vtk.vtkActor()
|
||||||
|
base_actor.SetMapper(base_mapper)
|
||||||
|
base_actor.GetProperty().SetColor(16.0/255.0, 17.0/255.0, 17.0/255.0)
|
||||||
|
#
|
||||||
|
# # chord
|
||||||
|
chord_reader = vtk.vtkSTLReader()
|
||||||
|
chord_reader.SetFileName(chord_file_path)
|
||||||
|
chord_reader.Update()
|
||||||
|
chord = chord_reader.GetOutput()
|
||||||
|
chord_mapper = vtk.vtkPolyDataMapper()
|
||||||
|
chord_mapper.SetInputData(chord)
|
||||||
|
chord_actor = vtk.vtkActor()
|
||||||
|
chord_actor.SetMapper(chord_mapper)
|
||||||
|
chord_actor.GetProperty().SetColor(16.0/255.0, 17.0/255.0, 17.0/255.0)
|
||||||
|
|
||||||
|
# Add a light
|
||||||
|
light = vtk.vtkLight()
|
||||||
|
light.SetPositional(True)
|
||||||
|
light.SetFocalPoint(0.0,-100.0, 0.0)
|
||||||
|
light.SetIntensity(1.0)
|
||||||
|
lightActor = vtk.vtkLightActor()
|
||||||
|
lightActor.SetLight(light)
|
||||||
|
|
||||||
|
light.SetColor(0.0,0.0,0.0)
|
||||||
|
light.SetSwitch(1)
|
||||||
|
ren.AddViewProp(lightActor)
|
||||||
|
|
||||||
|
# assign actor to the renderer
|
||||||
|
ren.AddActor(shade_actor)
|
||||||
|
ren.AddActor(base_actor)
|
||||||
|
ren.AddActor(chord_actor)
|
||||||
|
|
||||||
|
# Do render and output
|
||||||
|
#iren.Initialize()
|
||||||
|
renWin.Modified()
|
||||||
|
renWin.Render()
|
||||||
|
ren.AddLight(light)
|
||||||
|
|
||||||
|
window_to_image = vtk.vtkWindowToImageFilter()
|
||||||
|
window_to_image.SetInput(renWin)
|
||||||
|
window_to_image.Update()
|
||||||
|
|
||||||
|
png_writer = vtk.vtkPNGWriter()
|
||||||
|
png_writer.SetFileName(image_file_path)
|
||||||
|
png_writer.SetInputData(window_to_image.GetOutput())
|
||||||
|
png_writer.Write()
|
||||||
|
#iren.Start()
|
BIN
src/product_gen/render_lamp.pyc
Normal file
BIN
src/product_gen/render_lamp.pyc
Normal file
Binary file not shown.
33819
src/utility/base.stl
Normal file
33819
src/utility/base.stl
Normal file
File diff suppressed because it is too large
Load diff
15171
src/utility/chord.stl
Normal file
15171
src/utility/chord.stl
Normal file
File diff suppressed because it is too large
Load diff
40
src/utility/generate_image.py
Normal file
40
src/utility/generate_image.py
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
import os
|
||||||
|
import product_gen.generate_lamp
|
||||||
|
import product_gen.render_lamp
|
||||||
|
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
def run(color):
|
||||||
|
height = 150.0
|
||||||
|
radius = 100.0
|
||||||
|
thickness = 3.0
|
||||||
|
shade = product_gen.generate_lamp.generate_shade(height, radius, thickness)
|
||||||
|
work_dir = os.getcwd()
|
||||||
|
shade.exportStl(work_dir + "/shade.stl")
|
||||||
|
|
||||||
|
height = 20.0
|
||||||
|
radius = 15.0
|
||||||
|
thickness = 3.0
|
||||||
|
base = product_gen.generate_lamp.generate_base(height, radius, thickness)
|
||||||
|
base.exportStl(work_dir + "/base.stl")
|
||||||
|
|
||||||
|
height = 150.0
|
||||||
|
radius = 2.0
|
||||||
|
thickness = 1.0
|
||||||
|
chord = product_gen.generate_lamp.generate_chord(height, radius, thickness)
|
||||||
|
chord.exportStl(work_dir + "/chord.stl")
|
||||||
|
|
||||||
|
product_gen.render_lamp.render_lamp(work_dir + "/shade.stl",
|
||||||
|
work_dir + "/base.stl",
|
||||||
|
work_dir + "/chord.stl",
|
||||||
|
work_dir + "/lamp.png",
|
||||||
|
color = color)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = ArgumentParser()
|
||||||
|
parser.add_argument('-r', type=float, help='Red intensity.')
|
||||||
|
parser.add_argument('-g', type=float, help='Red intensity.')
|
||||||
|
parser.add_argument('-b', type=float, help='Red intensity.')
|
||||||
|
args = parser.parse_args()
|
||||||
|
run([args.r, args.g, args.b])
|
||||||
|
|
BIN
src/utility/lamp.png
Normal file
BIN
src/utility/lamp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
42107
src/utility/shade.stl
Normal file
42107
src/utility/shade.stl
Normal file
File diff suppressed because it is too large
Load diff
33819
test/base.stl
Normal file
33819
test/base.stl
Normal file
File diff suppressed because it is too large
Load diff
15171
test/chord.stl
Normal file
15171
test/chord.stl
Normal file
File diff suppressed because it is too large
Load diff
BIN
test/lamp.png
Normal file
BIN
test/lamp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
42093
test/lamp.stl
Normal file
42093
test/lamp.stl
Normal file
File diff suppressed because it is too large
Load diff
42107
test/shade.stl
Normal file
42107
test/shade.stl
Normal file
File diff suppressed because it is too large
Load diff
31
test/test_generate_lamp.py
Normal file
31
test/test_generate_lamp.py
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import os
|
||||||
|
import product_gen.generate_lamp
|
||||||
|
import product_gen.render_lamp
|
||||||
|
|
||||||
|
height = 150.0
|
||||||
|
radius = 100.0
|
||||||
|
thickness = 3.0
|
||||||
|
shade = product_gen.generate_lamp.generate_shade(height, radius, thickness)
|
||||||
|
work_dir = os.getcwd()
|
||||||
|
shade.exportStl(work_dir + "/shade.stl")
|
||||||
|
|
||||||
|
height = 20.0
|
||||||
|
radius = 15.0
|
||||||
|
thickness = 3.0
|
||||||
|
base = product_gen.generate_lamp.generate_base(height, radius, thickness)
|
||||||
|
work_dir = os.getcwd()
|
||||||
|
base.exportStl(work_dir + "/base.stl")
|
||||||
|
|
||||||
|
height = 150.0
|
||||||
|
radius = 2.0
|
||||||
|
thickness = 1.0
|
||||||
|
chord = product_gen.generate_lamp.generate_chord(height, radius, thickness)
|
||||||
|
work_dir = os.getcwd()
|
||||||
|
chord.exportStl(work_dir + "/chord.stl")
|
||||||
|
|
||||||
|
product_gen.render_lamp.render_lamp(work_dir + "/shade.stl",
|
||||||
|
work_dir + "/base.stl",
|
||||||
|
work_dir + "/chord.stl",
|
||||||
|
work_dir + "/lamp.png",
|
||||||
|
color = [25.0, 128.0, 132.0])
|
||||||
|
|
Loading…
Reference in a new issue