|
37 | 37 | )
|
38 | 38 | from copy import deepcopy
|
39 | 39 | from roboticstoolbox.robot.ET import ET, ET2
|
40 |
| -from typing import Union, overload, List, Set, Tuple |
| 40 | +from typing import Union, overload, List, Set, Tuple, TypeVar |
41 | 41 | from typing_extensions import Literal as L
|
42 | 42 | from sys import version_info
|
43 | 43 | from roboticstoolbox.tools.types import ArrayLike, NDArray
|
|
51 | 51 | else: # pragma: nocover
|
52 | 52 | c_property = property
|
53 | 53 |
|
| 54 | +T = TypeVar("T", bound="BaseETS") |
| 55 | + |
54 | 56 |
|
55 | 57 | class BaseETS(UserList):
|
56 | 58 | def __init__(self, *args):
|
@@ -435,38 +437,32 @@ def m(self) -> int:
|
435 | 437 | return self._m
|
436 | 438 |
|
437 | 439 | @overload
|
438 |
| - def data(self: "ETS") -> List[ET]: |
439 |
| - ... # pragma: nocover |
| 440 | + def data(self: "ETS") -> List[ET]: ... # pragma: nocover |
440 | 441 |
|
441 | 442 | @overload
|
442 |
| - def data(self: "ETS2") -> List[ET2]: |
443 |
| - ... # pragma: nocover |
| 443 | + def data(self: "ETS2") -> List[ET2]: ... # pragma: nocover |
444 | 444 |
|
445 | 445 | @property
|
446 | 446 | def data(self):
|
447 | 447 | return self._data
|
448 | 448 |
|
449 | 449 | @data.setter
|
450 | 450 | @overload
|
451 |
| - def data(self: "ETS", new_data: List[ET]): |
452 |
| - ... # pragma: nocover |
| 451 | + def data(self: "ETS", new_data: List[ET]): ... # pragma: nocover |
453 | 452 |
|
454 | 453 | @data.setter
|
455 | 454 | @overload
|
456 |
| - def data(self: "ETS", new_data: List[ET2]): |
457 |
| - ... # pragma: nocover |
| 455 | + def data(self: "ETS", new_data: List[ET2]): ... # pragma: nocover |
458 | 456 |
|
459 | 457 | @data.setter
|
460 | 458 | def data(self, new_data):
|
461 | 459 | self._data = new_data
|
462 | 460 |
|
463 | 461 | @overload
|
464 |
| - def pop(self: "ETS", i: int = -1) -> ET: |
465 |
| - ... # pragma: nocover |
| 462 | + def pop(self: "ETS", i: int = -1) -> ET: ... # pragma: nocover |
466 | 463 |
|
467 | 464 | @overload
|
468 |
| - def pop(self: "ETS2", i: int = -1) -> ET2: |
469 |
| - ... # pragma: nocover |
| 465 | + def pop(self: "ETS2", i: int = -1) -> ET2: ... # pragma: nocover |
470 | 466 |
|
471 | 467 | def pop(self, i=-1):
|
472 | 468 | """
|
@@ -506,12 +502,10 @@ def pop(self, i=-1):
|
506 | 502 | return item
|
507 | 503 |
|
508 | 504 | @overload
|
509 |
| - def split(self: "ETS") -> List["ETS"]: |
510 |
| - ... # pragma: nocover |
| 505 | + def split(self: "ETS") -> List["ETS"]: ... # pragma: nocover |
511 | 506 |
|
512 | 507 | @overload
|
513 |
| - def split(self: "ETS2") -> List["ETS2"]: |
514 |
| - ... # pragma: nocover |
| 508 | + def split(self: "ETS2") -> List["ETS2"]: ... # pragma: nocover |
515 | 509 |
|
516 | 510 | def split(self):
|
517 | 511 | """
|
@@ -547,15 +541,7 @@ def split(self):
|
547 | 541 |
|
548 | 542 | return segments
|
549 | 543 |
|
550 |
| - @overload |
551 |
| - def inv(self: "ETS") -> "ETS": |
552 |
| - ... # pragma: nocover |
553 |
| - |
554 |
| - @overload |
555 |
| - def inv(self: "ETS2") -> "ETS2": |
556 |
| - ... # pragma: nocover |
557 |
| - |
558 |
| - def inv(self): |
| 544 | + def inv(self: T) -> T: |
559 | 545 | r"""
|
560 | 546 | Inverse of ETS
|
561 | 547 |
|
@@ -589,20 +575,16 @@ def inv(self):
|
589 | 575 | return self.__class__([et.inv() for et in reversed(self.data)])
|
590 | 576 |
|
591 | 577 | @overload
|
592 |
| - def __getitem__(self: "ETS", i: int) -> ET: |
593 |
| - ... # pragma: nocover |
| 578 | + def __getitem__(self: "ETS", i: int) -> ET: ... |
594 | 579 |
|
595 | 580 | @overload
|
596 |
| - def __getitem__(self: "ETS", i: slice) -> List[ET]: |
597 |
| - ... # pragma: nocover |
| 581 | + def __getitem__(self: "ETS", i: slice) -> List[ET]: ... |
598 | 582 |
|
599 | 583 | @overload
|
600 |
| - def __getitem__(self: "ETS2", i: int) -> ET2: |
601 |
| - ... # pragma: nocover |
| 584 | + def __getitem__(self: "ETS2", i: int) -> ET2: ... |
602 | 585 |
|
603 | 586 | @overload
|
604 |
| - def __getitem__(self: "ETS2", i: slice) -> List[ET2]: |
605 |
| - ... # pragma: nocover |
| 587 | + def __getitem__(self: "ETS2", i: slice) -> List[ET2]: ... |
606 | 588 |
|
607 | 589 | def __getitem__(self, i):
|
608 | 590 | """
|
@@ -630,6 +612,41 @@ def __getitem__(self, i):
|
630 | 612 | """
|
631 | 613 | return self.data[i] # can be [2] or slice, eg. [3:5]
|
632 | 614 |
|
| 615 | + @overload |
| 616 | + def __setitem__(self: "ETS", i: int, value: ET): ... |
| 617 | + |
| 618 | + @overload |
| 619 | + def __setitem__(self: "ETS", i: slice, value: List[ET]): ... |
| 620 | + |
| 621 | + @overload |
| 622 | + def __setitem__(self: "ETS2", i: int, value: ET2): ... |
| 623 | + |
| 624 | + @overload |
| 625 | + def __setitem__(self: "ETS2", i: slice, value: List[ET2]): ... |
| 626 | + |
| 627 | + def __setitem__(self, i, value): |
| 628 | + """ |
| 629 | + Set an item in the ETS |
| 630 | +
|
| 631 | + Parameters |
| 632 | + ---------- |
| 633 | + i |
| 634 | + the index |
| 635 | + value |
| 636 | + the value to set |
| 637 | +
|
| 638 | + Examples |
| 639 | + -------- |
| 640 | + .. runblock:: pycon |
| 641 | + >>> from roboticstoolbox import ET |
| 642 | + >>> e = ET.Rz() * ET.tx(1) * ET.Rz() * ET.tx(1) |
| 643 | + >>> e[1] = ET.tx(2) |
| 644 | + >>> e |
| 645 | +
|
| 646 | + """ |
| 647 | + self.data[i] = value |
| 648 | + self._update_internals() |
| 649 | + |
633 | 650 | def __deepcopy__(self, memo):
|
634 | 651 | new_data = []
|
635 | 652 |
|
|
0 commit comments