Browse Source

Merge branch 'master' of http://dev.dp.sagacloud.cn:8886/r/Revit/SAGA.MBI

xulisong 6 years ago
parent
commit
b1bb90f8e7

+ 0 - 105
MBI/Menu/MBITool.xml

@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Menus>
-  <App>
-    <AppIndex>1</AppIndex>
-    <AppName>SAGA</AppName>
-  </App>
-  <Tab TabName="工具">
-    <MenuTab>MBITool_W</MenuTab>
-    <Modules>MBITool</Modules>
-  </Tab>
-  <Panel PanelName="数据修正" GroupFlag="True" GroupImage="" RevitVer="R14,R15,R16,R17"  ButtonStyles="Large">
-    
-    <Button ButtonStyles="Large">
-      <ButtonName>SAGA.MBI.CheckCloudAndLocalFamilyCommand</ButtonName>
-      <ButtonText>同步族类型</ButtonText>
-      <ImageName>1、打开楼层模型</ImageName>
-      <DllName>..\OutputDll\SAGA.MBI.exe</DllName>
-      <ClassName>SAGA.MBI.CheckCloudAndLocalFamilyCommand</ClassName>
-      <ToolTip>处理云平台和物理世界族类型不同步的问题。</ToolTip>
-      <LongDescription>处理云平台和物理世界族类型不同步的问题。</LongDescription>
-      <ToolTipImage></ToolTipImage>
-      <MenuTab>MBITool_W</MenuTab>
-      <Modules>MBITool</Modules>
-    </Button>
-  
-    <Button ButtonStyles="Large">
-      <ButtonName>SAGA.MBI.AddEquipLocationCommand</ButtonName>
-      <ButtonText>更新所有楼层设备的坐标信息</ButtonText>
-      <ImageName>1、打开楼层模型</ImageName>
-      <DllName>..\OutputDll\SAGA.MBI.exe</DllName>
-      <ClassName>SAGA.MBI.AddEquipLocationCommand</ClassName>
-      <ToolTip>更新所有楼层设备的坐标信息</ToolTip>
-      <LongDescription>更新所有楼层设备的坐标信息</LongDescription>
-      <ToolTipImage></ToolTipImage>
-      <MenuTab>MBITool_W</MenuTab>
-      <Modules>MBITool</Modules>
-    </Button>
-    <Button ButtonStyles="Large">
-      <ButtonName>SAGA.MBI.ExportMbiModelCommand</ButtonName>
-      <ButtonText>上传jsonZ文件</ButtonText>
-      <ImageName>2、模型文件管理</ImageName>
-      <DllName>..\OutputDll\SAGA.MBI.exe</DllName>
-      <ClassName>SAGA.MBI.ExportMbiModelCommand</ClassName>
-      <ToolTip>模型文件管理。</ToolTip>
-      <LongDescription>模型文件管理。</LongDescription>
-      <ToolTipImage></ToolTipImage>
-      <MenuTab>MBITool_W</MenuTab>
-      <Modules>MBITool</Modules>
-    </Button>
-    <Button ButtonStyles="Large">
-      <ButtonName>SAGA.MBI.CheckEquipinFloorCommand</ButtonName>
-      <ButtonText>更新设备所在楼层关系</ButtonText>
-      <ImageName>1、打开楼层模型</ImageName>
-      <DllName>..\OutputDll\SAGA.MBI.exe</DllName>
-      <ClassName>SAGA.MBI.CheckEquipinFloorCommand</ClassName>
-      <ToolTip>更新设备所在楼层关系。</ToolTip>
-      <LongDescription>更新设备所在楼层关系。</LongDescription>
-      <ToolTipImage></ToolTipImage>
-      <MenuTab>MBITool_W</MenuTab>
-      <Modules>MBITool</Modules>
-    </Button>
-    <Button ButtonStyles="Large">
-      <ButtonName>SAGA.MBI.CorrectLossDutyCommand</ButtonName>
-      <ButtonText>修正有模型但没有岗位问题</ButtonText>
-      <ImageName>1、打开楼层模型</ImageName>
-      <DllName>..\OutputDll\SAGA.MBI.exe</DllName>
-      <ClassName>SAGA.MBI.CorrectLossDutyCommand</ClassName>
-      <ToolTip>修正有模型但没有岗位问题。</ToolTip>
-      <LongDescription>修正有模型但没有岗位问题。</LongDescription>
-      <ToolTipImage></ToolTipImage>
-      <MenuTab>MBITool_W</MenuTab>
-      <Modules>MBITool</Modules>
-    </Button>
-  </Panel>
-  <Panel PanelName="工具" GroupFlag="True" GroupImage="" RevitVer="R14,R15,R16,R17"  ButtonStyles="Large">
-
-    <Button ButtonStyles="Large">
-      <ButtonName>SAGA.MBI.ExportEquipNotInSpaceCommand</ButtonName>
-      <ButtonText>没有在空间的设备</ButtonText>
-      <ImageName>1、打开楼层模型</ImageName>
-      <DllName>..\OutputDll\SAGA.MBI.exe</DllName>
-      <ClassName>SAGA.MBI.ExportEquipNotInSpaceCommand</ClassName>
-      <ToolTip>导出没有在空间的设备。</ToolTip>
-      <LongDescription>导出没有在空间的设备。</LongDescription>
-      <ToolTipImage></ToolTipImage>
-      <MenuTab>MBITool_W</MenuTab>
-      <Modules>MBITool</Modules>
-    </Button>
-
-    <Button ButtonStyles="Large">
-      <ButtonName>SAGA.MBI.ExportCategoriesCommand</ButtonName>
-      <ButtonText>导出所有的设备类别</ButtonText>
-      <ImageName>1、打开楼层模型</ImageName>
-      <DllName>..\OutputDll\SAGA.MBI.exe</DllName>
-      <ClassName>SAGA.MBI.ExportCategoriesCommand</ClassName>
-      <ToolTip>更新设备所在楼层关系。</ToolTip>
-      <LongDescription>更新设备所在楼层关系。</LongDescription>
-      <ToolTipImage></ToolTipImage>
-      <MenuTab>MBITool_W</MenuTab>
-      <Modules>MBITool</Modules>
-    </Button>
-  </Panel>
-</Menus>
-<!--名称里面换行-->
-<!-- <ButtonText>扫楼App&#x000A;用户管理</ButtonText>-->

