def import_dxf_layer_geometry(dxf, layername):
    entities = dxf.entities
    generics = []
    for entity in entities:
        if entity.dxf.layer in layername:
            if isinstance(entity, ezdxf.modern.graphics.Line):
                import numpy
                points = numpy.array(
                    [entity.dxf.start[:2], entity.dxf.end[:2]])
                generics.append(
                    GenericLine.gen_from_point_lists(points.tolist(), []))
            elif isinstance(entity, ezdxf.modern.graphics.LWPolyline):
                import numpy
                points = numpy.array([item for item in entity.get_points()])
                points = points[:, :2]
                if entity.closed:
                    generics.append(
                        GenericPoly.gen_from_point_lists(points.tolist(), []))
                else:
                    generics.append(
                        GenericPolyline.gen_from_point_lists(
                            points.tolist(), []))
            elif isinstance(entity, ezdxf.modern.graphics.Point):
                from popupcad.geometry.vertex import DrawnPoint
                point = DrawnPoint(
                    numpy.array(entity.get_dxf_attrib('location')[:2]))
                generics.append(point)
            elif isinstance(entity, ezdxf.modern.graphics.Spline):
                knots = entity.get_knot_values()
                control_points = entity.get_control_points()
                weights = entity.get_weights()
                n = len(control_points) - 1
                domain = popupcad.algorithms.spline_functions.make_domain(
                    knots, n * 5)
                points = popupcad.algorithms.spline_functions.interpolated_points(
                    control_points, knots, weights, domain)
                points = points[:, :2]
                if entity.closed:
                    generics.append(
                        GenericPoly.gen_from_point_lists(points.tolist(), []))
                else:
                    generics.append(
                        GenericPolyline.gen_from_point_lists(
                            points.tolist(), []))

                    #                        print(points)
            else:
                print(entity)

    new = popupcad.filetypes.sketch.Sketch.new()
    new.addoperationgeometries(generics)
    newsketchname = layername + '.sketch'
    new.updatefilename(newsketchname)

    return new
def import_dxf_layer_geometry(dxf, layername):
    entities = dxf.entities
    generics = []
    for entity in entities:
        if entity.dxf.layer in layername:
            if isinstance(entity, ezdxf.modern.graphics.Line):
                import numpy
                points = numpy.array(
                    [entity.dxf.start[:2], entity.dxf.end[:2]])
                generics.append(
                    GenericLine.gen_from_point_lists(
                        points.tolist(),
                        []))
            elif isinstance(entity, ezdxf.modern.graphics.LWPolyline):
                import numpy
                points = numpy.array([item for item in entity.get_points()])
                points = points[:, :2]
                if entity.closed:
                    generics.append(GenericPoly.gen_from_point_lists(points.tolist(), []))
                else:
                    generics.append(GenericPolyline.gen_from_point_lists(points.tolist(), []))
            elif isinstance(entity, ezdxf.modern.graphics.Point):
                from popupcad.geometry.vertex import DrawnPoint
                point = DrawnPoint(numpy.array(entity.get_dxf_attrib('location')[:2]))
                generics.append(point)
            elif isinstance(entity, ezdxf.modern.graphics.Spline):
                knots = entity.get_knot_values()
                control_points = entity.get_control_points()
                weights = entity.get_weights()
                n = len(control_points) - 1
                domain = popupcad.algorithms.spline_functions.make_domain(knots, n * 5)
                points = popupcad.algorithms.spline_functions.interpolated_points(control_points, knots, weights,
                                                                                  domain)
                points = points[:, :2]
                if entity.closed:
                    generics.append(GenericPoly.gen_from_point_lists(points.tolist(), []))
                else:
                    generics.append(GenericPolyline.gen_from_point_lists(points.tolist(), []))

                    #                        print(points)
            else:
                print(entity)

    new = popupcad.filetypes.sketch.Sketch.new()
    new.addoperationgeometries(generics)
    newsketchname = layername + '.sketch'
    new.updatefilename(newsketchname)

    return new
