Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 9103) +++ trunk/src/buffer.c (revision 9104) @@ -771,6 +771,11 @@ pcb_element_convert_from_buffer(PCB_PASTEBUFFER); break; + /* converts buffer contents into an element */ + case F_ConvertSubc: + pcb_subc_convert_from_buffer(PCB_PASTEBUFFER); + break; + /* break up element for editing */ case F_Restore: pcb_element_smash_buffer(PCB_PASTEBUFFER); Index: trunk/src/funchash_core_list.h =================================================================== --- trunk/src/funchash_core_list.h (revision 9103) +++ trunk/src/funchash_core_list.h (revision 9104) @@ -20,6 +20,7 @@ action_entry(Close) action_entry(Connection) action_entry(Convert) +action_entry(ConvertSubc) action_entry(Copy) action_entry(CycleClip) action_entry(CycleCrosshair) Index: trunk/src/obj_subc.c =================================================================== --- trunk/src/obj_subc.c (revision 9103) +++ trunk/src/obj_subc.c (revision 9104) @@ -23,3 +23,15 @@ * */ +#include "config.h" + +#include "buffer.h" +#include "error.h" +#include "obj_subc.h" + +int pcb_subc_convert_from_buffer(pcb_buffer_t *buffer) +{ + + pcb_message(PCB_MSG_ERROR, "pcb_subc_convert_from_buffer(): not yet implemented\n"); + return -1; +} Index: trunk/src/obj_subc.h =================================================================== --- trunk/src/obj_subc.h (revision 9103) +++ trunk/src/obj_subc.h (revision 9104) @@ -36,5 +36,8 @@ gdl_elem_t link; }; +/* convert buffer contents into a subcircuit, in-place; returns 0 on success */ +int pcb_subc_convert_from_buffer(pcb_buffer_t *buffer); + #endif Index: trunk/src/pcb-menu-gtk.lht =================================================================== --- trunk/src/pcb-menu-gtk.lht (revision 9103) +++ trunk/src/pcb-menu-gtk.lht (revision 9104) @@ -322,6 +322,7 @@ ha:Move selected to current layer = { a=Shiftm; action=MoveToCurrentLayer(Selected) } ha:Remove selected objects = { a=ShiftDelete; action=RemoveSelected() } ha:Convert selection to element = { action=Select(Convert) } + ha:Convert selection to subcircuit = { action=Select(ConvertSubc) } - ha:Optimize selected rats = { li:action={DeleteRats(SelectedRats); AddRats(SelectedRats) } } ha:Auto-route selected rats = { a=Altr; action=AutoRoute(SelectedRats) } @@ -376,6 +377,7 @@ - ha:Clear buffer = { action=PasteBuffer(Clear) } ha:Convert buffer to element = { action=PasteBuffer(Convert) } + ha:Convert buffer to subcircuit = { action=PasteBuffer(ConvertSubc) } ha:Break buffer elements to pieces = { action=PasteBuffer(Restore) } ha:Save buffer elements to file = { action=Save(PasteBuffer) } - Index: trunk/src/pcb-menu-lesstif.lht =================================================================== --- trunk/src/pcb-menu-lesstif.lht (revision 9103) +++ trunk/src/pcb-menu-lesstif.lht (revision 9104) @@ -289,6 +289,7 @@ ha:Move selected to current layer = { a=Shiftm; action=MoveToCurrentLayer(Selected) } ha:Delete selected objects = { a=Delete; action=Delete(Selected) } ha:Convert selection to element = { action=Select(Convert) } + ha:Convert selection to subcircuit = { action=Select(ConvertSubc) } - ha:Optimize selected rats = { li:action={DeleteRats(SelectedRats); AddRats(SelectedRats)} } ha:Auto-route selected rats = { a=Altr; action=AutoRoute(SelectedRats) } @@ -337,6 +338,7 @@ - ha:Clear buffer = { action=PasteBuffer(Clear) } ha:Convert buffer to element = { action=PasteBuffer(Convert) } + ha:Convert buffer to subcircuit = { action=PasteBuffer(ConvertSubc) } ha:Break buffer elements to pieces = { action=PasteBuffer(Restore) } ha:Save buffer elements to file = { action=Save(PasteBuffer) } - Index: trunk/src/pcb-menu-mkey.lht =================================================================== --- trunk/src/pcb-menu-mkey.lht (revision 9103) +++ trunk/src/pcb-menu-mkey.lht (revision 9104) @@ -320,6 +320,7 @@ ha:Move selected to current layer = { a=Shiftm; action=MoveToCurrentLayer(Selected) } ha:Remove selected objects = { a=ShiftDelete; action=RemoveSelected() } ha:Convert selection to element = { action=Select(Convert) } + ha:Convert selection to subcircuit = { action=Select(ConvertSubc) } - ha:Optimize selected rats = { li:action={DeleteRats(SelectedRats); AddRats(SelectedRats) } } ha:Auto-route selected rats = { a=Altr; action=AutoRoute(SelectedRats) } @@ -373,6 +374,7 @@ - ha:Clear buffer = { action=PasteBuffer(Clear) } ha:Convert buffer to element = { action=PasteBuffer(Convert) } + ha:Convert buffer to subcircuit = { action=PasteBuffer(ConvertSubc) } ha:Break buffer elements to pieces = { action=PasteBuffer(Restore) } ha:Save buffer elements to file = { action=Save(PasteBuffer) } - Index: trunk/src/select_act.c =================================================================== --- trunk/src/select_act.c (revision 9103) +++ trunk/src/select_act.c (revision 9104) @@ -234,6 +234,25 @@ } break; + case F_ConvertSubc: + { + pcb_coord_t x, y; + Note.Buffer = conf_core.editor.buffer_number; + pcb_buffer_set_number(PCB_MAX_BUFFER - 1); + pcb_buffer_clear(PCB, PCB_PASTEBUFFER); + pcb_gui->get_coords(_("Select the Subcircuit's Origin (mark) Location"), &x, &y); + x = pcb_grid_fit(x, PCB->Grid, PCB->GridOffsetX); + y = pcb_grid_fit(y, PCB->Grid, PCB->GridOffsetY); + pcb_buffer_add_selected(PCB, PCB_PASTEBUFFER, x, y, pcb_true); + pcb_undo_save_serial(); + pcb_remove_selected(); + pcb_subc_convert_from_buffer(PCB_PASTEBUFFER); + pcb_undo_restore_serial(); + pcb_buffer_copy_to_layout(PCB, x, y); + pcb_buffer_set_number(Note.Buffer); + } + break; + default: PCB_ACT_FAIL(Select); break;