写在前面:
此文档为本人日常思维脑图,日常记录使用,对外公开源于奢望大佬提携指正,所以日常混乱,断档和增删实属正常。
若有精力,定期整理。
希望各路大佬提点小赵同学,为祖国建设,添砖加瓦。
本人微信 / 邮箱:Still_destine / bim888@foxmail.com
感谢python小甲鱼及dynamo姑娘胡老师的启蒙教育,在此鸣谢!
示例:一枚赤裸裸的方盒子。
性感的裁缝小姐姐为我量完尺寸,让我的脸红里透着黄(表示dynamo已经获取到了surface)。
温暖洁白的新衣,将我包裹了起来,感谢裁缝小姐姐无微不至的关心。
视频演示:
好啦 进入正题,通过上边的案例我们了解到,经过一些列的程序运算,我们本来赤裸的盒子,已经有了自己的衣服,最终畅想在系列完结时,我们可以得到一个一键生成正确扣减后,存在模型实体,包含必要信息的装饰模型。
日后我会尝试编辑预留的思路和各种路线的优缺点。
立方体.rar日常练习的revit文件我放在这里啦,大家可以下载把玩,注意小心轻放。
这个案例的dynamo源文件我也放在下面了:V我索要密码,不是收费,主要是想交个朋,哈哈哈。
正 文开始:最后更新于/2020/06/10
[20200531~20200609] 时光一去不复返
[20200610~20200610] 梦想启航的日子
[20200611~20200612] 处理新增饰面的curve,以确保接缝正确
[20200613~20200613] 去火星钓鱼
[20200614~20200614] python充电 拜见恩师小甲鱼
[20200615~20200617] 做一个两个独立实体的BOOL差集处理,简单测试扣减合并
[20200618~20200704] 研发周期
思维导图:未完结
流程图