Esempio n. 3
0
def triangulate(vertices):
    '''Create the triangulation of a set of points, and output the resulting triangles'''
    from scipy.spatial import Delaunay
    d = Delaunay(vertices)
    polys = d.points[d.vertices].tolist()
    genericpolys = [GenericPoly.gen_from_point_lists(poly,[]) for poly in polys]
    return genericpolys
Esempio n. 4
0
def convex_hull(vertices):
    '''Create a convex polygon from given points'''
    delaunay = Delaunay(vertices)

    cvx = delaunay.convex_hull.copy()
    lastrow = cvx[0]
    iis = range(len(cvx))
    for ii in iis[1:-1]:
        lastindex = lastrow[1]
        findop = (cvx[ii:] == lastindex).nonzero()

        jj = findop[0][0] + ii

        cvx[(ii, jj), :] = cvx[(jj, ii), :]
        if findop[1][0] == 1:
            cvx[ii, (1, 0)] = cvx[ii, (0, 1)]

        lastrow = cvx[ii]

    lastindex = lastrow[1]
    findop = (cvx[-1] == lastindex).nonzero()
    if findop[0][0] == 1:
        cvx[-1, (1, 0)] = cvx[-1, (0, 1)]

    polyindeces = cvx[:, 0]
    polypoints = delaunay.points[polyindeces, :].tolist()
    poly = GenericPoly.gen_from_point_lists(polypoints, [])
    return poly
Esempio n. 5
0
def convex_hull(vertices):
    '''Create a convex polygon from given points'''
    delaunay = Delaunay(vertices)

    cvx = delaunay.convex_hull.copy()
    lastrow = cvx[0]
    iis = range(len(cvx))
    for ii in iis[1:-1]:
        lastindex = lastrow[1]
        findop = (cvx[ii:] == lastindex).nonzero()

        jj = findop[0][0] + ii

        cvx[(ii, jj), :] = cvx[(jj, ii), :]
        if findop[1][0] == 1:
            cvx[ii, (1, 0)] = cvx[ii, (0, 1)]

        lastrow = cvx[ii]

    lastindex = lastrow[1]
    findop = (cvx[-1] == lastindex).nonzero()
    if findop[0][0] == 1:
        cvx[-1, (1, 0)] = cvx[-1, (0, 1)]

    polyindeces = cvx[:, 0]
    polypoints = delaunay.points[polyindeces, :].tolist()
    poly = GenericPoly.gen_from_point_lists(polypoints, [])
    return poly
Esempio n. 6
0
def triangulate(vertices):
    '''Create the triangulation of a set of points, and output the resulting triangles'''
    from scipy.spatial import Delaunay
    d = Delaunay(vertices)
    polys = d.points[d.vertices].tolist()
    genericpolys = [
        GenericPoly.gen_from_point_lists(poly, []) for poly in polys
    ]
    return genericpolys
Esempio n. 7
0
    def _convert(
            self,
            scalefactor,
            area_ratio,
            colinear_tol,
            bufferval,
            cleanup):
        self.geoms = []
        T1 = numpy.array(self.transform)
        R1 = T1[0:3, 0:3]
        b1 = T1[0:3, 3:4]
        for ii, component in enumerate(self.components):
            T2 = numpy.array(component.transform)
            R2 = T2[0:3, 0:3]
            b2 = T2[0:3, 3:4]
            if component.faces is not None:
                for jj, face in enumerate(component.faces):
                    try:
                        loops = face.loops

                        ints_c = [
                            self.transform_loop(
                                interior,
                                R1,
                                b1,
                                R2,
                                b2,
                                scalefactor) for interior in loops]

                        a = [
                            GenericPoly.gen_from_point_lists(
                                loop,
                                []) for loop in ints_c]
                        b = [item.to_shapely() for item in a]
                        if cleanup >= 0:
                            b = [
                                item.simplify(
                                    cleanup *
                                    popupcad.csg_processing_scaling) for item in b]
                        c = b.pop(0)
                        for item in b:
                            c = c.symmetric_difference(item)
                        d = popupcad.algorithms.csg_shapely.condition_shapely_entities(c)
                        e = popupcad.algorithms.csg_shapely.condition_shapely_entities(*[item.buffer(bufferval * popupcad.csg_processing_scaling,resolution=popupcad.default_buffer_resolution) for item in d])
                        f = [popupcad.algorithms.csg_shapely.to_generic(item) for item in e]
                        self.geoms.extend(f)
                    except NotSimple:
                        pass
                    except ShapeInvalid:
                        pass
                    except ValueError as ex:
                        print(ex)
