Files
wg_cpso/UserControls/ModelTree.cs

3509 lines
144 KiB
C#
Raw Normal View History

2026-03-25 18:20:24 +08:00
using CaeGlobals;
using CaeJob;
using CaeMesh;
using CaeModel;
using CaeResults;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace UserControls
{
public enum ViewType
{
Geometry,
Model,
Results
}
public struct ContextMenuFields
{
public HashSet<Type> Types;
//
public int Create;
public int Edit;
public int EditStepControls;
public int Query;
public int Duplicate;
public int Propagate;
public int Preview;
//
public int CompoundPart;
public int SwapParts;
//
public int MeshingParameters;
public int PreviewEdgeMesh;
public int CreateMesh;
//
public int CopyPartToGeometry;
//
public int EditCalculixKeywords;
//
public int MergePart;
//
public int ConvertToPart;
//
public int MaterialLibrary;
//
public int SearchContactPairs;
public int SwapMergeMasterSlave;
//
public int Hide;
public int Show;
public int ColorTransparency;
//
public int Deformed;
public int ColorContours;
//
public int Run;
public int Monitor;
public int Results;
public int Kill;
//
public int Activate;
public int Deactivate;
//
public int Expand;
public int Collapse;
//
public int Delete;
}
public enum HideShowOperation
{
Hide,
Show,
ShowOnly
}
public partial class ModelTree : UserControl
{
// Variables
private bool _screenUpdating;
private bool _doubleClick;
private const int WM_MOUSEMOVE = 0x0200;
private bool _disableMouse;
private bool _disableSelectionsChanged;
private Dictionary<CodersLabTreeView, bool[]> _prevStates;
// Geometry
private TreeNode _geomParts; // 1
private TreeNode _meshSetupItems; // 1
// Model
private TreeNode _model; // 1
private TreeNode _modelMesh; // 2
private TreeNode _modelParts; // 3
private TreeNode _modelNodeSets; // 3
private TreeNode _modelElementSets; // 3
private TreeNode _modelSurfaces; // 3
private TreeNode _modelFeatures; // 2
private TreeNode _modelReferencePoints; // 3
private TreeNode _modelCoordinateSystems; // 3
private TreeNode _materials; // 2
private TreeNode _sections; // 2
private TreeNode _constraints; // 2
private TreeNode _contacts; // 2
private TreeNode _surfaceInteractions; // 3
private TreeNode _contactPairs; // 3
private TreeNode _distributions; // 2
private TreeNode _amplitudes; // 2
private TreeNode _initialConditions; // 2
private TreeNode _steps; // 2
private TreeNode _analyses; // 1
// Results
private TreeNode _resultModel; // 1
private TreeNode _resultMesh; // 2
private TreeNode _resultParts; // 3
private TreeNode _resultNodeSets; // 3
private TreeNode _resultElementSets; // 3
private TreeNode _resultSurfaces; // 3
private TreeNode _resultFeatures; // 2
private TreeNode _resultReferencePoints; // 3
private TreeNode _resultCoordinateSystems; // 3
private TreeNode _results; // 1
private TreeNode _resultFieldOutputs; // 2
private TreeNode _resultHistoryOutputs; // 2
// Geometry
private const string _geomPartsName = "Parts";
private const string _meshSetupItemsName = "Mesh Setup";
// Model
private const string _modelName = "Model";
private const string _modelMeshName = "Mesh";
private const string _modelPartsName = "Parts";
private const string _modelNodeSetsName = "Node Sets";
private const string _modelElementSetsName = "Element Sets";
private const string _modelSurfacesName = "Surfaces";
private const string _modelFeaturesName = "Features";
private const string _modelReferencePointsName = "Reference Points";
private const string _modelCoordinateSystemsName = "Coordinate Systems";
private const string _materialsName = "Materials";
private const string _sectionsName = "Sections";
private const string _constraintsName = "Constraints";
private const string _contactsName = "Contacts";
private const string _surfaceInteractionsName = "Surface Interactions";
private const string _contactPairsName = "Contact Pairs";
private const string _distributionsName = "Distributions";
private const string _amplitudesName = "Amplitudes";
private const string _initialConditionsName = "Initial Conditions";
private const string _stepsName = "Steps";
private const string _modelFieldOutputsName = "Field Outputs";
private const string _modelHistoryOutputsName = "History Outputs";
private const string _boundaryConditionsName = "BCs";
private const string _loadsName = "Loads";
private const string _definedFieldsName = "Defined Fields";
private const string _analysesName = "Analyses";
// Results
private const string _resultModelName = "Model";
private const string _resultMeshName = "Mesh";
private const string _resultPartsName = "Parts";
private const string _resultNodeSetsName = "Node Sets";
private const string _resultElementSetsName = "Element Sets";
private const string _resultSurfacesName = "Surfaces";
private const string _resultFeaturesName = "Features";
private const string _resultReferencePointsName = "Reference Points";
private const string _resultCoordinateSystemsName = "Coordinate Systems";
private const string _resultsName = "Results";
private const string _resultFieldOutputsName = "Field Outputs";
private const string _resultHistoryOutputsName = "History Outputs";
// Geometry
private const string _geomPartsDisplayName = "几何";
private const string _meshSetupItemsDisplayName = "网格设置";
// 模型
private const string _modelDisplayName = "模型";
private const string _modelMeshDisplayName = "网格";
private const string _modelPartsDisplayName = "零部件";
private const string _modelNodeSetsDisplayName = "节点集合";
private const string _modelElementSetsDisplayName = "单元集合";
private const string _modelSurfacesDisplayName = "面集合";
private const string _modelFeaturesDisplayName = "参考特征";
private const string _modelReferencePointsDisplayName = "参考点";
private const string _modelCoordinateSystemsDisplayName = "坐标系";
private const string _materialsDisplayName = "材料";
private const string _sectionsDisplayName = "截面";
private const string _constraintsDisplayName = "Constraints";
private const string _contactsDisplayName = "Contacts";
private const string _surfaceInteractionsDisplayName = "Surface Interactions";
private const string _contactPairsDisplayName = "Contact Pairs";
private const string _distributionsDisplayName = "Distributions";
private const string _amplitudesDisplayName = "Amplitudes";
private const string _initialConditionsDisplayName = "Initial Conditions";
private const string _stepsDisplayName = "分析步";
private const string _modelFieldOutputsDisplayName = "Field Outputs";
private const string _modelHistoryOutputsDisplayName = "History Outputs";
private const string _boundaryConditionsDisplayName = "边界条件";
private const string _loadsDisplayName = "载荷";
private const string _definedFieldsDisplayName = "Defined Fields";
private const string _analysesDisplayName = "分析";
// Results
private const string _resultModelDisplayName = "模型";
private const string _resultMeshDisplayName = "网格";
private const string _resultPartsDisplayName = "零部件";
private const string _resultNodeSetsDisplayName = "节点集合";
private const string _resultElementSetsDisplayName = "单元集合";
private const string _resultSurfacesDisplayName = "面集合";
private const string _resultFeaturesDisplayName = "参考特征";
private const string _resultReferencePointsDisplayName = "参考点";
private const string _resultCoordinateSystemsDisplayName = "坐标系";
private const string _resultsDisplayName = "分析结果";
private const string _resultFieldOutputsDisplayName = "场输出";
private const string _resultHistoryOutputsDisplayName = "History Outputs";
// Properties
public bool ScreenUpdating
{
get { return _screenUpdating; }
set { _screenUpdating = value; }
}
public bool DisableSelectionsChanged
{
get { return _disableSelectionsChanged; }
set { _disableSelectionsChanged = value; }
}
public bool DisableMouse
{
get { return _disableMouse; }
set
{
_disableMouse = value;
cltvGeometry.DisableMouse = value;
cltvModel.DisableMouse = value;
cltvResults.DisableMouse = value;
//
stbGeometry.Enabled = !value;
stbModel.Enabled = !value;
stbResults.Enabled = !value;
}
}
public bool DisableGeometryAndModelTreeMouse
{
set
{
cltvGeometry.DisableMouse = value;
cltvModel.DisableMouse = value;
//
stbGeometry.Enabled = !value;
stbModel.Enabled = !value;
}
}
public bool DisableResultsTreeMouse
{
set
{
cltvResults.DisableMouse = value;
//
stbResults.Enabled = !value;
}
}
public string[] IntersectSelectionWithList(NamedClass[] list)
{
List<string> selected = new List<string>();
CodersLabTreeView tree = GetActiveTree();
foreach (TreeNode node in tree.SelectedNodes)
{
if (node.Tag != null && list.Contains(node.Tag))
selected.Add(node.Text);
}
return selected.ToArray();
}
//
public string MeshSetupItemsName { get { return _meshSetupItemsName; } }
public string NodeSetsName { get { return _modelNodeSetsName; } }
public string ElementSetsName { get { return _modelElementSetsName; } }
public string SurfacesName { get { return _modelSurfacesName; } }
public string ModelReferencePointsName { get { return _modelReferencePointsName; } }
public string ModelCoordinateSystemsName { get { return _modelCoordinateSystemsName; } }
public string MaterialsName { get { return _materialsName; } }
public string SectionsName { get { return _sectionsName; } }
public string ConstraintsName { get { return _constraintsName; } }
public string SurfaceInteractionsName { get { return _surfaceInteractionsName; } }
public string ContactPairsName { get { return _contactPairsName; } }
public string DistributionsName { get { return _distributionsName; } }
public string AmplitudesName { get { return _amplitudesName; } }
public string InitialConditionsName { get { return _initialConditionsName; } }
public string StepsName { get { return _stepsName; } }
public string ModelHistoryOutputsName { get { return _modelHistoryOutputsName; } }
public string ModelFieldOutputsName { get { return _modelFieldOutputsName; } }
public string BoundaryConditionsName { get { return _boundaryConditionsName; } }
public string LoadsName { get { return _loadsName; } }
public string DefinedFieldsName { get { return _definedFieldsName; } }
public string AnalysesName { get { return _analysesName; } }
//Results
public string ResultReferencePointsName { get { return _resultReferencePointsName; } }
public string ResultCoordinateSystemsName { get { return _resultCoordinateSystemsName; } }
public string ResultHistoryOutputsName { get { return _resultHistoryOutputsName; } }
public string ResultFieldOutputsName { get { return _resultFieldOutputsName; } }
// Events
public event Action<ViewType> GeometryMeshResultsEvent;
public event Action<NamedClass[], bool> SelectEvent;
public event Action ClearSelectionEvent;
//
public event Action<string, string> CreateEvent;
public event Action<NamedClass, string> EditEvent;
public event Action<string> EditStepControlsEvent;
public event Action QueryEvent;
public event Action<NamedClass[], string[]> DuplicateEvent;
public event Action<NamedClass[], string[]> PropagateEvent;
public event Action<NamedClass[], string[]> PreviewEvent;
public event Action<string[]> CreateCompoundPart;
public event Action<string[]> SwapPartGeometries;
public event Func<string[], MeshSetupItem, Task> PreviewEdgeMesh;
public event Action<string[]> CreateMeshEvent;
public event Action<string[]> CopyGeometryToResultsEvent;
public event Action EditCalculixKeywords;
public event Action<string[]> MergeParts;
public event Action<string[]> MergeResultParts;
public event Action<string[]> ConvertElementSetsToMeshParts;
public event Action MaterialLibrary;
public event Action SearchContactPairs;
public event Action<NamedClass[]> SwapMasterSlave;
public event Action<NamedClass[]> MergeByMasterSlave;
public event Action<NamedClass[], HideShowOperation, string[]> HideShowEvent;
public event Action<string[]> SetPartColorEvent;
public event Action<string[]> ResetPartColorEvent;
public event Action<string[]> SetTransparencyEvent;
public event Action<NamedClass[], bool> ColorContoursVisibilityEvent;
public event Action<string> RunEvent;
public event Action<string> CheckModelEvent;
public event Action<string> MonitorEvent;
public event Action<string> ResultsEvent;
public event Action<string> KillEvent;
public event Action<NamedClass[], bool, string[]> ActivateDeactivateEvent;
public event Action<NamedClass[], string[]> DeleteEvent;
//
public event Action<string[]> FieldDataSelectEvent;
public event Action RenderingOn;
public event Action RenderingOff;
// Callbacks
public Action RegenerateTreeCallBack;
// private TreeNode _modelRBFMorph;
// Constructors
public ModelTree()
{
InitializeComponent();
// 1. 添加节点
// Geometry
_geomParts = cltvGeometry.Nodes.Find(_geomPartsName, true)[0];
_meshSetupItems = cltvGeometry.Nodes.Find(_meshSetupItemsName, true)[0];
// Model
_model = cltvModel.Nodes.Find(_modelName, true)[0];
_modelMesh = cltvModel.Nodes.Find(_modelMeshName, true)[0];
_modelParts = cltvModel.Nodes.Find(_modelPartsName, true)[0];
_modelNodeSets = cltvModel.Nodes.Find(_modelNodeSetsName, true)[0];
_modelElementSets = cltvModel.Nodes.Find(_modelElementSetsName, true)[0];
_modelSurfaces = cltvModel.Nodes.Find(_modelSurfacesName, true)[0];
_modelFeatures = cltvModel.Nodes.Find(_modelFeaturesName, true)[0];
_modelReferencePoints = cltvModel.Nodes.Find(_modelReferencePointsName, true)[0];
_modelCoordinateSystems = cltvModel.Nodes.Find(_modelCoordinateSystemsName, true)[0];
_materials = cltvModel.Nodes.Find(_materialsName, true)[0];
_sections = cltvModel.Nodes.Find(_sectionsName, true)[0];
_constraints = cltvModel.Nodes.Find(_constraintsName, true)[0];
_contacts = cltvModel.Nodes.Find(_contactsName, true)[0];
_surfaceInteractions = cltvModel.Nodes.Find(_surfaceInteractionsName, true)[0];
_contactPairs = cltvModel.Nodes.Find(_contactPairsName, true)[0];
_distributions = cltvModel.Nodes.Find(_distributionsName, true)[0];
_amplitudes = cltvModel.Nodes.Find(_amplitudesName, true)[0];
_initialConditions = cltvModel.Nodes.Find(_initialConditionsName, true)[0];
_steps = cltvModel.Nodes.Find(_stepsName, true)[0];
_analyses = cltvModel.Nodes.Find(_analysesName, true)[0];
// Results
_resultModel = cltvResults.Nodes.Find(_resultModelName, true)[0];
_resultMesh = cltvResults.Nodes.Find(_resultMeshName, true)[0];
_resultParts = cltvResults.Nodes.Find(_resultPartsName, true)[0];
_resultNodeSets = cltvResults.Nodes.Find(_resultNodeSetsName, true)[0];
_resultElementSets = cltvResults.Nodes.Find(_resultElementSetsName, true)[0];
_resultSurfaces = cltvResults.Nodes.Find(_resultSurfacesName, true)[0];
_resultFeatures = cltvResults.Nodes.Find(_resultFeaturesName, true)[0];
_resultReferencePoints = cltvResults.Nodes.Find(_resultReferencePointsName, true)[0];
_resultCoordinateSystems = cltvResults.Nodes.Find(_resultCoordinateSystemsName, true)[0];
_results = cltvResults.Nodes.Find(_resultsName, true)[0];
_resultFieldOutputs = cltvResults.Nodes.Find(_resultFieldOutputsName, true)[0];
_resultHistoryOutputs = cltvResults.Nodes.Find(_resultHistoryOutputsName, true)[0];
// Add NamedClasses to static items
_model.Tag = new EmptyNamedClass(typeof(FeModel).ToString());
// 2. 设置节点图标
// Geometry icons
_geomParts.StateImageKey = "GeomPart";
// Model icons
_modelMesh.StateImageKey = "Mesh";
_modelParts.StateImageKey = "BasePart";
_modelNodeSets.StateImageKey = "Node_set";
_modelElementSets.StateImageKey = "Element_set";
_modelSurfaces.StateImageKey = "Surface";
_modelFeatures.StateImageKey = "Features";
_modelReferencePoints.StateImageKey = "Reference_point";
_modelCoordinateSystems.StateImageKey = "CoordinateSystem";
_materials.StateImageKey = "Material";
_sections.StateImageKey = "Section";
_constraints.StateImageKey = "Constraints";
_surfaceInteractions.StateImageKey = "SurfaceInteractions";
_contactPairs.StateImageKey = "ContactPairs";
_distributions.StateImageKey = "Distributions";
_amplitudes.StateImageKey = "Amplitudes";
_initialConditions.StateImageKey = "InitialConditions";
_steps.StateImageKey = "Step";
_analyses.StateImageKey = "Bc";
// Results icons
_resultMesh.StateImageKey = "Mesh";
_resultParts.StateImageKey = "BasePart";
_resultNodeSets.StateImageKey = "Node_set";
_resultElementSets.StateImageKey = "Element_set";
_resultSurfaces.StateImageKey = "Surface";
_resultFeatures.StateImageKey = "Features";
_resultReferencePoints.StateImageKey = "Reference_point";
_resultCoordinateSystems.StateImageKey = "CoordinateSystem";
_resultFieldOutputs.StateImageKey = "Field_output";
_resultHistoryOutputs.StateImageKey = "History_output";
// 添加RBF Morph节点 by Luke 2025-9-9
/* _modelRBFMorph = new TreeNode
{
Name = "RBFMorph",
Text = @"RBF变形",
ImageKey = @"Mesh.ico",
SelectedImageKey = @"Mesh.ico"
}; */
//
_doubleClick = false;
_screenUpdating = true;
_prevStates = new Dictionary<CodersLabTreeView, bool[]>();
_prevStates.Add(cltvGeometry, null);
_prevStates.Add(cltvModel, null);
_prevStates.Add(cltvResults, null);
// 调整界面元素
Clear();
// TabPage本地化
tpGeometry.Text = @"几何";
tpModel.Text = @"FEM模型";
tpResults.Text = @"后处理";
}
// Event handlers
private void tcGeometryModelResults_Deselecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = _disableMouse;
}
private void stbGeometry_TextChanged(object sender, EventArgs e)
{
FilterTree(cltvGeometry, stbGeometry.Text);
}
private void stbModel_TextChanged(object sender, EventArgs e)
{
FilterTree(cltvModel, stbModel.Text);
}
private void stbResults_TextChanged(object sender, EventArgs e)
{
FilterTree(cltvResults, stbResults.Text);
}
#region Geometry-Model-Results
private ViewType GetViewType()
{
if (tcGeometryModelResults.SelectedTab == tpGeometry) return ViewType.Geometry;
else if (tcGeometryModelResults.SelectedTab == tpModel) return ViewType.Model;
else if (tcGeometryModelResults.SelectedTab == tpResults) return ViewType.Results;
else throw new NotSupportedException();
}
private void tcGeometryModelResults_SelectedIndexChanged(object sender, EventArgs e)
{
GeometryMeshResultsEvent?.Invoke(GetViewType());
}
public void SetGeometryTab()
{
tcGeometryModelResults.SelectedIndexChanged -= tcGeometryModelResults_SelectedIndexChanged;
bool prevMouseState = _disableMouse;
_disableMouse = false;
tcGeometryModelResults.SelectedTab = tpGeometry;
_disableMouse = prevMouseState;
tcGeometryModelResults.SelectedIndexChanged += tcGeometryModelResults_SelectedIndexChanged;
}
public void SetModelTab()
{
tcGeometryModelResults.SelectedIndexChanged -= tcGeometryModelResults_SelectedIndexChanged;
bool prevMouseState = _disableMouse;
_disableMouse = false;
tcGeometryModelResults.SelectedTab = tpModel;
_disableMouse = prevMouseState;
tcGeometryModelResults.SelectedIndexChanged += tcGeometryModelResults_SelectedIndexChanged;
}
public void SetResultsTab()
{
tcGeometryModelResults.SelectedIndexChanged -= tcGeometryModelResults_SelectedIndexChanged;
bool prevMouseState = _disableMouse;
_disableMouse = false;
tcGeometryModelResults.SelectedTab = tpResults;
_disableMouse = prevMouseState;
tcGeometryModelResults.SelectedIndexChanged += tcGeometryModelResults_SelectedIndexChanged;
}
#endregion
#region Tree event handlers
private void PrepareToolStripItem(CodersLabTreeView tree)
{
int n = tree.SelectedNodes.Count;
//
ContextMenuFields menuFields = new ContextMenuFields();
menuFields.Types = new HashSet<Type>();
foreach (TreeNode node in tree.SelectedNodes)
{
AppendMenuFields(node, ref menuFields);
}
bool oneAboveVisible = false;
// Visibility
bool visible;
// Create
visible = menuFields.Create == n;
tsmiCreate.Visible = visible;
oneAboveVisible |= visible;
// Edit
visible = menuFields.Edit == n;
tsmiEdit.Visible = visible;
oneAboveVisible |= visible;
// Edit step controls
visible = menuFields.EditStepControls == n;
tsmiEditStepControls.Visible = visible;
oneAboveVisible |= visible;
// Query
visible = menuFields.Query > 0;
tsmiQuery.Visible = visible;
oneAboveVisible |= visible;
// Duplicate
visible = menuFields.Duplicate == n;
tsmiDuplicate.Visible = visible;
oneAboveVisible |= visible;
// Propagate
visible = menuFields.Propagate == n;
tsmiPropagate.Visible = visible;
oneAboveVisible |= visible;
// Preview
visible = menuFields.Preview == n;
tsmiPreview.Visible = visible;
oneAboveVisible |= visible;
// Geometry
visible = menuFields.CompoundPart == n && n > 1;
tsmiSpaceCompoundPart.Visible = visible && oneAboveVisible;
tsmiCompoundPart.Visible = visible;
visible = menuFields.SwapParts == n && n == 2;
tsmiSwapPartGeometries.Visible = visible;
oneAboveVisible |= visible;
// Mesh
visible = menuFields.MeshingParameters == n;
tsmiSpaceMesh.Visible = visible && oneAboveVisible;
tsmiPreviewEdgeMesh.Visible = visible;
tsmiCreateMesh.Visible = visible;
// Copy part
tsmiSpaceCopyPart.Visible = visible;
tsmiCopyGeometryToResults.Visible = visible;
oneAboveVisible |= visible;
// Edit Calculix Keywords
visible = menuFields.EditCalculixKeywords == n && n > 0;
tsmiSpaceEditCalculiXKeywords.Visible = visible && oneAboveVisible;
tsmiEditCalculiXKeywords.Visible = visible;
oneAboveVisible |= visible;
// Merge mesh parts
visible = menuFields.MergePart == n && n > 1;
tsmiSpaceMergeParts.Visible = visible && oneAboveVisible;
tsmiMergeParts.Visible = visible;
oneAboveVisible |= visible;
// Convert element set
visible = menuFields.ConvertToPart == n;
tsmiSpaceConvertToPart.Visible = visible && oneAboveVisible;
tsmiConvertToPart.Visible = visible;
oneAboveVisible |= visible;
// Material library
visible = menuFields.MaterialLibrary == n && n > 0;
tsmiSpaceMaterialLibrary.Visible = visible && oneAboveVisible;
tsmiMaterialLibrary.Visible = visible;
oneAboveVisible |= visible;
// Search contact pairs
visible = menuFields.SearchContactPairs == n && n > 0;
tsmiSpaceSearchContactPairs.Visible = visible && oneAboveVisible;
tsmiSearchContactPairs.Visible = visible;
oneAboveVisible |= visible;
// Swap Merge Master/Slave
visible = menuFields.SwapMergeMasterSlave == n && n > 0;
tsmiSpaceSwapMergeMasterSlave.Visible = visible && oneAboveVisible;
tsmiSwapMasterSlave.Visible = visible;
tsmiMergeByMasterSlave.Visible = visible && n > 1;
oneAboveVisible |= visible;
// Hide/Show
visible = menuFields.Hide + menuFields.Show == n;
tsmiSpaceHideShow.Visible = visible && oneAboveVisible;
tsmiHide.Visible = visible;
tsmiShow.Visible = visible;
tsmiShowOnly.Visible = visible;
oneAboveVisible |= visible;
// Color
visible = menuFields.ColorTransparency == n;
tsmiSpaceColor.Visible = visible && oneAboveVisible;
tsmiSetColor.Visible = visible;
tsmiResetColor.Visible = visible;
tsmiSetTransparency.Visible = visible; // transparency
oneAboveVisible |= visible;
// Deformed/Color contours
visible = menuFields.Deformed == n;
tsmiSpaceColorContours.Visible = visible && oneAboveVisible;
tsmiColorContoursOff.Visible = visible;
tsmiColorContoursOn.Visible = visible;
oneAboveVisible |= visible;
// Analysis
visible = menuFields.Run == n;
tsmiSpaceAnalysis.Visible = visible && oneAboveVisible;
tsmiRun.Visible = visible;
tsmiCheckModel.Visible = visible;
tsmiMonitor.Visible = visible;
tsmiResults.Visible = visible;
tsmiKill.Visible = visible;
oneAboveVisible |= visible;
// Activate/Deactivate
visible = menuFields.Activate + menuFields.Deactivate == n;
tsmiSpaceActive.Visible = visible && oneAboveVisible;
tsmiActivate.Visible = visible;
tsmiDeactivate.Visible = visible;
oneAboveVisible |= visible;
//Expand / Collapse
tsmiSpaceExpandColapse.Visible = oneAboveVisible;
tsmiExpandAll.Visible = true;
tsmiCollapseAll.Visible = true;
oneAboveVisible = true;
// Delete
visible = menuFields.Delete == n;
tsmiSpaceDelete.Visible = visible && oneAboveVisible;
tsmiDelete.Visible = visible;
oneAboveVisible |= visible;
// Enabled
bool enabled;
// Create
enabled = menuFields.Create == 1;
tsmiCreate.Enabled = enabled;
// Edit
if (menuFields.Types.Count == 1 && menuFields.Types.Contains(typeof(GeometryPart))) enabled = true;
else if (menuFields.Types.Count == 2 && menuFields.Types.Contains(typeof(GeometryPart)) &&
menuFields.Types.Contains(typeof(CompoundGeometryPart))) enabled = true;
else enabled = menuFields.Edit == 1;
tsmiEdit.Enabled = enabled;
// Mesh
tsmiCreateMesh.Enabled = true;
// Copy part
tsmiCopyGeometryToResults.Enabled = true;
// Material library
tsmiMaterialLibrary.Enabled = true;
// Hide/Show
tsmiHide.Enabled = true;
tsmiShow.Enabled = true;
tsmiShowOnly.Enabled = true;
// Deformed/Color contours
tsmiColorContoursOff.Enabled = true;
tsmiColorContoursOn.Enabled = true;
// Analysis
enabled = menuFields.Run == 1;
tsmiRun.Enabled = enabled;
tsmiMonitor.Enabled = enabled;
tsmiResults.Enabled = enabled;
tsmiKill.Enabled = enabled;
// Activate/Deactivate
tsmiActivate.Enabled = true;
tsmiDeactivate.Enabled = true;
// Delete
tsmiDelete.Enabled = true;
}
//
private void AppendMenuFields(TreeNode node, ref ContextMenuFields menuFields)
{
// Check if selected node is Model
// Edit Calculix Keywords
if (node == _model)
{
menuFields.Edit++;
menuFields.EditCalculixKeywords++;
return;
}
//
NamedClass item = (NamedClass)node.Tag;
bool subPart = node.Parent != null && node.Parent.Tag is CompoundGeometryPart;
//
if (item != null) menuFields.Types.Add(item.GetType());
// Create
if (CanCreate(node)) menuFields.Create++;
// Edit
if (item != null)
{
if (item is Field ||
item is HistoryResultSet ||
item is HistoryResultField) { }
else if (node.TreeView == cltvResults &&
(item is FeNodeSet ||
item is FeElementSet ||
item is FeSurface)) { }
else menuFields.Edit++;
}
// Edit step controls
if (item != null && item is Step) menuFields.EditStepControls++;
// Query
if (item != null && item is BasePart) menuFields.Query++;
//Duplicate
if (item != null && CanDuplicate(node)) menuFields.Duplicate++;
//Propagate
if (item != null && CanPropagate(node)) menuFields.Propagate++;
//Propagate
if (item != null && CanPreview(node)) menuFields.Preview++;
// Geometry part - Geometry
if (item != null && item is GeometryPart && GetActiveTree() == cltvGeometry)
{
menuFields.CompoundPart++;
menuFields.SwapParts++;
}
// Geometry part - Mesh
if (item != null && item is GeometryPart && GetActiveTree() == cltvGeometry)
{
if (!subPart)
{
menuFields.MeshingParameters++;
menuFields.PreviewEdgeMesh++;
menuFields.CreateMesh++;
}
menuFields.CopyPartToGeometry++;
}
// Merge mesh parts
if (item != null && item is MeshPart && GetActiveTree() == cltvModel) menuFields.MergePart++;
if (item != null && item is ResultPart && GetActiveTree() == cltvResults) menuFields.MergePart++;
// Convert element set to part
if (item != null && item is FeElementSet && GetActiveTree() == cltvModel) menuFields.ConvertToPart++;
// Material library
if (node == _materials) menuFields.MaterialLibrary++;
// Swap Merge Master/Slave
if (CanSearchContactPairs(node)) menuFields.SearchContactPairs++;
if (item != null && CanSwapMergeMasterSlave(node)) menuFields.SwapMergeMasterSlave++;
// Hide/Show
if (item != null && CanHide(item))
{
if (item.Visible) menuFields.Hide++;
else menuFields.Show++;
}
// Color & Transparency
if (item != null && item is BasePart) menuFields.ColorTransparency++;
// Deformed/Color contours
if (item != null && item is ResultPart)
{
if (!ResultPart.Undeformed)
{
menuFields.Deformed++;
menuFields.ColorContours++;
}
}
// Analysis
if (node.Parent == _analyses)
{
menuFields.Run++;
menuFields.Monitor++;
menuFields.Results++;
menuFields.Kill++;
}
// Activate/Deactivate
if (item != null && CanDeactivate(node))
{
if (item.Active) menuFields.Deactivate++;
else menuFields.Activate++;
}
// Delete
if (item != null && !subPart)
{
if (node.TreeView == cltvResults &&
(item is FeNodeSet ||
item is FeElementSet ||
item is FeSurface)) { }
else menuFields.Delete++;
}
}
//
private void cltv_MouseDown(object sender, MouseEventArgs e)
{
try
{
CodersLabTreeView tree = (CodersLabTreeView)sender;
//
if (ModifierKeys != Keys.Shift && ModifierKeys != Keys.Control && e.Clicks > 1) _doubleClick = true;
else _doubleClick = false;
//
TreeNode node = tree.GetNodeAt(e.Location);
if (node == null)
{
tree.SelectedNodes.Clear();
ClearSelectionEvent();
}
}
catch
{ }
}
private void cltv_MouseUp(object sender, MouseEventArgs e)
{
try
{
CodersLabTreeView tree = (CodersLabTreeView)sender;
//
if (e.Button == MouseButtons.Right)
{
if (tree.SelectedNodes.Count > 0)
{
PrepareToolStripItem(tree);
cmsTree.Show(tree, e.Location);
}
}
}
catch
{ }
}
private void cltv_SelectionsChanged(object sender, EventArgs e)
{
if (_disableSelectionsChanged) return;
// This function is also called with sender as null parameter
CodersLabTreeView tree = GetActiveTree();
TreeNode node;
List<NamedClass> items = new List<NamedClass>();
//
if (!_doubleClick && tree.SelectedNodes.Count > 0)
{
// Select field data
if (tree.SelectedNodes.Count == 1)
{
node = tree.SelectedNodes[0];
// Results
if (node.Tag is FieldData)
{
SelectEvent?.Invoke(null, false); // clear selection
FieldDataSelectEvent?.Invoke(new string[] { node.Parent.Name, node.Name });
ActiveControl = cltvResults; // this is for the arrow keys to work on the results tree
return;
}
}
// Select
TreeNode lastNode = null;
foreach (TreeNode selectedNode in tree.SelectedNodes)
{
if (selectedNode.Tag == null) continue;
//
items.Add((NamedClass)selectedNode.Tag);
lastNode = selectedNode;
}
if (lastNode != null) lastNode.EnsureVisible();
//
SelectEvent?.Invoke(items.ToArray(), false);
}
else if (tree.SelectedNodes.Count == 0) ClearSelectionEvent();
//
return;
}
private void cltv_MouseOverNodeChangedEvent(object sender)
{
if (_disableSelectionsChanged) return;
//
//timerMouseMove.Stop();
timerMouseMove.Start();
}
private void cltv_MouseDoubleClick(object sender, MouseEventArgs e)
{
CodersLabTreeView tree = GetActiveTree();
if (tree.SelectedNodes.Count != 1) return;
//
TreeNode selectedNode = tree.SelectedNodes[0];
//
if (selectedNode == null || ModifierKeys == Keys.Shift || ModifierKeys == Keys.Control) return;
//
if (selectedNode == tree.HitTest(e.Location).Node)
{
if (selectedNode.Tag == null)
{
if (CanCreate(selectedNode)) tsmiCreate_Click(null, null);
else
{
_doubleClick = false; // must be here to allow expand/collapse
//
if (selectedNode.IsExpanded) selectedNode.Collapse();
else selectedNode.Expand();
}
}
else tsmiEdit_Click(null, null);
}
_doubleClick = false;
}
private void cltv_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
if (_doubleClick == true && e.Action == TreeViewAction.Expand)
{
e.Cancel = true;
}
}
private void cltv_BeforeCollapse(object sender, TreeViewCancelEventArgs e)
{
if (_doubleClick == true && e.Action == TreeViewAction.Collapse)
{
e.Cancel = true;
}
}
private void cltv_AfterCollapse(object sender, TreeViewEventArgs e)
{
CodersLabTreeView tree = (CodersLabTreeView)sender;
foreach (TreeNode node in tree.Nodes) SetAllNodesStatusIcons(node);
}
private void cltv_AfterExpand(object sender, TreeViewEventArgs e)
{
CodersLabTreeView tree = (CodersLabTreeView)sender;
foreach (TreeNode node in tree.Nodes) SetAllNodesStatusIcons(node);
}
public void cltv_KeyDown(object sender, KeyEventArgs e)
{
CodersLabTreeView tree = GetActiveTree();
//
//if (tree.Focused) // Disable since called from FrmMain.KeyboardHook_KeyDown
{
if (e.KeyCode == Keys.Delete)
{
tsmiDelete_Click(null, null);
}
else if (e.KeyCode == Keys.Space)
{
tsmiInvertHideShow_Click(null, null);
}
else if (e.KeyCode == Keys.Enter)
{
if (tree.SelectedNodes.Count == 1 && tree.SelectedNodes[0].Tag == null) tsmiCreate_Click(null, null);
else tsmiEdit_Click(null, null);
}
// No beep
e.SuppressKeyPress = true;
}
}
private void timerMouseMove_Tick(object sender, EventArgs e)
{
CodersLabTreeView tree = GetActiveTree();
List<NamedClass> items = new List<NamedClass>();
// Select
foreach (TreeNode selectedNode in tree.SelectedNodes)
{
if (selectedNode.Tag == null) continue;
//
items.Add((NamedClass)selectedNode.Tag);
}
// Add mouse over node
TreeNode node = tree.MouseOverNode;
//
if (node != null && node.Tag != null)
{
items.Add((NamedClass)node.Tag);
}
//
SelectEvent?.Invoke(items.ToArray(), true);
//
timerMouseMove.Stop();
}
#endregion
#region Tree context menu
private void tsmiCreate_Click(object sender, EventArgs e)
{
try
{
CodersLabTreeView tree = GetActiveTree();
if (tree.SelectedNodes.Count != 1) return;
//
TreeNode selectedNode = tree.SelectedNodes[0];
//
if (selectedNode.Tag == null)
{
if (CanCreate(selectedNode))
{
string stepName = null;
if (selectedNode.Parent != null && selectedNode.Parent.Tag is Step)
stepName = selectedNode.Parent.Name;
//
CreateEvent?.Invoke(selectedNode.Name, stepName);
}
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiEdit_Click(object sender, EventArgs e)
{
try
{
CodersLabTreeView tree = GetActiveTree();
// Edit Part Color
if (tree.SelectedNodes.Count != 1) return;
//
TreeNode selectedNode = tree.SelectedNodes[0];
//
if (selectedNode.Tag == null) return;
//
string stepName = null;
if (selectedNode.Parent != null && selectedNode.Parent.Parent != null &&
selectedNode.Parent.Parent.Tag is Step)
stepName = selectedNode.Parent.Parent.Name;
//
EditEvent?.Invoke((NamedClass)selectedNode.Tag, stepName);
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiEditStepControls_Click(object sender, EventArgs e)
{
try
{
CodersLabTreeView tree = GetActiveTree();
if (tree.SelectedNodes.Count != 1) return;
//
TreeNode selectedNode = tree.SelectedNodes[0];
//
if (selectedNode.Tag == null) return;
//
if (selectedNode.Tag is Step step) EditStepControlsEvent?.Invoke(step.Name);
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiQuery_Click(object sender, EventArgs e)
{
try
{
List<string> names = new List<string>();
foreach (TreeNode node in GetActiveTree().SelectedNodes)
{
if (node.Tag != null) names.Add(((NamedClass)node.Tag).Name);
}
if (names.Count > 0) QueryEvent?.Invoke();
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiDuplicate_Click(object sender, EventArgs e)
{
try
{
string stepName;
List<NamedClass> items = new List<NamedClass>();
List<string> stepNames = new List<string>();
//
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
//
stepName = null;
if (selectedNode.Parent != null && selectedNode.Parent.Parent != null && selectedNode.Parent.Parent.Tag is Step)
stepName = selectedNode.Parent.Parent.Name;
//
if (stepNames == null) continue;
//
items.Add((NamedClass)selectedNode.Tag);
stepNames.Add(stepName);
}
//
if (items.Count > 0)
{
RenderingOff?.Invoke();
DuplicateEvent?.Invoke(items.ToArray(), stepNames.ToArray());
RenderingOn?.Invoke();
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiPropagate_Click(object sender, EventArgs e)
{
try
{
string stepName;
List<NamedClass> items = new List<NamedClass>();
List<string> stepNames = new List<string>();
//
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
//
stepName = null;
if (selectedNode.Parent != null && selectedNode.Parent.Parent != null && selectedNode.Parent.Parent.Tag is Step)
stepName = selectedNode.Parent.Parent.Name;
//
if (stepNames == null) continue;
//
items.Add((NamedClass)selectedNode.Tag);
stepNames.Add(stepName);
}
//
if (items.Count > 0)
{
RenderingOff?.Invoke();
PropagateEvent?.Invoke(items.ToArray(), stepNames.ToArray());
RenderingOn?.Invoke();
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiPreview_Click(object sender, EventArgs e)
{
try
{
string stepName;
List<NamedClass> items = new List<NamedClass>();
List<string> stepNames = new List<string>();
//
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
//
stepName = null;
if (selectedNode.Parent != null && selectedNode.Parent.Parent != null && selectedNode.Parent.Parent.Tag is Step)
stepName = selectedNode.Parent.Parent.Name;
//
if (stepNames == null) continue;
//
items.Add((NamedClass)selectedNode.Tag);
stepNames.Add(stepName);
}
//
if (items.Count > 0)
{
PreviewEvent?.Invoke(items.ToArray(), stepNames.ToArray());
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
// Visibility
private void tsmiHideShow_Click(object sender, EventArgs e)
{
try
{
List<NamedClass> items = new List<NamedClass>();
string stepName;
List<string> stepNames = new List<string>();
//
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
//
if (CanHide(selectedNode.Tag))
{
items.Add((NamedClass)selectedNode.Tag);
stepName = null;
if (selectedNode.Parent != null && selectedNode.Parent.Parent != null && selectedNode.Parent.Parent.Tag is Step)
stepName = selectedNode.Parent.Parent.Name;
stepNames.Add(stepName);
}
}
//
if (items.Count > 0)
{
RenderingOff?.Invoke();
HideShowOperation operation;
if (sender == tsmiHide) operation = HideShowOperation.Hide;
else if (sender == tsmiShow) operation = HideShowOperation.Show;
else if (sender == tsmiShowOnly) operation = HideShowOperation.ShowOnly;
else throw new NotSupportedException();
HideShowEvent?.Invoke(items.ToArray(), operation, stepNames.ToArray());
RenderingOn?.Invoke();
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiInvertHideShow_Click(object sender, EventArgs e)
{
try
{
List<NamedClass> items = new List<NamedClass>();
string stepName;
List<string> stepNames = new List<string>();
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
if (CanHide(selectedNode.Tag))
{
items.Add((NamedClass)selectedNode.Tag);
stepName = null;
if (selectedNode.Parent != null && selectedNode.Parent.Parent != null && selectedNode.Parent.Parent.Tag is Step)
stepName = selectedNode.Parent.Parent.Name;
stepNames.Add(stepName);
}
}
if (items.Count > 0)
{
RenderingOff?.Invoke();
List<NamedClass> toShow = new List<NamedClass>();
List<NamedClass> toHide = new List<NamedClass>();
foreach (var item in items)
{
if (item.Visible) toHide.Add(item);
else toShow.Add(item);
}
if (toShow.Count > 0) HideShowEvent?.Invoke(toShow.ToArray(), HideShowOperation.Show, stepNames.ToArray());
if (toHide.Count > 0) HideShowEvent?.Invoke(toHide.ToArray(), HideShowOperation.Hide, stepNames.ToArray());
RenderingOn?.Invoke();
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiSetColor_Click(object sender, EventArgs e)
{
try
{
List<string> parts = new List<string>();
//
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
if (selectedNode.Tag is BasePart part) parts.Add(part.Name);
}
//
if (parts.Count > 0) SetPartColorEvent?.Invoke(parts.ToArray());
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiResetColor_Click(object sender, EventArgs e)
{
try
{
List<string> parts = new List<string>();
//
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
if (selectedNode.Tag is BasePart part) parts.Add(part.Name);
}
//
if (parts.Count > 0) ResetPartColorEvent?.Invoke(parts.ToArray());
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiSetTransparency_Click(object sender, EventArgs e)
{
try
{
List<string> parts = new List<string>();
//
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
if (selectedNode.Tag is BasePart part) parts.Add(part.Name);
}
//
if (parts.Count > 0) SetTransparencyEvent?.Invoke(parts.ToArray());
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiResultColorContoursVisibility_Click(object sender, EventArgs e)
{
try
{
List<NamedClass> items = new List<NamedClass>();
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
if (selectedNode.Tag is ResultPart)
{
items.Add((NamedClass)selectedNode.Tag);
}
}
if (items.Count > 0)
{
bool colorContours = (sender == tsmiColorContoursOn);
ColorContoursVisibilityEvent?.Invoke(items.ToArray(), colorContours);
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
// Geometry - compound, swap
private void tsmiCompoundPart_Click(object sender, EventArgs e)
{
try
{
List<string> names = new List<string>();
foreach (TreeNode node in cltvGeometry.SelectedNodes)
{
if (node.Tag != null) names.Add(((NamedClass)node.Tag).Name);
}
if (names.Count > 1) CreateCompoundPart?.Invoke(names.ToArray());
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiSwapPartGeometries_Click(object sender, EventArgs e)
{
try
{
List<string> names = new List<string>();
foreach (TreeNode node in cltvGeometry.SelectedNodes)
{
if (node.Tag != null) names.Add(((NamedClass)node.Tag).Name);
}
if (names.Count == 2) SwapPartGeometries?.Invoke(names.ToArray());
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
// Meshing
async private void tsmiPreviewEdgeMesh_Click(object sender, EventArgs e)
{
try
{
List<string> names = new List<string>();
foreach (TreeNode node in cltvGeometry.SelectedNodes)
{
if (node.Tag != null) names.Add(((NamedClass)node.Tag).Name);
}
if (names.Count > 0) await PreviewEdgeMesh?.Invoke(names.ToArray(), null);
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiCreateMesh_Click(object sender, EventArgs e)
{
try
{
List<string> names = new List<string>();
foreach (TreeNode node in cltvGeometry.SelectedNodes)
{
if (node.Tag != null) names.Add(((NamedClass)node.Tag).Name);
}
if (names.Count > 0) CreateMeshEvent?.Invoke(names.ToArray());
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
// Geometry - copy
private void tsmiCopyGeometryPartToResults_Click(object sender, EventArgs e)
{
try
{
List<string> names = new List<string>();
foreach (TreeNode node in cltvGeometry.SelectedNodes)
{
if (node.Tag != null) names.Add(((NamedClass)node.Tag).Name);
}
if (names.Count > 0) CopyGeometryToResultsEvent?.Invoke(names.ToArray());
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
// Model
private void tsmiEditCalculiXKeywords_Click(object sender, EventArgs e)
{
try
{
CodersLabTreeView tree = GetActiveTree();
if (tree.SelectedNodes.Count != 1) return;
//
TreeNode selectedNode = tree.SelectedNodes[0];
if (selectedNode != _model) return;
//
EditCalculixKeywords?.Invoke();
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiMergeParts_Click(object sender, EventArgs e)
{
try
{
List<string> names = new List<string>();
CodersLabTreeView tree = GetActiveTree();
//
foreach (TreeNode node in tree.SelectedNodes)
{
if (node.Tag != null) names.Add(((NamedClass)node.Tag).Name);
}
if (names.Count > 0)
{
if (tree == cltvModel) MergeParts?.Invoke(names.ToArray());
else if (tree == cltvResults) MergeResultParts?.Invoke(names.ToArray());
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiConvertToPart_Click(object sender, EventArgs e)
{
try
{
List<string> names = new List<string>();
foreach (TreeNode node in cltvModel.SelectedNodes)
{
if (node.Tag != null) names.Add(((NamedClass)node.Tag).Name);
}
if (names.Count > 0) ConvertElementSetsToMeshParts?.Invoke(names.ToArray());
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
// Material
private void tsmiMaterialLibrary_Click(object sender, EventArgs e)
{
try
{
CodersLabTreeView tree = GetActiveTree();
if (tree.SelectedNodes.Count != 1) return;
//
TreeNode selectedNode = tree.SelectedNodes[0];
if (selectedNode.Tag != null) return;
//
MaterialLibrary?.Invoke();
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
// Master/Slave
private void tsmiSearchContactPairs_Click(object sender, EventArgs e)
{
try
{
CodersLabTreeView tree = GetActiveTree();
if (tree.SelectedNodes.Count != 1) return;
//
TreeNode selectedNode = tree.SelectedNodes[0];
if (selectedNode.Tag != null) return;
//
SearchContactPairs?.Invoke();
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiSwapMasterSlave_Click(object sender, EventArgs e)
{
try
{
List<NamedClass> items = new List<NamedClass>();
//
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
items.Add((NamedClass)selectedNode.Tag);
}
//
if (items.Count > 0) SwapMasterSlave?.Invoke(items.ToArray());
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiMergeByMasterSlave_Click(object sender, EventArgs e)
{
try
{
List<NamedClass> items = new List<NamedClass>();
//
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
items.Add((NamedClass)selectedNode.Tag);
}
//
if (items.Count > 0) MergeByMasterSlave?.Invoke(items.ToArray());
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
// Analysis
private void tsmiRun_Click(object sender, EventArgs e)
{
try
{
CodersLabTreeView tree = GetActiveTree();
if (tree.SelectedNodes.Count != 1) return;
//
TreeNode selectedNode = tree.SelectedNodes[0];
//
if (selectedNode.Tag == null) return;
//
RunEvent?.Invoke(selectedNode.Name);
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiCheckModel_Click(object sender, EventArgs e)
{
try
{
CodersLabTreeView tree = GetActiveTree();
if (tree.SelectedNodes.Count != 1) return;
//
TreeNode selectedNode = tree.SelectedNodes[0];
//
if (selectedNode.Tag == null) return;
//
CheckModelEvent?.Invoke(selectedNode.Name);
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiMonitor_Click(object sender, EventArgs e)
{
try
{
CodersLabTreeView tree = GetActiveTree();
if (tree.SelectedNodes.Count != 1) return;
TreeNode selectedNode = tree.SelectedNodes[0];
if (selectedNode.Tag == null) return;
MonitorEvent?.Invoke(selectedNode.Name);
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiResults_Click(object sender, EventArgs e)
{
try
{
CodersLabTreeView tree = GetActiveTree();
if (tree.SelectedNodes.Count != 1) return;
TreeNode selectedNode = tree.SelectedNodes[0];
if (selectedNode.Tag == null) return;
ResultsEvent?.Invoke(selectedNode.Name);
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsmiKill_Click(object sender, EventArgs e)
{
try
{
CodersLabTreeView tree = GetActiveTree();
if (tree.SelectedNodes.Count != 1) return;
TreeNode selectedNode = tree.SelectedNodes[0];
if (selectedNode.Tag == null) return;
KillEvent?.Invoke(selectedNode.Name);
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
// Activate/Deactivate
private void ActivateDeactivate_Click(object sender, EventArgs e)
{
try
{
List<NamedClass> items = new List<NamedClass>();
string stepName;
List<string> stepNames = new List<string>();
CodersLabTreeView tree = GetActiveTree();
//
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
//
if (CanDeactivate(selectedNode))
{
items.Add((NamedClass)selectedNode.Tag);
stepName = null;
if (selectedNode.Parent != null && selectedNode.Parent.Parent != null
&& selectedNode.Parent.Parent.Tag is Step)
stepName = selectedNode.Parent.Parent.Name;
stepNames.Add(stepName);
}
}
//
RenderingOff?.Invoke();
bool activate = (sender == tsmiActivate);
ActivateDeactivateEvent?.Invoke(items.ToArray(), activate, stepNames.ToArray());
RenderingOn?.Invoke();
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
// Expand/Collapse
private void tsmiExpandAll_Click(object sender, EventArgs e)
{
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
selectedNode.ExpandAll();
}
}
private void tsmiCollapseAll_Click(object sender, EventArgs e)
{
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
selectedNode.Collapse();
}
}
// Delete
private void tsmiDelete_Click(object sender, EventArgs e)
{
try
{
List<NamedClass> items = new List<NamedClass>();
string parentName;
List<string> parentNames = new List<string>();
//
foreach (TreeNode selectedNode in GetActiveTree().SelectedNodes)
{
if (selectedNode.Tag == null) continue;
//
items.Add((NamedClass)selectedNode.Tag);
parentName = null;
if (selectedNode.Parent != null && selectedNode.Parent.Parent != null)
{
if (selectedNode.Parent.Parent.Tag is Step) parentName = selectedNode.Parent.Parent.Name;
else if (selectedNode.Parent.Tag is Field) parentName = selectedNode.Parent.Text;
else if (selectedNode.Parent.Tag is ResultFieldOutput) parentName = selectedNode.Parent.Text;
else if (selectedNode.Parent.Tag is HistoryResultSet) parentName = selectedNode.Parent.Text;
else if (selectedNode.Parent.Tag is ResultHistoryOutput) parentName = selectedNode.Parent.Text;
}
parentNames.Add(parentName);
}
//
if (items.Count > 0)
{
RenderingOff?.Invoke();
DeleteEvent?.Invoke(items.ToArray(), parentNames.ToArray());
RenderingOn?.Invoke();
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
#endregion
// Methods
protected override void WndProc(ref Message m)
{
//
// 0200 512 WM_MOUSEFIRST
// 0200 512 WM_MOUSEMOVE
// 0201 513 WM_LBUTTONDOWN
// 0202 514 WM_LBUTTONUP
// 0203 515 WM_LBUTTONDBLCLK
// 0204 516 WM_RBUTTONDOWN
// 0205 517 WM_RBUTTONUP
// 0206 518 WM_RBUTTONDBLCLK
// 0207 519 WM_MBUTTONDOWN
// 0208 520 WM_MBUTTONUP
// 0209 521 WM_MBUTTONDBLCLK
// 0209 521 WM_MOUSELAST
// 020a 522 WM_MOUSEWHEEL
//
// Eat left and right mouse clicks
if (_disableMouse && (m.Msg >= 513 && m.Msg <= 522))
{
// eat message
}
else
{
// Eat button highlighting if the form is not in focus
if (m.Msg == WM_MOUSEMOVE)
{
if (!this.TopLevelControl.ContainsFocus)
{
// eat message
}
else
{
// handle messages normally
base.WndProc(ref m);
}
}
else
{
// handle messages normally
base.WndProc(ref m);
}
}
}
// Clear
public void Clear()
{
// 1. 清空所有子节点
// Geometry
cltvGeometry.SelectedNodes.Clear();
cltvGeometry.Nodes.Clear();
_geomParts.Nodes.Clear();
_meshSetupItems.Nodes.Clear();
// Model
cltvModel.SelectedNodes.Clear();
cltvModel.Nodes.Clear();
_model.Nodes.Clear();
_modelMesh.Nodes.Clear();
_modelParts.Nodes.Clear();
_modelNodeSets.Nodes.Clear();
_modelElementSets.Nodes.Clear();
_modelSurfaces.Nodes.Clear();
_modelFeatures.Nodes.Clear();
_modelReferencePoints.Nodes.Clear();
_modelCoordinateSystems.Nodes.Clear();
_materials.Nodes.Clear();
_sections.Nodes.Clear();
_constraints.Nodes.Clear();
_contacts.Nodes.Clear();
_surfaceInteractions.Nodes.Clear();
_contactPairs.Nodes.Clear();
_distributions.Nodes.Clear();
_amplitudes.Nodes.Clear();
_initialConditions.Nodes.Clear();
_steps.Nodes.Clear();
_analyses.Nodes.Clear();
//
SetNumberOfUserKeywords(0);
// 2. 对数据项进行本地化
// Geometry
_geomParts.Text = _geomPartsDisplayName;
_meshSetupItems.Text = _meshSetupItemsDisplayName;
// Model
_modelMesh.Text = _modelMeshDisplayName;
_modelParts.Text = _modelPartsDisplayName;
_modelNodeSets.Text = _modelNodeSetsDisplayName;
_modelElementSets.Text = _modelElementSetsDisplayName;
_modelSurfaces.Text = _modelSurfacesDisplayName;
_modelFeatures.Text = _modelFeaturesDisplayName;
_modelReferencePoints.Text = _modelReferencePointsDisplayName;
_modelCoordinateSystems.Text = _modelCoordinateSystemsDisplayName;
_materials.Text = _materialsDisplayName;
_sections.Text = _sectionsDisplayName;
_constraints.Text = _constraintsDisplayName;
_surfaceInteractions.Text = _surfaceInteractionsDisplayName;
_contactPairs.Text = _contactPairsDisplayName;
_distributions.Text = _distributionsDisplayName;
_amplitudes.Text = _amplitudesDisplayName;
_initialConditions.Text = _initialConditionsDisplayName;
_steps.Text = _stepsDisplayName;
_analyses.Text = _analysesDisplayName;
//
// 3. Fill trees 定制化Model Tree
//
// Geometry
cltvGeometry.Nodes.Add(_geomParts);
cltvGeometry.Nodes.Add(_meshSetupItems);
// Model
cltvModel.Nodes.Add(_model); // 模型节点
_model.Nodes.Add(_modelMesh); // 网格节点
_modelMesh.Nodes.Add(_modelParts);
_modelMesh.Nodes.Add(_modelNodeSets);
_modelMesh.Nodes.Add(_modelElementSets);
_modelMesh.Nodes.Add(_modelSurfaces);
// _model.Nodes.Add(_modelRBFMorph); // by Luke 2025-9-9
_model.Nodes.Add(_modelFeatures); // 参考特征节点
_modelFeatures.Nodes.Add(_modelReferencePoints);
_modelFeatures.Nodes.Add(_modelCoordinateSystems);
_model.Nodes.Add(_materials);
_model.Nodes.Add(_sections);
//_model.Nodes.Add(_constraints);
//_model.Nodes.Add(_contacts);
_contacts.Nodes.Add(_surfaceInteractions);
_contacts.Nodes.Add(_contactPairs);
//_model.Nodes.Add(_distributions);
//_model.Nodes.Add(_amplitudes);
//_model.Nodes.Add(_initialConditions);
_model.Nodes.Add(_steps);
cltvModel.Nodes.Add(_analyses); // 分析节点
// 4. Expand/Collapse
_geomParts.ExpandAll();
_model.ExpandAll();
_contacts.Collapse();
// 5. 清理分析结果节点
ClearResults(); //calls cltvResults.SelectedNodes.Clear();
}
public void ClearActiveTreeSelection()
{
GetActiveTree().SelectedNodes.Clear();
}
public void ClearTreeSelection(ViewType view)
{
CodersLabTreeView tree;
if (view == ViewType.Geometry)
{
tree = cltvGeometry;
}
else if (view == ViewType.Model)
{
tree = cltvModel;
}
else if (view == ViewType.Results)
{
tree = cltvResults;
}
else
{
throw new NotSupportedException();
}
tree.SelectedNodes.Clear();
}
public void ClearResults()
{
// 1. 清理子节点
cltvResults.SelectedNodes.Clear();
cltvResults.Nodes.Clear();
_resultModel.Nodes.Clear();
_resultMesh.Nodes.Clear();
_resultParts.Nodes.Clear();
_resultNodeSets.Nodes.Clear();
_resultElementSets.Nodes.Clear();
_resultSurfaces.Nodes.Clear();
_resultFeatures.Nodes.Clear();
_resultReferencePoints.Nodes.Clear();
_resultCoordinateSystems.Nodes.Clear();
_results.Nodes.Clear();
_resultFieldOutputs.Nodes.Clear();
_resultHistoryOutputs.Nodes.Clear();
// 2. 对节点进行中文化
_resultModel.Text = _resultModelDisplayName;
_resultMesh.Text = _resultMeshDisplayName;
_results.Text = _resultsDisplayName;
_resultParts.Text = _resultPartsDisplayName;
_resultNodeSets.Text = _resultNodeSetsDisplayName;
_resultElementSets.Text = _resultElementSetsDisplayName;
_resultSurfaces.Text = _resultSurfacesDisplayName;
_resultFeatures.Text = _resultFeaturesDisplayName;
_resultReferencePoints.Text = _resultReferencePointsDisplayName;
_resultCoordinateSystems.Text = _resultCoordinateSystemsDisplayName;
_resultFieldOutputs.Text = _resultFieldOutputsDisplayName;
_resultHistoryOutputs.Text = _resultHistoryOutputsDisplayName;
// 3. 优化节点显示: Fill the tree
cltvResults.Nodes.Add(_resultModel);
_resultModel.Nodes.Add(_resultMesh); // 添加网格
_resultMesh.Nodes.Add(_resultParts);
_resultMesh.Nodes.Add(_resultNodeSets);
_resultMesh.Nodes.Add(_resultElementSets);
_resultMesh.Nodes.Add(_resultSurfaces);
_resultModel.Nodes.Add(_resultFeatures); // 添加参照特征
_resultFeatures.Nodes.Add(_resultReferencePoints);
_resultFeatures.Nodes.Add(_resultCoordinateSystems);
cltvResults.Nodes.Add(_results);
_results.Nodes.Add(_resultFieldOutputs);
_results.Nodes.Add(_resultHistoryOutputs);
// Expand/Collapse
_resultModel.ExpandAll();
_resultMesh.ExpandAll();
_results.ExpandAll();
}
public void UpdateHighlight()
{
cltv_SelectionsChanged(null, null);
}
public int SelectBasePart(MouseEventArgs e, Keys modifierKeys, BasePart part, bool highlight)
{
if (part == null) return -1;
//
try
{
_disableSelectionsChanged = true;
//
CodersLabTreeView tree = GetActiveTree();
TreeNode baseNode = tree.Nodes[0];
TreeNode[] tmp = baseNode.Nodes.Find(part.Name, true, true);
//
if (tmp.Length > 1)
{
foreach (var treeNode in tmp)
{
if (treeNode.Tag.GetType() == part.GetType())
{
baseNode = treeNode;
break;
}
}
}
else
{
if (tmp.Length > 0) baseNode = tmp[0];
else return -1;
}
//
if (baseNode.Parent != null) baseNode.Parent.Expand(); // expand if called as function
//
if (e.Button == MouseButtons.Left)
{
if (modifierKeys == Keys.Shift && modifierKeys == Keys.Control) { }
else if (modifierKeys == Keys.Shift) tree.SelectedNodes.Add(baseNode);
else if (modifierKeys == Keys.Control)
{
if (tree.SelectedNodes.Contains(baseNode))
tree.SelectedNodes.Remove(baseNode);
else
tree.SelectedNodes.Add(baseNode);
}
else
{
// This is without modifier keys - a new selection
tree.SelectedNodes.Clear();
tree.SelectedNodes.Add(baseNode);
}
}
else if (e.Button == MouseButtons.Right)
{
if (!tree.SelectedNodes.Contains(baseNode))
{
tree.SelectedNodes.Clear();
tree.SelectedNodes.Add(baseNode);
}
}
//
_disableSelectionsChanged = false;
if (highlight) UpdateHighlight();
//
return tree.SelectedNodes.Count;
}
catch { return -1; }
finally { _disableSelectionsChanged = false; }
}
public void EditSelectedPart()
{
tsmiEdit_Click(null, null);
}
// Regenerate tree
public void RegenerateTree(FeModel model, IDictionary<string, AnalysisJob> jobs, FeResults results,
bool remeshing = false)
{
if (!_screenUpdating) return;
//
try
{
// Expand/Collapse
string[][] prevNodeNames;
bool[][] prevModelTreeStates = GetAllTreesExpandCollapseState(out prevNodeNames, remeshing);
//
cltvGeometry.BeginUpdate();
cltvModel.BeginUpdate();
cltvResults.BeginUpdate();
Dictionary<CodersLabTreeView, string[]> selectedNodePaths = GetSelectedNodePaths();
Clear();
if (model != null)
{
// User keywords
if (model.CalculixUserKeywords != null) SetNumberOfUserKeywords(model.CalculixUserKeywords.Count);
// Geom Parts
if (model.Geometry != null)
{
AddGeometryParts(model.Geometry.Parts);
_geomParts.Expand();
// Mesh setup items
AddObjectsToNode(_meshSetupItemsName, _meshSetupItems, model.Geometry.MeshSetupItems);
_meshSetupItems.Expand();
}
//
if (model.Mesh != null)
{
// Mesh Parts
AddObjectsToNode(_modelPartsName, _modelParts, model.Mesh.Parts);
// Node sets
AddObjectsToNode(_modelNodeSetsName, _modelNodeSets, model.Mesh.NodeSets);
// Element sets
AddObjectsToNode(_modelElementSetsName, _modelElementSets, model.Mesh.ElementSets);
// Surfaces
AddObjectsToNode(_modelSurfacesName, _modelSurfaces, model.Mesh.Surfaces);
// Reference points
AddObjectsToNode(_modelReferencePointsName, _modelReferencePoints, model.Mesh.ReferencePoints);
// Coordinate systems
AddObjectsToNode(_modelCoordinateSystemsName, _modelCoordinateSystems, model.Mesh.CoordinateSystems);
}
// Materials
AddObjectsToNode(_materialsName, _materials, model.Materials);
// Sections
AddObjectsToNode(_sectionsName, _sections, model.Sections);
// Constraints
AddObjectsToNode(_constraintsName, _constraints, model.Constraints);
// Surface interactions
AddObjectsToNode(_surfaceInteractionsName, _surfaceInteractions, model.SurfaceInteractions);
// Contact pairs
AddObjectsToNode(_contactPairsName, _contactPairs, model.ContactPairs);
// Distributions
AddObjectsToNode(_distributionsName, _distributions, model.Distributions);
// Amplitudes
AddObjectsToNode(_amplitudesName, _amplitudes, model.Amplitudes);
// Initial conditions
AddObjectsToNode(_initialConditionsName, _initialConditions, model.InitialConditions);
// Steps
AddSteps(model.StepCollection.StepsList);
// Analyses
AddObjectsToNode(_analysesName, _analyses, jobs);
_analyses.ExpandAll();
// Results
if (results != null)
{
if (results.Mesh != null)
{
// Results parts
AddObjectsToNode(_resultPartsName, _resultParts, results.Mesh.Parts);
// Node sets
AddObjectsToNode(_resultNodeSetsName, _resultNodeSets, results.Mesh.NodeSets);
// Element sets
AddObjectsToNode(_resultElementSetsName, _resultElementSets, results.Mesh.ElementSets);
// Surfaces
AddObjectsToNode(_resultSurfacesName, _resultSurfaces, results.Mesh.Surfaces);
// Reference points
AddObjectsToNode(_resultReferencePointsName, _resultReferencePoints, results.Mesh.ReferencePoints);
// Coordinate systems
AddObjectsToNode(_resultCoordinateSystemsName, _resultCoordinateSystems, results.Mesh.CoordinateSystems);
// Field outputs
string[] fieldNames;
string[][] allComponents;
fieldNames = results.GetVisibleFieldNames();
allComponents = new string[fieldNames.Length][];
for (int i = 0; i < fieldNames.Length; i++)
{
allComponents[i] = results.GetFieldComponentNames(fieldNames[i]);
}
CreateOverwriteFieldOutputNodes(fieldNames, allComponents, results.GetResultFieldOutputs());
}
// History outputs
if (results.GetHistory() != null)
CreateOverwriteHistoryOutputNodes(results.GetHistory().Sets.Values.ToArray(),
results.GetResultHistoryOutputs());
}
}
//
SelectNodesByPath(selectedNodePaths);
// Expand/Collapse
bool[][] afterModelTreeStates = GetAllTreesExpandCollapseState(out string[][] afterNodeNames, remeshing);
// Geometry
if (prevModelTreeStates[0].Length == afterModelTreeStates[0].Length)
SetTreeExpandCollapseState(cltvGeometry, prevModelTreeStates[0]);
// Model
if (prevModelTreeStates[1].Length == afterModelTreeStates[1].Length)
SetTreeExpandCollapseState(cltvModel, prevModelTreeStates[1], remeshing);
}
catch { }
finally
{
cltvGeometry.EndUpdate();
cltvModel.EndUpdate();
cltvResults.EndUpdate();
}
}
private Dictionary<CodersLabTreeView, string[]> GetSelectedNodePaths()
{
string splitter = "\\";
string path;
TreeNode node;
Dictionary<CodersLabTreeView, string[]> selectedNodePaths = new Dictionary<CodersLabTreeView, string[]>();
List<string> nodePaths = new List<string>();
CodersLabTreeView[] trees = new CodersLabTreeView[] { cltvGeometry, cltvModel, cltvResults };
//
for (int i = 0; i < trees.Length; i++)
{
if (trees[i].SelectedNodes.Count > 0)
{
nodePaths.Clear();
foreach (TreeNode selectedNode in trees[i].SelectedNodes)
{
path = "";
node = selectedNode;
while (node != null)
{
path = node.Name + splitter + path;
node = node.Parent;
}
nodePaths.Add(path);
}
selectedNodePaths.Add(trees[i], nodePaths.ToArray());
}
}
return selectedNodePaths;
}
private void SelectNodesByPath(Dictionary<CodersLabTreeView, string[]> selectedNodeNames)
{
string[] splitter = new string[] { "\\" };
string[] tmp;
TreeNode node;
foreach (var entry in selectedNodeNames)
{
node = null;
for (int i = 0; i < entry.Value.Length; i++)
{
tmp = entry.Value[i].Split(splitter, StringSplitOptions.RemoveEmptyEntries);
node = entry.Key.Nodes[tmp[0]];
for (int j = 1; j < tmp.Length; j++)
{
if (node != null) node = node.Nodes[tmp[j]];
}
if (node != null) entry.Key.SelectedNodes.Add(node);
}
}
}
// 增加树节点 2025-8-26
public void AddTreeNode(ViewType view, NamedClass item, string parentName)
{
if (!_screenUpdating) return;
if (item.Internal) return;
CodersLabTreeView tree = GetTree(view);
try
{
tree.SuspendLayout();
tree.BeginUpdate();
//
TreeNode node;
TreeNode parent;
TreeNode[] tmp;
//
if (item is MeshSetupItem)
{
parent = _meshSetupItems;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is MeshPart)
{
parent = _modelParts;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is FeNodeSet)
{
parent = _modelNodeSets;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is FeElementSet)
{
parent = _modelElementSets;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is FeSurface)
{
parent = _modelSurfaces;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is FeReferencePoint)
{
if (view == ViewType.Model) parent = _modelReferencePoints;
else if (view == ViewType.Results) parent = _resultReferencePoints;
else throw new NotSupportedException();
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is CoordinateSystem)
{
if (view == ViewType.Model) parent = _modelCoordinateSystems;
else if (view == ViewType.Results) parent = _resultCoordinateSystems;
else throw new NotSupportedException();
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is Material)
{
parent = _materials;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is Section)
{
parent = _sections;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is Constraint)
{
parent = _constraints;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is SurfaceInteraction)
{
parent = _surfaceInteractions;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is ContactPair)
{
parent = _contactPairs;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is InitialCondition)
{
parent = _initialConditions;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is Distribution)
{
parent = _distributions;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is Amplitude)
{
parent = _amplitudes;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is Step)
{
parent = _steps;
node = AddStep((Step)item);
}
else if (item is HistoryOutput && parentName != null)
{
tmp = _steps.Nodes.Find(parentName, true, true);
if (tmp.Length > 1) throw new Exception("Adding operation failed. More than one step named: " + parentName);
//
tmp = tmp[0].Nodes.Find(_modelHistoryOutputsName, true, true);
if (tmp.Length > 1) throw new Exception("Adding operation failed. There is no history output node to add to.");
//
parent = tmp[0];
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is FieldOutput && parentName != null)
{
tmp = _steps.Nodes.Find(parentName, true, true);
if (tmp.Length > 1) throw new Exception("Adding operation failed. More than one step named: " + parentName);
//
tmp = tmp[0].Nodes.Find(_modelFieldOutputsName, true, true);
if (tmp.Length > 1) throw new Exception("Adding operation failed. There is no field output node to add to.");
//
parent = tmp[0];
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is BoundaryCondition && parentName != null)
{
tmp = _steps.Nodes.Find(parentName, true, true);
if (tmp.Length > 1) throw new Exception("Adding operation failed. More than one step named: " + parentName);
//
tmp = tmp[0].Nodes.Find(_boundaryConditionsName, true, true);
if (tmp.Length > 1) throw new Exception("Adding operation failed. There is no bounday condition node to add to.");
//
parent = tmp[0];
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is Load && parentName != null)
{
tmp = _steps.Nodes.Find(parentName, true, true);
if (tmp.Length > 1) throw new Exception("Adding operation failed. More than one step named: " + parentName);
//
tmp = tmp[0].Nodes.Find(_loadsName, true, true);
if (tmp.Length > 1) throw new Exception("Adding operation failed. There is no load node to add to.");
//
parent = tmp[0];
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is DefinedField && parentName != null)
{
tmp = _steps.Nodes.Find(parentName, true, true);
if (tmp.Length > 1) throw new Exception("Adding operation failed. More than one step named: " + parentName);
//
tmp = tmp[0].Nodes.Find(_definedFieldsName, true, true);
if (tmp.Length > 1) throw new Exception("Adding operation failed. There is no defined field node to add to.");
//
parent = tmp[0];
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is AnalysisJob)
{
parent = _analyses;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is ResultPart)
{
parent = _resultParts;
node = parent.Nodes.Add(item.Name);
node.Name = node.Text;
node.Tag = item;
}
else if (item is ResultFieldOutput rfo)
{
CreateOverwriteFieldOutputNodes(new string[] { rfo.Name }, new string[][] { rfo.GetComponentNames() },
new ResultFieldOutput[] { rfo });
//
parent = _resultFieldOutputs;
node = parent.Nodes[rfo.Name];
}
else if (item is ResultHistoryOutput hro)
{
CreateOverwriteHistoryOutputNodes(new HistoryResultSet[] { hro.HistoryResultSet },
new ResultHistoryOutput[] { hro });
parent = _resultHistoryOutputs;
node = parent.Nodes[hro.Name];
}
else
{
throw new NotImplementedException();
}
// 得到节点的本地化名称
parent.Text = LocalDisplayName(parent.Name);
if (parent.Nodes.Count > 0)
{
parent.Text += " (" + parent.Nodes.Count + ")";
}
//
SetNodeStatus(node);
//
GetTree(view).SelectedNode = node;
// Expand for propagate
while (node != null && node.Parent != null)
{
node = node.Parent;
if (!node.IsExpanded) node.Expand();
}
}
catch { }
finally
{
tree.EndUpdate();
tree.ResumeLayout();
}
}
public void UpdateTreeNode(ViewType view, string oldItemName, NamedClass item, string parentName, bool updateSelection)
{
if (!_screenUpdating) return; // must be here; when _screenUpdating = false the function add tree node is not working
//
CodersLabTreeView tree = GetTree(view);
try
{
tree.SuspendLayout();
tree.BeginUpdate();
//
TreeNode baseNode = FindTreeNode(view, oldItemName, item, parentName);
if (baseNode == null) return;
//
if (item is ResultFieldOutput rfo)
{
int[] indices = new int[] { baseNode.Index };
CreateOverwriteFieldOutputNodes(new string[] { rfo.Name }, new string[][] { rfo.GetComponentNames() },
new ResultFieldOutput[] { rfo }, indices);
}
else if (item is ResultHistoryOutput rho)
{
int[] indices = new int[] { baseNode.Index };
CreateOverwriteHistoryOutputNodes(new HistoryResultSet[] { rho.HistoryResultSet },
new ResultHistoryOutput[] { rho }, indices);
}
else
{
baseNode.Text = item.Name;
baseNode.Name = item.Name;
baseNode.Tag = item;
}
SetNodeStatus(baseNode);
// Update selection
if (updateSelection)
{
if (tree != null && tree.SelectedNodes.Contains(baseNode)) UpdateHighlight(); // update only once
else tree.SelectedNode = baseNode; // for job the tree is null
// Expand for propagate
while (baseNode.Parent != null)
{
baseNode = baseNode.Parent;
if (!baseNode.IsExpanded) baseNode.Expand();
}
}
}
catch { }
finally
{
tree.EndUpdate();
tree.ResumeLayout();
}
}
public void SwapTreeNodes(ViewType view, string firstItemName, NamedClass firstItem,
string secondItemName, NamedClass secondItem, string parentName)
{
CodersLabTreeView tree = GetTree(view);
try
{
tree.SuspendLayout();
tree.BeginUpdate();
//
TreeNode firstNode = FindTreeNode(view, firstItemName, firstItem, parentName);
if (firstNode == null) return;
//
TreeNode secondNode = FindTreeNode(view, secondItemName, secondItem, parentName);
if (secondNode == null) return;
//
if (firstNode.Parent != secondNode.Parent) return;
//
TreeNode parent = firstNode.Parent;
//
int firstIndex = firstNode.Index;
int secondIndex = secondNode.Index;
//
firstNode.Remove();
secondNode.Remove();
//
if (firstIndex < secondIndex)
{
parent.Nodes.Insert(firstIndex, secondNode);
parent.Nodes.Insert(secondIndex, firstNode);
}
else
{
parent.Nodes.Insert(secondIndex, firstNode);
parent.Nodes.Insert(firstIndex, secondNode);
}
}
catch { }
finally
{
tree.EndUpdate();
tree.ResumeLayout();
}
}
private TreeNode FindTreeNode(ViewType view, string itemName, NamedClass item, string parentName)
{
CodersLabTreeView tree = GetTree(view);
//
TreeNode baseNode;
if (item is MeshSetupItem) baseNode = _meshSetupItems;
else if (item is AnalysisJob) baseNode = _analyses;
else if (item is ResultFieldOutput) baseNode = _resultFieldOutputs;
else if (item is ResultHistoryOutput) baseNode = _resultHistoryOutputs;
else baseNode = tree.Nodes[0];
//
TreeNode[] tmpNodes;
if (parentName != null)
{
tmpNodes = _steps.Nodes.Find(parentName, true);
int count = 0;
foreach (TreeNode tmpNode in tmpNodes)
{
if (tmpNode.Nodes.Count > 0)
{
baseNode = tmpNode;
count++;
}
}
if (count > 1) throw new Exception("Node search failed. More than one step named: " + parentName);
baseNode = tmpNodes[0];
}
//
bool nodeFound;
tmpNodes = baseNode.Nodes.Find(itemName, true);
if (tmpNodes.Length > 1)
{
nodeFound = false;
foreach (var treeNode in tmpNodes)
{
if (treeNode.Tag != null && treeNode.Tag.GetType() == item.GetType())
{
baseNode = treeNode;
nodeFound = true;
break;
}
}
if (!nodeFound) throw new Exception("Tree search failed. The item name to edit was not found: " + item.Name);
}
else
{
if (tmpNodes.Length == 1) baseNode = tmpNodes[0];
else baseNode = null;
}
//
return baseNode;
}
// 删除树节点
public void RemoveTreeNode<T>(ViewType view, string nodeName, string parentName) where T : NamedClass
{
if (!_screenUpdating) return;
//
CodersLabTreeView tree = GetTree(view);
//
try
{
tree.SuspendLayout();
tree.BeginUpdate();
//
// No parent
TreeNode baseNode = null;
if (typeof(T) == typeof(MeshSetupItem)) baseNode = _meshSetupItems;
else if (typeof(T) == typeof(AnalysisJob)) baseNode = _analyses;
//
else if (typeof(T) == typeof(Field)) baseNode = _resultFieldOutputs;
else if (typeof(T) == typeof(ResultFieldOutput)) baseNode = _resultFieldOutputs;
else if (typeof(T) == typeof(HistoryResultSet)) baseNode = _resultHistoryOutputs;
else if (typeof(T) == typeof(ResultHistoryOutput)) baseNode = _resultHistoryOutputs;
else baseNode = tree.Nodes[0];
// Find parent
TreeNode[] tmp;
int count;
if (parentName != null)
{
if (view == ViewType.Model) tmp = _steps.Nodes.Find(parentName, true, true);
else if (view == ViewType.Results)
{
if (typeof(T) == typeof(FieldData)) tmp = _resultFieldOutputs.Nodes.Find(parentName, true, true);
else if (typeof(T) == typeof(HistoryResultField))
tmp = _resultHistoryOutputs.Nodes.Find(parentName, true, true);
else if (typeof(T) == typeof(HistoryResultData))
{
string[] split = parentName.Split(new string[] { "@@@" }, StringSplitOptions.None);
if (split.Length == 2)
{
tmp = _resultHistoryOutputs.Nodes.Find(split[0], true, true);
if (tmp.Length == 1) tmp = tmp[0].Nodes.Find(split[1], true, true);
else throw new NotSupportedException();
}
else throw new NotSupportedException();
}
else throw new NotSupportedException();
}
else throw new NotSupportedException();
//
if (tmp.Length > 1)
{
count = 0;
for (int i = 0; i < tmp.Length; i++)
{
if (tmp[i].Nodes.Find(nodeName, true).Length > 0)
{
tmp[0] = tmp[i];
count++;
}
}
if (count > 1) throw new Exception("Tree update failed. More than one parent named: " + parentName);
}
baseNode = tmp[0];
}
//
tmp = baseNode.Nodes.Find(nodeName, true, true);
count = 0;
//
for (int i = 0; i < tmp.Length; i++)
{
if (tmp[i].Tag is T)
{
tmp[0] = tmp[i];
count++;
}
}
//
if (count > 1) throw new Exception("Tree update failed. More than one tree node named: " + nodeName);
if (count < 1) throw new Exception("Tree update failed. There is no tree node named: " + nodeName);
//
TreeNode parent = tmp[0].Parent;
//
tmp[0].Remove();
//
_disableSelectionsChanged = true;
tree.SelectedNodes.Remove(tmp[0]);
_disableSelectionsChanged = false;
// 得到本地化树节点
parent.Text = LocalDisplayName(parent.Name);
if (parent.Tag is Field || parent.Tag is ResultFieldOutput ||
parent.Tag is HistoryResultSet || parent.Tag is HistoryResultField || parent.Tag is ResultHistoryOutput)
{
SetNodeStatus(parent); // remove dotted T icon
}
else if (parent.Nodes.Count > 0)
{
parent.Text += " (" + parent.Nodes.Count + ")";
}
}
catch { }
finally
{
tree.EndUpdate();
tree.ResumeLayout();
}
}
// 添加当前对象到节点
private void AddObjectsToNode<TKey, TVal>(string initialNodeName, TreeNode node, IDictionary<TKey, TVal> dictionary,
bool countNodes = true)
{
TreeNode nodeToAdd;
// 将字典中对象加入到节点中
var list = dictionary.Keys.ToList();
foreach (var key in list)
{
if (dictionary[key] is NamedClass nc && nc.Internal)
continue;
nodeToAdd = node.Nodes.Add(key.ToString());
nodeToAdd.Name = nodeToAdd.Text;
nodeToAdd.Tag = dictionary[key];
SetNodeStatus(nodeToAdd);
}
// 更新上一级节点名称
string displayName = LocalDisplayName(initialNodeName);
if (countNodes && node.Nodes.Count > 0)
{
node.Text = displayName + " (" + node.Nodes.Count.ToString() + ")";
}
else
{
node.Text = displayName;
}
}
// 得到节点的本地化名称
private static string LocalDisplayName(string nodeName)
{
string displayName;
switch (nodeName)
{
case _meshSetupItemsName:
displayName = _meshSetupItemsDisplayName;
break;
case _modelMeshName:
displayName = _modelMeshDisplayName;
break;
case _modelPartsName:
displayName = _modelPartsDisplayName;
break;
case _modelElementSetsName:
displayName = _modelElementSetsDisplayName;
break;
case _modelNodeSetsName:
displayName = _modelNodeSetsDisplayName;
break;
case _modelSurfacesName:
displayName = _modelSurfacesDisplayName;
break;
case _modelReferencePointsName:
displayName = _modelReferencePointsDisplayName;
break;
case _modelCoordinateSystemsName:
displayName = _modelCoordinateSystemsDisplayName;
break;
case _materialsName:
displayName = _materialsDisplayName;
break;
case _sectionsName:
displayName = _sectionsDisplayName;
break;
case _stepsName:
displayName = _stepsDisplayName;
break;
case _analysesName:
displayName = _analysesDisplayName;
break;
case _boundaryConditionsName:
displayName = _boundaryConditionsDisplayName;
break;
case _loadsName:
displayName = _loadsDisplayName;
break;
default:
displayName = nodeName;
break;
}
return displayName;
}
// 增加几何节点
private void AddGeometryParts(IDictionary<string, BasePart> parts)
{
HashSet<string> dependentPartNames = new HashSet<string>();
foreach (var entry in parts)
{
if (entry.Value is CompoundGeometryPart cgp)
{
dependentPartNames.UnionWith(cgp.SubPartNames);
}
}
//
BasePart part;
BasePart subPart;
TreeNode nodeToAdd;
TreeNode subNodeToAdd;
foreach (var entry in parts)
{
part = entry.Value;
if (!dependentPartNames.Contains(part.Name))
{
// Independent parts
nodeToAdd = _geomParts.Nodes.Add(part.Name);
nodeToAdd.Name = nodeToAdd.Text;
nodeToAdd.Tag = part;
SetNodeStatus(nodeToAdd);
//Compound parts
if (part is CompoundGeometryPart cgp)
{
for (int i = 0; i < cgp.SubPartNames.Length; i++)
{
subPart = parts[cgp.SubPartNames[i]];
subNodeToAdd = nodeToAdd.Nodes.Add(subPart.Name);
subNodeToAdd.Name = subNodeToAdd.Text;
subNodeToAdd.Tag = subPart;
SetNodeStatus(subNodeToAdd);
}
//
nodeToAdd.Expand();
}
}
}
// 更新几何节点显示
if (_geomParts.Nodes.Count > 0)
{
_geomParts.Text = _geomPartsDisplayName + " (" + _geomParts.Nodes.Count.ToString() + ")";
}
else
{
_geomParts.Text = _geomPartsDisplayName;
}
}
private void AddSteps(List<Step> steps)
{
foreach (var step in steps)
{
AddStep(step);
}
if (_steps.Nodes.Count > 0)
{
_steps.Text = _stepsDisplayName + @" (" + _steps.Nodes.Count + @")";
}
else
{
_steps.Text = _stepsDisplayName;
}
_steps.Expand();
}
private TreeNode AddStep(Step step)
{
TreeNode stepNode = _steps.Nodes.Add(step.Name);
stepNode.Name = stepNode.Text;
stepNode.Tag = step;
SetNodeStatus(stepNode);
// 增加子节点
TreeNode tmp;
// 1. History outputs
/*
tmp = stepNode.Nodes.Add(_modelHistoryOutputsName);
tmp.Name = tmp.Text;
AddObjectsToNode<string, HistoryOutput>(_modelHistoryOutputsName, tmp, step.HistoryOutputs);
SetNodeImage(tmp, "History_output.ico");
// 2. Field outputs
tmp = stepNode.Nodes.Add(_modelFieldOutputsName);
tmp.Name = tmp.Text;
AddObjectsToNode<string, FieldOutput>(_modelFieldOutputsName, tmp, step.FieldOutputs);
SetNodeImage(tmp, "Field_output.ico");
*/
// 3. Boundary conditions
tmp = stepNode.Nodes.Add(_boundaryConditionsName);
tmp.Name = tmp.Text;
AddObjectsToNode<string, BoundaryCondition>(_boundaryConditionsName, tmp, step.BoundaryConditions);
SetNodeImage(tmp, "Bc.ico");
// 4. Loads
tmp = stepNode.Nodes.Add(_loadsName);
tmp.Name = tmp.Text;
AddObjectsToNode<string, Load>(_loadsName, tmp, step.Loads);
SetNodeImage(tmp, "Load.ico");
// 5. Defined fields
/*
tmp = stepNode.Nodes.Add(_definedFieldsName);
tmp.Name = tmp.Text;
AddObjectsToNode<string, DefinedField>(_definedFieldsName, tmp, step.DefinedFields);
SetNodeImage(tmp, "Defined_field.ico");
*/
// 展开节点
stepNode.Expand();
return stepNode;
}
private void FilterTree(CodersLabTreeView tree, string text)
{
try
{
if (RegenerateTreeCallBack != null)
{
if (_prevStates[tree] == null) _prevStates[tree] = GetTreeExpandCollapseState(tree, out string[] names);
//
//tree.Visible = false;
//
RegenerateTreeCallBack();
if (text.Length > 0)
{
string[] texts = text.ToUpper().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
FilterNodes(tree.Nodes, texts);
tree.ExpandAll();
}
else
{
SetTreeExpandCollapseState(tree, _prevStates[tree]);
_prevStates[tree] = null;
}
}
}
catch { }
finally
{
//tree.Visible = true;
}
}
private void FilterNodes(TreeNodeCollection nodes, string[] texts)
{
bool contains;
List<TreeNode> nodesToDelete = new List<TreeNode>();
//
foreach (TreeNode node in nodes)
{
FilterNodes(node.Nodes, texts);
//
if (node.Nodes.Count == 0)
{
contains = false;
foreach (var text in texts)
{
if (node.Text.Trim().ToUpper().Contains(text))
{
contains = true;
break;
}
}
if (!contains) nodesToDelete.Add(node);
}
}
//
foreach (var node in nodesToDelete) nodes.Remove(node);
}
// Node status
private void SetAllNodesStatusIcons(TreeNode node)
{
if (node.ImageKey == "Dots.ico" || node.ImageKey == "Dots_t.ico")
{
if (node.Nodes.Count == 0 || !node.IsExpanded) SetNodeImage(node, "Dots.ico");
else SetNodeImage(node, "Dots_t.ico");
}
foreach (TreeNode child in node.Nodes)
{
SetAllNodesStatusIcons(child);
}
}
private void SetNodeStatus(TreeNode node)
{
if (node != null && node.Tag != null)
{
CodersLabTreeView cltv = (CodersLabTreeView)node.TreeView;
if (cltv == null) return;
//
NamedClass item = (NamedClass)node.Tag;
bool warning;
//
if (item.Active)
{
if (node.Tag is AnalysisJob)
{
AnalysisJob job = node.Tag as AnalysisJob;
if (job.JobStatus == JobStatus.OK) SetNodeImage(node, "OK.ico");
else if (job.JobStatus == JobStatus.Running) SetNodeImage(node, "Running.ico");
else if (job.JobStatus == JobStatus.FailedWithResults) SetNodeImage(node, "Warning.ico");
else SetNodeImage(node, "NoResult.ico");
}
else
{
// Hide
if (CanHide(item) && !item.Visible)
{
cltv.SetNodeForeColor(node, Color.Gray);
SetNodeImage(node, "Hide.ico");
}
// Show
else
{
cltv.SetNodeForeColor(node, Color.Black);
//
if (node.Tag is BasePart bp)
{
PartType partType = bp.PartType;
//
if (partType == PartType.Solid || partType == PartType.SolidAsShell)
{
if (bp.Color.A == 255) SetNodeImage(node, "Solid.ico");
else SetNodeImage(node, "Solid_transparent.ico");
}
else if (partType == PartType.Shell)
{
if (bp.Color.A == 255) SetNodeImage(node, "Shell.ico");
else SetNodeImage(node, "Shell_transparent.ico");
}
else if (partType == PartType.Wire)
{
if (bp.Color.A == 255) SetNodeImage(node, "Wire.ico");
else SetNodeImage(node, "Wire_transparent.ico");
}
else if (partType == PartType.Compound)
{
if (bp.Color.A == 255) SetNodeImage(node, "Compound.ico");
else SetNodeImage(node, "Compound_transparent.ico");
}
}
else if (node.Tag is Step)
{
SetNodeImage(node, "Step.ico");
}
else
{
if (node.Nodes.Count == 0 || !node.IsExpanded) SetNodeImage(node, "Dots.ico");
else SetNodeImage(node, "Dots_t.ico");
}
//
if (item is GeometryPart gp)
{
if (gp.PartType == PartType.Solid || gp.PartType == PartType.SolidAsShell)
warning = gp.HasFreeEdges;
else if (gp.PartType == PartType.Shell)
warning = gp.HasErrors;
else
warning = false;
//
if (warning) SetNodeImage(node, "Warning.ico");
}
}
}
}
else
{
cltv.SetNodeForeColor(node, Color.Gray);
SetNodeImage(node, "Unactive.ico");
}
//
if (!item.Valid)
{
cltv.SetNodeForeColor(node, cltv.HighlightForeErrorColor);
node.Parent.Expand();
}
// Set status of component nodes
if (item is ResultFieldOutput)
{
foreach (TreeNode componentNode in node.Nodes)
{
if (componentNode.Tag != null && componentNode.Tag is NamedClass nc)
{
nc.Valid = item.Valid;
SetNodeStatus(componentNode);
}
}
}
// Set status of the step controls
if (item != null && item is Step) UpdateNumberOfStepControls(node);
}
}
private void SetNodeImage(TreeNode node, string imageName)
{
if (node.ImageKey != imageName)
{
node.ImageKey = imageName;
node.SelectedImageKey = imageName;
}
}
// Results
private void CreateOverwriteFieldOutputNodes(string[] fieldNames, string[][] components,
ResultFieldOutput[] resultFieldOutputs, int[] indices = null)
{
TreeNode node;
TreeNode child;
for (int i = 0; i < fieldNames.Length; i++)
{
if (indices == null) node = _resultFieldOutputs.Nodes.Add(fieldNames[i]);
else
{
node = _resultFieldOutputs.Nodes[indices[i]];
node.Nodes.Clear();
node.Text = fieldNames[i];
}
node.Name = node.Text;
node.Tag = new Field(fieldNames[i]);
SetNodeImage(node, "Dots.ico");
//
for (int j = 0; j < components[i].Length; j++)
{
child = node.Nodes.Add(components[i][j]);
child.Name = child.Text;
child.Tag = new FieldData(child.Name);
SetNodeImage(child, "Dots.ico");
}
//
if (i <= 1) node.Expand();
}
//
_resultFieldOutputs.Expand();
//
int n = _resultFieldOutputs.Nodes.Count;
if (n > 0) _resultFieldOutputs.Text = _resultFieldOutputsName + " (" + n + ")";
// Add result field outputs
foreach (var resultFieldOutput in resultFieldOutputs)
{
node = _resultFieldOutputs.Nodes[resultFieldOutput.Name];
if (node != null) node.Tag = resultFieldOutput; // overwrite Field with ResultFieldOutput
SetNodeStatus(node);
}
}
public void SelectFirstComponentOfFirstFieldOutput()
{
if (_resultFieldOutputs.Nodes.Count > 0)
{
foreach (TreeNode node in _resultFieldOutputs.Nodes)
{
if (node.Nodes.Count > 0)
{
node.Expand();
cltvResults.SelectedNodes.Clear(); // for the shift key to work
cltvResults.SelectedNode = node.Nodes[0];
return;
}
}
}
}
private void CreateOverwriteHistoryOutputNodes(HistoryResultSet[] historyResultSets,
ResultHistoryOutput[] resultHistoryOutputs,
int[] indices = null)
{
TreeNode node1;
TreeNode node2;
TreeNode node3;
for (int i = 0; i < historyResultSets.Length; i++)
{
if (historyResultSets[i] == null) continue;
//
if (indices == null) node1 = _resultHistoryOutputs.Nodes.Add(historyResultSets[i].Name);
else
{
node1 = _resultHistoryOutputs.Nodes[indices[i]];
node1.Nodes.Clear();
node1.Text = historyResultSets[i].Name;
}
node1.Name = node1.Text;
node1.Tag = historyResultSets[i];
SetNodeImage(node1, "Dots.ico");
//
foreach (var fieldEntry in historyResultSets[i].Fields)
{
node2 = node1.Nodes.Add(fieldEntry.Key);
node2.Name = node2.Text;
node2.Tag = fieldEntry.Value;
SetNodeImage(node2, "Dots.ico");
//
foreach (var componentEntry in fieldEntry.Value.Components)
{
node3 = node2.Nodes.Add(componentEntry.Key);
node3.Name = node3.Text;
node3.Tag = new HistoryResultData(historyResultSets[i].Name, fieldEntry.Key, componentEntry.Key); // to view
SetNodeImage(node3, "Dots.ico");
}
if (_resultHistoryOutputs.Nodes.Count <= 1 && node2.Nodes.Count > 0) node2.Expand();
}
if (_resultHistoryOutputs.Nodes.Count <= 1 && node1.Nodes.Count > 0) node1.Expand();
}
//
_resultHistoryOutputs.Expand();
//
int n = _resultHistoryOutputs.Nodes.Count;
if (n > 0) _resultHistoryOutputs.Text = _resultHistoryOutputsName + " (" + n + ")";
// Add result history outputs
TreeNode node;
foreach (var resultHistoryOutput in resultHistoryOutputs)
{
node = _resultHistoryOutputs.Nodes[resultHistoryOutput.Name];
if (node != null) node.Tag = resultHistoryOutput; // overwrite Field with ResultFieldOutput
SetNodeStatus(node);
}
}
// Expand/Collapse
private CodersLabTreeView GetActiveTree()
{
if (tcGeometryModelResults.TabPages.Count <= 0) return null;
//
if (tcGeometryModelResults.SelectedTab == tpGeometry) return cltvGeometry;
else if (tcGeometryModelResults.SelectedTab == tpModel) return cltvModel;
else if (tcGeometryModelResults.SelectedTab == tpResults) return cltvResults;
else throw new NotSupportedException();
}
private CodersLabTreeView GetTree(ViewType view)
{
if (view == ViewType.Geometry) return cltvGeometry;
else if (view == ViewType.Model) return cltvModel;
else if (view == ViewType.Results) return cltvResults;
else throw new NotSupportedException();
}
public bool[][] GetAllTreesExpandCollapseState(out string[][] allNames, bool skipModelParts = false)
{
bool[][] allStates = new bool[3][];
allNames = new string[3][];
allStates[0] = GetTreeExpandCollapseState(cltvGeometry, out allNames[0], skipModelParts);
allStates[1] = GetTreeExpandCollapseState(cltvModel, out allNames[1], skipModelParts);
allStates[2] = GetTreeExpandCollapseState(cltvResults, out allNames[2], skipModelParts);
return allStates;
}
public bool[] GetTreeExpandCollapseState(CodersLabTreeView tree, out string[] names, bool skipModelParts = false)
{
List<bool> states = new List<bool>();
List<string> namesList = new List<string>();
foreach (TreeNode node in tree.Nodes) GetNodeExpandCollapseState(node, ref states, ref namesList, skipModelParts);
names = namesList.ToArray();
return states.ToArray();
}
private void GetNodeExpandCollapseState(TreeNode node, ref List<bool> states,
ref List<string> names, bool skipModelParts)
{
if (node == _modelParts && skipModelParts) return;
//
states.Add(node.IsExpanded);
names.Add(node.Text);
//
foreach (TreeNode child in node.Nodes)
{
GetNodeExpandCollapseState(child, ref states, ref names, skipModelParts);
}
}
public void SetAllTreeExpandCollapseState(bool[][] states)
{
try
{
if (states == null || states.Length == 0) return;
//
SetTreeExpandCollapseState(cltvGeometry, states[0]);
SetTreeExpandCollapseState(cltvModel, states[1]);
SetTreeExpandCollapseState(cltvResults, states[2]);
}
catch (Exception)
{
}
}
public void SetTreeExpandCollapseState(CodersLabTreeView tree, bool[] states, bool skipModelParts = false)
{
try
{
if (states == null || states.Length == 0) return;
//
int count = 0;
foreach (TreeNode node in tree.Nodes) CountAllTreeNodes(node, ref count, skipModelParts);
//
if (states.Length == count)
{
count = 0;
//
tree.BeginUpdate();
foreach (TreeNode node in tree.Nodes) SetNodeExpandCollapseState(node, states, ref count, skipModelParts);
tree.EndUpdate();
}
}
catch (Exception)
{
}
}
private void SetNodeExpandCollapseState(TreeNode node, bool[] states, ref int count, bool skipModelParts)
{
if (node == _modelParts && skipModelParts) return;
//
if (states[count]) node.Expand();
else node.Collapse();
count++;
//
foreach (TreeNode child in node.Nodes) SetNodeExpandCollapseState(child, states, ref count, skipModelParts);
}
private void CountAllTreeNodes(TreeNode node, ref int count, bool skipModelParts)
{
if (node == _modelParts && skipModelParts) return;
//
count++;
//
foreach (TreeNode child in node.Nodes) CountAllTreeNodes(child, ref count, skipModelParts);
}
//
private bool CanCreate(TreeNode node)
{
if (node.Name == _meshSetupItemsName) return true;
else if (node.TreeView == cltvModel && node.Name == _modelNodeSetsName) return true;
else if (node.TreeView == cltvModel && node.Name == _modelElementSetsName) return true;
else if (node.TreeView == cltvModel && node.Name == _modelSurfacesName) return true;
else if (node.Name == _modelReferencePointsName) return true;
else if (node.Name == _modelCoordinateSystemsName) return true;
else if (node.Name == _materialsName) return true;
else if (node.Name == _sectionsName) return true;
else if (node.Name == _constraintsName) return true;
else if (node.Name == _surfaceInteractionsName) return true;
else if (node.Name == _contactPairsName) return true;
else if (node.Name == _distributionsName) return true;
else if (node.Name == _amplitudesName) return true;
else if (node.Name == _initialConditionsName) return true;
else if (node.Name == _stepsName) return true;
else if (node.Name == _modelHistoryOutputsName) return true;
else if (node.TreeView == cltvModel && node.Name == _modelFieldOutputsName) return true;
else if (node.Name == _boundaryConditionsName) return true;
else if (node.Name == _loadsName) return true;
else if (node.Name == _definedFieldsName) return true;
else if (node.Name == _analysesName) return true;
//
else if (node.TreeView == cltvResults && node.Name == _resultNodeSetsName) return false;
else if (node.TreeView == cltvResults && node.Name == _resultElementSetsName) return false;
else if (node.TreeView == cltvResults && node.Name == _resultSurfacesName) return false;
//
else if (node.TreeView == cltvResults && node.Name == _resultFieldOutputsName) return true;
else if (node.TreeView == cltvResults && node.Name == _resultHistoryOutputsName) return true;
//
else return false;
}
private bool CanDuplicate(TreeNode node)
{
if (node.TreeView == cltvGeometry && node.Tag is MeshSetupItem) return true;
else if (node.TreeView == cltvModel && node.Tag is FeNodeSet) return true;
else if (node.TreeView == cltvModel && node.Tag is FeElementSet) return true;
else if (node.TreeView == cltvModel && node.Tag is FeSurface) return true;
else if (node.TreeView == cltvModel && node.Tag is FeReferencePoint) return true;
else if (node.TreeView == cltvModel && node.Tag is CoordinateSystem) return true;
else if (node.Tag is Material) return true;
else if (node.Tag is Section) return true;
else if (node.Tag is Constraint) return true;
else if (node.Tag is SurfaceInteraction) return true;
else if (node.Tag is ContactPair) return true;
else if (node.Tag is Distribution) return true;
else if (node.Tag is Amplitude) return true;
else if (node.Tag is InitialCondition) return true;
else if (node.Tag is Step) return true;
else if (node.Tag is HistoryOutput) return true;
else if (node.Tag is FieldOutput) return true;
else if (node.Tag is BoundaryCondition) return true;
else if (node.Tag is Load) return true;
else if (node.Tag is DefinedField) return true;
else if (node.Tag is AnalysisJob) return true;
else if (node.TreeView == cltvResults && node.Tag is FeReferencePoint) return true;
else if (node.TreeView == cltvResults && node.Tag is CoordinateSystem) return true;
else return false;
}
private bool CanPropagate(TreeNode node)
{
if (node.Tag is HistoryOutput) return true;
else if (node.Tag is FieldOutput) return true;
else if (node.Tag is BoundaryCondition) return true;
else if (node.Tag is Load) return true;
else if (node.Tag is DefinedField) return true;
else return false;
}
private bool CanPreview(TreeNode node)
{
if (node.Tag is IPreviewable) return true;
else return false;
}
private bool CanSearchContactPairs(TreeNode node)
{
if (node == _constraints) return true;
else if (node == _contactPairs) return true;
else return false;
}
private bool CanSwapMergeMasterSlave(TreeNode node)
{
if (node.Tag is Tie) return true;
else if (node.Tag is ContactPair) return true;
else return false;
}
private bool CanHide(object item)
{
if (item is BasePart) return true;
else if (item is FeReferencePoint) return true;
else if (item is CoordinateSystem) return true;
else if (item is Constraint) return true;
else if (item is ContactPair) return true;
else if (item is InitialCondition) return true;
else if (item is BoundaryCondition) return true;
else if (item is Load) return true;
else if (item is DefinedField) return true;
else return false;
}
private bool CanDeactivate(TreeNode node)
{
if (node.Tag is MeshSetupItem) return true;
else if (node.Tag is Constraint) return true;
else if (node.Tag is ContactPair) return true;
else if (node.Tag is InitialCondition) return true;
else if (node.Tag is Step) return true;
else if (node.Tag is HistoryOutput) return true;
else if (node.Tag is FieldOutput) return true;
else if (node.Tag is BoundaryCondition) return true;
else if (node.Tag is Load) return true;
else if (node.Tag is DefinedField) return true;
else return false;
}
// 模型节点
public void SetNumberOfUserKeywords(int numOfUserKeywords)
{
_model.Text = _modelDisplayName;
if (numOfUserKeywords > 0) _model.Text += " (User Keywords: " + numOfUserKeywords + ")";
}
public void UpdateNumberOfStepControls(TreeNode stepNode)
{
if (stepNode != null && stepNode.Tag is Step step)
{
stepNode.Text = step.Name;
int numOfStepControls = step.GetNumberOfStepControls();
if (numOfStepControls > 0) stepNode.Text += " (Step Controls: " + numOfStepControls + ")";
}
}
//
public void ShowContextMenu(Control control, int x, int y)
{
CodersLabTreeView tree = GetActiveTree();
if (tree.SelectedNodes.Count > 0)
{
PrepareToolStripItem(tree);
//Expand / Collapse
tsmiSpaceExpandColapse.Visible = false;
tsmiExpandAll.Visible = false;
tsmiCollapseAll.Visible = false;
//
cmsTree.Show(control, x, y);
}
}
}
}