staad-geometry — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited staad-geometry (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
geo = staad.Geometrygeo.AddNode(x, y, z) → node ID (coordinates in base unit)geo.AddBeam(startNode, endNode) → beam IDgeo.AddPlate(n1, n2, n3, n4) → plate ID — pass 4 separate int args, NOT a list0 as a sentinel for the missing 4th node → geo.AddPlate(n1, n2, n3, 0)geo.AddSolid(n1, n2, n3, n4, n5, n6, n7, n8) → solid IDgeo.AddMultipleNodes([[x,y,z], ...]) → list of node IDsgeo.AddMultipleBeams([[start,end], ...]) → list of beam IDsgeo.AddMultiplePlates([[n1,n2,n3,n4], ...]) → list of plate IDs0 as the sentinel 4th element → [n1, n2, n3, 0]geo.CreateNode(nodeNo, x, y, z) — creates node with a specific IDgeo.CreateBeam(beamNo, startNode, endNode) — beam with specific IDgeo.CreatePlate(plateNo, nA, nB, nC, nD) — plate with specific ID0 for nD (the sentinel for a missing 4th node) → geo.CreatePlate(id, nA, nB, nC, 0)geo.CreateSolid(solidNo, nA, nB, nC, nD, nE, nF, nG, nH) — solid with specific IDIMPORTANT: Beams, plates, and solids share a SINGLE continuous ID counter.
geo.GetBeamList(), geo.GetPlateList(), geo.GetSolidList()| Function | Returns | Notes |
|---|---|---|
GetNodeCount() | int | total nodes |
GetMemberCount() | int | total beams |
GetPlateCount() | int | total plates |
GetSolidCount() | int | total solids |
GetNodeList() | list | all node IDs |
GetBeamList() | list | all beam IDs |
GetPlateList() | list | all plate IDs |
GetSolidList() | list | all solid IDs |
GetLastNodeNo() | int | highest node ID |
GetLastBeamNo() | int | highest beam ID |
GetNodeCoordinates(nid) | (x,y,z) | |
GetMemberIncidence(bid) | (start,end) | start/end node IDs |
GetPlateIncidence(pid) | (n1,n2,n3,n4) | 0 if triangle |
GetBeamLength(bid) | float | in base units |
GetNodeDistance(nA, nB) | float | distance between two nodes |
IsColumn(bid, tol) | bool | True if near-vertical (tol in degrees) |
IsBeam(bid, tol) | bool | True if near-horizontal |
IsOrphanNode(nid) | bool | True if not connected |
geo.SetNodeCoordinate(nodeNo, x, y, z) — move a nodegeo.DeleteNode(nodeNo) / geo.DeleteBeam(beamNo) / geo.DeletePlate(plateNo) / geo.DeleteSolid(solidNo)geo.MergeNodes(newId, nodeList) — merge coincident nodesgeo.SplitBeamInEqlParts(beamNo, nParts) — split beam into equal segmentsgeo.SplitBeam(beamNo, nodes, distToNodes) — split at specific distancesgeo.IntersectBeams(method, beamList, tolerance) — split beams at intersectionsgeo.MergeBeams(beamList, newId, propId, betaAngle, material) — merge collinear beamsgeo.RenumberBeam(oldNo, newNo) — renumber a beamgeo.BreakBeamsAtSpecificNodes(nodeList) — break beams at nodesSelections are additive — always clear before starting a new selection.
| Operation | Beams | Nodes | Plates | Solids |
|---|---|---|---|---|
| Clear | ClearMemberSelection() | ClearNodeSelection() | ClearPlateSelection() | ClearSolidSelection() |
| Single | SelectBeam(id) | SelectNode(id) | SelectPlate(id) | SelectSolid(id) |
| Multiple | SelectMultipleBeams(ids) | SelectMultipleNodes(ids) | SelectMultiplePlates(ids) | SelectMultipleSolids(ids) |
| Query | GetSelectedBeams() | GetSelectedNodes() | GetSelectedPlates() | GetSelectedSolids() |
| Count | GetNoOfSelectedBeams() | GetNoOfSelectedNodes() | GetNoOfSelectedPlates() | GetNoOfSelectedSolids() |
All select/clear functions return 0 on success.
| Function | Description |
|---|---|
CreateGroup(type, name) | create empty group |
CreateGroupEx(type, name, entityList) | create with entities |
UpdateGroup(name, option, entityList) | modify: 0=Replace, 1=Remove, 2=Add |
DeleteGroup(name) | delete group |
GetGroupCount(type) | count by type |
GetGroupNames(type) | list names |
GetGroupEntityCount(name) | entity count |
GetGroupEntities(name) | entity ID list |
Group types: 1=Nodes, 2=Members, 3=Plates, 4=Solids, 5=Geometry, 6=FloorBeam
Duplicate selected geometry along an axis:
geo.DoTranslationalRepeat(
link_bays=True, open_base=False,
axis_dir=0, # 0=GX, 1=GY, 2=GZ
spacing_list=[5.0, 5.0], no_of_bays=2,
renumber_bays=False, renumber_list=[],
geometry_only_flag=False
)surf_id = geo.DefineParametricSurface(name, type, origin_Node, x_vertex_node, y_vertex_node, vertices_list, auto_generate)
geo.AddParametricSurfaceToModel(surf_id)
geo.CommitParametricSurfaceMesh(surf_id)Types: 1=Wall, 2=Slab
geo.CreatePhysicalMember(memberList)
pm_count = geo.GetPhysicalMemberCount()geo.SetNodeUniqueID(nodeNo, uniqueID) / geo.GetNodeUniqueID(nodeNo)geo.SetMemberUniqueID(beamNo, uniqueID) / geo.GetMemberUniqueID(beamNo)geo.SetPlateUniqueID(plateNo, uniqueID) / geo.GetPlateUniqueID(plateNo)0 triangle convention)0 tells STAAD the slot is empty (i.e., this is a 3-node element). See add-plate.py for a full example.AddPlate takes 4 separate int arguments, NOT a list — geo.AddPlate(n1, n2, n3, n4) not geo.AddPlate([n1,n2,n3,n4])staad.SetSilentMode(True) → staad.SaveModel(True) → staad.SetSilentMode(False) before assigning properties, supports, or loads — do NOT use UpdateStructure() (it discards unsaved in-memory geometry)geo (OSGeometry) for selections — do NOT use OSView.SelectByItemList~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.