/// <summary> /// Scans and returns the documents linked to the current model. /// </summary> /// <returns>List of linked documents.</returns> private List <Document> GetLinkedModels() { List <Document> linkedDocs = new List <Document>(); try { // scan the current model looking for Revit links List <Element> linkedElements = FindLinkedModelElements(); foreach (Element linkedElem in linkedElements) { RevitLinkType linkType = linkedElem as RevitLinkType; if (linkType != null) { // now look that up in the open documents foreach (Document openedDoc in m_RevitApp.Documents) { if (Path.GetFileNameWithoutExtension(openedDoc.Title).ToUpper() == Path.GetFileNameWithoutExtension(linkType.Name).ToUpper()) { linkedDocs.Add(openedDoc); } } } } } catch (Exception ex) { STLDialogManager.ShowDebug(ex.Message); } return(linkedDocs); }
/// <summary> /// Get triangles in a solid with transform. /// </summary> /// <param name="solid">The solid contains triangulars</param> /// <param name="transform">The transformation.</param> private void GetTriangular(Document document, Solid solid, Transform transform) { // a solid has many faces FaceArray faces = solid.Faces; bool hasTransform = (null != transform); if (0 == faces.Size) { return; } foreach (Face face in faces) { if (face.Visibility != Visibility.Visible) { continue; } Mesh mesh; if (null != m_Settings.Detail) { mesh = face.Triangulate((double)m_Settings.Detail); } else { mesh = face.Triangulate(); } if (null == mesh) { continue; } m_TriangularNumber += mesh.NumTriangles; PlanarFace planarFace = face as PlanarFace; // write face to stl file // a face has a mesh, all meshes are made of triangles for (int ii = 0; ii < mesh.NumTriangles; ii++) { MeshTriangle triangular = mesh.get_Triangle(ii); double[] xyz = new double[9]; Autodesk.Revit.DB.XYZ normal = new Autodesk.Revit.DB.XYZ(); try { Autodesk.Revit.DB.XYZ[] triPnts = new Autodesk.Revit.DB.XYZ[3]; for (int n = 0; n < 3; ++n) { double x, y, z; Autodesk.Revit.DB.XYZ point = triangular.get_Vertex(n); if (hasTransform) { point = transform.OfPoint(point); } if (m_Settings.ExportSharedCoordinates) { ProjectPosition ps = document.ActiveProjectLocation.GetProjectPosition(point); x = ps.EastWest; y = ps.NorthSouth; z = ps.Elevation; } else { x = point.X; y = point.Y; z = point.Z; } if (m_Settings.Units != DisplayUnitType.DUT_UNDEFINED) { xyz[3 * n] = UnitUtils.ConvertFromInternalUnits(x, m_Settings.Units); xyz[3 * n + 1] = UnitUtils.ConvertFromInternalUnits(y, m_Settings.Units); xyz[3 * n + 2] = UnitUtils.ConvertFromInternalUnits(z, m_Settings.Units); } else { xyz[3 * n] = x; xyz[3 * n + 1] = y; xyz[3 * n + 2] = z; } var mypoint = new XYZ(xyz[3 * n], xyz[3 * n + 1], xyz[3 * n + 2]); triPnts[n] = mypoint; } Autodesk.Revit.DB.XYZ pnt1 = triPnts[1] - triPnts[0]; normal = pnt1.CrossProduct(triPnts[2] - triPnts[1]); } catch (Exception ex) { m_TriangularNumber--; STLDialogManager.ShowDebug(ex.Message); continue; } if (m_Writer is SaveDataAsBinary && m_Settings.ExportColor) { Material material = document.GetElement(face.MaterialElementId) as Material; if (material != null) { ((SaveDataAsBinary)m_Writer).Color = material.Color; } } m_Writer.WriteSection(normal, xyz); } } }
/// <summary> /// Save button click event. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The event args.</param> private void btnSave_Click(object sender, EventArgs e) { string fileName = STLDialogManager.SaveDialog(); if (!string.IsNullOrEmpty(fileName)) { SaveFormat saveFormat; if (rbBinary.Checked) { saveFormat = SaveFormat.Binary; } else { saveFormat = SaveFormat.ASCII; } ElementsExportRange exportRange; exportRange = ElementsExportRange.OnlyVisibleOnes; // get selected categories from the category list List <Category> selectedCategories = new List <Category>(); // only for projects if (m_Revit.ActiveUIDocument.Document.IsFamilyDocument == false) { foreach (TreeNode treeNode in tvCategories.Nodes) { AddSelectedTreeNode(treeNode, selectedCategories); } } DisplayUnitType dup = m_DisplayUnits[comboBox_DUT.Text]; m_SelectedDUT = dup; // create settings object to save setting information Settings aSetting = new Settings(saveFormat, exportRange, cbIncludeLinked.Checked, cbExportColor.Checked, cbExportSharedCoordinates.Checked, selectedCategories, dup); // save Revit document's triangular data in a temporary file m_Generator = new DataGenerator(m_Revit.Application, m_Revit.ActiveUIDocument.Document, m_Revit.ActiveUIDocument.Document.ActiveView); DataGenerator.GeneratorStatus succeed = m_Generator.SaveSTLFile(fileName, aSetting); if (succeed == DataGenerator.GeneratorStatus.FAILURE) { this.DialogResult = DialogResult.Cancel; MessageBox.Show(STLExportResource.ERR_SAVE_FILE_FAILED, STLExportResource.MESSAGE_BOX_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } else if (succeed == DataGenerator.GeneratorStatus.CANCEL) { this.DialogResult = DialogResult.Cancel; MessageBox.Show(STLExportResource.CANCEL_FILE_NOT_SAVED, STLExportResource.MESSAGE_BOX_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } this.DialogResult = DialogResult.OK; this.Close(); } else { MessageBox.Show(STLExportResource.CANCEL_FILE_NOT_SAVED, STLExportResource.MESSAGE_BOX_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }