Beispiel #1
0
    def draw(self, context):
        log("Draw")

        if not self.is_synced:
            return

        stage = self.stage
        if not stage:
            return

        view_settings = ViewSettings(context)
        if view_settings.width * view_settings.height == 0:
            return

        gf_camera = view_settings.export_camera()
        self.renderer.SetCameraState(
            gf_camera.frustum.ComputeViewMatrix(),
            gf_camera.frustum.ComputeProjectionMatrix())
        if self.is_gl_delegate:
            self.renderer.SetRenderViewport(
                (*view_settings.border[0], *view_settings.border[1]))
        else:
            self.renderer.SetRenderViewport((0, 0, *view_settings.border[1]))
        self.renderer.SetRendererAov('color')
        self.render_params.renderResolution = (view_settings.width,
                                               view_settings.height)

        if self.is_gl_delegate:
            bgl.glEnable(bgl.GL_DEPTH_TEST)
        else:
            bgl.glDisable(bgl.GL_DEPTH_TEST)

        bgl.glViewport(*view_settings.border[0], *view_settings.border[1])
        bgl.glClearColor(0.0, 0.0, 0.0, 0.0)
        bgl.glClearDepth(1.0)
        bgl.glClear(bgl.GL_COLOR_BUFFER_BIT | bgl.GL_DEPTH_BUFFER_BIT)

        # Bind shader that converts from scene linear to display space,
        bgl.glEnable(bgl.GL_BLEND)
        bgl.glBlendFunc(bgl.GL_ONE, bgl.GL_ONE_MINUS_SRC_ALPHA)
        self.render_engine.bind_display_space_shader(context.scene)

        try:
            self.renderer.Render(stage.GetPseudoRoot(), self.render_params)
        except Exception as e:
            log.error(e)

        self.render_engine.unbind_display_space_shader()
        bgl.glDisable(bgl.GL_BLEND)

        if not self.renderer.IsConverged():
            self.notify_status("Rendering...", "")
        else:
            self.notify_status("Rendering Done", "", False)
Beispiel #2
0
    def clear(self):
        is_bound = self is _SnapOffscreen.bound
        if not is_bound:
            self.bind()

        bgl.glColorMask(bgl.GL_TRUE, bgl.GL_TRUE, bgl.GL_TRUE, bgl.GL_TRUE)
        bgl.glClearColor(0.0, 0.0, 0.0, 0.0)

        bgl.glDepthMask(bgl.GL_TRUE)
        bgl.glClearDepth(1.0);

        bgl.glClear(bgl.GL_COLOR_BUFFER_BIT | bgl.GL_DEPTH_BUFFER_BIT)

        if not is_bound:
            self.unbind()
Beispiel #3
0
    def clear(self):
        is_bound = self is _SnapOffscreen.bound
        if not is_bound:
            self.bind()

        bgl.glColorMask(bgl.GL_TRUE, bgl.GL_TRUE, bgl.GL_TRUE, bgl.GL_TRUE)
        bgl.glClearColor(0.0, 0.0, 0.0, 0.0)

        bgl.glDepthMask(bgl.GL_TRUE)
        bgl.glClearDepth(1.0);

        bgl.glClear(bgl.GL_COLOR_BUFFER_BIT | bgl.GL_DEPTH_BUFFER_BIT)

        if not is_bound:
            self.unbind()
Beispiel #4
0
    def _render_gl(self, scene):
        CLEAR_COLOR = (0.0, 0.0, 0.0, 0.0)
        CLEAR_DEPTH = 1.0

        # creating draw_target
        draw_target = Glf.DrawTarget(self.width, self.height)
        draw_target.Bind()
        draw_target.AddAttachment("color", bgl.GL_RGBA, bgl.GL_FLOAT, bgl.GL_RGBA)
        draw_target.AddAttachment("depth", bgl.GL_DEPTH_COMPONENT, bgl.GL_FLOAT,
                                  bgl.GL_DEPTH_COMPONENT32F)

        # creating renderer
        renderer = UsdImagingGL.Engine()
        log("Hydra render:", scene.hdusd.final.delegate)
        renderer.SetRendererPlugin(scene.hdusd.final.delegate)

        # setting camera
        self._set_scene_camera(renderer, scene)

        renderer.SetRenderViewport((0, 0, self.width, self.height))
        renderer.SetRendererAov('color')

        bgl.glEnable(bgl.GL_DEPTH_TEST)
        bgl.glViewport(0, 0, self.width, self.height)
        bgl.glClearColor(*CLEAR_COLOR)
        bgl.glClearDepth(CLEAR_DEPTH)
        bgl.glClear(bgl.GL_COLOR_BUFFER_BIT | bgl.GL_DEPTH_BUFFER_BIT)

        root = self.stage.GetPseudoRoot()
        params = UsdImagingGL.RenderParams()
        params.renderResolution = (self.width, self.height)
        params.frame = Usd.TimeCode.Default()
        params.clearColor = CLEAR_COLOR

        try:
            renderer.Render(root, params)
        except Exception as e:
            log.error(e)

        self.update_render_result({
            'Combined': gl.get_framebuffer_data(self.width, self.height)
        })

        draw_target.Unbind()

        # it's important to clear data explicitly
        draw_target = None
        renderer = None
