Mở đầu

Chắc hẳn bài này sẽ rất nhiều bác cần lắm đây, quả là dạo này gần đây rất nhiều anh em hỏi về vụ family share và tự động gán parameter hàng loạt vào family thật không nhanh tí nào.Họ phải mờ từng family rồi chọn share parameter từ file share sau đó nhét vào family rồi tải vào dự án.Hôm nay thấy thêm đồng nghiệp của mình lại đi làm cái công việc nhàm chán này.Và điều đó đã dẫn đến mình cần viết bài này.

Sau bài viết này có cả ngàn family cần gán vào bạn cũng không ngán.

Tổng quan

Ta khởi đầu với một số thư viện

#Copyright(c)2020,chuongho
#@chuongmep,https://chuongmep.com/
import clr
clr.AddReference('ProtoGeometry')
clr.AddReference('RevitAPI')
clr.AddReference("RevitServices")
from Autodesk.DesignScript.Geometry import *
from Autodesk.Revit.DB import *
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
# Document
doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application
view raw LibDynamo.py hosted with ❤ by GitHub

Giờ ta sẽ mở cái share prarameter lên và đọc thông tin defGroup của chúng.

spfile = app.OpenSharedParameterFile()
def defFile(spfile, group, param):
defGroup = spfile.Groups.get_Item(group)
return defGroup.Definitions.get_Item(param)
view raw DefGroup.py hosted with ❤ by GitHub

Một số tham biến truyền vào sẽ như sau bao gồm : Đối tượng family, Parameter Name, Parameter Group, instance đại diện cho parameter instance hoặc parameter type

def tolist(obj1):
if hasattr(obj1,"__iter__"): return obj1
else : return [obj1]
fams = UnwrapElement(tolist(IN[0]))
params = IN[1]
group = IN[2]
paramGroup = IN[3]
instance = IN[4]
logs = []
if not isinstance(params, list): params = [params]

Được rồi, bây giờ mình sẽ làm việc với một số family truyền vào để xử lý nhé, thông thường để giải quyết cho một family , ta phải chuyển đổi sang một document mới nên việc chuyển đổi này cần trải qua một bước gọi là đóng document cũ sau đó mới sử dụng được document mới trong family thực tại đang làm việc.Kết quả sẽ trả về lỗi thông báo cho người dùng biết là đã thành công hay chưa.

try:
for f in fams:
try:
spfile = app.OpenSharedParameterFile()
except:
log = 'No Shared Parameter file found!'
family = UnwrapElement(f)
TransactionManager.Instance.ForceCloseTransaction()
try:
doc_family = doc.EditFamily(family.Symbol.Family)
except:
doc_family = doc.EditFamily(family)
if doc_family != None:
#Data Process
try:
TransactionManager.Instance.EnsureInTransaction(doc_family)
for item,pg,gr in zip(params,paramGroup,group):
if isinstance(pg, basestring): exec ("pg = BuiltInParameterGroup.%s" % pg)
eDef = defFile(spfile, gr, item)
try:
doc_family.FamilyManager.AddParameter(eDef,pg,instance)
log = 'Shared Parameter Added Successfully'
logs.append(log)
except:
log = "Parameter Has Created"
logs.append(log)
except Exception,ex :
log = ex.message
pass
doc_family.LoadFamily(doc,FamilyOption())
TransactionManager.Instance.TransactionTaskDone()
except Exception,ex:
log = ex.message
# Assign your output to the OUT variable.
OUT = logs

Cuối cùng ta ghép nối lại với một cú đúp như sau :

103283010 294151245310333 6282084556257660114 o

Giành cho người dùng không chuyên

Ta cần chuẩn bị một file share parameter cụ thể ăn sẵn như thế này trước.

103283010 294151245310333 6282084556257660114 1

Tải về gói DynaMEP bản mới nhất mình đã giới thiệu tại các bài trước.

Kiểm tra tệp shareparameter.txt dã được gán vào dự án chưa

3010 294151245310333 6282084556257660114 o

Thử gán một tham số parameter có trong file share với một cái đèn và bao gồm các node như sau.Lưu ý là các node mình viết trong DynaMEP nhé.Nếu không tải về thì tìm sẽ không có

3010 294151245310333 62820845562576601

Kết quả như trên thành công với 1 parameter và 1 đối tượng phải không, vậy thì với một đống parameter và một đống family thì làm sao.Tất nhiên ta chỉ cần sửa đổi thêm một chút trong node của mình.Một ví dụ trong dự án thật mình đang làm cho các bạn dễ hình dung.Biến bool chính là bạn muốn tạo parameter instance hay không, nếu muốn instane thì để true.Bên dưới là mình tạo hai biến cho cả Instance và cả Type.

103782453 10222670801465559 3236870798007204296 n

Kết quả

103322219 10222670801665564 420416445257503378 o

Download : Here

Mở rộng

với bài viết này, Hy vọng sẽ giúp phần nào những bạn đang rơi vào tình trạng tiến thoái lưỡng nam này , có thể bây giờ bạn đang không dùng nhưng biết đâu một ngày đẹp trời bạn nhận dự án lớn và khách hàng yêu cầu bạn phải làm hàng loạt như vậy để kịp tiến độ thì sao.Cám ơn các bạn đã ghé thăm và đọc bài viết trên blog.Nếu có thắc mắc hãy để lại bình luận bên dưới bài viết nhé.

Thêm một trường hợp mở rộng mà mình phải xem xét đến thời điểm này có người hỏi mình đó là chỉ những family được đặt mới chọn được, vậy những family có trong dự án chưa được đặt thì làm thế nào.Rất đơn giản hãy đổi node Select Model element sang node GetSelection trong gói DynaMEP nhé.Chọn cái gì làm cái đó :D

208455625766014 o

Hiện tại công cụ này đã được phát triển mở rộng hơn , nếu bạn nào cần có thể liên hệ riêng với mình.Tất nhiên hàng nào của đó phải không, dùng được cho tất cả các trường hợp trên trời dưới đất :D

Cập nhật

Kể từ phiên bản cập nhật DynaMEP 1.2.2 trở đi, mình sẽ sử dụng mở rộng này cho các đối tượng với doc có thể là dự án hiện tại đang mở hoặc từ dự án đã được linked

 PH 2f19e7a5 072d 4f32 9be4 842a74883438