Example #1
0
    def getMomentMagnitudes(self, name, pivot=None):
        '''
    Returns the moment magnitudes (m11,m22,m33) for the local axes u1,u2,u3 at
    the output station closest to the pivot. If there is no pivot, it returns
    the values from the output station closest to the robot's location.
    '''
        # So we can modify the pivot whenever we call the fuction
        pivot = self.location if pivot is None else pivot

        # Format (ret[0], number_results[1], obj_names[2], i_end distances[3],
        # elm_names[4], elm_dist[5], load_cases[6], step_types[7], step_nums[8],
        # Ps[9], V2s[10], V3s[11], Ts[12], M2s[13], M3s[14]
        results = self.model.Results.FrameForce(name, 0)
        if results[0] != 0:
            # pdb.set_trace()
            helpers.check(results[0],
                          self,
                          "getting frame forces",
                          results=results,
                          state=self.currentState())
            return 0

        # Find index of closest data_point
        close_index, i = 0, 0
        shortest_distance = None
        distances = results[3]
        for i_distance in distances:

            # Get beam endpoints to calculate global position of moment
            i_end, j_end = self.structure.get_endpoints(name, self.location)
            beam_direction = helpers.make_unit(
                helpers.make_vector(i_end, j_end))
            point = helpers.sum_vectors(
                i_end, helpers.scale(i_distance, beam_direction))
            distance = helpers.distance(pivot, point)

            # If closer than the current closes point, update information
            if shortest_distance is None or distance < shortest_distance:
                close_index = i
                shortest_distance = distance

            i += 1

        # Make sure index is indexable
        assert close_index < results[1]

        # Now that we have the closest moment, calculate sqrt(m2^2+m3^2)
        m11 = results[12][close_index]
        m22 = results[13][close_index]
        m33 = results[14][close_index]

        return m11, m22, m33
Example #2
0
  def addLoad(self,beam,location,value):
    '''
    Adds a load of the specified value to the named beam at the specific 
    location
    '''
    # Sanity check
    assert not self.model.GetModelIsLocked()

    # Find distance and add load
    distance = helpers.distance(beam.endpoints.i,location)
    ret = self.model.FrameObj.SetLoadPoint(beam.name,PROGRAM['robot_load_case'],
      1,10,distance,value,"Global", False, True,0)
    helpers.check(ret,self,"adding new load",beam=beam.name,distance=distance,
      value=value,state=self.currentState())
Example #3
0
  def getMomentMagnitudes(self,name,pivot=None):
    '''
    Returns the moment magnitudes (m11,m22,m33) for the local axes u1,u2,u3 at
    the output station closest to the pivot. If there is no pivot, it returns
    the values from the output station closest to the robot's location.
    '''
    # So we can modify the pivot whenever we call the fuction
    pivot = self.location if pivot is None else pivot

    # Format (ret[0], number_results[1], obj_names[2], i_end distances[3], 
    # elm_names[4], elm_dist[5], load_cases[6], step_types[7], step_nums[8],
    # Ps[9], V2s[10], V3s[11], Ts[12], M2s[13], M3s[14]
    results = self.model.Results.FrameForce(name,0)
    if results[0] != 0:
      # pdb.set_trace()
      helpers.check(results[0],self,"getting frame forces",results=results,
        state=self.currentState())
      return 0

    # Find index of closest data_point
    close_index, i = 0, 0
    shortest_distance = None
    distances = results[3]
    for i_distance in distances:

      # Get beam endpoints to calculate global position of moment
      i_end,j_end = self.structure.get_endpoints(name,self.location)
      beam_direction = helpers.make_unit(helpers.make_vector(i_end,j_end))
      point = helpers.sum_vectors(i_end,helpers.scale(i_distance,
        beam_direction))
      distance = helpers.distance(pivot,point)

      # If closer than the current closes point, update information
      if shortest_distance is None or distance < shortest_distance:
        close_index = i
        shortest_distance = distance

      i += 1

    # Make sure index is indexable
    assert close_index < results[1]

    # Now that we have the closest moment, calculate sqrt(m2^2+m3^2)
    m11 = results[12][close_index]
    m22 = results[13][close_index]
    m33 = results[14][close_index]

    return m11,m22,m33
Example #4
0
    def addLoad(self, beam, location, value):
        '''
    Adds a load of the specified value to the named beam at the specific 
    location
    '''
        # Sanity check
        assert not self.model.GetModelIsLocked()

        # Find distance and add load
        distance = helpers.distance(beam.endpoints.i, location)
        ret = self.model.FrameObj.SetLoadPoint(beam.name,
                                               PROGRAM['robot_load_case'], 1,
                                               10, distance, value, "Global",
                                               False, True, 0)
        helpers.check(ret,
                      self,
                      "adding new load",
                      beam=beam.name,
                      distance=distance,
                      value=value,
                      state=self.currentState())