Beispiel #5
0
    def draw_callback(self, context):
        """
        :type context: bpy.types.Context
        """

        prefs = QuickBooleanPreferences.get_instance()
        color = prefs.color
        snap_color = prefs.snap_color

        region = context.region

        glsettings = vagl.GLSettings(context)
        glsettings.push()

        bgl.glEnable(bgl.GL_BLEND)
        bgl.glColor4f(*color)

        show_reversed = False
        if self.reverse:
            if self.mode == 'POLYGON':
                if len(self.mouse_coords) >= 3:
                    show_reversed = True
            else:
                if len(self.mouse_coords) >= 2:
                    if self.mouse_coords[0] != self.mouse_coords[1]:
                        show_reversed = True
        if show_reversed:
            bgl.glEnable(bgl.GL_DEPTH_TEST)
            bgl.glClearDepth(1.0)
            bgl.glClear(bgl.GL_DEPTH_BUFFER_BIT)
            bgl.glDepthMask(1)
            bgl.glColorMask(0, 0, 0, 0)

        lines = []
        if self.mouse_coords:
            if self.mode == 'LINE':
                w = region.width
                h = region.height
                p1, p2 = self.mouse_coords
                line = (p2 - p1).normalized()
                normal = Vector([-line[1], line[0]])
                corners = [
                    Vector([0, 0]),
                    Vector([w, 0]),
                    Vector([w, h]),
                    Vector([0, h])
                ]
                corners_ofs = [v - p1 for v in corners]
                dists = [v.project(line).dot(line) for v in corners_ofs]
                i = dists.index(min(dists))
                line_min = corners_ofs[i].project(line) + p1
                i = dists.index(max(dists))
                line_max = corners_ofs[i].project(line) + p1
                dists = [v.project(normal).dot(normal) for v in corners_ofs]
                i = dists.index(max(dists))
                normal_max_f = corners_ofs[i].project(normal).dot(normal)
                vec = normal * normal_max_f
                coords = [line_min, line_max, line_max + vec, line_min + vec]
                bgl.glBegin(bgl.GL_QUADS)
                for co in coords:
                    bgl.glVertex2f(*co)
                bgl.glEnd()
                lines = self.mouse_coords

            elif self.mode == 'BOX':
                p1, p2 = self.mouse_coords
                bgl.glRectf(p1[0], p1[1], p2[0], p2[1])
                lines = [
                    p1,
                    Vector((p2[0], p1[1])),
                    Vector((p2[0], p2[1])),
                    Vector((p1[0], p2[1])), p1
                ]
            elif self.mode == 'CIRCLE':
                p1, p2 = self.mouse_coords
                bgl.glBegin(bgl.GL_TRIANGLE_FAN)
                bgl.glVertex2f(*p1)
                r = (p2 - p1).length
                coords = calc_circle_coords(p1, r, self.circle_segments,
                                            self.circle_direction)
                for co in coords:
                    bgl.glVertex2f(*co)
                bgl.glVertex2f(*coords[0])
                bgl.glEnd()
                lines = coords + [coords[0]]
            elif self.mode == 'POLYGON':
                if len(self.mouse_coords) >= 3:
                    tris = mathutils.geometry.tessellate_polygon(
                        [[co.to_3d() for co in self.mouse_coords]])

                    bgl.glBegin(bgl.GL_TRIANGLES)
                    for tri in tris:
                        for i in tri:
                            bgl.glVertex2f(*self.mouse_coords[i])
                    bgl.glEnd()
                if len(self.mouse_coords) > 1:
                    lines = self.mouse_coords + [self.mouse_coords[0]]

        if show_reversed:
            bgl.glColorMask(1, 1, 1, 1)
            bgl.glBegin(bgl.GL_QUADS)
            bgl.glVertex3f(0, 0, -1)
            bgl.glVertex3f(region.width, 0, -1)
            bgl.glVertex3f(region.width, region.height, -1)
            bgl.glVertex3f(0, region.height, -1)
            bgl.glEnd()
            bgl.glDisable(bgl.GL_DEPTH_TEST)

        bgl.glColor4f(*color[:3], 1.0)
        bgl.glPointSize(1)
        bgl.glLineWidth(1)
        if len(lines) > 1:
            bgl.glBegin(bgl.GL_LINE_STRIP)
            for co in lines:
                bgl.glVertex2f(*co)
            bgl.glEnd()
        if self.mode == 'POLYGON':
            if len(self.mouse_coords) == 1:
                bgl.glPointSize(5)
                bgl.glBegin(bgl.GL_POINTS)
                for co in self.mouse_coords:
                    bgl.glVertex2f(*co)
                bgl.glEnd()
                bgl.glPointSize(1)
                bgl.glLineWidth(1)

        if self.mco_ctrl:
            SIZE = 12
            bgl.glColor4f(*snap_color)
            bgl.glBegin(bgl.GL_LINE_LOOP)
            v = self.mco_mod
            x = v[0] - SIZE / 2
            y = v[1] - SIZE / 2
            bgl.glVertex2f(x, y)
            bgl.glVertex2f(x + SIZE, y)
            bgl.glVertex2f(x + SIZE, y + SIZE)
            bgl.glVertex2f(x, y + SIZE)
            bgl.glEnd()

        glsettings.pop()
        glsettings.font_size()
