Mở đầu

Bài viết hôm nay sẽ về vấn đề Reference để tạo dim cho đối tượng familyinstance xuất phát từ câu hỏi của a Thuần.Mình ghi lại đây để bác nào tạo Dim có thể tham khảo các lấy về lớp Reference tạo Dim hoặc lấy PointReference.Đừng nhầm lẫn giữa Familyinstance.location với PointReference .Hai kết quả là khác biệt và độc lập sau khi mình kiểm tra.Nếu không rành về mã các bác có có thể tìm kiếm bên trong gói DynaMEP nhé.Tải về và sử dụng là có.

Get Reference

C#

public static Reference Reference(Element Familyinstance)
{
FamilyInstance familyInstance = (FamilyInstance)Familyinstance.InternalElement;
Options options = new Options();
options.ComputeReferences = true;
options.IncludeNonVisibleObjects = true;
var result = familyInstance.get_Geometry(options)
.OfType<Autodesk.Revit.DB.Point>()
.FirstOrDefault();
if (result == null) return null;
return result.Reference;
}
view raw ReferenceDim.cs hosted with ❤ by GitHub

Python

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
elements = UnwrapElement(IN[0]) if isinstance(IN[0],list) else [UnwrapElement(IN[0])]
ref=[]
for element in elements:
ref.append(Reference(element))
if isinstance(IN[0], list): OUT = ref
else: OUT = ref[0]
view raw ReferenceDim.py hosted with ❤ by GitHub

Get Point Reference

public static Point PointReference(Element familyinstance)
{
FamilyInstance fam = (FamilyInstance)familyinstance.InternalElement;
Options options = new Options();
options.ComputeReferences = true;
options.IncludeNonVisibleObjects = true;
var result = fam.get_Geometry(options)
.OfType<Autodesk.Revit.DB.Point>()
.FirstOrDefault();
if (result == null) return null;
return result.Coord.ToPoint();
}

Kết quả

DimFamilyInstance

Tạo Dim Cho Grid Với Reference

Cũng tương tự với những cách như trên, bạn cũng có thể dễ dàng tạo ra dim cho lưới như ví dụ dưới đây

public static Dimension CreateGridDimension(View view, Grid grid1, Grid grid2)
{
Curve curve1 = grid1.Curve;
Curve curve2 = grid2.Curve;
if(curve1 == null || curve1.Reference == null || curve2 == null || curve2.Reference == null)
{
return null;
}
Line line = Line.CreateBound(curve1.GetEndPoint(0), curve2.GetEndPoint(0));
Reference re1 = new Reference(grid1);
Reference re2 = new Reference(grid2);
ReferenceArray references = new ReferenceArray();
references.Append(re1);
references.Append(re2);
return view.Document.Create.NewDimension(view, line, references);
}

Mở rộng

Làm sao để tạo một NewRadialDimension trong family, đây là câu hỏi của một người dùng trong nhóm.

Thử kiểm tra đơn giản với việc lấy curve từ một khối Extrusion

var tran = new Transaction(DB.Doc);
tran.Start("s");
var extrusionRef = DB.UIApp.ActiveUIDocument.Selection.PickObject(
ObjectType.Element, "Select a circular extrusion: ");
var extr = DB.Doc.GetElement(extrusionRef.ElementId) as Extrusion;
var skt = extr.Sketch;
Arc arc = null;
foreach (CurveArray curArr in skt.Profile)
foreach (Curve curve in curArr)
{
arc = curve as Arc;
break;
}
var dimension = DB.Doc.FamilyCreate.NewRadialDimension(DB.Doc.ActiveView, arc.Reference, arc.Center);
tran.Commit();

Kết quả sau khi chạy thử

 Image 1e6c52e7 59ff 4df8 ba1b 3da8f2ec9017

Có thể kiểm tra đơn giản qua Dynamo như sau:

#Copyright(c) 2021, Hồ Văn Chương
# @chuongmep, https://chuongmep.com/
import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
import System
from System.Collections.Generic import *
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
import sys
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\Lib')
doc = DocumentManager.Instance.CurrentDBDocument
import clr
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
elements = UnwrapElement(IN[0]) if isinstance(IN[0],list) else [UnwrapElement(IN[0])]
ref=[]
for element in elements:
if isinstance (element, Autodesk.Revit.DB.Dimension):
ref.append(element.References)
elif isinstance (element, Autodesk.Revit.DB.ReferencePlane):
ref.append(element.GetReference())
else : ref.append(Reference(element))
arc = IN[1]
cen = IN[2]
#Do some action in a Transaction
TransactionManager.Instance.EnsureInTransaction(doc)
dim = doc.FamilyCreate.NewRadialDimension(doc.ActiveView,ref[0],cen[0])
TransactionManager.Instance.TransactionTaskDone()
OUT = dim

Kết hợp với việc kiểm tra nhanh giữa bề mặt và curve đường cung

 Image 0e226d5c 47d4 48dd a937 d58e71e7d7e4

Kết quả sau khi kiểm tra.

 Image 5f100c69 44a3 439d b870 7dbde14092e6

Tổng kết

Hy vọng với chia sẻ nhỏ này có thể giúp các bác thực hiện ý tưởng mong muốn của mình đúng với yêu cầu dự án, hoặc hỗ trợ vấn đề mắc phải như bài viết này.Cám ơn các bác đã ghé thăm và đọc bài trên blog của mình.

Tham Khảo

Thebuildingcoder