/* * Copyright (C) 2014 Alfons Wirtz * website www.freerouting.net * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License at <http://www.gnu.org/licenses/> * for more details. * * Settings.java * * Created on 29. August 2003, 11:33 */ package interactive; import board.ItemSelectionFilter; import board.RoutingBoard; /** * Contains the values of the interactive settings of the board handling. * * @author Alfons Wirtz */ public class Settings implements java.io.Serializable { /** Creates a new interactive settings variable. */ public Settings(RoutingBoard p_board, Logfile p_logfile) { this.logfile = p_logfile; // Initialise with default values. layer = 0; push_enabled = true; drag_components_enabled = true; select_on_all_visible_layers = true; // else selection is only on the current layer is_stitch_route = false; // else interactive routing is dynamic trace_pull_tight_region_width = Integer.MAX_VALUE; trace_pull_tight_accuracy = 500; via_snap_to_smd_center = true; horizontal_component_grid = 0; vertical_component_grid = 0; automatic_neckdown = true; manual_rule_selection = false; hilight_routing_obstacle = false; manual_trace_clearance_class = 1; manual_via_rule_index = 0; zoom_with_wheel = true; manual_trace_half_width_arr = new int[p_board.get_layer_count()]; for (int i = 0; i < manual_trace_half_width_arr.length; ++i) { manual_trace_half_width_arr[i] = 1000; } autoroute_settings = new AutorouteSettings(p_board); item_selection_filter = new ItemSelectionFilter(); snapshot_attributes = new SnapShot.Attributes(); } /** * Copy constructor */ public Settings(Settings p_settings) { this.logfile = p_settings.logfile; this.read_only = p_settings.read_only; this.layer = p_settings.layer; this.push_enabled = p_settings.push_enabled; this.drag_components_enabled = p_settings.drag_components_enabled; this.select_on_all_visible_layers = p_settings.select_on_all_visible_layers; this.is_stitch_route = p_settings.is_stitch_route; this.trace_pull_tight_region_width = p_settings.trace_pull_tight_region_width; this.trace_pull_tight_accuracy = p_settings.trace_pull_tight_accuracy; this.via_snap_to_smd_center = p_settings.via_snap_to_smd_center; this.horizontal_component_grid = p_settings.horizontal_component_grid; this.vertical_component_grid = p_settings.vertical_component_grid; this.automatic_neckdown = p_settings.automatic_neckdown; this.manual_rule_selection = p_settings.manual_rule_selection; this.hilight_routing_obstacle = p_settings.hilight_routing_obstacle; this.zoom_with_wheel = p_settings.zoom_with_wheel; this.manual_trace_clearance_class = p_settings.manual_trace_clearance_class; this.manual_via_rule_index = p_settings.manual_via_rule_index; this.manual_trace_half_width_arr = new int [p_settings.manual_trace_half_width_arr.length]; System.arraycopy(p_settings.manual_trace_half_width_arr, 0, this.manual_trace_half_width_arr, 0, this.manual_trace_half_width_arr.length); this.autoroute_settings = new AutorouteSettings(p_settings.autoroute_settings); this.item_selection_filter = new ItemSelectionFilter(p_settings.item_selection_filter); this.snapshot_attributes = new SnapShot.Attributes(p_settings.snapshot_attributes); } public int get_layer() { return this.layer; } /** allows pushing obstacles aside */ public boolean get_push_enabled() { return this.push_enabled; } /** Route mode: stitching or dynamic */ public boolean get_is_stitch_route() { return this.is_stitch_route; } /** allows dragging components with the route */ public boolean get_drag_components_enabled() { return this.drag_components_enabled; } /** indicates if interactive selections are made on all visible layers or only on the current layer.*/ public boolean get_select_on_all_visible_layers() { return this.select_on_all_visible_layers; } /** Indicates if the routing rule selection is manual by the user or automatic by the net rules. */ public boolean get_manual_rule_selection() { return this.manual_rule_selection; } /** * Via snaps to smd center, if attach smd is alllowed. */ public boolean get_via_snap_to_smd_center() { return this.via_snap_to_smd_center; } /** If true, the current routing obstacle is hilightet in dynamic routing. */ public boolean get_hilight_routing_obstacle() { return this.hilight_routing_obstacle; } /** * If true, the trace width at static pins smaller the the trace width will be lowered * automatically to the pin with, if necessary. */ public boolean get_automatic_neckdown() { return this.automatic_neckdown; } /** If true, the mouse wheel is used for zooming. */ public boolean get_zoom_with_wheel() { return this.zoom_with_wheel; } /** The filter used in interactive selection of board items. */ public ItemSelectionFilter get_item_selection_filter() { return this.item_selection_filter; } /** The width of the pull tight region of traces around the cursor */ public int get_trace_pull_tight_region_width() { return this.trace_pull_tight_region_width; } /** * The horizontal placement grid when moving components, if > 0. */ public int get_horizontal_component_grid() { return this.horizontal_component_grid; } /** * The vertical placement grid when moving components, if > 0. */ public int get_vertical_component_grid() { return this.vertical_component_grid; } /** * The index of the clearance class used for traces in interactive routing in the clearance matrix, * if manual_route_selection is on. */ public int get_manual_trace_clearance_class() { return this.manual_trace_clearance_class; } /** * The index of the via rule used in routing in the board via rules if manual_route_selection is on. */ public int get_manual_via_rule_index() { return this.manual_via_rule_index; } /** The accuracy of the pull tight algorithm. */ public int get_trace_pull_tight_accuracy() { return this.trace_pull_tight_accuracy; } /** Defines the data of the snapshot selected for restoring. */ public SnapShot.Attributes get_snapshot_attributes() { return this.snapshot_attributes; } /** Get the trace half width in manual routing mode on layer p_layer_no */ public int get_manual_trace_half_width( int p_layer_no) { if (p_layer_no < 0 || p_layer_no >= this.manual_trace_half_width_arr.length) { System.out.println("Settings.get_manual_trace_half_width p_layer_no out of range"); return 0; } return this.manual_trace_half_width_arr[p_layer_no]; } /** * The index of the via rule used in routing in the board via rules if manual_route_selection is on. */ public void set_manual_via_rule_index(int p_value) { if (read_only) { return; } this.manual_via_rule_index = p_value; } /** * The horizontal placement grid when moving components, if > 0. */ public void set_horizontal_component_grid(int p_value) { if (read_only) { return; } this.horizontal_component_grid = p_value; } /** * The vertical placement grid when moving components, if > 0. */ public void set_vertical_component_grid(int p_value) { if (read_only) { return; } this.vertical_component_grid = p_value; } /** If true, the current routing obstacle is hilightet in dynamic routing. */ public void set_hilight_routing_obstacle(boolean p_value) { if (read_only) { return; } this.hilight_routing_obstacle = p_value; } /** * If true, the trace width at static pins smaller the the trace width will be lowered * automatically to the pin with, if necessary. */ public void set_automatic_neckdown(boolean p_value) { if (read_only) { return; } this.automatic_neckdown = p_value; } /** The filter used in interactive selection of board items. */ public void set_item_selection_filter(ItemSelectionFilter p_value) { if (read_only) { return; } this.item_selection_filter = p_value; } /** * Enables or disables pushing obstacles in interactive routing */ public void set_push_enabled(boolean p_value) { if (read_only) { return; } push_enabled = p_value; logfile.start_scope(LogfileScope.SET_PUSH_ENABLED, p_value); } /** * Enables or disables dragging components */ public void set_drag_components_enabled(boolean p_value) { if (read_only) { return; } drag_components_enabled = p_value; logfile.start_scope(LogfileScope.SET_DRAG_COMPONENTS_ENABLED, p_value); } /** * Sets, if item selection is on all board layers or only * on the current layer. */ public void set_select_on_all_visible_layers(boolean p_value) { if (read_only) { return; } select_on_all_visible_layers = p_value; logfile.start_scope(LogfileScope.SET_SELECT_ON_ALL_LAYER, p_value); } /** Route mode: stitching or dynamic */ public void set_stitch_route(boolean p_value) { if (read_only) { return; } is_stitch_route = p_value; logfile.start_scope(LogfileScope.SET_STITCH_ROUTE, p_value); } /** * Changes the current width of the tidy region for traces. */ public void set_current_pull_tight_region_width(int p_value) { if (read_only) { return; } trace_pull_tight_region_width = p_value; logfile.start_scope(LogfileScope.SET_PULL_TIGHT_REGION_WIDTH, p_value); } /** * Changes the current width of the pull tight accuracy for traces. */ public void set_current_pull_tight_accuracy(int p_value) { if (read_only) { return; } trace_pull_tight_accuracy = p_value; logfile.start_scope(LogfileScope.SET_PULL_TIGHT_ACCURACY, p_value); } /** * Changes, if vias snap to smd center, if attach smd is allowed. */ public void set_via_snap_to_smd_center(boolean p_value) { if (read_only) { return; } via_snap_to_smd_center = p_value; } /** * Sets the current trace width selection to manual or automatic. */ public void set_manual_tracewidth_selection(boolean p_value) { if (read_only) { return; } manual_rule_selection = p_value; logfile.start_scope(LogfileScope.SET_MANUAL_TRACEWITH_SELECTION, p_value); } /** * Sets the manual trace half width used in interactive routing. */ public void set_manual_trace_half_width( int p_layer_no, int p_value) { if (read_only) { return; } manual_trace_half_width_arr[p_layer_no] = p_value; logfile.start_scope(LogfileScope.SET_MANUAL_TRACE_HALF_WIDTH, p_layer_no); logfile.add_int(p_value); } /** * The index of the clearance class used for traces in interactive routing in the clearance matrix, * if manual_route_selection is on. */ public void set_manual_trace_clearance_class(int p_index) { if (read_only) { return; } manual_trace_clearance_class = p_index; logfile.start_scope(LogfileScope.SET_MANUAL_TRACE_CLEARANCE_CLASS, p_index); } /** * If true, the wheel is used for zooming. */ public void set_zoom_with_wheel(boolean p_value) { if (read_only) { return; } if (zoom_with_wheel != p_value) { zoom_with_wheel = p_value; if (logfile != null) { logfile.start_scope(LogfileScope.SET_ZOOM_WITH_WHEEL, p_value); } } } /** * Changes the interactive selectability of p_item_type. */ public void set_selectable(ItemSelectionFilter.SelectableChoices p_item_type, boolean p_value) { if (read_only) { return; } item_selection_filter.set_selected(p_item_type, p_value); logfile.start_scope(LogfileScope.SET_SELECTABLE, p_item_type.ordinal()); int logged_value; if (p_value) { logged_value = 1; } else { logged_value = 0; } logfile.add_int(logged_value); } /** * Defines, if the setting attributes are allowed to be changed interactively or not. */ public void set_read_only(Boolean p_value) { this.read_only = p_value; } void set_logfile(Logfile p_logfile) { this.logfile = p_logfile; } /** Reads an instance of this class from a file */ private void readObject(java.io.ObjectInputStream p_stream) throws java.io.IOException, java.lang.ClassNotFoundException { p_stream.defaultReadObject(); if (this.item_selection_filter == null) { System.out.println("Settings.readObject: item_selection_filter is null"); this.item_selection_filter = new ItemSelectionFilter(); } if (this.snapshot_attributes == null) { System.out.println("Settings.readObject: snapshot_attributes is null"); this.snapshot_attributes = new SnapShot.Attributes(); } this.read_only = false; } /** the current layer */ int layer; /** allows pushing obstacles aside */ boolean push_enabled; /** allows dragging components with the route */ boolean drag_components_enabled; /** indicates if interactive selections are made on all visible layers or only on the current layer.*/ boolean select_on_all_visible_layers ; /** Route mode: stitching or dynamic */ boolean is_stitch_route; /** The width of the pull tight region of traces around the cursor */ int trace_pull_tight_region_width; /** The accuracy of the pull tight algorithm. */ int trace_pull_tight_accuracy; /** * Via snaps to smd center, if attach smd is alllowed. */ boolean via_snap_to_smd_center; /** * The horizontal placement grid when moving components, if > 0. */ int horizontal_component_grid; /** * The vertical placement grid when moving components, if > 0. */ int vertical_component_grid; /** * If true, the trace width at static pins smaller the the trace width will be lowered * automatically to the pin with, if necessary. */ boolean automatic_neckdown; /** Indicates if the routing rule selection is manual by the user or automatic by the net rules. */ boolean manual_rule_selection; /** If true, the current routing obstacle is hilightet in dynamic routing. */ boolean hilight_routing_obstacle; /** * The index of the clearance class used for traces in interactive routing in the clearance matrix, * if manual_route_selection is on. */ int manual_trace_clearance_class; /** * The index of the via rule used in routing in the board via rules if manual_route_selection is on. */ int manual_via_rule_index; /** If true, the mouse wheel is used for zooming. */ boolean zoom_with_wheel; /** The array of manual trace half widths, initially equal to the automatic trace half widths. */ final int [] manual_trace_half_width_arr; public AutorouteSettings autoroute_settings; /** The filter used in interactive selection of board items. */ ItemSelectionFilter item_selection_filter; /** Defines the data of the snapshot selected for restoring. */ SnapShot.Attributes snapshot_attributes; /** Indicates, if the data of this class are not allowed to be changed in ineractive board editing. */ private transient boolean read_only = false; /** * The file used for logging interactive action, * so that they can be replayed later */ private transient Logfile logfile; }