From ed4a8eaa3492581ffd16bfc1c4286fafb7c3fbba Mon Sep 17 00:00:00 2001 From: GG Z <903524121@qq.com> Date: Wed, 25 Aug 2021 14:56:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E5=8F=B0=E5=B8=83=E7=BD=AELOGO?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Drawing/ExecuteCmds/CmdBatchExportDwg.cs | 9 +- .../CmdCreateCentralizeAnnotation.cs | 63 -- .../ExecuteCmds/CmdLogoExtrusion.cs | 278 ++++---- .../ExecuteCmds/CmdPlaceReceptionArea.cs | 623 ++++++++++++------ .../Views/WpfReceptionArea.xaml | 84 +-- .../Views/WpfReceptionArea.xaml.cs | 20 +- .../Views/WpfProjectSettings.xaml | 5 +- RookieStation/RookieStation.csproj | 1 - RookieStation/RsApp.cs | 8 +- RookieStation/UserConstant.cs | 2 +- RookieStation/Utils/RsRevitUtils.cs | 46 +- RookieStationSetup/RookieStationSetup.vdproj | 6 +- 12 files changed, 675 insertions(+), 470 deletions(-) delete mode 100644 RookieStation/Drawing/ExecuteCmds/CmdCreateCentralizeAnnotation.cs diff --git a/RookieStation/Drawing/ExecuteCmds/CmdBatchExportDwg.cs b/RookieStation/Drawing/ExecuteCmds/CmdBatchExportDwg.cs index 6bc59b4..b7eecec 100644 --- a/RookieStation/Drawing/ExecuteCmds/CmdBatchExportDwg.cs +++ b/RookieStation/Drawing/ExecuteCmds/CmdBatchExportDwg.cs @@ -25,7 +25,14 @@ namespace RookieStation.Drawing.ExecuteCmds { MergedViews = true, }; - doc.Export(@"C:\Users\Administrator\Desktop\新建文件夹", "导出", sheets, dWGExportOptions); + VistaFolderBrowserDialog folderBrowserDialog = new VistaFolderBrowserDialog() + { + Multiselect = false, + }; + if (folderBrowserDialog.ShowDialog()) + { + doc.Export(folderBrowserDialog.SelectedPath, "导出", sheets, dWGExportOptions); + } return Result.Succeeded; } diff --git a/RookieStation/Drawing/ExecuteCmds/CmdCreateCentralizeAnnotation.cs b/RookieStation/Drawing/ExecuteCmds/CmdCreateCentralizeAnnotation.cs deleted file mode 100644 index 714174f..0000000 --- a/RookieStation/Drawing/ExecuteCmds/CmdCreateCentralizeAnnotation.cs +++ /dev/null @@ -1,63 +0,0 @@ -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 RookieStation.Drawing.ExecuteCmds -{ - [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] - [Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)] - internal class CmdCreateCentralizeAnnotation : 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; - using (Transaction trans = new Transaction(doc, "cmd")) - { - try - { - SelectionFilter selfilter = new SelectionFilter(); - var refers = uidoc.Selection.PickObjects(ObjectType.Element, "请选择元素"); - - trans.Start(); - //Do Something. - trans.Commit(); - } - catch (Autodesk.Revit.Exceptions.OperationCanceledException ex) - { - if (trans.GetStatus() == TransactionStatus.Started) - { - trans.RollBack(); - } - return Result.Cancelled; - } - } - return Result.Succeeded; - } - - public class SelectionFilter : ISelectionFilter - { - public bool AllowElement(Element element) - { - if (element.Category.Name == "XXX") - { - return true; - } - return false; - } - - public bool AllowReference(Reference refer, XYZ point) - { - return false; - } - } - } -} \ No newline at end of file diff --git a/RookieStation/MailingAreaModule/ExecuteCmds/CmdLogoExtrusion.cs b/RookieStation/MailingAreaModule/ExecuteCmds/CmdLogoExtrusion.cs index 7335b6e..2bfc178 100644 --- a/RookieStation/MailingAreaModule/ExecuteCmds/CmdLogoExtrusion.cs +++ b/RookieStation/MailingAreaModule/ExecuteCmds/CmdLogoExtrusion.cs @@ -6,6 +6,7 @@ using RookieStation.Utils; using System; using System.Collections.Generic; using System.Linq; +using System.Windows.Forms; namespace RookieStation.MailingAreaModule.ExecuteCmds { @@ -19,136 +20,166 @@ namespace RookieStation.MailingAreaModule.ExecuteCmds UIDocument uidoc = uiapp.ActiveUIDocument; Autodesk.Revit.ApplicationServices.Application app = uiapp.Application; Document doc = uidoc.Document; - //var instances = new FilteredElementCollector(doc).OfClass(typeof(ImportInstance)).Cast(); + var viewSections = new FilteredElementCollector(doc).OfClass(typeof(ViewSection)).Cast(); + Autodesk.Revit.DB.View pView = null; + foreach (var viewSection in viewSections) + { + if (viewSection.ViewDirection.IsAlmostEqualTo(-XYZ.BasisY)) + { + pView = viewSection; + break; + } + } List curves = new List(); ImportInstance importInstance = null; string familyfilename = string.Empty; //var geometryElement = instances.First().get_Geometry(new Options()); - try + ElementId eId = null; + + return doc.InvokeGroup(tg => + { + try + { + OpenFileDialog openFileDialog = new OpenFileDialog() + { + Filter = "dwg文件|*.dwg", + CheckFileExists = true, + Multiselect = false, + }; + if (openFileDialog.ShowDialog() != DialogResult.OK) + { + return Result.Cancelled; + } + doc.Invoke(ts => + { + DWGImportOptions importOptions = new DWGImportOptions() + { + Placement = ImportPlacement.Centered, + ThisViewOnly = true, + VisibleLayersOnly = true + }; + doc.Link(openFileDialog.FileName, importOptions, pView, out eId); + }); + + //var importRefer = uidoc.Selection.PickObject(ObjectType.Element, new SelectFilter(), "请选择CAD图块"); + importInstance = doc.GetElement(eId) as ImportInstance; + familyfilename = importInstance.Category.Name; + //familyfilename = s.Substring(0, s.LastIndexOf(".")); + var geometryElement = importInstance.get_Geometry(new Options()); + foreach (var geomObj in geometryElement) + { + GeometryInstance geometryInstance = geomObj as GeometryInstance; + if (geometryInstance != null) + { + foreach (var instObj in geometryInstance.GetSymbolGeometry()) + { + Curve curve = instObj as Curve; + if (curve != null) + { + curves.Add(curve); + } + PolyLine polyLine = instObj as PolyLine; + if (polyLine != null) + { + var points = polyLine.GetCoordinates(); + for (int i = 0; i < points.Count - 1; i++) + { + try + { + Line line = Line.CreateBound(points[i], points[i + 1]); + curves.Add(line); + } + catch (Exception) + { + continue; + } + } + } + } + } + } + } + catch (Autodesk.Revit.Exceptions.OperationCanceledException) + { + return Result.Cancelled; + } + + CurveArrArray arrArray = new CurveArrArray(); + CurveArray array = new CurveArray(); + if (curves.Count == 0) + { + return Result.Failed; + } + SearchCurveConnected(curves, curves.FirstOrDefault(), array, arrArray); + string rftPath = app.FamilyTemplatePath + "\\概念体量\\公制体量.rft"; + + Document faDoc = app.NewFamilyDocument(rftPath); + + faDoc.Invoke(ts => + { + XYZ pt = new XYZ(0, -40 / 304.8, 0); + SketchPlane plane = SketchPlane.Create(faDoc, Plane.CreateByNormalAndOrigin(-XYZ.BasisY, XYZ.Zero)); + CreateFormAndAssociateMaterialParam(faDoc, "发光材质", plane, arrArray, pt); + }); + Family fa = faDoc.LoadFamily(doc, new RsFamilyLoadOption()); + faDoc.Close(false); + + doc.Invoke(ts => + { + if (fa != null) + { + FamilySymbol familySymbol = doc.GetElement(fa.GetFamilySymbolIds().FirstOrDefault()) as FamilySymbol; + + for (int i = 0; i < 100; i++) + { + try + { + string name = $"{familyfilename} {i}"; + fa.Name = name; + familySymbol.Name = name; + break; + } + catch (Exception) + { + continue; + } + } + + if (familySymbol.IsActive == false) + { + familySymbol.Activate(); + } + doc.Create.NewFamilyInstance(importInstance.GetTransform().Origin, familySymbol, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); + } + doc.Delete(eId); + }); + return Result.Succeeded; + }, "校名校徽挤出"); + } + + private void CreateFormAndAssociateMaterialParam(Document faDoc, string paramName, SketchPlane plane, CurveArrArray arrArray, XYZ extrusionDirection) + { + var materialparam = faDoc.FamilyManager.AddParameter(paramName, BuiltInParameterGroup.PG_MATERIALS, ParameterType.Material, false); + foreach (CurveArray arr in arrArray) { - var importRefer = uidoc.Selection.PickObject(ObjectType.Element, new SelectFilter(), "请选择CAD图块"); - importInstance = doc.GetElement(importRefer) as ImportInstance; - string s = importInstance.Category.Name; - familyfilename = s.Substring(0, s.LastIndexOf(".")); - var geometryElement = importInstance.get_Geometry(new Options()); - foreach (var geomObj in geometryElement) + ReferenceArray referenceArray = new ReferenceArray(); + //无法创建实体时,则创建为模型线 + foreach (Curve curve in arr) { - GeometryInstance geometryInstance = geomObj as GeometryInstance; - if (geometryInstance != null) - { - foreach (var instObj in geometryInstance.GetSymbolGeometry()) - { - Curve curve = instObj as Curve; - if (curve != null) - { - curves.Add(curve); - } - PolyLine polyLine = instObj as PolyLine; - if (polyLine != null) - { - var points = polyLine.GetCoordinates(); - for (int i = 0; i < points.Count - 1; i++) - { - try - { - Line line = Line.CreateBound(points[i], points[i + 1]); - curves.Add(line); - } - catch (Exception) - { - continue; - } - } - } - } - } + var ml = faDoc.FamilyCreate.NewModelCurve(curve, plane); + + referenceArray.Append(ml.GeometryCurve.Reference); + } + try + { + var form = faDoc.FamilyCreate.NewExtrusionForm(true, referenceArray, extrusionDirection); + faDoc.FamilyManager.AssociateElementParameterToFamilyParameter(form.get_Parameter(BuiltInParameter.MATERIAL_ID_PARAM), materialparam); + } + catch (Exception) + { + continue; } } - catch (Autodesk.Revit.Exceptions.OperationCanceledException) - { - return Result.Cancelled; - } - - //doc.Invoke(ts => - //{ - // foreach (var curve in curves) - // { - // SketchPlane plane = SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(XYZ.BasisZ, XYZ.Zero)); - // doc.FamilyCreate.NewModelCurve(curve, plane); - // } - //}); - CurveArrArray arrArray = new CurveArrArray(); - CurveArray array = new CurveArray(); - if (curves.Count == 0) - { - return Result.Failed; - } - SearchCurveConnected(curves, curves.FirstOrDefault(), array, arrArray); - string rftPath = app.FamilyTemplatePath + "\\概念体量\\公制体量.rft"; - - Document faDoc = app.NewFamilyDocument(rftPath); - - doc.InvokeGroup(tg => - { - faDoc.Invoke(ts => - { - SketchPlane plane = SketchPlane.Create(faDoc, Plane.CreateByNormalAndOrigin(XYZ.BasisZ, XYZ.Zero)); - - List cls = new List(); - foreach (CurveArray arr in arrArray) - { - ReferenceArray referenceArray = new ReferenceArray(); - foreach (Curve curve in arr) - { - var ml = faDoc.FamilyCreate.NewModelCurve(curve, plane); - referenceArray.Append(ml.GeometryCurve.Reference); - } - - try - { - faDoc.FamilyCreate.NewExtrusionForm(true, referenceArray, new XYZ(0, 0, 10 / 304.8)); - } - catch (Exception) - { - //TaskDialog.Show("温馨提示", "实体无法创建"); - //TaskDialog.Show("温馨提示", ex.Message + "\n\r" + ex.InnerException.ToString()); - continue; - } - - //var ml = doc.FamilyCreate.NewModelCurveArray(arr, plane); - //foreach (ModelCurve c in ml) - //{ - // referenceArray.Append(c.GeometryCurve.Reference); - //} - } - - //foreach (CurveArray arr in arrArray) - //{ - // var ml = doc.FamilyCreate.NewModelCurveArray(arr, plane); - // //doc.FamilyCreate.NewExtrusion(true, arrArray, plane, 5.0 / 304.8); - //} - }); - Family fa = faDoc.LoadFamily(doc); - - faDoc.Close(false); - - doc.Invoke(ts => - { - if (fa != null) - { - FamilySymbol familySymbol = doc.GetElement(fa.GetFamilySymbolIds().FirstOrDefault()) as FamilySymbol; - fa.Name = familyfilename; - familySymbol.Name = familyfilename; - if (familySymbol.IsActive == false) - { - familySymbol.Activate(); - } - doc.Create.NewFamilyInstance(importInstance.GetTransform().Origin, familySymbol, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); - } - }); - }); - - return Result.Succeeded; } /// @@ -169,13 +200,12 @@ namespace RookieStation.MailingAreaModule.ExecuteCmds Curve tempCurve = curves[i]; var baseEndXyz = initcurve.GetEndPoint(0); //把初始的第一个添加进集合 - if (tempCurve.GetEndPoint(0).IsAlmostEqualTo(baseEndXyz) || tempCurve.GetEndPoint(1).IsAlmostEqualTo(baseEndXyz))//可以为重合的线,做剔除 { initCurveArray.Append(tempCurve); curves.Remove(tempCurve); //将tempcurve作为起点继续查找 - SearchCurveConnected(curves, tempCurve, initCurveArray, curveArrArray);//最后一次执行方法也在此处 + SearchCurveConnected(curves, tempCurve, initCurveArray, curveArrArray);//最后一次执行方法在此处,因为size为0,停止继续执行 } //遍历完一个线串时,寻找下一个线串,即查找到最后,都找不到相连的曲线时 diff --git a/RookieStation/MailingAreaModule/ExecuteCmds/CmdPlaceReceptionArea.cs b/RookieStation/MailingAreaModule/ExecuteCmds/CmdPlaceReceptionArea.cs index 3d6a836..c872022 100644 --- a/RookieStation/MailingAreaModule/ExecuteCmds/CmdPlaceReceptionArea.cs +++ b/RookieStation/MailingAreaModule/ExecuteCmds/CmdPlaceReceptionArea.cs @@ -12,6 +12,9 @@ using RookieStation.MailingAreaModule.Views; using System.Windows.Media.Media3D; using System.Windows.Documents; using System.IO; +using System.Windows.Controls; +using System.Windows.Forms; +using System.Runtime.InteropServices; namespace RookieStation.MailingAreaModule.ExecuteCmds { @@ -37,24 +40,25 @@ namespace RookieStation.MailingAreaModule.ExecuteCmds public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiapp = commandData.Application; + Autodesk.Revit.ApplicationServices.Application app = uiapp.Application; UIDocument uidoc = uiapp.ActiveUIDocument; Document doc = uidoc.Document; revitWindow = uiapp.MainWindowHandle; WpfReceptionArea receptionAreaPlacement = CommonUtils.ShowDialog(); //初始值 - //基层厚度 - double baseLayerThickness = 15 / 304.8; + //阻燃板厚度 + double fireRetardantBoardWidth = 15 / 304.8; //踢脚线高度 double skirtingLineHeight = 50 / 304.8; //踢脚线厚度 - double skirtingLineThickness = 1.2 / 304.8; + double skirtingLineWidth = 1.2 / 304.8; //铝塑板长度 double aluminumPlasticPanelLength = 0; //铝塑板高度 double aluminumPlasticPanelHeight = 0; //铝塑板厚度 - double aluminumPlasticPanelThickness = 3 / 304.8; + double aluminumPlasticPanelWidth = 3 / 304.8; //分缝 double gap = 2 / 304.8; //灰色乳胶漆厚度 @@ -67,6 +71,7 @@ namespace RookieStation.MailingAreaModule.ExecuteCmds double lampsInterval = 0; //灯高度 double lampsHeight = 0; + string fullFileName = string.Empty; if (receptionAreaPlacement.DialogResult == true) { @@ -82,6 +87,7 @@ namespace RookieStation.MailingAreaModule.ExecuteCmds lampsWallDistance = receptionAreaPlacement.LampWallDistance / 304.8; lampsInterval = receptionAreaPlacement.LampsInterval / 304.8; lampsHeight = receptionAreaPlacement.LampsHeight / 304.8; + fullFileName = receptionAreaPlacement.DwgPath; } else { @@ -92,8 +98,7 @@ namespace RookieStation.MailingAreaModule.ExecuteCmds { return Result.Failed; } - FamilySymbol symbol; - return doc.InvokeGroup(tg => + return doc.InvokeGroup(tg => { try { @@ -123,215 +128,428 @@ namespace RookieStation.MailingAreaModule.ExecuteCmds double backgroundWallLength = referline.Length; if (backgroundWallLength < 3000 / 304.8) { - TaskDialog.Show("温馨提示", "长度需大于3000mm"); + TaskDialog.Show("温馨提示", "背景墙长度需大于3000mm,否则无法生成寄件接待台"); return Result.Cancelled; } List wallIds = new List(); - WallType baseLayerType = null; - baseLayerThickness = RsRevitUtils.GetWallWidthByWallTypeName(doc, "阻燃板", out baseLayerType); - - WallType greyEmulsionPaintType = null; - greyEmulsionPaintWidth = RsRevitUtils.GetWallWidthByWallTypeName(doc, "灰色乳胶漆", out greyEmulsionPaintType); - - WallType aluminumPlasticPanelType = null; - aluminumPlasticPanelThickness = RsRevitUtils.GetWallWidthByWallTypeName(doc, "铝塑板", out aluminumPlasticPanelType); - - WallType skirtingLineType = null; - skirtingLineThickness = RsRevitUtils.GetWallWidthByWallTypeName(doc, "踢脚线", out skirtingLineType); + WallType fireRetardantBoard = RsRevitUtils.GetWallTypeByName(doc, "阻燃板"); + WallType greyEmulsionPaint = RsRevitUtils.GetWallTypeByName(doc, "灰色乳胶漆"); + WallType aluminumPlasticPanel = RsRevitUtils.GetWallTypeByName(doc, "铝塑板"); + WallType skirtingLine = RsRevitUtils.GetWallTypeByName(doc, "踢脚线"); //铝塑板块数 int n = (int)Math.Floor(referline.Length / interval); double rem = referline.Length % (gap + aluminumPlasticPanelLength); - if (baseLayerType == null || aluminumPlasticPanelType == null || skirtingLineType == null || greyEmulsionPaintType == null) + if (fireRetardantBoard == null || aluminumPlasticPanel == null || skirtingLine == null || greyEmulsionPaint == null) { TaskDialog.Show("温馨提示", "需要新建装饰所需的墙类型,类型名称需分别包含阻燃板,灰色乳胶漆,铝塑板,踢脚线"); - return Result.Cancelled; + return Result.Failed; } - doc.Invoke(ts => - { - //长度不满足设置的铝塑板长度时 - if (n == 0) - { - var offestline = referline.CreateOffset(aluminumPlasticPanelThickness / 2 + baseLayerThickness, -XYZ.BasisZ); - var skirtingLinewall = Wall.Create(doc, offestline, aluminumPlasticPanelType.Id, baseLevel.Id, aluminumPlasticPanelHeight, skirtingLineHeight, false, false); - wallIds.Add(skirtingLinewall.Id); - } - else - { - for (int i = 0; i < n + 1; i++) - { - var startpoint = referline.Evaluate(i * interval, false); - var endpoint = referline.Evaluate(((i + 1) * interval) - gap, false); - - if (i == n) - { - endpoint = referline.GetEndPoint(1); - } - Line line = Line.CreateBound(startpoint, endpoint); - var offestline = line.CreateOffset(aluminumPlasticPanelThickness / 2 + baseLayerThickness, -XYZ.BasisZ); - var aluminumPlasticPanelwall = Wall.Create(doc, offestline, aluminumPlasticPanelType.Id, baseLevel.Id, aluminumPlasticPanelHeight, skirtingLineHeight, false, false); - //不允许连接 - WallUtils.DisallowWallJoinAtEnd(aluminumPlasticPanelwall, 0); - //curves.Add() - wallIds.Add(aluminumPlasticPanelwall.Id); - } - } - - var skirtingOffestLine = referline.CreateOffset(skirtingLineThickness / 2 + baseLayerThickness, -XYZ.BasisZ); - var skirtingwall = Wall.Create(doc, skirtingOffestLine, skirtingLineType.Id, baseLevel.Id, skirtingLineHeight, 0, false, false); - wallIds.Add(skirtingwall.Id); - - var baseLayerOffestLine = referline.CreateOffset(baseLayerThickness / 2, -XYZ.BasisZ); - var baseLayerWall = Wall.Create(doc, baseLayerOffestLine, baseLayerType.Id, baseLevel.Id, skirtingLineHeight + aluminumPlasticPanelHeight, 0, false, false); - wallIds.Add(baseLayerWall.Id); - //高度大于3000才有灰色乳胶漆 - if (UserConstant.Height > 3000) - { - double baseHeight = aluminumPlasticPanelHeight + skirtingLineHeight; - var greyEmulsionPaintOffestLine = referline.CreateOffset(greyEmulsionPaintWidth / 2, -XYZ.BasisZ); - Wall greyPaintWall = Wall.Create(doc, greyEmulsionPaintOffestLine, greyEmulsionPaintType.Id, baseLevel.Id, UserConstant.Height / 304.8 - baseHeight, baseHeight, false, false); - wallIds.Add(greyPaintWall.Id); - } - - doc.Regenerate(); - doc.Create.NewGroup(wallIds); - }, "背景墙创建"); - - #region 菜鸟使命布置 - - FamilyInstance signage = null; + fireRetardantBoardWidth = fireRetardantBoard.Width; + greyEmulsionPaintWidth = greyEmulsionPaint.Width; + aluminumPlasticPanelWidth = aluminumPlasticPanel.Width; + skirtingLineWidth = skirtingLine.Width; doc.Invoke(ts => { - string file = UserConstant.FamilyLibraryDirectory + "标识标牌\\菜鸟使命.rfa"; - symbol = RsRevitUtils.GetAndActiveDefaultFamilySymbol(doc, file); - - var endPoint = referline.GetEndPoint(0); - - endPoint += (skirtingLineHeight + aluminumPlasticPanelHeight) * XYZ.BasisZ; - try + //长度不满足设置的铝塑板长度时 + if (n == 0) { - signage = doc.Create.NewFamilyInstance(endPoint, symbol, StructuralType.NonStructural); - } - catch (Exception ex) - { - Log.WriteLog(ex.Message); - } - }, "菜鸟的使命"); - doc.Invoke(ts => - { - //族的正面要超前 - RsRevitUtils.AdjustInstance(doc, signage, referline, greyEmulsionPaintWidth + baseLayerThickness); - }, "调整菜鸟使命"); - - #endregion 菜鸟使命布置 - - double receptionLength = referline.Length / 3 * 2; - double receptionWallDistance = 1000 / 304.8; - FamilyInstance reception = null; - doc.Invoke(ts => - { - string file = UserConstant.FamilyLibraryDirectory + "家具\\寄件接待台.rfa"; - symbol = RsRevitUtils.GetAndActiveDefaultFamilySymbol(doc, file); - try - { - var wallCenterPoint = referline.Evaluate(0.5, true); - - reception = doc.Create.NewFamilyInstance(wallCenterPoint, symbol, baseLevel, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); - - symbol.GetParameters("台面长度").FirstOrDefault().Set(receptionLength); - doc.Regenerate(); - RsRevitUtils.AdjustInstance(doc, reception, referline, receptionWallDistance); - } - catch (Exception ex) - { - Log.WriteLog(ex.Message); - } - }, "接待台布置"); - - FamilyInstance logo = null; - doc.Invoke(ts => - { - var file = UserConstant.FamilyLibraryDirectory + "标识标牌\\精工背发光字.rfa"; - symbol = RsRevitUtils.GetAndActiveDefaultFamilySymbol(doc, file); - try - { - var wallCenterPoint = referline.Evaluate(0.5, true); - - logo = doc.Create.NewFamilyInstance(wallCenterPoint, symbol, baseLevel, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); - doc.Regenerate(); - RsRevitUtils.AdjustInstance(doc, logo, referline, aluminumPlasticPanelThickness + baseLayerThickness); - } - catch (Exception ex) - { - Log.WriteLog(ex.Message); - } - }, "菜鸟LOGO布置"); - - doc.Invoke(ts => - { - string file = UserConstant.FamilyLibraryDirectory + "灯具\\艺术吊灯.rfa"; - symbol = RsRevitUtils.GetAndActiveDefaultFamilySymbol(doc, file); - var referlineDirection = referline.Direction; - List lampLocationPoints = new List(); - var lampsLocationLine = referline.CreateOffset(lampsWallDistance, -XYZ.BasisZ); - var centerPoint = lampsLocationLine.Evaluate(0.5, true) + XYZ.BasisZ * lampsHeight; - - //n = (int)Math.Floor(backgroundWallLength / lampsInterval); - n = (int)Math.Floor(receptionLength / lampsInterval); - //单侧的数量 - int m = (int)Math.Floor((n + 1.0) / 2); - if ((n + 1) % 2 == 0) - { - //开始间隔为0.5 - for (int i = 0; i < m; i++) - { - XYZ p = centerPoint.Add(referlineDirection * (i + 0.5) * lampsInterval); - XYZ reversePoint = centerPoint.Add(-referlineDirection * (i + 0.5) * lampsInterval); - - lampLocationPoints.Add(p); - lampLocationPoints.Add(reversePoint); - } - try - { - foreach (XYZ p in lampLocationPoints) - { - var light = doc.Create.NewFamilyInstance(p, symbol, baseLevel, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); - } - } - catch (Exception ex) - { - Log.WriteLog(ex.Message); - } + var offestline = referline.CreateOffset(aluminumPlasticPanelWidth / 2 + fireRetardantBoardWidth, -XYZ.BasisZ); + var skirtingLinewall = Wall.Create(doc, offestline, aluminumPlasticPanel.Id, baseLevel.Id, aluminumPlasticPanelHeight, skirtingLineHeight, false, false); + wallIds.Add(skirtingLinewall.Id); } else { - lampLocationPoints.Add(centerPoint); - //i=0时居中,不在单侧,开始间隔为1 - for (int i = 0; i < m; i++) + for (int i = 0; i < n + 1; i++) { - XYZ p = centerPoint.Add(referlineDirection * (i + 1) * lampsInterval); - XYZ reversePoint = centerPoint.Add(-referlineDirection * (i + 1) * lampsInterval); - lampLocationPoints.Add(p); - lampLocationPoints.Add(reversePoint); - } - try - { - foreach (XYZ p in lampLocationPoints) + var startpoint = referline.Evaluate(i * interval, false); + var endpoint = referline.Evaluate(((i + 1) * interval) - gap, false); + + if (i == n) { - var light = doc.Create.NewFamilyInstance(p, symbol, baseLevel, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); + endpoint = referline.GetEndPoint(1); } - } - catch (Exception ex) - { - Log.WriteLog(ex.Message); + Line line = Line.CreateBound(startpoint, endpoint); + var offestline = line.CreateOffset(aluminumPlasticPanelWidth / 2 + fireRetardantBoardWidth, -XYZ.BasisZ); + var aluminumPlasticPanelwall = Wall.Create(doc, offestline, aluminumPlasticPanel.Id, baseLevel.Id, aluminumPlasticPanelHeight, skirtingLineHeight, false, false); + //不允许连接 + WallUtils.DisallowWallJoinAtEnd(aluminumPlasticPanelwall, 0); + //curves.Add() + wallIds.Add(aluminumPlasticPanelwall.Id); } } - }, "吊灯布置"); + + var skirtingOffestLine = referline.CreateOffset(skirtingLineWidth / 2 + fireRetardantBoardWidth, -XYZ.BasisZ); + var skirtingwall = Wall.Create(doc, skirtingOffestLine, skirtingLine.Id, baseLevel.Id, skirtingLineHeight, 0, false, false); + wallIds.Add(skirtingwall.Id); + + var baseLayerOffestLine = referline.CreateOffset(fireRetardantBoardWidth / 2, -XYZ.BasisZ); + var baseLayerWall = Wall.Create(doc, baseLayerOffestLine, fireRetardantBoard.Id, baseLevel.Id, skirtingLineHeight + aluminumPlasticPanelHeight, 0, false, false); + wallIds.Add(baseLayerWall.Id); + //高度大于3000才有灰色乳胶漆 + if (UserConstant.Height > 3000) + { + double baseHeight = aluminumPlasticPanelHeight + skirtingLineHeight; + var greyEmulsionPaintOffestLine = referline.CreateOffset(greyEmulsionPaintWidth / 2, -XYZ.BasisZ); + Wall greyPaintWall = Wall.Create(doc, greyEmulsionPaintOffestLine, greyEmulsionPaint.Id, baseLevel.Id, UserConstant.Height / 304.8 - baseHeight, baseHeight, false, false); + wallIds.Add(greyPaintWall.Id); + } + + doc.Regenerate(); + doc.Create.NewGroup(wallIds); + }, "背景墙创建"); + + CreateCaiNiaoDuty(doc, skirtingLineHeight + aluminumPlasticPanelHeight, greyEmulsionPaintWidth + fireRetardantBoardWidth, referline); + + double receptionLength = referline.Length / 3 * 2; + + CreateReceptionDesk(doc, baseLevel, referline, receptionLength); + + CreateLogo(doc, fireRetardantBoardWidth + aluminumPlasticPanelWidth, baseLevel, referline); + PlacePendentLamp(doc, lampsWallDistance, lampsInterval, lampsHeight, baseLevel, referline, receptionLength); + if (File.Exists(fullFileName)) + { + CreateSchoolSignAndName(app, doc, fullFileName, referline, fireRetardantBoardWidth + aluminumPlasticPanelWidth); + } } return Result.Succeeded; }, "前台布置"); } + private void CreateSchoolSignAndName(Autodesk.Revit.ApplicationServices.Application app, Document doc, string fullFileName, Line referline, double offest) + { + var viewSections = new FilteredElementCollector(doc).OfClass(typeof(ViewSection)).Cast(); + Autodesk.Revit.DB.View pView = null; + foreach (var viewSection in viewSections) + { + if (viewSection.ViewDirection.IsAlmostEqualTo(-XYZ.BasisY)) + { + pView = viewSection; + break; + } + } + List curves = new List(); + ImportInstance importInstance = null; + string familyfilename = string.Empty; + ElementId eId = null; + try + { + doc.Invoke(ts => + { + DWGImportOptions importOptions = new DWGImportOptions() + { + Placement = ImportPlacement.Centered, + ThisViewOnly = true, + VisibleLayersOnly = true + }; + doc.Link(fullFileName, importOptions, pView, out eId); + }); + + importInstance = doc.GetElement(eId) as ImportInstance; + familyfilename = importInstance.Category.Name; + var geometryElement = importInstance.get_Geometry(new Options()); + foreach (var geomObj in geometryElement) + { + GeometryInstance geometryInstance = geomObj as GeometryInstance; + if (geometryInstance != null) + { + foreach (var instObj in geometryInstance.GetSymbolGeometry()) + { + Curve curve = instObj as Curve; + if (curve != null) + { + curves.Add(curve); + } + PolyLine polyLine = instObj as PolyLine; + if (polyLine != null) + { + var points = polyLine.GetCoordinates(); + for (int i = 0; i < points.Count - 1; i++) + { + try + { + Line line = Line.CreateBound(points[i], points[i + 1]); + curves.Add(line); + } + catch (Exception) + { + continue; + } + } + } + } + } + } + } + catch (Autodesk.Revit.Exceptions.OperationCanceledException) + { + return; + } + + CurveArrArray arrArray = new CurveArrArray(); + CurveArray array = new CurveArray(); + if (curves.Count == 0) + { + return; + } + SearchCurveConnected(curves, curves.FirstOrDefault(), array, arrArray); + string rftPath = app.FamilyTemplatePath + "\\概念体量\\公制体量.rft"; + + Document faDoc = app.NewFamilyDocument(rftPath); + + faDoc.Invoke(ts => + { + XYZ pt = new XYZ(0, -40 / 304.8, 0); + SketchPlane plane = SketchPlane.Create(faDoc, Plane.CreateByNormalAndOrigin(-XYZ.BasisY, XYZ.Zero)); + CreateFormAndAssociateMaterialParam(faDoc, "发光材质", plane, arrArray, pt); + }); + Family fa = faDoc.LoadFamily(doc, new RsFamilyLoadOption()); + faDoc.Close(false); + + doc.Invoke(ts => + { + if (fa != null) + { + FamilySymbol familySymbol = doc.GetElement(fa.GetFamilySymbolIds().FirstOrDefault()) as FamilySymbol; + + for (int i = 0; i < 100; i++) + { + try + { + string name = $"{familyfilename} {i}"; + fa.Name = name; + familySymbol.Name = name; + break; + } + catch (Exception) + { + continue; + } + } + + if (familySymbol.IsActive == false) + { + familySymbol.Activate(); + } + var wallCenterPoint = referline.Evaluate(0.5, true); + var loc = wallCenterPoint.Add(XYZ.BasisZ * 1700 / 304.8); + //var fi = doc.Create.NewFamilyInstance(importInstance.GetTransform().Origin, familySymbol, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); + var fi = doc.Create.NewFamilyInstance(loc, familySymbol, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); + doc.Regenerate(); + var xyz = RsRevitUtils.GetLocationPointByElement(fi); + + RsRevitUtils.AdjustInstance(doc, fi, referline, offest); + } + doc.Delete(eId); + }); + return; + } + + /// + /// 创建拉伸并赋予材质参数 + /// + /// + /// + /// + /// + /// + private void CreateFormAndAssociateMaterialParam(Document faDoc, string paramName, SketchPlane plane, CurveArrArray arrArray, XYZ extrusionDirection) + { + var materialparam = faDoc.FamilyManager.AddParameter(paramName, BuiltInParameterGroup.PG_MATERIALS, ParameterType.Material, false); + foreach (CurveArray arr in arrArray) + { + ReferenceArray referenceArray = new ReferenceArray(); + //无法创建实体时,则创建为模型线 + foreach (Curve curve in arr) + { + var ml = faDoc.FamilyCreate.NewModelCurve(curve, plane); + + referenceArray.Append(ml.GeometryCurve.Reference); + } + try + { + var form = faDoc.FamilyCreate.NewExtrusionForm(true, referenceArray, extrusionDirection); + faDoc.FamilyManager.AssociateElementParameterToFamilyParameter(form.get_Parameter(BuiltInParameter.MATERIAL_ID_PARAM), materialparam); + } + catch (Exception) + { + continue; + } + } + } + + /// + /// 递归找到所有连接在一起的线圈并分好组 + /// + /// 所有线 + /// 用于查找与其连接的初始线 + /// 初始的线串 + /// 所有线串的集合 + private void SearchCurveConnected(List curves, Curve initcurve, CurveArray initCurveArray, CurveArrArray curveArrArray) + { + if (curveArrArray.Size == 0) + { + curveArrArray.Append(initCurveArray); + } + for (int i = 0; i < curves.Count; i++) + { + Curve tempCurve = curves[i]; + var baseEndXyz = initcurve.GetEndPoint(0); + //把初始的第一个添加进集合 + if (tempCurve.GetEndPoint(0).IsAlmostEqualTo(baseEndXyz) || tempCurve.GetEndPoint(1).IsAlmostEqualTo(baseEndXyz))//可以为重合的线,做剔除 + { + initCurveArray.Append(tempCurve); + curves.Remove(tempCurve); + //将tempcurve作为起点继续查找 + SearchCurveConnected(curves, tempCurve, initCurveArray, curveArrArray);//最后一次执行方法在此处,因为size为0,停止继续执行 + } + + //遍历完一个线串时,寻找下一个线串,即查找到最后,都找不到相连的曲线时 + if (i == curves.Count() - 1) + { + initCurveArray = new CurveArray();//下一个线串需重新建立合集 + SearchCurveConnected(curves, curves.FirstOrDefault(), initCurveArray, curveArrArray);//每有一次新的线串时执行一次,查找与其相连的线 + ////由于最后一轮运行完递归后,所有线段均成组,只执行上面的if内容,所以没办法将剩余线加到集合中。 + if (curves.Count() == 0) + { + curveArrArray.Append(initCurveArray); + } + } + } + } + + private static void CreateCaiNiaoDuty(Document doc, double baseheight, double offest, Line referline) + { + doc.Invoke(ts => + { + string file = UserConstant.FamilyLibraryDirectory + "标识标牌\\菜鸟使命.rfa"; + var dutySymbol = RsRevitUtils.GetAndActiveDefaultFamilySymbol(doc, file); + + var endPoint = referline.GetEndPoint(0); + + endPoint += baseheight * XYZ.BasisZ; + try + { + var signage = doc.Create.NewFamilyInstance(endPoint, dutySymbol, StructuralType.NonStructural); + doc.Regenerate(); + RsRevitUtils.AdjustInstance(doc, signage, referline, offest); + } + catch (Exception ex) + { + Log.WriteLog(ex.Message); + } + }, "菜鸟的使命"); + } + + private static void CreateReceptionDesk(Document doc, Level baseLevel, Line referline, double receptionLength) + { + double receptionWallDistance = 1000 / 304.8; + doc.Invoke(ts => + { + string file = UserConstant.FamilyLibraryDirectory + "家具\\寄件接待台.rfa"; + var deskSymbol = RsRevitUtils.GetAndActiveDefaultFamilySymbol(doc, file); + try + { + var wallCenterPoint = referline.Evaluate(0.5, true); + + var reception = doc.Create.NewFamilyInstance(wallCenterPoint, deskSymbol, baseLevel, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); + + deskSymbol.GetParameters("台面长度").FirstOrDefault().Set(receptionLength); + doc.Regenerate(); + RsRevitUtils.AdjustInstance(doc, reception, referline, receptionWallDistance); + } + catch (Exception ex) + { + Log.WriteLog(ex.Message); + } + }, "接待台布置"); + } + + private static void CreateLogo(Document doc, double offest, Level baseLevel, Line referline) + { + doc.Invoke(ts => + { + var file = UserConstant.FamilyLibraryDirectory + "标识标牌\\精工背发光字.rfa"; + var logoSymbol = RsRevitUtils.GetAndActiveDefaultFamilySymbol(doc, file); + try + { + var wallCenterPoint = referline.Evaluate(0.5, true); + + var logo = doc.Create.NewFamilyInstance(wallCenterPoint, logoSymbol, baseLevel, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); + doc.Regenerate(); + RsRevitUtils.AdjustInstance(doc, logo, referline, offest); + } + catch (Exception ex) + { + Log.WriteLog(ex.Message); + } + }, "菜鸟LOGO布置"); + } + + private static void PlacePendentLamp(Document doc, double lampsWallDistance, double lampsInterval, double lampsHeight, Level baseLevel, Line referline, double receptionLength) + { + doc.Invoke(ts => + { + string file = UserConstant.FamilyLibraryDirectory + "灯具\\艺术吊灯.rfa"; + var lightSymbol = RsRevitUtils.GetAndActiveDefaultFamilySymbol(doc, file); + var referlineDirection = referline.Direction; + List lampLocationPoints = new List(); + var lampsLocationLine = referline.CreateOffset(lampsWallDistance, -XYZ.BasisZ); + var centerPoint = lampsLocationLine.Evaluate(0.5, true) + XYZ.BasisZ * lampsHeight; + + //n = (int)Math.Floor(backgroundWallLength / lampsInterval); + int n = (int)Math.Floor(receptionLength / lampsInterval); + //单侧的数量 + int m = (int)Math.Floor((n + 1.0) / 2); + if ((n + 1) % 2 == 0) + { + //开始间隔为0.5 + for (int i = 0; i < m; i++) + { + XYZ p = centerPoint.Add(referlineDirection * (i + 0.5) * lampsInterval); + XYZ reversePoint = centerPoint.Add(-referlineDirection * (i + 0.5) * lampsInterval); + + lampLocationPoints.Add(p); + lampLocationPoints.Add(reversePoint); + } + try + { + foreach (XYZ p in lampLocationPoints) + { + var light = doc.Create.NewFamilyInstance(p, lightSymbol, baseLevel, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); + } + } + catch (Exception ex) + { + Log.WriteLog(ex.Message); + } + } + else + { + lampLocationPoints.Add(centerPoint); + //i=0时居中,不在单侧,开始间隔为1 + for (int i = 0; i < m; i++) + { + XYZ p = centerPoint.Add(referlineDirection * (i + 1) * lampsInterval); + XYZ reversePoint = centerPoint.Add(-referlineDirection * (i + 1) * lampsInterval); + lampLocationPoints.Add(p); + lampLocationPoints.Add(reversePoint); + } + try + { + foreach (XYZ p in lampLocationPoints) + { + var light = doc.Create.NewFamilyInstance(p, lightSymbol, baseLevel, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); + } + } + catch (Exception ex) + { + Log.WriteLog(ex.Message); + } + } + }, "吊灯布置"); + } + private void Application_DocumentChanged(object sender, DocumentChangedEventArgs e) { ICollection idsAdded = e.GetAddedElementIds(); @@ -344,32 +562,5 @@ namespace RookieStation.MailingAreaModule.ExecuteCmds KeyPress.PostMessage(revitWindow, (uint)KeyPress.KEYBOARD_MSG.WM_KEYDOWN, (uint)System.Windows.Forms.Keys.Escape, 0); } } - - private Face GetPlaceFaceOfWall(Wall wall, XYZ normal) - { - Face face = null; - Options geomOptions = new Options(); - geomOptions.ComputeReferences = true; - GeometryElement wallGeom = wall.get_Geometry(geomOptions); - - foreach (GeometryObject geomObj in wallGeom) - { - Solid geomSolid = geomObj as Solid; - if (null != geomSolid) - { - foreach (Face geomFace in geomSolid.Faces) - { - if (geomFace.ComputeNormal(geomFace.Reference.UVPoint).IsAlmostEqualTo(normal)) - { - face = geomFace; - } - - break; - } - break; - } - } - return face; - } } } \ No newline at end of file diff --git a/RookieStation/MailingAreaModule/Views/WpfReceptionArea.xaml b/RookieStation/MailingAreaModule/Views/WpfReceptionArea.xaml index bb01262..0ecc35e 100644 --- a/RookieStation/MailingAreaModule/Views/WpfReceptionArea.xaml +++ b/RookieStation/MailingAreaModule/Views/WpfReceptionArea.xaml @@ -8,8 +8,8 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Width="126" Height="338" - MinWidth="220" - MinHeight="480" + MinWidth="420" + MinHeight="320" mc:Ignorable="d"> @@ -19,13 +19,16 @@ - + - + - - + + + + + - - - @@ -123,10 +102,37 @@ TextAlignment="Center" /> + + + + + + + + + + /// 墙类型包含的字符串 /// - public static double GetWallWidthByWallTypeName(Document doc, string wallTypeName, out WallType wallType) + public static WallType GetWallTypeByName(Document doc, string wallTypeName) { - double thickness = 0.0; var walltypelist = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).OfClass(typeof(WallType)).Cast(); - wallType = walltypelist.FirstOrDefault(t => t.Name.Contains(wallTypeName)); - if (wallType != null) - { - thickness = wallType.Width; - //var compounds = walltype.GetCompoundStructure(); - //for (int i = 0; i < compounds.LayerCount; i++) - //{ - // thickness += compounds.GetWidth(); - //} - } - return thickness; + return walltypelist.FirstOrDefault(t => t.Name.Contains(wallTypeName)); } /// - /// 获取元素定位点(仅以点定位的元素) + /// 获取元素定位点 /// - /// + /// 以点定位的实例 /// public static XYZ GetLocationPointByElement(Element instance) { @@ -590,6 +579,33 @@ namespace RookieStation.Utils return line; } + public static Face GetPlaceFaceOfWall(Wall wall, XYZ normal) + { + Face face = null; + Options geomOptions = new Options(); + geomOptions.ComputeReferences = true; + GeometryElement wallGeom = wall.get_Geometry(geomOptions); + + foreach (GeometryObject geomObj in wallGeom) + { + Solid geomSolid = geomObj as Solid; + if (null != geomSolid) + { + foreach (Face geomFace in geomSolid.Faces) + { + if (geomFace.ComputeNormal(geomFace.Reference.UVPoint).IsAlmostEqualTo(normal)) + { + face = geomFace; + } + + break; + } + break; + } + } + return face; + } + /// /// 获取元素侧面 /// diff --git a/RookieStationSetup/RookieStationSetup.vdproj b/RookieStationSetup/RookieStationSetup.vdproj index 0ff7ebc..a1b161c 100644 --- a/RookieStationSetup/RookieStationSetup.vdproj +++ b/RookieStationSetup/RookieStationSetup.vdproj @@ -3258,15 +3258,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:菜鸟驿站工具集" - "ProductCode" = "8:{67534FBD-95B2-49AC-A7EF-14FAF44FE06A}" - "PackageCode" = "8:{998F4BCF-4E63-4C8C-A8A7-3901B6D7EE28}" + "ProductCode" = "8:{4738ED44-427C-41A5-823B-4161B6A956B8}" + "PackageCode" = "8:{E04C0F61-5561-44CF-951C-62BDAD2AE48F}" "UpgradeCode" = "8:{127EC3EC-7539-468B-84EA-E1ECDD6204E6}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:1.0.5" + "ProductVersion" = "8:1.0.6" "Manufacturer" = "8:YTX Engineering" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:"