壁をトリミングするAutodesk Revitのマクロ

オートデスクは壁を異なったものにしましたが、デザイナーは0.045度と89.915度の角度で壁を描きました。 したがって、寸法は壁の間に設定されません。 これは長い間続いていましたが、グレートマクロイコライザーが登場し、壁を0,000度と90,000度の角度に戻します。

マクロは、選択された壁パターンに対して平行または垂直に対して最大1.2度の誤差で描画される壁を修正します。







作業のアルゴリズムは次のとおりです。ユーザーはマクロを実行し、フレームまたはフレームを使用して不均一な壁を1つずつ選択し、選択した壁が整列するサンプル壁を選択します。 このようにして、パターンにほぼ平行または垂直な壁のみが位置合わせされます。 サンプルに対する相対角度が35、45、75などの壁 影響を受けません。 それらは別のサンプルと整列する必要があります。







マクロは誰でも利用できます! 誰でも簡単にRevitにマクロをインストールできます。







5つのステップでマクロを設定します







1. Revitでプロジェクトを開きます 。 ツール"管理(管理)" -> "マクロ(マクロ)" -> "マクロマネージャー(マクロマネージャー)"を起動します。







2. [ マクロマネージャー]ウィンドウで [ アプリケーション ]タブに移動し、[ 作成 ]-> [ モジュール]に移動します。







3. [ 新しいモジュールの作成 ]ダイアログボックスで、モジュールの名前"Wall_Equalizer"を設定します。 その後、モジュールを含む「SharpDevelop」プログラムウィンドウがすぐに開きます。 完了した最も重要なこと!







4. 「SharpDevelop」プログラムで働きに行きます。 メインウィンドウで、すべてのテキストを削除し、以下にコピーできるマクロコードを貼り付けます。







5.マクロコードを挿入したら、 F9を押します。