+ 28 - 20
MBI/SAGA.MBI/Calc/ObjectCalc.cs

@@ -59,6 +59,7 @@ namespace SAGA.MBI.Calc
             var spaces = context.RevitDoc.GetSpaces();
             foreach (Space space in spaces)
             {
+                if(!space.IsValidObject)continue;
                 MSpace mspace = DalSpace.GetSpace(space);
                 if(mspace==null)continue;
                 mspace.Operator = DocumentChangedOperator.Add;
@@ -74,6 +75,7 @@ namespace SAGA.MBI.Calc
             var familyInstances = context.RevitDoc.GetFamilyInstances();
             foreach (FamilyInstance fi in familyInstances)
             {
+                if(!fi.IsValidObject)continue;
                 if (fi.IsEquipment())
                 {
                     MEquipment equipment = DalEquip.GetEquipment(fi);
@@ -82,7 +84,7 @@ namespace SAGA.MBI.Calc
                     context.MEquipments.Add(equipment);
 
                     //识别设备所在空间
-                    var space = fi.Space;
+                    var space = fi.GetReferenceSpace();
                     if (space == null) continue;
                     string spaceId = space.GetCloudBIMId();
                     MSpace mSpace = context.MSpaces.FirstOrDefault(t => t.BimID == spaceId);
@@ -92,41 +94,47 @@ namespace SAGA.MBI.Calc
                         context.RltEquipInSpaces.Add(new RltEquipInSpace(mSpace, equipment){Operator = DocumentChangedOperator.Add});
                     }
                 }
-                // 在这里处理部件 
-                if (fi.IsEquipmentPart())
+               
+                //在这里处理信标
+                if (fi.IsBeacon())
                 {
-                    MEquipmentPart equipment = DalEquipPart.GetEquipPart(fi);
-                    if (equipment == null) continue;
-                    equipment.Operator = DocumentChangedOperator.Add;
-                    context.MEquipmentParts.Add(equipment);
+                    MBeacon mode = DalBeacon.GetBeacon(fi);
+                    if(mode==null)continue;
+                    mode.Operator = DocumentChangedOperator.Add;
+                    context.MBeacons.Add(mode);
 
-                    //识别设备所在空间
-                    var space = fi.Space;
+                    //识别信标所在元空间
+                    var space = fi.GetReferenceSpace();
                     if (space == null) continue;
                     string spaceId = space.GetCloudBIMId();
                     MSpace mSpace = context.MSpaces.FirstOrDefault(t => t.BimID == spaceId);
                     if (mSpace != null)
                     {
-                        //设备所在空间添加添加一组关系
-                        context.RltEquipInSpaces.Add(new RltEquipInSpace(mSpace, equipment) { Operator = DocumentChangedOperator.Add });
+                        context.RltBeaconinElementSps.Add(new RltBeaconinElementSp(mSpace, mode) { Operator = DocumentChangedOperator.Add });
                     }
                 }
-                //在这里处理信标
-                if (fi.IsBeacon())
+            }
+            //单独处理部件,因为部件要依赖设备
+            foreach (FamilyInstance fi in familyInstances)
+            {
+                // 在这里处理部件 
+                if (fi.IsEquipmentPart())
                 {
-                    MBeacon mode = DalBeacon.GetBeacon(fi);
-                    if(mode==null)continue;
-                    mode.Operator = DocumentChangedOperator.Add;
-                    context.MBeacons.Add(mode);
+                    MEquipmentPart equipment = DalEquipPart.GetEquipPart(fi);
+                    if(equipment?.MEquipment == null)continue;
+                    
+                    equipment.Operator = DocumentChangedOperator.Add;
+                    context.MEquipmentParts.Add(equipment);
 
-                    //识别信标所在元空间
-                    var space = fi.Space;
+                    //识别设备所在空间
+                    var space = fi.GetReferenceSpace();
                     if (space == null) continue;
                     string spaceId = space.GetCloudBIMId();
                     MSpace mSpace = context.MSpaces.FirstOrDefault(t => t.BimID == spaceId);
                     if (mSpace != null)
                     {
-                        context.RltBeaconinElementSps.Add(new RltBeaconinElementSp(mSpace, mode) { Operator = DocumentChangedOperator.Add });
+                        //设备所在空间添加添加一组关系
+                        context.RltEquipInSpaces.Add(new RltEquipInSpace(mSpace, equipment) { Operator = DocumentChangedOperator.Add });
                     }
                 }
             }

