예제 #1
0
    def operate(self, design):
        safe_buffer1 = self.buffer_val * popupcad.csg_processing_scaling
        safe_buffer2 = self.buffer_val * popupcad.csg_processing_scaling
        safe_buffer3 = self.buffer_val * popupcad.csg_processing_scaling

        parent_id, parent_output_index = self.operation_links['parent'][0]
        parent_index = design.operation_index(parent_id)
        parent = design.operations[parent_index].output[
            parent_output_index].csg

        layerdef = design.return_layer_definition()

        allgeoms = []
        allhingelines = []
        buffered_splits = []
        for joint_def in self.joint_defs:
            allgeoms4, buffered_split, hingelines = self.gen_geoms(joint_def, layerdef, design,self.buffer_val)
            allgeoms.extend(allgeoms4)
            allhingelines.extend(hingelines)
            buffered_splits.append(buffered_split)
        
        safe_sections = []
        for ii in range(len(allgeoms)):
            unsafe = Laminate.unaryoperation(allgeoms[:ii] +allgeoms[ii +1:],
                'union')
            unsafe_buffer = unsafe.buffer(safe_buffer1,resolution=self.resolution)
            safe_sections.append(allgeoms[ii].difference(unsafe_buffer))

        safe = Laminate.unaryoperation(safe_sections, 'union')
        safe_buffer = safe.buffer(safe_buffer2, resolution=self.resolution)
        unsafe = Laminate.unaryoperation(allgeoms,'union').difference(safe_buffer)
        unsafe2 = unsafe.buffer(safe_buffer3, resolution=self.resolution)
        split1 = parent.difference(unsafe2)
        return split1
예제 #2
0
    def operate(self,design):
        if len(self.operation_links1)>0:
            laminates1 = [design.op_from_ref(link).output[ii].csg for link,ii in self.operation_links1]
        else:
            laminates1 = [Laminate(design.return_layer_definition())]

        if len(self.operation_links2)>0:
            laminates2 = [design.op_from_ref(link).output[ii].csg for link,ii in self.operation_links2]
        else:
            laminates2 = [Laminate(design.return_layer_definition())]
            
        if self.function in self.unaryoperationtypes:
            return Laminate.unaryoperation(laminates1,self.function)
        elif self.function in self.pairoperationtypes:
            laminate1 = Laminate.unaryoperation(laminates1,'union')
            laminate2 = Laminate.unaryoperation(laminates2,'union')
            return laminate1.binaryoperation(laminate2,self.function)
예제 #3
0
    def operate(self, design):
        if len(self.operation_links['unary']) > 0:
            laminates1 = [
                design.op_from_ref(link).output[ii].csg
                for link, ii in self.operation_links['unary']
            ]
        else:
            laminates1 = [Laminate(design.return_layer_definition())]

        if len(self.operation_links['binary']) > 0:
            laminates2 = [
                design.op_from_ref(link).output[ii].csg
                for link, ii in self.operation_links['binary']
            ]
        else:
            laminates2 = [Laminate(design.return_layer_definition())]

        if self.function in self.unaryoperationtypes:
            return Laminate.unaryoperation(laminates1, self.function)
        elif self.function in self.pairoperationtypes:
            laminate1 = Laminate.unaryoperation(laminates1, 'union')
            laminate2 = Laminate.unaryoperation(laminates2, 'union')
            return laminate1.binaryoperation(laminate2, self.function)
예제 #4
0
    def operate(self, design):
        safe_buffer1 = self.buffer_val * popupcad.csg_processing_scaling
        safe_buffer2 = self.buffer_val * popupcad.csg_processing_scaling
        safe_buffer3 = self.buffer_val * popupcad.csg_processing_scaling

        parent_id, parent_output_index = self.operation_links['parent'][0]
        parent_index = design.operation_index(parent_id)
        parent = design.operations[parent_index].output[
            parent_output_index].csg

        layerdef = design.return_layer_definition()

        allgeoms = []
        allhingelines = []
        buffered_splits = []
        for joint_def in self.joint_defs:
            allgeoms4, buffered_split, hingelines = self.gen_geoms(
                joint_def, layerdef, design, self.buffer_val)
            allgeoms.extend(allgeoms4)
            allhingelines.extend(hingelines)
            buffered_splits.append(buffered_split)

        safe_sections = []
        for ii in range(len(allgeoms)):
            unsafe = Laminate.unaryoperation(allgeoms[:ii] + allgeoms[ii + 1:],
                                             'union')
            unsafe_buffer = unsafe.buffer(safe_buffer1,
                                          resolution=self.resolution)
            safe_sections.append(allgeoms[ii].difference(unsafe_buffer))

        safe = Laminate.unaryoperation(safe_sections, 'union')
        safe_buffer = safe.buffer(safe_buffer2, resolution=self.resolution)
        unsafe = Laminate.unaryoperation(allgeoms,
                                         'union').difference(safe_buffer)
        unsafe2 = unsafe.buffer(safe_buffer3, resolution=self.resolution)
        split1 = parent.difference(unsafe2)
        return split1
