def add_extrude(self, data):
        """Add an extrude feature from a sketch"""
        if (data is None or "sketch_name" not in data
                or "profile_id" not in data or "distance" not in data
                or "operation" not in data):
            return self.runner.return_failure("add_extrude data not specified")
        sketch = match.sketch_by_name(
            data["sketch_name"],
            sketches=self.design_state.reconstruction.component.sketches)
        if sketch is None:
            return self.runner.return_failure("extrude sketch not found")
        profile = match.sketch_profile_by_id(data["profile_id"], [sketch])
        if profile is None:
            return self.runner.return_failure(
                "extrude sketch profile not found")
        operation = self.__get_extrude_operation(data["operation"])
        if operation is None:
            return self.runner.return_failure("extrude operation not found")

        # Make the extrude
        extrudes = self.design_state.reconstruction.component.features.extrudeFeatures
        extrude_input = extrudes.createInput(profile, operation)
        distance = adsk.core.ValueInput.createByReal(data["distance"])
        extent_distance = adsk.fusion.DistanceExtentDefinition.create(distance)
        extrude_input.setOneSideExtent(
            extent_distance,
            adsk.fusion.ExtentDirections.PositiveExtentDirection)
        extrude = extrudes.add(extrude_input)
        # Serialize the data and return
        return self.return_extrude_data(extrude)
 def add_circle(self, data):
     """Add a circle to an existing sketch"""
     if (data is None or "sketch_name" not in data or "pt" not in data
             or "radius" not in data):
         return self.runner.return_failure("add_circle data not specified")
     sketch = match.sketch_by_name(
         data["sketch_name"],
         sketches=self.design_state.reconstruction.component.sketches)
     if sketch is None:
         return self.runner.return_failure("sketch not found")
     sketch_uuid = name.get_uuid(sketch)
     transform = data["transform"] if "transform" in data else None
     return self.__add_circle(sketch, sketch_uuid, data["pt"],
                              data["radius"], transform)
 def add_point(self, data):
     """Add a point to create a new sequential line in the given sketch"""
     if (data is None or "sketch_name" not in data or "pt" not in data):
         return self.runner.return_failure("add_point data not specified")
     sketch = match.sketch_by_name(
         data["sketch_name"],
         sketches=self.design_state.reconstruction.component.sketches)
     if sketch is None:
         return self.runner.return_failure("sketch not found")
     sketch_uuid = name.get_uuid(sketch)
     # If this is the first point, store it and return
     if sketch.name not in self.state:
         self.__init_sketch_state(sketch.name, data["pt"], data["pt"])
         profile_data = serialize.sketch_profiles(sketch.profiles)
         return self.runner.return_success({
             "sketch_id": sketch_uuid,
             "sketch_name": sketch.name,
             "profiles": profile_data
         })
     state = self.state[sketch.name]
     transform = data["transform"] if "transform" in data else None
     return self.__add_line(sketch, sketch_uuid, state["last_pt"],
                            data["pt"], transform)
 def close_profile(self, data):
     """Close the current set of lines to create one or more profiles
        by joining the first point to the last"""
     if data is None or "sketch_name" not in data:
         return self.runner.return_failure(
             "close_profile data not specified")
     sketch = match.sketch_by_name(
         data["sketch_name"],
         sketches=self.design_state.reconstruction.component.sketches)
     if sketch is None:
         return self.runner.return_failure("sketch not found")
     sketch_uuid = name.get_uuid(sketch)
     if sketch.name not in self.state:
         return self.runner.return_failure("sketch state not found")
     state = self.state[sketch.name]
     # We need at least 4 points (2 lines with 2 points each)
     if state["pt_count"] < 4:
         return self.runner.return_failure("sketch has too few points")
     if state["last_pt"] is None or state["first_pt"] is None:
         return self.runner.return_failure("sketch end points invalid")
     transform = state["transform"]
     return self.__add_line(sketch, sketch_uuid, state["last_pt"],
                            state["first_pt"], transform)