////////////////////////////////////////////////////////////////////////////////////////////// // Description: Displays a LineGraphics between points [0, 0, 0] and [1, 1, 1]. // ////////////////////////////////////////////////////////////////////////////////////////////// static public void LineGraphicsDemo() { PartDocument doc = AdnInventorUtilities.InvApplication.ActiveDocument as PartDocument; // ClientId, can be any string // Typically use instead current add-in GUID string clientId = "{Add-in Guid}"; // Add a new graphics group. // This will fail if a group with same name already exists ClientGraphics graphics = doc.ComponentDefinition.ClientGraphicsCollection.Add(clientId); // Add a new graphic node, with Id=1. // Id needs to be unique within graphics group GraphicsNode node = graphics.AddNode(1); // Add new data set GraphicsDataSets dataSets = doc.GraphicsDataSetsCollection.Add(clientId); // Add new coordinate set // Id needs to be unique within data set GraphicsCoordinateSet coordSet = dataSets.CreateCoordinateSet(1); // Fill up coordinates // Point1: [0.0, 0.0, 0.0] // Point2: [1.0, 1.0, 1.0] double[] coords = new double[] { 0.0, 0.0, 0.0, 1.0, 1.0, 1.0 }; coordSet.PutCoordinates(ref coords); // Create new GraphicsPrimitive LineGraphics lineGraphPrimitive = node.AddLineGraphics(); lineGraphPrimitive.LineWeight = 5.0; // Set coordinates lineGraphPrimitive.CoordinateSet = coordSet; // Update the current view, so we see the graphics doc.Views[1].Update(); }
public LineGraphics DrawLine( double[] startPoint, double[] endPoint, GraphicsNode node) { try { AdnGraphics graphicsData = WorkingGraphics; if (node == null) { node = graphicsData.ClientGraphics.AddNode( graphicsData.GetGraphicNodeFreeId()); } LineGraphics graphic = node.AddLineGraphics(); if ((startPoint != null) && (endPoint != null)) { GraphicsCoordinateSet coordSet = graphicsData.GraphicsDataSets.CreateCoordinateSet( graphicsData.GetDataSetFreeId()); double[] coordsArray = startPoint.Concat(endPoint).ToArray(); coordSet.PutCoordinates(ref coordsArray); graphic.CoordinateSet = coordSet; } return(graphic); } catch { return(null); } }
public LineGraphics DrawLine( double[] startPoint, double[] endPoint, GraphicsNode node) { try { AdnGraphics graphicsData = WorkingGraphics; if (node == null) { node = graphicsData.ClientGraphics.AddNode( graphicsData.GetGraphicNodeFreeId()); } LineGraphics graphic = node.AddLineGraphics(); if ((startPoint != null) && (endPoint != null)) { GraphicsCoordinateSet coordSet = graphicsData.GraphicsDataSets.CreateCoordinateSet( graphicsData.GetDataSetFreeId()); double[] coordsArray = startPoint.Concat(endPoint).ToArray(); coordSet.PutCoordinates(ref coordsArray); graphic.CoordinateSet = coordSet; } return graphic; } catch { return null; } }
/// <summary> /// Simplifies the mesh provided, then places it back into the parameters. /// </summary> /// <remarks> /// Repeatedly remove the shortest edge in the mesh, reducing the triangle count by two each step. This is repeated /// until the triangle count is low enough or more than 2000 tries have been made. /// </remarks> /// <param name="verts">The original and final verticies. (3 elements per vertex)</param> /// <param name="vertCount">The original and final vertex counts.</param> /// <param name="inds">The original and final index buffer. (3 element per triangle, zero based)</param> /// <param name="trisCount">The original and final triangle counts.</param> private static void Simplify(ref float[] verts, ref uint vertCount, ref uint[] inds, ref uint trisCount) { // Setup edge relations, compute min edge lengths... List <SimplificationVertex> simplVerts = new List <SimplificationVertex>(); for (int i = 0; i < vertCount; i++) { simplVerts.Add(new SimplificationVertex(verts[i * 3], verts[i * 3 + 1], verts[i * 3 + 2])); } List <SimplificationFace> simplFace = new List <SimplificationFace>(); for (int i = 0; i < trisCount * 3; i += 3) { SimplificationFace face = new SimplificationFace(); face.verts[0] = simplVerts[(int)inds[i]]; face.verts[1] = simplVerts[(int)inds[i + 1]]; face.verts[2] = simplVerts[(int)inds[i + 2]]; foreach (SimplificationVertex v in face.verts) { v.faces.Add(face); // Make sure all verticies know their neighbors } simplFace.Add(face); } foreach (SimplificationFace face in simplFace) { face.updateInfo(); } simplFace.Sort(); #region FANCY_SIMPLIFY_GRAPHICS #if FANCY_SIMPLIFY_GRAPHICS double[] major, minor; GraphicsCoordinateSet majorCoordSet, minorCoordSet; major = new double[9 * simplFace.Count]; for (int a = 0; a < simplFace.Count; a++) { int off = a * 9; simplFace[a].tmpHead = off; Array.Copy(simplFace[a].verts[0].pos, 0, major, off, 3); Array.Copy(simplFace[a].verts[1].pos, 0, major, off + 3, 3); Array.Copy(simplFace[a].verts[2].pos, 0, major, off + 6, 3); } minor = new double[9]; AssemblyDocument part = ((AssemblyDocument)Exporter.INVENTOR_APPLICATION.ActiveDocument); GraphicsDataSets dataSets; try { dataSets = part.GraphicsDataSetsCollection.AddNonTransacting("convexHULL"); } catch { dataSets = part.GraphicsDataSetsCollection["convexHULL"]; dataSets.Delete(); dataSets = part.GraphicsDataSetsCollection.AddNonTransacting("convexHULL"); } ClientGraphics graphics; try { graphics = part.ComponentDefinition.ClientGraphicsCollection.AddNonTransacting("convexHULL"); } catch { graphics = part.ComponentDefinition.ClientGraphicsCollection["convexHULL"]; graphics.Delete(); graphics = part.ComponentDefinition.ClientGraphicsCollection.AddNonTransacting("convexHULL"); } { GraphicsNode node = graphics.AddNode(graphics.Count + 1); majorCoordSet = dataSets.CreateCoordinateSet(dataSets.Count + 1); majorCoordSet.PutCoordinates(major); LineGraphics primitive = node.AddLineGraphics(); primitive.BurnThrough = false; //Create Coordinate Index Set GraphicsIndexSet indexSetCoords = dataSets.CreateIndexSet(dataSets.Count + 1); for (int i = 0; i < major.Length; i += 3) { indexSetCoords.Add(indexSetCoords.Count + 1, i + 1); //from point 1 indexSetCoords.Add(indexSetCoords.Count + 1, i + 2); //connect to point 2 indexSetCoords.Add(indexSetCoords.Count + 1, i + 2); //from point 2 indexSetCoords.Add(indexSetCoords.Count + 1, i + 3); //connect to point 3 indexSetCoords.Add(indexSetCoords.Count + 1, i + 3); //from point 3 indexSetCoords.Add(indexSetCoords.Count + 1, i + 1); //connect to point 1 } primitive.CoordinateSet = majorCoordSet; primitive.CoordinateIndexSet = indexSetCoords; } { GraphicsNode node = graphics.AddNode(graphics.Count + 1); minorCoordSet = dataSets.CreateCoordinateSet(dataSets.Count + 1); minorCoordSet.PutCoordinates(minor); TriangleGraphics primitive = node.AddTriangleGraphics(); primitive.DepthPriority = 19999; //Create Coordinate Index Set GraphicsColorSet colorSet = dataSets.CreateColorSet(dataSets.Count + 1); for (int i = 0; i < minor.Length; i += 3) { colorSet.Add(colorSet.Count + 1, 255, 0, 0); } primitive.CoordinateSet = minorCoordSet; primitive.ColorSet = colorSet; primitive.ColorBinding = ColorBindingEnum.kPerItemColors; //primitive.CoordinateIndexSet = indexSetCoords; } Exporter.INVENTOR_APPLICATION.ActiveView.Update(); #endif #endregion // Time for shenanigans! We are going to naively pick the shortest edge and then remove it. Destroys two faces per loop typically. // Give it 2000 tries at most. for (int i = 0; i < 2000 && simplFace.Count > CONVEX_HULL_FACET_LIMIT; i++) { SimplificationFace bFace = simplFace[0]; // This is the edge to remove SimplificationVertex[] remove = new SimplificationVertex[] { bFace.verts[bFace.minEdge], bFace.verts[(bFace.minEdge + 1) % bFace.verts.Length] }; #region FANCY_SIMPLIFY_GRAPHICS #if FANCY_SIMPLIFY_GRAPHICS // Highlight Array.Copy(bFace.verts[0].pos, 0, minor, 0, 3); Array.Copy(bFace.verts[1].pos, 0, minor, 3, 3); Array.Copy(bFace.verts[2].pos, 0, minor, 6, 3); minorCoordSet.PutCoordinates(minor); Exporter.INVENTOR_APPLICATION.ActiveView.Update(); #endif #endregion // Find the center point of the edge. One edge -> one vertex float[] center = new float[3]; foreach (SimplificationVertex vert in remove) { center[0] += vert.pos[0] / 2.0f; center[1] += vert.pos[1] / 2.0f; center[2] += vert.pos[2] / 2.0f; vert.faces.Clear(); // Really, never use vertex again. } SimplificationVertex newVertex = new SimplificationVertex(center[0], center[1], center[2]); // Ineffeciently check each face to see if it shares a vertex with the edge for (int k = simplFace.Count - 1; k >= 0; k--) { int matched = 0; SimplificationFace face = simplFace[k]; for (int j = 0; j < face.verts.Length; j++) { if (face.verts[j] == remove[0] || face.verts[j] == remove[1]) { face.verts[j] = newVertex; #region FANCY_SIMPLIFY_GRAPHICS #if FANCY_SIMPLIFY_GRAPHICS Array.Copy(face.verts[j].pos, 0, major, face.tmpHead + (3 * j), 3); int index = (face.tmpHead / 3) + j + 1; majorCoordSet.Remove(index); majorCoordSet.Add(index, Exporter.INVENTOR_APPLICATION.TransientGeometry.CreatePoint(face.verts[j].pos[0], face.verts[j].pos[1], face.verts[j].pos[2])); #endif #endregion if (matched == 0) { newVertex.faces.Add(face); } matched++; } } // If we share at least two verts with the edge we are dead, since the triangle ends up with two // of the same vertex if (matched >= 2) { // Degenerate simplFace.RemoveAt(k); foreach (SimplificationVertex v in face.verts) { v.faces.Remove(face); } } else if (matched == 1) { // We changed, so update edge lengths face.updateInfo(); } } simplVerts.Add(newVertex); // Resort by edge length simplFace.Sort(); } simplVerts.RemoveAll((vert) => vert.faces.Count <= 0); // Rebuild arrays vertCount = (uint)simplVerts.Count; verts = new float[vertCount * 3]; for (int i = 0; i < simplVerts.Count; i++) { int off = i * 3; simplVerts[i].finalIndex = (i); // Our indices are zero based <3 Array.Copy(simplVerts[i].pos, 0, verts, off, 3); } trisCount = (uint)simplFace.Count; inds = new uint[trisCount * 3]; for (int i = 0; i < simplFace.Count; i++) { int off = i * 3; inds[off] = (uint)simplFace[i].verts[0].finalIndex; inds[off + 1] = (uint)simplFace[i].verts[1].finalIndex; inds[off + 2] = (uint)simplFace[i].verts[2].finalIndex; } }
////////////////////////////////////////////////////////////////////////////////////////////// // Description: Displays a LineGraphics using Index and Color Sets. // ////////////////////////////////////////////////////////////////////////////////////////////// static public void IndexSetDemo() { PartDocument doc = AdnInventorUtilities.InvApplication.ActiveDocument as PartDocument; string clientId = "{Add-in Guid}"; ClientGraphics graphics = null; GraphicsDataSets dataSets = null; // Add some error handling in case // graphics collection and data already exist try { graphics = doc.ComponentDefinition.ClientGraphicsCollection[clientId]; dataSets = doc.GraphicsDataSetsCollection[clientId]; } catch { graphics = doc.ComponentDefinition.ClientGraphicsCollection.Add(clientId); dataSets = doc.GraphicsDataSetsCollection.Add(clientId); } // Add new node and coord set // Id generation by increment - bad because previous nodes/sets // may have been deleted previously, hence making count invalid GraphicsNode node = graphics.AddNode(graphics.Count + 1); GraphicsCoordinateSet coordSet = dataSets.CreateCoordinateSet(dataSets.Count + 1); double[] coords = new double[] { 0.0, 0.0, 0.0, //point 1 1.0, 1.0, 0.0, //point 2 0.0, 1.0, 0.0, //point 3 1.0, 0.0, 0.0 //point 4 }; coordSet.PutCoordinates(ref coords); LineGraphics lineGraphPrimitive = node.AddLineGraphics(); lineGraphPrimitive.LineWeight = 5.0; //Create Coordinate Index Set GraphicsIndexSet indexSetCoords = dataSets.CreateIndexSet(dataSets.Count + 1); indexSetCoords.Add(1, 1); //from point 1 indexSetCoords.Add(2, 3); //connect to point 3 indexSetCoords.Add(3, 3); //from point 3 indexSetCoords.Add(4, 2); //connect to point 2 indexSetCoords.Add(5, 2); //from point 2 indexSetCoords.Add(6, 4); //connect to point 4 lineGraphPrimitive.CoordinateSet = coordSet; lineGraphPrimitive.CoordinateIndexSet = indexSetCoords; //Create the color set with two colors GraphicsColorSet colorSet = dataSets.CreateColorSet(dataSets.Count + 1); colorSet.Add(1, 221, 0, 0); colorSet.Add(2, 255, 170, 0); colorSet.Add(3, 119, 187, 17); //Create the index set for color GraphicsIndexSet indexSetColors = dataSets.CreateIndexSet(dataSets.Count + 1); indexSetColors.Add(1, 3); //line 1 uses color 3 indexSetColors.Add(2, 1); //line 2 uses color 1 indexSetColors.Add(3, 2); //line 3 uses color 2 lineGraphPrimitive.ColorSet = colorSet; lineGraphPrimitive.ColorIndexSet = indexSetColors; lineGraphPrimitive.ColorBinding = ColorBindingEnum.kPerItemColors; doc.Views[1].Update(); }
private void m_MouseEvents_OnMouseDown(Inventor.MouseButtonEnum Button, Inventor.ShiftStateEnum ShiftKeys, Inventor.Point ModelPosition, Inventor.Point2d ViewPosition, Inventor.View View) { //if the interaction event is MyScreenshot, //then get the view position and model position if (m_InteractionEvents.Name == "MyScreenshot") { m_MouseStartViewPt = ViewPosition; m_StartModelPt = ModelPosition; m_flagMouseDown = true; //clean the last graphics m_InteractionEvents.InteractionGraphics.PreviewClientGraphics.Delete(); m_inventorApplication.ActiveView.Update(); //gi node oGiNode = m_InteractionEvents.InteractionGraphics.PreviewClientGraphics.AddNode(1); oCoordSet = m_InteractionEvents.InteractionGraphics.GraphicsDataSets.CreateCoordinateSet(1); //color set oColorSet = m_InteractionEvents.InteractionGraphics.GraphicsDataSets.CreateColorSet(1); oColorSet.Add(1, 255, 0, 0); TransientGeometry tg = m_inventorApplication.TransientGeometry; Inventor.Point tempP = tg.CreatePoint(ViewPosition.X, ViewPosition.Y, 0); oCoordSet.Add(1, tempP); oCoordSet.Add(2, tempP); oCoordSet.Add(3, tempP); oCoordSet.Add(4, tempP); oCoordSet.Add(5, tempP); try { if (oGiLineStripG != null) { oGiLineStripG.Delete(); oGiLineStripG = null; } oGiLineStripG = oGiNode.AddLineStripGraphics(); oGiLineStripG.CoordinateSet = oCoordSet; oGiLineStripG.ColorSet = oColorSet; oGiLineStripG.BurnThrough = true; } catch (Exception ex) { //a problem in Inventor 2009( R13 ) with //LineStripGraphics.BurnThrough. Use LineGraphics as workaround if (oGiLineG != null) { oGiLineG.Delete(); oGiLineG = null; } oGiLineG = oGiNode.AddLineGraphics(); oGiLineG.CoordinateSet = oCoordSet; oGiLineG.ColorSet = oColorSet; oGiLineG.BurnThrough = true; } } }