예제 #5
0
def find_rigid(generic, layerdef):
    
    csg1 = generic.to_csg()
    laminate_results = []    

    for ii,layer in enumerate(layerdef.layers):
        if layer.is_rigid:
            rigid_layer_csg = csg1.layer_sequence[layer]

            laminate_result = Laminate(layerdef)
            laminate_result.replacelayergeoms(layer,rigid_layer_csg.geoms)

            lower_layers = layerdef.layers[ii::-1]
            upper_layers = layerdef.layers[ii:]


            for list1 in [lower_layers,upper_layers]:
                a = list1[:-1]
                b = list1[1:]
                c = zip(a,b)
                for aa,bb in c:
                    if aa.is_adhesive or bb.is_adhesive:
                        if bb.is_rigid:
                            break
                        csga = laminate_result.layer_sequence[aa]
                        csgb = csg1.layer_sequence[bb]
                        layer_result = csga.intersection(csgb)
                        laminate_result.replacelayergeoms(bb,layer_result.geoms)
                    else:
                        break
                        
            laminate_results.append(laminate_result)

    laminate_results = [item for item in laminate_results if not item.isEmpty()]
    result = Laminate.unaryoperation(laminate_results,'union')
    return result
예제 #6
0
    def generate(self, design):
        layerdef = design.return_layer_definition()
        sublaminate_layers = layerdef.layers
        sketch_result = self.operate(design)

        hingelayer = layerdef.getlayer(self.layer_links[0])
        hingelines = sketch_result.to_generic_laminate().geoms[hingelayer]
        hingelayer_ii = layerdef.getlayer_ii(self.layer_links[0])

        safe_sections = []
        allgeoms2 = [geom.to_shapely() for geom in hingelines]
        allgeoms3 = [Laminate(layerdef) for item in allgeoms2]
        allgeoms4 = []
        for laminate, geom in zip(allgeoms3, allgeoms2):
            laminate[hingelayer_ii] = [geom]
            allgeoms4.append(
                laminate.buffer(
                    self.hinge_gap,
                    resolution=self.resolution))

        for ii, lam in enumerate(allgeoms4):
            unsafe = Laminate.unaryoperation(
                allgeoms4[
                    :ii] +
                allgeoms4[
                    ii +
                    1:],
                'union')
            safe_sections.append(
                lam.difference(
                    unsafe.buffer(
                        self.safe_buffer1,
                        resolution=self.resolution)))
        safe = Laminate.unaryoperation(safe_sections, 'union')
        unsafe = Laminate.unaryoperation(
            allgeoms4,
            'union').difference(
            safe.buffer(
                self.safe_buffer2,
                resolution=self.resolution))
        unsafe2 = unsafe.unarylayeroperation(
            'union',
            [hingelayer],
            sublaminate_layers).buffer(
            self.safe_buffer3,
            resolution=self.resolution)

        buffered2 = sketch_result.buffer(
            self.split_buffer,
            resolution=self.resolution)
        self_index = design.operation_index(self.id)
        last = design.operations[self_index - 1].output[0].csg

        split1 = last.difference(unsafe2)
        split2 = split1.difference(buffered2)
        bodies = popupcad.algorithms.body_detection.find(
            split2.to_generic_laminate())

        bodies_generic = [item.to_generic_laminate() for item in bodies]

        connections = {}
        connections2 = {}
        for line, geom in zip(hingelines, safe_sections):
            connections[line] = []
            connections2[line] = []
            for body, body_generic in zip(bodies, bodies_generic):
                if not geom.intersection(body).isEmpty():
                    connections[line].append(body_generic)
                    connections2[line].append(body)
        for line, geoms in connections2.items():
            connections2[line] = Laminate.unaryoperation(geoms, 'union')

        self.connections = [(key, connections[key]) for key in hingelines]

        laminates = [sketch_result,
                     safe,
                     unsafe2,
                     split1,
                     split2] + bodies + list(connections2.values())
        self.output = []
        for ii, item in enumerate(laminates):
            self.output.append(
                OperationOutput(
                    item,
                    'Body {0:d}'.format(ii),
                    self))
        self.output.insert(0, self.output[0])