#                        if ex.message!='A LinearRing must have at least 3 coordinate tuples':
#                            print(ex.message)
        self.filter_small_areas(area_ratio)
Esempio n. 8
0
def painterpath_to_generics(p, subdivision):

    elements = [p.elementAt(ii) for ii in range(p.elementCount())]
    #    element_types = [str(item.type).split('.')[-1] for item in elements]

    vertex_lists = []
    vertex_list = []
    lastelement = elements[0]

    while not not elements:
        element = elements.pop(0)
        if element.type == qg.QPainterPath.MoveToElement:
            #            print('moveto',element.x,element.y)
            if len(vertex_list) > 0:
                vertex_lists.append(vertex_list)
                vertex_list = [(element.x, element.y)]
            lastelement = element

        elif element.type == qg.QPainterPath.LineToElement:
            #            print('lineto',element.x,element.y)
            vertex_list.append((element.x, element.y))
            lastelement = element
        elif element.type == qg.QPainterPath.CurveToElement:
            #            print('curveto',element.x,element.y)

            subelements = []
            next_is_data = True
            while next_is_data:
                subelements.append(elements.pop(0))
                if len(elements) > 0:
                    next_is_data = elements[
                        0].type == qg.QPainterPath.CurveToDataElement
                else:
                    next_is_data = False

            if len(subelements) == 1:
                points = [lastelement, element, subelements[0]]
                vertex_list.extend(interp_2d(quadratic, points, subdivision))
                lastelement = subelements[0]
            elif len(subelements) == 2:
                points = [lastelement, element, subelements[0], subelements[1]]
                vertex_list.extend(interp_2d(cubic, points, subdivision))
                lastelement = subelements[1]

            else:
                raise (Exception('Wrong number of subelements'))

    vertex_lists.append(vertex_list)
    polys = []
    for vertex_list in vertex_lists:
        polys.append(GenericPoly.gen_from_point_lists(vertex_list, []))

    return polys
Esempio n. 9
0
def painterpath_to_generics(p, subdivision):

    elements = [p.elementAt(ii) for ii in range(p.elementCount())]
    #    element_types = [str(item.type).split('.')[-1] for item in elements]

    vertex_lists = []
    vertex_list = []
    lastelement = elements[0]

    while not not elements:
        element = elements.pop(0)
        if element.type == qg.QPainterPath.ElementType.MoveToElement:
            #            print('moveto',element.x,element.y)
            if len(vertex_list) > 0:
                vertex_lists.append(vertex_list)
                vertex_list = [(element.x, element.y)]
            lastelement = element

        elif element.type == qg.QPainterPath.ElementType.LineToElement:
            #            print('lineto',element.x,element.y)
            vertex_list.append((element.x, element.y))
            lastelement = element
        elif element.type == qg.QPainterPath.ElementType.CurveToElement:
            #            print('curveto',element.x,element.y)

            subelements = []
            next_is_data = True
            while next_is_data:
                subelements.append(elements.pop(0))
                if len(elements) > 0:
                    next_is_data = elements[0].type == qg.QPainterPath.ElementType.CurveToDataElement
                else:
                    next_is_data = False

            if len(subelements) == 1:
                points = [lastelement, element, subelements[0]]
                vertex_list.extend(interp_2d(quadratic, points, subdivision))
                lastelement = subelements[0]
            elif len(subelements) == 2:
                points = [lastelement, element, subelements[0], subelements[1]]
                vertex_list.extend(interp_2d(cubic, points, subdivision))
                lastelement = subelements[1]

            else:
                raise (Exception("Wrong number of subelements"))

    vertex_lists.append(vertex_list)
    polys = []
    for vertex_list in vertex_lists:
        polys.append(GenericPoly.gen_from_point_lists(vertex_list, []))

    return polys
