当前位置:网站首页>Revit secondary development - link file collision detection
Revit secondary development - link file collision detection
2022-07-07 22:22:00 【Hey, hey, hey, hey, hey】
The function is probably to detect the elements in the project ( Include components in linked files ) Conflict or not
General train of thought :
1、 First get all the converted components in the linked file solid, Transformed solid You can directly detect the elements in the project
2、 Get all edges of the element to be compared 、 Noodles 、solid
3、 If the element has edges : With edges and solid Make a test , If it is not detected, the face and edge need to be detected ; If the element has no edges : Test with face and face
----------------------------------------------------------------------
Filter linked file internals
//key: Link to the file id value: Internals id
Dictionary<ElementId,List<ElementId>> m_dicLinkIns;
// Filter linked files
FilteredElementCollector fecLinks = new FilteredElementCollector(doc);
List<Element> lstElem = fecLinks.ofClass(typeof(RevitLinkInstance)).ToElements().ToList();
// Filter internals
foreach(Element elem in lstElem)
{
RevitLinkInstance rvtLinkIns = elem as RevitLinkInstance;
if(rvtLinkIns == null) continue;
// Get the linked file document
Document linkDoc = rvtLinkIns.GetLinkDocument();
if(linkDoc == null) continue;
FilteredElementCollector fecLinkElems = new FilteredElementCollector;
ElementClassFilter insFilter = new ElementClassFilter (typeof(FamilyInstance));
ElementClassFilter hostFilter = new ElementClassFilter (typeof(HostObject));
LogicalOrFilter filter = new LogicalOrFilter (insFilter,hostFilter);
List<ElementId> lstEids = fecLinkElems.WherePasses(filter).ToElementIds().ToList();
m_dicLinkIns.Add(rvtLinkIns.id,lstEids);
}
Link the components in the file solid convert , And get the face 、 edge
List<SolidModel> m_lstModels;
private void TransformSolid(Document doc,Element elem)
{
ElementId linkId = null;
RevitLinkInstance rvtLinkIns = null;
if(elem.Document.IsLinked)
{// If it is a component of a linked document , You need to find the corresponding link file
foreach(Elementid eid in m_dicLinkIns.Keys)
{
if(m_dicLinkIns[eid].Contains(elem.Id))
{
rvtLinkIns = doc.GetElement(eid) as RevitLinkInstance;
break;
}
}
}
List<Solid> lstSolids = GetSolids(elem);
foreach(Solid solid in lstSolids)
{
Solid tempSolid = solid;
if(rvtLinkIns != null)// Generate a converted solid
tempSolid = SolidUtils.CreateTransformed(solid,rvtLinkIns.GetTransform());
m_lstModels.lstSolids.Add(tempSolid);
foreach(Face face in tempSolid.Faces)
{// Get face
m_lstModels.lstFaces.Add(face);
}
foreach(Edge edge in tempSolid.Edges)
{// Get edge
Curve curve = edge.AsCurve();
m_lstModels.lstEdges.Add(curve);
}
}
}
If you don't know how to get elements Solid, You can check online , You can also look at another article that I wrote . At the bottom of the link
Collision detection , Two cases
1. Entities have edges , Use entities and edges to measure , If it is not detected, use the face and edge to measure ;
foreach(Curve curve in rightModel.lstEdges)
{
foreach(Solid solid in leftModel.lstSolids)
{
SolidCurveIntersectionoPtions opt = new SolidCurveIntersectionoPtions();
//solid Check with the edge
SolidCurveIntersection result = solid.IntersectWithCurve(curve,opt);
if(result.SegmentCount > 0)
{
// The collision
}
else
{
foreach(Face face in solid.Faces)
{
IntersectionResultArray array = null;
//solid Check the face and edge of
SetComparisonResult result2 = face.Intersect(curve,out array);
if(array != null && result2 != SetComparisonResult.Disjoint)
{
// The collision
}
}
}
}
}
2. Entities have no edges , Test with face to face
foreach(Face rface in rightModel.lstFaces)
{
foreach(Face lface in leftModel.lstFaces)
{
Curve curve = null;
FaceIntersectionFaceResult result = lface.Intersect(rface, out curve);
if(result == FaceIntersectionFaceResult.Intersecting)
{
// The collision
}
}
}
SolidModel class
public class SolidModel
{
// Elements id
public ElementId id {get;set;}
// Element entities
public List<Solid> lstSolids {get;set;}
// Element edge
public List<Curve> lstEdges {get;set;}
// Element face
public List<Face> lstFaces {get;set;}
public SolidModel()
{
lstSolids =new List<Solid>();
lstEdges =new List<Curve>();
lstFaces =new List<Face>();
}
}
-------------------------------------------
Code for a reference , Can't run directly .
边栏推荐
- Remember aximp once Use of exe tool
- How to quickly check whether the opening area ratio of steel mesh conforms to ipc7525
- Antd date component appears in English
- Which financial products will yield high returns in 2022?
- Dbsync adds support for mongodb and ES
- Matplotlib快速入门
- Index summary (assault version)
- Debugging and handling the problem of jamming for about 30s during SSH login
- Relationship between URL and URI
- npm uninstall和rm直接删除的区别
猜你喜欢
ByteDance Android interview, summary of knowledge points + analysis of interview questions
It's worth seeing. Interview sites and interview skills
Debugging and handling the problem of jamming for about 30s during SSH login
【Azure微服务 Service Fabric 】在SF节点中开启Performance Monitor及设置抓取进程的方式
vite Unrestricted file system access to
Antd date component appears in English
为什么Win11不能显示秒数?Win11时间不显示秒怎么解决?
Win11如何解禁键盘?Win11解禁键盘的方法
Vs custom template - take the custom class template as an example
ByteDance senior engineer interview, easy to get started, fluent
随机推荐
[azure microservice service fabric] start the performance monitor in the SF node and set the method of capturing the process
Jerry's test box configuration channel [chapter]
强化学习-学习笔记9 | Multi-Step-TD-Target
OpeGL personal notes - lights
ByteDance senior engineer interview, easy to get started, fluent
Use partial derivatives to display normals in unity
Reinforcement learning - learning notes 9 | multi step TD target
ByteDance Android interview, summary of knowledge points + analysis of interview questions
Attitude estimation (complementary filtering)
怎样写一个增广矩阵到txt文件中
How does win11 time display the day of the week? How does win11 display the day of the week today?
Customer case | China law network, through observing the cloud, greatly shortens the time of fault location
PKPM 2020 software installation package download and installation tutorial
用语雀写文章了,功能真心强大!
The cyberspace office announced the measures for data exit security assessment, which will come into force on September 1
[azure microservice service fabric] how to transfer seed nodes in the service fabric cluster
How to realize the movement control of characters in horizontal game
如何选择合适的自动化测试工具?
应用实践 | 数仓体系效率全面提升!同程数科基于 Apache Doris 的数据仓库建设
Implementation method of data platform landing