def render_main_svg(self, context, animation=False):

    # Save old info
    scene = context.scene
    sceneProps= scene.MeasureItArchProps
    sceneProps.is_render_draw = True
    sceneProps.is_vector_draw = True

    clipdepth = context.scene.camera.data.clip_end
    path = scene.render.filepath
    objlist = context.view_layer.objects

    # --------------------
    # Get resolution
    # --------------------

    render_scale = scene.render.resolution_percentage / 100
    width = int(scene.render.resolution_x * render_scale)
    height = int(scene.render.resolution_y * render_scale)

    offscreen = gpu.types.GPUOffScreen(width, height)
    
    view_matrix_3d = scene.camera.matrix_world.inverted()
    projection_matrix = scene.camera.calc_matrix_camera(context.view_layer.depsgraph, x=width, y=height)

    # Render Depth Buffer
    with offscreen.bind():
        # Clear Depth Buffer, set Clear Depth to Cameras Clip Distance
        bgl.glClear(bgl.GL_DEPTH_BUFFER_BIT)
        bgl.glClearDepth(clipdepth)
        bgl.glEnable(bgl.GL_DEPTH_TEST)
        bgl.glDepthFunc(bgl.GL_LEQUAL)  

        gpu.matrix.reset()
        gpu.matrix.load_matrix(view_matrix_3d)
        gpu.matrix.load_projection_matrix(projection_matrix)

        texture_buffer = bgl.Buffer(bgl.GL_BYTE, width * height * 4)

        draw_scene(self, context, projection_matrix) 

        bgl.glReadBuffer(bgl.GL_BACK)
        bgl.glReadPixels(0, 0, width, height, bgl.GL_RGBA, bgl.GL_UNSIGNED_BYTE, texture_buffer)

        if 'depthbuffer' in sceneProps:
            del sceneProps['depthbuffer']
        sceneProps['depthbuffer'] = texture_buffer
    offscreen.free()

    if True:
        if not str('test') in bpy.data.images:
            bpy.data.images.new(str('test'), width, height)
        image = bpy.data.images[str('test')]
        image.scale(width, height)
        image.pixels = [v / 255 for v in texture_buffer]



    # Setup Output Path
    ren_path = bpy.context.scene.render.filepath
    filename = "mit_vector"
    ftxt = "%04d" % scene.frame_current
    outpath = (ren_path + filename + ftxt + '.svg')

    # Setup basic svg
    svg = svgwrite.Drawing(
            outpath,
            debug=False,
            size=('{}mm'.format(width), '{}mm'.format(height)),
            viewBox=('0 0 {} {}'.format(width,height)),
            id='root',
        )



    # -----------------------------
    # Loop to draw all objects
    # -----------------------------
    for myobj in objlist:
        if myobj.visible_get() is True:
            mat = myobj.matrix_world
            if 'DimensionGenerator' in myobj:
                measureGen = myobj.DimensionGenerator[0]
                if 'alignedDimensions' in measureGen:
                    for linDim in measureGen.alignedDimensions:
                        draw_alignedDimension(context, myobj, measureGen,linDim,mat,svg=svg)
                if 'angleDimensions' in measureGen:
                    for dim in measureGen.angleDimensions:
                        draw_angleDimension(context, myobj, measureGen,dim,mat,svg=svg)
                if 'axisDimensions' in measureGen:
                    for dim in measureGen.axisDimensions:
                        draw_axisDimension(context, myobj, measureGen,dim,mat,svg=svg)
                if 'boundsDimensions' in measureGen:
                    for dim in measureGen.boundsDimensions:
                        draw_boundsDimension(context, myobj, measureGen,dim,mat,svg=svg)
                if 'arcDimensions' in measureGen:
                    for dim in measureGen.arcDimensions:
                        draw_arcDimension(context, myobj, measureGen,dim,mat,svg=svg)
                if 'areaDimensions' in measureGen:
                    for dim in measureGen.areaDimensions:
                        draw_areaDimension(context, myobj, measureGen,dim,mat,svg=svg)

            if 'LineGenerator' in myobj:
                # Draw Line Groups
                op = myobj.LineGenerator[0]
                draw_line_group(context, myobj, op, mat,svg=svg)
            
            #if 'AnnotationGenerator' in myobj:
            #    op = myobj.AnnotationGenerator[0]
            #    draw_annotation(context, myobj, op, mat)                
        
        if False:
            # Draw Instance 
            deps = bpy.context.view_layer.depsgraph
            for obj_int in deps.object_instances:
                if obj_int.is_instance:
                    myobj = obj_int.object
                    mat = obj_int.matrix_world

                    if 'LineGenerator' in myobj:
                        lineGen = myobj.LineGenerator[0]
                        draw_line_group(context,myobj,lineGen,mat)
                    
                    if sceneProps.instance_dims:
                        if 'AnnotationGenerator' in myobj:
                            annotationGen = myobj.AnnotationGenerator[0]
                            draw_annotation(context,myobj,annotationGen,mat)

                        if 'DimensionGenerator' in myobj:
                            DimGen = myobj.DimensionGenerator[0]
                            for alignedDim in DimGen.alignedDimensions:
                                draw_alignedDimension(context, myobj, DimGen, alignedDim,mat)
                            for angleDim in DimGen.angleDimensions:
                                draw_angleDimension(context, myobj, DimGen, angleDim,mat)
                            for axisDim in DimGen.axisDimensions:
                                draw_axisDimension(context,myobj,DimGen,axisDim,mat)
            
 

    svg.save(pretty=True)
    # restore default value
    sceneProps.is_render_draw = False
    sceneProps.is_vector_draw = False
    return True
def render_main(self, context, animation=False):

    # Save old info
    scene = context.scene
    sceneProps= scene.MeasureItArchProps
    sceneProps.is_render_draw = True
    bgl.glEnable(bgl.GL_MULTISAMPLE)

    clipdepth = context.scene.camera.data.clip_end
    objlist = context.view_layer.objects

    # --------------------
    # Get resolution
    # --------------------

    render_scale = scene.render.resolution_percentage / 100
    width = int(scene.render.resolution_x * render_scale)
    height = int(scene.render.resolution_y * render_scale)


    # --------------------------------------
    # Draw all lines in Offsecreen
    # --------------------------------------
    offscreen = gpu.types.GPUOffScreen(width, height)
    
    view_matrix = Matrix([
        [2 / width, 0, 0, -1],
        [0, 2 / height, 0, -1],
        [0, 0, 1, 0],
        [0, 0, 0, 1]])

    view_matrix_3d = scene.camera.matrix_world.inverted()
    projection_matrix = scene.camera.calc_matrix_camera(context.view_layer.depsgraph, x=width, y=height)
    
    with offscreen.bind():
        # Clear Depth Buffer, set Clear Depth to Cameras Clip Distance
        bgl.glClear(bgl.GL_DEPTH_BUFFER_BIT)
        bgl.glClearDepth(clipdepth)
        bgl.glEnable(bgl.GL_DEPTH_TEST)
        bgl.glDepthFunc(bgl.GL_LEQUAL)  

        gpu.matrix.reset()
        gpu.matrix.load_matrix(view_matrix_3d)
        gpu.matrix.load_projection_matrix(projection_matrix)

        draw_scene(self, context, projection_matrix) 

        
        # Clear Color Keep on depth info
        bgl.glClearColor(0,0,0,0)
        bgl.glClear(bgl.GL_COLOR_BUFFER_BIT)

        # -----------------------------
        # Loop to draw all objects
        # -----------------------------
        for myobj in objlist:
            if myobj.visible_get() is True:
                mat = myobj.matrix_world

                sheetGen = myobj.SheetGenerator
                for sheet_view in sheetGen.sheet_views:
                    draw_sheet_views(context,myobj,sheetGen,sheet_view,mat)

                if 'DimensionGenerator' in myobj:
                    measureGen = myobj.DimensionGenerator[0]
                    if 'alignedDimensions' in measureGen:
                        for linDim in measureGen.alignedDimensions:
                            draw_alignedDimension(context, myobj, measureGen,linDim,mat)
                    if 'angleDimensions' in measureGen:
                        for dim in measureGen.angleDimensions:
                            draw_angleDimension(context, myobj, measureGen,dim,mat)
                    if 'axisDimensions' in measureGen:
                        for dim in measureGen.axisDimensions:
                            draw_axisDimension(context, myobj, measureGen,dim,mat)
                    if 'boundsDimensions' in measureGen:
                        for dim in measureGen.boundsDimensions:
                            draw_boundsDimension(context, myobj, measureGen,dim,mat)
                    if 'arcDimensions' in measureGen:
                        for dim in measureGen.arcDimensions:
                            draw_arcDimension(context, myobj, measureGen,dim,mat)
                    if 'areaDimensions' in measureGen:
                        for dim in measureGen.areaDimensions:
                            draw_areaDimension(context, myobj, measureGen,dim,mat)

                if 'LineGenerator' in myobj:
                    # Set 3D Projection Martix
                    gpu.matrix.reset()
                    gpu.matrix.load_matrix(view_matrix_3d)
                    gpu.matrix.load_projection_matrix(projection_matrix)

                    # Draw Line Groups
                    op = myobj.LineGenerator[0]
                    draw_line_group(context, myobj, op, mat)
             
                if 'AnnotationGenerator' in myobj:
                    # Set 3D Projection Martix
                    gpu.matrix.reset()
                    gpu.matrix.load_matrix(view_matrix_3d)
                    gpu.matrix.load_projection_matrix(projection_matrix)

                    # Draw Line Groups
                    op = myobj.AnnotationGenerator[0]
                    draw_annotation(context, myobj, op, mat)                
       
        # Draw Instance 
        deps = bpy.context.view_layer.depsgraph
        for obj_int in deps.object_instances:
            if obj_int.is_instance:
                myobj = obj_int.object
                mat = obj_int.matrix_world

                if 'LineGenerator' in myobj:
                    lineGen = myobj.LineGenerator[0]
                    draw_line_group(context,myobj,lineGen,mat)
                
                if sceneProps.instance_dims:
                    if 'AnnotationGenerator' in myobj:
                        annotationGen = myobj.AnnotationGenerator[0]
                        draw_annotation(context,myobj,annotationGen,mat)

                    if 'DimensionGenerator' in myobj:
                        DimGen = myobj.DimensionGenerator[0]
                        for alignedDim in DimGen.alignedDimensions:
                            draw_alignedDimension(context, myobj, DimGen, alignedDim,mat)
                        for angleDim in DimGen.angleDimensions:
                            draw_angleDimension(context, myobj, DimGen, angleDim,mat)
                        for axisDim in DimGen.axisDimensions:
                            draw_axisDimension(context,myobj,DimGen,axisDim,mat)
        

        buffer = bgl.Buffer(bgl.GL_BYTE, width * height * 4)
        bgl.glReadBuffer(bgl.GL_COLOR_ATTACHMENT0)
        bgl.glReadPixels(0, 0, width, height, bgl.GL_RGBA, bgl.GL_UNSIGNED_BYTE, buffer)
    offscreen.free()

    
    # -----------------------------
    # Create image
    # -----------------------------
    image_name = "measureit_arch_output"
    if image_name not in bpy.data.images:
        bpy.data.images.new(image_name, width, height)

    image = bpy.data.images[image_name]
    image.scale(width, height)
    image.pixels = [v / 255 for v in buffer]

    # Saves image
    if image is not None and (scene.measureit_arch_render is True or animation is True):
        ren_path = bpy.context.scene.render.filepath
        filename = "mit_frame"
        ftxt = "%04d" % scene.frame_current
        outpath = (ren_path + filename + ftxt + '.png')
        save_image(self, outpath, image)

    # restore default value
    sceneProps.is_render_draw = False
    return True, buffer
