public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { ExternalCommandData cdata = commandData; Autodesk.Revit.ApplicationServices.Application app = commandData.Application.Application; Document doc = commandData.Application.ActiveUIDocument.Document; UIDocument uiDoc = commandData.Application.ActiveUIDocument; Transaction trans = new Transaction(doc, "Revit.SDK.Samples.AnalysisVisualizationFramework"); trans.Start(); SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager(doc.ActiveView); if (sfm == null) { sfm = SpatialFieldManager.CreateSpatialFieldManager(doc.ActiveView, 1); } IList <Reference> refList = new List <Reference>(); refList = uiDoc.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Face); foreach (Reference reference in refList) { IList <UV> uvPts = new List <UV>(); List <double> doubleList = new List <double>(); IList <ValueAtPoint> valList = new List <ValueAtPoint>(); Face face = doc.GetElement(reference).GetGeometryObjectFromReference(reference) as Face; BoundingBoxUV bb = face.GetBoundingBox(); UV min = bb.Min; UV max = bb.Max; for (double u = min.U; u < max.U; u += (max.U - min.U) / 10) { for (double v = min.V; v < max.V; v += (max.V - min.V) / 10) { UV uv = new UV(u, v); if (face.IsInside(uv)) { uvPts.Add(uv); doubleList.Add(v + DateTime.Now.Second); valList.Add(new ValueAtPoint(doubleList)); doubleList.Clear(); } } } FieldDomainPointsByUV pnts = new FieldDomainPointsByUV(uvPts); FieldValues vals = new FieldValues(valList); int idx = sfm.AddSpatialFieldPrimitive(reference); AnalysisResultSchema resultSchema = new AnalysisResultSchema("Schema 1", "Schema 1 Description"); sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, sfm.RegisterResult(resultSchema)); } trans.Commit(); return(Result.Succeeded); }
/// <summary> /// Set the spatial field values for the current spatial field primitive. The two /// input sequences should be of the same length. /// </summary> /// <param name="pointLocations"></param> /// <param name="values"></param> private void InternalSetSpatialFieldValues(IEnumerable <XYZ> pointLocations, IEnumerable <double> values) { TransactionManager.Instance.EnsureInTransaction(Document); var chunkSize = 1000; while (pointLocations.Any()) { // Convert the analysis values to a special Revit type var pointLocationChunk = pointLocations.Take(chunkSize).ToList <XYZ>(); var valuesChunk = values.Take(chunkSize).ToList(); var valList = valuesChunk.Select(n => new ValueAtPoint(new List <double> { n })).ToList(); // Convert the sample points to a special Revit Type var samplePts = new FieldDomainPointsByXYZ(pointLocationChunk.ToList <XYZ>()); var sampleValues = new FieldValues(valList); // Get the analysis results schema var schemaIndex = GetAnalysisResultSchemaIndex(); // Update the values var primitiveId = SpatialFieldManager.AddSpatialFieldPrimitive(); primitiveIds.Add(primitiveId); SpatialFieldManager.UpdateSpatialFieldPrimitive(primitiveId, samplePts, sampleValues, schemaIndex); pointLocations = pointLocations.Skip(chunkSize); values = values.Skip(chunkSize); } TransactionManager.Instance.TransactionTaskDone(); }
/// <summary> /// Updating results on the surface being analyzed /// </summary> /// <remarks> /// This is called periodically by the Idling event /// until there is no more results to be updated. /// </remarks> /// <returns> /// Returns True if there is still more to be processed. /// </returns> public bool UpdateResults() { // If we still need to initialize the result manager // it means we were interrupted and we restarted. // Therefore we know we do not have any results to pick up. // Instead, we initialize the manager and start a new calculation. // We will have first results from this new calculation process // next time we get called here. if (m_needInitialization) { Initialize(); return(StartCalculation()); } // We aks the Result instance if there are results available // The methods returns True only if there has been results added // since the last time we called that method. IList <UV> points; IList <ValueAtPoint> values; if (m_results.GetResults(out points, out values)) { FieldDomainPointsByUV fieldPoints = new FieldDomainPointsByUV(points); FieldValues fieldValues = new FieldValues(values); m_SFManager.UpdateSpatialFieldPrimitive(m_fieldId, fieldPoints, fieldValues, m_schemaId); } // if the thread is not around anymore to result more data, // it means the analysis is finished for the FaceAnalyzer too. return((m_threadAgent != null) && (m_threadAgent.IsThreadAlive)); }
public void PaintSolid(Document doc, Solid s, double value) { int schemaId = -1; var rnd = new Random(); View view = doc.ActiveView; using (Transaction transaction = new Transaction(doc)) { if (transaction.Start("Create model curves") == TransactionStatus.Started) { if (view.AnalysisDisplayStyleId == ElementId.InvalidElementId) { CreateAVFDisplayStyle(doc, view); } SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager(view); if (null == sfm) { sfm = SpatialFieldManager.CreateSpatialFieldManager(view, 1); } if (-1 != schemaId) { IList <int> results = sfm.GetRegisteredResults(); if (!results.Contains(schemaId)) { schemaId = -1; } } if (-1 == schemaId) { AnalysisResultSchema resultSchema1 = new AnalysisResultSchema(rnd.Next().ToString(), "Description"); schemaId = sfm.RegisterResult(resultSchema1); } FaceArray faces = s.Faces; Transform trf = Transform.Identity; foreach (Face face in faces) { int idx = sfm.AddSpatialFieldPrimitive(face, trf); IList <UV> uvPts = new List <UV>(); List <double> doubleList = new List <double>(); IList <ValueAtPoint> valList = new List <ValueAtPoint>(); BoundingBoxUV bb = face.GetBoundingBox(); uvPts.Add(bb.Min); doubleList.Add(value); valList.Add(new ValueAtPoint(doubleList)); FieldDomainPointsByUV pnts = new FieldDomainPointsByUV(uvPts); FieldValues vals = new FieldValues(valList); sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, schemaId); } transaction.Commit(); } } }
/// <summary> /// Set the spatial field values for the current spatial field primitive. The two /// input sequences should be of the same length. /// </summary> /// <param name="pointLocations"></param> /// <param name="values"></param> private void InternalSetSpatialFieldValues(PointAnalysisData data, ref List <int> primitiveIds, string schemaName, string description, Type unitType) { var values = data.Results.Values; var height = values.First().Count(); var width = values.Count(); // Transpose and convert the analysis values to a special Revit type var transposedVals = new List <List <double> >(); for (int i = 0; i < height; i++) { var lst = new List <double>() { }; for (int j = 0; j < width; j++) { lst.Add(values.ElementAt(j).ElementAt(i)); } transposedVals.Add(lst); } TransactionManager.Instance.EnsureInTransaction(Document); // We chunk here because the API has a limitation for the // number of points that can be sent in one run. var chunkSize = 1000; var pointLocations = data.CalculationLocations.Select(l => l.ToXyz()); while (pointLocations.Any()) { // Convert the analysis values to a special Revit type var pointLocationChunk = pointLocations.Take(chunkSize).ToList <XYZ>(); var valuesChunk = transposedVals.Take(chunkSize).ToList(); var valList = valuesChunk.Select(n => new ValueAtPoint(n)).ToList(); // Convert the sample points to a special Revit Type var samplePts = new FieldDomainPointsByXYZ(pointLocationChunk.ToList <XYZ>()); var sampleValues = new FieldValues(valList); // Get the analysis results schema var schemaIndex = GetAnalysisResultSchemaIndex(schemaName, description, unitType); // Update the values var primitiveId = SpatialFieldManager.AddSpatialFieldPrimitive(); primitiveIds.Add(primitiveId); SpatialFieldManager.UpdateSpatialFieldPrimitive(primitiveId, samplePts, sampleValues, schemaIndex); pointLocations = pointLocations.Skip(chunkSize); transposedVals = transposedVals.Skip(chunkSize).ToList(); } TransactionManager.Instance.TransactionTaskDone(); }
internal static void ShowSolids(Document doc, IEnumerable <Solid> solids, IEnumerable <double> values) { SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager(doc.ActiveView); if (sfm == null) { sfm = SpatialFieldManager.CreateSpatialFieldManager(doc.ActiveView, 1); } if (_SchemaId != -1) { IList <int> results = sfm.GetRegisteredResults(); if (!results.Contains(_SchemaId)) { _SchemaId = -1; } } if (_SchemaId == -1) { _SchemaId = registerResults(sfm, "ShowChanges", "Description"); } List <double> valueList = values.ToList(); int i = 0; foreach (Solid s in solids) { double value = valueList[i]; i++; FaceArray faces = s.Faces; Transform trf = Transform.Identity; foreach (Face face in faces) { int idx = sfm.AddSpatialFieldPrimitive(face, trf); IList <UV> uvPts = new List <UV>(); List <double> doubleList = new List <double>(); IList <ValueAtPoint> valList = new List <ValueAtPoint>(); BoundingBoxUV bb = face.GetBoundingBox(); uvPts.Add(bb.Min); doubleList.Add(value); valList.Add(new ValueAtPoint(doubleList)); FieldDomainPointsByUV pnts = new FieldDomainPointsByUV(uvPts); FieldValues vals = new FieldValues(valList); sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, _SchemaId); } } updateView(doc.ActiveView, StyleEnum.Faces); }
/// <summary> /// Calculate and paint the attenuation /// values on the given face. /// </summary> public static void PaintFace( Face face, XYZ psource, AttenuationCalculator calc) { IList <UV> uvPts = new List <UV>(); IList <ValueAtPoint> uvValues = new List <ValueAtPoint>(); BoundingBoxUV bb = face.GetBoundingBox(); double umin = bb.Min.U; double umax = bb.Max.U; double ustep = 0.2 * (umax - umin); double vmin = bb.Min.V; double vmax = bb.Max.V; double vstep = 0.2 * (vmax - vmin); List <double> vals = new List <double>(1); vals.Add(0); XYZ psource2 = psource + _z_offset; for (double u = umin; u <= umax; u += ustep) { for (double v = vmin; v <= vmax; v += vstep) { UV uv = new UV(u, v); if (face.IsInside(uv)) { uvPts.Add(uv); XYZ ptarget = face.Evaluate(uv) + _z_offset; vals[0] = calc.Attenuation( psource2, ptarget); uvValues.Add(new ValueAtPoint(vals)); } } } FieldDomainPointsByUV fpts = new FieldDomainPointsByUV(uvPts); FieldValues fvals = new FieldValues(uvValues); _sfm.UpdateSpatialFieldPrimitive( _sfp_index, fpts, fvals, _schemaId); }
public void CreateAnalysisSurface(UIDocument uiDoc, SpatialFieldManager sfm) { var idx = sfm.AddSpatialFieldPrimitive(Reference); var points = new FieldDomainPointsByUV(pointsUV); var fieldValues = new FieldValues(valList); var resultSchema = new AnalysisResultSchema(name, name); var schemaIndex = sfm.RegisterResult(resultSchema); try { sfm.UpdateSpatialFieldPrimitive(idx, points, fieldValues, schemaIndex); } catch { ////FIXME. don't catch nothing... } }
/// <summary> /// Paint solid by AVF /// </summary> /// <param name="solid">Solid to be painted</param> /// <param name="view">The view that shows solid</param> private void PaintSolid(Solid solid, View view) { String viewName = view.Name; SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager(view); if (sfm == null) { sfm = SpatialFieldManager.CreateSpatialFieldManager(view, 1); } if (m_schemaId != -1) { IList <int> results = sfm.GetRegisteredResults(); if (!results.Contains(m_schemaId)) { m_schemaId = -1; } } // set up the display style if (m_schemaId == -1) { AnalysisResultSchema resultSchema1 = new AnalysisResultSchema("PaintedSolid " + viewName, "Description"); AnalysisDisplayStyle displayStyle = AnalysisDisplayStyle.CreateAnalysisDisplayStyle(this.RevitDoc, "Real_Color_Surface" + viewName, new AnalysisDisplayColoredSurfaceSettings(), new AnalysisDisplayColorSettings(), new AnalysisDisplayLegendSettings()); resultSchema1.AnalysisDisplayStyleId = displayStyle.Id; m_schemaId = sfm.RegisterResult(resultSchema1); } // get points of all faces in the solid FaceArray faces = solid.Faces; Transform trf = Transform.Identity; foreach (Face face in faces) { int idx = sfm.AddSpatialFieldPrimitive(face, trf); IList <UV> uvPts = null; IList <ValueAtPoint> valList = null; ComputeValueAtPointForFace(face, out uvPts, out valList, 1); FieldDomainPointsByUV pnts = new FieldDomainPointsByUV(uvPts); FieldValues vals = new FieldValues(valList); sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, m_schemaId); } }
/// <summary> /// This method creates points from the space syntax meta data and maps the cell /// indices value to those points. /// Note: If the provided face was aquired by user selection, the face.Reference is null, /// and the Reference, which is returned by the selection must be passed to this method. /// </summary> /// <param name="doc">the document of the active view</param> /// <param name="spaceSyntax">the object parsed from xml</param> /// <param name="face">the face of the a floor on which it i</param> /// <param name="faceReference">the reference to the face</param> /// <returns>whether the computation succeeded or was</returns> public static void CreateSpaceSyntaxAnalysisResult(Document doc, SpaceSyntax spaceSyntax, Face face, Reference faceReference) { SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager(doc.ActiveView); if (sfm == null) { sfm = SpatialFieldManager.CreateSpatialFieldManager(doc.ActiveView, 1); } var uvPts = new List <UV>(); var doubleList = new List <double>(); var valList = new List <ValueAtPoint>(); // we map u to x and v to y var localOriginInGlobalVector = face.Evaluate(new UV(0.0, 0.0)); var matrixAInverted = CalculateMatrixForGlobalToLocalCoordinateSystem(face); double deltaX = Math.Abs(spaceSyntax.MinX - spaceSyntax.MaxX) / spaceSyntax.DomainColumns; double deltaY = Math.Abs(spaceSyntax.MinY - spaceSyntax.MaxY) / spaceSyntax.DomainRows; double minX = spaceSyntax.MinX + deltaX / 2.0; double minY = spaceSyntax.MinY + deltaY / 2.0; for (double y = minY, i = 1.0; y < spaceSyntax.MaxY; y += deltaY, i += 1.0) { for (double x = minX, j = 1.0; x < spaceSyntax.MaxX; x += deltaX, j += 1.0) { var globalPoint = new XYZ(x, y, 0.0); // z-coordinate is irrelevant, since the UV space is parallel var localUV = GlobalToLocalCoordinate(matrixAInverted, localOriginInGlobalVector, globalPoint); if (face.IsInside(localUV)) { uvPts.Add(localUV); doubleList.Add(GetValueFromSpaceSyntax(spaceSyntax, (int)j, (int)i)); valList.Add(new ValueAtPoint(doubleList)); doubleList.Clear(); } } } var points = new FieldDomainPointsByUV(uvPts); var values = new FieldValues(valList); int index = sfm.AddSpatialFieldPrimitive(faceReference); var resultSchema = CreateResultSchemaWithUnitNames(); sfm.UpdateSpatialFieldPrimitive(index, points, values, sfm.RegisterResult(resultSchema)); }
InternalSetSpatialFieldValues(int primitiveId, ISurfaceData <Autodesk.DesignScript.Geometry.UV, double> data, string schemaName, string description, Type unitType) { // Get the surface reference var reference = data.Surface.Tags.LookupTag(DefaultTag) as Reference; var el = DocumentManager.Instance.CurrentDBDocument.GetElement(reference.ElementId); var pointLocations = new List <UV>(); if (el != null) { var face = el.GetGeometryObjectFromReference(reference) as Autodesk.Revit.DB.Face; if (face != null) { foreach (var loc in data.ValueLocations) { var pt = data.Surface.PointAtParameter(loc.U, loc.V); var faceLoc = face.Project(pt.ToXyz()).UVPoint; pointLocations.Add(faceLoc); } } } var valList = data.Values.Select(v => new ValueAtPoint(new List <double>() { v })); TransactionManager.Instance.EnsureInTransaction(Document); // Convert the analysis values to a special Revit type //var valList = enumerable.Select(n => new ValueAtPoint(n.ToList())).ToList(); var sampleValues = new FieldValues(valList.ToList()); // Convert the sample points to a special Revit Type var samplePts = new FieldDomainPointsByUV(pointLocations.ToList()); // Get the analysis results schema var schemaIndex = GetAnalysisResultSchemaIndex(schemaName, description, unitType); // Update the values SpatialFieldManager.UpdateSpatialFieldPrimitive(primitiveId, samplePts, sampleValues, schemaIndex); TransactionManager.Instance.TransactionTaskDone(); }
public static void PaintSolid(Document doc, Solid solid, double value) { Autodesk.Revit.DB.View view = doc.ActiveView; if (view.AnalysisDisplayStyleId == ElementId.InvalidElementId) { CreateAVFDisplayStyle(doc, view); } SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager(view); if (sfm == null) { sfm = SpatialFieldManager.CreateSpatialFieldManager(view, 1); } sfm.Clear(); IList <int> results = sfm.GetRegisteredResults(); AnalysisResultSchema resultSchema1 = new AnalysisResultSchema("PaintedSolid2", "Description"); int schemaId = sfm.RegisterResult(resultSchema1); foreach (Face face in solid.Faces) { int idx = sfm.AddSpatialFieldPrimitive(face, Transform.Identity); IList <UV> uvPts = new List <UV>(); List <double> doubleList = new List <double>(); IList <ValueAtPoint> valList = new List <ValueAtPoint>(); BoundingBoxUV bb = face.GetBoundingBox(); uvPts.Add(bb.Min); doubleList.Add(value); valList.Add(new ValueAtPoint(doubleList)); FieldDomainPointsByUV pnts = new FieldDomainPointsByUV(uvPts); FieldValues vals = new FieldValues(valList); sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, schemaId); } // UIDocument uidoc = new UIDocument(doc); //uidoc.RefreshActiveView(); }
/// <summary> /// Set the spatial field values for the current spatial field primitive. The two /// input sequences should be of the same length. /// </summary> /// <param name="pointLocations"></param> /// <param name="values"></param> /// <param name="data"></param> /// <param name="primitiveIds"></param> /// <param name="schemaName"></param> /// <param name="description"></param> /// <param name="unitType"></param> private void InternalSetSpatialFieldValues(IStructuredData <Point, double> data, ref List <int> primitiveIds, string schemaName, string description, Type unitType) { TransactionManager.Instance.EnsureInTransaction(Document); // We chunk here because the API has a limitation for the // number of points that can be sent in one run. var chunkSize = 1000; var dataLocations = data.ValueLocations.Select(l => l.ToXyz()); var values = data.Values.ToList(); while (dataLocations.Any()) { // Compute the chunks var pointLocationChunk = dataLocations.Take(chunkSize); var valuesChunk = values.Take(chunkSize).ToList(); // Create the ValueAtPoint objects var valList = valuesChunk.Select(n => new ValueAtPoint(new List <double> { n })); // Create the field domain points and values var samplePts = new FieldDomainPointsByXYZ(pointLocationChunk.ToList()); var sampleValues = new FieldValues(valList.ToList()); // Get the analysis results schema var schemaIndex = GetAnalysisResultSchemaIndex(schemaName, description, unitType); // Update the values var primitiveId = SpatialFieldManager.AddSpatialFieldPrimitive(); primitiveIds.Add(primitiveId); SpatialFieldManager.UpdateSpatialFieldPrimitive(primitiveId, samplePts, sampleValues, schemaIndex); dataLocations = dataLocations.Skip(chunkSize); values = values.Skip(chunkSize).ToList(); } TransactionManager.Instance.TransactionTaskDone(); }
/// <summary> /// Set the spatial field values for the current spatial field primitive. The two /// input sequences should be of the same length. /// </summary> /// <param name="data"></param> /// <param name="schemaName"></param> /// <param name="description"></param> /// <param name="unitType"></param> private void InternalSetSpatialFieldValues(int primitiveId, VectorData data, string schemaName, string description, Type unitType) { var valList = data.Values.Select(v => new VectorAtPoint(new List <XYZ> { v.ToXyz() })); TransactionManager.Instance.EnsureInTransaction(Document); var sampleValues = new FieldValues(valList.ToList()); // Convert the sample points to a special Revit Type var samplePts = new FieldDomainPointsByXYZ(data.ValueLocations.Select(p => p.ToXyz()).ToList()); // Get the analysis results schema var schemaIndex = GetAnalysisResultSchemaIndex(schemaName, description, unitType); // Update the values SpatialFieldManager.UpdateSpatialFieldPrimitive(primitiveId, samplePts, sampleValues, schemaIndex); TransactionManager.Instance.TransactionTaskDone(); }
/// <summary> /// Set the spatial field values for the current spatial field primitive. The two /// input sequences should be of the same length. /// </summary> /// <param name="sampleLocations"></param> /// <param name="samples"></param> private void InternalSetSpatialFieldValues(IEnumerable <XYZ> sampleLocations, IEnumerable <XYZ> samples) { TransactionManager.Instance.EnsureInTransaction(Document); // Convert the analysis values to a special Revit type var valList = samples.Select(n => new VectorAtPoint(new List <XYZ> { n })).ToList(); var sampleValues = new FieldValues(valList); // Convert the sample points to a special Revit Type var samplePts = new FieldDomainPointsByXYZ(sampleLocations.ToList <XYZ>()); // Get the analysis results schema var schemaIndex = GetAnalysisResultSchemaIndex(); // Update the values SpatialFieldManager.UpdateSpatialFieldPrimitive(SpatialFieldPrimitiveId, samplePts, sampleValues, schemaIndex); TransactionManager.Instance.TransactionTaskDone(); }
public static void UpdateCO2eVisualization(SpatialFieldManager sfm, Element element) { try { logger.InfoFormat("Adding CO2e Analysis for element: {0}", element.Name); double CO2eForElement = 0; if (element.ParametersMap.Contains("CO2e")) { CO2eForElement = element.ParametersMap.get_Item("CO2e").AsDouble(); } int count = 0; foreach (Face face in GetFaces(element)) { var idx = sfm.AddSpatialFieldPrimitive(face.Reference); IList<UV> uvPts = new List<UV>(); IList<ValueAtPoint> valList = new List<ValueAtPoint>(); var bb = face.GetBoundingBox(); AddMeasurement(CO2eForElement, bb.Min.U, bb.Min.V, uvPts, valList); AddMeasurement(CO2eForElement, bb.Min.U, bb.Max.V, uvPts, valList); AddMeasurement(CO2eForElement, bb.Max.U, bb.Max.V, uvPts, valList); AddMeasurement(CO2eForElement, bb.Max.U, bb.Min.V, uvPts, valList); logger.DebugFormat("elementId: {0}, face: {1}, spf idx: {2}, bounding box: {3},{4},{5},{6}", element.Id.IntegerValue, count, idx, bb.Min.U, bb.Min.V, bb.Max.U, bb.Max.V); var pnts = new FieldDomainPointsByUV(uvPts); var vals = new FieldValues(valList); var resultSchema1 = new AnalysisResultSchema("CO2e schema", "AMEE CO2e schema"); sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, GetFirstRegisteredResult(sfm, resultSchema1)); count++; } } catch (Exception e) { logger.Error(e); } }
public static void UpdateCO2eVisualization(SpatialFieldManager sfm, Element element) { try { logger.InfoFormat("Adding CO2e Analysis for element: {0}", element.Name); double CO2eForElement = 0; if (element.ParametersMap.Contains("CO2e")) { CO2eForElement = element.ParametersMap.get_Item("CO2e").AsDouble(); } int count = 0; foreach (Face face in GetFaces(element)) { var idx = sfm.AddSpatialFieldPrimitive(face.Reference); IList <UV> uvPts = new List <UV>(); IList <ValueAtPoint> valList = new List <ValueAtPoint>(); var bb = face.GetBoundingBox(); AddMeasurement(CO2eForElement, bb.Min.U, bb.Min.V, uvPts, valList); AddMeasurement(CO2eForElement, bb.Min.U, bb.Max.V, uvPts, valList); AddMeasurement(CO2eForElement, bb.Max.U, bb.Max.V, uvPts, valList); AddMeasurement(CO2eForElement, bb.Max.U, bb.Min.V, uvPts, valList); logger.DebugFormat("elementId: {0}, face: {1}, spf idx: {2}, bounding box: {3},{4},{5},{6}", element.Id.IntegerValue, count, idx, bb.Min.U, bb.Min.V, bb.Max.U, bb.Max.V); var pnts = new FieldDomainPointsByUV(uvPts); var vals = new FieldValues(valList); var resultSchema1 = new AnalysisResultSchema("CO2e schema", "AMEE CO2e schema"); sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, GetFirstRegisteredResult(sfm, resultSchema1)); count++; } } catch (Exception e) { logger.Error(e); } }
/// <summary> /// Set the spatial field values for the current spatial field primitive. The two /// input sequences should be of the same length. /// </summary> /// <param name="sampleLocations"></param> /// <param name="samples"></param> private void InternalSetSpatialFieldValues(int primitiveId, VectorAnalysisData data, string schemaName, string description, Type unitType) { var values = data.Results.Values; var height = values.First().Count(); var width = values.Count(); // Transpose and convert the analysis values to a special Revit type var valList = new List <VectorAtPoint>(); for (int i = 0; i < height; i++) { var lst = new List <XYZ>() { }; for (int j = 0; j < width; j++) { lst.Add(values.ElementAt(j).ElementAt(i).ToXyz()); } valList.Add(new VectorAtPoint(lst)); } TransactionManager.Instance.EnsureInTransaction(Document); var sampleValues = new FieldValues(valList); // Convert the sample points to a special Revit Type var samplePts = new FieldDomainPointsByXYZ(data.CalculationLocations.Select(p => p.ToXyz()).ToList()); // Get the analysis results schema var schemaIndex = GetAnalysisResultSchemaIndex(schemaName, description, unitType); // Update the values SpatialFieldManager.UpdateSpatialFieldPrimitive(primitiveId, samplePts, sampleValues, schemaIndex); TransactionManager.Instance.TransactionTaskDone(); }
/// <summary> /// Paint a solid in a new named view /// </summary> /// <param name="s">solid</param> /// <param name="viewName">Given the name of view</param> public void PaintSolid(Solid s, String viewName) { View view; if (!viewNameList.Contains(viewName)) { view = m_doc.Create.NewView3D(new XYZ(1, 1, 1)); view.Name = viewName; viewNameList.Add(viewName); } else { view = (((new FilteredElementCollector(m_doc). OfClass(typeof(View))).Cast <View>()). Where(e => e.Name == viewName)).First <View>(); } SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager(view); if (sfm == null) { sfm = SpatialFieldManager.CreateSpatialFieldManager(view, 1); } if (SchemaId != -1) { IList <int> results = sfm.GetRegisteredResults(); if (!results.Contains(SchemaId)) { SchemaId = -1; } } if (SchemaId == -1) { AnalysisResultSchema resultSchema1 = new AnalysisResultSchema("PaintedSolid" + viewName, "Description"); AnalysisDisplayStyle displayStyle = AnalysisDisplayStyle.CreateAnalysisDisplayStyle( m_doc, "Real_Color_Surface" + viewName, new AnalysisDisplayColoredSurfaceSettings(), new AnalysisDisplayColorSettings(), new AnalysisDisplayLegendSettings()); resultSchema1.AnalysisDisplayStyleId = displayStyle.Id; SchemaId = sfm.RegisterResult(resultSchema1); } FaceArray faces = s.Faces; Transform trf = Transform.Identity; foreach (Face face in faces) { int idx = sfm.AddSpatialFieldPrimitive(face, trf); IList <UV> uvPts = null; IList <ValueAtPoint> valList = null; ComputeValueAtPointForFace(face, out uvPts, out valList, 1); FieldDomainPointsByUV pnts = new FieldDomainPointsByUV(uvPts); FieldValues vals = new FieldValues(valList); sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, SchemaId); } }
/// <summary> /// The idling callback which adds data to the AVF results. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void UpdateWhileIdling(object sender, IdlingEventArgs e) { UIApplication uiApp = sender as UIApplication; // Get SpatialFieldManager AnalysisResultSchema resultSchema = new AnalysisResultSchema("Schema Name", "Description"); SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager(uiApp.ActiveUIDocument.Document.ActiveView); if (sfm == null) { sfm = SpatialFieldManager.CreateSpatialFieldManager(uiApp.ActiveUIDocument.Document.ActiveView, 1); } int schemaIndex = sfm.RegisterResult(resultSchema); // If stopping, clear results and unset event. if (m_stop) { lock (results) { results.Clear(); } uiApp.Idling -= UpdateWhileIdling; return; } // If document was closed and new document opened, do not run the update. if (uiApp.ActiveUIDocument.Document.PathName == m_docName) { // Lock access to current calculated results lock (results) { if (results.Count == 0) { return; } // Turn each result to an AVF ValueAtPoint foreach (ResultsData rData in results) { uvPts.Add(new UV(rData.UV.U, rData.UV.V)); IList <double> doubleList = new List <double>(); doubleList.Add(rData.Value); valList.Add(new ValueAtPoint(doubleList)); } FieldDomainPointsByUV pntsByUV = new FieldDomainPointsByUV(uvPts); FieldValues fieldValues = new FieldValues(valList); // Update with calculated values Transaction t = new Transaction(uiApp.ActiveUIDocument.Document); t.SetName("AVF"); t.Start(); if (!m_stop) { sfm.UpdateSpatialFieldPrimitive(s_spatialFieldId, pntsByUV, fieldValues, schemaIndex); } t.Commit(); // Clear results already processed. results.Clear(); // If no more results to process, remove the idling event if (m_uvToCalculateCount == 0) { uiApp.Idling -= UpdateWhileIdling; s_oldViewId = s_activeViewId; s_oldSpatialFieldId = s_spatialFieldId; } } } }
internal static void ShowVectors(Document doc, IList <Objects.VectorObject> points, bool scaleVectors) { double viewScale = 12.0 / Convert.ToDouble(doc.ActiveView.Scale); SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager(doc.ActiveView); if (sfm == null) { sfm = SpatialFieldManager.CreateSpatialFieldManager(doc.ActiveView, 1); } if (sfm == null) { throw new System.ApplicationException("SFM still null!"); } sfm.Clear(); // schema if (_SchemaId != -1) { IList <int> results = sfm.GetRegisteredResults(); if (!results.Contains(_SchemaId)) { _SchemaId = -1; } } if (_SchemaId == -1) { _SchemaId = registerResults(sfm, "ShowChanges", "Description"); } IList <VectorAtPoint> valList = new List <VectorAtPoint>(); List <XYZ> dummyList = new List <XYZ>(); dummyList.Add(XYZ.BasisZ); FieldDomainPointsByXYZ pnts = null; FieldValues vals = null; List <XYZ> tmpXYZ = new List <XYZ>(); List <string> tmpNames = new List <String>(); int idx = sfm.AddSpatialFieldPrimitive(); int localPointCount = 0; int max = points.Count; for (int i = 0; i < max; i++) { tmpXYZ.Add(points[i].Origin); if (scaleVectors) { dummyList[0] = points[i].Vector.Multiply(viewScale); } else { dummyList[0] = points[i].Vector; } valList.Add(new VectorAtPoint(dummyList)); if (localPointCount > MAX_POINTS_PER_PRIMITIVE) { pnts = new FieldDomainPointsByXYZ(tmpXYZ); vals = new FieldValues(valList); sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, _SchemaId); // create a new primitive idx = sfm.AddSpatialFieldPrimitive(); // reset localPointCount = 0; tmpXYZ = new List <XYZ>(); valList = new List <VectorAtPoint>(); } localPointCount++; } // do it one more time if there are leftovers if (tmpXYZ.Count > 0) { pnts = new FieldDomainPointsByXYZ(tmpXYZ); vals = new FieldValues(valList); sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, _SchemaId); } updateView(doc.ActiveView, StyleEnum.Vectors); }
//Display on the floor private bool MeasureDistanceOnFloor() { bool result = false; try { //find walls located inside the selected rooms FindWallFacesOnFloor(); //Find point of view from the sphere element if (null != sphere) { LocationPoint location = sphere.Location as LocationPoint; XYZ pointXYZ = location.Point; int resultIndex = FindIndexOfResult(sfm); bool firstLoop = true; foreach (int floorId in floorFaces.Keys) { Face floorFace = floorFaces[floorId]; XYZ vectorZ = new XYZ(0, 0, 1); #if RELEASE2013 Transform transform = Transform.get_Translation(vectorZ); #else Transform transform = Transform.CreateTranslation(vectorZ); #endif int index = sfm.AddSpatialFieldPrimitive(floorFace, transform); List <double> doubleList = new List <double>(); IList <UV> uvPoints = new List <UV>(); IList <ValueAtPoint> valList = new List <ValueAtPoint>(); BoundingBoxUV bb = floorFace.GetBoundingBox(); for (double u = bb.Min.U; u < bb.Max.U; u = u + (bb.Max.U - bb.Min.U) / 30) { for (double v = bb.Min.V; v < bb.Max.V; v = v + (bb.Max.V - bb.Min.V) / 30) { UV uvPoint = new UV(u, v); uvPoints.Add(uvPoint); XYZ faceXYZ = floorFace.Evaluate(uvPoint); #if RELEASE2013 Line line = doc.Application.Create.NewLine(pointXYZ, faceXYZ, true); #else Line line = Line.CreateBound(pointXYZ, faceXYZ); #endif double dblValue = 1; IntersectionResultArray resultArray; foreach (int wallId in wallFaces.Keys) { Face wallFace = wallFaces[wallId]; SetComparisonResult compResult = wallFace.Intersect(line, out resultArray); //if intersects with walls the level of visibility will have negative values if (compResult == SetComparisonResult.Overlap && null != resultArray) { if (dblValue > 0) { dblValue = 0 - resultArray.Size; } else { dblValue = dblValue - resultArray.Size; } } } doubleList.Add(dblValue); valList.Add(new ValueAtPoint(doubleList)); doubleList.Clear(); } progressBar.PerformStep(); } FieldDomainPointsByUV domainPoints = new FieldDomainPointsByUV(uvPoints); FieldValues values = new FieldValues(valList); AnalysisResultSchema resultSchema = new AnalysisResultSchema(settings.LegendTitle, settings.LegendDescription); resultSchema.SetUnits(unitNames, multipliers); if (unitNames.Contains(settings.Units)) { resultSchema.CurrentUnits = unitNames.IndexOf(settings.Units); } if (overwriteResult) { sfm.SetResultSchema(resultIndex, resultSchema); } else if (firstLoop) { resultIndex = sfm.RegisterResult(resultSchema); firstLoop = false; } else { sfm.SetResultSchema(resultIndex, resultSchema); } sfm.UpdateSpatialFieldPrimitive(index, domainPoints, values, resultIndex); } } } catch (Exception ex) { MessageBox.Show("Failed to measure distance from the point element to the points on floor face.\n" + ex.Message, "FieldOfViewAnalysis:MeasureDistanceOnFloor", MessageBoxButtons.OK, MessageBoxIcon.Warning); result = false; } return(result); }
public void Execute(UpdaterData data) { Document doc = data.GetDocument(); Autodesk.Revit.ApplicationServices.Application app = doc.Application; View view = doc.GetElement(viewID) as View; FamilyInstance sphere = doc.GetElement(sphereID) as FamilyInstance; LocationPoint sphereLP = sphere.Location as LocationPoint; XYZ sphereXYZ = sphereLP.Point; SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager(view); if (sfm == null) { sfm = SpatialFieldManager.CreateSpatialFieldManager(view, 3); // Three measurement values for each point } sfm.Clear(); FilteredElementCollector collector = new FilteredElementCollector(doc, view.Id); ElementCategoryFilter wallFilter = new ElementCategoryFilter(BuiltInCategory.OST_Walls); ElementCategoryFilter massFilter = new ElementCategoryFilter(BuiltInCategory.OST_Mass); LogicalOrFilter filter = new LogicalOrFilter(wallFilter, massFilter); ICollection <Element> elements = collector.WherePasses(filter).WhereElementIsNotElementType().ToElements(); foreach (Face face in GetFaces(elements)) { int idx = sfm.AddSpatialFieldPrimitive(face.Reference); List <double> doubleList = new List <double>(); IList <UV> uvPts = new List <UV>(); IList <ValueAtPoint> valList = new List <ValueAtPoint>(); BoundingBoxUV bb = face.GetBoundingBox(); for (double u = bb.Min.U; u < bb.Max.U; u = u + (bb.Max.U - bb.Min.U) / 15) { for (double v = bb.Min.V; v < bb.Max.V; v = v + (bb.Max.V - bb.Min.V) / 15) { UV uvPnt = new UV(u, v); uvPts.Add(uvPnt); XYZ faceXYZ = face.Evaluate(uvPnt); // Specify three values for each point doubleList.Add(faceXYZ.DistanceTo(sphereXYZ)); doubleList.Add(-faceXYZ.DistanceTo(sphereXYZ)); doubleList.Add(faceXYZ.DistanceTo(sphereXYZ) * 10); valList.Add(new ValueAtPoint(doubleList)); doubleList.Clear(); } } FieldDomainPointsByUV pnts = new FieldDomainPointsByUV(uvPts); FieldValues vals = new FieldValues(valList); AnalysisResultSchema resultSchema1 = new AnalysisResultSchema("Schema 1", "Schema 1 Description"); IList <int> registeredResults = new List <int>(); registeredResults = sfm.GetRegisteredResults(); int idx1 = 0; if (registeredResults.Count == 0) { idx1 = sfm.RegisterResult(resultSchema1); } else { idx1 = registeredResults.First(); } sfm.UpdateSpatialFieldPrimitive(idx, pnts, vals, idx1); } }
/// <summary> /// Handle Revit Idling event. /// Return immediately if less time elapsed than /// specified interval. /// Otherwise, download the current image file /// from the specified URL. /// If it has not changed since the last update, /// return immediately. /// Otherwise, update the spatial field primitive /// with the new image data. /// Currently, we only display a grey scale image. /// Colour images could be handled as well by /// defining a custom colour palette. /// </summary> static void OnIdling( object sender, IdlingEventArgs e) { if (DateTime.Now.Subtract(_lastUpdate) > _interval) { Log("OnIdling"); GreyscaleBitmapData data = new GreyscaleBitmapData( _width, _height, _url); byte[] hash = data.HashValue; if (null == _lastHash || 0 != CompareBytes(hash, _lastHash)) { _lastHash = hash; // access active document from sender: // Support both 2011, where sender is an // Application instance, and 2012, where // it is a UIApplication instance: UIApplication uiapp = sender is UIApplication ? sender as UIApplication // 2012 : new UIApplication( sender as Application); // 2011 Debug.Assert(null != uiapp, "expected a valid Revit UIApplication instance"); UIDocument uidoc = uiapp.ActiveUIDocument; Document doc = uidoc.Document; Log("OnIdling image changed, active document " + doc.Title); Transaction transaction = new Transaction(doc, "Revit Webcam Update"); transaction.Start(); View view = doc.ActiveView; // maybe has to be 3D SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager( view); if (null == sfm) { sfm = SpatialFieldManager .CreateSpatialFieldManager(view, 1); } if (0 > _sfp_index) { _sfp_index = sfm.AddSpatialFieldPrimitive( _faceReference); } int nPoints = data.Width * data.Height; IList <UV> pts = new List <UV>(nPoints); IList <ValueAtPoint> valuesAtPoints = new List <ValueAtPoint>(nPoints); // warning CS0618: // GeometryObject is obsolete: Property will be removed. // Use Element.GetGeometryObjectFromReference(Reference) instead //Face face = _faceReference.GeometryObject as Face; // 2011 //Face face = doc.get_Element( _elementId ) // .GetGeometryObjectFromReference( // _faceReference ) as Face; // 2012 // warning CS0618: // Autodesk.Revit.DB.Document.get_Element(Autodesk.Revit.DB.ElementId) is obsolete: // This method has been obsoleted. Use GetElement() instead. //Element eFace = doc.get_Element( _elementId ); // 2012 Element eFace = doc.GetElement(_elementId); // 2013 Face face = eFace.GetGeometryObjectFromReference( _faceReference) as Face; // 2012 GetFieldPointsAndValues(ref pts, ref valuesAtPoints, ref data, face); FieldDomainPointsByUV fieldPoints = new FieldDomainPointsByUV(pts); FieldValues fieldValues = new FieldValues(valuesAtPoints); int result_index; IList <int> registeredResults = sfm.GetRegisteredResults(); if (0 == registeredResults.Count) { AnalysisResultSchema resultSchema = new AnalysisResultSchema( "Schema 1", "Schema 1 Description"); result_index = sfm.RegisterResult( resultSchema); } else { result_index = registeredResults.First(); } // warning CS0618: // UpdateSpatialFieldPrimitive(int, FieldDomainPoints, FieldValues) is obsolete: // This method is obsolete in Revit 2012; use the overload accepting the result index instead. //sfm.UpdateSpatialFieldPrimitive( // _sfp_index, fieldPoints, fieldValues ); // 2011 sfm.UpdateSpatialFieldPrimitive( _sfp_index, fieldPoints, fieldValues, result_index); // 2012 doc.Regenerate(); transaction.Commit(); _lastUpdate = DateTime.Now; } } }
public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { ExternalCommandData cdata = commandData; Autodesk.Revit.ApplicationServices.Application app = commandData.Application.Application; Document doc = commandData.Application.ActiveUIDocument.Document; UIDocument uiDoc = commandData.Application.ActiveUIDocument; SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager(doc.ActiveView); if (sfm == null) { sfm = SpatialFieldManager.CreateSpatialFieldManager(doc.ActiveView, 1); } IList <Reference> refList = new List <Reference>(); try { refList = uiDoc.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Face); } catch (Exception) { // throw; } foreach (Reference reference in refList) { IList <UV> uvPts = new List <UV>(); //List<double> doubleList = new List<double>(); IList <ValueAtPoint> valList = new List <ValueAtPoint>(); Face face = doc.GetElement(reference).GetGeometryObjectFromReference(reference) as Face; BoundingBoxUV bb = face.GetBoundingBox(); UV min = bb.Min; UV max = bb.Max; uvPts.Add(min); uvPts.Add(max); valList.Add(new ValueAtPoint(new List <double>() { 0 })); valList.Add(new ValueAtPoint(new List <double>() { 0 })); /* * for (double u = min.U; u < max.U; u += (max.U - min.U) / 10) * { * for (double v = min.V; v < max.V; v += (max.V - min.V) / 10) * { * UV uv = new UV(u, v); * if (face.IsInside(uv)) * { * uvPts.Add(uv); * doubleList.Add(0); * valList.Add(new ValueAtPoint(doubleList)); * doubleList.Clear(); * } * } * }*/ //FieldDomainPointsByUV pnts = new FieldDomainPointsByUV(uvPts); var points = new FieldDomainPointsByXYZ(new List <XYZ>() { new XYZ(0, 0, 0), new XYZ(0, 0, 10) }); FieldValues vals = new FieldValues(valList); int idx = sfm.AddSpatialFieldPrimitive(reference); AnalysisResultSchema resultSchema = new AnalysisResultSchema("Schema 1", "Schema 1 Description"); sfm.UpdateSpatialFieldPrimitive(idx, points, vals, sfm.RegisterResult(resultSchema)); } return(Result.Succeeded); }
private RoomData FindVisibility(RoomData rd, ProgressBar progressBar) { RoomData updatedData = new RoomData(rd); try { LogicalOrFilter orFilter = new LogicalOrFilter(categoryFilters); ReferenceIntersector intersector = null; intersector = new ReferenceIntersector(orFilter, FindReferenceTarget.Face, m_view); intersector.FindReferencesInRevitLinks = true; Face face = rd.RoomFace; BoundingBoxUV bb = face.GetBoundingBox(); IList <UV> uvPoints = new List <UV>(); IList <ValueAtPoint> valList = new List <ValueAtPoint>(); List <PointData> pointDataList = new List <PointData>(); double interval = analysisSettings.Interval; List <double> uList = new List <double>(); List <double> vList = new List <double>(); GetUVArray(bb, interval, out uList, out vList); progressBar.Value = 0; progressBar.Minimum = 0; progressBar.Maximum = uList.Count * vList.Count; UpdateProgressDelegate updateProgressDelegate = new UpdateProgressDelegate(progressBar.SetValue); List <XYZ> exteriorPoints = new List <XYZ>(); List <XYZ> interiorPoints = new List <XYZ>(); bool sorted = SortViewPoints(rd.BoundarySegments, out exteriorPoints, out interiorPoints); int visibleCount = 0; double progressValue = 0; foreach (double u in uList) //start from in the middle of grid { foreach (double v in vList) { if (AbortFlag.GetAbortFlag()) { return(updatedData); } Dispatcher.CurrentDispatcher.Invoke(updateProgressDelegate, System.Windows.Threading.DispatcherPriority.Background, new object[] { ProgressBar.ValueProperty, progressValue }); UV uvPoint = new UV(u, v); if (face.IsInside(uvPoint)) { XYZ evalPoint = face.Evaluate(uvPoint); XYZ xyzPoint = new XYZ(evalPoint.X, evalPoint.Y, evalPoint.Z + offsetHeight); //4.2 inches above from the floor double pointValue = 0; List <XYZ> viewPoints = new List <XYZ>(); if (exteriorPoints.Count > 0) { exteriorPoints = exteriorPoints.OrderBy(o => o.DistanceTo(xyzPoint)).ToList(); viewPoints.AddRange(exteriorPoints); } if (interiorPoints.Count > 0) { interiorPoints = interiorPoints.OrderBy(o => o.DistanceTo(xyzPoint)).ToList(); viewPoints.AddRange(interiorPoints); } if (viewPoints.Count > 0) { bool visible = CheckVisibilityByMaterial(intersector, xyzPoint, viewPoints); if (visible) { pointValue = 1; visibleCount++; } else { pointValue = 0; } } PointData pData = new PointData(uvPoint, xyzPoint, pointValue); pointDataList.Add(pData); uvPoints.Add(pData.UVPoint); valList.Add(pData.ValueAtPoint); } progressValue++; } } rd.PointDataList = pointDataList; double ratio = (double)visibleCount / (double)uvPoints.Count; rd.VisiblityRatio = ratio; rd.AreaWithViews = rd.RoomArea * ratio; rd.SetResultParameterValue(LEEDParameters.LEED_AreaWithViews.ToString(), rd.AreaWithViews); //visualize Transform transform = Transform.CreateTranslation(new XYZ(0, 0, offsetHeight)); int index = m_sfm.AddSpatialFieldPrimitive(face, transform); FieldDomainPointsByUV domainPoints = new FieldDomainPointsByUV(uvPoints); FieldValues values = new FieldValues(valList); m_sfm.UpdateSpatialFieldPrimitive(index, domainPoints, values, resultIndex); } catch (Exception ex) { MessageBox.Show("Failed to find visibility.\n" + ex.Message, "Find Visibility", MessageBoxButton.OK, MessageBoxImage.Warning); } return(updatedData); }
public bool AnalysisByElements() { bool result = false; try { if (areaDictionary.Count > 0) { int resultIndex = FindIndexOfResult(sfm); bool firstLoop = true; foreach (int areaId in areaDictionary.Keys) { AreaProperties ap = areaDictionary[areaId]; List <double> dblList = new List <double>(); //double values to be displayed on the face. Face face = ap.BaseFace; dblList.Add(ap.FAR); if (dblList.Count != sfm.NumberOfMeasurements) { continue; } int index = sfm.AddSpatialFieldPrimitive(face, Transform.Identity); IList <UV> uvPts = new List <UV>(); IList <ValueAtPoint> valList = new List <ValueAtPoint>(); BoundingBoxUV bb = face.GetBoundingBox(); UV faceCenter = (bb.Min + bb.Max) / 2; //only collect a center point. uvPts.Add(faceCenter); valList.Add(new ValueAtPoint(dblList)); //dblList.Clear(); FieldDomainPointsByUV domainPoints = new FieldDomainPointsByUV(uvPts); FieldValues values = new FieldValues(valList); AnalysisResultSchema resultSchema = new AnalysisResultSchema(settings.LegendTitle, settings.LegendDescription); resultSchema.SetUnits(unitNames, multipliers); if (unitNames.Contains(settings.Units)) { resultSchema.CurrentUnits = unitNames.IndexOf(settings.Units); } if (overwriteResult) { sfm.SetResultSchema(resultIndex, resultSchema); } else if (firstLoop) { resultIndex = sfm.RegisterResult(resultSchema); firstLoop = false; } else { sfm.SetResultSchema(resultIndex, resultSchema); } sfm.UpdateSpatialFieldPrimitive(index, domainPoints, values, resultIndex); } SetCurrentStyle(); result = true; } } catch (Exception ex) { MessageBox.Show("Failed to visulaize the FAR data. \n" + ex.Message, "FARCalculator : AnalysisByElements", MessageBoxButtons.OK, MessageBoxIcon.Warning); } return(result); }
/// <summary> /// Handle Revit Idling event. /// If less time elapsed than the specified interval, return immediately. /// Otherwise, download the current image frile from the specified URL. /// If it has not changed since the last update, return immediately. /// Otherwise, update the spatial field primitive with the new image data. /// Currently, we only display a grey scale image. /// Colour images could be handled as well by defining a custom colour palette. /// </summary> static void OnIdling( object sender, IdlingEventArgs e) { if (DateTime.Now.Subtract(_lastUpdate) > _interval) { Log("OnIdling"); GreyscaleBitmapData data = new GreyscaleBitmapData( _width, _height, _url); byte[] hash = data.HashValue; if (null == _lastHash || 0 != CompareBytes(hash, _lastHash)) { _lastHash = hash; // access active document from sender: Application app = sender as Application; Debug.Assert(null != app, "expected a valid Revit application instance"); UIApplication uiapp = new UIApplication(app); UIDocument uidoc = uiapp.ActiveUIDocument; Document doc = uidoc.Document; Log("OnIdling image changed, active document " + doc.Title); Transaction transaction = new Transaction(doc, "Revit Webcam Update"); transaction.Start(); View view = doc.ActiveView; // maybe has to be 3D SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager( view); if (null == sfm) { sfm = SpatialFieldManager .CreateSpatialFieldManager(view, 1); } if (0 > _sfp_index) { _sfp_index = sfm.AddSpatialFieldPrimitive( _faceReference); } int nPoints = data.Width * data.Height; IList <UV> pts = new List <UV>(nPoints); IList <ValueAtPoint> valuesAtPoints = new List <ValueAtPoint>(nPoints); // warning CS0618: // GeometryObject is obsolete: Property will be removed. // Use Element.GetGeometryObjectFromReference(Reference) instead //Face face = _faceReference.GeometryObject as Face; // 2011 Face face = doc.get_Element(_elementId) .GetGeometryObjectFromReference( _faceReference) as Face; // 2012 GetFieldPointsAndValues(ref pts, ref valuesAtPoints, ref data, face); FieldDomainPointsByUV fieldPoints = new FieldDomainPointsByUV(pts); FieldValues fieldValues = new FieldValues(valuesAtPoints); // warning CS0618: // UpdateSpatialFieldPrimitive(int, FieldDomainPoints, FieldValues) is obsolete: // This method is obsolete in Revit 2012; use the overload accepting the result index instead. //sfm.UpdateSpatialFieldPrimitive( // _sfp_index, fieldPoints, fieldValues ); // 2011 sfm.UpdateSpatialFieldPrimitive( _sfp_index, fieldPoints, fieldValues, _sfp_index); // 2012 doc.Regenerate(); transaction.Commit(); _lastUpdate = DateTime.Now; } } }
public bool AnalysisByElements() { bool result = false; try { if (radianceDictionary.Count > 0) { int resultIndex = FindIndexOfResult(sfm); bool firstLoop = true; int index = sfm.AddSpatialFieldPrimitive();//not associated with any geometry IList <XYZ> xyzPoints = new List <XYZ>(); IList <ValueAtPoint> valList = new List <ValueAtPoint>(); foreach (int keyIndex in radianceDictionary.Keys) { RadianceResult rr = radianceDictionary[keyIndex]; List <double> dblList = new List <double>(); //double values to be displayed on the face. dblList.Add(rr.Value1); dblList.Add(rr.Value2); dblList.Add(rr.Value3); if (dblList.Count != sfm.NumberOfMeasurements) { continue; } xyzPoints.Add(rr.PointXYZ); valList.Add(new ValueAtPoint(dblList)); //dblList.Clear(); } FieldDomainPointsByXYZ domainPoints = new FieldDomainPointsByXYZ(xyzPoints); FieldValues values = new FieldValues(valList); AnalysisResultSchema resultSchema = new AnalysisResultSchema(settings.LegendTitle, settings.LegendDescription); resultSchema.SetUnits(unitNames, multipliers); if (unitNames.Contains(settings.Units)) { resultSchema.CurrentUnits = unitNames.IndexOf(settings.Units); } if (overwriteResult) { sfm.SetResultSchema(resultIndex, resultSchema); } else if (firstLoop) { resultIndex = sfm.RegisterResult(resultSchema); firstLoop = false; } else { sfm.SetResultSchema(resultIndex, resultSchema); } sfm.UpdateSpatialFieldPrimitive(index, domainPoints, values, resultIndex); SetCurrentStyle(); result = true; } } catch (Exception ex) { MessageBox.Show("Failed to visulaize the FAR data. \n" + ex.Message, "FARCalculator : AnalysisByElements", MessageBoxButtons.OK, MessageBoxIcon.Warning); } return(result); }
private RoomData FindVisibilityByPointData(RoomData rd, AnalysisData aData, ProgressBar progressBar) { RoomData updatedData = new RoomData(rd); try { updatedData.RoomFace = FMEDataUtil.CreateFacebyFMEData(aData.RoomFace); if (null != updatedData.RoomFace) { updatedData.PointDataList = FMEDataUtil.ConvertToPointDataList(updatedData.RoomFace, aData.PointValues); IList <UV> uvPoints = new List <UV>(); IList <ValueAtPoint> valList = new List <ValueAtPoint>(); progressBar.Value = 0; progressBar.Minimum = 0; progressBar.Maximum = updatedData.PointDataList.Count; UpdateProgressDelegate updateProgressDelegate = new UpdateProgressDelegate(progressBar.SetValue); int visibleCount = 0; double progressValue = 0; foreach (PointData ptData in updatedData.PointDataList) { if (AbortFlag.GetAbortFlag()) { return(updatedData); } Dispatcher.CurrentDispatcher.Invoke(updateProgressDelegate, System.Windows.Threading.DispatcherPriority.Background, new object[] { ProgressBar.ValueProperty, progressValue }); if (null != ptData.UVPoint && null != ptData.ValueAtPoint) { uvPoints.Add(ptData.UVPoint); valList.Add(ptData.ValueAtPoint); if (ptData.PointValue > 0) { visibleCount++; } } progressValue++; } double ratio = (double)visibleCount / (double)uvPoints.Count; updatedData.VisiblityRatio = ratio; updatedData.AreaWithViews = rd.RoomArea * ratio; updatedData.SetResultParameterValue(LEEDParameters.LEED_AreaWithViews.ToString(), rd.AreaWithViews); //visualize Transform transform = Transform.CreateTranslation(new XYZ(0, 0, offsetHeight)); int index = m_sfm.AddSpatialFieldPrimitive(updatedData.RoomFace, transform); FieldDomainPointsByUV domainPoints = new FieldDomainPointsByUV(uvPoints); FieldValues values = new FieldValues(valList); m_sfm.UpdateSpatialFieldPrimitive(index, domainPoints, values, resultIndex); } } catch (Exception ex) { MessageBox.Show("Failed to find visibility.\n" + ex.Message, "Find Visibility", MessageBoxButton.OK, MessageBoxImage.Warning); } return(updatedData); }
/// <summary> /// Handle Revit Idling event. /// If less time elapsed than the specified interval, return immediately. /// Otherwise, download the current image frile from the specified URL. /// If it has not changed since the last update, return immediately. /// Otherwise, update the spatial field primitive with the new image data. /// Currently, we only display a grey scale image. /// Colour images could be handled as well by defining a custom colour palette. /// </summary> static void OnIdling( object sender, IdlingEventArgs e) { if (DateTime.Now.Subtract(_lastUpdate) > _interval) { Log("OnIdling"); GreyscaleBitmapData data = new GreyscaleBitmapData( _width, _height, _url); byte[] hash = data.HashValue; if (null == _lastHash || 0 != CompareBytes(hash, _lastHash)) { _lastHash = hash; // access active document from sender: Application app = sender as Application; Debug.Assert(null != app, "expected a valid Revit application instance"); UIApplication uiapp = new UIApplication(app); UIDocument uidoc = uiapp.ActiveUIDocument; Document doc = uidoc.Document; Log("OnIdling image changed, active document " + doc.Title); Transaction transaction = new Transaction(doc, "Revit Webcam Update"); transaction.Start(); View view = doc.ActiveView; // maybe has to be 3D SpatialFieldManager sfm = SpatialFieldManager.GetSpatialFieldManager( view); if (null == sfm) { sfm = SpatialFieldManager .CreateSpatialFieldManager(view, 1); } if (0 > _sfp_index) { _sfp_index = sfm.AddSpatialFieldPrimitive( _faceReference); } int nPoints = data.Width * data.Height; IList <UV> pts = new List <UV>(nPoints); IList <ValueAtPoint> valuesAtPoints = new List <ValueAtPoint>(nPoints); Face face = _faceReference.GeometryObject as Face; GetFieldPointsAndValues(ref pts, ref valuesAtPoints, ref data, face); FieldDomainPointsByUV fieldPoints = new FieldDomainPointsByUV(pts); FieldValues fieldValues = new FieldValues(valuesAtPoints); sfm.UpdateSpatialFieldPrimitive( _sfp_index, fieldPoints, fieldValues); doc.Regenerate(); transaction.Commit(); _lastUpdate = DateTime.Now; } } }