+ 4 - 4
MBI/SAGA.MBI/DataArrange/DalBeModeDutyList.cs

@@ -43,9 +43,9 @@ namespace SAGA.MBI.DataArrange
             Document doc = ExternalDataWrapper.Current.Doc;
             string floorId = doc.PathName.GetFileName();
             var allEquips = DalCommon.DownLoadCouldData(floorId, new[] { "Eq", "Ec" });
-            var noBimEquips = allEquips.Where(t => t.BimID.IsOnlyDutyNoModelBIMID());
-            foreach (MRevitEquipBase mRevitEquipBase in noBimEquips)
+            foreach (MRevitEquipBase mRevitEquipBase in allEquips)
             {
+                if(!mRevitEquipBase.BimID.IsOnlyDutyNoModelBIMID())continue;
                 string bimid = mRevitEquipBase.GetDutyBIMRelationByDuty()?.BIMId;
                 list.Add(new MEquipNoMode(mRevitEquipBase, bimid));
             }
@@ -63,9 +63,9 @@ namespace SAGA.MBI.DataArrange
             Document doc = ExternalDataWrapper.Current.Doc;
             string floorId = doc.PathName.GetFileName();
             var allEquips = DalCommon.GetUndefineFloorEquipBases(floorId);
-            var noBimEquips = allEquips.Where(t => t.BimID.IsOnlyDutyNoModelBIMID());
-            foreach (MRevitEquipBase mRevitEquipBase in noBimEquips)
+            foreach (MRevitEquipBase mRevitEquipBase in allEquips)
             {
+                if (!mRevitEquipBase.BimID.IsOnlyDutyNoModelBIMID()) continue;
                 string bimid = mRevitEquipBase.GetDutyBIMRelationByDuty()?.BIMId;
                 list.Add(new MEquipNoMode(mRevitEquipBase, bimid));
             }

+ 34 - 0
MBI/SAGA.MBI/DataArrange/DalCommon.cs

@@ -425,5 +425,39 @@ namespace SAGA.MBI.DataArrange
                 return null;
             }
         }
+
+        private static List<MRevitEquipBase> m_AllRevitObjects=null;
+        /// <summary>
+        /// 在缓存中通过bimid查找
+        /// 如果查找不到,重新加载缓存
+        /// </summary>
+        /// <param name="bimId"></param>
+        /// <returns></returns>
+        public static MRevitEquipBase GetRevitObjectsByBIMID(string bimId)
+        {
+            MRevitEquipBase rbase = null;
+            if (m_AllRevitObjects != null)
+            {
+                rbase = m_AllRevitObjects?.FirstOrDefault(t => t.BimID == bimId);
+            }
+            if (rbase==null)
+            {
+                string floorId = bimId.GetFloorId();
+                string buildingId = DalProjectTree.GetBuildingIdByFloor(floorId);
+                m_AllRevitObjects = CommonConvert.CacheAllData(buildingId);
+                rbase = m_AllRevitObjects.FirstOrDefault(t => t.BimID == bimId);
+            }
+            return rbase;
+        }
+
+        /// <summary>
+        /// 由BimID查询CloudID
+        /// </summary>
+        /// <param name="bimId"></param>
+        /// <returns></returns>
+        public static string QueryDutyIdByBIMID(string bimId)
+        {
+            return GetRevitObjectsByBIMID(bimId)?.Id;
+        }
     }
 }

+ 28 - 9
MBI/SAGA.MBI/Extend/ElementExtend.cs

@@ -89,7 +89,7 @@ namespace SAGA.MBI.Tools
             //楼层文件名称,无后缀
             var docName = pathName.GetFileName();
             var id = elem.Id.ToString();