예제 #7
0
    def generate(self, design):
        safe_buffer1 = .5 *popupcad.csg_processing_scaling
        safe_buffer2 = .5 *popupcad.csg_processing_scaling
        safe_buffer3 = .5 *popupcad.csg_processing_scaling

        parent_id, parent_output_index = self.operation_links['parent'][0]
        parent_index = design.operation_index(parent_id)
        parent = design.operations[parent_index].output[
            parent_output_index].csg

        fixed_id, fixed_output_index = self.operation_links['fixed'][0]
        fixed_index = design.operation_index(fixed_id)
        fixed = design.operations[fixed_index].output[fixed_output_index].csg

        layerdef = design.return_layer_definition()

        allgeoms = []
        allhingelines = []
        buffered_splits = []
        all_joint_props = {}
        for joint_def in self.joint_defs:
            allgeoms4, buffered_split, hingelines, joint_props = self.gen_geoms(
                joint_def, layerdef, design)
            allgeoms.extend(allgeoms4)
            allhingelines.extend(hingelines)
            buffered_splits.append(buffered_split)
            for jointline,jointprop in zip(hingelines,joint_props):
                all_joint_props[jointline]=jointprop
        
        #allhingelines, buffered_splits = zip(*sorted(zip(allhingelines, allgeoms, buffered_splits)))
        #allhingelines = list(allhingelines)
        #allgeoms = list(allgeoms)
        #buffered_splits = list(buffered_splits)

        safe_sections = []
        for ii in range(len(allgeoms)):
            unsafe = Laminate.unaryoperation(
                allgeoms[
                    :ii] +
                allgeoms[
                    ii +
                    1:],
                'union')
            unsafe_buffer = unsafe.buffer(
                safe_buffer1,
                resolution=self.resolution)
            safe_sections.append(allgeoms[ii].difference(unsafe_buffer))

        safe = Laminate.unaryoperation(safe_sections, 'union')
        buffered_splits2 = Laminate.unaryoperation(buffered_splits, 'union')
        safe_buffer = safe.buffer(safe_buffer2, resolution=self.resolution)
        unsafe = Laminate.unaryoperation(
            allgeoms,
            'union').difference(safe_buffer)
        unsafe2 = unsafe.buffer(safe_buffer3, resolution=self.resolution)

        split1 = parent.difference(unsafe2)
        split2 = split1.difference(buffered_splits2)
        bodies = popupcad.algorithms.body_detection.find(
            split2.to_generic_laminate())

        bodies_generic = [item.to_generic_laminate() for item in bodies]

        connections = {}
        connections2 = {}

        
        for line, geom in zip(allhingelines, safe_sections):
            connections[line] = []
            connections2[line] = []
            for body, body_generic in zip(bodies, bodies_generic):
                if not geom.intersection(body).isEmpty():
                    connections[line].append(body_generic)
                    connections2[line].append(body)
        for line, geoms in connections2.items():
            connections2[line] = Laminate.unaryoperation(geoms, 'union')

        self.fixed_bodies = []
        fixed_csg = []
        for body, body_generic in zip(bodies, bodies_generic):
            if not fixed.intersection(body).isEmpty():
                self.fixed_bodies.append(body_generic)
                fixed_csg.append(body)

        self.bodies_generic = bodies_generic
        allhingelines.sort() #Sort here to prevent interfering with geometry. We only care about order of the joint props
        self.connections = sorted([(key, connections[key]) for key in allhingelines if len(connections[key]) == 2])
        self.all_joint_props = [all_joint_props[key] for key in allhingelines if len(connections[key]) == 2]

        self.output = []
        self.output.append(OperationOutput(safe,'Safe',self))        
        self.output.append(OperationOutput(unsafe,'Unsafe',self))        
        self.output.append(OperationOutput(split1,'Split1',self))        
        self.output.append(OperationOutput(split2,'Split2',self))        
        #TODO Change output to match the names that get exported to Gazebo
        self.output.extend([OperationOutput(item,'Fixed {0:d}'.format(ii),self) for ii,item in enumerate(fixed_csg)])        
        self.output.extend([OperationOutput(item,'Body {0:d}'.format(ii),self) for ii,item in enumerate(bodies)])        
        self.output.extend([OperationOutput(item,'Connection {0:d}'.format(ii),self) for ii,item in enumerate(connections2.values())])        
        self.output.insert(0, self.output[3])
