diff --git a/ahb_raster_view.py b/ahb_raster_view.py index 082660c..016d0b1 100644 --- a/ahb_raster_view.py +++ b/ahb_raster_view.py @@ -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))