public static ElementDescription ( Element e ) : string | ||
e | Element | |
return | string |
/// <summary> /// List all the loops retrieved /// from the given element. /// </summary> static void ListLoops(Element e, JtLoops loops) { int nLoops = loops.Count; Debug.Print("{0} has {1}{2}", Util.ElementDescription(e), Util.PluralString(nLoops, "loop"), Util.DotOrColon(nLoops)); int i = 0; foreach (JtLoop loop in loops) { Debug.Print(" {0}: {1}", i++, loop.ToString()); } }
static DbModel GetDbModel( CouchDatabase db, Element projectInfo) { string uid = projectInfo.UniqueId; DbModel dbModel; if (db.DocumentExists(uid)) { dbModel = db.GetDocument <DbModel>(uid); Debug.Assert( dbModel.Id.Equals(projectInfo.UniqueId), "expected equal ids"); dbModel.Description = Util.ElementDescription( projectInfo); dbModel.Name = projectInfo.Document.Title; dbModel = db.UpdateDocument <DbModel>( dbModel); } else { dbModel = new DbModel(uid); dbModel.Description = Util.ElementDescription( projectInfo); dbModel.Name = projectInfo.Name; dbModel = db.CreateDocument <DbModel>(dbModel); } return(dbModel); }
/// <summary> /// Upload the selected rooms and the furniture /// they contain to the cloud database. /// </summary> public static void UploadRoom( Document doc, Room room) { BoundingBoxXYZ bb = room.get_BoundingBox(null); if (null == bb) { Util.ErrorMsg(string.Format("Skipping room {0} " + "because it has no bounding box.", Util.ElementDescription(room))); return; } JtLoops roomLoops = GetRoomLoops(room); ListLoops(room, roomLoops); List <Element> furniture = GetFurniture(room); // Map symbol UniqueId to symbol loop Dictionary <string, JtLoop> furnitureLoops = new Dictionary <string, JtLoop>(); // List of instances referring to symbols List <JtPlacement2dInt> furnitureInstances = new List <JtPlacement2dInt>( furniture.Count); int nFailures; foreach (FamilyInstance f in furniture) { FamilySymbol s = f.Symbol; string uid = s.UniqueId; if (!furnitureLoops.ContainsKey(uid)) { nFailures = 0; JtLoops loops = GetPlanViewBoundaryLoops( f, ref nFailures); if (0 < nFailures) { Debug.Print("{0}: {1}", Util.ElementDescription(f), Util.PluralString(nFailures, "extrusion analyser failure")); } ListLoops(f, loops); if (0 < loops.Count) { // Assume first loop is outer one furnitureLoops.Add(uid, loops[0]); } } furnitureInstances.Add( new JtPlacement2dInt(f)); } IWin32Window revit_window = new JtWindowHandle( ComponentManager.ApplicationWindow); string caption = doc.Title + " : " + doc.GetElement(room.LevelId).Name + " : " + room.Name; Bitmap bmp = GeoSnoop.DisplayRoom(roomLoops, furnitureLoops, furnitureInstances); GeoSnoop.DisplayImageInForm(revit_window, caption, false, bmp); DbUpload.DbUploadRoom(room, furniture, roomLoops, furnitureLoops); }
/// <summary> /// Retrieve all plan view boundary loops from /// all solids of given element united together. /// If the element is a family instance, transform /// its loops from the instance placement /// coordinate system back to the symbol /// definition one. /// If no geometry can be determined, use the /// bounding box instead. /// </summary> static JtLoops GetPlanViewBoundaryLoops( Element e, ref int nFailures) { Autodesk.Revit.Creation.Application creapp = e.Document.Application.Create; JtLoops loops = null; Options opt = new Options(); GeometryElement geo = e.get_Geometry(opt); if (null != geo) { Document doc = e.Document; if (e is FamilyInstance) { // Retrieve family instance geometry // transformed back to symbol definition // coordinate space by inverting the // family instance placement transformation LocationPoint lp = e.Location as LocationPoint; Transform t = Transform.CreateTranslation( -lp.Point); Transform r = Transform.CreateRotationAtPoint( XYZ.BasisZ, -lp.Rotation, lp.Point); geo = geo.GetTransformed(t * r); } loops = GetPlanViewBoundaryLoopsGeo( creapp, geo, ref nFailures); } if (null == loops || 0 == loops.Count) { Debug.Print( "Unable to determine geometry for " + Util.ElementDescription(e) + "; using bounding box instead."); BoundingBoxXYZ bb; if (e is FamilyInstance) { bb = (e as FamilyInstance).Symbol .get_BoundingBox(null); } else { bb = e.get_BoundingBox(null); } JtLoop loop = new JtLoop(4); loop.Add(new Point2dInt(bb.Min)); loop.Add(new Point2dInt(bb.Max.X, bb.Min.Y)); loop.Add(new Point2dInt(bb.Max)); loop.Add(new Point2dInt(bb.Min.X, bb.Max.Y)); loops.Add(loop); } return(loops); }
/// <summary> /// Upload model, level, room and furniture data /// to an IrisCouch hosted CouchDB data repository. /// </summary> static public void DbUploadRoom( Room room, List <Element> furniture, JtLoops roomLoops, Dictionary <string, JtLoop> furnitureLoops) { CouchDatabase db = new RoomEditorDb().Db; Document doc = room.Document; Element projectInfo = GetProjectInfo(doc); DbModel dbModel = GetDbModel(db, projectInfo); Element level = doc.GetElement(room.LevelId); string uid = level.UniqueId; DbLevel dbLevel; if (db.DocumentExists(uid)) { dbLevel = db.GetDocument <DbLevel>(uid); Debug.Assert( dbLevel.Id.Equals(level.UniqueId), "expected equal ids"); dbLevel.Description = Util.ElementDescription( level); dbLevel.Name = level.Name; dbLevel.ModelId = projectInfo.UniqueId; dbLevel = db.UpdateDocument <DbLevel>( dbLevel); } else { dbLevel = new DbLevel(uid); dbLevel.Description = Util.ElementDescription( level); dbLevel.Name = level.Name; dbLevel.ModelId = projectInfo.UniqueId; dbLevel = db.CreateDocument <DbLevel>( dbLevel); } uid = room.UniqueId; DbRoom dbRoom; if (db.DocumentExists(uid)) { dbRoom = db.GetDocument <DbRoom>(uid); Debug.Assert( dbRoom.Id.Equals(room.UniqueId), "expected equal ids"); dbRoom.Description = Util.ElementDescription( room); dbRoom.Name = room.Name; dbRoom.LevelId = level.UniqueId; dbRoom.Loops = roomLoops.SvgPath; dbRoom.ViewBox = roomLoops.BoundingBox.SvgViewBox; dbRoom = db.UpdateDocument <DbRoom>(dbRoom); } else { dbRoom = new DbRoom(uid); dbRoom.Description = Util.ElementDescription( room); dbRoom.Name = room.Name; dbRoom.LevelId = level.UniqueId; dbRoom.Loops = roomLoops.SvgPath; dbRoom.ViewBox = roomLoops.BoundingBox.SvgViewBox; dbRoom = db.CreateDocument <DbRoom>(dbRoom); } foreach (KeyValuePair <string, JtLoop> p in furnitureLoops) { uid = p.Key; Element e = doc.GetElement(uid); if (db.DocumentExists(uid)) { DbSymbol symbol = db.GetDocument <DbSymbol>( uid); symbol.Description = Util.ElementDescription(e); symbol.Name = e.Name; symbol.Loop = p.Value.SvgPath; symbol = db.UpdateDocument <DbSymbol>(symbol); } else { DbSymbol symbol = new DbSymbol(uid); symbol.Description = Util.ElementDescription(e); symbol.Name = e.Name; symbol.Loop = p.Value.SvgPath; symbol = db.CreateDocument <DbSymbol>(symbol); } } foreach (FamilyInstance f in furniture) { uid = f.UniqueId; if (db.DocumentExists(uid)) { DbFurniture dbf = db.GetDocument <DbFurniture>( uid); dbf.Description = Util.ElementDescription(f); dbf.Name = f.Name; dbf.RoomId = room.UniqueId; dbf.Properties = Util.GetElementProperties(f); dbf.SymbolId = f.Symbol.UniqueId; dbf.Transform = new JtPlacement2dInt(f) .SvgTransform; dbf = db.UpdateDocument <DbFurniture>(dbf); } else { DbFurniture dbf = new DbFurniture(uid); dbf.Description = Util.ElementDescription(f); dbf.Name = f.Name; dbf.RoomId = room.UniqueId; dbf.Properties = Util.GetElementProperties(f); dbf.SymbolId = f.Symbol.UniqueId; dbf.Transform = new JtPlacement2dInt(f) .SvgTransform; dbf = db.CreateDocument <DbFurniture>(dbf); } } }
/// <summary> /// Upload model, sheet, views it contains and /// their BIM elements to a CouchDB data repository. /// </summary> static public void DbUploadSheet( ViewSheet sheet, JtLoops sheetViewportLoops, SheetModelCollections modelCollections) { bool pre_existing = false; RoomEditorDb rdb = new RoomEditorDb(); CouchDatabase db = rdb.Db; // Sheet Document doc = sheet.Document; Element e = GetProjectInfo(doc); DbModel dbModel = GetDbModel(db, e); DbSheet dbSheet = rdb.GetOrCreate <DbSheet>( ref pre_existing, sheet.UniqueId); dbSheet.Description = Util.SheetDescription(sheet); dbSheet.Name = sheet.Name; dbSheet.ModelId = e.UniqueId; dbSheet.Width = sheetViewportLoops[0].BoundingBox.Width; dbSheet.Height = sheetViewportLoops[0].BoundingBox.Height; dbSheet = pre_existing ? db.UpdateDocument <DbSheet>(dbSheet) : db.CreateDocument <DbSheet>(dbSheet); // Symbols Dictionary <ElementId, GeomData> geometryLookup = modelCollections.Symbols; foreach (KeyValuePair <ElementId, GeomData> p in geometryLookup) { ElementId id = p.Key; e = doc.GetElement(id); DbSymbol symbol = rdb.GetOrCreate <DbSymbol>( ref pre_existing, e.UniqueId); symbol.Description = Util.ElementDescription(e); symbol.Name = e.Name; symbol.Loop = p.Value.Loop.SvgPath; symbol = pre_existing ? db.UpdateDocument <DbSymbol>(symbol) : db.CreateDocument <DbSymbol>(symbol); } // Views and BIM elements List <ViewData> views = modelCollections .ViewsInSheet[sheet.Id]; View view; DbView dbView; DbBimel dbBimel; DbInstance dbInstance = null; DbPart dbPart = null; JtBoundingBox2dInt bbFrom; JtBoundingBox2dInt bbTo; foreach (ViewData viewData in views) { ElementId vid = viewData.Id; if (!modelCollections.BimelsInViews .ContainsKey(vid)) { // This is not a floor plan view, so // we have nothing to display in it. continue; } view = doc.GetElement(vid) as View; dbView = rdb.GetOrCreate <DbView>( ref pre_existing, view.UniqueId); dbView.Description = Util.ElementDescription(view); dbView.Name = view.Name; dbView.SheetId = dbSheet.Id; bbFrom = viewData.BimBoundingBox; bbTo = viewData.ViewportBoundingBox; dbView.X = bbTo.Min.X; dbView.Y = bbTo.Min.Y; dbView.Width = bbTo.Width; dbView.Height = bbTo.Height; dbView.BimX = bbFrom.Min.X; dbView.BimY = bbFrom.Min.Y; dbView.BimWidth = bbFrom.Width; dbView.BimHeight = bbFrom.Height; dbView = pre_existing ? db.UpdateDocument <DbView>(dbView) : db.CreateDocument <DbView>(dbView); // Retrieve the list of BIM elements // displayed in this view. List <ObjData> bimels = modelCollections .BimelsInViews[vid]; foreach (ObjData bimel in bimels) { e = doc.GetElement(bimel.Id); InstanceData inst = bimel as InstanceData; if (null != inst) { dbInstance = rdb.GetOrCreate <DbInstance>( ref pre_existing, e.UniqueId); dbInstance.SymbolId = doc.GetElement( inst.Symbol).UniqueId; dbInstance.Transform = inst.Placement .SvgTransform; dbBimel = dbInstance; } else { Debug.Assert(bimel is GeomData, "expected part with geometry"); dbPart = rdb.GetOrCreate <DbPart>( ref pre_existing, e.UniqueId); dbPart.Loop = ((GeomData)bimel).Loop .SvgPath; dbBimel = dbPart; } dbBimel.Description = Util.ElementDescription(e); dbBimel.Name = e.Name; JtUidSet uids = new JtUidSet(dbBimel.ViewIds); uids.Add(view.UniqueId); dbBimel.ViewIds = uids.Uids; dbBimel.Properties = Util.GetElementProperties(e); if (null != inst) { dbInstance = pre_existing ? db.UpdateDocument <DbInstance>(dbInstance) : db.CreateDocument <DbInstance>(dbInstance); } else { dbPart = pre_existing ? db.UpdateDocument <DbPart>(dbPart) : db.CreateDocument <DbPart>(dbPart); } } } }