Add a fiber to a fiber section
| 1170 | |
| 1171 | // Add a fiber to a fiber section |
| 1172 | int |
| 1173 | TclCommand_addFiber(ClientData clientData, Tcl_Interp *interp, int argc, |
| 1174 | TCL_Char ** const argv) |
| 1175 | { |
| 1176 | enum class Position : int { |
| 1177 | Y, Z, Area, Material, End |
| 1178 | }; |
| 1179 | ArgumentTracker<Position> tracker; |
| 1180 | std::set<int> positional; |
| 1181 | |
| 1182 | assert(clientData != nullptr); |
| 1183 | BasicModelBuilder* builder = static_cast<BasicModelBuilder*>(clientData); |
| 1184 | |
| 1185 | SectionBuilder* fiberSectionRepr = findSectionBuilder(builder, interp, argc, argv); |
| 1186 | if (fiberSectionRepr == nullptr) { |
| 1187 | opserr << OpenSees::PromptValueError << "cannot retrieve a section builder\n"; |
| 1188 | return TCL_ERROR; |
| 1189 | } |
| 1190 | |
| 1191 | double yLoc, zLoc=0, area; |
| 1192 | int matTag; |
| 1193 | bool warn_2d_z = false; |
| 1194 | static constexpr int WarpModeCount = 3; |
| 1195 | double warp[WarpModeCount][3]{}; |
| 1196 | int warp_arg = -1; |
| 1197 | for (int i=1; i<argc; i++) { |
| 1198 | if (strcmp(argv[i], "-section") == 0) { |
| 1199 | ++i; |
| 1200 | } |
| 1201 | else if (strcmp(argv[i], "-warp") == 0) { |
| 1202 | if (i + 1 >= argc) { |
| 1203 | opserr << OpenSees::PromptValueError << "missing warp argument\n"; |
| 1204 | return TCL_ERROR; |
| 1205 | } |
| 1206 | warp_arg = i+1; |
| 1207 | i++; |
| 1208 | } |
| 1209 | else if (strcmp(argv[i], "-warn-2d-z") == 0) { |
| 1210 | warn_2d_z = true; |
| 1211 | i++; |
| 1212 | } |
| 1213 | else if (strcmp(argv[i], "-material") == 0) { |
| 1214 | if (argc == ++i || Tcl_GetInt(interp, argv[i], &matTag) != TCL_OK) { |
| 1215 | opserr << OpenSees::PromptValueError << "invalid material tag\n"; |
| 1216 | return TCL_ERROR; |
| 1217 | } |
| 1218 | tracker.consume(Position::Material); |
| 1219 | } |
| 1220 | else if (strcmp(argv[i], "-area") == 0) { |
| 1221 | if (argc == ++i || Tcl_GetDouble(interp, argv[i], &area) != TCL_OK) { |
| 1222 | opserr << OpenSees::PromptValueError << "invalid area\n"; |
| 1223 | return TCL_ERROR; |
| 1224 | } |
| 1225 | tracker.consume(Position::Area); |
| 1226 | } |
| 1227 | else if (strcmp(argv[i], "-y") == 0) { |
| 1228 | if (argc == ++i || Tcl_GetDouble(interp, argv[i], &yLoc) != TCL_OK) { |
| 1229 | opserr << OpenSees::PromptValueError << "invalid y coordinate\n"; |
nothing calls this directly
no test coverage detected