| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | import json |
| | from typing import Optional, Mapping |
| | import FreeCAD |
| | import Path |
| | from ...camassets import cam_assets |
| | from ..mixins import RotaryToolBitMixin |
| | from ..models.base import ToolBit |
| | from ...assets.serializer import AssetSerializer |
| | from ...assets.uri import AssetUri |
| | from ...assets.asset import Asset |
| |
|
| | SHAPEMAP = { |
| | "ballend": "Ballnose", |
| | "endmill": "Cylindrical", |
| | "v-bit": "Conical", |
| | "vbit": "Conical", |
| | "chamfer": "Snubnose", |
| | } |
| | SHAPEMAP_REVERSE = dict((v, k) for k, v in SHAPEMAP.items()) |
| |
|
| | tooltemplate = { |
| | "units": "metric", |
| | "shape": "Cylindrical", |
| | "length": 10, |
| | "diameter": 3, |
| | "description": "", |
| | } |
| |
|
| |
|
| | class CamoticsToolBitSerializer(AssetSerializer): |
| | for_class = ToolBit |
| | extensions = tuple() |
| | mime_type = "application/json" |
| | can_import = False |
| | can_export = False |
| |
|
| | @classmethod |
| | def get_label(cls) -> str: |
| | return FreeCAD.Qt.translate("CAM", "Camotics Tool") |
| |
|
| | @classmethod |
| | def extract_dependencies(cls, data: bytes) -> list[AssetUri]: |
| | return [] |
| |
|
| | @classmethod |
| | def serialize(cls, asset: Asset) -> bytes: |
| | assert isinstance(asset, ToolBit) |
| | if not isinstance(asset, RotaryToolBitMixin): |
| | lbl = asset.label |
| | name = asset.get_shape_name() |
| | Path.Log.info( |
| | f"Skipping export of toolbit {lbl} ({name}) because it is not a rotary tool." |
| | ) |
| | return b"{}" |
| | toolitem = tooltemplate.copy() |
| | toolitem["diameter"] = asset.get_diameter().Value or 2 |
| | toolitem["description"] = asset.label |
| | toolitem["length"] = asset.get_length().Value or 10 |
| | toolitem["shape"] = SHAPEMAP.get(asset.get_shape_name(), "Cylindrical") |
| | return json.dumps(toolitem).encode("ascii", "ignore") |
| |
|
| | @classmethod |
| | def deserialize( |
| | cls, |
| | data: bytes, |
| | id: str, |
| | dependencies: Optional[Mapping[AssetUri, Asset]], |
| | ) -> ToolBit: |
| | |
| | attrs: dict = json.loads(data.decode("ascii", "ignore")) |
| | shape = cam_assets.get("toolbitshape://endmill") |
| |
|
| | |
| | bit = ToolBit.from_shape_id(shape.get_id()) |
| | bit.label = attrs["description"] |
| |
|
| | if not isinstance(bit, RotaryToolBitMixin): |
| | raise NotImplementedError( |
| | f"Only export of rotary tools is supported ({bit.label} ({bit.id})" |
| | ) |
| |
|
| | bit.set_diameter(FreeCAD.Units.Quantity(float(attrs["diameter"]), "mm")) |
| | bit.set_length(FreeCAD.Units.Quantity(float(attrs["length"]), "mm")) |
| | return bit |
| |
|