C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

ツールクラスとマネージャー

これを作らないと先に進まない気がしてきたので、機能不足ながら、
取りあえず作りました。

import json

class Tool():
    '''
    ツール
    '''
    def __init__(self, infos: dict) -> None:
        self._type = infos['type']
        self._dia = infos["dia"]
        self._feed = infos["feed"]
        self._spin = infos["spin"]
        self._pitch = infos["pitch"] if self._type == "tap" else -1

    def __str__(self) -> str:
        return json.dumps(self._as_dict())

    def _as_dict(self) -> dict:
        return {
            "type": self._type,
            "dia": self._dia,
            "feed": self._feed,
            "spin": self._spin,
            "pitch": self._pitch,
        }

    @property
    def type(self):
        return self._type

    @type.setter
    def type(self, value: str):
        self._type = value

    @property
    def dia(self):
        return self._dia

    @dia.setter
    def dia(self, value: float):
        self._dia = value

    @property
    def feed(self):
        return self._feed

    @feed.setter
    def feed(self, value: float):
        self._feed = value

    @property
    def spin(self):
        return self._spin

    @spin.setter
    def spin(self, value: float):
        self._spin = value

    @property
    def pitch(self):
        return self._pitch

    @pitch.setter
    def pitch(self, value: float):
        self._pitch = value


class ToolManager():
    '''
    ツールの管理
    '''
    _id: int = -1
    def __init__(self) -> None:
        self.tools = []

    def create(self, infos: dict) -> int:
        '''
        工具の作成
        戻り値はID
        '''
        ToolManager._id += 1
        tool = Tool(infos)

        toolData = {
            "id": ToolManager._id,
            "tool": tool, 
        }

        self.tools.append(toolData)

        return ToolManager._id

    def get_tool(self, id: int) -> Tool:
        '''
        IDでの工具の取得
        '''
        for toolData in self.tools:
            if toolData["id"] == id:
                return toolData["tool"]

        return None


if __name__ == "__main__":
    '''
    ユニットテスト
    '''
    toolMgr = ToolManager()
    id1 = toolMgr.create(
        {
            "type": "drill",
            "dia": 10,
            "feed": 200,
            "spin": 1000,
        }
    )
    print(f'ID:{id1}: {str(toolMgr.get_tool(id1))}')

    id2 = toolMgr.create(
        {
            "type": "tap",
            "dia": 10,
            "feed": 200,
            "spin": 1000,
            "pitch": 0.8
        }
    )
    print(f'ID:{id2}: {str(toolMgr.get_tool(id2))}')

前にも書いたような気がするけど、pythonって何故setter/getterが無いの?
って度々思います。検索したらこちらが。
なぜPythonにはsetter/getterメソッドがないのか? - Qiita

Toolクラスをプロパティにしているのですが、例えば工具の種類を示す
typeプロパティをこの様にしています。

    @property
    def type(self):
        return self._type

    @type.setter
    def type(self, value: str):
        self._type = value

"type"じゃ間違えやすいので"toolType"に変更しようと思った時、
最低3か所、下手したら5か所も修正が必要なんですよね。
ちっとも清楚じゃない。
だからこそ、publicな拡張プロパティ的な書き方しろ!って事なんだろう
けど・・・。動的型付けの場合は仕方が無いのかなぁ。