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")
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)
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)