예제 #8
0
    def generate(self, design):
        safe_buffer1 = .5 *popupcad.csg_processing_scaling
        safe_buffer2 = .5 *popupcad.csg_processing_scaling
        safe_buffer3 = .5 *popupcad.csg_processing_scaling

        parent_id, parent_output_index = self.operation_links['parent'][0]
        parent_index = design.operation_index(parent_id)
        parent = design.operations[parent_index].output[
            parent_output_index].csg

        fixed_id, fixed_output_index = self.operation_links['fixed'][0]
        fixed_index = design.operation_index(fixed_id)
        fixed = design.operations[fixed_index].output[fixed_output_index].csg

        layerdef = design.return_layer_definition()

        allgeoms = []
        allhingelines = []
        buffered_splits = []
        all_joint_props = {}
        for joint_def in self.joint_defs:
            allgeoms4, buffered_split, hingelines, joint_props = self.gen_geoms(
                joint_def, layerdef, design)
            allgeoms.extend(allgeoms4)
            allhingelines.extend(hingelines)
            buffered_splits.append(buffered_split)
            for jointline,jointprop in zip(hingelines,joint_props):
                all_joint_props[jointline]=jointprop
        
        #allhingelines, buffered_splits = zip(*sorted(zip(allhingelines, allgeoms, buffered_splits)))
        #allhingelines = list(allhingelines)
        #allgeoms = list(allgeoms)
        #buffered_splits = list(buffered_splits)

        safe_sections = []

        if len(allgeoms)>1:
            for ii in range(len(allgeoms)):
                unsafe = Laminate.unaryoperation(allgeoms[:ii] +allgeoms[ii + 1:],'union')
                unsafe_buffer = unsafe.buffer(safe_buffer1,resolution=self.resolution)
                safe_sections.append(allgeoms[ii].difference(unsafe_buffer))
            safe = Laminate.unaryoperation(safe_sections, 'union')
        else:
            safe_sections.append(allgeoms[0])
            safe = allgeoms[0]

        buffered_splits2 = Laminate.unaryoperation(buffered_splits, 'union')
        safe_buffer = safe.buffer(safe_buffer2, resolution=self.resolution)
        unsafe = Laminate.unaryoperation(
            allgeoms,
            'union').difference(safe_buffer)
        unsafe2 = unsafe.buffer(safe_buffer3, resolution=self.resolution)

        split1 = parent.difference(unsafe2)
        split2 = split1.difference(buffered_splits2)
        bodies = popupcad.algorithms.body_detection.find(
            split2.to_generic_laminate())

        bodies_generic = [item.to_generic_laminate() for item in bodies]

        connections = {}
        connections2 = {}

        
        for line, geom in zip(allhingelines, safe_sections):
            connections[line] = []
            connections2[line] = []
            for body, body_generic in zip(bodies, bodies_generic):
                if not geom.intersection(body).isEmpty():
                    connections[line].append(body_generic)
                    connections2[line].append(body)
        for line, geoms in connections2.items():
            connections2[line] = Laminate.unaryoperation(geoms, 'union')

        self.fixed_bodies = []
        fixed_csg = []
        for body, body_generic in zip(bodies, bodies_generic):
            if not fixed.intersection(body).isEmpty():
                self.fixed_bodies.append(body_generic)
                fixed_csg.append(body)

        self.bodies_generic = bodies_generic
        allhingelines.sort() #Sort here to prevent interfering with geometry. We only care about order of the joint props
        self.connections = sorted([(key, connections[key]) for key in allhingelines if len(connections[key]) == 2])
        self.all_joint_props = [all_joint_props[key] for key in allhingelines if len(connections[key]) == 2]

        self.output = []
        self.output.append(OperationOutput(safe,'Safe',self))        
        self.output.append(OperationOutput(unsafe,'Unsafe',self))        
        self.output.append(OperationOutput(split1,'Split1',self))        
        self.output.append(OperationOutput(split2,'Split2',self))        
        #TODO Change output to match the names that get exported to Gazebo
        self.output.extend([OperationOutput(item,'Fixed {0:d}'.format(ii),self) for ii,item in enumerate(fixed_csg)])        
        self.output.extend([OperationOutput(item,'Body {0:d}'.format(ii),self) for ii,item in enumerate(bodies)])        
        self.output.extend([OperationOutput(item,'Connection {0:d}'.format(ii),self) for ii,item in enumerate(connections2.values())])        
        self.output.insert(0, self.output[3])
