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; | |
} |
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] |
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ả
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ử
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
Kết quả sau khi kiểm tra.
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.