当前位置:网站首页>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 .
边栏推荐
- 使用 CustomPaint 绘制基本图形
- Add get disabled for RC form
- Remember aximp once Use of exe tool
- Google SEO external chain backlinks research tool recommendation
- Remember that a development is encountered in the pit of origin string sorting
- Win11游戏模式怎么开启?Win11开启游戏模式的方法
- NVR硬盤錄像機通過國標GB28181協議接入EasyCVR,設備通道信息不顯示是什麼原因?
- Ternary expressions, generative expressions, anonymous functions
- Interview question 01.02 Determine whether it is character rearrangement - auxiliary array algorithm
- How to choose the appropriate automated testing tools?
猜你喜欢
The whole network "chases" Zhong Xuegao
. Net automapper use
100million single men and women "online dating", supporting 13billion IPOs
谈谈制造企业如何制定敏捷的数字化转型策略
Anti climbing killer
Paint basic graphics with custompaint
[azure microservice service fabric] how to transfer seed nodes in the service fabric cluster
L'enregistreur de disque dur NVR est connecté à easycvr par le Protocole GB 28181. Quelle est la raison pour laquelle l'information sur le canal de l'appareil n'est pas affichée?
DNS series (I): why does the updated DNS record not take effect?
Build your own website (18)
随机推荐
How to realize the movement control of characters in horizontal game
应用实践 | 数仓体系效率全面提升!同程数科基于 Apache Doris 的数据仓库建设
【Azure微服务 Service Fabric 】如何转移Service Fabric集群中的种子节点(Seed Node)
Remember aximp once Use of exe tool
Matplotlib快速入门
NVR hard disk video recorder is connected to easycvr through the national standard gb28181 protocol. What is the reason why the device channel information is not displayed?
Song list 11111
强化学习-学习笔记9 | Multi-Step-TD-Target
Debugging and handling the problem of jamming for about 30s during SSH login
Redis - basic use (key, string, list, set, Zset, hash, geo, bitmap, hyperloglog, transaction)
双塔模型的最强出装,谷歌又开始玩起“老古董”了?
Build your own website (18)
The strongest installation of the twin tower model, Google is playing "antique" again?
如何实现横版游戏中角色的移动控制
[interview arrangement] 0211 game engine server
Px4 autonomous flight
Tsconfig of typescript TS basics JSON configuration options
Cv2.resize function reports an error: error: (-215:assertion failed) func= 0 in function ‘cv::hal::resize‘
Have you ever been confused? Once a test / development programmer, ignorant gadget C bird upgrade
Why can't win11 display seconds? How to solve the problem that win11 time does not display seconds?