Пример #1
0
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,
Пример #2
0
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
Пример #3
0
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()
Пример #4
0
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
Пример #5
0
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
Пример #6
0
            #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
Пример #7
0
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)