{"record":{"id":"45bdc5687284f670","repo":"Genesis-Embodied-AI/genesis-world","slug":"this-property-has-been-removed-45bdc5","errorCode":null,"errorMessage":"This property has been removed.","messagePattern":"This property has been removed\\.","errorType":"exception","errorClass":"DeprecationError","httpStatus":null,"severity":"error","filePath":"genesis/engine/entities/rigid_entity/rigid_link.py","lineNumber":1258,"sourceCode":"        return sum([geom.n_verts for geom in self._geoms])\n\n    @property\n    def n_faces(self) -> int:\n        \"\"\"\n        Number of faces of all the link's geoms.\n        \"\"\"\n        return sum([geom.n_faces for geom in self._geoms])\n\n    @property\n    def n_edges(self) -> int:\n        \"\"\"\n        Number of edges of all the link's geoms.\n        \"\"\"\n        return sum([geom.n_edges for geom in self._geoms])\n\n    @property\n    def is_free(self):\n        raise DeprecationError(\"This property has been removed.\")\n","sourceCodeStart":1240,"sourceCodeEnd":1259,"githubUrl":"https://github.com/Genesis-Embodied-AI/genesis-world/blob/56e4aa5d82bdb83f2e532e4cc364cb69527acb06/genesis/engine/entities/rigid_entity/rigid_link.py#L1240-L1259","documentation":"RigidLink.is_free has been removed and raises DeprecationError on access. Free-floating status must now be derived from the link's root_joint (a link is free-floating when its root joint is a free joint) or from the entity-level API.","triggerScenarios":"Accessing link.is_free on a RigidLink, e.g. in per-link gravity compensation, sleep/hibernation logic, or custom contact handling written for an older Genesis.","commonSituations":"Migrating simulation code after the link API refactor removed boolean mobility shortcuts; scripts that looped over entity.links and branched on link.is_free for applying forces or damping.","solutions":["Derive mobility from the link's root joint, e.g. link.root_joint is not None and link.root_joint.type == gs.JOINT_TYPE.FREE","Check link.is_fixed for the fixed/free distinction if that is what you need","Grep for '.is_free' across link loops and replace with the root-joint or is_fixed check"],"exampleFix":"# before\nif link.is_free:\n    ...\n# after\nif link.is_fixed is False and link.root_joint is not None and link.root_joint.type == gs.JOINT_TYPE.FREE:\n    ...","handlingStrategy":"validation","validationCode":null,"typeGuard":"def link_is_free_floating(link) -> bool:\n    return link.root_joint is not None and link.root_joint.type == gs.JOINT_TYPE.FREE\n","tryCatchPattern":"try:\n    val = link.is_free\nexcept DeprecationError:\n    val = link.root_joint is not None and link.root_joint.type == gs.JOINT_TYPE.FREE\n","preventionTips":["Derive mobility from root joint type or link.is_fixed instead of removed booleans","Centralize per-link mobility checks in one helper so API removals break one place"],"tags":["genesis","deprecation","rigid-link","api-removal"],"backgroundTag":"removed-api-migration","analyzedSha":"56e4aa5d82bdb83f2e532e4cc364cb69527acb06","analyzedAt":"2026-08-28T15:15:07.922Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}