def render_main(self, context, animation=False):

    # Save old info
    bgl.glEnable(bgl.GL_MULTISAMPLE)
    settings = bpy.context.scene.render.image_settings
    depth = settings.color_depth
    settings.color_depth = '16'

    scene = context.scene
    clipdepth = context.scene.camera.data.clip_end
    path = scene.render.filepath
    objlist = context.view_layer.objects

    # --------------------
    # Get resolution
    # --------------------

    render_scale = scene.render.resolution_percentage / 100
    width = int(scene.render.resolution_x * render_scale)
    height = int(scene.render.resolution_y * render_scale)


    # --------------------------------------
    # Draw all lines in Offsecreen
    # --------------------------------------
    offscreen = gpu.types.GPUOffScreen(width, height)
    
    view_matrix = Matrix([
        [2 / width, 0, 0, -1],
        [0, 2 / height, 0, -1],
        [0, 0, 1, 0],
        [0, 0, 0, 1]])

    view_matrix_3d = scene.camera.matrix_world.inverted()
    projection_matrix = scene.camera.calc_matrix_camera(context.view_layer.depsgraph, x=width, y=height)
    scene.measureit_arch_is_render_draw = True
    with offscreen.bind():
        # Clear Depth Buffer, set Clear Depth to Cameras Clip Distance
        bgl.glClearDepth(clipdepth)
        bgl.glClear(bgl.GL_DEPTH_BUFFER_BIT)

        # Draw Scene If Necessary
        if scene.measureit_arch_use_depth_clipping is True:
            draw_scene(self, context, projection_matrix) 
        
        # Clear Color Keep on depth info
        bgl.glClear(bgl.GL_COLOR_BUFFER_BIT)

        # -----------------------------
        # Loop to draw all objects
        # -----------------------------
        for myobj in objlist:
            if myobj.visible_get() is True:
                if 'DimensionGenerator' in myobj:
                    measureGen = myobj.DimensionGenerator[0]
                    for linDim in measureGen.alignedDimensions:
                        draw_alignedDimension(context, myobj, measureGen,linDim)
                    for dim in measureGen.angleDimensions:
                        draw_angleDimension(context, myobj, measureGen,dim)

                if 'LineGenerator' in myobj:
                    # Set 3D Projection Martix
                    gpu.matrix.reset()
                    gpu.matrix.load_matrix(view_matrix_3d)
                    gpu.matrix.load_projection_matrix(projection_matrix)

                    # Draw Line Groups
                    op = myobj.LineGenerator[0]
                    draw_line_group(context, myobj, op)
             
                if 'AnnotationGenerator' in myobj:
                    # Set 3D Projection Martix
                    gpu.matrix.reset()
                    gpu.matrix.load_matrix(view_matrix_3d)
                    gpu.matrix.load_projection_matrix(projection_matrix)

                    # Draw Line Groups
                    op = myobj.AnnotationGenerator[0]
                    draw_annotation(context, myobj, op)                

        # -----------------------------
        # Loop to draw all debug
        # -----------------------------
        if scene.measureit_arch_debug is True:
            selobj = bpy.context.selected_objects
            for myobj in selobj:
                if scene.measureit_arch_debug_objects is True:
                    draw_object(context, myobj, None, None)
                elif scene.measureit_arch_debug_object_loc is True:
                    draw_object(context, myobj, None, None)
                if scene.measureit_arch_debug_vertices is True:
                    draw_vertices(context, myobj, None, None)
                elif scene.measureit_arch_debug_vert_loc is True:
                    draw_vertices(context, myobj, None, None)
                if scene.measureit_arch_debug_edges is True:
                    draw_edges(context, myobj, None, None)
                if scene.measureit_arch_debug_faces is True or scene.measureit_arch_debug_normals is True:
                    draw_faces(context, myobj, None, None)
        
        # -----------------------------
        # Draw a rectangle frame
        # -----------------------------
        if scene.measureit_arch_rf is True:
            rfcolor = scene.measureit_arch_rf_color
            rfborder = scene.measureit_arch_rf_border
            rfline = scene.measureit_arch_rf_line

            bgl.glLineWidth(rfline)
            x1 = rfborder
            x2 = width - rfborder
            y1 = int(ceil(rfborder / (width / height)))
            y2 = height - y1
            draw_rectangle((x1, y1), (x2, y2))

        buffer = bgl.Buffer(bgl.GL_BYTE, width * height * 4)
        bgl.glReadBuffer(bgl.GL_COLOR_ATTACHMENT0)
        bgl.glReadPixels(0, 0, width, height, bgl.GL_RGBA, bgl.GL_UNSIGNED_BYTE, buffer)
    offscreen.free()

    scene.measureit_arch_is_render_draw = False
    # -----------------------------
    # Create image
    # -----------------------------
    image_name = "measureit_arch_output"
    if image_name not in bpy.data.images:
        bpy.data.images.new(image_name, width, height)

    image = bpy.data.images[image_name]
    image.scale(width, height)
    image.pixels = [v / 255 for v in buffer]

    # Saves image
    if image is not None and (scene.measureit_arch_render is True or animation is True):
        ren_path = bpy.context.scene.render.filepath
        filename = "mit_frame"
        ftxt = "%04d" % scene.frame_current
        outpath = (ren_path + filename + ftxt + ".png")
        save_image(self, outpath, image)

    # restore default value
    settings.color_depth = depth