-            return CommonTool.GetCloudBIMId(docName,id);
+            return CommonTool.GetCloudBIMId(docName, id);
         }
 
         /// <summary>
@@ -99,20 +99,16 @@ namespace SAGA.MBI.Tools
         public static string GetLocationPointMBI(this Element element)
         {
             string str = ",,";
+            //定位点不可靠,未来可能会更改为Box的中心点
             XYZ bimXyz = element.GetLocationPoint();
             if (element is FamilyInstance fi)
             {
                 var family = fi.GetFamily();
                 if (family.IsInPlace)
                 {
-                    var box = fi.get_BoundingBox(null);
-                    if (box != null)
-                    {
-
-                        bimXyz= (box.Max + box.Min) / 2;
-                    }
+                    bimXyz = fi.GetBoxCenter();
                 }
-            }         
+            }
             if (bimXyz != null)
             {
                 str = bimXyz.FromApi().ToString(null);
@@ -134,7 +130,7 @@ namespace SAGA.MBI.Tools
             var strs = xyzstr.Split(',');
             if (strs.Length == 3)
             {
-                xyz=new XYZ(strs[0].ToDouble(), strs[1].ToDouble(), strs[2].ToDouble());
+                xyz = new XYZ(strs[0].ToDouble(), strs[1].ToDouble(), strs[2].ToDouble());
             }
             //JObject jObject = new JObject();
             //jObject.Add("X", bimXyz.X);
@@ -159,5 +155,28 @@ namespace SAGA.MBI.Tools
             //移除前面和后面的空格
             return code.Trim();
         }
+        /// <summary>
+        /// 获取关联的空间
+        /// </summary>
+        /// <param name="fi"></param>
+        /// <returns></returns>
+        public static Space GetReferenceSpace(this FamilyInstance fi)
+        {
+            Space space = fi.Space;
+            var spaces = fi.Document.GetSpaces();
+            //没有Space属性,取定位点,判断定位点所在空间
+            if (space == null)
+            {
+                var origin = fi.GetLocationPointMBI().ToXyz().ConvertToApi();
+                space = spaces.FirstOrDefault(t => t.IsValidObject && t.IsPointInSpace(origin));
+            }
+            //还没有找到空间,取Box中心点,判断点所在空间
+            if (space == null)
+            {
+                var origin = fi.GetBoxCenter();
+                space = spaces.FirstOrDefault(t => t.IsValidObject && t.IsPointInSpace(origin));
+            }
+            return space;
+        }
     }
 }

+ 19 - 0
MBI/SAGA.MBI/JsonConvert/CommonConvert.cs

@@ -234,5 +234,24 @@ namespace SAGA.MBI.RequestData
             }
             return list;
         }
+        /// <summary>
+        /// 缓存所有Revit数据,除了信标
+        /// </summary>
+        /// <param name="buildingId"></param>
+        /// <returns></returns>
+        public static List<MRevitEquipBase> CacheAllData(string buildingId)
+        {
+            List<MRevitEquipBase> list = new List<MRevitEquipBase>();
+            string json = CommonRequest.CacheAllData(buildingId);
+            if (!json.IsRequestHasItem()) return list;
+            JObject jObject = JObject.Parse(json);
+            foreach (JObject jobjItem in jObject["Content"])
+            {
+                var mode = JsonToEquipBase(null, jobjItem);
+                if (mode != null)
+                    list.Add(mode);
+            }
+            return list;
+        }
     }
 }

+ 9 - 10
MBI/SAGA.MBI/JsonConvert/EquipmentPartConvert.cs

@@ -13,6 +13,7 @@ using SAGA.MBI.RequestData;
 using SAGA.MBI.Tools;
 using SAGA.DotNetUtils;
 using SAGA.DotNetUtils.Extend;