/* * Created by SharpDevelop. * User: Alexandr Akunets * Date: 1/30/2018 * Time: 9:50 AM * * version 1.000 * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; using Autodesk.Revit.UI; using Autodesk.Revit.DB; using Autodesk.Revit.UI.Selection; using System.Collections.Generic; using System.Linq; namespace Wall_Equalizer { [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)] [Autodesk.Revit.DB.Macros.AddInId("31DDFC5C-59FF-416B-8482-49568A640EE5")] public partial class ThisApplication { private void Module_Startup(object sender, EventArgs e) { } private void Module_Shutdown(object sender, EventArgs e) { } public void WallEqualizer () { var uiapp = this.ActiveUIDocument; var doc = uiapp.Document; //Dictionary<Element, Sherif> elms = new Dictionary<Element, Sherif>(); //var wallist = new FilteredElementCollector(doc, doc.ActiveView.Id).OfCategory(BuiltInCategory.OST_Walls).ToElements(); List<Element> wallist = new List<Element>(); var rs = uiapp.Selection.PickObjects (ObjectType.Element, new PickFilter(BuiltInCategory.OST_Walls), "Select wrong walls"); foreach(var w in rs) { var e = doc.GetElement(w.ElementId) as Wall; wallist.Add(e); } var r = uiapp.Selection.PickObject (ObjectType.Element, new PickFilter(BuiltInCategory.OST_Walls), "Select wall - sample"); Wall selwall = doc.GetElement(r.ElementId) as Wall; Line line = GetLine(selwall); try { foreach(Element el in wallist) { using (Transaction t = new Transaction(doc, "r")) { t.Start(); var wLine = GetLine(el); if(wLine != null) { var wcos = (line.Direction.X * wLine.Direction.X + line.Direction.Y * wLine.Direction.Y); var angleR = Math.Acos (wcos); if (el.Id.IntegerValue != r.ElementId.IntegerValue) { BustEquiizer90(el, line, angleR ); BustEquiizer0(el, line, angleR ); } } t.Commit(); } } } catch(Exception ex) { if ( (ex is Autodesk.Revit.Exceptions.ArgumentsInconsistentException) == false) { TaskDialog.Show("Error", ex.Message + ex.StackTrace); } } } private void BustEquiizer90(Element el, Line line, double angleR) { var angle = RadiansToDegrees( angleR ); if ( Math.Abs(angle - 90) > 0.0000001 && Math.Abs(angle - 90) < 1.2) { Equalizer(el, -(DegreesToRadians(90) - angleR)); var wLine = GetLine(el); var wcos = (line.Direction.X * wLine.Direction.X + line.Direction.Y * wLine.Direction.Y); angleR = Math.Acos (wcos); angle = RadiansToDegrees( angleR ); if ( Math.Abs(angle - 90) > 0.0000001 && Math.Abs(angle - 90) < 2.4) { Equalizer(el, (DegreesToRadians(90) - angleR)); } } } private void BustEquiizer0(Element el, Line line, double angleR) { var angle = RadiansToDegrees( angleR ); if ( (Math.Abs(angle) > 0.0000001 && Math.Abs(angle) < 1.2) || Math.Abs(angle -180) > 0.0000001 && Math.Abs(angle -180) < 2.4) { Equalizer(el, -angleR); var wLine = GetLine(el); var wcos = (line.Direction.X * wLine.Direction.X + line.Direction.Y * wLine.Direction.Y); angleR = Math.Acos (wcos); angle = RadiansToDegrees( angleR ); if ( Math.Abs(angle) > 0.0000001 && Math.Abs(angle) < 2.4 || Math.Abs(angle -180) > 0.0000001 && Math.Abs(angle -180) < 2.4) { Equalizer(el, -angleR); wLine = GetLine(el); wcos = (line.Direction.X * wLine.Direction.X + line.Direction.Y * wLine.Direction.Y); angleR = Math.Acos (wcos); angle = RadiansToDegrees( angleR ); if ( Math.Abs(angle) > 0.0000001 && Math.Abs(angle) < 5 || Math.Abs(angle -180) > 0.0000001 && Math.Abs(angle -180) < 5) { Equalizer(el, angleR); } } } } private void Equalizer(Element el, double angle) { LocationCurve wLine = el.Location as LocationCurve; var mid = Midpoint(wLine.Curve); Line axis = Line.CreateBound(mid, new XYZ( mid.X, mid.Y, mid.Z + 1)); ElementTransformUtils.RotateElement( this.ActiveUIDocument.Document, el.Id, axis, angle); } private Line GetLine(Element el){ var selCurve = (el.Location as LocationCurve).Curve; if( selCurve is Line) { XYZ p0 = new XYZ(selCurve.GetEndPoint(0).X, selCurve.GetEndPoint(0).Y, 0); XYZ p1 = new XYZ(selCurve.GetEndPoint(1).X, selCurve.GetEndPoint(1).Y, 0); Line line = Line.CreateBound (p0, p1); return line; } else return null; } public static double RadiansToDegrees(double angle) { return (angle * 180 / Math.PI); } public static double DegreesToRadians(double angle) { return (angle * Math.PI / 180); } public static XYZ Midpoint(Curve curve) { return 0.5 * (curve.GetEndPoint(0) + curve.GetEndPoint(1)); } #region Revit Macros generated code private void InternalStartup() { this.Startup += new System.EventHandler(Module_Startup); this.Shutdown += new System.EventHandler(Module_Shutdown); } #endregion } public class PickFilter : ISelectionFilter { //BuiltInCategory SelectionCategory { get; set; } BuiltInCategory [] SelCats; /* public PickFilter(BuiltInCategory cat) { SelCats = new BuiltInCategory[] { cat }; } */ public PickFilter(params BuiltInCategory[] cat) { SelCats = cat; } public bool AllowElement (Element elem) { foreach(BuiltInCategory cat in SelCats) { if (elem.Category.Id.IntegerValue == (int)cat) return true; } return false; } public bool AllowReference (Reference r, XYZ p) { return false; } } }
      
      





エラーがなく、 「ビルドが正常に終了しました」というメッセージが表示された場合、マクロは正しく設定されています。 エラーがある場合は、手順を読み直して、もう一度やり直してください。 作業の最後に、SharpDevelopプログラムを閉じてRevitに戻ります。







マクロを使用する:







再度、 「マクロマネージャー」を実行し、 「アプリケーション」タブに移動し、 「Wall_Equalizer」マクロを展開し、 「Wall_Equalizer」マクロオプションを選択して、 「実行」ボタンをクリックします。 マクロは実行中です。







マクロアルゴリズム:







1.位置合わせする必要がある壁を、1つずつ、またはフレームで選択します。 あまり多くの壁を選択しないでください。 最適な壁の数は約50です。壁の選択が完了したら、オプションバーの[完了]をクリックします。







2.均等に描画され、モデルとして機能できる壁を選択します。







3.結果が得られます。







マクログループ内の壁を処理できないことを忘れないでください。 グループで壁を整列させる場合は、マクロを実行する前にこれらの壁のグループ化を解除する必要があります。








All Articles