public BuiltElements.Duct DuctToSpeckle(DB.Duct revitDuct) { var baseGeometry = LocationToSpeckle(revitDuct); var baseLine = baseGeometry as Line; if (baseLine == null) { throw new Exception("Only line base Ducts are currently supported."); } // SPECKLE DUCT var speckleDuct = new RevitDuct(); speckleDuct.family = revitDuct.DuctType.FamilyName; speckleDuct.type = revitDuct.DuctType.Name; speckleDuct.baseLine = baseLine; speckleDuct.diameter = GetParamValue <double>(revitDuct, BuiltInParameter.RBS_CURVE_DIAMETER_PARAM); speckleDuct.height = GetParamValue <double>(revitDuct, BuiltInParameter.RBS_CURVE_HEIGHT_PARAM); speckleDuct.width = GetParamValue <double>(revitDuct, BuiltInParameter.RBS_CURVE_WIDTH_PARAM); speckleDuct.length = GetParamValue <double>(revitDuct, BuiltInParameter.CURVE_ELEM_LENGTH); speckleDuct.velocity = GetParamValue <double>(revitDuct, BuiltInParameter.RBS_VELOCITY); speckleDuct.level = ConvertAndCacheLevel(revitDuct, BuiltInParameter.RBS_START_LEVEL_PARAM); var typeElem = Doc.GetElement(revitDuct.MEPSystem.GetTypeId()); speckleDuct.systemName = typeElem.Name; GetAllRevitParamsAndIds(speckleDuct, revitDuct, new List <string> { "RBS_CURVE_HEIGHT_PARAM", "RBS_CURVE_WIDTH_PARAM", "RBS_CURVE_DIAMETER_PARAM", "CURVE_ELEM_LENGTH", "RBS_START_LEVEL_PARAM", "RBS_VELOCITY" }); return(speckleDuct); }
public List <ApplicationPlaceholderObject> DuctToNative(BuiltElements.Duct speckleDuct) { var baseLine = LineToNative(speckleDuct.baseLine); XYZ startPoint = baseLine.GetEndPoint(0); XYZ endPoint = baseLine.GetEndPoint(1); Autodesk.Revit.DB.Level level; var speckleRevitDuct = speckleDuct as RevitDuct; level = LevelToNative(speckleRevitDuct != null ? speckleRevitDuct.level : LevelFromCurve(baseLine)); var ductType = GetElementType <DB.DuctType>(speckleDuct); var systemFamily = (speckleDuct is RevitDuct rd) ? rd.systemName : ""; List <ElementType> types = new FilteredElementCollector(Doc).WhereElementIsElementType() .OfClass(typeof(MechanicalSystemType)).ToElements().Cast <ElementType>().ToList(); var system = types.FirstOrDefault(x => x.Name == systemFamily); if (system == null) { system = types.FirstOrDefault(); Report.LogConversionError(new Exception($"Duct type {systemFamily} not found; replaced with {system.Name}")); } var docObj = GetExistingElementByApplicationId(((Base)speckleDuct).applicationId); // deleting instead of updating for now! if (docObj != null) { Doc.Delete(docObj.Id); } DB.Duct duct = DB.Duct.Create(Doc, system.Id, ductType.Id, level.Id, startPoint, endPoint); if (speckleRevitDuct != null) { TrySetParam(duct, BuiltInParameter.RBS_CURVE_HEIGHT_PARAM, speckleRevitDuct.height, speckleRevitDuct.units); TrySetParam(duct, BuiltInParameter.RBS_CURVE_WIDTH_PARAM, speckleRevitDuct.width, speckleRevitDuct.units); TrySetParam(duct, BuiltInParameter.RBS_CURVE_DIAMETER_PARAM, speckleRevitDuct.diameter, speckleRevitDuct.units); TrySetParam(duct, BuiltInParameter.CURVE_ELEM_LENGTH, speckleRevitDuct.length, speckleRevitDuct.units); TrySetParam(duct, BuiltInParameter.RBS_VELOCITY, speckleRevitDuct.velocity, speckleRevitDuct.units); //Report.Log($"Created Duct {duct.Id}"); SetInstanceParameters(duct, speckleRevitDuct); } var placeholders = new List <ApplicationPlaceholderObject> { new ApplicationPlaceholderObject { applicationId = speckleDuct.applicationId, ApplicationGeneratedId = duct.UniqueId, NativeObject = duct } }; return(placeholders); }
private void AssertDuctEqual(DB.Duct sourceElem, DB.Duct destElem) { Assert.NotNull(destElem); Assert.Equal(sourceElem.Name, destElem.Name); AssertEqualParam(sourceElem, destElem, BuiltInParameter.CURVE_ELEM_LENGTH); AssertEqualParam(sourceElem, destElem, BuiltInParameter.RBS_START_LEVEL_PARAM); AssertEqualParam(sourceElem, destElem, BuiltInParameter.RBS_SYSTEM_CLASSIFICATION_PARAM); AssertEqualParam(sourceElem, destElem, BuiltInParameter.RBS_CURVE_HEIGHT_PARAM); AssertEqualParam(sourceElem, destElem, BuiltInParameter.RBS_CURVE_WIDTH_PARAM); AssertEqualParam(sourceElem, destElem, BuiltInParameter.RBS_CURVE_DIAMETER_PARAM); AssertEqualParam(sourceElem, destElem, BuiltInParameter.RBS_VELOCITY); }
public BuiltElements.Duct DuctToSpeckle(DB.Duct revitDuct) { var baseGeometry = LocationToSpeckle(revitDuct); if (!(baseGeometry is Line baseLine)) { throw new Speckle.Core.Logging.SpeckleException("Only line based Ducts are currently supported."); } // SPECKLE DUCT var speckleDuct = new RevitDuct { family = revitDuct.DuctType.FamilyName, type = revitDuct.DuctType.Name, baseLine = baseLine, diameter = GetParamValue <double>(revitDuct, BuiltInParameter.RBS_CURVE_DIAMETER_PARAM), height = GetParamValue <double>(revitDuct, BuiltInParameter.RBS_CURVE_HEIGHT_PARAM), width = GetParamValue <double>(revitDuct, BuiltInParameter.RBS_CURVE_WIDTH_PARAM), length = GetParamValue <double>(revitDuct, BuiltInParameter.CURVE_ELEM_LENGTH), velocity = GetParamValue <double>(revitDuct, BuiltInParameter.RBS_VELOCITY), level = ConvertAndCacheLevel(revitDuct, BuiltInParameter.RBS_START_LEVEL_PARAM), displayMesh = GetElementMesh(revitDuct) }; var typeElem = Doc.GetElement(revitDuct.MEPSystem.GetTypeId()); speckleDuct.systemName = typeElem.Name; GetAllRevitParamsAndIds(speckleDuct, revitDuct, new List <string> { "RBS_CURVE_HEIGHT_PARAM", "RBS_CURVE_WIDTH_PARAM", "RBS_CURVE_DIAMETER_PARAM", "CURVE_ELEM_LENGTH", "RBS_START_LEVEL_PARAM", "RBS_VELOCITY" }); //Report.Log($"Converted Duct {revitDuct.Id}"); return(speckleDuct); }
public void Duct_from_AutoCad() { UIDocument uidoc = this.ActiveUIDocument; Document doc = uidoc.Document; Autodesk.Revit.DB.View currentview = doc.ActiveView; if (currentview.ViewType != ViewType.FloorPlan) { return; } //Only works in floorplans try { puntoref_revit = uidoc.Selection.PickPoint("Pick origin point in REVIT"); } catch { return; } OpenFileDialog archivofile = new OpenFileDialog(); archivofile.Title = "Open CAD data file"; archivofile.CheckFileExists = true; archivofile.CheckPathExists = true; archivofile.Filter = "Txt|*.txt"; if (archivofile.ShowDialog() != DialogResult.OK) { return; } string nombrefile = archivofile.FileName; string[] lineasarchivo = File.ReadAllLines(nombrefile); string lineadata = String.Empty; //get Rectangular Duct Type FilteredElementCollector collectorductos = new FilteredElementCollector(doc); collectorductos.OfClass(typeof(Autodesk.Revit.DB.Mechanical.DuctType)).ToElements(); Autodesk.Revit.DB.Mechanical.DuctType ducttypefinal = null; foreach (Element elemw in collectorductos) { Autodesk.Revit.DB.Mechanical.DuctType duct_type = elemw as Autodesk.Revit.DB.Mechanical.DuctType; System.Diagnostics.Debug.Print(duct_type.Name); Parameter ovaltoround = duct_type.get_Parameter(BuiltInParameter.RBS_CURVETYPE_MULTISHAPE_TRANSITION_OVALROUND_PARAM); Parameter recttooval = duct_type.get_Parameter(BuiltInParameter.RBS_CURVETYPE_MULTISHAPE_TRANSITION_RECTOVAL_PARAM); Parameter recttoround = duct_type.get_Parameter(BuiltInParameter.RBS_CURVETYPE_MULTISHAPE_TRANSITION_PARAM); int val_ovaltoround = ovaltoround.AsElementId().IntegerValue; int val_recttooval = recttooval.AsElementId().IntegerValue; int val_recttoround = recttoround.AsElementId().IntegerValue; System.Diagnostics.Debug.Print("Oval to round:" + val_ovaltoround.ToString()); System.Diagnostics.Debug.Print("Rect to oval:" + val_recttooval.ToString()); System.Diagnostics.Debug.Print("Rect to round:" + val_recttoround.ToString()); //if val_recttoround is -1 the ducttype is OVAL //if val_ovaltoround is -1 the ducttype is RECTANGULAR // if val_recttooval is -1 the ducttyoe is ROUND if (val_ovaltoround == -1) { ducttypefinal = duct_type; break; } } // lineadata = lineasarchivo[0]; string[] datos = lineadata.Split(';'); double x1 = Math.Round(Convert.ToDouble(datos[0]), 6) / 0.3048; double y1 = Math.Round(Convert.ToDouble(datos[1]), 6) / 0.3048; double z1 = Math.Round(Convert.ToDouble(datos[2]), 6) / 0.3048; puntoref_cad = new XYZ(x1, y1, z1); vector_correccion = puntoref_revit - puntoref_cad; XYZ puntoCR = new XYZ(); int Countducts = 0; using (Transaction tr = new Transaction(doc, "DuctFromCAD")) { tr.Start(); for (int ii = 1; ii < lineasarchivo.Length; ii++) { lineadata = lineasarchivo[ii]; datos = lineadata.Split(';'); x1 = Math.Round(Convert.ToDouble(datos[0]), 6) / 0.3048; y1 = Math.Round(Convert.ToDouble(datos[1]), 6) / 0.3048; z1 = Math.Round(Convert.ToDouble(datos[2]), 6) / 0.3048; double x2 = Math.Round(Convert.ToDouble(datos[3]), 6) / 0.3048; double y2 = Math.Round(Convert.ToDouble(datos[4]), 6) / 0.3048; double z2 = Math.Round(Convert.ToDouble(datos[5]), 6) / 0.3048; double ancho = Math.Round(Convert.ToDouble(datos[6]), 3); string dim_ducto = datos[7]; if (dim_ducto != null && dim_ducto != "") { string[] blanksplit = dim_ducto.Split(' '); string[] sizeplit = blanksplit[0].Split('x'); double widthduct = Convert.ToDouble(sizeplit[0]) / 12; //from inches to feet double heightduct = Convert.ToDouble(sizeplit[1]) / 12; //from inches to feet System.Diagnostics.Debug.Print(widthduct.ToString() + "x" + heightduct.ToString()); XYZ p1 = new XYZ(x1, y1, z1) + vector_correccion; XYZ p2 = new XYZ(x2, y2, z2) + vector_correccion; if (p1.DistanceTo(p2) < 1) { continue; } //Not less than a feet try { Autodesk.Revit.DB.Mechanical.Duct new_duct = doc.Create.NewDuct(p1, p2, ducttypefinal); new_duct.get_Parameter(BuiltInParameter.RBS_CURVE_WIDTH_PARAM).Set(widthduct); new_duct.get_Parameter(BuiltInParameter.RBS_CURVE_HEIGHT_PARAM).Set(heightduct); doc.Create.NewTag(currentview, new_duct, false, TagMode.TM_ADDBY_CATEGORY, TagOrientation.TAG_HORIZONTAL, p1.Add(p2).Divide(2)); //doc.Create.NewTextNote(currentview, p1.Add(p2).Divide(2.001), XYZ.BasisX, XYZ.BasisZ, 1, TextAlignFlags.TEF_ALIGN_CENTER, sizeplit[0] + "x" + sizeplit[1]); Countducts++; } catch { } } } tr.Commit(); } MessageBox.Show("Imported " + Countducts.ToString() + " Ducts"); }