Example #5
0
    def removeload(location):
      '''
      Removes the load assigned to a specific location based on where the robot 
      existed (assumes the robot is on a beams
      '''
      # Sanity check
      assert not self.model.GetModelIsLocked()

      # obtain current values.
      # values are encapsulated in a list as follows: ret, number_items, 
      # frame_names, loadpat_names, types, coordinates, directions, rel_dists, 
      # dists, loads
      data = self.model.FrameObj.GetLoadPoint(self.beam.name)
     
      # Sanity check with data
      assert data[0] == 0 
      if data[1] == 0:
        helpers.check(1,self,"getting loads",beam=self.beam.name,
          return_data=data,state=self.current_state())
        return;

      # Find location of load
      i, j = self.beam.endpoints
      curr_dist = helpers.distance(i,self.location)

      # Loop through distances to find our load (the one in self.location) and 
      # remove all reference to it. Additionally remove loads not related to our
      # load pattern
      indeces = []
      index = 0
      for ab_dist in data[8]:  # this provides acces to the absolute_distance 
        if ((helpers.compare(ab_dist,curr_dist) and PROGRAM['robot_load_case'] == 
          data[3][index]) or data[3][index] != PROGRAM['robot_load_case']):
          indeces.append(index)
        index += 1

      # Delete the loads off the beam
      ret = self.model.FrameObj.DeleteLoadPoint(self.beam.name,
        PROGRAM['robot_load_case'])
      helpers.check(ret,self,"deleting loads",return_val=ret,
        beam=self.beam.name,distance=curr_dist,previous_loads=data,
        state=self.current_state())

      # add the loads we want back to the frame (automatically deletes all 
      # previous loads)
      for i in range(data[1]):
        if i not in indeces:
          ret = self.model.FrameObj.SetLoadPoint(self.beam.name, 
            data[3][i], data[4][i], data[6][i], data[7][i], data[9][i],"Global",
            True,False)
          helpers.check(ret,self,"adding back loads",return_val=ret,
            beam=self.beam.name,load_pat=data[3][i],type=data[4][i],
            direction=data[6][i],rel_dist=data[7][i],load_val=data[9][i],
            state=self.current_state())
Example #6
0
        def removeload(location):
            '''
      Removes the load assigned to a specific location based on where the robot 
      existed (assumes the robot is on a beams
      '''
            # Sanity check
            assert not self.model.GetModelIsLocked()

            # obtain current values.
            # values are encapsulated in a list as follows: ret, number_items,
            # frame_names, loadpat_names, types, coordinates, directions, rel_dists,
            # dists, loads
            data = self.model.FrameObj.GetLoadPoint(self.beam.name)

            # Sanity check with data
            assert data[0] == 0
            if data[1] == 0:
                helpers.check(1,
                              self,
                              "getting loads",
                              beam=self.beam.name,
                              return_data=data,
                              state=self.current_state())
                return

            # Find location of load
            i, j = self.beam.endpoints
            curr_dist = helpers.distance(i, self.location)

            # Loop through distances to find our load (the one in self.location) and
            # remove all reference to it. Additionally remove loads not related to our
            # load pattern
            indeces = []
            index = 0
            for ab_dist in data[
                    8]:  # this provides acces to the absolute_distance
                if ((helpers.compare(ab_dist, curr_dist)
                     and PROGRAM['robot_load_case'] == data[3][index])
                        or data[3][index] != PROGRAM['robot_load_case']):
                    indeces.append(index)
                index += 1

            # Delete the loads off the beam
            ret = self.model.FrameObj.DeleteLoadPoint(
                self.beam.name, PROGRAM['robot_load_case'])
            helpers.check(ret,
                          self,
                          "deleting loads",
                          return_val=ret,
                          beam=self.beam.name,
                          distance=curr_dist,
                          previous_loads=data,
                          state=self.current_state())

            # add the loads we want back to the frame (automatically deletes all
            # previous loads)
            for i in range(data[1]):
                if i not in indeces:
                    ret = self.model.FrameObj.SetLoadPoint(
                        self.beam.name, data[3][i], data[4][i], data[6][i],
                        data[7][i], data[9][i], "Global", True, False)
                    helpers.check(ret,
                                  self,
                                  "adding back loads",
                                  return_val=ret,
                                  beam=self.beam.name,
                                  load_pat=data[3][i],
                                  type=data[4][i],
                                  direction=data[6][i],
                                  rel_dist=data[7][i],
                                  load_val=data[9][i],
                                  state=self.current_state())