From d0391ab843442636e468046a8ca40d6044fc0452 Mon Sep 17 00:00:00 2001 From: GG Z <903524121@qq.com> Date: Wed, 15 Dec 2021 18:02:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BB=BA=E7=AD=91=E5=A4=96=E5=9B=B4=E5=B0=BA?= =?UTF-8?q?=E5=AF=B8=E6=A0=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RookieStation.sln | 10 + .../ExecuteCmd/CreatePalanarViewAnnotation.cs | 629 ++++++++++++++++-- .../ExecuteCmd/CreateViewPlanAnnotation.cs | 14 +- RookieStation/RsApp.cs | 2 +- RookieStation/Utils/EnableCmdInViewPlan.cs | 2 +- TestTools/Class1.cs | 12 + TestTools/Properties/AssemblyInfo.cs | 36 + TestTools/TestCmd.cs | 119 ++++ TestTools/TestTools.csproj | 70 ++ TestTools/packages.config | 4 + 10 files changed, 847 insertions(+), 51 deletions(-) create mode 100644 TestTools/Class1.cs create mode 100644 TestTools/Properties/AssemblyInfo.cs create mode 100644 TestTools/TestCmd.cs create mode 100644 TestTools/TestTools.csproj create mode 100644 TestTools/packages.config diff --git a/RookieStation.sln b/RookieStation.sln index 8d4e448..d51d127 100644 --- a/RookieStation.sln +++ b/RookieStation.sln @@ -9,6 +9,8 @@ Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "RookieStationSetup", "Rooki EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddinDeployer", "AddinDeployer\AddinDeployer.csproj", "{C60B068A-90A8-4852-B6DC-28A2D3FF2753}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestTools", "TestTools\TestTools.csproj", "{1CCEEB54-FD53-4812-8C2D-3489E7883F86}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -39,6 +41,14 @@ Global {C60B068A-90A8-4852-B6DC-28A2D3FF2753}.Release|Any CPU.Build.0 = Release|Any CPU {C60B068A-90A8-4852-B6DC-28A2D3FF2753}.Release|x64.ActiveCfg = Release|x64 {C60B068A-90A8-4852-B6DC-28A2D3FF2753}.Release|x64.Build.0 = Release|x64 + {1CCEEB54-FD53-4812-8C2D-3489E7883F86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1CCEEB54-FD53-4812-8C2D-3489E7883F86}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1CCEEB54-FD53-4812-8C2D-3489E7883F86}.Debug|x64.ActiveCfg = Debug|Any CPU + {1CCEEB54-FD53-4812-8C2D-3489E7883F86}.Debug|x64.Build.0 = Debug|Any CPU + {1CCEEB54-FD53-4812-8C2D-3489E7883F86}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1CCEEB54-FD53-4812-8C2D-3489E7883F86}.Release|Any CPU.Build.0 = Release|Any CPU + {1CCEEB54-FD53-4812-8C2D-3489E7883F86}.Release|x64.ActiveCfg = Release|Any CPU + {1CCEEB54-FD53-4812-8C2D-3489E7883F86}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/RookieStation/Drawing/ExecuteCmd/CreatePalanarViewAnnotation.cs b/RookieStation/Drawing/ExecuteCmd/CreatePalanarViewAnnotation.cs index 2c5d395..4525676 100644 --- a/RookieStation/Drawing/ExecuteCmd/CreatePalanarViewAnnotation.cs +++ b/RookieStation/Drawing/ExecuteCmd/CreatePalanarViewAnnotation.cs @@ -28,7 +28,8 @@ namespace RookieStation.Drawing.ExecuteCmd doc.InvokeGroup(tg => { Room room = default; - var wallsToDim = new List(); + var singleWallsToDim = new List(); + Dictionary dics = new Dictionary(); doc.Invoke(ts => { room = CreateOuterRoom(doc.ActiveView, out modelCurveArray); @@ -44,16 +45,20 @@ namespace RookieStation.Drawing.ExecuteCmd IList edges = new List(); var boundingseg = room.GetBoundarySegments(options); - edges = boundingseg.LastOrDefault();//需要去重 + edges = boundingseg.LastOrDefault(); foreach (BoundarySegment segment in edges) { var curve = segment.GetCurve() as Line; if (curve != null) { var wall = doc.GetElement(segment.ElementId) as Wall; - if (wall != null) + var b = singleWallsToDim.Where(w => w.Id == wall.Id);//去重 + if (wall != null && b.Count() == 0) { - wallsToDim.Add(wall); + var l = wall.Location as LocationCurve; + singleWallsToDim.Add(wall); + + dics.Add(segment, wall); } } } @@ -68,16 +73,34 @@ namespace RookieStation.Drawing.ExecuteCmd doc.Invoke(ts => { - CreateWallDimension(doc, wallsToDim); - }); - //doc.Invoke(ts => - //{ - // doc.Delete(room.Id); - // foreach (ModelCurve curve in modelCurveArray) - // { - // doc.Delete(curve.Id); - // } - //}); + List wallList = GetWallListToDim(doc); + foreach (var outerwall in singleWallsToDim) + { + wallList.Remove(outerwall); + } + CreateInnterWallDimension(doc, wallList); + CreateOuterWallsDimByReferLines(doc, dics); + }, "创建墙尺寸标注"); + doc.Invoke(ts => + { + CreateColumnsDimension(doc); + CreateBeamsDimension(doc); + }, "创建梁和柱标注"); + doc.Invoke(ts => + { + doc.Delete(room.Id); + foreach (ModelCurve curve in modelCurveArray) + { + doc.Delete(curve.Id); + } + }, "删除临时房间"); + doc.Invoke(ts => + { + var visableCol = doc.QueryByView(doc.ActiveView).ToElements(); + CreateDoorWinTags(doc, visableCol); + CreateLightAnnotations(doc, visableCol); + CreateShelvesAnnotations(doc, visableCol); + }, "创建标注"); }); return Result.Succeeded; @@ -139,9 +162,10 @@ namespace RookieStation.Drawing.ExecuteCmd if (wallList.Count > 0) { List tempWallList = new List(); - double distance = 5; + double distance = 1000 / 304.8; List curveList = wallList.Select(p => RsRevitUtils.GetLocationCurveByElement(p)).ToList(); List xyzList = curveList.Select(p => p.GetEndPoint(0)).ToList(); + xyzList.AddRange(curveList.Select(p => p.GetEndPoint(1)).ToList()); double xMax = xyzList.Max(p => p.X) + distance; double xMin = xyzList.Min(p => p.X) - distance; @@ -208,6 +232,11 @@ namespace RookieStation.Drawing.ExecuteCmd } } + /// + /// 得到要标注的所有墙体 + /// + /// + /// public List GetWallListToDim(Document doc) { var wallList = doc.QueryByView(doc.ActiveView).Where(w => @@ -221,15 +250,17 @@ namespace RookieStation.Drawing.ExecuteCmd return wallList.ToList(); } - private static void CreateWallDimension(Document doc, List wallList) + private static void CreateInnterWallDimension(Document doc, List wallList) { foreach (Wall wall in wallList) { + if (wall.Id.IntegerValue == 1949460) + { + } + ReferenceArray wallLengthRefernceArray = new ReferenceArray(); - List faces = new List(); - //List faces = RsRevitUtils.GetSideFacesByElement(wall); + List faces = RsRevitUtils.GetSideFacesByElement(wall); List ids = FindWallIdsConnected(doc, wall); - //var edgearrarray = RsRevitUtils.GetBottomEdgeArrayArray(wall); foreach (var id in ids) { @@ -244,9 +275,12 @@ namespace RookieStation.Drawing.ExecuteCmd { continue; } - if (pf.FaceNormal.CrossProduct(wall.Orientation).IsAlmostEqualTo(XYZ.Zero)) { + //if (doc.GetElement(face.Reference).Id == wall.Id) + //{ + // wallThickReferenceArray.Append(face.Reference);//墙厚标注 + //} } else if (pf.FaceNormal.DotProduct(wall.Orientation) < 0.001) { @@ -261,14 +295,13 @@ namespace RookieStation.Drawing.ExecuteCmd var scale = doc.ActiveView.Scale; var tranform = Transform.CreateTranslation(wall.Orientation * scale * 15 / 304.8); var wallcurve = RsRevitUtils.GetLocationCurveByElement(wall) as Line; - Line lengthDimLine = wallcurve.CreateTransformed(tranform) as Line; - //Dimension lengthdim = null; - Dimension lengthdim = doc.Create.NewDimension(doc.ActiveView, lengthDimLine, wallLengthRefernceArray); + Line lengthLine = wallcurve.CreateTransformed(tranform) as Line; + var lengthdim = doc.Create.NewDimension(doc.ActiveView, lengthLine, wallLengthRefernceArray); doc.Regenerate(); - ReferenceArray finallengthreferenceArray = RemoveZeroReferences(wall, wallLengthRefernceArray, lengthdim); + ReferenceArray finallengthreferenceArray = RemoveZeroSegments(lengthdim); doc.Delete(lengthdim.Id); - lengthdim = doc.Create.NewDimension(doc.ActiveView, lengthDimLine, finallengthreferenceArray); + doc.Create.NewDimension(doc.ActiveView, lengthLine, finallengthreferenceArray); if (lengthdim.Segments.Size > 2) { @@ -278,9 +311,9 @@ namespace RookieStation.Drawing.ExecuteCmd referenceArray.Append(refer1); referenceArray.Append(refer2); var tranform1 = Transform.CreateTranslation(wall.Orientation * scale * 25 / 304.8); - Line lengthTotalDimLine = wallcurve.CreateTransformed(tranform1) as Line; + Line lengthLine1 = wallcurve.CreateTransformed(tranform1) as Line; - doc.Create.NewDimension(doc.ActiveView, lengthTotalDimLine, referenceArray); + doc.Create.NewDimension(doc.ActiveView, lengthLine1, referenceArray); } } catch (Exception) @@ -290,29 +323,542 @@ namespace RookieStation.Drawing.ExecuteCmd } } - private static ReferenceArray RemoveZeroReferences(Wall wall, ReferenceArray wallLengthRefernceArray, Dimension lengthdim) + private static void CreateOuterWallsDimByReferLines(Document doc, Dictionary dics) { - List referencesdelete = new List(); - var finallengthreferenceArray = new ReferenceArray(); - for (int i = 0; i < lengthdim.NumberOfSegments; i++) + for (int i = 0; i < dics.Values.Count; i++) { - if (lengthdim.Segments.get_Item(i).ValueString == "0") + Wall wall = dics.Values.ElementAt(i) as Wall; + + ReferenceArray wallRefernceArray = new ReferenceArray(); + List ids = FindWallIdsConnected(doc, wall); + //var edgearrarray = RsRevitUtils.GetBottomEdgeArrayArray(wall); + Line boundaryLine = dics.Keys.ElementAt(i).GetCurve() as Line; + if (boundaryLine == null) { - if (lengthdim.References.get_Item(i).ElementId == wall.Id) + continue; + } + //Line boundaryLine = Line.CreateBound(curve.GetEndPoint(0), curve.GetEndPoint(1));//直线方向 + XYZ offestVector = XYZ.BasisZ.CrossProduct(boundaryLine.Direction).Normalize(); + Options options = new Options() + { + ComputeReferences = true, + DetailLevel = ViewDetailLevel.Fine + }; + List faces = new List(); + List mainWallFaces = RsRevitUtils.GetSideFacesByElement(wall); + faces.AddRange(mainWallFaces); + //相交、相连墙体 + List intersectWallFaces = new List(); + foreach (var id in ids) + { + Element ele = doc.GetElement(id); + intersectWallFaces.AddRange(RsRevitUtils.GetSideFacesByElement(ele)); + faces.AddRange(RsRevitUtils.GetSideFacesByElement(ele)); + } + foreach (Face face in faces) + { + PlanarFace planarFace = face as PlanarFace; + if (planarFace.FaceNormal.IsAlmostEqualTo(offestVector)) { - referencesdelete.Add(lengthdim.References.get_Item(i)); + EdgeArrayArray edgeLoops = face.EdgeLoops; + foreach (EdgeArray edgeLoop in edgeLoops) + { + foreach (Edge edge in edgeLoop) + { + Line line = edge.AsCurve() as Line; + if (line != null && line.Direction.IsAlmostEqualTo(XYZ.BasisZ) || line.Direction.IsAlmostEqualTo(-XYZ.BasisZ))//垂直线 + { + wallRefernceArray.Append(edge.Reference); + } + } + } } - if (lengthdim.References.get_Item(i + 1).ElementId == wall.Id) + } + try + { + var scale = doc.ActiveView.Scale; + var tranform = Transform.CreateTranslation(offestVector * scale * 15 / 304.8); + var wallcurve = RsRevitUtils.GetLocationCurveByElement(wall) as Line; + Line lengthDimLine = wallcurve.CreateTransformed(tranform) as Line; + Dimension templengthdim = doc.Create.NewDimension(doc.ActiveView, lengthDimLine, wallRefernceArray); + //doc.Regenerate(); + ReferenceArray finallengthreferenceArray = RemoveZeroSegments(templengthdim); + //finallengthreferenceArray.Append(templengthdim.References.get_Item(templengthdim.References.Size - 1)); + //ReferenceArray finallengthreferenceArray = RemoveZeroSegments(wall, templengthdim); + + doc.Delete(templengthdim.Id); + + var finallengthdim = doc.Create.NewDimension(doc.ActiveView, lengthDimLine, finallengthreferenceArray); + + if (finallengthdim.Segments.Size >= 2) { - referencesdelete.Add(lengthdim.References.get_Item(i + 1)); + ReferenceArray referenceArray = new ReferenceArray(); + var refer1 = finallengthdim.References.get_Item(0); + var refer2 = finallengthdim.References.get_Item(finallengthdim.References.Size - 1); + referenceArray.Append(refer1); + referenceArray.Append(refer2); + var tranform1 = Transform.CreateTranslation(offestVector * scale * 20 / 304.8); + Line lengthTotalDimLine = wallcurve.CreateTransformed(tranform1) as Line; + + doc.Create.NewDimension(doc.ActiveView, lengthTotalDimLine, referenceArray); + } + } + catch (Exception ex) + { + continue; + } + } + } + + public void CreateColumnsDimension(Document doc) + { + var col = new FilteredElementCollector(doc, doc.ActiveView.Id); + ElementCategoryFilter categoryFilter1 = new ElementCategoryFilter(BuiltInCategory.OST_StructuralColumns); + ElementCategoryFilter categoryFilter2 = new ElementCategoryFilter(BuiltInCategory.OST_Columns); + LogicalOrFilter andFilter = new LogicalOrFilter(categoryFilter1, categoryFilter2); + col.WherePasses(andFilter); + var columns = col.GroupBy(g => g.Name).Select(s => s.FirstOrDefault()); + + foreach (FamilyInstance familyInstance in columns) + { + var loc = RsRevitUtils.GetLocationPointByElement(familyInstance); + var faces = RsRevitUtils.GetSideFacesByElement(familyInstance); + if (faces.Count == 0)//找不到实例的几何元素时,需从类型集合查找 + { + Options options = new Options + { + ComputeReferences = true + }; + faces = RsRevitUtils.GetFacesByFamilyInstance(familyInstance, options); + for (int i = faces.Count - 1; i >= 0; i--) + { + PlanarFace pf = faces[i] as PlanarFace; + if (pf.FaceNormal.CrossProduct(XYZ.BasisZ).IsAlmostEqualTo(XYZ.Zero)) + { + faces.Remove(faces[i]);//移除顶面底面 + } + } + } + var referenceArray = new ReferenceArray(); + var referenceArrayArray = new ReferenceArrayArray(); + GetParallFacesReferenceArray(faces, faces.FirstOrDefault(), referenceArray, referenceArrayArray); + foreach (ReferenceArray array in referenceArrayArray) + { + if (array.Size == 0) + { + continue; + } + var face = familyInstance.GetGeometryObjectFromReference(array.get_Item(0)) as PlanarFace; + var line = Line.CreateUnbound(loc, face.FaceNormal).CreateOffset(600 / 304.8, XYZ.BasisZ) as Line; + doc.Create.NewDimension(doc.ActiveView, line, array); + } + } + } + + public void CreateBeamsDimension(Document doc) + { + var col = new FilteredElementCollector(doc, doc.ActiveView.Id); + ElementCategoryFilter categoryFilter1 = new ElementCategoryFilter(BuiltInCategory.OST_StructuralFraming); + col.WherePasses(categoryFilter1); + var beams = col.GroupBy(g => g.Name).Select(s => s.FirstOrDefault()); + + foreach (FamilyInstance familyInstance in beams) + { + var loc = RsRevitUtils.GetLocationPointByElement(familyInstance); + var faces = RsRevitUtils.GetSideFacesByElement(familyInstance); + if (faces.Count == 0)//找不到实例的几何元素时,需从类型集合查找 + { + Options options = new Options + { + ComputeReferences = true + }; + faces = RsRevitUtils.GetFacesByFamilyInstance(familyInstance, options); + for (int i = faces.Count - 1; i >= 0; i--) + { + PlanarFace pf = faces[i] as PlanarFace; + if (pf.FaceNormal.CrossProduct(XYZ.BasisZ).IsAlmostEqualTo(XYZ.Zero)) + { + faces.Remove(faces[i]);//移除顶面底面 + } + } + } + var referenceArray = new ReferenceArray(); + var referenceArrayArray = new ReferenceArrayArray(); + GetParallFacesReferenceArray(faces, faces.FirstOrDefault(), referenceArray, referenceArrayArray); + foreach (ReferenceArray array in referenceArrayArray) + { + var face = familyInstance.GetGeometryObjectFromReference(array.get_Item(0)) as PlanarFace; + var line = Line.CreateUnbound(loc, face.FaceNormal).CreateOffset(600 / 304.8, XYZ.BasisZ) as Line; + doc.Create.NewDimension(doc.ActiveView, line, array); + } + } + } + + private void CreateDoorWinTags(Document doc, IList visableCol) + { + foreach (Element ele in visableCol) + { + var cate = ele.Category; + var loc = RsRevitUtils.GetLocationPointByElement(ele); + var d = ele as FamilyInstance; + if (loc != null && cate != null) + { + if (cate.Id.IntegerValue == -2000023 || cate.Id.IntegerValue == -2000014) + { + IndependentTag independentTag = IndependentTag.Create(doc, doc.ActiveView.Id, new Reference(ele), false, TagMode.TM_ADDBY_CATEGORY, TagOrientation.Horizontal, loc); + //ElementTransformUtils.RotateElement(doc, independentTag.Id, rotateaxis, d.HandOrientation.AngleTo(XYZ.BasisY)); + double substract = d.HandOrientation.AngleTo(XYZ.BasisX) - Math.PI / 2; + if (substract > -0.001 && substract < 0.001) + { + independentTag.TagOrientation = TagOrientation.Vertical; + } } } } - for (int i = 0; i < wallLengthRefernceArray.Size; i++) + } + + private void CreateLightAnnotations(Document doc, IList visableCol) + { + List lights; + CreateLightTags(doc, visableCol, out lights); + CreateLightXDimensions(doc, lights); + CreateLightYDimensions(doc, lights); + } + + private bool CreateLightTags(Document doc, IList visableCol, out List lights) + { + lights = new List(); + foreach (var light in visableCol) + { + var lightcategory = light.Category; + var loc = RsRevitUtils.GetLocationPointByElement(light); + if (loc != null) + { + loc -= new XYZ(-200 / 304.8, 200 / 304.8, 0); + } + if (loc != null && lightcategory != null && lightcategory.Id.IntegerValue == -2001120) + { + IndependentTag.Create(doc, doc.ActiveView.Id, new Reference(light), false, TagMode.TM_ADDBY_CATEGORY, TagOrientation.Horizontal, loc); + lights.Add(light); + } + } + + return true; + } + + private void CreateLightXDimensions(Document doc, List lights) + { + var lightDistincts = lights + .OrderBy(o => RsRevitUtils.GetLocationPointByElement(o).X) + .ThenBy(o => RsRevitUtils.GetLocationPointByElement(o).Y) + .GroupBy(l => Math.Round(RsRevitUtils.GetLocationPointByElement(l).X, 4)) + .Select(g => g.First()) + .ToList(); + var group = lightDistincts.GroupBy(g => g.Name);//按族类型名称分组 + List referenceArrays = new List(); + List lines = new List(); + foreach (var g in group) + { + ReferenceArray referenceArray = new ReferenceArray(); + Line line = Line.CreateUnbound(RsRevitUtils.GetLocationPointByElement(g.FirstOrDefault()), XYZ.BasisX); + foreach (FamilyInstance ele in g) + { + if (ele != null) + { + referenceArray.Append(ele.GetReferences(FamilyInstanceReferenceType.CenterLeftRight).FirstOrDefault()); + } + } + lines.Add(line); + referenceArrays.Add(referenceArray); + } + + for (int i = 0; i < referenceArrays.Count; i++) + { + ReferenceArray referenceArray = referenceArrays[i]; + Line line = lines[i]; + try + { + doc.Create.NewDimension(doc.ActiveView, line, referenceArray); + } + catch (Exception) + { + continue; + } + } + } + + private void CreateLightYDimensions(Document doc, List lights) + { + var lightDistincts = lights + .OrderBy(o => RsRevitUtils.GetLocationPointByElement(o).Y) + .ThenBy(o => RsRevitUtils.GetLocationPointByElement(o).X) + .GroupBy(l => Math.Round(RsRevitUtils.GetLocationPointByElement(l).Y, 4)) + .Select(g => g.First()) + .ToList(); + var group = lightDistincts.GroupBy(g => g.Name); + List referenceArrays = new List(); + List lines = new List(); + foreach (var g in group) + { + ReferenceArray referenceArray = new ReferenceArray(); + Line line = Line.CreateUnbound(RsRevitUtils.GetLocationPointByElement(g.FirstOrDefault()), XYZ.BasisY); + + foreach (FamilyInstance ele in g) + { + if (ele != null) + { + referenceArray.Append(ele.GetReferences(FamilyInstanceReferenceType.CenterFrontBack).FirstOrDefault()); + } + } + lines.Add(line); + + referenceArrays.Add(referenceArray); + } + + for (int i = 0; i < referenceArrays.Count; i++) + { + ReferenceArray referenceArray = referenceArrays[i]; + Line line = lines[i]; + try + { + doc.Create.NewDimension(doc.ActiveView, line, referenceArray); + } + catch (Exception) + { + continue; + } + } + } + + private static void CreateShelvesAnnotations(Document doc, IList visableCol) + { + var shelves = new List(); + foreach (var ele in visableCol) + { + var instance = ele as FamilyInstance; + if (instance != null && instance.Symbol.FamilyName.Contains("货架")) + { + shelves.Add(instance); + } + } + + CreateShelvesXDimensions(doc, shelves); + CreateShelvesYDimensions(doc, shelves); + } + + private static bool CreateShelvesYDimensions(Document doc, List shelves) + { + var shelfDistincts = shelves + .OrderBy(o => RsRevitUtils.GetLocationPointByElement(o).Y) + .ThenBy(o => RsRevitUtils.GetLocationPointByElement(o).X) + .GroupBy(l => Math.Round(RsRevitUtils.GetLocationPointByElement(l).Y, 4)) + .Select(g => g.First() as FamilyInstance) + .ToList(); + + Func p = g => + { + if (g.Room != null) + { + return g.Room; + } + else + { + return g.Name; + } + }; + var group = shelfDistincts.GroupBy(p); + List referenceArrays = new List(); + List lines = new List(); + foreach (var g in group) + { + ReferenceArray referenceArray = new ReferenceArray(); + Line line = Line.CreateUnbound(RsRevitUtils.GetLocationPointByElement(g.FirstOrDefault()), XYZ.BasisY); + + for (int i = 0; i < g.Count(); i++) + { + FamilyInstance ele = g.ElementAt(i); + + if (ele == null) + { + continue; + } + if (ele.FacingOrientation.CrossProduct(XYZ.BasisX).IsAlmostEqualTo(XYZ.Zero)) + { + //referenceArray.Append(ele.GetReferences(FamilyInstanceReferenceType.Left).FirstOrDefault()); + referenceArray.Append(ele.GetReferences(FamilyInstanceReferenceType.Right).FirstOrDefault()); + } + else + { + //if (i < g.Count() - 1)//通道标注 + //{ + // if (ele.Symbol.GetParameters("长度").FirstOrDefault().AsDouble() < RsRevitUtils.GetLocationPointByElement(g.ElementAt(i + 1)).DistanceTo(RsRevitUtils.GetLocationPointByElement(g.ElementAt(i)))) + // { + // referenceArray.Append(ele.GetReferences(FamilyInstanceReferenceType.Back).FirstOrDefault()); + // } + //} + referenceArray.Append(ele.GetReferences(FamilyInstanceReferenceType.Front).FirstOrDefault()); + //referenceArray.Append(ele.GetReferences(FamilyInstanceReferenceType.Back).FirstOrDefault()); + } + } + lines.Add(line); + + referenceArrays.Add(referenceArray); + } + + for (int i = 0; i < referenceArrays.Count; i++) + { + ReferenceArray referenceArray = referenceArrays[i]; + Line line = lines[i]; + try + { + doc.Create.NewDimension(doc.ActiveView, line, referenceArray); + } + catch (Exception) + { + continue; + } + } + return true; + } + + private static bool CreateShelvesXDimensions(Document doc, List shelves) + { + var shelfDistincts = shelves + .OrderBy(o => RsRevitUtils.GetLocationPointByElement(o).X) + .ThenBy(o => RsRevitUtils.GetLocationPointByElement(o).Y) + .GroupBy(l => Math.Round(RsRevitUtils.GetLocationPointByElement(l).X, 4)) + .Select(g => g.First() as FamilyInstance) + .ToList(); + Func p = g => + { + if (g.Room != null) + { + return g.Room; + } + else + { + return g.Name; + } + }; + var group = shelfDistincts.GroupBy(p); + List referenceArrays = new List(); + List lines = new List(); + foreach (var g in group) + { + ReferenceArray referenceArray = new ReferenceArray(); + Line line = Line.CreateUnbound(RsRevitUtils.GetLocationPointByElement(g.FirstOrDefault()), XYZ.BasisX); + + for (int i = 0; i < g.Count(); i++) + { + FamilyInstance ele = g.ElementAt(i); + if (ele == null) + { + continue; + } + if (ele.FacingOrientation.CrossProduct(XYZ.BasisX).IsAlmostEqualTo(XYZ.Zero)) + { + //if (i > 0)//通道标注 + //{ + // if (ele.Symbol.GetParameters("长度").FirstOrDefault().AsDouble() < RsRevitUtils.GetLocationPointByElement(g.ElementAt(i - 1)).DistanceTo(RsRevitUtils.GetLocationPointByElement(g.ElementAt(i)))) + // { + // referenceArray.Append(ele.GetReferences(FamilyInstanceReferenceType.Back).FirstOrDefault()); + // } + //} + + //referenceArray.Append(ele.GetReferences(FamilyInstanceReferenceType.Back).FirstOrDefault()); + referenceArray.Append(ele.GetReferences(FamilyInstanceReferenceType.Front).FirstOrDefault()); + } + else + { + //referenceArray.Append(ele.GetReferences(FamilyInstanceReferenceType.Left).FirstOrDefault()); + referenceArray.Append(ele.GetReferences(FamilyInstanceReferenceType.Right).FirstOrDefault()); + } + } + lines.Add(line); + + referenceArrays.Add(referenceArray); + } + + for (int i = 0; i < referenceArrays.Count; i++) + { + ReferenceArray referenceArray = referenceArrays[i]; + Line line = lines[i]; + try + { + doc.Create.NewDimension(doc.ActiveView, line, referenceArray); + } + catch (Exception) + { + continue; + } + } + return true; + } + + public void GetParallFacesReferenceArray(List faces, Face firstFace, ReferenceArray referenceArray, ReferenceArrayArray referenceArrayArray) + { + if (referenceArrayArray.Size == 0) + { + referenceArrayArray.Append(referenceArray); + } + for (int i = 0; i < faces.Count; i++) + { + PlanarFace tempFace = faces[i] as PlanarFace; + var pf = firstFace as PlanarFace; + var facenormal = pf.FaceNormal; + //把初始的第一个添加进集合 + + if (tempFace.FaceNormal.CrossProduct(facenormal).IsAlmostEqualTo(XYZ.Zero)) + { + referenceArray.Append(tempFace.Reference); + faces.Remove(tempFace); + GetParallFacesReferenceArray(faces, tempFace, referenceArray, referenceArrayArray); + } + if (i == faces.Count() - 1) + { + referenceArray = new ReferenceArray(); + GetParallFacesReferenceArray(faces, faces.FirstOrDefault(), referenceArray, referenceArrayArray); + if (faces.Count() == 0) + { + referenceArrayArray.Append(referenceArray); + } + } + } + } + + private static ReferenceArray RemoveZeroSegments(Dimension lengthdim) + { + Document doc = lengthdim.Document; + View view = lengthdim.View; + var finalreferenceArray = new ReferenceArray(); + var deleteReferenceArray = new ReferenceArray(); + for (int i = 0; i < lengthdim.References.Size; i++) + { + var reference1 = lengthdim.References.get_Item(i); + for (int j = i + 1; j < lengthdim.References.Size; j++) + { + var reference2 = lengthdim.References.get_Item(j); + ReferenceArray referenceArray = new ReferenceArray(); + Line line = lengthdim.Curve as Line; + referenceArray.Append(reference1); + referenceArray.Append(reference2); + Dimension dimension = doc.Create.NewDimension(view, line, referenceArray); + + if (dimension.ValueString == "0") + { + deleteReferenceArray.Append(reference2); + } + doc.Delete(dimension.Id); + } + + //doc.Regenerate(); + } + + for (int i = 0; i < lengthdim.References.Size; i++) { bool isContain = false; - var reference = wallLengthRefernceArray.get_Item(i); - foreach (var referdelete in referencesdelete) + var reference = lengthdim.References.get_Item(i); + foreach (Reference referdelete in deleteReferenceArray) { if (reference.EqualTo(referdelete)) { @@ -321,11 +867,10 @@ namespace RookieStation.Drawing.ExecuteCmd } if (!isContain) { - finallengthreferenceArray.Append(reference); + finalreferenceArray.Append(reference); } } - - return finallengthreferenceArray; + return finalreferenceArray; } private static List FindWallIdsConnected(Document doc, Wall w) diff --git a/RookieStation/Drawing/ExecuteCmd/CreateViewPlanAnnotation.cs b/RookieStation/Drawing/ExecuteCmd/CreateViewPlanAnnotation.cs index a5ea594..de2be27 100644 --- a/RookieStation/Drawing/ExecuteCmd/CreateViewPlanAnnotation.cs +++ b/RookieStation/Drawing/ExecuteCmd/CreateViewPlanAnnotation.cs @@ -12,6 +12,7 @@ using Autodesk.Revit.DB.Architecture; namespace RookieStation.Drawing.ExecuteCmd { + [Obsolete] [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] [Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)] internal class CreateViewPlanAnnotation : IExternalCommand @@ -657,9 +658,8 @@ namespace RookieStation.Drawing.ExecuteCmd //{ // continue; //} - //ReferenceArray wallThickReferenceArray = new ReferenceArray(); + ReferenceArray wallThickReferenceArray = new ReferenceArray(); ReferenceArray wallLengthRefernceArray = new ReferenceArray(); - ReferenceArray ColumnLengthRefernceArray = new ReferenceArray(); List faces = RsRevitUtils.GetSideFacesByElement(wall); List ids = FindWallIdsConnected(doc, wall); @@ -679,10 +679,10 @@ namespace RookieStation.Drawing.ExecuteCmd if (pf.FaceNormal.CrossProduct(wall.Orientation).IsAlmostEqualTo(XYZ.Zero)) { - //if (doc.GetElement(face.Reference).Id == wall.Id) - //{ - // wallThickReferenceArray.Append(face.Reference);//墙厚标注 - //} + if (doc.GetElement(face.Reference).Id == wall.Id) + { + wallThickReferenceArray.Append(face.Reference);//墙厚标注 + } } else if (pf.FaceNormal.DotProduct(wall.Orientation) < 0.001) { @@ -706,7 +706,7 @@ namespace RookieStation.Drawing.ExecuteCmd doc.Create.NewDimension(doc.ActiveView, lengthLine, finallengthreferenceArray); Line thickLine = Line.CreateUnbound(wallcurve.Evaluate(0.2, true), wall.Orientation); - //var thickdim = doc.Create.NewDimension(doc.ActiveView, thickLine, wallThickReferenceArray); + var thickdim = doc.Create.NewDimension(doc.ActiveView, thickLine, wallThickReferenceArray); if (lengthdim.Segments.Size > 2) { diff --git a/RookieStation/RsApp.cs b/RookieStation/RsApp.cs index 4bc81cd..25ca064 100644 --- a/RookieStation/RsApp.cs +++ b/RookieStation/RsApp.cs @@ -227,7 +227,7 @@ namespace RookieStation.RibbonMenu tspb.AddPushButton(ManualAlignPBD); tspb.AddPushButton(autoAlignPBD); - NewPushButtonData(drawingPanel, "平面标注", Properties.Resources.ViewPlanDim, ViewPlanCmdEnabled); + NewPushButtonData(drawingPanel, "平面标注", Properties.Resources.ViewPlanDim, ViewPlanCmdEnabled); NewPushButtonData(drawingPanel, "立面标注", Properties.Resources.ViewSectionDim, ViewSectionCmdEnabled); NewPushButtonData(drawingPanel, "创建导线", Properties.Resources.Wire, ViewPlanCmdEnabled); var UnifyViewportPBD = NewPushButtonData(drawingPanel, "统一视口", Properties.Resources.UnifyViewport, ViewPlanCmdEnabled); diff --git a/RookieStation/Utils/EnableCmdInViewPlan.cs b/RookieStation/Utils/EnableCmdInViewPlan.cs index 19150fd..b58ebc3 100644 --- a/RookieStation/Utils/EnableCmdInViewPlan.cs +++ b/RookieStation/Utils/EnableCmdInViewPlan.cs @@ -31,7 +31,7 @@ namespace RookieStation.Utils if (null != applicationData.ActiveUIDocument) { Autodesk.Revit.DB.View view = applicationData.ActiveUIDocument.Document.ActiveView; - if (view.ViewType == ViewType.FloorPlan && !applicationData.ActiveUIDocument.Document.IsFamilyDocument) + if (view.ViewType == ViewType.FloorPlan || view.ViewType == ViewType.CeilingPlan && !applicationData.ActiveUIDocument.Document.IsFamilyDocument) { return true; } diff --git a/TestTools/Class1.cs b/TestTools/Class1.cs new file mode 100644 index 0000000..a4dc768 --- /dev/null +++ b/TestTools/Class1.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TestTools +{ + public class Class1 + { + } +} diff --git a/TestTools/Properties/AssemblyInfo.cs b/TestTools/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d74d11b --- /dev/null +++ b/TestTools/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("TestTools")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TestTools")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("1cceeb54-fd53-4812-8c2d-3489e7883f86")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/TestTools/TestCmd.cs b/TestTools/TestCmd.cs new file mode 100644 index 0000000..0dcddb1 --- /dev/null +++ b/TestTools/TestCmd.cs @@ -0,0 +1,119 @@ +using Autodesk.Revit.DB; +using Autodesk.Revit.UI; +using Autodesk.Revit.UI.Selection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TestTools +{ + [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] + [Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)] + public class TestCmd : Autodesk.Revit.UI.IExternalCommand + { + public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) + { + UIApplication uiapp = commandData.Application; + UIDocument uidoc = uiapp.ActiveUIDocument; + Autodesk.Revit.ApplicationServices.Application app = uiapp.Application; + Document doc = uidoc.Document; + DocumentSet docset = uiapp.Application.Documents; + + Reference refer = uidoc.Selection.PickObject(ObjectType.Element, "请选择XXX"); + Element e = uidoc.Document.GetElement(refer); + Options options = new Options() + { + ComputeReferences = true, + DetailLevel = ViewDetailLevel.Fine, + }; + var eleIds = e.GetGeneratingElementIds(e.get_Geometry(options)); + uidoc.Selection.SetElementIds(eleIds); + + #region FilterExecute + + //var walls = new FilteredElementCollector(doc).OfClass(typeof(Wall)).ToElements(); + //using (Transaction trans = new Transaction(doc, "default")) + //{ + // try + // { + // trans.Start(); + // //Do Something. + // trans.Commit(); + // } + // catch (Exception ex) + // { + // message = ex.Message; + // if (trans.GetStatus() == TransactionStatus.Started) + // { + // trans.RollBack(); + // } + // return Result.Failed; + // } + //} + + #endregion FilterExecute + + #region RepeatExecute + + //bool isCoutine = true; + //using (Transaction trans = new Transaction(doc, "default")) + //{ + // try + // { + // while (isCoutine) + // { + // try + // { + // trans.Start(); + // //do something. + // trans.Commit(); + // } + // catch (Autodesk.Revit.Exceptions.OperationCanceledException ex) + // { + // trans.Commit(); + // return Result.Succeeded; + // } + // } + // } + // catch (Exception ex) + // { + // message = ex.Message; + // if (trans.GetStatus() == TransactionStatus.Started) + // { + // trans.RollBack(); + // } + // return Result.Failed; + // } + //} + + #endregion RepeatExecute + + #region SelectExecute + + //using (Transaction trans = new Transaction(doc, "default")) + //{ + // try + // { + // Reference refer = uidoc.Selection.PickObject(ObjectType.Element, "请选择XXX"); + // Element e = uidoc.Document.GetElement(refer); + + // trans.Start(); + + // trans.Commit(); + // } + // catch (Autodesk.Revit.Exceptions.OperationCanceledException ex) + // { + // } + // catch (Exception ex) + // { + // } + //} + + #endregion SelectExecute + + return Result.Succeeded; + } + } +} \ No newline at end of file diff --git a/TestTools/TestTools.csproj b/TestTools/TestTools.csproj new file mode 100644 index 0000000..f8966ef --- /dev/null +++ b/TestTools/TestTools.csproj @@ -0,0 +1,70 @@ + + + + + Debug + AnyCPU + {1CCEEB54-FD53-4812-8C2D-3489E7883F86} + Library + Properties + TestTools + TestTools + v4.7.2 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Revit_API_x64.2020.0.0\lib\NET470\AdWindows.dll + + + ..\packages\Revit_API_x64.2020.0.0\lib\NET470\RevitAddInUtility.dll + + + ..\packages\Revit_API_x64.2020.0.0\lib\NET470\RevitAPI.dll + + + ..\packages\Revit_API_x64.2020.0.0\lib\NET470\RevitAPIUI.dll + + + + + + + + + + + ..\packages\Revit_API_x64.2020.0.0\lib\NET470\UIFramework.dll + + + ..\packages\Revit_API_x64.2020.0.0\lib\NET470\UIFrameworkServices.dll + + + + + + + + + + + + \ No newline at end of file diff --git a/TestTools/packages.config b/TestTools/packages.config new file mode 100644 index 0000000..70bf410 --- /dev/null +++ b/TestTools/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file