`enable` 方法在 PartManager 里调不出来,报 `AttributeError: 'PartManager' object has no attribute 'enable'`,翻了一下文档才发现 PartManager 和 Part 是两层不同的东西,Part 继承自 Entity,enable 是 Entity 上的方法,但 PartManager 管的是集合,集合本身没有 enable,得先从 Manager 里把 Part 取出来再调 enable。
写一个自定义基类的时候用 `class MyPartBase(Adams.Part)` 这样继承,但 Adams 暴露出来的 Part 类有时候构造参数不好凑,直接继承容易在实例化的时候报参数数量不对。换个思路,用普通的 Python 类包一层,把 Adams 对象作为属性存进去,`class MyPartWrapper:` 里面 `self._part = adams_part_obj`,需要改属性的时候调 `self._part.enable` 或者 `self._part.name = xxx`,这样继承的层级在自己的代码里控制,Adams 那边的对象只管拿引用就行。
`super()` 调用父类的 `__init__` 的时候小心,Adams 的 Part 类初始化需要传模型对象和名字,子类里写 `super().__init__(model, name)` 参数顺序和数量得跟父类对上,对不上就报 `TypeError`。更稳的做法是不要在子类的 `__init__` 里调父类的构造,父类只当一个方法容器,`__init__` 里自己建 Adams 对象,把引用存起来,方法覆盖的时候用 `super().method_name()` 显式调父类的实现,这样继承链清楚。
Command Window 里跑 Python 有个坑,for 循环中间空了一行就被当成循环结束了,后面带缩进的行全报 `IndentationError`,这个问题在 Hexagon 论坛上有人专门问过,解决方案是用脚本文件跑,别在 Command Window 里直接贴多行代码,VSCode 有 MSC Adams 扩展可以在活动会话里跑 Python,比在 Adams 自带的窗口里折腾方便。
实战里继承主要用在批量创建子系统的场景,写一个 `SubsystemBuilder` 基类,`__init__` 里建空子系统,`add_part()` 和 `add_joint()` 是抽象方法,子类比如 `FrontSuspensionBuilder` 覆盖这两个方法,往子系统里塞具体的部件和约束,基类里再写一个 `build()` 方法统一调 add_part 和 add_joint,写完以后批量建前悬后悬的时候每个子类只管硬点和约束类型,通用的装配逻辑全在基类里,改一次全改。
Adams 的 Python 接口文档在 `Adams Basic Package > Adams View > Adams Python Interface` 下面,类参考手册里每个类的继承层级都列出来了,Entity 是最顶层的基类,Part、Joint、Marker、Force 都继承自 Entity,Manager 是另一套体系,PartManager、JointManager 这些管集合的类不继承 Entity,所以 Entity 上的方法在 Manager 上没有。查方法的时候先确认是在 Entity 层级还是 Manager 层级。
`dir()` 和 `help()` 两个内置函数在 Adams Python 里都能用,`dir(Adams.getCurrentModel().Parts)` 看 Manager 上有什么方法,`help(Adams.Part)` 看 Part 类的方法列表和签名,比翻文档快。但是 `help()` 有时候显示出来的方法实际上不能用,论坛上有人吐槽过 iteritems 在帮助里能看到但调用就崩,先 `dir()` 看看实际有什么,再一个个试。
Path 配置跟继承本身关系不大但得提一句,自定义类文件放在插件目录下,`sys.path.append('<plugin_path>')` 加进去,用完了 `sys.path.remove()` 清理掉,不然下次启动路径里还挂着旧版本,import 的是缓存的旧类,改了代码不生效,这个坑比继承本身的坑还隐蔽。

需要购买ADAMS-PYTHON二次开发教程的先站内联系。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删