using CaeGlobals; using CaeMesh; using System; using System.Collections.Generic; using System.Windows.Forms; // ReSharper disable CheckNamespace namespace CPSO.Forms { public partial class FrmQuery : UserControls.PrePoMaxChildForm { // Variables private int _numOfNodesToSelect; private double[][] _coorNodesToDraw; private double[][] _coorLinesToDraw; private Controller _controller; // Callbacks public Action Form_WriteDataToOutput; public Action Form_RemoveAnnotations; // Constructors public FrmQuery() { InitializeComponent(); _numOfNodesToSelect = -1; } // Event handlers private void lvQueries_MouseDown(object sender, MouseEventArgs e) { lvQueries.SelectedItems.Clear(); } private void lvQueries_MouseUp(object sender, MouseEventArgs e) { } private void lvQueries_SelectedIndexChanged(object sender, EventArgs e) { try { if (lvQueries.SelectedItem != null) { switch (lvQueries.SelectedItem.Text) { case ("Vertex/Node"): _controller.SelectBy = vtkSelectBy.QueryNode; _controller.Selection.SelectItem = vtkSelectItem.Node; _numOfNodesToSelect = 1; break; case ("Facet/Element"): _controller.SelectBy = vtkSelectBy.QueryElement; _controller.Selection.SelectItem = vtkSelectItem.Element; _numOfNodesToSelect = -1; break; case ("Edge"): _controller.SelectBy = vtkSelectBy.QueryEdge; _controller.Selection.SelectItem = vtkSelectItem.GeometryEdge; _numOfNodesToSelect = -1; break; case ("Surface"): _controller.SelectBy = vtkSelectBy.QuerySurface; _controller.Selection.SelectItem = vtkSelectItem.Surface; _numOfNodesToSelect = -1; break; case ("Part"): _controller.SelectBy = vtkSelectBy.QueryPart; _controller.Selection.SelectItem = vtkSelectItem.Part; _numOfNodesToSelect = -1; break; case ("Assembly"): _controller.SelectBy = vtkSelectBy.Default; _controller.Selection.SelectItem = vtkSelectItem.None; OutputAssemblyData(); _numOfNodesToSelect = -1; break; case ("Bounding box size"): _controller.SelectBy = vtkSelectBy.Default; _controller.Selection.SelectItem = vtkSelectItem.None; OutputBoundingBox(); _numOfNodesToSelect = -1; break; case ("Distance"): _controller.SelectBy = vtkSelectBy.QueryNode; _controller.Selection.SelectItem = vtkSelectItem.Node; _numOfNodesToSelect = 2; break; case ("Angle"): _controller.SelectBy = vtkSelectBy.QueryNode; _controller.Selection.SelectItem = vtkSelectItem.Node; _numOfNodesToSelect = 3; break; case ("Circle"): _controller.SelectBy = vtkSelectBy.QueryNode; _controller.Selection.SelectItem = vtkSelectItem.Node; _numOfNodesToSelect = 3; break; default: break; } // Clear RemoveMeasureAnnotation(); _controller.ClearSelectionHistoryAndCallSelectionChanged(); } } catch { } } private void btnClear_Click(object sender, EventArgs e) { // Annotations Form_RemoveAnnotations?.Invoke(null, null); // Selection _controller.ClearSelectionHistoryAndCallSelectionChanged(); } private void btnClose_Click(object sender, EventArgs e) { Hide(); } private void FrmQuery_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true; Hide(); } } private void FrmQuery_VisibleChanged(object sender, EventArgs e) { // This is called if some other form is shown to close all other forms // This is called after the form visibility changes if (this.Visible) { if (lvQueries.SelectedItem == null) lvQueries.Items[0].Selected = true; if (lvQueries.SelectedItem != null) lvQueries.SelectedItem.Selected = true; lvQueries.Focus(); } // The form was hidden else { _controller.SelectBy = vtkSelectBy.Default; // Clear RemoveMeasureAnnotation(); _controller.ClearSelectionHistoryAndCallSelectionChanged(); } } // Methods public void PrepareForm(Controller controller) { _controller = controller; lvQueries.HideSelection = false; lvQueries.SelectedIndices.Clear(); // _controller.SetSelectByToOff(); } // public void PickedIds(int[] ids) { try { // Clear annotations RemoveMeasureAnnotation(); // if (ids == null || ids.Length == 0) return; // if (_controller.SelectBy == vtkSelectBy.QueryElement && ids.Length == 1) OneElementPicked(ids[0]); else if (_controller.SelectBy == vtkSelectBy.QueryEdge && ids.Length == 1) OneEdgePicked(ids[0]); else if (_controller.SelectBy == vtkSelectBy.QuerySurface) { SelectionNodeMouse selectionNodeMouse = _controller.Selection.Nodes[0] as SelectionNodeMouse; if (selectionNodeMouse != null) { // Clear - to remove this mouseSelectionNode from the history which is used for speed optimization _controller.Selection.Clear(); ids = _controller.GetIdsFromSelectionNodeMouse(selectionNodeMouse, true); OneSurfacePicked(ids[0]); } } else if (_controller.SelectBy == vtkSelectBy.QueryPart && ids.Length == 1) OnePartPicked(ids[0]); else if (ids.Length == _numOfNodesToSelect) { // One node if (ids.Length == 1) OneNodePicked(ids[0]); // Two nodes else if (ids.Length == 2) TwoNodesPicked(ids[0], ids[1]); // Three nodes else if (ids.Length == 3) ThreeNodesPicked(ids[0], ids[1], ids[2]); // _controller.ClearSelectionHistoryAndCallSelectionChanged(); // HighlightNodes(); } } catch { } } // public void OneNodePicked(int nodeId) { if (Form_WriteDataToOutput != null) { string data; string lenUnit = _controller.GetLengthUnit(); string lenUnitInBrackets = string.Format("[{0}]", lenUnit); _coorNodesToDraw = new double[_numOfNodesToSelect][]; // Vec3D baseV = new Vec3D(_controller.GetNode(nodeId).Coor); // Item name string itemName = "Node"; if (_controller.CurrentView == ViewGeometryModelResults.Geometry) itemName = "Vertex"; // Form_WriteDataToOutput(""); data = string.Format("{0,16}{1,8}{2,16}{3,16}", itemName.PadRight(16), "[/]", "id:", nodeId); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}", "Base".PadRight(16), lenUnitInBrackets, "x, y, z:", baseV.X, baseV.Y, baseV.Z); Form_WriteDataToOutput(data); // if (_controller.CurrentView == ViewGeometryModelResults.Results) { float fieldValue = _controller.GetNodalValue(nodeId); string fieldUnit = "[" + _controller.GetCurrentResultsUnitAbbreviation() + "]"; // Vec3D trueScaledV = new Vec3D(_controller.GetScaledNode(1, nodeId).Coor); Vec3D disp = trueScaledV - baseV; // data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}", "Deformed".PadRight(16), lenUnitInBrackets, "x, y, z:", trueScaledV.X, trueScaledV.Y, trueScaledV.Z); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}", "Displacement".PadRight(16), lenUnitInBrackets, "x, y, z:", disp.X, disp.Y, disp.Z); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}", "Field value".PadRight(16), fieldUnit, ":", fieldValue); Form_WriteDataToOutput(data); // float scale = _controller.GetScale(); baseV = new Vec3D(_controller.GetScaledNode(scale, nodeId).Coor); // for the _coorNodesToDraw } // Form_WriteDataToOutput(""); // _coorNodesToDraw[0] = baseV.Coor; _coorLinesToDraw = null; // _controller.Annotations.AddNodeAnnotation(nodeId); } } public void OneElementPicked(int elementId) { // Item name string itemName = "Element id:"; if (_controller.CurrentView == ViewGeometryModelResults.Geometry) itemName = "Facet id:"; // Form_WriteDataToOutput(""); string data = string.Format("{0,16}{1,8}", itemName.PadRight(16), elementId); Form_WriteDataToOutput(data); if (_controller.CurrentView == ViewGeometryModelResults.Model) { string elementType = _controller.GetElementType(elementId); data = string.Format("{0,16}{1,8}", "Element type:".PadRight(16), elementType); Form_WriteDataToOutput(data); } // Form_WriteDataToOutput(""); // _controller.ClearSelectionHistoryAndCallSelectionChanged(); // _controller.HighlightElement(elementId); // _controller.Annotations.AddElementAnnotation(elementId); } public void OneEdgePicked(int geometryId) { int[] itemTypePartIds = FeMesh.GetItemTypePartIdsFromGeometryId(geometryId); BasePart part = _controller.DisplayedMesh.GetPartFromId(itemTypePartIds[2]); int edgeId = itemTypePartIds[0]; double length1 = _controller.DisplayedMesh.GetEdgeLength(geometryId); string lenUnit = _controller.GetLengthUnit(); string lenUnitInBrackets = string.Format("[{0}]", lenUnit); // Form_WriteDataToOutput(""); string data = string.Format("Edge on part: {0}", part.Name); if (part.Visualization.EdgeTypes != null) { data += string.Format(" Edge type: {0}", part.Visualization.EdgeTypes[edgeId]); } Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16}", "Edge".PadRight(16), "[/]", "id:", edgeId + 1); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}", "Base".PadRight(16), lenUnitInBrackets, "L:", length1); Form_WriteDataToOutput(data); // if (_controller.CurrentView == ViewGeometryModelResults.Results) { int[] nodeIds; _controller.DisplayedMesh.GetEdgeNodeCoor(geometryId, out nodeIds, out double[][] nodeCoor); FeNode[] nodes = _controller.GetScaledNodes(1, nodeIds); double length2 = 0; Vec3D n1; Vec3D n2; for (int i = 0; i < nodes.Length - 1; i++) { n1 = new Vec3D(nodes[i].Coor); n2 = new Vec3D(nodes[i + 1].Coor); length2 += (n2 - n1).Len; } data = string.Format("{0,16}{1,8}{2,16}{3,16:E}", "Deformed".PadRight(16), lenUnitInBrackets, "L:", length2); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}", "Delta".PadRight(16), lenUnitInBrackets, "L:", length2 - length1); Form_WriteDataToOutput(data); } Form_WriteDataToOutput(""); // _controller.ClearSelectionHistoryAndCallSelectionChanged(); // _controller.HighlightItemsByGeometryEdgeIds(new int[] { geometryId }, false); // _controller.Annotations.AddEdgeAnnotation(geometryId); } public void OneSurfacePicked(int geometryId) { int[] itemTypePartIds = FeMesh.GetItemTypePartIdsFromGeometryId(geometryId); BasePart part = _controller.DisplayedMesh.GetPartFromId(itemTypePartIds[2]); int surfaceId = itemTypePartIds[0]; int numEdges = part.Visualization.FaceEdgeIds[surfaceId].Length; int numVertices = part.Visualization.GetVertexNodeIdsForSurfaceId(surfaceId).Length; double area1 = _controller.DisplayedMesh.GetSurfaceArea(geometryId); string areaUnit = "[" + _controller.GetAreaUnit() + "]"; // Form_WriteDataToOutput(""); string data = string.Format("Surface on part: {0}", part.Name); if (part.Visualization.FaceTypes != null) { data += string.Format(" Surface type: {0}", part.Visualization.FaceTypes[surfaceId]); } Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16}", "Surface".PadRight(16), "[/]", "id:", surfaceId + 1); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16}", "Edges".PadRight(16), "[/]", "#:", numEdges); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16}", "Vertices".PadRight(16), "[/]", "#:", numVertices); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}", "Base".PadRight(16), areaUnit, "A:", area1); Form_WriteDataToOutput(data); // if (_controller.CurrentView == ViewGeometryModelResults.Results) { int[] nodeIds; _controller.DisplayedMesh.GetFaceNodes(geometryId, out nodeIds); FeNode[] nodes = _controller.GetScaledNodes(1, nodeIds); Dictionary nodesDic = new Dictionary(); for (int i = 0; i < nodes.Length; i++) nodesDic.Add(nodes[i].Id, nodes[i]); double area2 = _controller.DisplayedMesh.ComputeFaceArea(part.Visualization, surfaceId, nodesDic); // data = string.Format("{0,16}{1,8}{2,16}{3,16:E}", "Deformed".PadRight(16), areaUnit, "A:", area2); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}", "Delta".PadRight(16), areaUnit, "A:", area2 - area1); Form_WriteDataToOutput(data); } Form_WriteDataToOutput(""); // _controller.ClearSelectionHistoryAndCallSelectionChanged(); // in order to prevent SHIFT ADD // _controller.HighlightItemsBySurfaceIds(new int[] { geometryId }, false); // _controller.Annotations.AddSurfaceAnnotation(geometryId); } public void OnePartPicked(int partId) { FeMesh mesh = _controller.DisplayedMesh; // BasePart part = mesh.GetPartFromId(partId); if (part == null) throw new NotSupportedException(); // Form_WriteDataToOutput(""); string data = string.Format("Part name: {0}", part.Name); Form_WriteDataToOutput(data); data = string.Format("Part id: {0}", part.PartId); Form_WriteDataToOutput(data); data = string.Format("Part type: {0}", part.PartType); Form_WriteDataToOutput(data); // Item name string elementsName = "Number of elements:"; string nodesName = "Number of nodes:"; if (_controller.CurrentView == ViewGeometryModelResults.Geometry) { elementsName = "Number of facets:"; nodesName = "Number of vertices:"; } data = string.Format("{0} {1}", elementsName, part.Labels.Length); Form_WriteDataToOutput(data); data = string.Format("{0} {1}", nodesName, part.NodeLabels.Length); Form_WriteDataToOutput(data); // string volumeArea = "Area:"; string unit = _controller.GetAreaUnit(); bool volume = part.PartType == PartType.SolidAsShell || part.PartType == PartType.Solid || part.PartType == PartType.Compound; if (part is ResultPart) { if (volume) { volumeArea = "Undeformed volume:"; unit = _controller.GetVolumeUnit(); } else { volumeArea = "Undeformed area:"; unit = _controller.GetAreaUnit(); } } else { if (volume) { volumeArea = "Volume:"; unit = _controller.GetVolumeUnit(); } else { volumeArea = "Area:"; unit = _controller.GetAreaUnit(); } } // data = string.Format("{0} {1,16:E} {2}", volumeArea, part.MassProperties.Volume, unit); Form_WriteDataToOutput(data); // Form_WriteDataToOutput(""); // _controller.ClearSelectionHistoryAndCallSelectionChanged(); // _controller.Highlight3DObjects(new object[] { part }); // _controller.Annotations.AddPartAnnotation(part.Name); } private void OutputAssemblyData() { FeMesh mesh = _controller.DisplayedMesh; if (mesh == null) return; double[] bb = _controller.GetBoundingBox(); double[] size = new double[] { bb[1] - bb[0], bb[3] - bb[2], bb[5] - bb[4] }; // Form_WriteDataToOutput(""); string data = string.Format("Assembly"); Form_WriteDataToOutput(data); data = string.Format("Number of parts: {0}", mesh.Parts.Count); Form_WriteDataToOutput(data); // Item name string elementsName = "Number of elements:"; string nodesName = "Number of nodes:"; if (_controller.CurrentView == ViewGeometryModelResults.Geometry) { elementsName = "Number of facets:"; nodesName = "Number of vertices:"; } data = string.Format("{0} {1}", elementsName, mesh.Elements.Count); Form_WriteDataToOutput(data); data = string.Format("{0} {1}", nodesName, mesh.Nodes.Count); Form_WriteDataToOutput(data); Form_WriteDataToOutput(""); } private void OutputBoundingBox() { double[] bb = _controller.GetBoundingBox(); double[] size = new double[] { bb[1] - bb[0], bb[3] - bb[2], bb[5] - bb[4] }; string lenUnit = _controller.GetLengthUnit(); string lenUnitInBrackets = string.Format("[{0}]", lenUnit); // Form_WriteDataToOutput(""); string data = string.Format("Bounding box"); Form_WriteDataToOutput(data); if (_controller.CurrentView == ViewGeometryModelResults.Results) { double scale = _controller.GetScale(); data = string.Format("{0,17}{1,7}{2,16}{3,16:E}", "Def. scale factor".PadRight(17), "[/]", "sf:", scale); Form_WriteDataToOutput(data); } data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}", "Min".PadRight(16), lenUnitInBrackets, "x, y, z:", bb[0], bb[2], bb[4]); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}", "Max".PadRight(16), lenUnitInBrackets, "x, y, z:", bb[1], bb[3], bb[5]); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}", "Size".PadRight(16), lenUnitInBrackets, "x, y, z:", size[0], size[1], size[2]); Form_WriteDataToOutput(data); } public void TwoNodesPicked(int nodeId1, int nodeId2) { if (Form_WriteDataToOutput != null) { string data; _coorNodesToDraw = new double[_numOfNodesToSelect][]; // Vec3D trueScaledD = null; Vec3D baseV1 = new Vec3D(_controller.GetNode(nodeId1).Coor); Vec3D baseV2 = new Vec3D(_controller.GetNode(nodeId2).Coor); Vec3D baseD = baseV2 - baseV1; string lenUnit = _controller.GetLengthUnit(); string lenUnitInBrackets = string.Format("[{0}]", lenUnit); // Form_WriteDataToOutput(""); data = string.Format( "{0,16}{1,8}{2,16}{3,16}, {4,16}", "Distance".PadRight(16), "[/]", "id1, id2:", nodeId1, nodeId2); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}, {6,16:E}", "Base".PadRight(16), lenUnitInBrackets, "dx, dy, dz, D:", baseD.X, baseD.Y, baseD.Z, baseD.Len); Form_WriteDataToOutput(data); // if (_controller.CurrentView == ViewGeometryModelResults.Results) { Vec3D trueScaledV1 = new Vec3D(_controller.GetScaledNode(1, nodeId1).Coor); Vec3D trueScaledV2 = new Vec3D(_controller.GetScaledNode(1, nodeId2).Coor); trueScaledD = trueScaledV2 - trueScaledV1; Vec3D delta = trueScaledD - baseD; // data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}, {6,16:E}", "Deformed".PadRight(16), lenUnitInBrackets, "dx, dy, dz, D:", trueScaledD.X, trueScaledD.Y, trueScaledD.Z, trueScaledD.Len); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}, {6,16:E}", "Delta".PadRight(16), lenUnitInBrackets, "dx, dy, dz, D:", delta.X, delta.Y, delta.Z, trueScaledD.Len - baseD.Len); Form_WriteDataToOutput(data); // float scale = _controller.GetScale(); baseV1 = new Vec3D(_controller.GetScaledNode(scale, nodeId1).Coor); // for the _coorNodesToDraw baseV2 = new Vec3D(_controller.GetScaledNode(scale, nodeId2).Coor); // for the _coorNodesToDraw } Form_WriteDataToOutput(""); // _coorNodesToDraw[0] = baseV1.Coor; _coorNodesToDraw[1] = baseV2.Coor; _coorLinesToDraw = _coorNodesToDraw; // Annotation string text; string numberFormat = _controller.Settings.Annotations.GetNumberFormat(); // if (trueScaledD != null) baseD = trueScaledD; // text = string.Format("Distance: {0} {1}{2}", baseD.Len.ToString(numberFormat), lenUnit, Environment.NewLine); text += string.Format("dx: {0} {1}{2}", baseD.X.ToString(numberFormat), lenUnit, Environment.NewLine); text += string.Format("dy: {0} {1}{2}", baseD.Y.ToString(numberFormat), lenUnit, Environment.NewLine); text += string.Format("dz: {0} {1}", baseD.Z.ToString(numberFormat), lenUnit); // Vec3D anchor = (baseV1 + baseV2) * 0.5; _controller.Annotations.AddMeasureAnnotation(text, anchor.Coor); } } public void ThreeNodesPicked(int nodeId1, int nodeId2, int nodeId3) { if (Form_WriteDataToOutput != null) { if (lvQueries.SelectedItem.Text == "Angle") ComputeAngle(nodeId1, nodeId2, nodeId3); else if (lvQueries.SelectedItem.Text == "Circle") ComputeCircle(nodeId1, nodeId2, nodeId3); } } // private void ComputeAngle(int nodeId1, int nodeId2, int nodeId3) { System.Diagnostics.Debug.Write(nodeId1 + " " + nodeId2 + " " + nodeId3); string data; double angle; double angle2draw; Vec3D p; Vec3D axis; Vec3D baseV1 = new Vec3D(_controller.GetNode(nodeId1).Coor); Vec3D baseV2 = new Vec3D(_controller.GetNode(nodeId2).Coor); Vec3D baseV3 = new Vec3D(_controller.GetNode(nodeId3).Coor); // angle = ComputeAngle(baseV1, baseV2, baseV3, out p, out axis); angle2draw = angle; string angleUnit = StringAngleDegConverter.GetUnitAbbreviation(); string angleUnitInBrackets = "[" + angleUnit + "]"; // data = string.Format("{0,16}{1,8}{2,16}{3,16}, {4,16}, {5,16}", "Angle".PadRight(16), "[/]", "id1, id2, id3:", nodeId1, nodeId2, nodeId3); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}", "Base".PadRight(16), angleUnitInBrackets, "ϕ:", angle); Form_WriteDataToOutput(data); // if (_controller.CurrentView == ViewGeometryModelResults.Results) { baseV1 = new Vec3D(_controller.GetScaledNode(1, nodeId1).Coor); baseV2 = new Vec3D(_controller.GetScaledNode(1, nodeId2).Coor); baseV3 = new Vec3D(_controller.GetScaledNode(1, nodeId3).Coor); // double angle2 = ComputeAngle(baseV1, baseV2, baseV3, out p, out axis); double delta = angle2 - angle; // data = string.Format("{0,16}{1,8}{2,16}{3,16:E}", "Deformed".PadRight(16), angleUnitInBrackets, "ϕ:", angle2); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}", "Delta".PadRight(16), angleUnitInBrackets, "ϕ:", delta); Form_WriteDataToOutput(data); // float scale = _controller.GetScale(); baseV1 = new Vec3D(_controller.GetScaledNode(scale, nodeId1).Coor); // for the _coorNodesToDraw baseV2 = new Vec3D(_controller.GetScaledNode(scale, nodeId2).Coor); // for the _coorNodesToDraw baseV3 = new Vec3D(_controller.GetScaledNode(scale, nodeId3).Coor); // for the _coorNodesToDraw // angle = angle2; // for the annotation angle2draw = ComputeAngle(baseV1, baseV2, baseV3, out p, out axis); // for drawing } Form_WriteDataToOutput(""); // _coorNodesToDraw = new double[_numOfNodesToSelect][]; _coorNodesToDraw[0] = baseV1.Coor; _coorNodesToDraw[1] = baseV2.Coor; _coorNodesToDraw[2] = baseV3.Coor; // List coorLines = new List() { baseV1.Coor, baseV2.Coor, baseV3.Coor, baseV2.Coor }; coorLines.AddRange(ComputeCirclePoints(baseV2, axis, p, angle2draw * Math.PI / 180)); _coorLinesToDraw = coorLines.ToArray(); // Annotation string text; string numberFormat = _controller.Settings.Annotations.GetNumberFormat(); // text = string.Format("Angle: {0}{1}", angle.ToString(numberFormat), angleUnit); // double[] anchor = _coorLinesToDraw[_coorLinesToDraw.Length / 2]; _controller.Annotations.AddMeasureAnnotation(text, anchor); } private void ComputeCircle(int nodeId1, int nodeId2, int nodeId3) { // https://en.wikipedia.org/wiki/Circumscribed_circle string data; double r; Vec3D center; Vec3D axis; double rDraw; Vec3D centerDraw; Vec3D axisDraw; Vec3D baseV1 = new Vec3D(_controller.GetNode(nodeId1).Coor); Vec3D baseV2 = new Vec3D(_controller.GetNode(nodeId2).Coor); Vec3D baseV3 = new Vec3D(_controller.GetNode(nodeId3).Coor); // double arcAngleDeg; Vec3D.GetCircle(baseV1, baseV2, baseV3, out r, out arcAngleDeg, out center, out axis); rDraw = r; centerDraw = center; axisDraw = axis; string lenUnit = _controller.GetLengthUnit(); string lenUnitInBrackets = string.Format("[{0}]", lenUnit); // Form_WriteDataToOutput(""); data = string.Format("{0,16}{1,8}{2,16}{3,16}, {4,16}, {5,16}", "Circle".PadRight(16), "[/]", "id1, id2, id3:", nodeId1, nodeId2, nodeId3); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}, {6,16:E}", "Base".PadRight(16), lenUnitInBrackets, "x, y, z, R:", center.X, center.Y, center.Z, r); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}", "Base axis".PadRight(16), lenUnitInBrackets, "x, y, z:", axis.X, axis.Y, axis.Z); Form_WriteDataToOutput(data); // if (_controller.CurrentView == ViewGeometryModelResults.Results) { baseV1 = new Vec3D(_controller.GetScaledNode(1, nodeId1).Coor); baseV2 = new Vec3D(_controller.GetScaledNode(1, nodeId2).Coor); baseV3 = new Vec3D(_controller.GetScaledNode(1, nodeId3).Coor); // Vec3D.GetCircle(baseV1, baseV2, baseV3, out r, out center, out axis); // data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}, {6,16:E}", "Deformed".PadRight(16), lenUnitInBrackets, "x, y, z, R:", center.X, center.Y, center.Z, r); Form_WriteDataToOutput(data); data = string.Format("{0,16}{1,8}{2,16}{3,16:E}, {4,16:E}, {5,16:E}", "Deformed axis".PadRight(16), lenUnitInBrackets, "x, y, z:", axis.X, axis.Y, axis.Z); Form_WriteDataToOutput(data); // float scale = _controller.GetScale(); baseV1 = new Vec3D(_controller.GetScaledNode(scale, nodeId1).Coor); // for the _coorNodesToDraw baseV2 = new Vec3D(_controller.GetScaledNode(scale, nodeId2).Coor); // for the _coorNodesToDraw baseV3 = new Vec3D(_controller.GetScaledNode(scale, nodeId3).Coor); // for the _coorNodesToDraw // Vec3D.GetCircle(baseV1, baseV2, baseV3, out rDraw, out centerDraw, out axisDraw); } Form_WriteDataToOutput(""); // _coorNodesToDraw = new double[_numOfNodesToSelect + 1][]; _coorNodesToDraw[0] = baseV1.Coor; _coorNodesToDraw[1] = baseV2.Coor; _coorNodesToDraw[2] = baseV3.Coor; _coorNodesToDraw[3] = centerDraw.Coor; // _coorLinesToDraw = ComputeCirclePoints(centerDraw, axisDraw, baseV1, 2 * Math.PI); // Annotation string text; string numberFormat = _controller.Settings.Annotations.GetNumberFormat(); // text = string.Format("Radius: {0} {1}{2}", r.ToString(numberFormat), lenUnit, Environment.NewLine); text += string.Format("X: {0} {1}{2}", center.X.ToString(numberFormat), lenUnit, Environment.NewLine); text += string.Format("Y: {0} {1}{2}", center.Y.ToString(numberFormat), lenUnit, Environment.NewLine); text += string.Format("Z: {0} {1}", center.Z.ToString(numberFormat), lenUnit); // double[] anchor = _coorLinesToDraw[2]; _controller.Annotations.AddMeasureAnnotation(text, anchor); } private double ComputeAngle(Vec3D baseV1, Vec3D baseV2, Vec3D baseV3, out Vec3D p, out Vec3D axis) { Vec3D line1 = baseV1 - baseV2; Vec3D line2 = baseV3 - baseV2; // if (line1.Len2 > line2.Len2) // find shorter line { p = baseV2 + line2 * 0.5; axis = Vec3D.CrossProduct(line2, line1); } else { p = baseV2 + line1 * 0.5; axis = Vec3D.CrossProduct(line1, line2); } axis.Normalize(); line1.Normalize(); line2.Normalize(); // double angle = Math.Acos(Vec3D.DotProduct(line1, line2)) * 180 / Math.PI; return angle; } private double[][] ComputeCirclePoints(Vec3D c, Vec3D axis, Vec3D p, double angle) { // The circe is constructed by moving the r vector around the axis // d vector is the change in normal n and perpendicular r direction int segments = 40; double [][] coorLines = new double[segments + 1][]; double dAngle = angle / segments; Vec3D r = p - c; double rLen = r.Len; Vec3D n; Vec3D d; // coorLines[0] = p.Coor; for (int i = 0; i < segments; i++) { n = Vec3D.CrossProduct(axis, r); n.Normalize(); // d = rLen * Math.Sin(dAngle) * n - (1 - Math.Cos(dAngle)) * r; p = p + d; r = r + d; // coorLines[i + 1] = p.Coor; } return coorLines; } // private void RemoveMeasureAnnotation() { _controller.Annotations.RemoveCurrentMeasureAnnotation(); } private void HighlightNodes() { if (_coorNodesToDraw != null) { if (_coorNodesToDraw.GetLength(0) == 1) { _controller.HighlightNodes(_coorNodesToDraw); } else if (_coorNodesToDraw.GetLength(0) >= 2) { _controller.HighlightNodes(_coorNodesToDraw); _controller.HighlightConnectedLines(_coorLinesToDraw); } } } } }