def CreateRoundStrutwithCone(name, diameter, start, height, coneHeight, topDiameter, frameHeight): #print(name) vector = XYZ(0, 0, height*-1) coneVector = XYZ(0, 0, (coneHeight-frameHeight)*-1) frameVector = XYZ(0, 0, frameHeight * -1) pp = Plane.CreateByNormalAndOrigin(vector, start + coneVector + frameVector*2) ppCone = Plane.CreateByNormalAndOrigin(vector, start + frameVector) ppFrame = Plane.CreateByNormalAndOrigin(vector, start) frameProfile = CurveLoop().Create([Arc.Create(ppFrame, topDiameter/2, 0, math.pi), Arc.Create(ppFrame, topDiameter/2, math.pi, math.pi*2)]) coneProfile = CurveLoop().Create([Arc.Create(ppCone, topDiameter/2 + frameHeight + 1/12, 0, math.pi), Arc.Create(ppCone, topDiameter/2 + frameHeight + 1/12, math.pi, math.pi*2)]) profile = CurveLoop().Create([Arc.Create(pp, diameter/2, 0, math.pi), Arc.Create(pp, diameter/2, math.pi, math.pi*2)]) frame = GeometryCreationUtilities.CreateExtrusionGeometry([frameProfile], frameVector, frameHeight) geo = GeometryCreationUtilities.CreateExtrusionGeometry([profile], vector, height - coneHeight-frameHeight) try: cone = GeometryCreationUtilities.CreateLoftGeometry([coneProfile, profile], SolidOptions(ElementId.InvalidElementId, ElementId.InvalidElementId)) # Create Element ele = DirectShape.CreateElement(doc, ElementId(-2000151)) ele.SetShape([geo, cone, frame]) ele.SetName(name) return ele.Id except: ele = DirectShape.CreateElement(doc, ElementId(-2000151)) ele.SetShape([geo, frame]) ele.SetName(name) return ele.Id
def create_directshape(room_collection): if room_collection: document = room_collection[0].Document direct_shapes_col = FilteredElementCollector(document).OfClass(DirectShape).ToElements() if direct_shapes_col: for shape in direct_shapes_col: document.Delete(shape.Id) datashape = [] bad_rooms = [] for room in room_collection: try: calculator = SpatialElementGeometryCalculator(document) geometry_result = calculator.CalculateSpatialElementGeometry(room) room_solid = geometry_result.GetGeometry() geometry_objects = List[GeometryObject]() geometry_objects.Add(room_solid) room_name = room.get_Parameter(BuiltInParameter.ROOM_NAME).AsString() ds_type = get_directshape_type(room_name) ds = DirectShape.CreateElementInstance(document, ds_type.Id, ElementId(BuiltInCategory.OST_GenericModel), room_name, Transform.Identity) ds.SetTypeId(ds_type.Id) ds.SetShape(geometry_objects) datashape.append(ds) except Exception: bad_rooms.append(room) return datashape, bad_rooms
def create_directshape(room_collection, view_name): if room_collection: document = room_collection[0].Document delete_class_elements(DirectShape, document) delete_class_elements(DirectShapeType, document) datashape = [] bad_rooms = [] view = create_view(document, view_name) data_colors = get_color_from_colorscheme(document.ActiveView) if data_colors: for room in room_collection: try: calculator = SpatialElementGeometryCalculator(document) geometry_result = calculator.CalculateSpatialElementGeometry(room) room_solid = geometry_result.GetGeometry() geometry_objects = List[GeometryObject]() geometry_objects.Add(room_solid) room_name = room.get_Parameter(BuiltInParameter.ROOM_NAME).AsString() ds_type = get_directshape_type(room_name) ds = DirectShape.CreateElementInstance(document, ds_type.Id, \ ElementId(BuiltInCategory.OST_GenericModel), \ room_name, Transform.Identity) ds.ApplicationId = uiapp.ActiveAddInId.ToString() ds.ApplicationDataId = room.UniqueId ds.SetTypeId(ds_type.Id) ds.SetShape(geometry_objects) view.SetElementOverrides(ds.Id, get_overidegraphics(data_colors[room_name])) datashape.append(ds) except Exception: bad_rooms.append(room) return room_collection else: return 'Перейдите на вид,\r\nгде применена цветовая схема'
def CreateCurvePipe(name, diameter, thickness, startO, endO, middleO): #print(name) # print("Diameter" + str(diameter)) #correction = XYZ(0, 0, diameter / 2) correction = XYZ(0, 0, 0) start = startO + correction end = endO + correction middle = middleO + correction #print(name) #print(start) #print(end) #print(middle) path = Arc.Create(start, end, middle) pathCurve = CurveLoop().Create([path]) pp = Plane.CreateByNormalAndOrigin( path.ComputeDerivatives(0, True).BasisX, start) profile = CurveLoop().Create([ Arc.Create(pp, diameter / 2 + thickness, 0, math.pi), Arc.Create(pp, diameter / 2 + thickness, math.pi, math.pi * 2) ]) 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 CreateStraightPipe(name, diameter, thickness, startO, endO, length): #correction = XYZ(0, 0, diameter/2) #print("Diameter" + str(diameter)) #print(name) correction = XYZ(0, 0, 0) start = startO + correction end = endO + correction #print(name) #print(length) if (end - start).GetLength() > 0.1: pp = Plane.CreateByNormalAndOrigin(end - start, start) profile = CurveLoop().Create([ Arc.Create(pp, diameter / 2 + thickness, 0, math.pi), Arc.Create(pp, diameter / 2 + thickness, math.pi, math.pi * 2) ]) geo = GeometryCreationUtilities.CreateExtrusionGeometry([profile], end - start, length) ele = DirectShape.CreateElement(doc, ElementId(-2000151)) ele.SetShape([geo]) ele.SetName(name) return ele.Id else: print("Duct too small") return None
def CreateCubeStrut(csdname, csdwidth, csdlength, csdheight, csdstart, csdrotation, scdthickness): #print(csdname) vector = XYZ(0, 0, csdheight * -1) pp = Plane.CreateByNormalAndOrigin(vector, csdstart) trans = Transform.CreateRotationAtPoint(vector, csdrotation, csdstart) point1 = csdstart + XYZ(csdwidth / 2, csdlength / 2, 0) point2 = csdstart + XYZ(csdwidth / 2 * -1, csdlength / 2, 0) point3 = csdstart + XYZ(csdwidth / 2 * -1, csdlength / 2 * -1, 0) point4 = csdstart + XYZ(csdwidth / 2, csdlength / 2 * -1, 0) profileorigion = CurveLoop().Create([ Line.CreateBound(point1, point2), Line.CreateBound(point2, point3), Line.CreateBound(point3, point4), Line.CreateBound(point4, point1) ]) finalProfile = CurveLoop.CreateViaTransform(profileorigion, trans) geo = GeometryCreationUtilities.CreateExtrusionGeometry([finalProfile], vector, csdheight) ele = DirectShape.CreateElement(doc, ElementId(-2000151)) ele.SetShape([geo]) ele.SetName(csdname) return ele.Id
def CreateRoundStrut(name, diameter, start, height): vector = XYZ(0, 0, height * -1) print(name) print(height) pp = Plane.CreateByNormalAndOrigin(vector, start) profile = CurveLoop().Create([ Arc.Create(pp, diameter / 2, 0, math.pi), Arc.Create(pp, diameter / 2, math.pi, math.pi * 2) ]) geo = GeometryCreationUtilities.CreateExtrusionGeometry([profile], vector, height) ele = DirectShape.CreateElement(doc, ElementId(-2000151)) ele.SetShape([geo]) ele.SetName(name) return ele.Id
def CreateStraightPipe(name, diameter, thickness, startO, endO, length): correction = XYZ(0, 0, diameter / 2) start = startO + correction end = endO + correction print(name) print(length) pp = Plane.CreateByNormalAndOrigin(end - start, start) profile = CurveLoop().Create([ Arc.Create(pp, diameter / 2 + thickness, 0, math.pi), Arc.Create(pp, diameter / 2 + thickness, math.pi, math.pi * 2) ]) geo = GeometryCreationUtilities.CreateExtrusionGeometry([profile], end - start, length) ele = DirectShape.CreateElement(doc, ElementId(-2000151)) ele.SetShape([geo]) ele.SetName(name) return ele.Id
import clr clr.AddReference('RevitAPI') clr.AddReference('RhinoCommon') clr.AddReference('RhinoInside.Revit') from Autodesk.Revit.DB import Transaction, ElementId, BuiltInCategory, DirectShape from Rhino.Geometry import Point3d, Vector3d, Mesh, MeshingParameters, Sphere from RhinoInside.Revit import Revit import RhinoInside.Revit clr.ImportExtensions(RhinoInside.Revit.Convert.Geometry) doc = Revit.ActiveDBDocument with Transaction(doc, "Sample7") as trans: trans.Start() sphere = Sphere(Point3d.Origin, 12 * Revit.ModelUnits) brep = sphere.ToBrep() meshes = Mesh.CreateFromBrep(brep, MeshingParameters.Default) category = ElementId(BuiltInCategory.OST_GenericModel) ds = DirectShape.CreateElement(doc, category) for mesh in meshes: ds.AppendShape(mesh.ToShape()) trans.Commit()
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
doc.GetElement(elem_id) for elem_id in uidoc.Selection.GetElementIds() ] first_selected = selection[0] solid_opt = SolidOptions(ElementId.InvalidElementId, ElementId.InvalidElementId) bbox = first_selected.get_BoundingBox(None) bottom_z_offset = 0.1 bbox.Min = XYZ(bbox.Min.X, bbox.Min.Y, bbox.Min.Z - bottom_z_offset) b1 = XYZ(bbox.Min.X, bbox.Min.Y, bbox.Min.Z) b2 = XYZ(bbox.Max.X, bbox.Min.Y, bbox.Min.Z) b3 = XYZ(bbox.Max.X, bbox.Max.Y, bbox.Min.Z) b4 = XYZ(bbox.Min.X, bbox.Max.Y, bbox.Min.Z) bbox_height = bbox.Max.Z - bbox.Min.Z lines = List[Curve]() lines.Add(Line.CreateBound(b1, b2)) lines.Add(Line.CreateBound(b2, b3)) lines.Add(Line.CreateBound(b3, b4)) lines.Add(Line.CreateBound(b4, b1)) rectangle = [CurveLoop.Create(lines)] extrusion = GeometryCreationUtilities.CreateExtrusionGeometry( List[CurveLoop](rectangle), XYZ.BasisZ, bbox_height, solid_opt) category_id = ElementId(Bic.OST_GenericModel) with db.Transaction("solid_bbox_direct_shape") as tx: direct_shape = DirectShape.CreateElement(doc, category_id, "A", "B") direct_shape.SetShape([extrusion])
a = 0 b = 0 for g_rooms in linkrooms: for room in g_rooms: if room.Area > 0: name = room.get_Parameter(BuiltInParameter.ROOM_NAME).AsString() number = room.get_Parameter( BuiltInParameter.ROOM_NUMBER).AsString() new = name + ';' + number list = [] room.LimitOffset.Set(11) shell = room.ClosedShell geo = shell.GetEnumerator() for g in geo: list.append(g) ds = DirectShape.CreateElement(doc, id) try: ds.SetShape(list) ds.get_Parameter( BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set(new) a += 1 except: print(room.Id.IntegerValue, new) b += 1 sOptions = SpatialElementBoundaryOptions() boundary = room.GetBoundarySegments(sOptions) for bo in boundary: print(bo.ToString()) #elev = round(room.Level.Elevation) #level2 = None