+using SAGA.MBI.DataArrange;
 
 namespace SAGA.MBI.JsonConvert
 {
@@ -29,7 +30,7 @@ namespace SAGA.MBI.JsonConvert
         {
             string floorId = mode.FloorId;
             string bimId = mode.BimID;
-            string json = CommonRequest.QueryObjectByBIMID(floorId, bimId,new []{"Ec"});
+            string json = CommonRequest.QueryObjectByBIMID(floorId, bimId, new[] { "Ec" });
             if (!json.IsRequestHasItem()) return false;
             JObject jObject = JObject.Parse(json);
             mode.Id = (string)jObject["Content"][0]["id"];
@@ -47,22 +48,20 @@ namespace SAGA.MBI.JsonConvert
         public static bool AddEquipmentPart(MEquipmentPart mode)
         {
             string equipId = mode.MEquipment?.Id;
-            if (equipId.IsNullOrEmpty())
+            if (equipId.IsNullOrEmpty() && mode.MEquipment != null)
             {
-                mode.MEquipment?.AddorUpdateObject();
-                equipId = mode.MEquipment?.Id;
+                equipId = DalCommon.QueryDutyIdByBIMID( mode.MEquipment.BimID) ;
             }
             if (equipId.IsNullOrEmpty()) return false;
-            //取后两位,如Ip
-            string category = mode.EquipClassCode.Substring(4);
+            string category = mode.EquipClassCode;
             JObject infos = mode.GetInfosJObject();
-            string json = EquipmentPartRequest.AddEquipmentPart(mode.FloorId,equipId, category, infos);
+            string json = EquipmentPartRequest.AddEquipmentPart(mode.FloorId, equipId, category, infos);
 
             if (json.IsSuccessRequest())
             {
-                JObject jObject=JObject.Parse(json);
-                mode.Id = (string) jObject["id"];
-                mode.Name = (string) jObject["CompName"];
+                JObject jObject = JObject.Parse(json);
+                mode.Id = (string)jObject["id"];
+                mode.Name = (string)jObject["CompName"];
                 return true;
             }
             return false;

+ 1 - 1
MBI/SAGA.MBI/Model/MEquipmentPart.cs

@@ -49,7 +49,7 @@ namespace SAGA.MBI.Model
         /// <summary>
         /// 关联的设备
         /// </summary>
-        public MEquipment MEquipment { get; set; }
+        public MRevitEquipBase MEquipment { get; set; }
 
         #endregion
 

+ 3 - 4
MBI/SAGA.MBI/Model/MRevitEquipBase.cs

@@ -347,7 +347,7 @@ namespace SAGA.MBI.Model
         {
             if (Id.IsNullOrEmpty())
             {
-                this.Id = UpLoadFileRequest.QueryColudIdByBimId(this.FloorId, this.BimID);
+                this.Id = DalCommon.QueryDutyIdByBIMID(this.BimID);
             }
             return Id;
         }
@@ -376,14 +376,13 @@ namespace SAGA.MBI.Model
 
                     if (Id.IsNullOrEmpty())
                     {
-                        this.Id = UpLoadFileRequest.QueryColudIdByBimId(this.FloorId, this.BimID);
+                        this.Id = DalCommon.QueryDutyIdByBIMID(this.BimID);
                     }
                     if (!Id.IsNullOrEmpty())
                     {
                         JObject infos = this.GetInfosJObject();
                         result = CommonConvert.UpdateInfosSigle(Id, infos);
                     }
-
                     break;
                 case DocumentChangedOperator.Delete:
                     if (!Id.IsNullOrEmpty())
@@ -395,7 +394,7 @@ namespace SAGA.MBI.Model
                     break;
                 default:
                     if (Id.IsNullOrEmpty())
-                        this.Id = UpLoadFileRequest.QueryColudIdByBimId(this.FloorId, this.BimID);
+                        this.Id = DalCommon.QueryDutyIdByBIMID(this.BimID);
                     break;
             }
             return result;

+ 9 - 0
MBI/SAGA.MBI/RequestData/CommonRequest.cs

@@ -214,6 +214,15 @@ namespace SAGA.MBI.RequestData
             return SubsetQuery(buildingId, new JArray() {"Eq", "Ec"});
         }
         /// <summary>
+        /// 缓存所有的Revit数据
+        /// </summary>
+        /// <param name="buildingId"></param>
+        /// <returns></returns>
+        public static string CacheAllData(string buildingId)
+        {
+            return SubsetQuery(buildingId, new JArray() { "Eq", "Ec","Si" });
+        }
+        /// <summary>
         /// 查询某个object下指定类型的objects (查询项目下的所有类型, 建筑下的设备, 系统, 楼层, 空间. 查询楼层中的空间, 非关系表查询)
         /// </summary>
         /// <param name="id">id只能是project id, building id , floor id 或者 equipment id. 不填id或者null, 则默认是project id</param>

+ 0 - 16
MBI/SAGA.MBI/RequestData/UpLoadFileRequest.cs

@@ -479,22 +479,6 @@ namespace SAGA.MBI.RequestData
         }
         #endregion
 
