forked from youen/assembly_handbook
Added code to handle clipping view
This commit is contained in:
parent
5e65e68c13
commit
c06af9db24
@ -129,13 +129,25 @@ class RasterView:
|
||||
dir = os.path.dirname(self.image_file_name)
|
||||
if not os.path.exists(dir):
|
||||
os.makedirs(dir)
|
||||
|
||||
tmp_doc = App.newDocument('tmp_raster', hidden=False, temp=False)
|
||||
|
||||
if 'Assembly_handbook_RasterSavedView' in view.PropertiesList and view.Assembly_handbook_RasterSavedView is not None:
|
||||
tmp_doc = view.Assembly_handbook_RasterSavedView.Document
|
||||
close_tmp_doc = False
|
||||
else:
|
||||
tmp_doc = App.newDocument('tmp_raster', hidden=False, temp=False)
|
||||
close_tmp_doc = True
|
||||
|
||||
objects_to_reset = {}
|
||||
duplicated_parts = {}
|
||||
try:
|
||||
print_verbose("Preparing scene...")
|
||||
|
||||
# Clean existing scene (if any)
|
||||
sceneGroup = tmp_doc.getObject('Scene')
|
||||
if sceneGroup is not None:
|
||||
sceneGroup.removeObjectsFromDocument()
|
||||
tmp_doc.removeObject(sceneGroup.Name)
|
||||
|
||||
# construct new scene with links to the parts we want
|
||||
sceneGroup = tmp_doc.addObject('App::DocumentObjectGroup', 'Scene')
|
||||
prev_parts = []
|
||||
@ -315,7 +327,8 @@ class RasterView:
|
||||
obj.ViewObject.DisplayMode = props[7]
|
||||
|
||||
# remove the temporary document
|
||||
App.closeDocument(tmp_doc.Name)
|
||||
if close_tmp_doc:
|
||||
App.closeDocument(tmp_doc.Name)
|
||||
|
||||
print_verbose("Finalizing view...")
|
||||
|
||||
@ -375,8 +388,9 @@ class RasterView:
|
||||
|
||||
doc_view = Gui.getDocument(doc.Name).mdiViewsOfType('Gui::View3DInventor')[0]
|
||||
|
||||
# render lines in black, background in red, fill shapes in green
|
||||
# the green band contains the lines images, the red band contains the inverted alpha layer
|
||||
# render lines in blue, background in red, fill shapes in green
|
||||
# the green band contains the lines image, the red band contains the inverted alpha layer
|
||||
# if there is a clipping plane set with "Fill clip plane", the blue band contains the intersection with the clip plane
|
||||
configured = []
|
||||
print_verbose('Preparing objects for line rendering...')
|
||||
for link in doc.findObjects():
|
||||
@ -389,11 +403,11 @@ class RasterView:
|
||||
configured.append(obj)
|
||||
|
||||
if self._should_render(obj) and not fast_render:
|
||||
obj.ViewObject.LineColor = (0.0, 0.0, 0.0, 0.0) if link in parts else (1.0, 0.0, 1.0)
|
||||
obj.ViewObject.LineColor = (0.0, 0.0, 1.0, 0.0) if link in parts else (1.0, 0.0, 1.0)
|
||||
obj.ViewObject.ShapeMaterial.AmbientColor = (0.0, 0.0, 0.0, 0.0)
|
||||
obj.ViewObject.ShapeMaterial.DiffuseColor = (0.0, 0.0, 0.0, 0.0)
|
||||
obj.ViewObject.ShapeMaterial.SpecularColor = (0.0, 0.0, 0.0, 0.0)
|
||||
obj.ViewObject.ShapeMaterial.EmissiveColor = (0.0, 1.0, 0.0, 0.0) if link in parts else (1.0, 0.0, 1.0)
|
||||
obj.ViewObject.ShapeMaterial.EmissiveColor = (0.0, 1.0, 1.0, 0.0) if link in parts else (1.0, 0.0, 1.0)
|
||||
|
||||
# We need to set two different values otherwise freecad does not always update LineWidth of sub-elements
|
||||
obj.ViewObject.LineWidth = 1.0
|
||||
@ -402,15 +416,18 @@ class RasterView:
|
||||
link.ViewObject.Visibility = False
|
||||
|
||||
print_verbose('Rendering lines...')
|
||||
temp_file_name = tempfile.gettempdir() + "/ahb_temp_image.png"
|
||||
doc_view.saveImage(temp_file_name, resolution[0]+2, resolution[1]+2, "#ff0000") # we add 1 pixel border that we will need to crop later
|
||||
#temp_file_name = tempfile.gettempdir() + "/ahb_temp_image.png"
|
||||
temp_file_name = "/home/youen/tmp/ahb_temp_image.png"
|
||||
doc_view.saveImage(temp_file_name, resolution[0]+2, resolution[1]+2, "#ff00ff") # we add 1 pixel border that we will need to crop later
|
||||
lines_bands_img = self._read_image(temp_file_name)
|
||||
|
||||
lines_bands = lines_bands_img.split()
|
||||
lines_img = lines_bands[1]
|
||||
alpha_img = lines_bands[0].point(lambda p: 255 - p)
|
||||
clip_img = lines_bands[2]
|
||||
|
||||
generate_outlines = not fast_render
|
||||
#generate_outlines = False
|
||||
if generate_outlines:
|
||||
# Render all shapes with different colors, in order to extract outlines (where color changes)
|
||||
# This is needed because FreeCAD does not render lines on the boundary of curve shapes, such as spheres or cylinders
|
||||
@ -491,6 +508,15 @@ class RasterView:
|
||||
alpha_img
|
||||
])
|
||||
|
||||
# set clip color
|
||||
clip_color = (0.5, 0.5, 0.5)
|
||||
colorized_clip_img = Image.merge("RGB", [
|
||||
clip_img.point(lambda p: int(clip_color[0] * (255.0 - p))),
|
||||
clip_img.point(lambda p: int(clip_color[1] * (255.0 - p))),
|
||||
clip_img.point(lambda p: int(clip_color[2] * (255.0 - p)))
|
||||
])
|
||||
result.paste(colorized_clip_img, clip_img.point(lambda p: 255 - p))
|
||||
|
||||
# crop 1px borders
|
||||
result = result.crop((1, 1, result.size[0] - 1, result.size[1] - 1))
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user