Beispiel #9
0
def render_main_svg(self, context, animation=False):

    # Save old info
    scene = context.scene
    sceneProps = scene.MeasureItArchProps
    sceneProps.is_render_draw = True
    sceneProps.is_vector_draw = True

    clipdepth = context.scene.camera.data.clip_end
    path = bpy.path.abspath(scene.render.filepath)
    objlist = context.view_layer.objects

    # --------------------
    # Get resolution
    # --------------------

    render_scale = scene.render.resolution_percentage / 100
    width = int(scene.render.resolution_x * render_scale)
    height = int(scene.render.resolution_y * render_scale)

    offscreen = gpu.types.GPUOffScreen(width, height)

    view_matrix_3d = scene.camera.matrix_world.inverted()
    projection_matrix = scene.camera.calc_matrix_camera(
        context.view_layer.depsgraph, x=width, y=height)

    # Render Depth Buffer
    print("Rendering Depth Buffer")
    if sceneProps.vector_depthtest:
        with offscreen.bind():
            # Clear Depth Buffer, set Clear Depth to Cameras Clip Distance
            set_OpenGL_Settings(True)
            bgl.glClear(bgl.GL_DEPTH_BUFFER_BIT)
            bgl.glClearDepth(clipdepth)
            bgl.glEnable(bgl.GL_DEPTH_TEST)
            bgl.glDepthFunc(bgl.GL_LEQUAL)

            gpu.matrix.reset()
            gpu.matrix.load_matrix(view_matrix_3d)
            gpu.matrix.load_projection_matrix(projection_matrix)

            texture_buffer = bgl.Buffer(bgl.GL_FLOAT, width * height)

            draw_scene(self, context, projection_matrix)

            bgl.glReadBuffer(bgl.GL_BACK)
            bgl.glReadPixels(0, 0, width, height, bgl.GL_DEPTH_COMPONENT,
                             bgl.GL_FLOAT, texture_buffer)

            if 'depthbuffer' in sceneProps:
                del sceneProps['depthbuffer']
            sceneProps['depthbuffer'] = texture_buffer
        offscreen.free()
        set_OpenGL_Settings(False)

        if False:
            imageName = 'depthBufferTest'
            if not imageName in bpy.data.images:
                bpy.data.images.new(imageName,
                                    width,
                                    height,
                                    alpha=False,
                                    float_buffer=True,
                                    is_data=True)
            image = bpy.data.images[imageName]

            image.scale(width, height)
            image.pixels = [v for v in texture_buffer]

    # Setup Output Path
    ren_path = path
    filename = "mit_vector"
    ftxt = "%04d" % scene.frame_current
    outpath = (ren_path + filename + ftxt + '.svg')

    view = get_view()

    paperWidth = width / sceneProps.default_resolution
    paperHeight = height / sceneProps.default_resolution

    try:
        if view.res_type == 'res_type_paper':
            paperWidth = round(view.width * 39.370078740196853, 3)
            paperHeight = round(view.height * 39.370078740196853, 3)
    except:
        print('No View Present, using default resolution')

    # Setup basic svg
    svg = svgwrite.Drawing(
        outpath,
        debug=False,
        size=('{}in'.format(paperWidth), '{}in'.format(paperHeight)),
        viewBox=('0 0 {} {}'.format(width, height)),
        id='root',
    )

    if sceneProps.embed_scene_render:
        lastformat = scene.render.image_settings.file_format
        scene.render.image_settings.file_format = 'PNG'
        scene.render.use_file_extension = True
        bpy.ops.render.render(write_still=True)

        image_path = bpy.context.scene.render.filepath
        svg.add(
            svg.image(os.path.basename(image_path + '.png'), **{
                'width': width,
                'height': height
            }))

        scene.render.image_settings.file_format = lastformat

    # -----------------------------
    # Loop to draw all objects
    # -----------------------------
    draw3d_loop(context, objlist, svg=svg)
    draw_titleblock(context, svg=svg)

    svg.save(pretty=True)
    # restore default value
    sceneProps.is_render_draw = False
    sceneProps.is_vector_draw = False
    return True
