def get_moment_magnitudes(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.current_state()) 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
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() # Jump on beam self.beam = beam # Find distance and add load distance = helpers.distance(beam.endpoints.i,location) ret = self.model.FrameObj.SetLoadPoint(beam.name,variables.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.current_state())
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 variables.robot_load_case == data[3][index]) or data[3][index] != variables.robot_load_case): indeces.append(index) index += 1 # Delete the loads off the beam ret = self.model.FrameObj.DeleteLoadPoint(self.beam.name, variables.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())