Exemplo n.º 1
0
    def draw_solid_entity(self, entity: DXFGraphic,
                          properties: Properties) -> None:
        if isinstance(entity, Face3d):
            dxf = entity.dxf
            try:
                # this implementation supports all features of example file:
                # examples_dxf/3dface.dxf without changing the behavior of
                # Face3d.wcs_vertices() which removes the last vertex if
                # duplicated.
                points = [dxf.vtx0, dxf.vtx1, dxf.vtx2, dxf.vtx3, dxf.vtx0]
            except AttributeError:
                # all 4 vertices are required, otherwise the entity is invalid
                # for AutoCAD
                self.skip_entity(entity, "missing required vertex attribute")
                return
            edge_visibility = entity.get_edges_visibility()
            if all(edge_visibility):
                self.out.draw_path(from_vertices(points), properties)
            else:
                for a, b, visible in zip(points, points[1:], edge_visibility):
                    if visible:
                        self.out.draw_line(a, b, properties)

        elif isinstance(entity, Solid):
            # set solid fill type for SOLID and TRACE
            properties.filling = Filling()
            self.out.draw_filled_polygon(entity.wcs_vertices(close=False),
                                         properties)

        else:
            raise TypeError(
                "API error, requires a SOLID, TRACE or 3DFACE entity")
Exemplo n.º 2
0
def mapping(
    entity: DXFGraphic,
    distance: float = MAX_FLATTENING_DISTANCE,
    force_line_string: bool = False,
) -> Dict:
    """Create the compiled ``__geo_interface__`` mapping as :class:`dict`
    for the given DXF `entity`, all coordinates are :class:`Vec3` objects and
    represents "Polygon" always as tuple (exterior, holes) even without holes.


    Internal API - result is **not** a valid ``_geo_interface__`` mapping!

    Args:
        entity: DXF entity
        distance: maximum flattening distance for curve approximations
        force_line_string: by default this function returns Polygon objects for
            closed geometries like CIRCLE, SOLID, closed POLYLINE and so on,
            by setting argument `force_line_string` to ``True``, this entities
            will be returned as LineString objects.

    """

    dxftype = entity.dxftype()
    if isinstance(entity, Point):
        return {TYPE: POINT, COORDINATES: entity.dxf.location}
    elif isinstance(entity, Line):
        return line_string_mapping([entity.dxf.start, entity.dxf.end])
    elif isinstance(entity, Polyline):
        if entity.is_3d_polyline or entity.is_2d_polyline:
            # May contain arcs as bulge values:
            path = make_path(entity)
            points = list(path.flattening(distance))
            return _line_string_or_polygon_mapping(points, force_line_string)
        else:
            raise TypeError("Polymesh and Polyface not supported.")
    elif isinstance(entity, LWPolyline):
        # May contain arcs as bulge values:
        path = make_path(entity)
        points = list(path.flattening(distance))
        return _line_string_or_polygon_mapping(points, force_line_string)
    elif dxftype in {"CIRCLE", "ARC", "ELLIPSE", "SPLINE"}:
        return _line_string_or_polygon_mapping(
            list(entity.flattening(distance)),
            force_line_string  # type: ignore
        )
    elif dxftype in {"SOLID", "TRACE", "3DFACE"}:
        return _line_string_or_polygon_mapping(
            entity.wcs_vertices(close=True),
            force_line_string  # type: ignore
        )
    elif isinstance(entity, DXFPolygon):
        return _hatch_as_polygon(entity, distance, force_line_string)
    else:
        raise TypeError(dxftype)
Exemplo n.º 3
0
 def draw_solid_entity(self, entity: DXFGraphic,
                       properties: Properties) -> None:
     assert isinstance(entity, (Solid, Face3d)), \
         "API error, requires a SOLID, TRACE or 3DFACE entity"
     dxf, dxftype = entity.dxf, entity.dxftype()
     points = entity.wcs_vertices()
     if dxftype == '3DFACE':
         self.out.draw_path(from_vertices(points, close=True), properties)
     else:
         # set solid fill type for SOLID and TRACE
         properties.filling = Filling()
         self.out.draw_filled_polygon(points, properties)