Beispiel #10
0
def render_main(self, context, animation=False):

    scene = context.scene
    sceneProps = scene.MeasureItArchProps
    sceneProps.is_render_draw = True

    clipdepth = context.scene.camera.data.clip_end
    objlist = context.view_layer.objects

    # Get resolution
    render_scale = scene.render.resolution_percentage / 100
    width = int(scene.render.resolution_x * render_scale)
    height = int(scene.render.resolution_y * render_scale)

    # Draw all lines in Offsecreen
    renderoffscreen = gpu.types.GPUOffScreen(width, height)

    view_matrix_3d = scene.camera.matrix_world.inverted()
    projection_matrix = scene.camera.calc_matrix_camera(
        context.view_layer.depsgraph, x=width, y=height)

    set_OpenGL_Settings(True)
    with renderoffscreen.bind():

        # Clear Depth Buffer, set Clear Depth to Cameras Clip Distance
        bgl.glClear(bgl.GL_DEPTH_BUFFER_BIT)
        bgl.glClearDepth(clipdepth)

        gpu.matrix.reset()
        gpu.matrix.load_matrix(view_matrix_3d)
        gpu.matrix.load_projection_matrix(projection_matrix)

        # Draw Scene for the depth buffer
        draw_scene(self, context, projection_matrix)

        # Clear Color Buffer, we only need the depth info
        bgl.glClearColor(0, 0, 0, 0)
        bgl.glClear(bgl.GL_COLOR_BUFFER_BIT)

        # -----------------------------
        # Loop to draw all objects
        # -----------------------------
        draw3d_loop(context, objlist)
        draw_titleblock(context)

        buffer = bgl.Buffer(bgl.GL_BYTE, width * height * 4)
        bgl.glReadBuffer(bgl.GL_COLOR_ATTACHMENT0)
        bgl.glReadPixels(0, 0, width, height, bgl.GL_RGBA,
                         bgl.GL_UNSIGNED_BYTE, buffer)

    # -----------------------------
    # Create image
    # -----------------------------
    image_name = "measureit_arch_output"
    if image_name not in bpy.data.images:
        image = bpy.data.images.new(image_name, width, height)

    image = bpy.data.images[image_name]

    image.scale(width, height)
    image.pixels = [v / 255 for v in buffer]

    renderoffscreen.free()
    # Saves image
    if image is not None and animation is True:
        ren_path = bpy.context.scene.render.filepath
        filename = "mit_frame"
        ftxt = "%04d" % scene.frame_current
        outpath = (ren_path + filename + ftxt + '.png')
        save_image(self, outpath, image)

    # restore default value
    set_OpenGL_Settings(False)
    sceneProps.is_render_draw = False
    return True, buffer
Beispiel #11
0
    def draw_callback(self, context):
        """
        :type context: bpy.types.Context
        """

        prefs = QuickBooleanPreferences.get_instance()
        color = prefs.color
        snap_color = prefs.snap_color

        region = context.region

        glsettings = vagl.GLSettings(context)
        glsettings.push()

        bgl.glEnable(bgl.GL_BLEND)
        bgl.glColor4f(*color)

        show_reversed = False
        if self.reverse:
            if self.mode == 'POLYGON':
                if len(self.mouse_coords) >= 3:
                    show_reversed = True
            else:
                if len(self.mouse_coords) >= 2:
                    if self.mouse_coords[0] != self.mouse_coords[1]:
                        show_reversed = True
        if show_reversed:
            bgl.glEnable(bgl.GL_DEPTH_TEST)
            bgl.glClearDepth(1.0)
            bgl.glClear(bgl.GL_DEPTH_BUFFER_BIT)
            bgl.glDepthMask(1)
            bgl.glColorMask(0, 0, 0, 0)

        lines = []
        if self.mouse_coords:
            if self.mode == 'LINE':
                w = region.width
                h = region.height
                p1, p2 = self.mouse_coords
                line = (p2 - p1).normalized()
                normal = Vector([-line[1], line[0]])
                corners = [Vector([0, 0]), Vector([w, 0]), Vector([w, h]),
                           Vector([0, h])]
                corners_ofs = [v - p1 for v in corners]
                dists = [v.project(line).dot(line) for v in corners_ofs]
                i = dists.index(min(dists))
                line_min = corners_ofs[i].project(line) + p1
                i = dists.index(max(dists))
                line_max = corners_ofs[i].project(line) + p1
                dists = [v.project(normal).dot(normal) for v in corners_ofs]
                i = dists.index(max(dists))
                normal_max_f = corners_ofs[i].project(normal).dot(normal)
                vec = normal * normal_max_f
                coords = [line_min, line_max, line_max + vec, line_min + vec]
                bgl.glBegin(bgl.GL_QUADS)
                for co in coords:
                    bgl.glVertex2f(*co)
                bgl.glEnd()
                lines = self.mouse_coords

            elif self.mode == 'BOX':
                p1, p2 = self.mouse_coords
                bgl.glRectf(p1[0], p1[1], p2[0], p2[1])
                lines = [p1,
                         Vector((p2[0], p1[1])),
                         Vector((p2[0], p2[1])),
                         Vector((p1[0], p2[1])),
                         p1]
            elif self.mode == 'CIRCLE':
                p1, p2 = self.mouse_coords
                bgl.glBegin(bgl.GL_TRIANGLE_FAN)
                bgl.glVertex2f(*p1)
                r = (p2 - p1).length
                coords = calc_circle_coords(p1, r, self.circle_segments,
                                            self.circle_direction)
                for co in coords:
                    bgl.glVertex2f(*co)
                bgl.glVertex2f(*coords[0])
                bgl.glEnd()
                lines = coords + [coords[0]]
            elif self.mode == 'POLYGON':
                if len(self.mouse_coords) >= 3:
                    tris = mathutils.geometry.tessellate_polygon(
                        [[co.to_3d() for co in self.mouse_coords]])

                    bgl.glBegin(bgl.GL_TRIANGLES)
                    for tri in tris:
                        for i in tri:
                            bgl.glVertex2f(*self.mouse_coords[i])
                    bgl.glEnd()
                if len(self.mouse_coords) > 1:
                    lines = self.mouse_coords + [self.mouse_coords[0]]

        if show_reversed:
            bgl.glColorMask(1, 1, 1, 1)
            bgl.glBegin(bgl.GL_QUADS)
            bgl.glVertex3f(0, 0, -1)
            bgl.glVertex3f(region.width, 0, -1)
            bgl.glVertex3f(region.width, region.height, -1)
            bgl.glVertex3f(0, region.height, -1)
            bgl.glEnd()
            bgl.glDisable(bgl.GL_DEPTH_TEST)

        bgl.glColor4f(*color[:3], 1.0)
        bgl.glPointSize(1)
        bgl.glLineWidth(1)
        if len(lines) > 1:
            bgl.glBegin(bgl.GL_LINE_STRIP)
            for co in lines:
                bgl.glVertex2f(*co)
            bgl.glEnd()
        if self.mode == 'POLYGON':
            if len(self.mouse_coords) == 1:
                bgl.glPointSize(5)
                bgl.glBegin(bgl.GL_POINTS)
                for co in self.mouse_coords:
                    bgl.glVertex2f(*co)
                bgl.glEnd()
                bgl.glPointSize(1)
                bgl.glLineWidth(1)

        if self.mco_ctrl:
            SIZE = 12
            bgl.glColor4f(*snap_color)
            bgl.glBegin(bgl.GL_LINE_LOOP)
            v = self.mco_mod
            x = v[0] - SIZE / 2
            y = v[1] - SIZE / 2
            bgl.glVertex2f(x, y)
            bgl.glVertex2f(x + SIZE, y)
            bgl.glVertex2f(x + SIZE, y + SIZE)
            bgl.glVertex2f(x, y + SIZE)
            bgl.glEnd()

        glsettings.pop()
        glsettings.font_size()
