def shared_faces(self, other, as_compound=False): """ Get shared faces between this shape and the other. :param afem.topology.entities.Shape other: The other shape. :param bool as_compound: Option to return shared shapes as a single compound. :return: Shared faces. :rtype: list(afem.topology.entities.Face) or afem.topology.entities.Compound """ this_map = TopTools_IndexedMapOfShape() TopExp.MapShapes_(self.object, Shape.FACE, this_map) if this_map.Extent() == 0: return [] other_map = TopTools_IndexedMapOfShape() TopExp.MapShapes_(other.object, Shape.FACE, other_map) if other_map.Extent() == 0: return [] faces = [] for i in range(1, this_map.Size() + 1): f1 = this_map.FindKey(i) if other_map.Contains(f1): faces.append(Shape.wrap(f1)) if as_compound: return Compound.by_shapes(faces) return faces
def num_faces(self): """ :return: The number of faces in the shape. :rtype: int """ map_ = TopTools_IndexedMapOfShape() TopExp.MapShapes_(self.object, Shape.FACE, map_) return map_.Extent()
def _get_shapes(self, type_): """ Get sub-shapes of a specified type from the shape. """ map_ = TopTools_IndexedMapOfShape() TopExp.MapShapes_(self.object, type_, map_) shapes = [] for i in range(1, map_.Size() + 1): shapes.append(Shape.wrap(map_.FindKey(i))) return shapes
def __init__(self, old_shapes, tool): reshape = ShapeBuild_ReShape() self._new_shapes = TopTools_DataMapOfShapeShape() index_map = TopTools_IndexedMapOfShape() for old_shape in old_shapes: # Old shapes shapes = old_shape.faces if not shapes: shapes = old_shape.edges if not shapes: shapes = old_shape.vertices if not shapes: continue # Delete and replace for shape in shapes: # Deleted if tool.is_deleted(shape): reshape.Remove(shape.object) continue # Modified considering shapes already used mod_shapes = tool.modified(shape) replace_shapes = [] for mod_shape in mod_shapes: if index_map.Contains(mod_shape.object): continue replace_shapes.append(mod_shape) index_map.Add(mod_shape.object) if replace_shapes: new_shape = Compound.by_shapes(replace_shapes) reshape.Replace(shape.object, new_shape.object) new_shape = Shape.wrap(reshape.Apply(old_shape.object)) self._new_shapes.Bind(old_shape.object, new_shape.object)
def test_FindSubShape(self): """ Test XCAFDoc_ShapeTool:FindSubShape. """ names = [ 'back face', 'front face', 'left face', 'right face', 'bottom face', 'top face' ] labels = TDF_LabelSequence() self._tool.GetShapes(labels) self.assertFalse(labels.IsEmpty()) self.assertEqual(labels.Length(), 1) label = labels.Value(1) named_shape = TNaming_NamedShape() status, named_shape = label.FindAttribute(TNaming_NamedShape.GetID_(), named_shape) self.assertTrue(status) shape = named_shape.Get() self.assertEqual(shape.ShapeType(), TopAbs_ShapeEnum.TopAbs_SOLID) map_ = TopTools_IndexedMapOfShape() TopExp.MapShapes_(shape, TopAbs_ShapeEnum.TopAbs_FACE, map_) for i in range(1, map_.Size() + 1): face = map_.FindKey(i) status, sub_label = self._tool.FindSubShape(label, face) self.assertTrue(status) name = TDataStd_Name() status, name = sub_label.FindAttribute(TDataStd_Name.GetID_(), name) self.assertTrue(status) name = name.Get().ToExtString() self.assertEqual(name, names[i - 1])