elem_name = elem.LookupParameter('ARH_mk').AsString() ids = List[ElementId]() ids.Add(sel.ElementId) family = elem.Symbol.Family TransactionManager.Instance.EnsureInTransaction(doc) # Создание сборки assembly = AssemblyInstance.Create(doc, ids, elem.Category.Id) # Создание листа сборки assembly_sheet = AssemblyViewUtils.CreateSheet(doc, assembly.Id, get_title_block('ARH_TitleBlock')) assembly_sheet.Name = elem_name # Создание 3д вида view3D = create_View3D(assembly, 10) pt_view3d = XYZ(1.12578803139851, 0.250911809407337, 0) vp_view3d = Viewport.Create(doc, assembly_sheet.Id, view3D.Id, pt_view3d) change_type(vp_view3d, 'ARH_БезЗаголовка') # Создание спецификации view_schedule = create_schedule(assembly) view_schedule.ViewTemplateId = select_template_id('ARH_Detail_Template') vp_schedule = ScheduleSheetInstance.Create(doc, assembly_sheet.Id, view_schedule.Id, XYZ.Zero) doc.Regenerate() move_element_schedule(vp_schedule, assembly_sheet, 415, 292) # Создание разреза pt_section_view = XYZ(1.10604515064852, 0.626337804965914, 0) section_view = create_detail_section(assembly, AssemblyDetailViewOrientation.DetailSectionB, assembly_sheet,
def create_dimension(element, point1, point2, reference_names_list, view, direction_to_move=XYZ(0, 0, 0)): line = Line.CreateBound(point1, point2) refArray = ReferenceArray() for ref in reference_names_list: refArray.Append(element.GetReferenceByName(ref)) dim = doc.Create.NewDimension(view, line, refArray) ElementTransformUtils.MoveElement(doc, dim.Id, direction_to_move) return dim
def AngleAdjustment(csdend, csdstart, csdwidth, csdheight, thickness): pp = Plane.CreateByNormalAndOrigin(csdend-csdstart, csdstart) interVector = XYZ((csdend-csdstart).Y * -1, (csdend-csdstart).X, 0) profile1 = Arc.Create(pp, csdwidth/2 + thickness, 0, math.pi) #print(pp.XVec) #print(pp.YVec) a = profile1.GetEndPoint(0) b = profile1.GetEndPoint(1) profile2 = Arc.Create(pp, csdheight/2 + thickness, math.pi/2, math.pi*3/2) c = profile2.GetEndPoint(0) d = profile2.GetEndPoint(1) point1 = a+c - csdstart point2 = b+c - csdstart point3 = b+d - csdstart point4 = a+d - csdstart l1 = Line.CreateBound(point1, point2) vector1 = point1 - point2 vector2 = XYZ((point1 - point2).X, (point1 - point2).Y, 0) vector3 = point1 -point4 #print(vector1) #print(vector2) angle = vector1.AngleOnPlaneTo(interVector, (csdend - csdstart).Normalize()) #print(angle) #print(point1) #print(point2) trans1 = Transform.CreateRotationAtPoint(csdend - csdstart, angle, point2) trans2 = Transform.CreateRotationAtPoint(csdend - csdstart, angle*(-1), point2) trans3 = Transform.CreateRotationAtPoint(csdend - csdstart, angle * (-1) + math.pi/2, point2) trans4 = Transform.CreateRotationAtPoint(csdend - csdstart, angle + math.pi / 2, point2) #print(angle) #print(angle*(-1)) #print(angle * (-1) + math.pi/2) #print(angle + math.pi / 2) #print(point4) profileorigion = CurveLoop().Create( [Line.CreateBound(point1, point2), Line.CreateBound(point2, point3), Line.CreateBound(point3, point4), Line.CreateBound(point4, point1)]) #print(l1.GetEndPoint(0)) #print(l1.GetEndPoint(1)) numbers = {} list = [] l1Test1 = l1.CreateTransformed(trans1) l1Test2 = l1.CreateTransformed(trans2) l1Test3 = l1.CreateTransformed(trans3) l1Test4 = l1.CreateTransformed(trans4) #print(l1Test1.GetEndPoint(0)) #print(l1Test1.GetEndPoint(1)) #print(l1Test2.GetEndPoint(0)) #print(l1Test2.GetEndPoint(1)) #print(l1Test3.GetEndPoint(0)) #print(l1Test3.GetEndPoint(1)) #print(l1Test4.GetEndPoint(0)) #print(l1Test4.GetEndPoint(1)) numbers[abs(l1Test1.GetEndPoint(0).Z - l1Test1.GetEndPoint(1).Z)] = trans1 numbers[abs(l1Test2.GetEndPoint(0).Z - l1Test2.GetEndPoint(1).Z)] = trans2 numbers[abs(l1Test3.GetEndPoint(0).Z - l1Test3.GetEndPoint(1).Z)] = trans3 numbers[abs(l1Test4.GetEndPoint(0).Z - l1Test4.GetEndPoint(1).Z)] = trans4 list.append(abs(l1Test1.GetEndPoint(0).Z - l1Test1.GetEndPoint(1).Z)) list.append(abs(l1Test2.GetEndPoint(0).Z - l1Test2.GetEndPoint(1).Z)) list.append(abs(l1Test3.GetEndPoint(0).Z - l1Test3.GetEndPoint(1).Z)) list.append(abs(l1Test4.GetEndPoint(0).Z - l1Test4.GetEndPoint(1).Z)) list.sort()
def CreateCurveDuct(name, width, height, thickness, startO, endO, middleO): #correction = XYZ(0, 0, height / 2) correction = XYZ(0, 0, 0) #print(name) start = startO + correction end = endO + correction middle = middleO + correction ele = () if start.X == end.X and start.Y == end.Y and start.Z == end.Z: print("Curve error, start is the same as end") return None else: path = Arc.Create(start, end, middle) #print(name) #print(start) #print(end) #print(middle) #print(path.Center) pathCurve = CurveLoop().Create([path]) pp = Plane.CreateByNormalAndOrigin(path.ComputeDerivatives(0, True).BasisX, start) profile1 = Arc.Create(pp, width/2 + thickness, 0, math.pi) normalVec = path.ComputeDerivatives(0, True).BasisX interVector = XYZ((normalVec).Y * -1, (normalVec).X, 0) a = profile1.GetEndPoint(0) vector1 = a-start vector2 = XYZ((a-start).X, (a-start).Y, 0) # angle = vector2.AngleTo(vector1) angle = vector1.AngleOnPlaneTo(interVector, (end - start).Normalize()) #print(angle) trans1 = Transform.CreateRotationAtPoint(path.ComputeDerivatives(0, True).BasisX, angle, start) trans2 = Transform.CreateRotationAtPoint(path.ComputeDerivatives(0, True).BasisX, angle * (-1), start) trans3 = Transform.CreateRotationAtPoint(path.ComputeDerivatives(0, True).BasisX, angle * (-1) + math.pi / 2, start) trans4 = Transform.CreateRotationAtPoint(path.ComputeDerivatives(0, True).BasisX, angle + math.pi / 2, start) b = profile1.GetEndPoint(1) profile2 = Arc.Create(pp, height/2 + thickness, math.pi/2, math.pi*3/2) c = profile2.GetEndPoint(0) d = profile2.GetEndPoint(1) point1 = a+c-start point2 = b+c-start point3 = b+d-start point4 = a+d-start numbers = {} list = [] l1 = Line.CreateBound(point1, point2) l1Test1 = l1.CreateTransformed(trans1) l1Test2 = l1.CreateTransformed(trans2) l1Test3 = l1.CreateTransformed(trans3) l1Test4 = l1.CreateTransformed(trans4) numbers[abs(l1Test1.GetEndPoint(0).Z - l1Test1.GetEndPoint(1).Z)] = trans1 numbers[abs(l1Test2.GetEndPoint(0).Z - l1Test2.GetEndPoint(1).Z)] = trans2 numbers[abs(l1Test3.GetEndPoint(0).Z - l1Test3.GetEndPoint(1).Z)] = trans3 numbers[abs(l1Test4.GetEndPoint(0).Z - l1Test4.GetEndPoint(1).Z)] = trans4 list.append(abs(l1Test1.GetEndPoint(0).Z - l1Test1.GetEndPoint(1).Z)) list.append(abs(l1Test2.GetEndPoint(0).Z - l1Test2.GetEndPoint(1).Z)) list.append(abs(l1Test3.GetEndPoint(0).Z - l1Test3.GetEndPoint(1).Z)) list.append(abs(l1Test4.GetEndPoint(0).Z - l1Test4.GetEndPoint(1).Z)) list.sort() profileorigion = CurveLoop().Create([Line.CreateBound(point1, point2), Line.CreateBound(point2, point3), Line.CreateBound(point3, point4), Line.CreateBound(point4, point1)]) profile = CurveLoop.CreateViaTransform(profileorigion, numbers[list[0]]) geo = GeometryCreationUtilities.CreateSweptGeometry(pathCurve, 0, path.GetEndParameter(0), [profile]) ele = DirectShape.CreateElement(doc, ElementId(-2000151)) ele.SetShape([geo]) ele.SetName(name) return ele.Id
def CreateStraightDuct(csdname, csdwidth, csdheight, thickness, csdstartO, csdendO, csdlength): #print(csdname) #correction = XYZ(0, 0, csdheight / 2) correction = XYZ(0, 0, 0) csdstart = csdstartO + correction csdend = csdendO + correction if (csdend-csdstart).GetLength() > 0.1: pp = Plane.CreateByNormalAndOrigin(csdend-csdstart, csdstart) profile1 = Arc.Create(pp, csdwidth/2 + thickness, 0, math.pi) interVector = XYZ((csdend - csdstart).Y * -1, (csdend - csdstart).X, 0) a = profile1.GetEndPoint(0) b = profile1.GetEndPoint(1) profile2 = Arc.Create(pp, csdheight/2 + thickness, math.pi/2, math.pi*3/2) c = profile2.GetEndPoint(0) d = profile2.GetEndPoint(1) point1 = a+c - csdstart point2 = b+c - csdstart point3 = b+d - csdstart point4 = a+d - csdstart l1 = Line.CreateBound(point1, point2) vector1 = point1 - point2 vector2 = XYZ((point1 - point2).X, (point1 - point2).Y, 0) #print(vector1) #print(vector2) angle = vector1.AngleOnPlaneTo(interVector, (csdend - csdstart).Normalize()) #angle = vector2.AngleTo(vector1) #print(angle) #print(point1) #print(point2) trans1 = Transform.CreateRotationAtPoint(csdend - csdstart, angle, csdstart) trans2 = Transform.CreateRotationAtPoint(csdend - csdstart, angle*(-1), csdstart) trans3 = Transform.CreateRotationAtPoint(csdend - csdstart, angle * (-1) + math.pi/2, csdstart) trans4 = Transform.CreateRotationAtPoint(csdend - csdstart, angle + math.pi / 2, csdstart) #print(angle) #print(angle*(-1)) #print(angle * (-1) + math.pi/2) #print(angle + math.pi / 2) #print(point4) profileorigion = CurveLoop().Create( [Line.CreateBound(point1, point2), Line.CreateBound(point2, point3), Line.CreateBound(point3, point4), Line.CreateBound(point4, point1)]) #print(l1.GetEndPoint(0)) #print(l1.GetEndPoint(1)) numbers = {} list = [] l1Test1 = l1.CreateTransformed(trans1) l1Test2 = l1.CreateTransformed(trans2) l1Test3 = l1.CreateTransformed(trans3) l1Test4 = l1.CreateTransformed(trans4) numbers[abs(l1Test1.GetEndPoint(0).Z - l1Test1.GetEndPoint(1).Z)] = trans1 numbers[abs(l1Test2.GetEndPoint(0).Z - l1Test2.GetEndPoint(1).Z)] = trans2 numbers[abs(l1Test3.GetEndPoint(0).Z - l1Test3.GetEndPoint(1).Z)] = trans3 numbers[abs(l1Test4.GetEndPoint(0).Z - l1Test4.GetEndPoint(1).Z)] = trans4 list.append(abs(l1Test1.GetEndPoint(0).Z - l1Test1.GetEndPoint(1).Z)) list.append(abs(l1Test2.GetEndPoint(0).Z - l1Test2.GetEndPoint(1).Z)) list.append(abs(l1Test3.GetEndPoint(0).Z - l1Test3.GetEndPoint(1).Z)) list.append(abs(l1Test4.GetEndPoint(0).Z - l1Test4.GetEndPoint(1).Z)) list.sort() finalProfile = CurveLoop.CreateViaTransform(profileorigion, numbers[list[0]]) geo = GeometryCreationUtilities.CreateExtrusionGeometry([finalProfile], csdend-csdstart, csdlength) ele = DirectShape.CreateElement(doc, ElementId(-2000151)) ele.SetShape([geo]) ele.SetName(csdname) return ele.Id else: print("Duct too small") return None
#print(d) try: pair = str(d).split(":") #print(pair) data[pair[0].strip()] = pair[1].strip() except: print("Error 1") # Pressure Pipe if name[0:13] == 'Pressure Pipe': startx = float(data['StartX']) + xAdjust starty = float(data['StartY']) + yAdjust startz = float(data['StartZ']) + zAdjust endx = float(data['EndX']) + xAdjust endy = float(data['EndY']) + yAdjust endz = float(data['EndZ']) + zAdjust start = XYZ(startx, starty, startz) end = XYZ(endx, endy, endz) outDiameter = float(data['OuterDiameter']) innerDiameter = float(data['InnerDiameter']) thickness = float(data['WallThickness']) description = data['Style'] eleType2 = CreateStraightPipe(name, innerDiameter, thickness, start, end, start.DistanceTo(end)) if eleType2: v1 = doc.GetElement(eleType2).LookupParameter("Mark").Set(str(name)) try: v2 = doc.GetElement(eleType2).LookupParameter("Comments").Set(str(description)) except: print("Description cannot be found") # Pipes
def draw(panels): els = FilteredElementCollector(doc)\ .OfCategory(BuiltInCategory.OST_GenericAnnotation)\ .WhereElementIsNotElementType()\ .ToElements() # for el in els: # if el.Name == 'Цепь' or el.Name == 'Щит': # doc.Delete(el.Id) anns = FilteredElementCollector(doc)\ .OfCategory(BuiltInCategory.OST_GenericAnnotation)\ .WhereElementIsElementType()\ .ToElements() cirFamily = list( filter( lambda x: x.get_Parameter(BuiltInParameter.SYMBOL_NAME_PARAM). AsString() == 'Цепь', anns))[0] panelFamily = list( filter( lambda x: x.get_Parameter(BuiltInParameter.SYMBOL_NAME_PARAM). AsString() == 'Щит', anns))[0] views = FilteredElementCollector(doc)\ .OfCategory(BuiltInCategory.OST_Views)\ .WhereElementIsNotElementType()\ .ToElements() activeView = 0 for i in views: if i.Name == 'Чертежный вид 1': activeView = i if not activeView: raise Exception('No view to draw') # activeView = doc.ActiveView if doc.ActiveView.Name != 'Чертежный вид 1': return cApps = { 'qf': 'Автоматический выключатель', 'QF': 'Автоматический выключатель 2P', 'QS': 'Выключатель', 'QFD': 'Дифф', 'KM': 'Контактор', 'FU': 'Плавкая вставка', 'QSU': 'Рубильник с плавкой вставкой', 'QD': 'УЗО' } for y, panel in enumerate( natural_sorted(filter( lambda x: doc.GetElement(x).LookupParameter('Имя щита'). AsString(), panels.keys()), key=lambda x: doc.GetElement(x).LookupParameter( 'Имя щита').AsString())): el = doc.Create.NewFamilyInstance(XYZ(0, -y * 250 / k, 0), panelFamily, activeView) el.LookupParameter('Имя щита').Set( doc.GetElement(panel).LookupParameter('Имя щита').AsString()) # headCirs = filter(lambda x: 'Щит' in x.BaseEquipment.Name, natural_sorted(panels[panel], key=lambda x: x.LookupParameter('Номер группы').AsString())) headCirs = [] for cir in natural_sorted( panels[panel], key=lambda x: x.LookupParameter('Номер группы').AsString()): if not cir.BaseEquipment or ( 'Щит' in cir.BaseEquipment.Name and 'Итого' not in cir.LookupParameter('Имя нагрузки группы').AsString()): headCirs.append(cir) # headCirs = filter(lambda x: 'Щит' in x.BaseEquipment.Name, natural_sorted(panels[panel], key=lambda x: x.LookupParameter('Номер группы').AsString())) # print headCirs[0] # print headCirs[0].Id res = headCirs[0].BaseEquipment.LookupParameter('Резерв').AsInteger() # n = len(list(headCirs[0].BaseEquipment.MEPModel.ElectricalSystems)) # Продираемся до щита и считаем количество его цепей n = 0 # print('------------') # print(el.LookupParameter('Имя щита').AsString()) # for cir in list(headCirs[0].BaseEquipment.MEPModel.ElectricalSystems): # print('{} {}'.format(n, cir.LookupParameter('Номер группы').AsString())) # # if cir.LookupParameter('Тип системы').AsValueString() == 'Данные': continue # n += 1 n = len(headCirs) el.LookupParameter('Ширина рамки').Set((n + res) * 16 / k) minNom = 99999999 minChar = 'D' for x, cir in enumerate(headCirs + range(res)): if type(cir) != type(1): el = doc.Create.NewFamilyInstance( XYZ(x * 16 / k, -y * 250 / k, 0), cirFamily, activeView) el.LookupParameter('Номер группы').Set( cir.LookupParameter('Номер группы').AsString()) el.LookupParameter('Расчетная мощность').Set( round( cir.LookupParameter( 'Суммарная мощность группы').AsDouble() / 10763.9104167097, 2)) el.LookupParameter('Cos φ').Set( round(cir.LookupParameter('Cos φ').AsDouble(), 2)) el.LookupParameter('Ток').Set( round(cir.LookupParameter('Ток').AsDouble(), 2)) el.LookupParameter('Падение группы').Set( round(cir.LookupParameter('Падение группы').AsDouble(), 2)) el.LookupParameter('Длина расчетная').Set( round( cir.LookupParameter('Длина расчетная').AsDouble() / 1000, 0)) nom = round( cir.LookupParameter('Номинал аппарата защиты').AsDouble(), 0) if minNom > nom: minNom = nom char = cir.LookupParameter( 'Характеристика аппарата защиты').AsString() if char == 'C': minChar = 'C' el.LookupParameter('Номинал аппарата защиты').Set(nom) # print 909 # print char el.LookupParameter('Характеристика аппарата защиты').Set(char) el.LookupParameter('Напряжение цепи').Set( round( cir.LookupParameter('Напряжение цепи').AsDouble(), 0)) el.LookupParameter('Имя нагрузки').Set( cir.LookupParameter('Имя нагрузки группы').AsString()) el.LookupParameter('Цепи').Set( cir.LookupParameter('Цепи').AsString() if cir. LookupParameter('Цепи').AsString() else str(cir.Id. IntegerValue)) sech = '{:.1f}'.format( cir.LookupParameter('Сечение кабеля').AsDouble()).replace( '.0', '') n = 3 if cir.LookupParameter( 'Напряжение цепи').AsDouble() == 220 else 5 name = cir.LookupParameter('Кабель').AsString() el.LookupParameter('Кабель').Set('{} {}x{}'.format( name, n, sech.replace('.', ','))) # el.LookupParameter('Номер фазы').Set('666') el.LookupParameter('Номер фазы').Set( cir.LookupParameter('Номер фазы').AsString() if cir. LookupParameter('Номер фазы').AsString() else '?') el.LookupParameter('Помещения группы').Set( cir.LookupParameter('Помещения группы').AsString().replace( '; -', '')) el.LookupParameter(cApps[cir.LookupParameter( 'Ком. аппарат').AsString()]).Set(1) el.LookupParameter('Ком. аппарат подпись').Set( cir.LookupParameter('Ком. аппарат').AsString().replace( 'qf', 'QF')) else: el = doc.Create.NewFamilyInstance( XYZ(x * 16 / k, -y * 250 / k, 0), cirFamily, activeView) el.LookupParameter('Имя нагрузки').Set('Резерв') el.LookupParameter('Характеристика аппарата защиты').Set( minChar) el.LookupParameter('Номинал аппарата защиты').Set(minNom) el.LookupParameter('Номер фазы').Set('L1') el.LookupParameter('Основные').Set(0) el.LookupParameter('Автоматический выключатель').Set(1)