Esempio n. 10
0
def supportsheet(layerdef, lsin, value):
    allext = []
    for layer, layer_geometry in lsin.layer_sequence.items():
        for geom in layer_geometry.geoms:
            geom2 = popupcad.algorithms.csg_shapely.to_generic(geom)
            allext.extend(geom2.exteriorpoints(scaling = popupcad.csg_processing_scaling))
    allext = numpy.array(allext)
    minx = allext[:, 0].min() - value
    miny = allext[:, 1].min() - value
    maxx = allext[:, 0].max() + value
    maxy = allext[:, 1].max() + value
    exterior = [[minx, miny], [maxx, miny], [maxx, maxy], [minx, maxy]]
    exterior_scaled = (numpy.array(exterior)/popupcad.csg_processing_scaling).tolist()
    geom = GenericPoly.gen_from_point_lists(exterior_scaled, [])
    geom = geom.to_shapely()
    ls = Laminate(layerdef)
    [ls.replacelayergeoms(layer, [geom]) for layer in layerdef.layers]
    return ls, exterior[0]
Esempio n. 11
0
    def _convert(self,scalefactor,area_ratio,colinear_tol,bufferval,cleanup):
        self.geoms = []
        T1 = numpy.array(self.transform)
        R1 = T1[0:3, 0:3]
        b1 = T1[0:3, 3:4]
        for ii, component in enumerate(self.components):
            T2 = numpy.array(component.transform)
            R2 = T2[0:3, 0:3]
            b2 = T2[0:3, 3:4]
            if component.faces is not None:
                for jj, face in enumerate(component.faces):
                    try:
                        loops = face.loops

                        ints_c = [self.transform_loop(interior,R1,b1,R2,b2,scalefactor) for interior in loops]

                        a = [
                            GenericPoly.gen_from_point_lists(
                                loop,
                                []) for loop in ints_c]
                        b = [item.to_shapely(scaling = popupcad.csg_processing_scaling) for item in a]
                        if cleanup >= 0:
                            b = [
                                item.simplify(
                                    cleanup *
                                    popupcad.csg_processing_scaling) for item in b]
                        c = b.pop(0)
                        for item in b:
                            c = c.symmetric_difference(item)
                        d = popupcad.algorithms.csg_shapely.condition_shapely_entities(c)
                        e = popupcad.algorithms.csg_shapely.condition_shapely_entities(*[item.buffer(bufferval * popupcad.csg_processing_scaling,resolution=popupcad.default_buffer_resolution) for item in d])
                        f = [popupcad.algorithms.csg_shapely.to_generic(item) for item in e]
                        self.geoms.extend(f)
                    except NotSimple:
                        pass
                    except ShapeInvalid:
                        pass
                    except ValueError as ex:
                        print(ex)
#                        if ex.message!='A LinearRing must have at least 3 coordinate tuples':
#                            print(ex.message)
        self.filter_small_areas(area_ratio)
Esempio n. 12
0
def supportsheet(layerdef, lsin, value):
    allext = []
    for layer, layer_geometry in lsin.layer_sequence.items():
        for geom in layer_geometry.geoms:
            geom2 = popupcad.algorithms.csg_shapely.to_generic(geom)
            allext.extend(
                geom2.exteriorpoints(scaling=popupcad.csg_processing_scaling))
    allext = numpy.array(allext)
    minx = allext[:, 0].min() - value
    miny = allext[:, 1].min() - value
    maxx = allext[:, 0].max() + value
    maxy = allext[:, 1].max() + value
    exterior = [[minx, miny], [maxx, miny], [maxx, maxy], [minx, maxy]]
    exterior_scaled = (numpy.array(exterior) /
                       popupcad.csg_processing_scaling).tolist()
    geom = GenericPoly.gen_from_point_lists(exterior_scaled, [])
    geom = geom.to_shapely(scaling=popupcad.csg_processing_scaling)
    ls = Laminate(layerdef)
    [ls.replacelayergeoms(layer, [geom]) for layer in layerdef.layers]
    return ls, exterior[0]