Beispiel #12
0
    def execute(self, refholder):
        # pass
        tr = self.nodeTree.properties.TextureResolution
        print("begining execution " + str(tr))
        # compute A'
        mask = np.array([[0.05, 0.2, 0.05], [0.2, -1, 0.2], [0.05, 0.2, 0.05]])
        # Input data pixels
        A = self.inputs[0].getPixels()
        B = self.inputs[1].getPixels()

        # print(A)

        bgl.glGetIntegerv(bgl.GL_CURRENT_PROGRAM,
                          self.rdData[self.name]["prev_program"])
        bgl.glUseProgram(self.rdData[self.name]["program"])

        #set any uniforms needed
        bgl.glUniform1f(self.rdData[self.name]["feed_loc"],
                        self.inputs[2].value)
        bgl.glUniform1f(self.rdData[self.name]["kill_loc"],
                        self.inputs[3].value)
        bgl.glUniform1f(self.rdData[self.name]["da_loc"], self.inputs[4].value)
        bgl.glUniform1f(self.rdData[self.name]["db_loc"], self.inputs[5].value)
        bgl.glUniform1f(self.rdData[self.name]["dt_loc"], self.inputs[6].value)
        bgl.glUniform1f(self.rdData[self.name]["step_loc"], 1 / tr)

        bgl.glDisable(bgl.GL_SCISSOR_TEST)
        bgl.glViewport(0, 0, tr, tr)

        bgl.glMatrixMode(bgl.GL_MODELVIEW)
        bgl.glPushMatrix()
        bgl.glLoadIdentity()

        bgl.glMatrixMode(bgl.GL_PROJECTION)
        bgl.glPushMatrix()
        bgl.glLoadIdentity()
        bgl.gluOrtho2D(0, 1, 0, 1)

        bgl.glEnable(bgl.GL_TEXTURE_2D)
        bgl.glActiveTexture(bgl.GL_TEXTURE0)

        channels = []
        if self.channels == '0':
            channels = [0]
        elif self.channels == '1':
            channels = [0, 1, 2]

        for j in channels:
            self.rdData[self.name]["npArray"][:, :, 0] = A[:, :, j]
            self.rdData[self.name]["npArray"][:, :, 1] = B[:, :, j]

            # Caution: Interfacing with Cython requires toList()
            self.rdData[self.name]["image"].pixels = self.rdData[
                self.name]["npArray"].flatten()

            self.rdData[self.name]["image"].gl_load(0, bgl.GL_LINEAR,
                                                    bgl.GL_LINEAR)

            bgl.glBindTexture(bgl.GL_TEXTURE_2D,
                              self.rdData[self.name]["image"].bindcode[0])
            bgl.glTexParameteri(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_WRAP_S,
                                bgl.GL_REPEAT)
            bgl.glTexParameteri(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_WRAP_T,
                                bgl.GL_REPEAT)

            for i in range(self.inputs[7].value):
                bgl.glClearDepth(1.0)
                bgl.glClearColor(0.0, 0.0, 0.0, 0.0)
                bgl.glClear(bgl.GL_COLOR_BUFFER_BIT | bgl.GL_DEPTH_BUFFER_BIT)

                bgl.glBegin(bgl.GL_TRIANGLES)

                bgl.glColor3f(1.0, 1.0, 1.0)
                bgl.glTexCoord2f(0.0, 0.0)
                bgl.glVertex2f(-1.0, -1.0)
                bgl.glTexCoord2f(1.0, 0.0)
                bgl.glVertex2f(1.0, -1.0)
                bgl.glTexCoord2f(1.0, 1.0)
                bgl.glVertex2f(1.0, 1.0)

                bgl.glColor3f(1.0, 1.0, 1.0)
                bgl.glTexCoord2f(0.0, 0.0)
                bgl.glVertex2f(-1.0, -1.0)
                bgl.glTexCoord2f(1.0, 1.0)
                bgl.glVertex2f(1.0, 1.0)
                bgl.glTexCoord2f(0.0, 1.0)
                bgl.glVertex2f(-1.0, 1.0)
                bgl.glEnd()

                bgl.glCopyTexImage2D(
                    bgl.GL_TEXTURE_2D,  #target
                    0,  #level
                    bgl.GL_RGBA,  #internalformat
                    0,  #x
                    0,  #y
                    tr,
                    tr,
                    0  #border
                )

                #glFlush glFinish or none here?
                bgl.glFinish()

            bgl.glReadPixels(0, 0, tr, tr, bgl.GL_RGBA, bgl.GL_FLOAT,
                             self.rdData[self.name]["buffer"])
            self.rdData[self.name]["image"].pixels = self.rdData[
                self.name]["buffer"][:]
            #write the image channel
            npImage = np.asarray(self.rdData[self.name]["image"].pixels,
                                 dtype="float")
            self.rdData[self.name]["npArray"] = npImage.reshape(
                tr, tr, self.rdData[self.name]["image"].channels)

            self.outputs[0].setPackedImageFromChannels(
                self.rdData[self.name]["npArray"][:, :, 0], j, flatten=True)
            self.outputs[1].setPackedImageFromChannels(
                self.rdData[self.name]["npArray"][:, :, 1], j, flatten=True)
            self.outputs[2].setPackedImageFromPixels(
                self.rdData[self.name]["npArray"])

            self.inputs[0].setPackedImageFromChannels(
                self.rdData[self.name]["npArray"][:, :, 0], j, flatten=True)
            self.inputs[1].setPackedImageFromChannels(
                self.rdData[self.name]["npArray"][:, :, 1], j, flatten=True)

            # ================================= Test bed
            # self.outputs[0].getTexture().image.copy()
            # self.outputs[1].getTexture().image.copy()
            # self.outputs[2].getTexture().image.copy()

            # nparr = np.asarray(self.outputs[0].getTexture().image.pixels, dtype="float")
            # nparr = nparr.reshape(tr, tr, 4)
            # print(nparr)

            self.rdData[self.name]["image"].gl_free()

        #restore the state so blender wont break
        bgl.glEnable(bgl.GL_SCISSOR_TEST)
        bgl.glUseProgram(self.rdData[self.name]["prev_program"][0])
        bgl.glActiveTexture(bgl.GL_TEXTURE0)