예제 #9
0
    def generate(self,design):
        safe_buffer1 = .5*popupcad.internal_argument_scaling
        safe_buffer2 = .5*popupcad.internal_argument_scaling
        safe_buffer3 = .5*popupcad.internal_argument_scaling
#        split_buffer = .1
        
        parent_id,parent_output_index = self.operation_links['parent'][0]
        parent_index = design.operation_index(parent_id)
        parent = design.operations[parent_index].output[parent_output_index].csg

        fixed_id,fixed_output_index = self.operation_links['fixed'][0]
        fixed_index = design.operation_index(fixed_id)
        fixed = design.operations[fixed_index].output[fixed_output_index].csg

        
        layerdef = design.return_layer_definition()

        allgeoms = []
        allhingelines = []
        buffered_splits = []
        all_joint_props = []
        for joint_def in self.joint_defs:
            allgeoms4,buffered_split,hingelines,joint_props= self.gen_geoms(joint_def,layerdef,design)
            allgeoms.extend(allgeoms4)
            allhingelines.extend(hingelines)
            buffered_splits.append(buffered_split)
            all_joint_props.extend(joint_props)
            
        safe_sections = []
        for ii in range(len(allgeoms)):
            unsafe = Laminate.unaryoperation(allgeoms[:ii]+allgeoms[ii+1:],'union')
            unsafe_buffer = unsafe.buffer(safe_buffer1,resolution = self.resolution)
            safe_sections.append(allgeoms[ii].difference(unsafe_buffer))
            
        safe = Laminate.unaryoperation(safe_sections,'union')
        buffered_splits2 = Laminate.unaryoperation(buffered_splits,'union')
        safe_buffer = safe.buffer(safe_buffer2,resolution = self.resolution)
        unsafe = Laminate.unaryoperation(allgeoms,'union').difference(safe_buffer)
#            unsafe2 = unsafe.unarylayeroperation('union',[hingelayer],sublaminate_layers)
        unsafe2 = unsafe.buffer(safe_buffer3,resolution = self.resolution)
        
        split1 = parent.difference(unsafe2)
#        for item in buffered_splits:
#            split1 = split1.difference(item)
#        split2 = split1
        split2 = split1.difference(buffered_splits2)
        bodies= popupcad_manufacturing_plugins.algorithms.bodydetection.find(split2.genericfromls(),layerdef)

        bodies_generic = [item.genericfromls() for item in bodies]
        bodies_generic = [GenericLaminate(layerdef,item) for item in bodies_generic]
        
        connections = {}
        connections2 = {}
        
        for line,geom in zip(allhingelines,safe_sections):
            connections[line]=[]
            connections2[line]=[]
            for body,body_generic in zip(bodies,bodies_generic):
                if not geom.intersection(body).isEmpty():
                    connections[line].append(body_generic)
                    connections2[line].append(body)
        for line,geoms in connections2.items():
            connections2[line]=Laminate.unaryoperation(geoms,'union')

        self.fixed_bodies = []
        for body,body_generic in zip(bodies,bodies_generic):
            if not fixed.intersection(body).isEmpty():
                self.fixed_bodies.append(body_generic)
                    
        self.bodies_generic = bodies_generic                    
        self.connections = [(key,connections[key]) for key in allhingelines]
        self.all_joint_props = all_joint_props
        
        laminates = [safe,unsafe2,split1,split2]+bodies+list(connections2.values())
#        laminates = [safe,unsafe2,split1,split2]+bodies
        self.output = []
        for ii,item in enumerate(laminates):
            self.output.append(OperationOutput(item,'Body {0:d}'.format(ii),self))
        self.output.insert(0,self.output[0])