Esempio n. 13
0
    def to_generic_polygons(self,add_shift = True):
#        import popupcad.algorithms.painterpath as pp
        import dev_tools.text_to_polygons
        from matplotlib.font_manager import FontProperties
        from popupcad.filetypes.genericshapes import GenericPoly
        
        text = self.text
#        small font scalings actually produce different paths.  use 10pt font as invariant size
        internal_font = 10
        fp = FontProperties(family = self.font,size=internal_font)
        if text !='':
#            p = qg.QPainterPath()
#            font = qg.QFont(self.font,pointSize=internal_font)
#            p.addText(qc.QPointF(0,internal_font),font,text)
            
#            generic_polygons = pp.painterpath_to_generics(p,popupcad.text_approximation)
            
            polygons = dev_tools.text_to_polygons.text_to_polygons(self.text,fp,popupcad.text_approximation)
            generic_polygons = []
            for item in polygons:
                item = numpy.array(item)
                if popupcad.flip_y:
                    item[:,1]=-1*item[:,1]+internal_font
                item*=(4/3)
                item = item.tolist()
                generic_polygons.append(GenericPoly.gen_from_point_lists(item,[]))
#            
        else:
            generic_polygons = []
        T = numpy.eye(3)
        T[1,1]=-1
        generic_polygons = [item.transform(T) for item in generic_polygons]
        [item.scale(self.fontsize/internal_font) for item in generic_polygons]
        if add_shift:
            for item in generic_polygons:
                item.shift(self.pos.getpos())
        return generic_polygons
Esempio n. 14
0
    def to_generic_polygons(self, add_shift=True):
        import idealab_tools.text_to_polygons
        from matplotlib.font_manager import FontProperties
        from popupcad.filetypes.genericshapes import GenericPoly

        text = self.text
        #        small font scalings actually produce different paths.  use 10pt font as invariant size
        internal_font = 10
        fp = {'family': self.font, 'size': internal_font}
        if text != '':
            polygons = idealab_tools.text_to_polygons.text_to_polygons(
                self.text, fp, popupcad.text_approximation)
            generic_polygons = []
            for item in polygons:
                item = numpy.array(item)
                if popupcad.flip_y:
                    item[:, 1] = -1 * item[:, 1] + internal_font
                item *= (4 / 3)
                item = item.tolist()
                generic_polygons.append(
                    GenericPoly.gen_from_point_lists(item, []))


#
        else:
            generic_polygons = []
        T = numpy.eye(3)
        T[1, 1] = -1
        generic_polygons = [item.transform(T) for item in generic_polygons]
        [
            item.scale(self.fontsize / internal_font)
            for item in generic_polygons
        ]
        if add_shift:
            for item in generic_polygons:
                item.shift(self.pos.getpos())
        return generic_polygons