Beispiel #13
0
def render_main_svg(self, context, animation=False):

    # Save old info
    scene = context.scene
    sceneProps = scene.MeasureItArchProps
    sceneProps.is_render_draw = True
    sceneProps.is_vector_draw = True

    clipdepth = context.scene.camera.data.clip_end
    path = bpy.path.abspath(scene.render.filepath)
    objlist = context.view_layer.objects

    # --------------------
    # Get resolution
    # --------------------

    render_scale = scene.render.resolution_percentage / 100
    width = int(scene.render.resolution_x * render_scale)
    height = int(scene.render.resolution_y * render_scale)

    offscreen = gpu.types.GPUOffScreen(width, height)

    view_matrix_3d = scene.camera.matrix_world.inverted()
    projection_matrix = scene.camera.calc_matrix_camera(
        context.view_layer.depsgraph, x=width, y=height)

    # Render Depth Buffer
    print("Rendering Depth Buffer")
    if sceneProps.vector_depthtest:
        with offscreen.bind():
            # Clear Depth Buffer, set Clear Depth to Cameras Clip Distance
            set_OpenGL_Settings(True)
            bgl.glClear(bgl.GL_DEPTH_BUFFER_BIT)
            bgl.glClearDepth(clipdepth)
            bgl.glEnable(bgl.GL_DEPTH_TEST)
            bgl.glDepthFunc(bgl.GL_LEQUAL)

            gpu.matrix.reset()
            gpu.matrix.load_matrix(view_matrix_3d)
            gpu.matrix.load_projection_matrix(projection_matrix)

            texture_buffer = bgl.Buffer(bgl.GL_FLOAT, width * height)

            draw_scene(self, context, projection_matrix)

            bgl.glReadBuffer(bgl.GL_BACK)
            bgl.glReadPixels(0, 0, width, height, bgl.GL_DEPTH_COMPONENT,
                             bgl.GL_FLOAT, texture_buffer)

            if 'depthbuffer' in sceneProps:
                del sceneProps['depthbuffer']
            sceneProps['depthbuffer'] = texture_buffer
        offscreen.free()
        set_OpenGL_Settings(False)

        if False:
            imageName = 'depthBufferTest'
            if not imageName in bpy.data.images:
                bpy.data.images.new(imageName,
                                    width,
                                    height,
                                    alpha=False,
                                    float_buffer=True,
                                    is_data=True)
            image = bpy.data.images[imageName]

            image.scale(width, height)
            image.pixels = [v for v in texture_buffer]

    # Setup Output Path
    outpath = "{}_{:04d}.svg".format(path, scene.frame_current)

    view = get_view()

    paperWidth = width / sceneProps.default_resolution
    paperHeight = height / sceneProps.default_resolution

    try:
        if view.res_type == 'res_type_paper':
            paperWidth = round(view.width * 39.370078740196853, 3)
            paperHeight = round(view.height * 39.370078740196853, 3)
    except:
        print('No View Present, using default resolution')

    # Setup basic svg
    svg = svgwrite.Drawing(
        outpath,
        debug=False,
        size=('{}in'.format(paperWidth), '{}in'.format(paperHeight)),
        viewBox=('0 0 {} {}'.format(width, height)),
        id='root',
    )

    if sceneProps.embed_scene_render:

        lastformat = scene.render.image_settings.file_format
        scene.render.image_settings.file_format = 'PNG'
        scene.render.use_file_extension = True
        bpy.ops.render.render(write_still=True)

        image_path = bpy.context.scene.render.filepath
        png_image_path = os.path.basename("{}.png".format(image_path))
        svg.add(svg.image(png_image_path, **{
            'width': width,
            'height': height
        }))

        scene.render.image_settings.file_format = lastformat

    # -----------------------------
    # Loop to draw all objects
    # -----------------------------
    draw3d_loop(context, objlist, svg=svg)
    draw_titleblock(context, svg=svg)

    if sceneProps.embed_freestyle_svg:
        # If "FreeStyle SVG export" addon is loaded, we render the scene to SVG
        # and embed the output in the final SVG.
        freestyle_svg_export = 'render_freestyle_svg' in get_loaded_addons()

        lastformat = scene.render.image_settings.file_format, scene.render.use_freestyle, scene.svg_export.use_svg_export, scene.svg_export.mode
        if freestyle_svg_export:
            scene.render.use_freestyle = True
            scene.svg_export.use_svg_export = True
            scene.svg_export.mode = 'FRAME'

        base_path = bpy.context.scene.render.filepath
        bpy.context.scene.render.filepath += '_freestyle_'
        scene.render.image_settings.file_format = 'PNG'
        scene.render.use_file_extension = True
        bpy.ops.render.render(write_still=False)

        image_path = bpy.context.scene.render.filepath

        if freestyle_svg_export:
            frame = scene.frame_current
            svg_image_path = bpy.path.abspath("{}{:04d}.svg".format(
                image_path, frame))
            svg_root = ET.parse(svg_image_path).getroot()
            for elem in svg_root:
                svg.add(SVGWriteElement(elem))
            if os.path.exists(
                    svg_image_path) and not sceneProps.keep_freestyle_svg:
                os.remove(svg_image_path)

        scene.render.image_settings.file_format = lastformat[0]
        scene.render.use_freestyle = lastformat[1]
        scene.svg_export.use_svg_export = lastformat[2]
        scene.svg_export.mode = lastformat[3]
        bpy.context.scene.render.filepath = base_path

    svg.save(pretty=True)
    # restore default value
    sceneProps.is_render_draw = False
    sceneProps.is_vector_draw = False
    return True