上述流程图的python节点
#Copyright(c) 2016, Dimitar Venkov# @5devene, dimitar.ven@gmail.comimport clrimport Systemfrom System.Collections.Generic import *from itertools import repeatpf_path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86)import syssys.path.append('%s\IronPython 2.7\Lib' %pf_path)import tracebackclr.AddReference('ProtoGeometry')from Autodesk.DesignScript.Geometry import *from Autodesk.DesignScript.Geometry import Point as DynPointclr.AddReference('RevitServices')import RevitServicesfrom RevitServices.Persistence import DocumentManagerfrom RevitServices.Transactions import TransactionManagerdoc = DocumentManager.Instance.CurrentDBDocumentclr.AddReference('RevitAPI')from Autodesk.Revit.DB import *from Autodesk.Revit.DB.Structure import StructuralTypeclr.AddReference('RevitNodes')import Revitclr.ImportExtensions(Revit.Elements)clr.ImportExtensions(Revit.GeometryConversion)def tolist(obj1):if hasattr(obj1,'__iter__'): return obj1else: return [obj1]def PadLists(lists):len1 = len(lists[0])for i in xrange(1,len(lists)):len2 = len(lists[i])if len2 == len1 : continueelif len2 > len1: lists[i] = lists[i][:len1]else : lists[i].extend(repeat(lists[i][-1],len1 - len2))return listsclass FamOpt1(IFamilyLoadOptions):def __init__(self):passdef OnFamilyFound(self,familyInUse, overwriteParameterValues):return Truedef OnSharedFamilyFound(self,familyInUse, source, overwriteParameterValues):return Truegeom = tolist(IN[0])fam_path = IN[1]names = tolist(IN[2])category = tolist(IN[3])material = tolist(IN[4])isVoid = tolist(IN[5])subcat = tolist(IN[6])units = doc.GetUnits().GetFormatOptions(UnitType.UT_Length).DisplayUnitsfactor = UnitUtils.ConvertToInternalUnits(1,units)acceptable_views = ('ThreeD', 'FloorPlan', 'EngineeringPlan', 'CeilingPlan', 'Elevation', 'Section')origin = XYZ.Zerostr_typ = StructuralType.NonStructuralt1 = TransactionManager.Instancetemp_path = System.IO.Path.GetTempPath()invalid_chars = System.IO.Path.GetInvalidFileNameChars()satOpt = SATImportOptions()satOpt.Placement = ImportPlacement.OriginsatOpt.Unit = ImportUnit.Footopt1 = Options()opt1.ComputeReferences = TrueSaveAsOpt = SaveAsOptions()SaveAsOpt.OverwriteExistingFile = Truedef NewForm_background(s1, name1, cat1, isVoid1, mat1, subcat1):try:enable_mat = False if mat1 is None else Trueenable_subcat = False if subcat1 is None else Trueif any( (c in name1 for c in invalid_chars) ):raise Exception('Family name contains invalid characters')TransactionManager.ForceCloseTransaction(t1)famdoc = doc.Application.NewFamilyDocument(fam_path)sat_path = '%s%s.sat' % (temp_path, name1)if factor != 1:s1 = s1.Scale(factor)vec1 = Vector.ByTwoPoints(BoundingBox.ByGeometry(s1).MinPoint, DynPoint.Origin())s1 = s1.Translate(vec1)sat1 = Geometry.ExportToSAT(s1, sat_path)view_fec = FilteredElementCollector(famdoc).OfClass(View)view1 = Nonefor v in view_fec:if str(v.ViewType) in acceptable_views and not v.IsTemplate:view1 = vbreakt1.EnsureInTransaction(famdoc)satId = famdoc.Import(sat1, satOpt, view1)el1 = famdoc.GetElement(satId)geom1 = el1.get_Geometry(opt1)enum = geom1.GetEnumerator()enum.MoveNext()geom2 = enum.Current.GetInstanceGeometry()enum2 = geom2.GetEnumerator()enum2.MoveNext()s1 = enum2.Currentfamdoc.Delete(satId)System.IO.File.Delete(sat_path)save_path = '%s%s.rfa' % (temp_path, name1)try: #set the categoryfam_cat = famdoc.Settings.Categories.get_Item(cat1.Name)famdoc.OwnerFamily.FamilyCategory = fam_catexcept: passs2 = FreeFormElement.Create(famdoc,s1)if isVoid1:void_par = s2.get_Parameter(BuiltInParameter.ELEMENT_IS_CUTTING).Set(1)void_par2 = famdoc.OwnerFamily.get_Parameter(BuiltInParameter.FAMILY_ALLOW_CUT_WITH_VOIDS).Set(1)else: #voids do not have a material values or a sub-cateogryif enable_mat:try:mat_fec = FilteredElementCollector(famdoc).OfClass(Material)for m in mat_fec:if m.Name == mat1:fam_mat = mbreakmat_par = s2.get_Parameter(BuiltInParameter.MATERIAL_ID_PARAM).Set(fam_mat.Id)except: passif enable_subcat: #create and assign the sub-category:try:current_fam_cat = famdoc.OwnerFamily.FamilyCategoryfam_cat_subs = current_fam_cat.SubCategoriesif fam_cat_subs.Contains(subcat1):new_subcat = fam_cat_subs[subcat1]else:new_subcat = famdoc.Settings.Categories.NewSubcategory(current_fam_cat, subcat1)s2.Subcategory = new_subcatexcept: passTransactionManager.ForceCloseTransaction(t1)famdoc.SaveAs(save_path, SaveAsOpt)family1 = famdoc.LoadFamily(doc, FamOpt1() )famdoc.Close(False)System.IO.File.Delete(save_path)symbols = family1.GetFamilySymbolIds().GetEnumerator()symbols.MoveNext()symbol1 = doc.GetElement(symbols.Current)t1.EnsureInTransaction(doc)if not symbol1.IsActive: symbol1.Activate()inst1 = doc.Create.NewFamilyInstance(origin, symbol1, str_typ)ElementTransformUtils.MoveElement(doc,inst1.Id, vec1.Reverse().ToXyz() )TransactionManager.ForceCloseTransaction(t1)return inst1.ToDSType(False), family1.ToDSType(False)except:return traceback.format_exc(),''if len(geom) == len(names) == len(category) == len(isVoid) == len(material) == len(subcat):return1 = map(NewForm_background, geom, names, category, isVoid, material, subcat)elif len(geom) == len(names):padded = PadLists([geom, category, isVoid, material,subcat])p_category, p_isVoid, p_material, p_subcat = padded[1], padded[2], padded[3], padded[4]return1 = map(NewForm_background, geom, names, p_category, p_isVoid, p_material, p_subcat)else : return1 = [('Make sure that each geometry\nobject has a unique family name.', '')]OUT = [i[0] for i in return1], [i[1] for i in return1]satOpt.Dispose()opt1.Dispose()SaveAsOpt.Dispose()
完整生成多个实体模型独立外表面的dynamo节点,源文件文中已上传。
广必成科技-BIM先行军 应用实践者
点击查看【amap】