Esempio n. 15
0
    def load_dxf(cls, filename, parent=None):
        import ezdxf
        ezdxf.options.template_dir = popupcad.supportfiledir        
        
        import ezdxf.modern
        dxf = ezdxf.readfile(filename)
        layer_names = [layer.dxf.name for layer in dxf.layers]
        
        dialog = qg.QDialog()
        lw = qg.QListWidget()
        for item in layer_names:
            lw.addItem(qg.QListWidgetItem(item))
        lw.setSelectionMode(lw.SelectionMode.ExtendedSelection)
        button_ok = qg.QPushButton('Ok')
        button_cancel = qg.QPushButton('Cancel')
        button_ok.clicked.connect(dialog.accept)
        button_cancel.clicked.connect(dialog.reject)

        layout = qg.QVBoxLayout()
        layout_buttons = qg.QHBoxLayout()
        layout_buttons.addWidget(button_ok)
        layout_buttons.addWidget(button_cancel)
        layout.addWidget(lw)
        layout.addLayout(layout_buttons)
        dialog.setLayout(layout)
        result = dialog.exec_()
        
        if result:
            selected_layers = [
                item.data(
                    qc.Qt.ItemDataRole.DisplayRole) for item in lw.selectedItems()]
            entities = dxf.entities
            generics = []
            for entity in entities:
                if entity.dxf.layer in selected_layers:
                    if isinstance(entity, ezdxf.modern.graphics.Line):
                        from popupcad.filetypes.genericshapes import GenericLine
                        import numpy
                        points = numpy.array(
                            [entity.dxf.start[:2], entity.dxf.end[:2]])
                        generics.append(
                            GenericLine.gen_from_point_lists(
                                points.tolist(),
                                []))
                    elif isinstance(entity, ezdxf.modern.graphics.LWPolyline):
                        from popupcad.filetypes.genericshapes import GenericPolyline
                        from popupcad.filetypes.genericshapes import GenericPoly
                        import numpy
                        points = numpy.array([item for item in entity.get_points()])
                        points = points[:,:2]
                        if entity.closed:
                            generics.append(
                                GenericPoly.gen_from_point_lists(
                                    points.tolist(),
                                    []))
                        else:
                            generics.append(
                                GenericPolyline.gen_from_point_lists(
                                    points.tolist(),
                                    []))
                    elif isinstance(entity, ezdxf.modern.graphics.Point):
                        from popupcad.geometry.vertex import DrawnPoint
                        point = DrawnPoint(numpy.array(entity.get_dxf_attrib('location')[:2]))
                        generics.append(point)
                    else:
                        print(entity)
            new = cls()
            new.addoperationgeometries(generics)
            return filename, new
        else:
            return None, None
Esempio n. 16
0
    def load_dxf(cls, filename, parent=None):
        import ezdxf
        ezdxf.options.template_dir = popupcad.supportfiledir

        import ezdxf.modern
        dxf = ezdxf.readfile(filename)
        layer_names = [layer.dxf.name for layer in dxf.layers]

        dialog = qg.QDialog()
        lw = qg.QListWidget()
        for item in layer_names:
            lw.addItem(qg.QListWidgetItem(item))
        lw.setSelectionMode(lw.ExtendedSelection)
        button_ok = qg.QPushButton('Ok')
        button_cancel = qg.QPushButton('Cancel')
        button_ok.clicked.connect(dialog.accept)
        button_cancel.clicked.connect(dialog.reject)

        layout = qg.QVBoxLayout()
        layout_buttons = qg.QHBoxLayout()
        layout_buttons.addWidget(button_ok)
        layout_buttons.addWidget(button_cancel)
        layout.addWidget(lw)
        layout.addLayout(layout_buttons)
        dialog.setLayout(layout)
        result = dialog.exec_()

        if result:
            selected_layers = [
                item.data(qc.Qt.DisplayRole) for item in lw.selectedItems()
            ]
            entities = [item for item in dxf.modelspace()]
            generics = []
            for entity in entities:
                if entity.dxf.layer in selected_layers:
                    if isinstance(entity, ezdxf.modern.graphics.Line):
                        import numpy
                        points = numpy.array(
                            [entity.dxf.start[:2], entity.dxf.end[:2]])
                        generics.append(
                            GenericLine.gen_from_point_lists(
                                points.tolist(), []))
                    elif isinstance(entity, ezdxf.modern.graphics.LWPolyline):
                        import numpy
                        points = numpy.array(
                            [item for item in entity.get_points()])
                        points = points[:, :2]
                        if entity.closed:
                            generics.append(
                                GenericPoly.gen_from_point_lists(
                                    points.tolist(), []))
                        else:
                            generics.append(
                                GenericPolyline.gen_from_point_lists(
                                    points.tolist(), []))
                    elif isinstance(entity, ezdxf.modern.graphics.Point):
                        from popupcad.geometry.vertex import DrawnPoint
                        point = DrawnPoint(
                            numpy.array(entity.get_dxf_attrib('location')[:2]))
                        generics.append(point)
                    elif isinstance(entity, ezdxf.modern.spline.Spline):
                        knots = entity.get_knot_values()
                        control_points = entity.get_control_points()
                        weights = entity.get_weights()
                        n = len(control_points) - 1
                        domain = popupcad.algorithms.spline_functions.make_domain(
                            knots, n * 5)
                        points = popupcad.algorithms.spline_functions.interpolated_points(
                            control_points, knots, weights, domain)
                        points = points[:, :2]
                        if entity.closed:
                            generics.append(
                                GenericPoly.gen_from_point_lists(
                                    points.tolist(), []))
                        else:
                            generics.append(
                                GenericPolyline.gen_from_point_lists(
                                    points.tolist(), []))