-
-        /// <summary>
-        /// 由BimID查询CloudID
-        /// </summary>
-        /// <param name="floorId"></param>
-        /// <param name="bimId"></param>
-        /// <returns></returns>
-        public static string QueryColudIdByBimId(string floorId, string bimId)
-        {
-            string json = CommonRequest.QueryObjectByBIMID(floorId, bimId);
-            if (!json.IsRequestHasItem()) return null;
-            JObject jObject = JObject.Parse(json);
-            return (string)jObject["Content"][0]["id"];
-        }
-
-
         #region 一级底层封装      
         /*
          * 1、上传接口:URL,(传路径|传bytes)  系统及Id

+ 1 - 0
MBI/SAGA.MBI/SAGA.MBI.csproj

@@ -336,6 +336,7 @@
     <Compile Include="ToolsData\ExportAllCategory.cs" />
     <Compile Include="ToolsData\ExportAllEquipmentAll.cs" />
     <Compile Include="ToolsData\IToolCommand.cs" />
+    <Compile Include="ToolsData\UpdateRelationEquipinSpace.cs" />
     <Compile Include="WinView\BeModingDutyList\MEquipNoMode.cs" />
     <Compile Include="WinView\BeModingDutyList\VMBeModeDutyList.cs" />
     <Compile Include="Extend\MRevitEquipBaseExtend.cs" />

+ 50 - 3
MBI/SAGA.MBI/ToolCommand.cs

@@ -16,7 +16,9 @@ using DevExpress.Xpf.Core;
 using FWindSoft.DataFramework;
 using SAGA.DotNetUtils;
 using SAGA.DotNetUtils.Logger;
+using SAGA.DotNetUtils.Others;
 using SAGA.MBI.Common;
+using SAGA.MBI.Tools;
 using SAGA.MBI.ToolsData;
 using SAGA.MBI.ToolsData.CheckBase;
 using SAGA.MBI.ToolsData.DataCheck;
@@ -39,9 +41,12 @@ namespace SAGA.MBI
         {
             try
             {
-                var tip = MessageShow.Question("确定要执行设备所在空间的检查?\r\n未在空间中的岗位将会被导出的excel中,由建模人员进行检查。");
-                if (tip)
-                    CheckEquipInSpace.Export();
+                var fi = ExternalDataWrapper.Current.UiApp.GetSelectedElement() as FamilyInstance;
+                var space = fi.GetReferenceSpace();
+                MessageShowBase.Infomation($"设备所在空间Id为{space?.Id}");
+                //var tip = MessageShow.Question("确定要执行设备所在空间的检查?\r\n未在空间中的岗位将会被导出的excel中,由建模人员进行检查。");
+                //if (tip)
+                //    CheckEquipInSpace.Export();
             }
             catch (Exception e)
             {
@@ -172,6 +177,48 @@ namespace SAGA.MBI
         }
     }
     /// <summary>
+    /// 更新设备所在空间关系
+    /// </summary>
+    [Transaction(TransactionMode.Manual)]
+    [Regeneration(RegenerationOption.Manual)]
+    public class UpdateEquipinSpaceCommand : ExternalCommand, IExternalCommandAvailability
+    {
+        public override Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
+        {
+            try
+            {
+                var tip = MessageShow.Question2("确定要更新设备所在空间关系?\r\n是:修正全部楼层\r\n否:修正当前楼层\r\n取消:取消修正。");
+                switch (tip)
+                {
+                    case DialogResult.Yes:
+                        UpdateRelationEquipinSpace.OperateAll();
+                        break;
+                    case DialogResult.No:
+                        UpdateRelationEquipinSpace.OperateCurFloor();
+                        break;
+                    default:
+                        break;
+                }
+            }
+            catch (Exception e)
+            {
+                MessageShow.Show(e);
+                return Result.Cancelled;
+            }
+            return Result.Succeeded;
+        }
+
+
+        /// <summary>
+        /// Onlys show the dialog when a document is open, as Dockable dialogs are only available
+        /// when a document is open.
+        /// </summary>
+        public bool IsCommandAvailable(UIApplication applicationData, CategorySet selectedCategories)
+        {
+            return true;
+        }
+    }
+    /// <summary>
     /// 导出类别
     /// </summary>
     [Transaction(TransactionMode.Manual)]

+ 2 - 2
MBI/SAGA.MBI/ToolsData/CheckEquipCategory.cs

@@ -121,7 +121,7 @@ namespace SAGA.MBI.ToolsData
                     addContext.MEquipments.Add(equip);
 
                     //识别设备所在空间
-                    var space = fi.Space;
+                    var space = fi.GetReferenceSpace();
                     if (space == null) continue;
                     string spaceId = space.GetCloudBIMId();
                     MSpace mSpace = addContext.MSpaces.FirstOrDefault(t => t.BimID == spaceId);
@@ -154,7 +154,7 @@ namespace SAGA.MBI.ToolsData
                     equipment.Operator = DocumentChangedOperator.Add;
                     addContext.MEquipmentParts.Add(equipment);
                     //识别设备所在空间
-                    var space = fi.Space;
+                    var space = fi.GetReferenceSpace();
                     if (space == null) continue;
                     string spaceId = space.GetCloudBIMId();
                     MSpace mSpace = addContext.MSpaces.FirstOrDefault(t => t.BimID == spaceId);

+ 3 - 3
MBI/SAGA.MBI/ToolsData/CheckEquipInSpace.cs

@@ -65,7 +65,7 @@ namespace SAGA.MBI.ToolsData
                 FamilyInstance fi=document.GetElement(bimId.GetBIMID()) as FamilyInstance;
                 if (fi != null)
                 {
-                    var space = fi.Space;
+                    var space = fi.GetReferenceSpace();
                     if (space != null)
                     {
                         var spaceBimid = space.GetCloudBIMId();
@@ -122,7 +122,7 @@ namespace SAGA.MBI.ToolsData
 
 
                     //识别设备所在空间
-                    var space = fi.Space;
+                    var space = fi.GetReferenceSpace();
                     if (space == null)
                     {
                         string familyName = fi.GetFamily().Name;
@@ -142,7 +142,7 @@ namespace SAGA.MBI.ToolsData
                     context.MEquipmentParts.Add(part);
 
                     //识别设备所在空间
-                    var space = fi.Space;
+                    var space = fi.GetReferenceSpace();
                     if (space == null)
                     {
                         string familyName = fi.GetFamily().Name;

+ 21 - 1
MBI/SAGA.MBI/ToolsData/CorrectLossDuty.cs

@@ -78,7 +78,8 @@ namespace SAGA.MBI.ToolsData
             var newContext = ObjectCalc.Calc(floor);
             //分组
             var beaddContext = DalModeFileManange.GetAddContext(oldContext, newContext, true);
-            var bedelContext = DalModeFileManange.GetDelContext(oldContext, newContext, true);
+            var bedelContext = (DalModeFileManange.GetDelContext(oldContext, newContext, true));
+            RemoveNoBimIdDuty(bedelContext);
             return new Tuple<CalcContext, CalcContext>(beaddContext,bedelContext);
         }
         /// <summary>
@@ -137,5 +138,24 @@ namespace SAGA.MBI.ToolsData
             }
             return result;
         }
+
+        public static void RemoveNoBimIdDuty(CalcContext context)
+        {
+            var nobimdutyEquips = context.MEquipments.Where(t => t.BimID.IsOnlyDutyNoModelBIMID()).ToList();
+            foreach (var equip in nobimdutyEquips)
+            {
+                context.MEquipments.Remove(equip);
+            }
+            var nobimdutyParts = context.MEquipmentParts.Where(t => t.BimID.IsOnlyDutyNoModelBIMID()).ToList();
+            foreach (var equip in nobimdutyParts)
+            {
+                context.MEquipmentParts.Remove(equip);
+            }
+            var nobimdutyBeacons = context.MBeacons.Where(t => t.BimID.IsOnlyDutyNoModelBIMID()).ToList();
+            foreach (var equip in nobimdutyBeacons)
+            {
+                context.MBeacons.Remove(equip);
+            }
+        }
     }
 }

+ 1 - 1
MBI/SAGA.MBI/ToolsData/ModeCheck/EquipmentInSpaceCheck.cs

@@ -73,7 +73,7 @@ namespace SAGA.MBI.ToolsData.ModeCheck
             var result = new EquipmentInSpaceCheckResult();
             result.FamilyName = fi.GetFamily().Name;
             result.Id = fi.Id.ToString();
-            var space = fi.Space;
+            var space = fi.GetReferenceSpace();
             if (space == null)
             {
                 result.IsRight = false;

+ 152 - 0
MBI/SAGA.MBI/ToolsData/UpdateRelationEquipinSpace.cs

@@ -0,0 +1,152 @@
+/* ==============================================================================
+ * 功能描述:检查设备所在楼层
+ * 创 建 者:Garrett
+ * 创建日期:2018/8/10 16:36:26
+ * ==============================================================================*/
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Autodesk.Revit.DB;
+using Autodesk.Revit.DB.Mechanical;
+using Newtonsoft.Json.Linq;
+using SAGA.DotNetUtils;
+using SAGA.DotNetUtils.Logger;
+using SAGA.DotNetUtils.Others;
+using SAGA.MBI.Calc;
+using SAGA.MBI.Common;
+using SAGA.MBI.DataArrange;
+using SAGA.MBI.Model;
+using SAGA.MBI.RequestData;
+using SAGA.MBI.Tools;
+using SAGA.MBI.WinView.Upload;
+using SAGA.RevitUtils.Extends;
+
+namespace SAGA.MBI.ToolsData
+{
+    /// <summary>
+    /// UpdateRelationEquipinFloor
+    /// </summary>
+    public class UpdateRelationEquipinSpace
+    {
+        /// <summary>
+        /// 检查并处理所有楼层
+        /// </summary>
+        public static void OperateAll()
+        {
+            var floors = DalUploadFloor.GetHasFileFloors();
+            foreach (UploadFloor floor in floors)
+            {
+                Operate(floor.MFloor);
+            }
+        }
+        /// <summary>
+        /// 只处理当前楼层
+        /// </summary>
+        public static void OperateCurFloor()
+        {
+            MFloor floor = ExternalDataWrapper.Current.Doc.GetCurMFloor();
+            if (floor != null)
+                Operate(floor);
+        }
+        /// <summary>
+        /// 检查并处理
+        /// </summary>
+        /// <param name="floor"></param>
+        /// <returns></returns>
+        private static void Operate(MFloor floor)
+        {
+            var context = DalCommon.DownLoadFloorDataByBIMFloorInfo(floor);
+            try
+            {
+                RebuildCloudData(context);
+            }
+            catch (Exception e)
+            {
+                MessageShowBase.Show(e);
+            }
+            finally
+            {
+            }
+        }
+        /// <summary>
+        /// 检查设备所在楼层关系
+        /// </summary>
+        /// <param name="baseContext"></param>
+        private static void RebuildCloudData(CalcContext baseContext)
+        {
+            baseContext.OpenDocument();
+                var doc = baseContext.RevitDoc;
+            try
+            {
+                JObject jobject = new JObject();
+                JArray jcriterias = new JArray();
+                string graphtype = RelationConst.EquipInSpaceGraphId;
+                string reltyp = RelationConst.EquipInSpaceGraphRelationType;
+                string graphid = RelationRequest.GetCurrentGraphId(graphtype);
+                if (graphid == null) return;
+                if (baseContext.MEquipments.Count == 0 && baseContext.MEquipmentParts.Count == 0) return;
+                //空间不处理
+                //检查设备
+                foreach (var mode in baseContext.MEquipments)
+                {
+                    string equipid = mode.Id;
+                    string spaceId = GetMSpace(doc, mode.BimID, baseContext.MSpaces.ToList());
+                    if (spaceId.IsNullOrEmpty()) continue;
+
+                    JObject jitem = new JObject();
+                    jitem.Add("from_id", equipid);
+                    jitem.Add("to_id", spaceId);
+                    jitem.Add("graph_id", graphid);
+                    jitem.Add("rel_type", reltyp);
+                    jcriterias.Add(jitem);
+                }
+                //检查部件 
+                foreach (var mode in baseContext.MEquipmentParts)
+                {
+                    string equipid = mode.Id;
+                    string spaceId = GetMSpace(doc, mode.BimID, baseContext.MSpaces.ToList());
+                    if (spaceId.IsNullOrEmpty()) continue;
+                    JObject jitem = new JObject();
+                    jitem.Add("from_id", equipid);
+                    jitem.Add("to_id", spaceId);
+                    jitem.Add("graph_id", graphid);
+                    jitem.Add("rel_type", reltyp);
+                    jcriterias.Add(jitem);
+                }
+                //信标不用检查
+                jobject.Add("criterias", jcriterias);
+                RelationRequest.AddRelation(jobject);
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine(e);
+
+            }
+            finally
+            {
+                baseContext.CloseDocument();
+            }
+           
+        }
+
+        private static string GetMSpace(Document doc,string bimid,List<MSpace> spaces)
+        {
+            FamilyInstance fi = doc.GetElement(bimid.GetBIMID()) as FamilyInstance;
+            if (fi == null) return null;
+            var space = fi.GetReferenceSpace();
+            if (space == null) return null;
+            var spaceid = space.GetCloudBIMId();
+            var mspace = spaces.FirstOrDefault(t => t.BimID == spaceid);
+            if (mspace == null)
+            {
+                mspace = DalSpace.GetSpace(space);
+                mspace.Operator = DocumentChangedOperator.Add;
+                mspace.AddObject();
+            }
+            return mspace?.Id;
+        }
+     
+    }
+}

