写在前面:
    此文档为本人日常思维脑图,日常记录使用,对外公开源于奢望大佬提携指正,所以日常混乱,断档和增删实属正常。
    若有精力,定期整理。
    希望各路大佬提点小赵同学,为祖国建设,添砖加瓦。
    本人微信 / 邮箱:Still_destine / bim888@foxmail.com
    感谢python小甲鱼及dynamo姑娘胡老师的启蒙教育,在此鸣谢!

    示例:一枚赤裸裸的方盒子。4.png性感的裁缝小姐姐为我量完尺寸,让我的脸红里透着黄(表示dynamo已经获取到了surface)。5.png温暖洁白的新衣,将我包裹了起来,感谢裁缝小姐姐无微不至的关心。6.png
    视频演示: 我的影片1.mp4 (2.39MB)好啦 进入正题,通过上边的案例我们了解到,经过一些列的程序运算,我们本来赤裸的盒子,已经有了自己的衣服,最终畅想在系列完结时,我们可以得到一个一键生成正确扣减后,存在模型实体,包含必要信息的装饰模型。
    日后我会尝试编辑预留的思路和各种路线的优缺点。
    立方体.rar日常练习的revit文件我放在这里啦,大家可以下载把玩,注意小心轻放。
    这个案例的dynamo源文件我也放在下面了:V我索要密码,不是收费,主要是想交个朋,哈哈哈。
    微信图片_20200610163540.jpg但是发.jpg

    正 文开始:最后更新于/2020/06/10
    [20200531~20200609] 时光一去不复返
    [20200610~20200610] 梦想启航的日子
    [20200611~20200612] 处理新增饰面的curve,以确保接缝正确
    [20200613~20200613] 去火星钓鱼
    [20200614~20200614] python充电 拜见恩师小甲鱼
    [20200615~20200617] 做一个两个独立实体的BOOL差集处理,简单测试扣减合并
    [20200618~20200704] 研发周期
    思维导图:未完结 第一节:方盒子的新衣梦(基于实例规则表面生成饰面) - 图6 流程图
    1.png
    上述流程图的python节点

    1. #Copyright(c) 2016, Dimitar Venkov
    2. # @5devene, dimitar.ven@gmail.com
    3. import clr
    4. import System
    5. from System.Collections.Generic import *
    6. from itertools import repeat
    7. pf_path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86)
    8. import sys
    9. sys.path.append('%s\IronPython 2.7\Lib' %pf_path)
    10. import traceback
    11. clr.AddReference('ProtoGeometry')
    12. from Autodesk.DesignScript.Geometry import *
    13. from Autodesk.DesignScript.Geometry import Point as DynPoint
    14. clr.AddReference('RevitServices')
    15. import RevitServices
    16. from RevitServices.Persistence import DocumentManager
    17. from RevitServices.Transactions import TransactionManager
    18. doc = DocumentManager.Instance.CurrentDBDocument
    19. clr.AddReference('RevitAPI')
    20. from Autodesk.Revit.DB import *
    21. from Autodesk.Revit.DB.Structure import StructuralType
    22. clr.AddReference('RevitNodes')
    23. import Revit
    24. clr.ImportExtensions(Revit.Elements)
    25. clr.ImportExtensions(Revit.GeometryConversion)
    26. def tolist(obj1):
    27. if hasattr(obj1,'__iter__'): return obj1
    28. else: return [obj1]
    29. def PadLists(lists):
    30. len1 = len(lists[0])
    31. for i in xrange(1,len(lists)):
    32. len2 = len(lists[i])
    33. if len2 == len1 : continue
    34. elif len2 > len1: lists[i] = lists[i][:len1]
    35. else : lists[i].extend(repeat(lists[i][-1],len1 - len2))
    36. return lists
    37. class FamOpt1(IFamilyLoadOptions):
    38. def __init__(self):
    39. pass
    40. def OnFamilyFound(self,familyInUse, overwriteParameterValues):
    41. return True
    42. def OnSharedFamilyFound(self,familyInUse, source, overwriteParameterValues):
    43. return True
    44. geom = tolist(IN[0])
    45. fam_path = IN[1]
    46. names = tolist(IN[2])
    47. category = tolist(IN[3])
    48. material = tolist(IN[4])
    49. isVoid = tolist(IN[5])
    50. subcat = tolist(IN[6])
    51. units = doc.GetUnits().GetFormatOptions(UnitType.UT_Length).DisplayUnits
    52. factor = UnitUtils.ConvertToInternalUnits(1,units)
    53. acceptable_views = ('ThreeD', 'FloorPlan', 'EngineeringPlan', 'CeilingPlan', 'Elevation', 'Section')
    54. origin = XYZ.Zero
    55. str_typ = StructuralType.NonStructural
    56. t1 = TransactionManager.Instance
    57. temp_path = System.IO.Path.GetTempPath()
    58. invalid_chars = System.IO.Path.GetInvalidFileNameChars()
    59. satOpt = SATImportOptions()
    60. satOpt.Placement = ImportPlacement.Origin
    61. satOpt.Unit = ImportUnit.Foot
    62. opt1 = Options()
    63. opt1.ComputeReferences = True
    64. SaveAsOpt = SaveAsOptions()
    65. SaveAsOpt.OverwriteExistingFile = True
    66. def NewForm_background(s1, name1, cat1, isVoid1, mat1, subcat1):
    67. try:
    68. enable_mat = False if mat1 is None else True
    69. enable_subcat = False if subcat1 is None else True
    70. if any( (c in name1 for c in invalid_chars) ):
    71. raise Exception('Family name contains invalid characters')
    72. TransactionManager.ForceCloseTransaction(t1)
    73. famdoc = doc.Application.NewFamilyDocument(fam_path)
    74. sat_path = '%s%s.sat' % (temp_path, name1)
    75. if factor != 1:
    76. s1 = s1.Scale(factor)
    77. vec1 = Vector.ByTwoPoints(BoundingBox.ByGeometry(s1).MinPoint, DynPoint.Origin())
    78. s1 = s1.Translate(vec1)
    79. sat1 = Geometry.ExportToSAT(s1, sat_path)
    80. view_fec = FilteredElementCollector(famdoc).OfClass(View)
    81. view1 = None
    82. for v in view_fec:
    83. if str(v.ViewType) in acceptable_views and not v.IsTemplate:
    84. view1 = v
    85. break
    86. t1.EnsureInTransaction(famdoc)
    87. satId = famdoc.Import(sat1, satOpt, view1)
    88. el1 = famdoc.GetElement(satId)
    89. geom1 = el1.get_Geometry(opt1)
    90. enum = geom1.GetEnumerator()
    91. enum.MoveNext()
    92. geom2 = enum.Current.GetInstanceGeometry()
    93. enum2 = geom2.GetEnumerator()
    94. enum2.MoveNext()
    95. s1 = enum2.Current
    96. famdoc.Delete(satId)
    97. System.IO.File.Delete(sat_path)
    98. save_path = '%s%s.rfa' % (temp_path, name1)
    99. try: #set the category
    100. fam_cat = famdoc.Settings.Categories.get_Item(cat1.Name)
    101. famdoc.OwnerFamily.FamilyCategory = fam_cat
    102. except: pass
    103. s2 = FreeFormElement.Create(famdoc,s1)
    104. if isVoid1:
    105. void_par = s2.get_Parameter(BuiltInParameter.ELEMENT_IS_CUTTING).Set(1)
    106. void_par2 = famdoc.OwnerFamily.get_Parameter(BuiltInParameter.FAMILY_ALLOW_CUT_WITH_VOIDS).Set(1)
    107. else: #voids do not have a material values or a sub-cateogry
    108. if enable_mat:
    109. try:
    110. mat_fec = FilteredElementCollector(famdoc).OfClass(Material)
    111. for m in mat_fec:
    112. if m.Name == mat1:
    113. fam_mat = m
    114. break
    115. mat_par = s2.get_Parameter(BuiltInParameter.MATERIAL_ID_PARAM).Set(fam_mat.Id)
    116. except: pass
    117. if enable_subcat: #create and assign the sub-category:
    118. try:
    119. current_fam_cat = famdoc.OwnerFamily.FamilyCategory
    120. fam_cat_subs = current_fam_cat.SubCategories
    121. if fam_cat_subs.Contains(subcat1):
    122. new_subcat = fam_cat_subs[subcat1]
    123. else:
    124. new_subcat = famdoc.Settings.Categories.NewSubcategory(current_fam_cat, subcat1)
    125. s2.Subcategory = new_subcat
    126. except: pass
    127. TransactionManager.ForceCloseTransaction(t1)
    128. famdoc.SaveAs(save_path, SaveAsOpt)
    129. family1 = famdoc.LoadFamily(doc, FamOpt1() )
    130. famdoc.Close(False)
    131. System.IO.File.Delete(save_path)
    132. symbols = family1.GetFamilySymbolIds().GetEnumerator()
    133. symbols.MoveNext()
    134. symbol1 = doc.GetElement(symbols.Current)
    135. t1.EnsureInTransaction(doc)
    136. if not symbol1.IsActive: symbol1.Activate()
    137. inst1 = doc.Create.NewFamilyInstance(origin, symbol1, str_typ)
    138. ElementTransformUtils.MoveElement(doc,inst1.Id, vec1.Reverse().ToXyz() )
    139. TransactionManager.ForceCloseTransaction(t1)
    140. return inst1.ToDSType(False), family1.ToDSType(False)
    141. except:
    142. return traceback.format_exc(),''
    143. if len(geom) == len(names) == len(category) == len(isVoid) == len(material) == len(subcat):
    144. return1 = map(NewForm_background, geom, names, category, isVoid, material, subcat)
    145. elif len(geom) == len(names):
    146. padded = PadLists([geom, category, isVoid, material,subcat])
    147. p_category, p_isVoid, p_material, p_subcat = padded[1], padded[2], padded[3], padded[4]
    148. return1 = map(NewForm_background, geom, names, p_category, p_isVoid, p_material, p_subcat)
    149. else : return1 = [('Make sure that each geometry\nobject has a unique family name.', '')]
    150. OUT = [i[0] for i in return1], [i[1] for i in return1]
    151. satOpt.Dispose()
    152. opt1.Dispose()
    153. SaveAsOpt.Dispose()

    3.png完整生成多个实体模型独立外表面的dynamo节点,源文件文中已上传。

    广必成科技-BIM先行军 应用实践者
    点击查看【amap】