#                        print(points)
                    else:
                        print(entity)
            new = cls.new()
            new.addoperationgeometries(generics)
            newfile = os.path.splitext(filename)[0] + '.sketch'
            new.updatefilename(newfile)
            return filename, new
        else:
            return None, None
Esempio n. 17
0
    def load_dxf(cls, filename, parent=None):
        import ezdxf
        ezdxf.options.template_dir = popupcad.supportfiledir        
        
        import ezdxf.modern
        dxf = ezdxf.readfile(filename)
        layer_names = [layer.dxf.name for layer in dxf.layers]
        
        dialog = qg.QDialog()
        lw = qg.QListWidget()
        for item in layer_names:
            lw.addItem(qg.QListWidgetItem(item))
        lw.setSelectionMode(lw.ExtendedSelection)
        button_ok = qg.QPushButton('Ok')
        button_cancel = qg.QPushButton('Cancel')
        button_ok.clicked.connect(dialog.accept)
        button_cancel.clicked.connect(dialog.reject)

        layout = qg.QVBoxLayout()
        layout_buttons = qg.QHBoxLayout()
        layout_buttons.addWidget(button_ok)
        layout_buttons.addWidget(button_cancel)
        layout.addWidget(lw)
        layout.addLayout(layout_buttons)
        dialog.setLayout(layout)
        result = dialog.exec_()
        
        if result:
            selected_layers = [
                item.data(
                    qc.Qt.DisplayRole) for item in lw.selectedItems()]
            entities = [item for item in dxf.modelspace()]
            generics = []
            for entity in entities:
                if entity.dxf.layer in selected_layers:
                    if isinstance(entity, ezdxf.modern.graphics.Line):
                        import numpy
                        points = numpy.array(
                            [entity.dxf.start[:2], entity.dxf.end[:2]])
                        generics.append(
                            GenericLine.gen_from_point_lists(
                                points.tolist(),
                                []))
                    elif isinstance(entity, ezdxf.modern.graphics.LWPolyline):
                        import numpy
                        points = numpy.array([item for item in entity.get_points()])
                        points = points[:,:2]
                        if entity.closed:
                            generics.append(GenericPoly.gen_from_point_lists(points.tolist(),[]))
                        else:
                            generics.append(GenericPolyline.gen_from_point_lists(points.tolist(),[]))
                    elif isinstance(entity, ezdxf.modern.graphics.Point):
                        from popupcad.geometry.vertex import DrawnPoint
                        point = DrawnPoint(numpy.array(entity.get_dxf_attrib('location')[:2]))
                        generics.append(point)
                    elif isinstance(entity, ezdxf.modern.graphics.Spline):
                        knots = entity.get_knot_values()
                        control_points = entity.get_control_points()
                        weights = entity.get_weights()
                        n = len(control_points)-1
                        domain = popupcad.algorithms.spline_functions.make_domain(knots,n*5)
                        points = popupcad.algorithms.spline_functions.interpolated_points(control_points,knots,weights,domain)
                        points = points[:,:2]
                        if entity.closed:
                            generics.append(GenericPoly.gen_from_point_lists(points.tolist(),[]))
                        else:
                            generics.append(GenericPolyline.gen_from_point_lists(points.tolist(),[]))

#                        print(points)
                    else:
                        print(entity)
            new = cls.new()
            new.addoperationgeometries(generics)
            newfile = os.path.splitext(filename)[0]+'.sketch'
            new.updatefilename(newfile)
            return filename, new
        else:
            return None, None