+ 1 - 0
MBI/SAGA.MBI/WinView/Login/WinMFMDownloadProcress.xaml

@@ -5,6 +5,7 @@
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              xmlns:local="clr-namespace:SAGA.MBI.Login"
         WindowStartupLocation="CenterScreen"
+        WindowStyle="None"
              mc:Ignorable="d" 
         Title="下载模型文件"
              Height="270" Width="600">

+ 1 - 0
MBI/SAGA.MBI/WinView/Login/WinMFMUploadProcress.xaml

@@ -4,6 +4,7 @@
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              xmlns:local="clr-namespace:SAGA.MBI.Login"
+        WindowStyle="None"
         WindowStartupLocation="CenterScreen"
              mc:Ignorable="d" 
         Title="上传模型文件并处理"

+ 13 - 0
MBI/SAGA.RevitUtils/Extends/ElementExtend.cs

@@ -1248,5 +1248,18 @@ namespace SAGA.RevitUtils.Extends
                 value = (box.Max - box.Min).Z;
             return value.FromApi();
         }
+        /// <summary>
+        /// »ñÈ¡É豸boxµÄÖÐÐÄ
+        /// </summary>
+        /// <param name="element"></param>
+        /// <returns></returns>
+        public static XYZ GetBoxCenter(this Element element)
+        {
+            XYZ xyz = null;
+            var box = element.get_BoundingBox(null);
+            if (box != null)
+                xyz = (box.Max + box.Min)/2;
+            return xyz;
+        }
     }
 }